diff --git a/.editorconfig b/.editorconfig index 9d331827aa9bd..c8a3fc304415f 100644 --- a/.editorconfig +++ b/.editorconfig @@ -7,6 +7,11 @@ root = true [*] end_of_line = lf insert_final_newline = true -# 4 space indentation indent_style = space indent_size = 4 + +[*.json] +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 2 diff --git a/.github/stale.yml b/.github/stale.yml index 7bd86c3c7734d..54e28623fa365 100644 --- a/.github/stale.yml +++ b/.github/stale.yml @@ -54,7 +54,7 @@ closeComment: > re-opened if you are going to actively work on it # Limit the number of actions per hour, from 1-30. Default is 30 -limitPerRun: 1 +limitPerRun: 2 # Limit to only `issues` or `pulls` # only: issues diff --git a/.github/workflows/json.yml b/.github/workflows/json.yml index 60354a2cf643b..2c5a02aebd7c0 100644 --- a/.github/workflows/json.yml +++ b/.github/workflows/json.yml @@ -1,16 +1,7 @@ name: JSON Validation on: - push: - branches: - - master - paths: - - "*.json" - pull_request: - branches: - - master - paths: - - "*.json" + pull_request jobs: style-json: @@ -24,3 +15,6 @@ jobs: fetch-depth: 10 - name: JSON style check run: make style-json + - name: Display Corrections + if: failure() + run: git diff diff --git a/.github/workflows/pr-validator.yml b/.github/workflows/pr-validator.yml index 1ab7313e5dc60..d1a0faa1f654a 100644 --- a/.github/workflows/pr-validator.yml +++ b/.github/workflows/pr-validator.yml @@ -11,4 +11,4 @@ jobs: - name: "Validate SUMMARY" uses: CleverRaven/pr-validator@master with: - description-regex: '\n\s*`{0,3}SUMMARY: +(None|((Features|Content|Interface|Mods|Balance|Bugfixes|Performance|Infrastructure|Build|I18N) +".*"))`{0,3}\s*\n' + description-regex: '(\n|^)\s*`{0,3}SUMMARY: +(None|((Features|Content|Interface|Mods|Balance|Bugfixes|Performance|Infrastructure|Build|I18N) +".*"))`{0,3}\s*(\n|$)' diff --git a/COMPILING-FLATPAK.md b/COMPILING-FLATPAK.md deleted file mode 100644 index 915fc61604183..0000000000000 --- a/COMPILING-FLATPAK.md +++ /dev/null @@ -1,34 +0,0 @@ -# Compiling Guide for Linux (Flatpak) - -## Prerequisites - -- Install `flatpak` and `flatpak-builder` from your distribution's package manager. -- Install `freedesktop-platform` & `freedesktop-sdk` using `flatpak install flathub org.freedesktop.Platform//18.08 org.freedesktop.Sdk//18.08` - -## Build - -Clone the source code and run `flatpak-builder --repo=repo --ccache --force-clean build-dir org.Cataclysm.DDA.json` or `flatpak-builder --repo=repo --ccache --force-clean build-dir org.Cataclysm.DDA.Tiles.json` to build the ncurses or tiles version of the application. - -## Installation - -Run `flatpak --user install test-repo org.Cataclysm.DDA` (or) `flatpak --user install test-repo org.Cataclysm.DDA.Tiles` to install the game. -Note: If you are installing the game for first time you will have to set up local repo. Run this `flatpak --user remote-add --no-gpg-verify test-repo repo` - -## Starting the game - -`flatpak run org.Cataclysm.DDA` (or) `flatpak run org.Cataclysm.DDA.Tiles` -**or** -Launch the Game from Applications -> Games -> Cataclysm: Dark Days Ahead (or) Cataclysm: Dark Days Ahead - Tiles. -**Note**: For the ncurses version, terminal will just show a blank screen on launch. Just press any button to start the game. - -## Permissions - -- **Ncurses version** - - Home Directory -- **Tiles Version** - - Home Directory - - Wayland - - Fallback-X11 - (incase Wayland doesn't work) - - IPC - (Required for X11) - - PulseAudio - - DRI diff --git a/ISSUES.md b/ISSUES.md index 5f31413c7c1a9..ffea825f4a126 100644 --- a/ISSUES.md +++ b/ISSUES.md @@ -44,11 +44,11 @@ Remember to take part in the discussion of your suggestions. ### Questions -You should direct your questions to the forum or ask on IRC. You should also read the included documentation and additional text files, e.g. `COMPILING.md` if you have problems building. +You should direct your questions to the forum or ask on IRC. You should also read the included documentation and additional text files, e.g. [COMPILING.md](doc/COMPILING/COMPILING.md) if you have problems building. ## Bounties -We keep the development and direction of the game community-driven so placing a bounty *does not* necessarily mean that change will be incorporated into the main game. But it may be incorporated as a mod (or not). As such feel free to post bounties on what you like, but remember we don't do "bounty-driven" development. Good way of thinking about bounties is as encouragement for contributors to work on a particular issue, and certainly not as "paying for features". +Placing a bounty *does not* necessarily mean that change will be incorporated into the main game. Please coordinate in the issue you intend to place a bounty on to determine if it is a change the project will accept, and keep in mind that placing a bounty will not confer special status on the issue. A good way of thinking about bounties is as encouragement for contributors to work on a particular issue, and certainly not as "paying for features". ## Issue resolution diff --git a/Makefile b/Makefile index 55607bf03a2ee..7c8756af1a3a1 100644 --- a/Makefile +++ b/Makefile @@ -993,7 +993,7 @@ ifdef LANGUAGES endif $(BINDIST_CMD) -export ODIR _OBJS LDFLAGS CXX W32FLAGS DEFINES CXXFLAGS +export ODIR _OBJS LDFLAGS CXX W32FLAGS DEFINES CXXFLAGS TARGETSYSTEM ctags: $(SOURCES) $(HEADERS) $(TESTSRC) $(TESTHDR) ctags $(SOURCES) $(HEADERS) $(TESTSRC) $(TESTHDR) diff --git a/README.md b/README.md index 3e8da4cd44443..d48725c96f87a 100644 --- a/README.md +++ b/README.md @@ -16,12 +16,12 @@ The source can either be downloaded as [an archive](https://github.com/CleverRav ## Compile -Please read [COMPILING.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/COMPILING.md) - it covers general information and more specific recipes for Linux, OS X, Windows and BSD. See [doc/COMPILER_SUPPORT.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/doc/COMPILER_SUPPORT.md) for details on which compilers we support. And you can always dig for more information in [doc/](https://github.com/CleverRaven/Cataclysm-DDA/tree/master/doc). +Please read [COMPILING.md](doc/COMPILING/COMPILING.md) - it covers general information and more specific recipes for Linux, OS X, Windows and BSD. See [COMPILER_SUPPORT.md](doc/COMPILING/COMPILER_SUPPORT.md) for details on which compilers we support. And you can always dig for more information in [doc/](https://github.com/CleverRaven/Cataclysm-DDA/tree/master/doc). We also have the following build guides: -* Building on Windows with `MSYS2` at [COMPILING-MSYS.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/COMPILING-MSYS.md) -* Building on Windows with `vcpkg` at [COMPILING-VS-VCPKG.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/COMPILING-VS-VCPKG.md) -* Building with `cmake` at [COMPILING-CMAKE.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/COMPILING-CMAKE.md) (*unofficial guide*) +* Building on Windows with `MSYS2` at [COMPILING-MSYS.md](doc/COMPILING/COMPILING-MSYS.md) +* Building on Windows with `vcpkg` at [COMPILING-VS-VCPKG.md](doc/COMPILING/COMPILING-VS-VCPKG.md) +* Building with `cmake` at [COMPILING-CMAKE.md](doc/COMPILING/COMPILING-CMAKE.md) (*unofficial guide*) ## Contribute diff --git a/android/.gitignore b/android/.gitignore index 98acc7eb58843..d7a510e5a97e4 100644 --- a/android/.gitignore +++ b/android/.gitignore @@ -1,16 +1,19 @@ +!config/ *.iml -.gradle -/local.properties -/.idea/workspace.xml -/.idea/libraries +.cxx .DS_Store -/build -/captures .externalNativeBuild -!config/ -/app/jni/libintl-lite -/app/jni/mpg-123 +.gradle +/.idea/libraries +/.idea/workspace.xml /app/jni/SDL2 /app/jni/SDL2_image /app/jni/SDL2_mixer /app/jni/SDL2_ttf +/app/jni/libintl-lite +/app/jni/lua +/app/jni/mpg-123 +/app/build +/build +/captures +/local.properties diff --git a/android/app/build.gradle b/android/app/build.gradle index ea4c4d0654e9d..7270274b3775b 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,5 +1,10 @@ import org.gradle.internal.os.OperatingSystem; +tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' + //options.compilerArgs << "-Xlint:deprecation" +} + def buildAsLibrary = project.hasProperty('BUILD_AS_LIBRARY'); def buildAsApplication = !buildAsLibrary if (buildAsApplication) { @@ -48,9 +53,7 @@ switch(OperatingSystem.current()) { } android { - compileSdkVersion 26 - buildToolsVersion "28.0.1" - + compileSdkVersion 28 if(OperatingSystem.current().isLinux()) { exec { @@ -66,21 +69,33 @@ android { } defaultConfig { - minSdkVersion 14 - targetSdkVersion 26 + minSdkVersion 21 + targetSdkVersion 28 versionCode Integer.valueOf(System.env.UPSTREAM_BUILD_NUMBER ?: 1 ) versionName new File('app/jni/src/version.h').text.split("\"")[1] if (buildAsApplication) { applicationId "com.cleverraven.cataclysmdda" setProperty("archivesBaseName", "cataclysmdda-" + versionName) } - ndk { - abiFilters "armeabi-v7a" - //abiFilters "x86" // use this for testing on emulators - } + + splits { + // Configures multiple APKs based on ABI. + abi { + // Enables building multiple APKs per ABI. + enable true + // Resets the list of ABIs that Gradle should create APKs for to none. + reset() + // Specifies a list of ABIs that Gradle should create APKs for. + include "armeabi-v7a" + include "arm64-v8a" + // Specifies that we do not want to also generate a universal APK that includes all ABIs. + universalApk false + } + } + externalNativeBuild { ndkBuild { - arguments "APP_PLATFORM=android-16", "-j$njobs" + arguments "APP_PLATFORM=android-21", "-j$njobs" } } testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" @@ -112,11 +127,11 @@ android { } } } - + debug { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - + externalNativeBuild { ndkBuild { @@ -133,12 +148,12 @@ android { path 'jni/Android.mk' } } - + } lintOptions { abortOnError false } - + if (buildAsLibrary) { libraryVariants.all { variant -> variant.outputs.each { output -> diff --git a/android/app/deps.zip b/android/app/deps.zip index 6e3788771a8d7..19145dcd3181b 100644 Binary files a/android/app/deps.zip and b/android/app/deps.zip differ diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 18a5bf9bd2594..897f45890d1f3 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -8,9 +8,6 @@ android:versionName="1.0" android:installLocation="auto"> - - - @@ -24,7 +21,7 @@ - + { @Override protected void onPreExecute() { installationAlert = new AlertDialog.Builder(SplashScreen.this) - .setTitle("Installation Failed") - .setCancelable(false) - .setPositiveButton("OK", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - SplashScreen.this.finish(); - return; - } - }).create(); + .setTitle("Installation Failed") + .setCancelable(false) + .setPositiveButton("OK", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + SplashScreen.this.finish(); + return; + } + }).create(); AssetManager assetManager = getAssets(); try { totalFiles = countTotalAssets(assetManager, "data") + @@ -162,22 +162,22 @@ protected Boolean doInBackground(Void... params) { AssetManager assetManager = getAssets(); String externalFilesDir = getExternalFilesDir(null).getPath(); - try { - // Clear out the old data if it exists (but preserve custom folders + files) - deleteRecursive(assetManager, externalFilesDir, new File(externalFilesDir + "/data")); - deleteRecursive(assetManager, externalFilesDir, new File(externalFilesDir + "/gfx")); - deleteRecursive(assetManager, externalFilesDir, new File(externalFilesDir + "/lang")); - - // Install the new data over the top - copyAssetFolder(assetManager, "data", externalFilesDir + "/data"); - copyAssetFolder(assetManager, "gfx", externalFilesDir + "/gfx"); - copyAssetFolder(assetManager, "lang", externalFilesDir + "/lang"); + try { + // Clear out the old data if it exists (but preserve custom folders + files) + deleteRecursive(assetManager, externalFilesDir, new File(externalFilesDir + "/data")); + deleteRecursive(assetManager, externalFilesDir, new File(externalFilesDir + "/gfx")); + deleteRecursive(assetManager, externalFilesDir, new File(externalFilesDir + "/lang")); + + // Install the new data over the top + copyAssetFolder(assetManager, "data", externalFilesDir + "/data"); + copyAssetFolder(assetManager, "gfx", externalFilesDir + "/gfx"); + copyAssetFolder(assetManager, "lang", externalFilesDir + "/lang"); } catch(Exception e) { - installationAlert.setMessage(e.getMessage()); - return false; + installationAlert.setMessage(e.getMessage()); + return false; } - // Remember which version the installed data is + // Remember which version the installed data is PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).edit().putString("installed", getVersionName()).commit(); publishProgress(++installedFiles); @@ -212,14 +212,14 @@ void deleteRecursive(AssetManager assetManager, String externalFilesDir, File fi // Returns true if an asset exists in the APK (either a directory or a file) // eg. assetExists("data/sound") or assetExists("data/font", "unifont.ttf") would both return true private boolean assetExists(AssetManager assetManager, String assetPath) { - return assetExists(assetManager, assetPath, ""); + return assetExists(assetManager, assetPath, ""); } private boolean assetExists(AssetManager assetManager, String assetPath, String assetName) { try { String[] files = assetManager.list(assetPath); if (assetName.isEmpty()) - return files.length > 0; // folder exists + return files.length > 0; // folder exists for (String file : files) { if (file.equalsIgnoreCase(assetName)) return true; // file exists @@ -312,11 +312,11 @@ protected void onProgressUpdate(Integer... values) { @Override protected void onPostExecute(Boolean result) { removeDialog(INSTALL_DIALOG_ID); - if(result) { + if(result) { settingsAlert.show(); - } else { - installationAlert.show(); - } + } else { + installationAlert.show(); + } } } } diff --git a/android/app/src/main/java/org/libsdl/app/SDLActivity.java b/android/app/src/main/java/org/libsdl/app/SDLActivity.java index dffe78c088764..5f6b7d4ace401 100644 --- a/android/app/src/main/java/org/libsdl/app/SDLActivity.java +++ b/android/app/src/main/java/org/libsdl/app/SDLActivity.java @@ -63,7 +63,6 @@ public enum NativeState { protected static ViewGroup mLayout; protected static SDLClipboardHandler mClipboardHandler; - // This is what SDL runs in. It invokes SDL_main(), eventually protected static Thread mSDLThread; @@ -273,7 +272,6 @@ protected void onResume() { SDLActivity.handleNativeState(); } - @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); @@ -411,7 +409,6 @@ public static void handleNativeExit() { mSingleton.finish(); } - // Messages from the SDLMain thread static final int COMMAND_CHANGE_TITLE = 1; static final int COMMAND_CHANGE_WINDOW_STYLE = 2; @@ -470,11 +467,11 @@ public void handleMessage(Message msg) { View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; - window.getDecorView().setSystemUiVisibility(flags); + window.getDecorView().setSystemUiVisibility(flags); window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); } else { int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE; - window.getDecorView().setSystemUiVisibility(flags); + window.getDecorView().setSystemUiVisibility(flags); window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); } } @@ -492,7 +489,7 @@ public void handleMessage(Message msg) { InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(mTextEdit.getWindowToken(), 0); - + mScreenKeyboardShown = false; } break; @@ -572,7 +569,7 @@ public static void setWindowStyle(boolean fullscreen) { /** * This method is called by SDL using JNI. * This is a static method for JNI convenience, it calls a non-static method - * so that is can be overridden + * so that is can be overridden */ public static void setOrientation(int w, int h, boolean resizable, String hint) { @@ -580,11 +577,11 @@ public static void setOrientation(int w, int h, boolean resizable, String hint) mSingleton.setOrientationBis(w, h, resizable, hint); } } - + /** * This can be overridden */ - public void setOrientationBis(int w, int h, boolean resizable, String hint) + public void setOrientationBis(int w, int h, boolean resizable, String hint) { int orientation = -1; @@ -621,11 +618,10 @@ public void setOrientationBis(int w, int h, boolean resizable, String hint) } } - /** * This method is called by SDL using JNI. */ - public static boolean isScreenKeyboardShown() + public static boolean isScreenKeyboardShown() { if (mTextEdit == null) { return false; @@ -692,7 +688,7 @@ public static boolean getManifestEnvironmentVariables() { } } /* environment variables set! */ - return true; + return true; } catch (Exception e) { Log.v("SDL", "exception " + e.toString()); } @@ -749,12 +745,12 @@ public static boolean showTextInput(int x, int y, int w, int h) { } public static boolean isTextInputEvent(KeyEvent event) { - + // Key pressed with Ctrl should be sent as SDL_KEYDOWN/SDL_KEYUP and not SDL_TEXTINPUT if (Build.VERSION.SDK_INT >= 11) { if (event.isCtrlPressed()) { return false; - } + } } return event.isPrintingKey() || event.getKeyCode() == KeyEvent.KEYCODE_SPACE; @@ -1070,7 +1066,7 @@ public boolean onKey(DialogInterface d, int keyCode, KeyEvent event) { public static boolean clipboardHasText() { return mClipboardHandler.clipboardHasText(); } - + /** * This method is called by SDL using JNI. */ @@ -1109,7 +1105,6 @@ public void run() { } } - /** SDLSurface. This is what we draw on, so we need to know when it's created in order to do anything useful. @@ -1242,7 +1237,6 @@ public void surfaceChanged(SurfaceHolder holder, SDLActivity.onNativeResize(width, height, sdlFormat, mDisplay.getRefreshRate()); Log.v("SDL", "Window size: " + width + "x" + height); - boolean skip = false; int requestedOrientation = SDLActivity.mAllowSDLOrientationChanges ? SDLActivity.mSingleton.getRequestedOrientation() : ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE; @@ -1497,7 +1491,7 @@ public boolean onCheckIsTextEditor() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { - /* + /* * This handles the hardware keyboard input */ if (event.getAction() == KeyEvent.ACTION_DOWN) { @@ -1585,7 +1579,6 @@ public boolean sendKeyEvent(KeyEvent event) { } } - return super.sendKeyEvent(event); } @@ -1626,7 +1619,7 @@ public boolean deleteSurroundingText(int beforeLength, int afterLength) { while (beforeLength-- > 0) { boolean ret_key = sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL)) && sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL)); - ret = ret && ret_key; + ret = ret && ret_key; } return ret; } @@ -1643,9 +1636,8 @@ interface SDLClipboardHandler { } - class SDLClipboardHandler_API11 implements - SDLClipboardHandler, + SDLClipboardHandler, android.content.ClipboardManager.OnPrimaryClipChangedListener { protected android.content.ClipboardManager mClipMgr; @@ -1676,7 +1668,7 @@ public void clipboardSetText(String string) { mClipMgr.setText(string); mClipMgr.addPrimaryClipChangedListener(this); } - + @Override public void onPrimaryClipChanged() { SDLActivity.onNativeClipboardChanged(); @@ -1686,9 +1678,9 @@ public void onPrimaryClipChanged() { class SDLClipboardHandler_Old implements SDLClipboardHandler { - + protected android.text.ClipboardManager mClipMgrOld; - + SDLClipboardHandler_Old() { mClipMgrOld = (android.text.ClipboardManager) SDL.getContext().getSystemService(Context.CLIPBOARD_SERVICE); } diff --git a/android/app/src/main/java/org/libsdl/app/SDLAudioManager.java b/android/app/src/main/java/org/libsdl/app/SDLAudioManager.java index 26baf8220a9bc..5ea14bd463a90 100644 --- a/android/app/src/main/java/org/libsdl/app/SDLAudioManager.java +++ b/android/app/src/main/java/org/libsdl/app/SDLAudioManager.java @@ -88,7 +88,7 @@ public static void audioWriteByteBuffer(byte[] buffer) { Log.e(TAG, "Attempted to make audio call with uninitialized audio!"); return; } - + for (int i = 0; i < buffer.length; ) { int result = mAudioTrack.write(buffer, i, buffer.length - i); if (result > 0) { @@ -155,7 +155,6 @@ public static int captureReadByteBuffer(byte[] buffer, boolean blocking) { return mAudioRecord.read(buffer, 0, buffer.length); } - /** This method is called by SDL using JNI. */ public static void audioClose() { if (mAudioTrack != null) { diff --git a/android/app/src/main/java/org/libsdl/app/SDLControllerManager.java b/android/app/src/main/java/org/libsdl/app/SDLControllerManager.java index 7b82c0e207a72..39046cb52a1c1 100644 --- a/android/app/src/main/java/org/libsdl/app/SDLControllerManager.java +++ b/android/app/src/main/java/org/libsdl/app/SDLControllerManager.java @@ -10,8 +10,7 @@ import android.view.*; import android.util.Log; - -public class SDLControllerManager +public class SDLControllerManager { public static native int nativeSetupJNI(); @@ -261,7 +260,6 @@ public String getJoystickDescriptor(InputDevice joystickDevice) { } } - class SDLJoystickHandler_API16 extends SDLJoystickHandler_API12 { @Override @@ -285,7 +283,7 @@ class SDLHaptic { } private ArrayList mHaptics; - + public SDLHapticHandler() { mHaptics = new ArrayList(); } @@ -298,7 +296,7 @@ public void run(int device_id, int length) { } public void pollHapticDevices() { - + final int deviceId_VIBRATOR_SERVICE = 999999; boolean hasVibratorService = false; @@ -342,7 +340,7 @@ public void pollHapticDevices() { haptic = new SDLHaptic(); haptic.device_id = deviceId_VIBRATOR_SERVICE; haptic.name = "VIBRATOR_SERVICE"; - haptic.vib = vib; + haptic.vib = vib; mHaptics.add(haptic); SDLControllerManager.nativeAddHaptic(haptic.device_id, haptic.name); } @@ -384,7 +382,7 @@ protected SDLHaptic getHaptic(int device_id) { } } return null; - } + } } class SDLGenericMotionListener_API12 implements View.OnGenericMotionListener { diff --git a/android/build.gradle b/android/build.gradle index 804e9f4c4819f..5600a93384c3a 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -6,7 +6,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.1.0' + classpath 'com.android.tools.build:gradle:3.5.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 5fc9c4b523231..6fbc4049a3cf4 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Tue Aug 28 01:10:32 MDT 2018 +#Tue Aug 27 13:00:00 UTC 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6-all.zip diff --git a/data/json/bionics.json b/data/json/bionics.json index 6103a74050fbe..252d043c7eeec 100644 --- a/data/json/bionics.json +++ b/data/json/bionics.json @@ -11,7 +11,7 @@ "id": "bio_ads", "type": "bionic", "name": "Active Defense System", - "description": "A thin forcefield surrounds your body, continually draining power. Anything attempting to penetrate this field has a chance of being deflected at the cost of energy. Bullets will be stopped more often than melee weapons and those in turn more often than massive objects.", + "description": "A thin forcefield surrounds your body, continually draining power. Anything attempting to penetrate this field has a chance of being deflected at the cost of energy, reducing their ability to deal damage. Bullets will be deflected more than melee weapons and those in turn more than massive objects.", "occupied_bodyparts": [ [ "TORSO", 10 ], [ "HEAD", 1 ], [ "ARM_L", 1 ], [ "ARM_R", 1 ], [ "LEG_L", 2 ], [ "LEG_R", 2 ] ], "flags": [ "BIONIC_TOGGLED", "BIONIC_NPC_USABLE" ], "act_cost": 10, @@ -137,7 +137,7 @@ "type": "bionic", "name": "Cable Charger System", "capacity": 10, - "description": "You have a complex port surgically mounted above your hip. While active, it will recharge bionic power when connected to a battery via jumper cable.", + "description": "You have a complex port surgically mounted above your hip. While active, it will recharge bionic power when connected to a power source via jumper cable.", "occupied_bodyparts": [ [ "TORSO", 10 ] ], "flags": [ "BIONIC_POWER_SOURCE", "BIONIC_SHOCKPROOF", "BIONIC_TOGGLED" ] }, @@ -1072,6 +1072,19 @@ "occupied_bodyparts": [ [ "ARM_R", 1 ], [ "HAND_R", 2 ] ], "act_cost": 50 }, + { + "id": "bio_fuel_cell_gasoline", + "type": "bionic", + "name": "Gasoline Fuel Cell CBM", + "description": "A small gasoline fuel cell fixed to your scapula. Despite its limited energy output compared to other fuel cells, this device still produces a significant amount of heat dissipated through a heat exhaust protruding from your back. A diffuse network of bio-plastic bladders has been meshed with your circulatory system and serves as a fuel tank.", + "occupied_bodyparts": [ [ "TORSO", 8 ] ], + "encumbrance": [ [ "TORSO", 5 ] ], + "fuel_options": [ "gasoline" ], + "fuel_capacity": 500, + "fuel_efficiency": 0.25, + "time": 1, + "flags": [ "BIONIC_TOGGLED", "BIONIC_POWER_SOURCE", "BIONIC_NPC_USABLE" ] + }, { "id": "bio_syringe", "type": "bionic", diff --git a/data/json/construction.json b/data/json/construction.json index 75837611bb557..798d205646058 100644 --- a/data/json/construction.json +++ b/data/json/construction.json @@ -38,7 +38,7 @@ "description": "Spike Pit", "category": "DIG", "required_skills": [ [ "survival", 1 ] ], - "time": "30 m", + "time": "5 m", "components": [ [ [ "spear_wood", 4 ], [ "pointy_stick", 4 ] ] ], "pre_terrain": "t_pit", "post_terrain": "t_pit_spiked" @@ -48,7 +48,7 @@ "description": "Glass Pit", "category": "DIG", "required_skills": [ [ "survival", 1 ] ], - "time": "30 m", + "time": "5 m", "components": [ [ [ "glass_shard", 168 ] ] ], "pre_terrain": "t_pit", "post_terrain": "t_pit_glass" @@ -70,7 +70,7 @@ "description": "Build Improvised Shelter", "category": "CONSTRUCT", "required_skills": [ [ "survival", 2 ] ], - "time": "120 m", + "time": "60 m", "qualities": [ [ { "id": "CUT", "level": 1 }, { "id": "HAMMER", "level": 1 } ] ], "components": [ [ [ "stick", 12 ], [ "2x4", 6 ], [ "wood_panel", 1 ] ], [ [ "pine_bough", 24 ], [ "willowbark", 24 ] ] ], "pre_terrain": "t_pit_shallow", @@ -196,7 +196,7 @@ "//": "regular door", "category": "REINFORCE", "required_skills": [ [ "fabrication", 0 ] ], - "time": "20 m", + "time": "10 m", "qualities": [ [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 4 ], [ "wood_panel", 1 ] ], [ [ "nail", 8 ] ] ], "pre_flags": "BARRICADABLE_DOOR", @@ -208,7 +208,7 @@ "//": "peephole door", "category": "REINFORCE", "required_skills": [ [ "fabrication", 0 ] ], - "time": "20 m", + "time": "10 m", "qualities": [ [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 4 ], [ "wood_panel", 1 ] ], [ [ "nail", 8 ] ] ], "pre_terrain": "t_door_c_peep", @@ -220,7 +220,7 @@ "//": "boarded damaged door", "category": "REINFORCE", "required_skills": [ [ "fabrication", 0 ] ], - "time": "20 m", + "time": "10 m", "qualities": [ [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 4 ], [ "wood_panel", 1 ] ], [ [ "nail", 8 ] ] ], "pre_flags": "BARRICADABLE_DOOR_DAMAGED", @@ -232,7 +232,7 @@ "//": "boarded damaged peephole door", "category": "REINFORCE", "required_skills": [ [ "fabrication", 0 ] ], - "time": "20 m", + "time": "10 m", "qualities": [ [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 4 ], [ "wood_panel", 1 ] ], [ [ "nail", 8 ] ] ], "pre_terrain": "t_door_b_peep", @@ -244,7 +244,7 @@ "//": "the reinforced doors", "category": "REINFORCE", "required_skills": [ [ "fabrication", 0 ] ], - "time": "20 m", + "time": "10 m", "qualities": [ [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 4 ], [ "wood_panel", 1 ] ], [ [ "nail", 8 ] ] ], "pre_flags": "BARRICADABLE_DOOR_REINFORCED", @@ -256,7 +256,7 @@ "//": "damaged reinforced doors", "category": "REINFORCE", "required_skills": [ [ "fabrication", 0 ] ], - "time": "20 m", + "time": "10 m", "qualities": [ [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 4 ], [ "wood_panel", 1 ] ], [ [ "nail", 8 ] ] ], "pre_flags": "BARRICADABLE_DOOR_REINFORCED_DAMAGED", @@ -267,7 +267,7 @@ "description": "Reinforce Wood Door", "category": "REINFORCE", "required_skills": [ [ "fabrication", 3 ] ], - "time": "90 m", + "time": "45 m", "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], "components": [ [ [ "2x4", 6 ], [ "wood_panel", 1 ] ], [ [ "2x4", 6 ] ], [ [ "nail", 48 ] ], [ [ "hinge", 1 ] ] ], "pre_flags": "BARRICADABLE_DOOR", @@ -525,7 +525,7 @@ "//": "Armo up regular reinforced window", "category": "REINFORCE", "required_skills": [ [ "fabrication", 6 ] ], - "time": "60 m", + "time": "30 m", "qualities": [ [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "spike", 4 ] ], [ [ "steel_plate", 1 ], [ "sheet_metal", 4 ] ] ], "pre_terrain": "t_window_reinforced", @@ -537,7 +537,7 @@ "//": "When underlying window has no glass", "category": "REINFORCE", "required_skills": [ [ "fabrication", 6 ] ], - "time": "60 m", + "time": "30 m", "qualities": [ [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "spike", 4 ] ], [ [ "steel_plate", 1 ], [ "sheet_metal", 4 ] ] ], "pre_terrain": "t_window_reinforced_noglass", @@ -1894,7 +1894,7 @@ "description": "Paint Grass White", "category": "DECORATE", "required_skills": [ [ "fabrication", 0 ] ], - "time": "40 m", + "time": "4 m", "tools": [ [ "paint_brush" ] ], "components": [ [ [ "w_paint", 25 ] ] ], "pre_terrain": "t_grass", @@ -1905,7 +1905,7 @@ "description": "Paint Grass White", "category": "DECORATE", "required_skills": [ [ "fabrication", 0 ] ], - "time": "40 m", + "time": "4 m", "tools": [ [ "paint_brush" ] ], "components": [ [ [ "w_paint", 25 ] ] ], "pre_terrain": "t_grass_dead", @@ -1916,7 +1916,7 @@ "description": "Paint Grass White", "category": "DECORATE", "required_skills": [ [ "fabrication", 0 ] ], - "time": "40 m", + "time": "4 m", "tools": [ [ "paint_brush" ] ], "components": [ [ [ "w_paint", 25 ] ] ], "pre_terrain": "t_grass_golf", @@ -1927,7 +1927,7 @@ "description": "Paint Pavement Yellow", "category": "DECORATE", "required_skills": [ [ "fabrication", 0 ] ], - "time": "40 m", + "time": "4 m", "tools": [ [ "paint_brush" ] ], "components": [ [ [ "y_paint", 25 ] ] ], "pre_terrain": "t_pavement", @@ -1938,7 +1938,7 @@ "description": "Paint Pavement Yellow", "category": "DECORATE", "required_skills": [ [ "fabrication", 0 ] ], - "time": "40 m", + "time": "4 m", "tools": [ [ "paint_brush" ] ], "components": [ [ [ "y_paint", 25 ] ] ], "pre_terrain": "t_pavement_bg_dp", @@ -1949,7 +1949,7 @@ "description": "Take Paint Off Pavement", "category": "DECORATE", "required_skills": [ [ "fabrication", 0 ] ], - "time": "80 m", + "time": "10 m", "tools": [ [ "chipper" ] ], "pre_terrain": "t_pavement_y", "post_terrain": "t_pavement" @@ -1959,7 +1959,7 @@ "description": "Take Paint Off Pavement", "category": "DECORATE", "required_skills": [ [ "fabrication", 0 ] ], - "time": "80 m", + "time": "10 m", "tools": [ [ "chipper" ] ], "pre_terrain": "t_pavement_y_bg_dp", "post_terrain": "t_pavement_bg_dp" @@ -1990,7 +1990,7 @@ "description": "Remove Wax From Floor", "category": "DECORATE", "required_skills": [ [ "fabrication", 0 ] ], - "time": "80 m", + "time": "10 m", "tools": [ [ "chipper" ] ], "pre_terrain": "t_floor_waxed_y", "post_terrain": "t_floor" @@ -2000,7 +2000,7 @@ "description": "Paint Wall Red", "category": "DECORATE", "required_skills": [ [ "fabrication", 0 ] ], - "time": "40 m", + "time": "4 m", "tools": [ [ "paint_brush" ] ], "components": [ [ [ "r_paint", 25 ] ] ], "pre_terrain": "t_wall", @@ -2011,7 +2011,7 @@ "description": "Paint Wall Blue", "category": "DECORATE", "required_skills": [ [ "fabrication", 0 ] ], - "time": "40 m", + "time": "4 m", "tools": [ [ "paint_brush" ] ], "components": [ [ [ "b_paint", 25 ] ] ], "pre_terrain": "t_wall", @@ -2022,7 +2022,7 @@ "description": "Paint Wall White", "category": "DECORATE", "required_skills": [ [ "fabrication", 0 ] ], - "time": "40 m", + "time": "4 m", "tools": [ [ "paint_brush" ] ], "components": [ [ [ "w_paint", 25 ] ] ], "pre_terrain": "t_wall", @@ -2033,7 +2033,7 @@ "description": "Paint Wall Green", "category": "DECORATE", "required_skills": [ [ "fabrication", 0 ] ], - "time": "40 m", + "time": "4 m", "tools": [ [ "paint_brush" ] ], "components": [ [ [ "g_paint", 25 ] ] ], "pre_terrain": "t_wall", @@ -2044,7 +2044,7 @@ "description": "Paint Wall Purple", "category": "DECORATE", "required_skills": [ [ "fabrication", 0 ] ], - "time": "40 m", + "time": "4 m", "tools": [ [ "paint_brush" ] ], "components": [ [ [ "p_paint", 25 ] ] ], "pre_terrain": "t_wall", @@ -2055,7 +2055,7 @@ "description": "Paint Wall Yellow", "category": "DECORATE", "required_skills": [ [ "fabrication", 0 ] ], - "time": "40 m", + "time": "4 m", "tools": [ [ "paint_brush" ] ], "components": [ [ [ "y_paint", 25 ] ] ], "pre_terrain": "t_wall", @@ -2067,7 +2067,7 @@ "//": "For vertical walls", "category": "DECORATE", "required_skills": [ [ "fabrication", 0 ] ], - "time": "80 m", + "time": "10 m", "tools": [ [ "chipper" ] ], "pre_flags": "CHIP", "post_terrain": "t_wall" @@ -2077,7 +2077,7 @@ "description": "Remove Carpet", "category": "DECORATE", "required_skills": [ [ "fabrication", 0 ] ], - "time": "30 m", + "time": "10 m", "qualities": [ [ { "id": "HAMMER", "level": 2 } ] ], "pre_flags": "RUG", "post_terrain": "t_floor" @@ -2131,7 +2131,7 @@ "description": "Wax Floor", "category": "DECORATE", "required_skills": [ [ "fabrication", 1 ] ], - "time": "30 m", + "time": "10 m", "tools": [ [ [ "mop", -1 ], [ "paint_brush", -1 ] ], [ [ "surface_heat", 2, "LIST" ] ] ], "components": [ [ [ "wax", 5 ] ] ], "pre_terrain": "t_floor", @@ -2142,7 +2142,7 @@ "description": "Remove Wax From Floor", "category": "DECORATE", "required_skills": [ [ "fabrication", 0 ] ], - "time": "80 m", + "time": "10 m", "tools": [ [ "chipper" ] ], "pre_terrain": "t_floor_waxed", "post_terrain": "t_floor" @@ -2186,7 +2186,7 @@ "//": "Fix the broken back to normal", "category": "REPAIR", "required_skills": [ [ "fabrication", 4 ] ], - "time": "120 m", + "time": "60 m", "qualities": [ [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 6 ] ], [ [ "nail", 20 ] ], [ [ "wood_panel", 3 ] ] ], "pre_terrain": "t_wood_stairs_up_broken", @@ -2269,7 +2269,7 @@ "description": "Build Road Barricade", "category": "OTHER", "required_skills": [ [ "fabrication", 1 ] ], - "time": "30 m", + "time": "20 m", "qualities": [ [ { "id": "HAMMER", "level": 1 } ] ], "components": [ [ [ "2x4", 6 ] ], [ [ "nail", 12 ] ] ], "pre_special": "check_empty", @@ -2281,7 +2281,7 @@ "//": "Set up pontoon bridge", "category": "CONSTRUCT", "required_skills": [ [ "fabrication", 5 ] ], - "time": "80 m", + "time": "40 m", "qualities": [ [ { "id": "HAMMER", "level": 2 }, { "id": "SAW_W", "level": 2 } ] ], "components": [ [ [ "2x4", 8 ] ], @@ -2297,7 +2297,7 @@ "//": "Set up River bridge", "category": "CONSTRUCT", "required_skills": [ [ "fabrication", 5 ] ], - "time": "80 m", + "time": "40 m", "qualities": [ [ { "id": "HAMMER", "level": 2 }, { "id": "SAW_W", "level": 2 } ] ], "components": [ [ [ "2x4", 4 ] ], @@ -2314,7 +2314,7 @@ "//": "Set up dock", "category": "CONSTRUCT", "required_skills": [ [ "fabrication", 4 ] ], - "time": "80 m", + "time": "40 m", "qualities": [ [ { "id": "HAMMER", "level": 2 }, { "id": "SAW_W", "level": 2 } ] ], "components": [ [ [ "2x4", 6 ] ], [ [ "log", 1 ] ], [ [ "nail", 12 ] ] ], "pre_terrain": "t_water_moving_sh", @@ -2350,7 +2350,7 @@ "//": "Set up shallow bridge", "category": "CONSTRUCT", "required_skills": [ [ "fabrication", 4 ] ], - "time": "80 m", + "time": "30 m", "qualities": [ [ { "id": "HAMMER", "level": 2 }, { "id": "SAW_W", "level": 2 } ] ], "components": [ [ [ "2x4", 6 ] ], [ [ "log", 1 ] ], [ [ "nail", 12 ] ] ], "pre_terrain": "t_water_sh", diff --git a/data/json/effects.json b/data/json/effects.json index 08fffd206e200..954e44f5edfc0 100644 --- a/data/json/effects.json +++ b/data/json/effects.json @@ -1370,6 +1370,15 @@ "scaling_mods": { "speed_mod": [ -5 ] }, "show_in_info": true }, + { + "type": "effect_type", + "id": "grabbing", + "name": [ "Grabbing" ], + "desc": [ "Grabbing another creature and holding them in place." ], + "max_duration": "2 s", + "max_intensity": 15, + "show_in_info": true + }, { "type": "effect_type", "id": "lack_sleep", diff --git a/data/json/emit.json b/data/json/emit.json index dd6ddbba25bc4..0bd49001e1c14 100644 --- a/data/json/emit.json +++ b/data/json/emit.json @@ -5,7 +5,7 @@ "//": "Intermittent cigarette smoke (example: lit cigarette)", "field": "fd_cigsmoke", "intensity": 2, - "chance": 20 + "chance": 2 }, { "id": "emit_joint_trail", @@ -13,7 +13,7 @@ "//": "Intermittent joint smoke (example: lit cigarette)", "field": "fd_weedsmoke", "intensity": 3, - "chance": 20 + "chance": 2 }, { "id": "emit_smoke_blast", @@ -39,6 +39,14 @@ "intensity": 3, "qty": 3 }, + { + "id": "emit_smaller_smoke_plume", + "type": "emit", + "//": "Small plume of thick smoke (example: smallarms muzzle smoke)", + "field": "fd_smoke", + "qty": 1, + "chance": 30 + }, { "id": "emit_smoke_stream", "type": "emit", @@ -234,5 +242,19 @@ "type": "emit", "field": "fd_fungal_haze", "qty": 200 + }, + { + "id": "emit_swamp_gas_leak", + "type": "emit", + "field": "fd_swamp_gas", + "intensity": 1, + "chance": 15 + }, + { + "id": "emit_fog_plume", + "type": "emit", + "field": "fd_fog", + "intensity": 2, + "qty": 200 } ] diff --git a/data/json/field_type.json b/data/json/field_type.json index 707c6c242a9ce..f321b4d4963fe 100644 --- a/data/json/field_type.json +++ b/data/json/field_type.json @@ -654,6 +654,47 @@ "display_items": false, "display_field": true }, + { + "id": "fd_swamp_gas", + "type": "field_type", + "intensity_levels": [ + { "name": "swamp gas", "sym": ".", "dangerous": true, "translucency": 5 }, + { "//": "repeat last entry" }, + { "//": "repeat last entry" } + ], + "decay_amount_factor": 5, + "gas_absorption_factor": 15, + "percent_spread": 25, + "outdoor_age_speedup": "1 minutes", + "dirty_transparency_cache": true, + "has_fume": true, + "immunity_data": { "body_part_env_resistance": [ [ "MOUTH", 15 ] ] }, + "priority": 8, + "half_life": "15 minutes", + "phase": "gas", + "display_items": false, + "display_field": true + }, + { + "id": "fd_fog", + "type": "field_type", + "intensity_levels": [ + { "name": "mist", "sym": "~", "dangerous": false, "transparent": false, "translucency": 5 }, + { "name": "fog", "translucency": 3 }, + { "name": "dense fog", "translucency": 1 } + ], + "decay_amount_factor": 15, + "gas_absorption_factor": 5, + "percent_spread": 55, + "outdoor_age_speedup": "5 minutes", + "dirty_transparency_cache": true, + "has_fume": true, + "priority": 8, + "half_life": "50 minutes", + "phase": "gas", + "display_items": false, + "display_field": true + }, { "id": "fd_fungal_haze", "type": "field_type", diff --git a/data/json/flags.json b/data/json/flags.json index a2e7b76c6c387..6810a776a6b97 100644 --- a/data/json/flags.json +++ b/data/json/flags.json @@ -64,6 +64,10 @@ "description": "Blinds the wearer while worn, and provides nominal protection vs flashbang flashes.", "info": "This gear prevents you from seeing anything." }, + { + "id": "EFFECT_NIGHT_VISION", + "type": "json_flag" + }, { "id": "BLOCK_WHILE_WORN", "type": "json_flag", @@ -642,5 +646,41 @@ "type": "json_flag", "context": [ "SPELL" ], "description": "This spell requires focus to cast. The lower your focus, the higher failure rate to cast." + }, + { + "id": "EFFECT_FEATHER_FALL", + "type": "json_flag" + }, + { + "id": "EFFECT_BIO_IMMUNE", + "type": "json_flag" + }, + { + "id": "EFFECT_BASH_IMMUNE", + "type": "json_flag" + }, + { + "id": "EFFECT_CUT_IMMUNE", + "type": "json_flag" + }, + { + "id": "EFFECT_ACID_IMMUNE", + "type": "json_flag" + }, + { + "id": "EFFECT_STAB_IMMUNE", + "type": "json_flag" + }, + { + "id": "EFFECT_HEAT_IMMUNE", + "type": "json_flag" + }, + { + "id": "EFFECT_COLD_IMMUNE", + "type": "json_flag" + }, + { + "id": "ELECTRIC_IMMUNE", + "type": "json_flag" } ] diff --git a/data/json/furniture_and_terrain/furniture-storage.json b/data/json/furniture_and_terrain/furniture-storage.json index 9306d40b5acb8..bffd0a434d8c7 100644 --- a/data/json/furniture_and_terrain/furniture-storage.json +++ b/data/json/furniture_and_terrain/furniture-storage.json @@ -433,7 +433,7 @@ { "item": "nail", "charges": [ 32, 40 ] } ] }, - "max_volume": "1500 L", + "max_volume": 6000, "bash": { "str_min": 6, "str_max": 40, diff --git a/data/json/furniture.json b/data/json/furniture_and_terrain/furniture.json similarity index 99% rename from data/json/furniture.json rename to data/json/furniture_and_terrain/furniture.json index 90fdfa52e2ea6..a30b520a948e7 100644 --- a/data/json/furniture.json +++ b/data/json/furniture_and_terrain/furniture.json @@ -410,7 +410,7 @@ "deconstruct": { "items": [ { "item": "2x4", "count": 4 }, - { "item": "rag", "count": 4 }, + { "item": "felt_patch", "count": 4 }, { "item": "wood_panel", "count": 1 }, { "item": "nail", "charges": [ 6, 10 ] } ] @@ -424,7 +424,7 @@ { "item": "2x4", "count": [ 2, 6 ] }, { "item": "nail", "charges": [ 4, 12 ] }, { "item": "splinter", "count": 1 }, - { "item": "rag", "count": [ 0, 2 ] } + { "item": "felt_patch", "count": [ 0, 2 ] } ] } }, @@ -2334,7 +2334,9 @@ { "item": "rock", "count": [ 10, 22 ] }, { "item": "sharp_rock", "count": [ 3, 7 ] }, { "item": "material_limestone", "charges": [ 2, 5 ], "prob": 30 }, - { "item": "material_rocksalt", "count": [ 0, 1 ], "prob": 10 } + { "item": "material_rocksalt", "count": [ 0, 1 ], "prob": 10 }, + { "item": "material_rhodonite", "count": [ 0, 1 ], "prob": 1 }, + { "item": "material_zincite", "count": [ 0, 5 ], "prob": 2 } ] } }, @@ -4881,5 +4883,35 @@ "move_cost_mod": 2, "required_str": -1, "flags": [ "NOITEM" ] + }, + { + "type": "furniture", + "id": "f_swamp_gas", + "name": "swamp gas", + "description": "This is a pool of murkey water, it occassionaly bubbles, releasing a mildly toxic gas.", + "looks_like": "t_water_sh", + "symbol": "~", + "color": "blue", + "move_cost_mod": 1, + "coverage": 0, + "required_str": -1, + "flags": [ "TRANSPARENT", "EMITTER" ], + "emissions": [ "emit_swamp_gas_leak" ], + "//": "a very mild toxicant, inducing nausea.", + "bash": { "str_min": 30, "str_max": 60, "sound": "splash!", "sound_fail": "splash!", "furn_set": "f_swamp_gas" } + }, + { + "type": "furniture", + "id": "f_fog", + "name": "fog", + "description": "This is a misty cloud of fog.", + "looks_like": "t_moss", + "symbol": "^", + "color": "light_gray", + "move_cost_mod": 2, + "coverage": 0, + "required_str": -1, + "flags": [ "TRANSPARENT", "EMITTER" ], + "emissions": [ "emit_fog_plume" ] } ] diff --git a/data/json/furniture_and_terrain/terrain-fences-gates.json b/data/json/furniture_and_terrain/terrain-fences-gates.json index 019cd6bc23d79..6b6db529e89f9 100644 --- a/data/json/furniture_and_terrain/terrain-fences-gates.json +++ b/data/json/furniture_and_terrain/terrain-fences-gates.json @@ -549,6 +549,119 @@ ] } }, + { + "type": "terrain", + "id": "t_fence_metal", + "name": "metal fence", + "description": "A simple metal fence.", + "symbol": "LINE_OXOX", + "color": "light_gray", + "looks_like": "t_metal_railing", + "move_cost": 0, + "coverage": 60, + "examine_action": "chainfence", + "flags": [ "TRANSPARENT", "NOITEM", "THIN_OBSTACLE", "PERMEABLE", "CLIMBABLE", "AUTO_WALL_SYMBOL", "BURROWABLE" ], + "connects_to": "WOODFENCE", + "deconstruct": { + "ter_set": "t_floor", + "items": [ + { "item": "pipe", "count": 8 }, + { "item": "sheet_metal_small", "count": [ 16, 20 ] }, + { "item": "sheet_metal", "count": 2 } + ] + }, + "bash": { + "str_min": 10, + "str_max": 18, + "sound": "clang!", + "sound_fail": "smash!", + "ter_set": "t_floor", + "items": [ + { "item": "scrap", "count": [ 8, 12 ] }, + { "item": "pipe", "count": [ 4, 8 ] }, + { "item": "sheet_metal_small", "count": [ 8, 20 ] }, + { "item": "sheet_metal", "count": [ 0, 2 ] } + ] + } + }, + { + "type": "terrain", + "id": "t_gate_metal_c", + "name": "closed metal gate", + "description": "A closed metal gate.", + "symbol": "+", + "color": "light_gray", + "looks_like": "t_fencegate_c", + "move_cost": 0, + "coverage": 60, + "flags": [ "TRANSPARENT", "DOOR", "BURROWABLE" ], + "connects_to": "WOODFENCE", + "open": "t_gate_metal_o", + "deconstruct": { + "ter_set": "t_floor", + "items": [ + { "item": "pipe", "count": 8 }, + { "item": "sheet_metal_small", "count": [ 16, 20 ] }, + { "item": "sheet_metal", "count": 2 }, + { "item": "hinge", "count": 2 } + ] + }, + "bash": { + "str_min": 10, + "str_max": 20, + "str_min_blocked": 12, + "str_max_blocked": 30, + "sound": "crack.", + "sound_fail": "wham.", + "ter_set": "t_floor", + "items": [ + { "item": "scrap", "count": [ 8, 12 ] }, + { "item": "pipe", "count": [ 4, 8 ] }, + { "item": "sheet_metal_small", "count": [ 8, 20 ] }, + { "item": "sheet_metal", "count": [ 0, 2 ] }, + { "item": "hinge", "count": [ 1, 2 ] } + ] + } + }, + { + "type": "terrain", + "id": "t_gate_metal_o", + "name": "closed metal gate", + "description": "A closed metal gate.", + "symbol": ",", + "color": "light_gray", + "looks_like": "t_fencegate_o", + "move_cost": 1, + "coverage": 60, + "flags": [ "TRANSPARENT", "DOOR", "BURROWABLE", "FLAT", "ROAD" ], + "connects_to": "WOODFENCE", + "close": "t_gate_metal_c", + "deconstruct": { + "ter_set": "t_floor", + "items": [ + { "item": "pipe", "count": 8 }, + { "item": "sheet_metal_small", "count": [ 16, 20 ] }, + { "item": "sheet_metal", "count": 2 }, + { "item": "hinge", "count": 2 } + ] + }, + "bash": { + "str_min": 10, + "str_max": 20, + "str_min_blocked": 12, + "str_max_blocked": 30, + "sound": "crack.", + "sound_fail": "wham.", + "ter_set": "t_floor", + "items": [ + { "item": "scrap", "count": [ 8, 12 ] }, + { "item": "pipe", "count": [ 4, 8 ] }, + { "item": "sheet_metal_small", "count": [ 8, 20 ] }, + { "item": "sheet_metal", "count": [ 0, 2 ] }, + { "item": "hinge", "count": [ 1, 2 ] } + ] + } + }, { "type": "terrain", "id": "t_privacy_fence", diff --git a/data/json/furniture_and_terrain/terrain-floors-outdoors.json b/data/json/furniture_and_terrain/terrain-floors-outdoors.json index fe1e661f60726..0b779af7d1e67 100644 --- a/data/json/furniture_and_terrain/terrain-floors-outdoors.json +++ b/data/json/furniture_and_terrain/terrain-floors-outdoors.json @@ -21,6 +21,18 @@ "flags": [ "TRANSPARENT", "DIGGABLE", "FLAT" ], "bash": { "sound": "thump", "ter_set": "t_null", "str_min": 50, "str_max": 100, "str_min_supported": 100, "bash_below": true } }, + { + "type": "terrain", + "id": "t_mud", + "name": "mud", + "description": "An area of wet, slick mud.", + "symbol": ".", + "color": "brown", + "looks_like": "t_dirt", + "move_cost": 3, + "flags": [ "TRANSPARENT", "DIGGABLE", "FLAT" ], + "bash": { "sound": "thump", "ter_set": "t_null", "str_min": 50, "str_max": 100, "str_min_supported": 100, "bash_below": true } + }, { "type": "terrain", "id": "t_clay", diff --git a/data/json/furniture_and_terrain/terrain-floors_indoor.json b/data/json/furniture_and_terrain/terrain-floors_indoor.json index cdf6b83b6a70c..c4c7627bd1e84 100644 --- a/data/json/furniture_and_terrain/terrain-floors_indoor.json +++ b/data/json/furniture_and_terrain/terrain-floors_indoor.json @@ -668,5 +668,94 @@ { "item": "lead", "count": [ 12, 18 ] } ] } + }, + { + "type": "terrain", + "id": "t_dirt_underground", + "//": "for caverns and other natural underground formations.", + "name": "dirt", + "description": "It's dirt. Looks like some fine soil for tillage. Could also be dug out for construction projects.", + "symbol": ".", + "color": "brown", + "move_cost": 2, + "looks_like": "t_dirt", + "roof": "t_rock_roof", + "flags": [ "TRANSPARENT", "SUPPORTS_ROOF", "COLLAPSES", "INDOORS", "FLAT", "ROAD", "PLOWABLE", "DIGGABLE" ], + "bash": { "sound": "thump", "ter_set": "t_null", "str_min": 50, "str_max": 100, "str_min_supported": 100, "bash_below": true } + }, + { + "type": "terrain", + "id": "t_sand_underground", + "name": "sand", + "//": "for caverns and other natural underground formations.", + "description": "A large area of fine sand that could be useful in a number of ways, if it was extracted properly.", + "symbol": ".", + "color": "yellow", + "looks_like": "t_sand", + "move_cost": 3, + "roof": "t_rock_roof", + "flags": [ "TRANSPARENT", "SUPPORTS_ROOF", "INDOORS", "FLAT", "DIGGABLE" ], + "bash": { "sound": "thump", "ter_set": "t_null", "str_min": 50, "str_max": 100, "str_min_supported": 100, "bash_below": true } + }, + { + "type": "terrain", + "id": "t_mud_underground", + "//": "for caverns and other natural underground formations.", + "name": "mud", + "looks_like": "t_dirt", + "description": "An area of wet, slick mud.", + "symbol": ".", + "color": "brown", + "move_cost": 3, + "roof": "t_rock_roof", + "flags": [ "TRANSPARENT", "SUPPORTS_ROOF", "INDOORS", "FLAT", "DIGGABLE" ], + "bash": { "sound": "thump", "ter_set": "t_null", "str_min": 50, "str_max": 100, "str_min_supported": 100, "bash_below": true } + }, + { + "type": "terrain", + "id": "t_moss_underground", + "name": "moss", + "//": "for caverns and other natural underground formations.", + "looks_like": "t_grass", + "roof": "t_rock_roof", + "description": "Moist spongy moss.", + "symbol": ".", + "color": "light_green", + "move_cost": 2, + "flags": [ "TRANSPARENT", "DIGGABLE", "FLAT", "SUPPORTS_ROOF", "INDOORS" ], + "bash": { "sound": "thump", "ter_set": "t_null", "str_min": 40, "str_max": 100, "str_min_supported": 100, "bash_below": true } + }, + { + "type": "terrain", + "id": "t_clay_underground", + "name": "clay", + "//": "for caverns and other natural underground formations.", + "description": "A field full of malleable clay, suitable for kiln firing if it was extracted properly.", + "symbol": ".", + "color": "light_red", + "move_cost": 2, + "roof": "t_rock_roof", + "flags": [ "TRANSPARENT", "DIGGABLE", "FLAT", "SUPPORTS_ROOF", "INDOORS" ], + "bash": { "sound": "thump", "ter_set": "t_null", "str_min": 50, "str_max": 100, "str_min_supported": 100, "bash_below": true } + }, + { + "type": "terrain", + "id": "t_claymound_underground", + "name": "mound of clay", + "description": "A mound of clay soil.", + "//": "for caverns and other natural underground formations.", + "symbol": "#", + "color": "brown", + "move_cost": 5, + "roof": "t_rock_roof", + "flags": [ "TRANSPARENT", "BURROWABLE", "SUPPORTS_ROOF", "INDOORS" ], + "bash": { + "str_min": 2, + "str_max": 4, + "sound": "splosh!", + "sound_fail": "splosh!", + "ter_set": "t_water_dp", + "items": [ { "item": "clay_lump", "count": [ 6, 12 ] } ] + } } ] diff --git a/data/json/furniture_and_terrain/terrain-liquids.json b/data/json/furniture_and_terrain/terrain-liquids.json index 2a6530cd1b125..21ada254267b2 100644 --- a/data/json/furniture_and_terrain/terrain-liquids.json +++ b/data/json/furniture_and_terrain/terrain-liquids.json @@ -11,6 +11,21 @@ "connects_to": "WATER", "examine_action": "water_source" }, + { + "type": "terrain", + "id": "t_water_sh_underground", + "name": "shallow water", + "description": "The water isn't too deep here. With a watertight container, you could gather fresh water from here. Not safe to drink as is.", + "//": "for caverns and other natural underground formations.", + "symbol": "~", + "looks_like": "t_water_sh", + "color": "light_blue", + "move_cost": 5, + "roof": "t_rock_roof", + "flags": [ "TRANSPARENT", "LIQUID", "SWIMMABLE", "FISHABLE", "INDOORS" ], + "connects_to": "WATER", + "examine_action": "water_source" + }, { "type": "terrain", "id": "t_water_dp", @@ -23,6 +38,49 @@ "connects_to": "WATER", "examine_action": "water_source" }, + { + "type": "terrain", + "id": "t_water_dp_underground", + "name": "deep water", + "//": "for caverns and other natural underground formations.", + "description": "You're having trouble seeing the bottom through the deep water here. With a watertight container, you could gather fresh water from here. Not safe to drink as is.", + "symbol": "~", + "looks_like": "t_water_dp", + "color": "blue", + "move_cost": 8, + "roof": "t_rock_roof", + "flags": [ "TRANSPARENT", "LIQUID", "SWIMMABLE", "DEEP_WATER", "FISHABLE", "INDOORS" ], + "connects_to": "WATER", + "examine_action": "water_source" + }, + { + "type": "terrain", + "id": "t_water_murky", + "name": "murky shallow water", + "description": "The water isn't too deep here but is murky with organic matter. With a watertight container, you could gather fetid water from here. Not safe to drink as is.", + "symbol": "~", + "color": "light_blue", + "looks_like": "t_water_sh", + "move_cost": 5, + "flags": [ "TRANSPARENT", "LIQUID", "SWIMMABLE", "FISHABLE" ], + "connects_to": "WATER", + "examine_action": "water_source" + }, + { + "type": "terrain", + "id": "t_water_sh_murky_underground", + "name": "murky shallow water", + "description": "The water isn't too deep here but it is murky with organic matter. With a watertight container, you could gather fetid water from here. Not safe to drink as is.", + "//": "for caverns and other natural underground formations.", + "symbol": "~", + "color": "light_blue", + "looks_like": "t_water_sh", + "move_cost": 5, + "roof": "t_rock_roof", + "flags": [ "TRANSPARENT", "LIQUID", "SWIMMABLE", "FISHABLE", "INDOORS" ], + "connects_to": "WATER", + "examine_action": "water_source" + }, { "type": "terrain", "id": "t_water_moving_sh", @@ -36,6 +94,21 @@ "connects_to": "WATER", "examine_action": "water_source" }, + { + "type": "terrain", + "id": "t_water_moving_sh_underground", + "name": "flowing shallow water", + "description": "The streaming water isn't too deep here. With a watertight container, you could gather fresh water from here. Not safe to drink as is, although probably safer than stagnant water.", + "//": "for caverns and other natural underground formations.", + "looks_like": "t_water_sh", + "symbol": "~", + "color": "light_blue", + "move_cost": 6, + "roof": "t_rock_roof", + "flags": [ "TRANSPARENT", "LIQUID", "SWIMMABLE", "FISHABLE", "CURRENT", "INDOORS" ], + "connects_to": "WATER", + "examine_action": "water_source" + }, { "type": "terrain", "id": "t_water_moving_dp", @@ -49,6 +122,21 @@ "connects_to": "WATER", "examine_action": "water_source" }, + { + "type": "terrain", + "id": "t_water_moving_dp_underground", + "name": "flowing deep water", + "description": "The streaming water looks deep here. With a watertight container, you could gather fresh water from here. Not safe to drink as is, although probably safer than stagnant water.", + "looks_like": "t_water_dp", + "//": "for caverns and other natural underground formations.", + "symbol": "~", + "color": "blue", + "move_cost": 10, + "roof": "t_rock_roof", + "flags": [ "TRANSPARENT", "LIQUID", "SWIMMABLE", "DEEP_WATER", "FISHABLE", "CURRENT", "INDOORS" ], + "connects_to": "WATER", + "examine_action": "water_source" + }, { "type": "terrain", "id": "t_swater_sh", @@ -61,6 +149,21 @@ "connects_to": "WATER", "examine_action": "water_source" }, + { + "type": "terrain", + "id": "t_swater_sh_underground", + "name": "shallow water", + "description": "The water isn't too deep here. With a watertight container, you could gather salt water from here.", + "//": "for caverns and other natural underground formations.", + "symbol": "~", + "color": "light_blue", + "looks_like": "t_swater_sh", + "move_cost": 5, + "roof": "t_rock_roof", + "flags": [ "TRANSPARENT", "LIQUID", "SWIMMABLE", "SALT_WATER", "FISHABLE", "INDOORS" ], + "connects_to": "WATER", + "examine_action": "water_source" + }, { "type": "terrain", "id": "t_swater_dp", @@ -73,6 +176,21 @@ "connects_to": "WATER", "examine_action": "water_source" }, + { + "type": "terrain", + "id": "t_swater_dp_underground", + "name": "deep water", + "//": "for caverns and other natural underground formations.", + "description": "You're having trouble seeing the bottom through the deep water here. With a watertight container, you could gather salt water from here.", + "symbol": "~", + "color": "blue", + "looks_like": "t_swater_dp", + "move_cost": 8, + "roof": "t_rock_roof", + "flags": [ "TRANSPARENT", "LIQUID", "SWIMMABLE", "SALT_WATER", "DEEP_WATER", "FISHABLE", "INDOORS" ], + "connects_to": "WATER", + "examine_action": "water_source" + }, { "type": "terrain", "id": "t_water_pool", @@ -118,5 +236,44 @@ "trap": "tr_lava", "flags": [ "TRANSPARENT", "LIQUID", "DESTROY_ITEM", "USABLE_FIRE" ], "//": "lava-seared moose meat? yes, please" + }, + { + "type": "terrain", + "id": "t_water_cube", + "//": "for eventual use with water z levels. Currently non-functional.", + "name": "submersed water", + "description": "You are submerged below the surface of the water, your feet can't touch the ground. With a watertight container, you could gather fresh water from here. Not safe to drink as is.", + "symbol": "~", + "color": "blue", + "move_cost": 8, + "flags": [ "TRANSPARENT", "LIQUID", "SWIMMABLE", "DEEP_WATER", "GOES_DOWN", "GOES_UP" ], + "connects_to": "WATER", + "examine_action": "water_source" + }, + { + "type": "terrain", + "id": "t_lake_bed", + "//": "for eventual use with water z levels. Currently non-functional.", + "name": "lake bed", + "description": "You are standing at the bottom of a body of fresh water. With a watertight container, you could gather fresh water from here. Not safe to drink as is.", + "symbol": "~", + "color": "blue", + "move_cost": 8, + "flags": [ "TRANSPARENT", "LIQUID", "SWIMMABLE", "DEEP_WATER", "GOES_UP" ], + "connects_to": "WATER", + "examine_action": "water_source" + }, + { + "type": "terrain", + "id": "t_ocean_bed", + "//": "for eventual use with water z levels. Currently non-functional.", + "name": "ocean bed", + "description": "You are standing at the bottom of a body of salt water. With a watertight container, you could gather salt water from here. Not safe to drink as is.", + "symbol": "~", + "color": "blue", + "move_cost": 8, + "flags": [ "TRANSPARENT", "LIQUID", "SWIMMABLE", "DEEP_WATER", "GOES_UP" ], + "connects_to": "WATER", + "examine_action": "water_source" } ] diff --git a/data/json/furniture_and_terrain/terrain-manufactured.json b/data/json/furniture_and_terrain/terrain-manufactured.json index 7727916d77fbb..7b8f805aacacf 100644 --- a/data/json/furniture_and_terrain/terrain-manufactured.json +++ b/data/json/furniture_and_terrain/terrain-manufactured.json @@ -156,6 +156,42 @@ "items": [ { "item": "steel_chunk", "count": [ 1, 3 ] }, { "item": "scrap", "count": [ 4, 8 ] } ] } }, + { + "type": "terrain", + "id": "t_ticket_vendor", + "name": "ticket vendor", + "description": "This machine has a little screen, and slots intended to take your money and provide you with a ticket.", + "symbol": "&", + "color": "blue", + "move_cost": 0, + "coverage": 55, + "flags": [ "TRANSPARENT", "NOITEM", "ALARMED", "REDUCE_SCENT", "PERMEABLE" ], + "bash": { + "str_min": 40, + "str_max": 210, + "sound_fail": "clang!", + "ter_set": "t_floor", + "items": [ { "item": "steel_chunk", "count": [ 1, 3 ] }, { "item": "scrap", "count": [ 4, 8 ] } ] + } + }, + { + "type": "terrain", + "id": "t_ticket_machine", + "name": "ticket machine", + "description": "This machine will provide you access to whatever is beyond it - for the price of a ticket, of course.", + "symbol": "&", + "color": "blue", + "move_cost": 0, + "coverage": 55, + "flags": [ "TRANSPARENT", "NOITEM", "ALARMED", "REDUCE_SCENT", "PERMEABLE" ], + "bash": { + "str_min": 40, + "str_max": 210, + "sound_fail": "clang!", + "ter_set": "t_floor", + "items": [ { "item": "steel_chunk", "count": [ 1, 3 ] }, { "item": "scrap", "count": [ 4, 8 ] } ] + } + }, { "type": "terrain", "id": "t_generator_broken", diff --git a/data/json/furniture_and_terrain/terrain-roofs.json b/data/json/furniture_and_terrain/terrain-roofs.json index d4b55b3182881..85546279c78da 100644 --- a/data/json/furniture_and_terrain/terrain-roofs.json +++ b/data/json/furniture_and_terrain/terrain-roofs.json @@ -306,5 +306,24 @@ "ter_set": "t_open_air", "bash_below": true } + }, + { + "type": "terrain", + "id": "t_rock_roof", + "name": "rock roof", + "description": "A secton of flat natural rock.", + "looks_like": "t_flat_roof", + "symbol": ".", + "color": "brown", + "move_cost": 2, + "flags": [ "TRANSPARENT", "FLAT" ], + "bash": { + "str_min": 100, + "str_max": 210, + "sound": "crash!", + "sound_fail": "whump!", + "ter_set": "t_open_air", + "bash_below": true + } } ] diff --git a/data/json/furniture_and_terrain/terrain-walls.json b/data/json/furniture_and_terrain/terrain-walls.json index 6ca945171c096..ff4b3f9235dd3 100644 --- a/data/json/furniture_and_terrain/terrain-walls.json +++ b/data/json/furniture_and_terrain/terrain-walls.json @@ -1134,7 +1134,9 @@ { "item": "rock", "count": [ 3, 7 ] }, { "item": "coal_lump", "charges": [ 250, 500 ], "prob": 10 }, { "item": "material_limestone", "charges": [ 10, 25 ], "prob": 80 }, - { "item": "material_rocksalt", "count": [ 0, 1 ], "prob": 20 } + { "item": "material_rocksalt", "count": [ 0, 1 ], "prob": 20 }, + { "item": "material_rhodonite", "count": [ 0, 1 ], "prob": 3 }, + { "item": "material_zincite", "count": [ 0, 5 ], "prob": 5 } ] } }, diff --git a/data/json/itemgroups/ammo.json b/data/json/itemgroups/ammo.json index 5ad2b1e48ff9e..2156da28544d9 100644 --- a/data/json/itemgroups/ammo.json +++ b/data/json/itemgroups/ammo.json @@ -27,7 +27,6 @@ "//": "Less common pistol ammo including that only used by police/paramilitary forces.", "items": [ [ "10mm_fmj", 15 ], - [ "45colt_jhp", 10 ], [ "38_super", 20 ], [ "38super_fmj", 20 ], [ "44fmj", 15 ], @@ -53,6 +52,7 @@ "//": "Imported or otherwise very obscure pistol ammo.", "items": [ [ "454_Casull", 100 ], + [ "45colt_jhp", 50 ], [ "500_Magnum", 100 ], [ "762_25", 50 ], [ "762_25hot", 50 ], @@ -438,56 +438,56 @@ "type": "item_group", "id": "ammo_light_batteries", "items": [ - { "item": "light_battery_cell", "prob": 50, "charges-min": 0, "charges-max": 100 }, - { "item": "light_minus_battery_cell", "prob": 30, "charges-min": 0, "charges-max": 50 }, - { "item": "light_plus_battery_cell", "prob": 20, "charges-min": 0, "charges-max": 150 }, - { "item": "light_disposable_cell", "prob": 25, "charges-min": 0, "charges-max": 300 } + { "item": "light_battery_cell", "prob": 25, "charges-min": 0, "charges-max": 100 }, + { "item": "light_minus_battery_cell", "prob": 12, "charges-min": 0, "charges-max": 50 }, + { "item": "light_plus_battery_cell", "prob": 9, "charges-min": 0, "charges-max": 150 }, + { "item": "light_disposable_cell", "prob": 50, "charges-min": 0, "charges-max": 300 } ] }, { "type": "item_group", "id": "ammo_light_batteries_full", "items": [ - { "item": "light_battery_cell", "prob": 50, "charges-min": 100, "charges-max": 100 }, - { "item": "light_minus_battery_cell", "prob": 30, "charges-min": 50, "charges-max": 50 }, - { "item": "light_plus_battery_cell", "prob": 20, "charges-min": 150, "charges-max": 150 }, - { "item": "light_disposable_cell", "prob": 25, "charges-min": 300, "charges-max": 300 } + { "item": "light_battery_cell", "prob": 25, "charges-min": 100, "charges-max": 100 }, + { "item": "light_minus_battery_cell", "prob": 12, "charges-min": 50, "charges-max": 50 }, + { "item": "light_plus_battery_cell", "prob": 9, "charges-min": 150, "charges-max": 150 }, + { "item": "light_disposable_cell", "prob": 50, "charges-min": 300, "charges-max": 300 } ] }, { "type": "item_group", "id": "ammo_medium_batteries", "items": [ - { "item": "medium_battery_cell", "prob": 80, "charges-min": 0, "charges-max": 500 }, - { "item": "medium_plus_battery_cell", "prob": 20, "charges-min": 0, "charges-max": 600 }, - { "item": "medium_disposable_cell", "prob": 40, "charges-min": 0, "charges-max": 1200 } + { "item": "medium_battery_cell", "prob": 40, "charges-min": 0, "charges-max": 500 }, + { "item": "medium_plus_battery_cell", "prob": 10, "charges-min": 0, "charges-max": 600 }, + { "item": "medium_disposable_cell", "prob": 80, "charges-min": 0, "charges-max": 1200 } ] }, { "type": "item_group", "id": "ammo_medium_batteries_full", "items": [ - { "item": "medium_battery_cell", "prob": 80, "charges-min": 500, "charges-max": 500 }, - { "item": "medium_plus_battery_cell", "prob": 20, "charges-min": 600, "charges-max": 600 }, - { "item": "medium_disposable_cell", "prob": 40, "charges-min": 1200, "charges-max": 1200 } + { "item": "medium_battery_cell", "prob": 40, "charges-min": 500, "charges-max": 500 }, + { "item": "medium_plus_battery_cell", "prob": 10, "charges-min": 600, "charges-max": 600 }, + { "item": "medium_disposable_cell", "prob": 80, "charges-min": 1200, "charges-max": 1200 } ] }, { "type": "item_group", "id": "ammo_heavy_batteries", "items": [ - { "item": "heavy_battery_cell", "prob": 80, "charges-min": 0, "charges-max": 1000 }, - { "item": "heavy_plus_battery_cell", "prob": 20, "charges-min": 0, "charges-max": 1250 }, - { "item": "heavy_disposable_cell", "prob": 40, "charges-min": 0, "charges-max": 2500 } + { "item": "heavy_battery_cell", "prob": 40, "charges-min": 0, "charges-max": 1000 }, + { "item": "heavy_plus_battery_cell", "prob": 10, "charges-min": 0, "charges-max": 1250 }, + { "item": "heavy_disposable_cell", "prob": 80, "charges-min": 0, "charges-max": 2500 } ] }, { "type": "item_group", "id": "ammo_heavy_batteries_full", "items": [ - { "item": "heavy_battery_cell", "prob": 80, "charges-min": 1000, "charges-max": 1000 }, - { "item": "heavy_plus_battery_cell", "prob": 20, "charges-min": 1250, "charges-max": 1250 }, - { "item": "heavy_disposable_cell", "prob": 40, "charges-min": 2500, "charges-max": 2500 } + { "item": "heavy_battery_cell", "prob": 40, "charges-min": 1000, "charges-max": 1000 }, + { "item": "heavy_plus_battery_cell", "prob": 10, "charges-min": 1250, "charges-max": 1250 }, + { "item": "heavy_disposable_cell", "prob": 80, "charges-min": 2500, "charges-max": 2500 } ] }, { diff --git a/data/json/itemgroups/books.json b/data/json/itemgroups/books.json index 2589778bf6e89..8caefd2cd1371 100644 --- a/data/json/itemgroups/books.json +++ b/data/json/itemgroups/books.json @@ -306,6 +306,11 @@ [ "dnd_handbook", 2 ] ] }, + { + "id": "ranch_homebooks", + "type": "item_group", + "items": [ [ "reference_firstaid2", 2 ], { "group": "homebooks", "prob": 98 } ] + }, { "type": "item_group", "id": "manuals", @@ -371,6 +376,10 @@ [ "manual_driving", 15 ], [ "manual_survival", 20 ], [ "dnd_handbook", 2 ], + [ "reference_cooking", 1 ], + [ "reference_fabrication1", 1 ], + [ "reference_firstaid1", 1 ], + [ "reference_firstaid2", 1 ], [ "survnote", 3 ] ] }, @@ -422,6 +431,10 @@ [ "textbook_weapeast", 3 ], [ "textbook_armwest", 3 ], [ "textbook_armeast", 3 ], + [ "reference_cooking", 2 ], + [ "reference_fabrication1", 6 ], + [ "reference_firstaid1", 2 ], + [ "reference_firstaid2", 1 ], [ "survnote", 2 ] ] }, @@ -493,6 +506,10 @@ [ "textbook_gaswarfare", 2 ], [ "manual_electronics", 5 ], [ "advanced_electronics", 6 ], + [ "reference_cooking", 2 ], + [ "reference_fabrication1", 2 ], + [ "reference_firstaid1", 2 ], + [ "reference_firstaid2", 2 ], [ "dnd_handbook", 15 ], [ "novel_romance", 30 ], [ "novel_spy", 32 ], @@ -655,7 +672,8 @@ [ "recipe_medicalmut", 50 ], [ "recipe_serum", 10 ], [ "recipe_labchem", 100 ], - [ "recipe_augs", 100 ] + [ "recipe_augs", 100 ], + [ "reference_firstaid1", 15 ] ] }, { diff --git a/data/json/itemgroups/clothing.json b/data/json/itemgroups/clothing.json index 5ef287505e78c..e0d9065a7f966 100644 --- a/data/json/itemgroups/clothing.json +++ b/data/json/itemgroups/clothing.json @@ -271,7 +271,7 @@ [ "camelbak", 40 ], [ "chestpouch", 40 ], [ "backpack_tactical_large", 20 ], - [ "chestrig", 160 ], + [ "tacvest", 160 ], [ "molle_pack", 100 ], [ "rucksack", 80 ] ] diff --git a/data/json/itemgroups/collections_trades.json b/data/json/itemgroups/collections_trades.json index 694a6b6e922cc..59867591f92ee 100644 --- a/data/json/itemgroups/collections_trades.json +++ b/data/json/itemgroups/collections_trades.json @@ -63,6 +63,7 @@ { "group": "supplies_mechanics", "prob": 80 }, [ "goggles_welding", 50 ], [ "welding_book", 10 ], + [ "welding_mask", 30 ], [ "jerrycan", 10 ], [ "jerrycan_big", 10 ], [ "metal_tank", 8 ], diff --git a/data/json/itemgroups/corpses.json b/data/json/itemgroups/corpses.json index 3aab1f770f003..e5d34347e534e 100644 --- a/data/json/itemgroups/corpses.json +++ b/data/json/itemgroups/corpses.json @@ -1,4 +1,14 @@ [ + { + "id": "remains_human_generic", + "type": "item_group", + "subtype": "collection", + "entries": [ + { "item": "bone_human", "count": [ 5, 8 ], "prob": 100 }, + { "item": "human_flesh", "count": [ 5, 8 ], "prob": 100 }, + { "item": "hstomach", "prob": 50 } + ] + }, { "id": "remains_pilot", "type": "item_group", @@ -70,5 +80,25 @@ { "item": "human_flesh", "count": [ 5, 8 ], "prob": 100 }, { "item": "hstomach", "prob": 100 } ] + }, + { + "id": "corpses", + "type": "item_group", + "items": [ + [ "corpse_generic_male", 80 ], + [ "corpse_generic_female", 80 ], + [ "corpse_generic_boy", 15 ], + [ "corpse_generic_girl", 15 ], + [ "corpse_bloody", 10 ], + [ "corpse_painful", 10 ], + [ "corpse_scorched", 10 ], + [ "corpse_stabbed", 10 ], + [ "corpse_gunned", 10 ], + [ "corpse_halved_upper", 10 ], + [ "corpse_half_beheaded", 10 ], + [ "corpse_child_calm", 10 ], + [ "corpse_child_gunned", 10 ], + [ "corpse_oldwoman_jewelry", 10 ] + ] } ] diff --git a/data/json/itemgroups/guns.json b/data/json/itemgroups/guns.json index 97cada03a65ca..2a57e76f7cc24 100644 --- a/data/json/itemgroups/guns.json +++ b/data/json/itemgroups/guns.json @@ -91,7 +91,8 @@ { "item": "l_bak_223", "prob": 80, "charges-min": 0, "charges-max": 5 }, { "item": "rm99_pistol", "prob": 150, "charges-min": 0, "charges-max": 5 }, { "item": "tokarev", "prob": 100, "charges-min": 0, "charges-max": 8 }, - { "item": "walther_ppk", "prob": 100, "charges-min": 0, "charges-max": 8 } + { "item": "walther_ppk", "prob": 100, "charges-min": 0, "charges-max": 8 }, + { "item": "colt_saa", "prob": 150, "charges-min": 0, "charges-max": 6 } ] }, { @@ -361,7 +362,7 @@ "items": [ [ "LAW_Packed", 200 ], [ "m202_flash", 100 ], - [ "m235tpa", 150 ], + [ "m74_clip", 150 ], [ "m3_carlgustav", 50 ], [ "AT4", 50 ], [ "84x246mm_he", 100 ], diff --git a/data/json/item_groups.json b/data/json/itemgroups/item_groups.json similarity index 98% rename from data/json/item_groups.json rename to data/json/itemgroups/item_groups.json index c1cf40e3eaa0e..8ae1ac9427435 100644 --- a/data/json/item_groups.json +++ b/data/json/itemgroups/item_groups.json @@ -77,7 +77,8 @@ [ "months_old_newspaper", 1 ], [ "weeks_old_newspaper", 2 ], [ "newest_newspaper", 3 ], - { "group": "ammo_casings", "prob": 10 } + { "group": "ammo_casings", "prob": 10 }, + { "group": "everyday_corpse", "prob": 10 } ] }, { @@ -117,7 +118,8 @@ [ "bottle_glass", 1 ], [ "syringe", 1 ], [ "cig_butt", 1 ], - { "group": "ammo_casings", "prob": 20 } + { "group": "ammo_casings", "prob": 20 }, + { "group": "everyday_corpse", "prob": 10 } ] }, { @@ -146,6 +148,7 @@ "id": "road", "items": [ { "group": "ammo_casings", "prob": 20 }, + { "group": "everyday_corpse", "prob": 10 }, [ "jumper_cable", 5 ], [ "muffler", 5 ], [ "pipe", 20 ], @@ -423,6 +426,7 @@ [ "aluminum_foil", 25 ], [ "chips", 65 ], [ "fried_seeds", 15 ], + [ "rolling_pin", 25 ], [ "cereal", 50 ], [ "cereal2", 60 ], [ "cereal3", 45 ], @@ -830,6 +834,7 @@ "id": "oven", "items": [ [ "pan", 80 ], + [ "rolling_pin", 25 ], [ "waffleiron", 25 ], [ "teapot", 25 ], [ "pot", 80 ], @@ -2135,6 +2140,7 @@ "ammo": 75, "magazine": 100, "items": [ + [ "daypack", 20 ], [ "rope_30", 35 ], [ "hatchet", 10 ], [ "misc_repairkit", 5 ], @@ -2301,6 +2307,8 @@ "magazine": 100, "items": [ [ "aspirin", 85 ], + [ "daypack", 30 ], + [ "ski_jacket", 5 ], [ "sports_drink", 20 ], [ "bat", 60 ], [ "bat_metal", 60 ], @@ -2840,6 +2848,7 @@ "items": [ [ "coat_winter", 50 ], [ "peacoat", 30 ], + [ "ski_jacket", 40 ], [ "greatcoat", 15 ], [ "gloves_light", 35 ], [ "mittens", 30 ], @@ -3027,6 +3036,7 @@ [ "pants_checkered", 5 ], [ "shorts", 70 ], [ "shorts_denim", 35 ], + [ "ski_jacket", 40 ], [ "pants", 75 ], [ "breeches", 10 ], [ "leather_belt", 30 ], @@ -3186,6 +3196,7 @@ "type": "item_group", "id": "traveler", "items": [ + [ "daypack", 20 ], [ "roadmap", 6 ], [ "trailmap", 6 ], [ "touristmap", 4 ], @@ -3710,6 +3721,7 @@ [ "coffee_raw", 15 ], [ "usb_drive", 5 ], [ "software_useless", 10 ], + [ "software_electronics_reference", 2 ], [ "umbrella", 5 ], [ "teleumbrella", 2 ], [ "gum", 10 ], @@ -4752,6 +4764,8 @@ "type": "item_group", "id": "shelter", "items": [ + [ "daypack", 10 ], + [ "ski_jacket", 40 ], [ "water_clean", 90 ], [ "water_mineral", 5 ], [ "soup_veggy", 15 ], @@ -4975,9 +4989,12 @@ [ "magnesium", 10 ], [ "tin", 10 ], [ "chem_hydrogen_peroxide", 10 ], + [ "chem_muriatic_acid", 5 ], [ "chem_sulphur", 10 ], [ "chem_aluminium_powder", 5 ], [ "chem_zinc_powder", 10 ], + [ "chem_zinc", 5 ], + [ "chem_manganese_dioxide", 10 ], [ "chem_saltpetre", 10 ], [ "chem_carbide", 10 ], [ "denat_alcohol", 10 ] @@ -5022,6 +5039,9 @@ [ "chem_hydrogen_peroxide", 15 ], [ "chem_carbide", 10 ], [ "chem_zinc_powder", 10 ], + [ "chem_manganese_dioxide", 5 ], + [ "chem_potassium_chloride", 5 ], + [ "chem_muriatic_acid", 15 ], [ "denat_alcohol", 10 ] ] }, @@ -5080,8 +5100,13 @@ [ "chem_hexamine", 10 ], [ "chem_saltpetre", 15 ], [ "chem_nitric_acid", 15 ], + [ "chem_muriatic_acid", 20 ], + [ "chem_potassium_chloride", 5 ], + [ "chem_potassium_hydroxide", 10 ], + [ "chem_zinc", 10 ], [ "chem_chromium_oxide", 10 ], [ "chem_zinc_powder", 10 ], + [ "chem_manganese_dioxide", 5 ], [ "denat_alcohol", 10 ] ] }, @@ -5150,6 +5175,47 @@ [ "chem_nitric_acid", 5 ] ] }, + { + "type": "item_group", + "id": "mutagens", + "items": [ + [ "mutagen", 8 ], + [ "mutagen_plant", 2 ], + [ "mutagen_insect", 2 ], + [ "mutagen_spider", 2 ], + [ "mutagen_fish", 2 ], + [ "mutagen_slime", 2 ], + [ "mutagen_rat", 2 ], + [ "mutagen_beast", 2 ], + [ "mutagen_cattle", 2 ], + [ "mutagen_cephalopod", 2 ], + [ "mutagen_bird", 2 ], + [ "mutagen_lizard", 2 ], + [ "mutagen_troglobite", 2 ], + [ "mutagen_ursine", 2 ], + [ "mutagen_feline", 2 ], + [ "mutagen_lupine", 2 ], + [ "iv_mutagen", 6 ], + [ "iv_mutagen_plant", 2 ], + [ "iv_mutagen_insect", 2 ], + [ "iv_mutagen_spider", 2 ], + [ "iv_mutagen_fish", 2 ], + [ "iv_mutagen_slime", 2 ], + [ "iv_mutagen_rat", 2 ], + [ "iv_mutagen_beast", 2 ], + [ "iv_mutagen_cattle", 2 ], + [ "iv_mutagen_cephalopod", 2 ], + [ "iv_mutagen_bird", 2 ], + [ "iv_mutagen_lizard", 2 ], + [ "iv_mutagen_troglobite", 2 ], + [ "iv_mutagen_ursine", 2 ], + [ "iv_mutagen_feline", 2 ], + [ "iv_mutagen_lupine", 2 ], + [ "purifier", 10 ], + [ "iv_purifier", 8 ], + [ "syringe", 8 ] + ] + }, { "type": "item_group", "id": "mut_iv", @@ -5188,8 +5254,10 @@ [ "wrapped_rad_badge", 15 ], [ "glasses_safety", 40 ], [ "goggles_welding", 70 ], + [ "textbook_atomic_lab", 7 ], [ "recipe_lab_elec", 15 ], - [ "recipe_lab_cvd", 15 ], + [ "software_electronics_reference", 2 ], + [ "recipe_lab_cvd", 8 ], [ "recipe_mininuke_launch", 5 ], [ "teleporter", 10 ], [ "antiparasitic", 5 ], @@ -5571,6 +5639,7 @@ [ "bio_metabolics", 10 ], [ "bio_ethanol", 10 ], [ "bio_torsionratchet", 10 ], + [ "bio_fuel_cell_gasoline", 10 ], [ "bio_tools", 10 ], [ "bio_ups", 10 ], [ "bio_flashlight", 10 ], @@ -5665,6 +5734,7 @@ [ "bio_power_storage", 10 ], [ "bio_tools", 10 ], [ "bio_flashlight", 10 ], + [ "bio_fuel_cell_gasoline", 10 ], [ "bio_tattoo_led", 10 ], [ "bio_lighter", 10 ], [ "bio_magnet", 10 ], @@ -5685,10 +5755,8 @@ [ "bot_grenade_hack", 2 ], [ "bot_flashbang_hack", 2 ], [ "bot_gasbomb_hack", 2 ], - [ "bot_turret", 2 ], [ "bot_rifleturret", 2 ], - [ "556", 2 ], - [ "9mm", 2 ] + [ "bot_antimateriel", 2 ] ] }, { @@ -5728,7 +5796,7 @@ [ "8mm_inc", 6 ], [ "8mm_caseless", 6 ], [ "m202_flash", 15 ], - [ "m235tpa", 15 ], + [ "m74_clip", 15 ], [ "atgm_heat", 1 ], [ "rm20", 3 ], [ "20x66_flechette", 4 ], @@ -5782,7 +5850,7 @@ [ "backpack", 38 ], [ "UPS_off", 5 ], [ "adv_UPS_off", 3 ], - [ "chestrig", 10 ], + [ "tacvest", 10 ], [ "molle_pack", 8 ], [ "duffelbag", 15 ], [ "dump_pouch", 20 ], @@ -5859,7 +5927,7 @@ [ "modularvesthard", 1 ], [ "winter_jacket_army", 30 ], [ "vest", 15 ], - [ "chestrig", 10 ], + [ "tacvest", 10 ], [ "molle_pack", 8 ], [ "under_armor", 20 ], [ "power_armor_basic", 5 ], @@ -6221,7 +6289,7 @@ [ "ammo_satchel", 4 ], [ "UPS_off", 5 ], [ "adv_UPS_off", 3 ], - [ "chestrig", 10 ], + [ "tacvest", 10 ], [ "molle_pack", 8 ], [ "legrig", 10 ], [ "rucksack", 20 ], @@ -6685,6 +6753,7 @@ [ "ak74", 4 ], [ "an94", 1 ], [ "m4a1", 7 ], + [ "m16a4", 6 ], [ "h&k416a5", 3 ], [ "m1014", 1 ], [ "steyr_aug", 6 ], @@ -6853,11 +6922,6 @@ "id": "skitterbot", "items": [ [ "tazer", 3 ], [ "scrap", 9 ] ] }, - { - "type": "item_group", - "id": "secubot", - "items": [ [ "9mm", 8 ], [ "steel_plate", 30 ] ] - }, { "type": "item_group", "id": "copbot", @@ -6994,7 +7058,7 @@ [ "radio", 20 ], [ "UPS_off", 5 ], [ "adv_UPS_off", 3 ], - [ "chestrig", 10 ], + [ "tacvest", 10 ], [ "molle_pack", 8 ], [ "legrig", 10 ], [ "rucksack", 20 ], @@ -7154,6 +7218,7 @@ [ "m9", 6 ], [ "usp_45", 6 ], [ "m4a1", 7 ], + [ "m16a4", 5 ], [ "h&k416a5", 7 ], [ "m1014", 2 ], [ "scar_l", 6 ], @@ -7193,7 +7258,7 @@ [ "masterkey", 2 ], [ "rm121aux", 1 ], [ "shot_flechette", 5 ], - [ "chestrig", 10 ], + [ "tacvest", 10 ], [ "molle_pack", 8 ], [ "legrig", 10 ], [ "power_armor_basic", 5 ], @@ -7213,7 +7278,7 @@ [ "atgm_launcher", 1 ], [ "atgm_heat", 1 ], [ "m202_flash", 2 ], - [ "m235tpa", 3 ], + [ "m74_clip", 3 ], [ "rm51_assault_rifle", 1 ], [ "rm88_battle_rifle", 1 ], [ "rm614_lmg", 1 ], @@ -7348,6 +7413,10 @@ [ "pocket_firearms", 2 ], [ "SICP", 3 ], [ "textbook_robots", 1 ], + [ "reference_cooking", 1 ], + [ "reference_fabrication1", 1 ], + [ "reference_firstaid1", 1 ], + [ "reference_firstaid2", 1 ], [ "recipe_elfa", 1 ], [ "recipe_maiar", 1 ], [ "recipe_caseless", 1 ], @@ -7382,6 +7451,7 @@ [ "bio_soporific", 5 ], [ "bio_surgical_razor", 5 ], [ "bio_syringe", 8 ], + [ "software_electronics_reference", 10 ], [ "software_useless", 10 ], [ "canteen", 15 ], [ "2lcanteen", 10 ], @@ -7403,6 +7473,7 @@ [ "tin", 5 ], [ "chem_nitric_acid", 1 ], [ "chem_sulphuric_acid", 1 ], + [ "chem_muriatic_acid", 2 ], [ "chem_hexamine", 2 ], [ "denat_alcohol", 1 ], [ "remotevehcontrol", 5 ] @@ -7490,6 +7561,7 @@ "magazine": 100, "ammo": 50, "items": [ + [ "daypack", 20 ], [ "energy_drink", 55 ], [ "energy_drink_atomic", 8 ], [ "knuckle_brass", 30 ], @@ -7882,7 +7954,7 @@ [ "smart_phone", 10 ], [ "airhorn", 5 ], [ "boltcutters", 5 ], - [ "chestrig", 10 ], + [ "tacvest", 10 ], [ "chainsaw_off", 1 ], [ "backpack", 15 ], [ "rope_30", 10 ], @@ -7988,7 +8060,6 @@ [ "fsurvivor_suit", 4 ], [ "h20survivor_suit", 2 ], [ "touring_suit", 16 ], - [ "armor_bone", 12 ], [ "armor_larmor", 28 ], [ "armor_blarmor", 14 ], [ "armor_farmor", 8 ], @@ -8078,11 +8149,9 @@ [ "gloves_tactical", 12 ], [ "gauntlets_larmor", 14 ], [ "gauntlets_chitin", 2 ], - [ "gauntlets_bone", 12 ], [ "armguard_larmor", 7 ], [ "vambrace_larmor", 6 ], [ "armguard_chitin", 1 ], - [ "armguard_bone", 6 ], [ "armguard_scrap", 12 ], [ "gloves_fur", 4 ], [ "gloves_leather", 22 ], @@ -8108,7 +8177,6 @@ [ "knee_high_boots", 8 ], [ "boots_combat", 12 ], [ "boots_larmor", 14 ], - [ "boots_bone", 22 ], [ "boots_fur", 22 ], [ "boots_plate", 2 ], [ "boots_bunker", 8 ], @@ -8133,7 +8201,6 @@ [ "helmet_lobster", 8 ], [ "pot_helmet", 22 ], [ "helmet_larmor", 14 ], - [ "helmet_bone", 22 ], [ "pickelhaube", 1 ], [ "firehelmet", 2 ], [ "helmet_barbute", 1 ], @@ -8148,6 +8215,7 @@ "type": "item_group", "id": "survivorzed_extra", "items": [ + [ "daypack", 4 ], [ "mask_lsurvivor", 10 ], [ "mask_survivor", 8 ], [ "mask_hsurvivor", 6 ], @@ -8181,7 +8249,7 @@ [ "goggles_ski", 14 ], [ "goggles_nv", 2 ], [ "goggles_ir", 1 ], - [ "chestrig", 22 ], + [ "tacvest", 22 ], [ "legrig", 22 ], [ "tool_belt", 16 ], [ "fanny", 12 ], @@ -9001,6 +9069,7 @@ "//": "Bionics used by technicians.", "items": [ [ "bio_torsionratchet", 20 ], + [ "bio_fuel_cell_gasoline", 10 ], [ "bio_memory", 20 ], [ "bio_sunglasses", 20 ], [ "bio_heatsink", 20 ], @@ -9195,6 +9264,7 @@ "ammo": 50, "magazine": 100, "items": [ + [ "daypack", 75 ], [ "rope_30", 10 ], [ "hatchet", 50 ], [ "iceaxe", 20 ], @@ -9508,7 +9578,6 @@ [ "alarmclock", 25 ], [ "circuit", 25 ], { "item": "cell_phone", "prob": 35, "charges-min": 0, "charges-max": 15 }, - { "item": "cell_phone_flashlight", "prob": 25, "charges-min": 0, "charges-max": 15 }, [ "e_scrap", 55 ], [ "amplifier", 25 ], [ "reading_light", 10 ] @@ -9789,6 +9858,7 @@ "type": "item_group", "items": [ [ "cup_plastic", 20 ], + [ "rolling_pin", 20 ], [ "bowl_plastic", 20 ], [ "canteen", 10 ], [ "flask_hip", 15 ], diff --git a/data/json/itemgroups/misc.json b/data/json/itemgroups/misc.json index 3c23ebd6677c3..9700e57ffd40a 100644 --- a/data/json/itemgroups/misc.json +++ b/data/json/itemgroups/misc.json @@ -118,7 +118,7 @@ { "item": "pants_army" }, { "item": "tshirt", "count": 3 }, { "item": "under_armor" }, - { "item": "chestrig" }, + { "item": "tacvest" }, { "item": "coat_rain" }, { "item": "hood_rain" }, { "item": "long_underpants" }, diff --git a/data/json/itemgroups/supplies.json b/data/json/itemgroups/supplies.json index 34a1e88b9d863..4e60b01825af5 100644 --- a/data/json/itemgroups/supplies.json +++ b/data/json/itemgroups/supplies.json @@ -197,6 +197,7 @@ [ "solar_cell", 5 ], [ "fertilizer_commercial", 30 ], [ "chem_sulphuric_acid", 30 ], + [ "chem_muriatic_acid", 35 ], [ "peephole", 25 ], [ "chem_chromium_oxide", 5 ], [ "chem_zinc_powder", 5 ], @@ -229,6 +230,7 @@ [ "chem_saltpetre", 10 ], [ "chem_nitric_acid", 10 ], [ "chem_sulphuric_acid", 10 ], + [ "chem_muriatic_acid", 10 ], [ "chem_acetic_acid", 10 ], [ "chem_formaldehyde", 10 ], [ "chem_acetone", 10 ], @@ -236,6 +238,7 @@ [ "chem_ammonium_nitrate", 10 ], [ "chem_chromium_oxide", 10 ], [ "chem_zinc_powder", 10 ], + [ "chem_manganese_dioxide", 10 ], [ "chem_hydrogen_peroxide_conc", 10 ], [ "material_rocksalt", 2 ], [ "ether", 10 ], diff --git a/data/json/itemgroups/tools.json b/data/json/itemgroups/tools.json index 80806cb9b1c5b..88c900ff246bc 100644 --- a/data/json/itemgroups/tools.json +++ b/data/json/itemgroups/tools.json @@ -383,6 +383,45 @@ [ "acetylene_machine", 1 ] ] }, + { + "type": "item_group", + "id": "tools_robotics", + "//": "tools and equipment you might find on robotics laboratories.", + "items": [ + [ "recipe_lab_elec", 4 ], + [ "UPS_off", 6 ], + [ "file", 10 ], + [ "atomic_lamp", 1 ], + [ "control_laptop", 1 ], + [ "bot_manhack", 2 ], + [ "teleporter", 1 ], + [ "laptop", 4 ], + [ "plut_cell", 4 ], + [ "superglue", 30 ], + [ "pliers", 10 ], + [ "matches", 10 ], + [ "glasses_safety", 20 ], + [ "duct_tape", 8 ], + [ "misc_repairkit", 15 ], + [ "welder", 10 ], + [ "soldering_iron", 8 ], + [ "extinguisher", 10 ], + [ "magnifying_glass", 10 ], + [ "multitool", 20 ], + [ "screwdriver_set", 20 ], + [ "flashlight", 20 ], + [ "mobile_memory_card_science", 40 ], + [ "camera_pro", 2 ], + [ "element", 5 ], + [ "battery", 10 ], + [ "goggles_welding", 20 ], + [ "sm_extinguisher", 10 ], + [ "toolbox", 5 ], + [ "tool_belt", 10 ], + [ "hand_vice", 10 ], + [ "wrench", 10 ] + ] + }, { "id": "hand_tools", "type": "item_group", diff --git a/data/json/items/ammo.json b/data/json/items/ammo.json index 395f900bfd195..0ad101a1fb855 100644 --- a/data/json/items/ammo.json +++ b/data/json/items/ammo.json @@ -32,7 +32,7 @@ "material": [ "steel", "plastic", "lead" ], "flags": [ "LEAK_DAM", "RADIOACTIVE" ], "volume": "250 ml", - "weight": 160 + "weight": "160 g" }, { "type": "TOOL", @@ -46,7 +46,7 @@ "material": [ "steel", "lead" ], "flags": [ "LEAK_DAM", "RADIOACTIVE" ], "volume": "500 ml", - "weight": 4000 + "weight": "4000 g" }, { "type": "AMMO", @@ -59,7 +59,7 @@ "description": "A thin foil made of aluminum. Sometimes called 'tin foil' due to being made of tin in the past.", "material": "aluminum", "volume": 0, - "weight": 4, + "weight": "4 g", "ammo_type": "components", "count": 200 }, @@ -88,7 +88,7 @@ "material": "cotton", "flags": [ "NO_SALVAGE" ], "volume": "250 ml", - "weight": 1, + "weight": "1 g", "ammo_type": "thread", "count": 50, "stack_size": 200 @@ -104,7 +104,7 @@ "description": "A tough sinew cut from a corpse, usable as thread.", "material": "flesh", "volume": "250 ml", - "weight": 1, + "weight": "1 g", "ammo_type": "thread", "count": 10, "stack_size": 200 @@ -120,7 +120,7 @@ "description": "Tough thin fiber, taken from a plant. Can be used as thread.", "material": "veggy", "volume": "250 ml", - "weight": 1, + "weight": "1 g", "ammo_type": "thread", "count": 10, "stack_size": 200 @@ -136,7 +136,7 @@ "description": "Wool yarn, could be used to knit wool clothing.", "material": "wool", "volume": "250 ml", - "weight": 1, + "weight": "1 g", "ammo_type": "thread", "count": 10, "stack_size": 200 @@ -151,7 +151,7 @@ "color": "white", "description": "A cleansing agent made into bars.", "volume": "250 ml", - "weight": 90, + "weight": "90 g", "ammo_type": "soap", "count": 10, "stack_size": 10 @@ -167,7 +167,7 @@ "description": "A roll of incredibly strong tape. Its uses are innumerable.", "material": "plastic", "volume": "250 ml", - "weight": 4, + "weight": "4 g", "ammo_type": "tape", "count": 200, "flags": [ "UNRECOVERABLE" ] @@ -182,7 +182,7 @@ "description": "These are thin paper strips intended for the rolling of cigarettes.", "price": 150, "material": "paper", - "weight": 1, + "weight": "1 g", "volume": "100ml", "ammo_type": "components", "stack_size": 200, @@ -200,7 +200,7 @@ "description": "Plastic jacketed copper cable of the type used in small electronics.", "material": [ "plastic", "copper" ], "volume": "750 ml", - "weight": 2, + "weight": "2 g", "ammo_type": "components", "count": 200 }, @@ -216,7 +216,7 @@ "material": [ "steel", "plastic" ], "flags": [ "LEAK_DAM", "RADIOACTIVE" ], "volume": "250 ml", - "weight": 80, + "weight": "80 g", "ammo_type": "plutonium", "count": 5, "effects": [ "COOKOFF", "NEVER_MISFIRES" ], @@ -233,7 +233,7 @@ "description": "Highly radioactive slurry. It is probably best to get far away from this.", "flags": [ "LEAK_ALWAYS", "RADIOACTIVE" ], "volume": "250 ml", - "weight": 26, + "weight": "25500 mg", "ammo_type": "reactor_slurry", "phase": "liquid", "container": "metal_tank_little", @@ -250,7 +250,7 @@ "description": "Highly radioactive slurry. It is probably best to get far away from this.", "flags": [ "LEAK_ALWAYS", "RADIOACTIVE" ], "volume": "250 ml", - "weight": 25.5, + "weight": "25500 mg", "ammo_type": "reactor_slurry", "phase": "liquid", "container": "metal_tank_little", @@ -266,7 +266,7 @@ "description": "A handful of pebbles, useful as ammunition for slings or slingshots.", "material": "stone", "volume": "250 ml", - "weight": 5, + "weight": "5 g", "ammo_type": "pebble", "damage": 2, "range": 10, @@ -285,7 +285,7 @@ "description": "A handful of round projectiles made of clay, useful for slings or slingshots.", "material": "clay", "volume": "250 ml", - "weight": 3, + "weight": "3 g", "ammo_type": "pebble", "damage": 1, "range": 20, @@ -304,7 +304,7 @@ "description": "A handful of glass marbles, useful as ammunition for slings or slingshots.", "material": "glass", "volume": "250 ml", - "weight": 3, + "weight": "3 g", "ammo_type": "pebble", "damage": 3, "range": 18, @@ -324,7 +324,7 @@ "description": "A box of ball bearings, useful as ammunition for slings or slingshots.", "material": "steel", "volume": "250 ml", - "weight": 10, + "weight": "10 g", "ammo_type": "pebble", "damage": 6, "pierce": 1, @@ -344,7 +344,7 @@ "description": "A box of small steel balls. They deal virtually no damage.", "material": "steel", "volume": "200ml", - "weight": 1, + "weight": "1 g", "ammo_type": "BB", "damage": 2, "dispersion": 100, @@ -364,7 +364,7 @@ "description": "Feathers from a bird. Useful for fletching arrows.", "material": "cotton", "volume": "250 ml", - "weight": 1, + "weight": "1 g", "ammo_type": "components", "stack_size": 100, "count": 20 @@ -380,7 +380,7 @@ "description": "Fluffy down feathers from a bird. Useful for making cozy bedclothes.", "material": "cotton", "volume": "250 ml", - "weight": 1, + "weight": "1 g", "ammo_type": "components", "stack_size": 100, "count": 20 @@ -395,7 +395,7 @@ "description": "A 60mm high-explosive anti-tank round. It could blow through up to two feet of concrete.", "material": [ "steel", "powder" ], "volume": "250 ml", - "weight": 1803, + "weight": "1803 g", "ammo_type": "66mm", "damage": 2500, "pierce": 400, @@ -414,7 +414,7 @@ "description": "A 120mm high-explosive anti-tank round. It could ruin anyone's whole day.", "material": [ "steel", "powder" ], "volume": "250 ml", - "weight": 1803, + "weight": "1803 g", "ammo_type": "120mm", "damage": 40, "pierce": 10, @@ -434,7 +434,7 @@ "description": "A canister of pressurized hydrogen so heavily compressed it has turned solid. With proper equipment, it could be heated to plasma.", "material": [ "steel", "powder" ], "volume": "2500 ml", - "weight": 183, + "weight": "183 g", "ammo_type": "plasma", "damage": 35, "pierce": 14, @@ -459,7 +459,7 @@ "description": "An unfired, like-new .22 round casing, with the primer still intact.", "material": [ "powder", "brass" ], "volume": "250 ml", - "weight": 1, + "weight": "1 g", "ammo_type": "components", "count": 200, "effects": [ "COOKOFF" ] @@ -477,7 +477,7 @@ "material": "powder", "flags": [ "TINDER" ], "volume": "250 ml", - "weight": 1, + "weight": "1 g", "ammo_type": "components", "count": 454, "effects": [ "COOKOFF" ] @@ -542,7 +542,7 @@ "container": "bottle_plastic_small", "material": "powder", "volume": "250 ml", - "weight": 1, + "weight": "1 g", "ammo_type": "components", "count": 200, "effects": [ "COOKOFF" ] @@ -559,7 +559,7 @@ "container": "bottle_plastic_small", "material": "powder", "volume": "250 ml", - "weight": 1, + "weight": "1 g", "ammo_type": "components", "count": 200 }, @@ -574,7 +574,7 @@ "description": "Primer from a shotgun shell.", "material": [ "steel", "powder" ], "volume": "250 ml", - "weight": 1, + "weight": "1 g", "ammo_type": "components", "count": 200, "effects": [ "COOKOFF" ] @@ -590,7 +590,7 @@ "description": "Primer from a small caliber pistol round.", "material": [ "steel", "powder" ], "volume": "250 ml", - "weight": 1, + "weight": "1 g", "ammo_type": "components", "count": 200, "effects": [ "COOKOFF" ] @@ -606,7 +606,7 @@ "description": "Primer from a large caliber pistol round.", "material": [ "steel", "powder" ], "volume": "250 ml", - "weight": 1, + "weight": "1 g", "ammo_type": "components", "count": 200, "effects": [ "COOKOFF" ] @@ -622,7 +622,7 @@ "description": "Primer from a small caliber rifle round.", "material": [ "steel", "powder" ], "volume": "250 ml", - "weight": 1, + "weight": "1 g", "ammo_type": "components", "count": 200, "effects": [ "COOKOFF" ] @@ -638,7 +638,7 @@ "description": "Primer from a large caliber rifle round.", "material": [ "steel", "powder" ], "volume": "250 ml", - "weight": 1, + "weight": "1 g", "ammo_type": "components", "count": 200, "effects": [ "COOKOFF" ] @@ -654,7 +654,7 @@ "description": "Rubber slugs from a shotgun beanbag round. You could use them to make new beanbag rounds.", "material": "plastic", "volume": "250 ml", - "weight": 2, + "weight": "2 g", "ammo_type": "components", "count": 25 }, @@ -669,7 +669,7 @@ "description": "Copper scraps. Could be used to craft something, for example makeshift shotgun shells.", "material": "copper", "volume": "250 ml", - "weight": 2, + "weight": "2 g", "ammo_type": "components", "count": 200 }, @@ -684,7 +684,7 @@ "description": "A roll of medical tape, similar to duct tape.", "material": "plastic", "volume": "250 ml", - "weight": 3, + "weight": "3 g", "ammo_type": "components", "count": 35 }, @@ -698,7 +698,7 @@ "description": "93mm single-stage high-explosive ammunition for the RPG-7.", "material": [ "steel", "powder" ], "volume": "1750 ml", - "weight": 2600, + "weight": "2600 g", "ammo_type": "RPG-7", "damage": 3000, "pierce": 750, @@ -717,7 +717,7 @@ "description": "64mm/105mm high-explosive tandem ammunition for the RPG-7.", "material": [ "steel", "powder" ], "volume": "2250 ml", - "weight": 4500, + "weight": "4500 g", "ammo_type": "RPG-7", "damage": 3250, "pierce": 1450, @@ -736,7 +736,7 @@ "description": "105mm thermobaric ammunition for the RPG-7.", "material": [ "plastic", "powder" ], "volume": "2250 ml", - "weight": 4500, + "weight": "4500 g", "ammo_type": "RPG-7", "damage": 150, "pierce": 10, @@ -755,7 +755,7 @@ "description": "40mm high-explosive fragmentation antipersonnel ammunition for the RPG-7.", "material": [ "steel", "powder" ], "volume": "1 L", - "weight": 2000, + "weight": "2000 g", "ammo_type": "RPG-7", "damage": 80, "pierce": 10, @@ -764,27 +764,6 @@ "recoil": 350, "effects": [ "COOKOFF", "TRAIL", "NEVER_MISFIRES", "FRAG" ] }, - { - "type": "AMMO", - "id": "m235tpa", - "price": 200000, - "//": "$500 per. Cheap!", - "name": "M235 66mm TPA rocket", - "symbol": "=", - "color": "dark_gray", - "description": "66mm incendiary rockets used in the M202 FLASH rocket launcher. Their warheads are filled with a thickened pyrophoric agent, which burns at 2200 degrees Fahrenheit.", - "material": [ "steel", "powder" ], - "volume": "2 L", - "weight": 1140, - "ammo_type": "m235", - "damage": 60, - "pierce": 10, - "range": 70, - "dispersion": 150, - "recoil": 150, - "count": 4, - "effects": [ "COOKOFF", "NAPALM_BIG", "TRAIL", "NEVER_MISFIRES" ] - }, { "type": "AMMO", "id": "generic_no_ammo", @@ -809,7 +788,7 @@ "material": "wood", "phase": "solid", "volume": "250 ml", - "weight": 11, + "weight": "11 g", "ammo_type": "charcoal", "count": 50, "stack_size": 10, @@ -828,7 +807,7 @@ "material": "cac2powder", "phase": "solid", "volume": "250 ml", - "weight": 11, + "weight": "11 g", "ammo_type": "cac2powder", "count": 25, "stack_size": 10, @@ -846,7 +825,7 @@ "material": "wood", "phase": "solid", "volume": "250 ml", - "weight": 44, + "weight": "44 g", "ammo_type": "charcoal", "count": 250, "stack_size": 10, @@ -863,7 +842,7 @@ "description": "A heavily modified handheld nuclear device on a rocket. Intended to be fired from a specialized launcher, it has been rigged to explode on impact instead of on a timer. It can fly further than the explosion will reach, probably.", "material": "plastic", "volume": "97 L", - "weight": 34500, + "weight": "34500 g", "bashing": 8, "ammo_type": "mininuke_mod", "damage": 14, @@ -881,7 +860,7 @@ "description": "A tiny glass vial filled with advanced fast-healing chemicals which can only be activated by a Rivtech jet injector device. A label on the side warns against using more than two doses per hour.", "material": "glass", "volume": "250 ml", - "weight": 1, + "weight": "1 g", "ammo_type": "ampoule", "count": 2, "stack_size": 20 @@ -897,7 +876,7 @@ "description": "A pressurized multi-chamber glass vial filled with powerful chemical stimulants which can only be activated by a Rivtech stimulant delivery system.", "material": "glass", "volume": "250 ml", - "weight": 1, + "weight": "1 g", "ammo_type": "stimpack_ammo", "count": 5, "stack_size": 10 @@ -913,7 +892,7 @@ "description": "A replacement filter cartridge for a rebreather.", "material": "aluminum", "volume": "250 ml", - "weight": 12, + "weight": "12 g", "ammo_type": "rebreather_filter", "count": 30 }, @@ -927,7 +906,7 @@ "color": "light_gray", "description": "Small replacement filter cartridge for air filtration masks.", "volume": "250 ml", - "weight": 1, + "weight": "1 g", "ammo_type": "gasfilter_s", "count": 100 }, @@ -941,7 +920,7 @@ "color": "light_gray", "description": "Medium replacement filter cartridge for air filtration masks.", "volume": "250 ml", - "weight": 2, + "weight": "2 g", "ammo_type": "gasfilter_m", "count": 100 }, @@ -955,7 +934,7 @@ "color": "light_gray", "description": "Heavy replacement filter cartridge for air filtration masks.", "volume": "250 ml", - "weight": 3, + "weight": "3 g", "ammo_type": "gasfilter_l", "count": 100 }, @@ -971,7 +950,7 @@ "container": "bottle_plastic_small", "phase": "liquid", "volume": "250 ml", - "weight": 2, + "weight": "2 g", "ammo_type": "components", "count": 50 }, @@ -981,7 +960,7 @@ "category": "spare_parts", "name": "fish bait", "description": "A bait used in traps to lure fish.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "symbol": "=", "color": "light_red", @@ -1002,7 +981,7 @@ "description": "A canister of oxygen.", "material": "steel", "volume": "2500 ml", - "weight": 1183, + "weight": "1183 g", "ammo_type": "oxygen", "count": 10 }, @@ -1016,7 +995,7 @@ "description": "A hand-built rocket, consisting of a spike welded onto a pipe that was filled with improvised rocket fuel. Horribly inaccurate, as can be expected of this grade of weapon, but packs a fierce punch... if it hits.", "material": [ "steel", "powder" ], "volume": "1500 ml", - "weight": 1510, + "weight": "1510 g", "ammo_type": "homebrew_rocket", "damage": 80, "pierce": 80, @@ -1035,7 +1014,7 @@ "description": "A hand-built rocket, consisting of a simple explosive warhead attached onto a pipe, filled with improvised rocket fuel. Not very powerful, but can be made from scratch.", "material": [ "steel", "powder" ], "volume": "1250 ml", - "weight": 990, + "weight": "990 g", "ammo_type": "homebrew_rocket", "damage": 500, "pierce": 125, @@ -1054,7 +1033,7 @@ "description": "A hand-built rocket, consisting of a container of flammable gel attached onto a pipe, filled with improvised rocket fuel. Short-range incendiary - handle with care!", "material": [ "steel", "powder" ], "volume": "1500 ml", - "weight": 1190, + "weight": "1190 g", "ammo_type": "homebrew_rocket", "damage": 50, "pierce": 15, @@ -1074,7 +1053,7 @@ "description": "The result of an interrupted charcoal making process. Useless, except as fuel in a charcoal kiln.", "material": "wood", "volume": "250 ml", - "weight": 300, + "weight": "300 g", "ammo_type": "unfinished_char" }, { @@ -1088,7 +1067,7 @@ "description": "The incomplete process of converting coal and lime into calcium carbide. Useless in this state/", "material": "cac2powder", "volume": "250 ml", - "weight": 300, + "weight": "300 g", "ammo_type": "unfinished_cac2" }, { @@ -1102,7 +1081,7 @@ "description": "Small metal rings, suitable for constructing chainmail.", "material": "iron", "volume": "250 ml", - "weight": 1, + "weight": "1 g", "ammo_type": "components", "count": 150 }, @@ -1118,7 +1097,7 @@ "container": "bottle_plastic", "description": "Mixture of oxygen and nitrogen in proportions suitable for diving.", "volume": "250 ml", - "weight": 1, + "weight": "1 g", "phase": "gas", "ammo_type": "nitrox" }, @@ -1129,7 +1108,7 @@ "name": "tinder", "name_plural": "tinder", "description": "Flammable material, finely divided for easy combustion.", - "weight": 10, + "weight": "10 g", "volume": "250 ml", "price": 0, "bashing": 1, @@ -1153,7 +1132,7 @@ "description": "A die used to play various role-playing games.", "material": "plastic", "volume": "250 ml", - "weight": 1, + "weight": "1 g", "ammo_type": "pebble", "damage": 1, "range": 20, @@ -1175,7 +1154,7 @@ "description": "A metal die used to play various role-playing games", "material": "zinc", "volume": "250 ml", - "weight": 1, + "weight": "1 g", "ammo_type": "pebble", "damage": 3, "range": 15, @@ -1192,7 +1171,7 @@ "name": "bronze", "name_plural": "bronze", "description": "Decent-sized chunks of bronze, for fashioning some old-school items.", - "weight": 218, + "weight": "218 g", "volume": "250 ml", "price": 1200, "to_hit": -2, diff --git a/data/json/items/ammo/10mm.json b/data/json/items/ammo/10mm.json index e2b01b2cf98d8..721590fdbbeea 100644 --- a/data/json/items/ammo/10mm.json +++ b/data/json/items/ammo/10mm.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": "10mm Auto FMJ", "description": "A jacketed 10mm Auto round. The 10mm Auto cartridge is a rather powerful handgun round and the progenitor to the more popular .40 S&W.", - "weight": 9, + "weight": "9 g", "volume": "250 ml", - "price": 2800, + "price": 400, + "price_postapoc": 2800, "material": [ "brass", "powder" ], "symbol": "=", "color": "yellow", diff --git a/data/json/items/ammo/12mm.json b/data/json/items/ammo/12mm.json index 75de52d2669bc..0be1d7d872e84 100644 --- a/data/json/items/ammo/12mm.json +++ b/data/json/items/ammo/12mm.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": "H&K 12mm", "description": "The Heckler & Koch 12mm projectiles are used in H&K railguns. It's made of a ferromagnetic metal, probably cobalt.", - "weight": 11, + "weight": "11 g", "volume": "250 ml", - "price": 50000, + "price": 6000, + "price_postapoc": 50000, "material": [ "steel" ], "symbol": "=", "color": "blue", diff --git a/data/json/items/ammo/20x66mm.json b/data/json/items/ammo/20x66mm.json index 319b8a5985316..83a4c53ef46f8 100644 --- a/data/json/items/ammo/20x66mm.json +++ b/data/json/items/ammo/20x66mm.json @@ -5,7 +5,8 @@ "type": "AMMO", "name": "20x66mm beanbag", "description": "20x66mm caseless shotgun rounds, sublethal beanbag type. Proprietary ammunition for Rivtech shotguns. Being caseless rounds, these cannot be disassembled or reloaded.", - "price": 25000, + "price": 8000, + "price_postapoc": 25000, "count": 10, "proportional": { "damage": 0.1, "recoil": 0.4, "loudness": 0.6 }, "extend": { "effects": [ "LARGE_BEANBAG", "NOGIB" ] } @@ -46,7 +47,8 @@ "type": "AMMO", "name": "20x66mm explosive", "description": "20x66mm caseless shotgun rounds, explosive projectile type. Proprietary ammunition for Rivtech shotguns. Being caseless rounds, these cannot be disassembled or reloaded.", - "price": 80000, + "price": 10000, + "price_postapoc": 80000, "range": 20, "damage": 16, "pierce": 4, @@ -59,7 +61,8 @@ "type": "AMMO", "name": "20x66mm flare", "description": "20x66mm caseless shotgun rounds, signal flare type. Proprietary ammunition for Rivtech shotguns. Being caseless rounds, these cannot be disassembled or reloaded.", - "price": 20000, + "price": 5000, + "price_postapoc": 20000, "count": 10, "range": 20, "damage": 16, @@ -74,7 +77,8 @@ "type": "AMMO", "name": "20x66mm flechette", "description": "20x66mm caseless shotgun rounds, flechette type. Proprietary ammunition for Rivtech shotguns. Being caseless rounds, these cannot be disassembled or reloaded.", - "price": 55000, + "price": 4000, + "price_postapoc": 55000, "count": 10, "relative": { "damage": -10, "pierce": 20 } }, @@ -84,7 +88,8 @@ "type": "AMMO", "name": "20x66mm frag", "description": "20x66mm caseless shotgun rounds, explosive fragmentation type. Proprietary ammunition for Rivtech shotguns. Being caseless rounds, these cannot be disassembled or reloaded.", - "price": 90000, + "price": 7800, + "price_postapoc": 90000, "count": 5, "proportional": { "damage": 0.25, "pierce": 0.25 }, "extend": { "effects": [ "FRAG" ] } @@ -95,7 +100,8 @@ "type": "AMMO", "name": "20x66mm incendiary", "description": "20x66mm caseless shotgun rounds, incendiary type. Proprietary ammunition for Rivtech shotguns. Being caseless rounds, these cannot be disassembled or reloaded.", - "price": 100000, + "price": 10500, + "price_postapoc": 100000, "count": 10, "extend": { "effects": [ "INCENDIARY" ] } }, @@ -105,9 +111,10 @@ "name": "20x66mm buckshot", "//": "2.5x the Generic Rate of $1/shot", "description": "20x66mm caseless shotgun rounds, buckshot type. Proprietary ammunition for Rivtech shotguns. Being caseless rounds, these cannot be disassembled or reloaded.", - "weight": 56, + "weight": "56 g", "volume": "250 ml", - "price": 9000, + "price": 1500, + "price_postapoc": 9000, "material": [ "steel", "powder" ], "symbol": "=", "color": "pink", @@ -125,7 +132,8 @@ "type": "AMMO", "name": "20x66mm slug", "description": "20x66mm caseless shotgun rounds, solid projectile type. Proprietary ammunition for Rivtech shotguns. Being caseless rounds, these cannot be disassembled or reloaded.", - "price": 9000, + "price": 1500, + "price_postapoc": 9000, "relative": { "range": 12, "pierce": 8 }, "proportional": { "damage": 0.65, "dispersion": 1.3 }, "delete": { "effects": [ "SHOT" ] } diff --git a/data/json/items/ammo/22.json b/data/json/items/ammo/22.json index e8a9d80629bda..32fae3cfab18d 100644 --- a/data/json/items/ammo/22.json +++ b/data/json/items/ammo/22.json @@ -5,7 +5,8 @@ "type": "AMMO", "name": ".22 CB", "description": "The .22 Conical Ball is a variety of .22 ammunition that propels its bullet using a primer instead of gunpowder. The end result is a subsonic round that is so weak as to be nearly useless given your predicament.", - "price": 1800, + "price": 100, + "price_postapoc": 1800, "count": 100, "stack_size": 150, "recoil": 39, @@ -25,9 +26,10 @@ "type": "AMMO", "name": ".22 LR", "description": ".22 Long Rifle ammunition with 40gr unjacketed bullets. The .22LR round is extremely weak with very low stopping power, short range, and negligible recoil. It is most useful for rifle training, and hunting small animals.", - "weight": 3, + "weight": "3 g", "volume": "250 ml", - "price": 2500, + "price": 150, + "price_postapoc": 2500, "material": [ "brass", "lead", "powder" ], "symbol": "=", "color": "yellow", diff --git a/data/json/items/ammo/223.json b/data/json/items/ammo/223.json index 77d256b8af9db..998d5146b6055 100644 --- a/data/json/items/ammo/223.json +++ b/data/json/items/ammo/223.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": ".223 Remington", "description": ".223 Remington ammunition with 36gr JHP bullets. The .223 round has been very popular with civilian shooters for almost a century, finding use in a wide variety of weapons. It generates lower pressure than 5.56 NATO leading to slightly decreased accuracy and recoil.", - "weight": 12, + "weight": "12 g", "volume": "250 ml", - "price": 6580, + "price": 280, + "price_postapoc": 6580, "material": [ "brass", "powder" ], "symbol": "=", "color": "yellow", @@ -27,7 +28,8 @@ "type": "AMMO", "name": "5.56 NATO M855A1", "description": "5.56x45mm ammunition with a 62gr FMJ bullet containing a steel penetrator. Its light weight, high accuracy, and manageable recoil lead to widespread use in the 20th century and it remains popular among militaries and civilians.", - "price": 8225, + "price": 290, + "price_postapoc": 8225, "relative": { "damage": -2, "pierce": 4, "dispersion": -10 }, "proportional": { "recoil": 1.1 }, "extend": { "effects": [ "NEVER_MISFIRES" ] } diff --git a/data/json/items/ammo/270win.json b/data/json/items/ammo/270win.json index d8bbe8a075041..f0c4b020e7d64 100644 --- a/data/json/items/ammo/270win.json +++ b/data/json/items/ammo/270win.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": ".270 Winchester JSP", "description": ".270 Winchester ammunition with 130gr soft point bullets. The .270 round was not initially successful, but over a few decades it became one of the most popular rifle cartridges for hunting and silhouette shooting. It is a powerful round capable of taking down large targets with ease.", - "weight": 20, + "weight": "20 g", "volume": "250 ml", - "price": 1700, + "price": 170, + "price_postapoc": 1700, "material": [ "brass", "powder" ], "symbol": "=", "color": "yellow", diff --git a/data/json/items/ammo/300.json b/data/json/items/ammo/300.json index 25b12948fafb0..02bb4e9331268 100644 --- a/data/json/items/ammo/300.json +++ b/data/json/items/ammo/300.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": ".300 Winchester Magnum", "description": ".300 Winchester Magnum rounds with 220gr JHP bullets. The 300WM round is an extremely powerful and accurate rifle round introduced in 1963. It has proven popular with hunters and snipers, although it is not as common as .308 or .30-06.", - "weight": 28, + "weight": "28 g", "volume": "250 ml", - "price": 2500, + "price": 220, + "price_postapoc": 2500, "material": [ "brass", "powder" ], "symbol": "=", "color": "yellow", diff --git a/data/json/items/ammo/3006.json b/data/json/items/ammo/3006.json index bdc90cb5d4ad5..0885789abb5e6 100644 --- a/data/json/items/ammo/3006.json +++ b/data/json/items/ammo/3006.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": ".30-06 Springfield", "description": ".30-06 Springfield rounds with 165gr soft point bullets. The .30-06 cartridge has excellent accuracy, range, and stopping power making it popular with hunters and snipers for well over a century.", - "weight": 20, + "weight": "20 g", "volume": "250 ml", - "price": 1200, + "price": 160, + "price_postapoc": 1200, "material": [ "brass", "powder" ], "symbol": "=", "color": "yellow", diff --git a/data/json/items/ammo/300blk.json b/data/json/items/ammo/300blk.json index 6ffd31c9068f9..8751dfc2fd085 100644 --- a/data/json/items/ammo/300blk.json +++ b/data/json/items/ammo/300blk.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": ".300 AAC Blackout", "description": "A .300 AAC Blackout round with a 125gr open tip match bullet. 300 BLK is an intermediate cartridge necked up from 5.56x45mm, designed to achieve similar ballistics to 7.62x39mm. It is compatible with standard AR-15 lower receivers and will feed from STANAG magazines.", - "weight": 18, + "weight": "18 g", "volume": "250 ml", - "price": 3500, + "price": 290, + "price_postapoc": 3500, "material": [ "brass", "powder" ], "symbol": "=", "color": "yellow", @@ -27,7 +28,7 @@ "type": "AMMO", "name": ".300 AAC Blackout", "description": "A subsonic .300 AAC Blackout round with a 220gr open tip match bullet. 300 BLK is an intermediate cartridge necked up from 5.56x45mm, designed to achieve similar ballistics to 7.62x39mm. It is compatible with standard AR-15 lower receivers and will feed from STANAG magazines.", - "weight": 21, + "weight": "21 g", "range": 40, "damage": 26, "recoil": 1700 diff --git a/data/json/items/ammo/308.json b/data/json/items/ammo/308.json index 6e533af4e1ac5..11bebadd1ec9c 100644 --- a/data/json/items/ammo/308.json +++ b/data/json/items/ammo/308.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": ".308 Winchester", "description": ".308 Winchester ammunition with 168gr hollow point bullets. The .308 round is one of the most popular hunting cartridges in the world due to its accuracy and power.", - "weight": 18, + "weight": "18 g", "volume": "250 ml", - "price": 2200, + "price": 180, + "price_postapoc": 2200, "material": [ "brass", "powder" ], "symbol": "=", "color": "yellow", diff --git a/data/json/items/ammo/32.json b/data/json/items/ammo/32.json index dfaf1be60a6cb..fe491863974f3 100644 --- a/data/json/items/ammo/32.json +++ b/data/json/items/ammo/32.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": ".32 ACP", "description": "The .32 ACP was a popular handgun cartridge in the 20th century. Not so powerful as the .38 or the 9x19mm though.", - "weight": 5, + "weight": "5 g", "volume": "250 ml", - "price": 1800, + "price": 160, + "price_postapoc": 1800, "material": [ "brass", "powder" ], "symbol": "=", "color": "yellow", @@ -20,6 +21,15 @@ "recoil": 150, "effects": [ "COOKOFF" ] }, + { + "id": "bp_32_acp", + "copy-from": "32_acp", + "type": "AMMO", + "name": ".32 ACP blackpowder", + "proportional": { "price": 0.3, "damage": 0.76, "recoil": 0.76, "pierce": 0.5, "dispersion": 1.2 }, + "extend": { "effects": [ "RECYCLED", "BLACKPOWDER", "MUZZLE_SMOKE" ] }, + "delete": { "effects": [ "NEVER_MISFIRES" ] } + }, { "id": "reloaded_32_acp", "copy-from": "32_acp", diff --git a/data/json/items/ammo/357mag.json b/data/json/items/ammo/357mag.json index be55b8d390574..a7d4223f4fdc1 100644 --- a/data/json/items/ammo/357mag.json +++ b/data/json/items/ammo/357mag.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": ".357 magnum FMJ", "description": "Jacketed .357 magnum ammunition. The .357 magnum round is derived from the earlier .38 special, with a marginally longer case and generating greater pressure.", - "weight": 8, + "weight": "8 g", "volume": "250 ml", - "price": 4000, + "price": 140, + "price_postapoc": 4000, "material": [ "brass", "powder" ], "symbol": "=", "color": "light_gray", diff --git a/data/json/items/ammo/357sig.json b/data/json/items/ammo/357sig.json index 8bc672c2dcc91..493e663c5e909 100644 --- a/data/json/items/ammo/357sig.json +++ b/data/json/items/ammo/357sig.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": ".357 SIG FMJ", "description": "Jacketed .357 SIG ammunition. The .357 SIG round is a high velocity pistol cartridge, giving it a flatter trajectory than many handgun rounds.", - "weight": 8, + "weight": "8 g", "volume": "250 ml", - "price": 4000, + "price": 370, + "price_postapoc": 4000, "material": [ "brass", "powder" ], "symbol": "=", "color": "light_gray", diff --git a/data/json/items/ammo/36paper.json b/data/json/items/ammo/36paper.json index ede1918af7abe..6d913775b573b 100644 --- a/data/json/items/ammo/36paper.json +++ b/data/json/items/ammo/36paper.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": ".36 paper cartridge", "description": "A paper cartridge containing a premeasured amount of black powder and a .36 projectile. Used by the Colt M1861 Navy.", - "weight": 6, + "weight": "6 g", "volume": "250 ml", - "price": 5000, + "price": 400, + "price_postapoc": 5000, "material": [ "paper", "powder", "lead" ], "symbol": "=", "color": "white", @@ -16,6 +17,6 @@ "damage": 19, "dispersion": 80, "recoil": 210, - "effects": [ "COOKOFF", "MUZZLE_SMOKE" ] + "effects": [ "COOKOFF", "MUZZLE_SMOKE", "BLACKPOWDER" ] } ] diff --git a/data/json/items/ammo/38.json b/data/json/items/ammo/38.json index c2ff69713b2e5..d57bd7e03bd2f 100644 --- a/data/json/items/ammo/38.json +++ b/data/json/items/ammo/38.json @@ -12,9 +12,10 @@ "type": "AMMO", "name": ".38 Special", "description": ".38 Special ammunition with 130gr FMJ bullets. The .38 Special round was extremely common among US police forces during the 20th century.", - "weight": 8, + "weight": "8 g", "volume": "250 ml", - "price": 2200, + "price": 210, + "price_postapoc": 2200, "material": [ "brass", "powder" ], "symbol": "=", "color": "yellow", @@ -34,7 +35,8 @@ "type": "AMMO", "name": ".38 Super", "description": ".38 Super ammunition with 90gr JHP bullets. Designed in 1929, the .38 super cartridge was designed to penetrate body armor and vehicles.", - "price": 2700, + "price": 240, + "price_postapoc": 2700, "count": 20, "relative": { "damage": 5, "pierce": 4, "dispersion": -10 }, "proportional": { "recoil": 1.5 } @@ -66,14 +68,22 @@ "extend": { "effects": [ "RECYCLED" ] }, "delete": { "effects": [ "NEVER_MISFIRES" ] } }, + { + "id": "bp_38_fmj", + "copy-from": "38_fmj", + "type": "AMMO", + "name": ".38 FMJ blackpowder", + "proportional": { "price": 0.3, "damage": 0.76, "recoil": 0.76, "pierce": 0.5, "dispersion": 1.2 }, + "extend": { "effects": [ "RECYCLED", "BLACKPOWDER", "MUZZLE_SMOKE" ] }, + "delete": { "effects": [ "NEVER_MISFIRES" ] } + }, { "id": "bp_38_special", "copy-from": "38_special", "type": "AMMO", - "name": "blackpowder .38 Special", - "description": "This .38 Special cartridge is loaded with a 200gr cast lead hollowpoint and 23gr of blackpowder. While it's much slower than a regular .38, it has tremendous stopping power.", - "proportional": { "price": 0.6, "damage": 1.15, "dispersion": 1.3 }, - "extend": { "effects": [ "RECYCLED", "MUZZLE_SMOKE" ] }, + "name": ".38 Special blackpowder", + "proportional": { "price": 0.3, "damage": 0.76, "recoil": 0.76, "pierce": 0.5, "dispersion": 1.2 }, + "extend": { "effects": [ "RECYCLED", "BLACKPOWDER", "MUZZLE_SMOKE" ] }, "delete": { "effects": [ "NEVER_MISFIRES" ] } } ] diff --git a/data/json/items/ammo/380.json b/data/json/items/ammo/380.json index 7310db6f7acc3..89915fb3a3ce4 100644 --- a/data/json/items/ammo/380.json +++ b/data/json/items/ammo/380.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": ".380 ACP FMJ", "description": ".380 ACP ammunition with a brass jacketed 95gr bullet. Popular in pocket pistols for over a century, it is often considered the weakest caliber to consider carrying. One should be careful not to chamber it in 9x18mm Makarov or 9x19mm firearms.", - "weight": 6, + "weight": "6 g", "volume": "250 ml", - "price": 2600, + "price": 140, + "price_postapoc": 2600, "material": [ "brass", "powder" ], "symbol": "=", "color": "yellow", @@ -35,11 +36,30 @@ "type": "AMMO", "name": ".380 ACP +P", "description": "Overpressure .380 ACP ammunition with a 90gr jacketed hollow point bullet. These defensive loadings are designed to maximize performance and tend to be more accurate than practice ammo. One should be careful not to chamber it in 9x18mm Makarov or 9x19mm firearms.", - "price": 3800, + "price": 190, + "price_postapoc": 3800, "count": 25, "relative": { "damage": 4, "pierce": 2, "dispersion": -15 }, "proportional": { "recoil": 1.1 } }, + { + "id": "bp_380_FMJ", + "copy-from": "380_FMJ", + "type": "AMMO", + "name": ".380 ACP FMJ blackpowder", + "proportional": { "price": 0.3, "damage": 0.76, "recoil": 0.76, "pierce": 0.5, "dispersion": 1.2 }, + "extend": { "effects": [ "RECYCLED", "BLACKPOWDER", "MUZZLE_SMOKE" ] }, + "delete": { "effects": [ "NEVER_MISFIRES" ] } + }, + { + "id": "bp_380_JHP", + "copy-from": "380_JHP", + "type": "AMMO", + "name": ".380 ACP JHP blackpowder", + "proportional": { "price": 0.3, "damage": 0.76, "recoil": 0.76, "pierce": 0.5, "dispersion": 1.2 }, + "extend": { "effects": [ "RECYCLED", "BLACKPOWDER", "MUZZLE_SMOKE" ] }, + "delete": { "effects": [ "NEVER_MISFIRES" ] } + }, { "id": "reloaded_380_FMJ", "copy-from": "380_FMJ", diff --git a/data/json/items/ammo/38super.json b/data/json/items/ammo/38super.json index 782cb194c3542..16a60cb58d1cf 100644 --- a/data/json/items/ammo/38super.json +++ b/data/json/items/ammo/38super.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": ".38 Super FMJ", "description": ".38 Super ammunition with 147gr FMJ bullets. The .38 Super round was developed from .38 ACP in the 1920s, designed to penetrate the body armor of the era.", - "weight": 8, + "weight": "8 g", "volume": "250 ml", - "price": 2200, + "price": 210, + "price_postapoc": 2200, "material": [ "brass", "powder" ], "symbol": "=", "color": "yellow", diff --git a/data/json/items/ammo/40.json b/data/json/items/ammo/40.json index ec30fd1ebd020..f83847caaf062 100644 --- a/data/json/items/ammo/40.json +++ b/data/json/items/ammo/40.json @@ -12,9 +12,10 @@ "type": "AMMO", "name": ".40 S&W JHP", "description": ".40 S&W ammunition with 135gr JHP bullets. The .40 S&W round is a descended from the 10mm Auto cartridge and maintains most of its predecessor's strengths while reducing recoil.", - "weight": 9, + "weight": "9 g", "volume": "250 ml", - "price": 2800, + "price": 220, + "price_postapoc": 2800, "material": [ "brass", "powder" ], "symbol": "=", "color": "yellow", @@ -29,6 +30,24 @@ "recoil": 560, "effects": [ "COOKOFF" ] }, + { + "id": "bp_40fmj", + "copy-from": "40fmj", + "type": "AMMO", + "name": ".40 S&W FMJ blackpowder", + "proportional": { "price": 0.3, "damage": 0.76, "recoil": 0.76, "pierce": 0.5, "dispersion": 1.2 }, + "extend": { "effects": [ "RECYCLED", "BLACKPOWDER", "MUZZLE_SMOKE" ] }, + "delete": { "effects": [ "NEVER_MISFIRES" ] } + }, + { + "id": "bp_40sw", + "copy-from": "40sw", + "type": "AMMO", + "name": ".40 S&W JHP blackpowder", + "proportional": { "price": 0.3, "damage": 0.76, "recoil": 0.76, "pierce": 0.5, "dispersion": 1.2 }, + "extend": { "effects": [ "RECYCLED", "BLACKPOWDER", "MUZZLE_SMOKE" ] }, + "delete": { "effects": [ "NEVER_MISFIRES" ] } + }, { "id": "reloaded_40fmj", "copy-from": "40fmj", diff --git a/data/json/items/ammo/40mm.json b/data/json/items/ammo/40mm.json index 60c6acccfa55d..d1daa51eb812b 100644 --- a/data/json/items/ammo/40mm.json +++ b/data/json/items/ammo/40mm.json @@ -3,9 +3,10 @@ "abstract": "40mm_grenade", "type": "AMMO", "name": "40mm grenade", - "weight": 230, + "weight": "230 g", "volume": "250 ml", - "price": 40000, + "price": 10000, + "price_postapoc": 40000, "material": [ "steel", "powder" ], "symbol": "=", "color": "yellow", diff --git a/data/json/items/ammo/410shot.json b/data/json/items/ammo/410shot.json index 53c3419327590..69fe0ace77cec 100644 --- a/data/json/items/ammo/410shot.json +++ b/data/json/items/ammo/410shot.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": ".410 000 shot", "description": "A .410 shell with 5 000 pellets. Good for a hunting or combat load.", - "weight": 32, + "weight": "32 g", "volume": "250 ml", - "price": 3500, + "price": 175, + "price_postapoc": 3500, "material": [ "plastic", "powder" ], "symbol": "=", "color": "red", diff --git a/data/json/items/ammo/44.json b/data/json/items/ammo/44.json index 32f73b3cfa259..85026aba9c1c0 100644 --- a/data/json/items/ammo/44.json +++ b/data/json/items/ammo/44.json @@ -12,9 +12,10 @@ "type": "AMMO", "name": ".44 Magnum", "description": ".44 magnum ammunition with 240gr JHP bullets. The .44 magnum round is one of the most powerful handgun cartridges available. It has excellent stopping power but suffers from extremely high recoil for a handgun round.", - "weight": 13, + "weight": "13 g", "volume": "250 ml", - "price": 2900, + "price": 175, + "price_postapoc": 2900, "material": [ "brass", "powder" ], "symbol": "=", "color": "light_gray", @@ -51,11 +52,18 @@ "id": "bp_44magnum", "copy-from": "44magnum", "type": "AMMO", - "name": "blackpowder .44 Magnum", - "description": "This .44 Magnum cartridge is loaded with 39gr of blackpowder and a 200gr cast lead semi-wadcutter.", - "proportional": { "price": 0.6, "dispersion": 1.2 }, - "pierce": 0, - "extend": { "effects": [ "RECYCLED", "MUZZLE_SMOKE" ] }, + "name": ".44 Magnum blackpowder", + "proportional": { "price": 0.3, "damage": 0.76, "recoil": 0.76, "pierce": 0.5, "dispersion": 1.2 }, + "extend": { "effects": [ "RECYCLED", "BLACKPOWDER", "MUZZLE_SMOKE" ] }, + "delete": { "effects": [ "NEVER_MISFIRES" ] } + }, + { + "id": "bp_44fmj", + "copy-from": "44fmj", + "type": "AMMO", + "name": ".44 Magnum FMJ blackpowder", + "proportional": { "price": 0.3, "damage": 0.76, "recoil": 0.76, "pierce": 0.5, "dispersion": 1.2 }, + "extend": { "effects": [ "RECYCLED", "BLACKPOWDER", "MUZZLE_SMOKE" ] }, "delete": { "effects": [ "NEVER_MISFIRES" ] } } ] diff --git a/data/json/items/ammo/44paper.json b/data/json/items/ammo/44paper.json index b8e7ee4650f22..868054794585d 100644 --- a/data/json/items/ammo/44paper.json +++ b/data/json/items/ammo/44paper.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": ".44 paper cartridge", "description": "A paper cartridge containing a premeasured amount of black powder and a .44 projectile. Used by the Colt M1860 Army.", - "weight": 7, + "weight": "7 g", "volume": "250 ml", - "price": 5000, + "price": 350, + "price_postapoc": 5000, "material": [ "paper", "powder", "lead" ], "symbol": "=", "color": "white", @@ -16,6 +17,6 @@ "damage": 27, "dispersion": 70, "recoil": 580, - "effects": [ "COOKOFF", "MUZZLE_SMOKE" ] + "effects": [ "COOKOFF", "MUZZLE_SMOKE", "BLACKPOWDER" ] } ] diff --git a/data/json/items/ammo/45.json b/data/json/items/ammo/45.json index 0a1c6bab74768..70a6022167514 100644 --- a/data/json/items/ammo/45.json +++ b/data/json/items/ammo/45.json @@ -12,9 +12,10 @@ "type": "AMMO", "name": ".45 ACP JHP", "description": ".45 ACP ammunition with 185gr JHP bullets. The .45 ACP round was developed to replace the .38 Long Colt cartridge in the early 20th century. It has good stopping power but above average recoil.", - "weight": 10, + "weight": "10 g", "volume": "250 ml", - "price": 2000, + "price": 180, + "price_postapoc": 2000, "material": [ "brass", "powder" ], "symbol": "=", "color": "yellow", @@ -35,10 +36,29 @@ "type": "AMMO", "name": ".45 ACP +P", "description": "Overpressure .45 ACP ammunition with 200gr JHP bullets. This +P ammunition has higher muzzle energy than typical loads leading to greater damage, accuracy and recoil.", - "price": 2800, + "price": 210, + "price_postapoc": 2800, "count": 10, "relative": { "damage": 4, "pierce": 4, "dispersion": -10, "recoil": 60 } }, + { + "id": "bp_45_acp", + "copy-from": "45_acp", + "type": "AMMO", + "name": ".45 ACP FMJ blackpowder", + "proportional": { "price": 0.3, "damage": 0.76, "recoil": 0.76, "pierce": 0.5, "dispersion": 1.2 }, + "extend": { "effects": [ "RECYCLED", "BLACKPOWDER", "MUZZLE_SMOKE" ] }, + "delete": { "effects": [ "NEVER_MISFIRES" ] } + }, + { + "id": "bp_45_jhp", + "copy-from": "45_jhp", + "type": "AMMO", + "name": ".45 ACP JHP blackpowder", + "proportional": { "price": 0.3, "damage": 0.76, "recoil": 0.76, "pierce": 0.5, "dispersion": 1.2 }, + "extend": { "effects": [ "RECYCLED", "BLACKPOWDER", "MUZZLE_SMOKE" ] }, + "delete": { "effects": [ "NEVER_MISFIRES" ] } + }, { "id": "reloaded_45_acp", "copy-from": "45_acp", diff --git a/data/json/items/ammo/454.json b/data/json/items/ammo/454.json index 7ab204a389247..171cd7e24ffba 100644 --- a/data/json/items/ammo/454.json +++ b/data/json/items/ammo/454.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": ".454 Casull", "description": ".454 Casull ammunition with 300gr jacketed soft point bullets. The .454 Casull round is derived from .45 Long Colt with a stronger, lengthened case. It is an exceptionally powerful cartridge with higher stopping power than many rifle rounds, although it suffers from extreme recoil making it unsuitable for most purposes.", - "weight": 16, + "weight": "16 g", "volume": "250 ml", - "price": 2400, + "price": 500, + "price_postapoc": 2400, "material": [ "steel", "powder" ], "symbol": "=", "color": "light_gray", @@ -34,10 +35,9 @@ "id": "bp_454_Casull", "copy-from": "454_Casull", "type": "AMMO", - "name": "blackpowder .454 Casull", - "description": "This strange anachronism of a cartridge is loaded with 45gr of blackpowder and a relatively light 190gr cast lead hollowpoint.", - "proportional": { "price": 0.6, "dispersion": 1.3 }, - "extend": { "effects": [ "RECYCLED", "MUZZLE_SMOKE" ] }, + "name": ".454 Casull blackpowder", + "proportional": { "price": 0.3, "damage": 0.76, "recoil": 0.76, "pierce": 0.5, "dispersion": 1.2 }, + "extend": { "effects": [ "RECYCLED", "BLACKPOWDER", "MUZZLE_SMOKE" ] }, "delete": { "effects": [ "NEVER_MISFIRES" ] } } ] diff --git a/data/json/items/ammo/4570.json b/data/json/items/ammo/4570.json index 709ccb89f9a11..6bc56b5814a91 100644 --- a/data/json/items/ammo/4570.json +++ b/data/json/items/ammo/4570.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": ".45-70 SP", "description": ".45-70 Government ammunition loaded with a 305 grain soft point round. One of the oldest cartridges still in use, it is still a favorite for large game hunting at short ranges.", - "weight": 35, + "weight": "35 g", "volume": "250 ml", - "price": 4000, + "price": 125, + "price_postapoc": 4000, "material": [ "brass", "powder" ], "symbol": "+", "color": "green", @@ -27,7 +28,8 @@ "type": "AMMO", "name": ".45-70 +P penetrator", "description": ".45-70 Government +P ammunition loaded with a 305 grain solid copper penetrator projectile. Designed for maximum penetration through thick hide and bone while maintaining ideal wounding characteristics.", - "price": 5000, + "price": 175, + "price_postapoc": 5000, "count": 10, "relative": { "range": 2, "damage": 4, "pierce": 7, "recoil": 300 } }, @@ -37,7 +39,8 @@ "type": "AMMO", "name": ".45-70 LFN cowboy", "description": ".45-70 Government ammunition loaded with a 405 grain lead flat nose bullet to original specifications for safe use in antique firearms. Quite a bit less powerful than modern ammo, but still packs a punch.", - "price": 3500, + "price": 250, + "price_postapoc": 3500, "relative": { "range": -8, "damage": -14, "pierce": -2, "recoil": -900 } }, { diff --git a/data/json/items/ammo/45colt.json b/data/json/items/ammo/45colt.json index e34d9682b7e1c..36a4a2d3e54e8 100644 --- a/data/json/items/ammo/45colt.json +++ b/data/json/items/ammo/45colt.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": ".45 Colt JHP", "description": ".45 Colt ammunition with 250gr jacketed hollow point bullets. Originally designed for the Colt Single Action Army, and still used for modern reproduction revolvers. Originally a black powder cartridge, modern loads can make this round competitive in the new era.", - "weight": 12, + "weight": "12 g", "volume": "250 ml", - "price": 2200, + "price": 200, + "price_postapoc": 2200, "material": [ "brass", "powder" ], "symbol": "=", "color": "yellow", diff --git a/data/json/items/ammo/46.json b/data/json/items/ammo/46.json index f01f070835ea1..6c6b677ad5012 100644 --- a/data/json/items/ammo/46.json +++ b/data/json/items/ammo/46.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": "4.6x30mm", "description": "4.6x30mm ammunition with 31gr copper plated steel bullets. The 4.6x30mm round was developed by H&K to compete with FN Herstal's 5.7x28mm cartridge. It has low recoil and excellent armor penetration.", - "weight": 5, + "weight": "5 g", "volume": "250 ml", - "price": 5200, + "price": 300, + "price_postapoc": 5200, "material": [ "steel", "powder" ], "symbol": "=", "color": "dark_gray", @@ -21,12 +22,23 @@ "recoil": 90, "effects": [ "COOKOFF" ] }, + { + "id": "bp_46mm", + "copy-from": "46mm", + "type": "AMMO", + "name": "4.6x30mm blackpowder", + "description": "4.6x30mm ammunition with 31gr copper plated lead bullets. The 4.6x30mm round was developed by H&K to compete with FN Herstal's 5.7x28mm cartridge. It has low recoil, but no usual armor penetration due to using simple lead bullets rather than proper factory-made penetrator projectiles.", + "proportional": { "price": 0.3, "damage": 0.46, "recoil": 0.46, "pierce": 0.1, "dispersion": 1.2 }, + "extend": { "effects": [ "RECYCLED", "BLACKPOWDER", "MUZZLE_SMOKE" ] }, + "delete": { "effects": [ "NEVER_MISFIRES" ] } + }, { "id": "reloaded_46mm", "copy-from": "46mm", "type": "AMMO", "name": "reloaded 4.6x30mm", - "proportional": { "price": 0.7, "damage": 0.9, "dispersion": 1.1 }, + "description": "4.6x30mm ammunition with 31gr copper plated lead bullets. The 4.6x30mm round was developed by H&K to compete with FN Herstal's 5.7x28mm cartridge. It has low recoil, but no usual armor penetration due to using simple lead bullets rather than proper factory-made penetrator projectiles.", + "proportional": { "price": 0.7, "damage": 0.9, "pierce": 0.2, "dispersion": 1.1 }, "extend": { "effects": [ "RECYCLED" ] }, "delete": { "effects": [ "NEVER_MISFIRES" ] } } diff --git a/data/json/items/ammo/460.json b/data/json/items/ammo/460.json index 61d4ae0d5f67b..15b2ef0091249 100644 --- a/data/json/items/ammo/460.json +++ b/data/json/items/ammo/460.json @@ -17,6 +17,24 @@ "casing": "460_casing", "proportional": { "range": 0.95, "damage": 0.95, "pierce": 0.95, "recoil": 0.95 } }, + { + "id": "bp_460_fmj", + "copy-from": "460_fmj", + "type": "AMMO", + "name": ".460 Rowland FMJ blackpowder", + "proportional": { "price": 0.3, "damage": 0.76, "recoil": 0.76, "pierce": 0.5, "dispersion": 1.2 }, + "extend": { "effects": [ "RECYCLED", "BLACKPOWDER", "MUZZLE_SMOKE" ] }, + "delete": { "effects": [ "NEVER_MISFIRES" ] } + }, + { + "id": "bp_460_rowland", + "copy-from": "460_rowland", + "type": "AMMO", + "name": ".460 Rowland blackpowder", + "proportional": { "price": 0.3, "damage": 0.76, "recoil": 0.76, "pierce": 0.5, "dispersion": 1.2 }, + "extend": { "effects": [ "RECYCLED", "BLACKPOWDER", "MUZZLE_SMOKE" ] }, + "delete": { "effects": [ "NEVER_MISFIRES" ] } + }, { "id": "reloaded_460_fmj", "copy-from": "460_fmj", diff --git a/data/json/items/ammo/50.json b/data/json/items/ammo/50.json index a61dcec1e8897..f83f605b96713 100644 --- a/data/json/items/ammo/50.json +++ b/data/json/items/ammo/50.json @@ -14,9 +14,10 @@ "type": "AMMO", "name": ".50 BMG Ball", "description": "The .50 BMG is a very powerful rifle round designed for long-range use. Its stupendous accuracy and armor piercing capabilities make it one of the most deadly rounds available, offset only by its drastic recoil and noise.", - "weight": 114, + "weight": "114 g", "volume": "250 ml", - "price": 32500, + "price": 2200, + "price_postapoc": 32500, "material": [ "brass", "powder" ], "symbol": "=", "color": "dark_gray", diff --git a/data/json/items/ammo/500.json b/data/json/items/ammo/500.json index 851d0c9931a74..d7fe1e251f462 100644 --- a/data/json/items/ammo/500.json +++ b/data/json/items/ammo/500.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": ".500 S&W Magnum", "description": ".500 S&W Magnum ammunition with 500gr bullets. The .500 S&W Magnum round is a colossally powerful handgun cartridge capable of killing almost any target with one hit. It has extremely high damage and recoil to match.", - "weight": 15, + "weight": "15 g", "volume": "250 ml", - "price": 3500, + "price": 200, + "price_postapoc": 3500, "material": [ "steel", "powder" ], "symbol": "=", "color": "light_gray", @@ -21,6 +22,15 @@ "recoil": 3000, "effects": [ "COOKOFF" ] }, + { + "id": "bp_500_Magnum", + "copy-from": "500_Magnum", + "type": "AMMO", + "name": ".500 S&W Magnum blackpowder", + "proportional": { "price": 0.3, "damage": 0.76, "recoil": 0.76, "pierce": 0.5, "dispersion": 1.2 }, + "extend": { "effects": [ "RECYCLED", "BLACKPOWDER", "MUZZLE_SMOKE" ] }, + "delete": { "effects": [ "NEVER_MISFIRES" ] } + }, { "id": "reloaded_500_Magnum", "copy-from": "500_Magnum", diff --git a/data/json/items/ammo/545x39.json b/data/json/items/ammo/545x39.json index c574ea5be882a..9021c05aa0f74 100644 --- a/data/json/items/ammo/545x39.json +++ b/data/json/items/ammo/545x39.json @@ -5,9 +5,10 @@ "name": "5.45x39mm 7N10", "//": "Mainlined from Icecoon's Weapons Pack.", "description": "5.45x39mm 7N10 ammunition with 56gr FMJ bullets. The 5.45x39mm round was introduced along with the AK-74 in 1974. It has superior wounding potential to the older 7.62x39mm round and quickly replaced it in Soviet military use.", - "weight": 10, + "weight": "10 g", "volume": "250 ml", - "price": 2900, + "price": 100, + "price_postapoc": 2900, "material": [ "steel", "powder" ], "symbol": "=", "color": "yellow", @@ -28,7 +29,8 @@ "type": "AMMO", "name": "5.45x39mm 7N22", "description": "Armor piercing 5.45x39mm ammunition with 57gr bullets containing a steel penetrator. Developed in 1998 by the Russian military.", - "price": 6500, + "price": 350, + "price_postapoc": 6500, "symbol": "=", "color": "yellow", "relative": { "damage": -2, "pierce": 8 } diff --git a/data/json/items/ammo/57.json b/data/json/items/ammo/57.json index 1d800cc47fcb6..bcd571afac753 100644 --- a/data/json/items/ammo/57.json +++ b/data/json/items/ammo/57.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": "5.7x28mm SS190", "description": "5.7x28mm ammunition with 31gr AP FMJ bullets. The 5.7x28mm cartridge was designed by FN Herstal to replace the 9x19mm round in NATO use. Although the project to replace 9x19mm Parabellum was effectively canceled the 5.7x28mm round has seen action in many conflicts and has proven to be reliable. It has very low recoil and its armor penetration is a defining feature.", - "weight": 6, + "weight": "6 g", "volume": "250 ml", - "price": 5000, + "price": 350, + "price_postapoc": 5000, "material": [ "steel", "powder" ], "symbol": "=", "color": "dark_gray", @@ -21,12 +22,23 @@ "recoil": 90, "effects": [ "COOKOFF" ] }, + { + "id": "bp_57mm", + "copy-from": "57mm", + "type": "AMMO", + "name": "5.7x28mm blackpowder", + "description": "5.7x28mm ammunition with 31gr AP FMJ bullets. The 5.7x28mm cartridge was designed by FN Herstal to replace the 9x19mm round in NATO use. Although the project to replace 9x19mm Parabellum was effectively canceled the 5.7x28mm round has seen action in many conflicts and has proven to be reliable. It has very low recoil but no usual armor penetration due to using simple lead bullets rather than proper factory-made penetrator projectiles.", + "proportional": { "price": 0.3, "damage": 0.56, "recoil": 0.56, "pierce": 0.1, "dispersion": 1.2 }, + "extend": { "effects": [ "RECYCLED", "BLACKPOWDER", "MUZZLE_SMOKE" ] }, + "delete": { "effects": [ "NEVER_MISFIRES" ] } + }, { "id": "reloaded_57mm", "copy-from": "57mm", "type": "AMMO", "name": "reloaded 5.7x28mm", - "proportional": { "price": 0.7, "damage": 0.9, "dispersion": 1.1 }, + "description": "5.7x28mm ammunition with 31gr AP FMJ bullets. The 5.7x28mm cartridge was designed by FN Herstal to replace the 9x19mm round in NATO use. Although the project to replace 9x19mm Parabellum was effectively canceled the 5.7x28mm round has seen action in many conflicts and has proven to be reliable. It has very low recoil but no usual armor penetration due to using simple lead bullets rather than proper factory-made penetrator projectiles.", + "proportional": { "price": 0.7, "damage": 0.9, "pierce": 0.2, "dispersion": 1.1 }, "extend": { "effects": [ "RECYCLED" ] }, "delete": { "effects": [ "NEVER_MISFIRES" ] } } diff --git a/data/json/items/ammo/5x50.json b/data/json/items/ammo/5x50.json index a6a9b21877a70..dfef540103fa0 100644 --- a/data/json/items/ammo/5x50.json +++ b/data/json/items/ammo/5x50.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": "RA110 5x50mm flechette", "description": "Designed to defeat modern body armor, the Rivtech 5x50mm flechette round features a biodegradable sabot and a single, fin-stabilized penetrator.", - "weight": 8, + "weight": "8 g", "volume": "250 ml", "price": 1125, + "price_postapoc": 7625, "material": [ "plastic", "powder", "steel" ], "symbol": "=", "color": "green", @@ -27,8 +28,9 @@ "type": "AMMO", "name": "RA119 5x50mm penetrator", "description": "Designed to defeat modern body armor, the Rivtech 5x50mm RA119 penetrator round features a biodegradable sabot and a single, fin-stabilized tungsten alloy projectile.", - "weight": 9, + "weight": "9 g", "price": 1688, + "price_postapoc": 8188, "relative": { "range": -10, "damage": 5, "pierce": 20, "dispersion": 20 }, "proportional": { "recoil": 1.1 } }, diff --git a/data/json/items/ammo/66mm.json b/data/json/items/ammo/66mm.json new file mode 100644 index 0000000000000..ba9858d7e084c --- /dev/null +++ b/data/json/items/ammo/66mm.json @@ -0,0 +1,23 @@ +[ + { + "type": "AMMO", + "id": "m235tpa", + "price": 200000, + "//": "$500 per. Cheap!", + "name": "M74 rocket", + "symbol": "=", + "color": "dark_gray", + "description": "66mm incendiary rockets used in the M202 FLASH rocket launcher. Their warheads are filled with a thickened pyrophoric agent, which burns at 2200 degrees Fahrenheit.", + "material": [ "steel", "powder" ], + "volume": "2 L", + "weight": "1140 g", + "ammo_type": "m235", + "damage": 60, + "pierce": 10, + "range": 70, + "dispersion": 150, + "recoil": 150, + "count": 4, + "effects": [ "COOKOFF", "PYROPHORIC", "TRAIL", "NEVER_MISFIRES" ] + } +] diff --git a/data/json/items/ammo/700nx.json b/data/json/items/ammo/700nx.json index 33fc9aa4a75b6..17cf3ab16efc8 100644 --- a/data/json/items/ammo/700nx.json +++ b/data/json/items/ammo/700nx.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": ".700 NX", "description": "The .700 Nitro Express is a very powerful rifle round designed for long-range use. Its stupendous accuracy and armor piercing capabilities make it one of the most deadly rounds available, offset only by its drastic recoil and noise.", - "weight": 80, + "weight": "80 g", "volume": "250 ml", - "price": 75000, + "price": 5700, + "price_postapoc": 75000, "material": [ "brass", "powder" ], "symbol": "=", "color": "dark_gray", diff --git a/data/json/items/ammo/762.json b/data/json/items/ammo/762.json index 83d4edcc09f1c..a2fa7fce2c800 100644 --- a/data/json/items/ammo/762.json +++ b/data/json/items/ammo/762.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": "7.62x39mm 57-N-231", "description": "7.62x39mm 57-N-231 ammunition with 121.9gr steel core FMJ bullets. Developed in WW2 by the Soviet Union the 7.62x39mm round rapidly became extremely popular all over the world. The bullet has poor wounding potential due to its stability, only beginning to yaw after 26cm.", - "weight": 16, + "weight": "16 g", "volume": "250 ml", - "price": 5200, + "price": 120, + "price_postapoc": 5200, "material": [ "steel", "powder" ], "symbol": "=", "color": "dark_gray", @@ -28,7 +29,8 @@ "name": "7.62x39mm M67", "//": "Entirely provisional. Could someone design a better wound ballistics system?", "description": "7.62x39mm M67 rounds with 123gr bullets. The inadequate terminal ballistics of the M43 round led to the development of the M67 round in Yugoslavia in the 1960s. It destabilizes much faster than M43 after hitting a target leading to greater damage.", - "price": 6800, + "price": 150, + "price_postapoc": 6800, "relative": { "damage": 4, "pierce": 2 } }, { diff --git a/data/json/items/ammo/762R.json b/data/json/items/ammo/762R.json index 88b490c414bf9..0ca539830e5fb 100644 --- a/data/json/items/ammo/762R.json +++ b/data/json/items/ammo/762R.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": "7.62x54mmR", "description": "7.62x54mmR ammunition with 150gr FMJ bullets. The 7.62x54mmR round is one of the oldest still in common use, primarily due to the popularity of the Mosin-Nagant rifle. Although it has not been used by militaries for several decades it remains popular with civilians. It is a powerful cartridge capable of killing most targets with one shot.", - "weight": 18, + "weight": "18 g", "volume": "250 ml", - "price": 2200, + "price": 200, + "price_postapoc": 2200, "material": [ "brass", "powder" ], "symbol": "=", "color": "yellow", diff --git a/data/json/items/ammo/762x25.json b/data/json/items/ammo/762x25.json index b8ddf0a5203d8..d3ef357180280 100644 --- a/data/json/items/ammo/762x25.json +++ b/data/json/items/ammo/762x25.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": "7.62x25mm JHP", "description": "A commercial version of the 7.62x25mm cartridge created for the armed forces of Soviet Russia. It was derived from the 7.63x25mm cartridge used by the C96 pistol.", - "weight": 10, + "weight": "10 g", "volume": "250 ml", - "price": 3000, + "price": 100, + "price_postapoc": 3000, "material": [ "brass", "powder" ], "symbol": "=", "color": "light_gray", @@ -37,10 +38,19 @@ "name": "7.62x25mm Type P", "//": "Stopgap price of $1 per. Anti-China prejudice in the pre-Cataclysm US may have made this ammo tougher to come by.", "description": "A subsonic cartridge derived from the 7.62x25mm, designed for silenced firearms. It offers good armor penetration at the cost of slightly less damage.", - "weight": 12, + "weight": "12 g", "count": 50, "relative": { "price": 2000, "range": -1, "damage": -9, "pierce": 2, "recoil": -270 } }, + { + "id": "bp_762_25", + "copy-from": "762_25hot", + "type": "AMMO", + "name": "7.62x25mm FMJ blackpowder", + "proportional": { "price": 0.3, "damage": 0.76, "recoil": 0.76, "pierce": 0.5, "dispersion": 1.2 }, + "extend": { "effects": [ "RECYCLED", "BLACKPOWDER", "MUZZLE_SMOKE" ] }, + "delete": { "effects": [ "NEVER_MISFIRES" ] } + }, { "id": "reloaded_762_25", "copy-from": "762_25hot", diff --git a/data/json/items/ammo/84x246mm.json b/data/json/items/ammo/84x246mm.json index 234099f0537fc..1af52b873c615 100644 --- a/data/json/items/ammo/84x246mm.json +++ b/data/json/items/ammo/84x246mm.json @@ -3,6 +3,7 @@ "type": "AMMO", "id": "84x246mm_he", "price": 70000, + "price_postapoc": 70000, "//": "Milspec ammo such as grenades and rockets: not available to the general public, so Expensive.", "name": "84x246mm HE rocket", "symbol": "=", @@ -10,7 +11,7 @@ "description": "A 84x246mm High Explosive anti-personnel round for the Carl Gustav M3 recoilless rifle. Designed to be highly effective against personnel.", "material": [ "steel", "powder" ], "volume": "1250 ml", - "weight": 3200, + "weight": "3200 g", "ammo_type": "84x246mm", "damage": 60, "pierce": 10, @@ -26,10 +27,11 @@ "id": "84x246mm_hedp", "copy-from": "84x246mm_he", "price": 70000, + "price_postapoc": 70000, "name": "84x246mm HEDP rocket", "description": "A 84x246mm High Explosive Dual Purpose anti-materiel round for the Carl Gustav M3 recoilless rifle. Designed to be highly effective against vehicles and structures.", "volume": "1500 ml", - "weight": 3300, + "weight": "3300 g", "damage": 1000, "pierce": 225, "range": 100, @@ -42,10 +44,11 @@ "id": "84x246mm_smoke", "copy-from": "84x246mm_he", "price": 45000, + "price_postapoc": 45000, "name": "84x246mm smoke rocket", "description": "A 84x246mm smoke marker round for the Carl Gustav M3 recoilless rifle. Commonly used for signaling, target designation, and for screening troop movements.", "volume": "1500 ml", - "weight": 3100, + "weight": "3100 g", "range": 140, "dispersion": 30, "extend": { "effects": [ "SMOKE_BIG" ] }, diff --git a/data/json/items/ammo/8x40mm.json b/data/json/items/ammo/8x40mm.json index a02e53e97c2a9..0b0a0f90ee8c2 100644 --- a/data/json/items/ammo/8x40mm.json +++ b/data/json/items/ammo/8x40mm.json @@ -15,9 +15,10 @@ "name": "8x40mm caseless", "//": "Cased ammo tends to be roughly $1/shot, more or less. Rivtech ammo, being New and Proprietary and Expensive, $2-2.50 or so.", "description": "8x40mm caseless rounds. Proprietary ammunition for Rivtech firearms. Being caseless rounds, these cannot be disassembled or reloaded.", - "weight": 12, + "weight": "12 g", "volume": "250 ml", - "price": 12500, + "price": 225, + "price_postapoc": 12500, "material": [ "plastic", "powder" ], "symbol": "=", "color": "pink", @@ -54,7 +55,8 @@ "type": "AMMO", "name": "8x40mm HVP", "description": "8x40mm caseless rounds, saboted high-velocity penetrator type. Advanced military grade, armor-piercing ammunition that fires a single depleted uranium flechette. Being caseless rounds, these cannot be disassembled or reloaded.", - "price": 50000, + "price": 2500, + "price_postapoc": 50000, "count": 20, "relative": { "damage": 5, "pierce": 20 } }, diff --git a/data/json/items/ammo/9mm.json b/data/json/items/ammo/9mm.json index 52f46cd205483..f64f3ee40d897 100644 --- a/data/json/items/ammo/9mm.json +++ b/data/json/items/ammo/9mm.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": "9x19mm JHP", "description": "9x19mm ammunition with a 116gr jacketed hollow point bullet. JHP rounds have inferior penetration to FMJ rounds but their expansion slightly increases stopping power against unarmored targets and reduces overpenetration.", - "weight": 7, + "weight": "7 g", "volume": "250 ml", - "price": 2400, + "price": 150, + "price_postapoc": 2400, "material": [ "brass", "powder" ], "symbol": "=", "color": "yellow", @@ -34,7 +35,8 @@ "type": "AMMO", "name": "9x19mm +P", "description": "Overpressure 9x19mm ammunition. The round's increased velocity results in superior accuracy and stopping power at the cost of higher recoil.", - "price": 3800, + "price": 300, + "price_postapoc": 3800, "count": 25, "relative": { "damage": 2, "pierce": 2, "dispersion": -15 }, "proportional": { "recoil": 1.1 } @@ -45,7 +47,8 @@ "type": "AMMO", "name": "9x19mm +P+", "description": "A step beyond the high-pressure 9x19mm +P round, the +P+ has even higher internal pressure offering superior damage, accuracy, and penetration.", - "price": 5200, + "price": 350, + "price_postapoc": 5200, "count": 10, "relative": { "damage": 4, "pierce": 4, "dispersion": -30 }, "proportional": { "recoil": 1.2 } @@ -55,7 +58,7 @@ "copy-from": "9mm", "type": "AMMO", "name": "9x19mm JHP blackpowder", - "proportional": { "price": 0.3, "damage": 0.65, "recoil": 0.65, "pierce": 0.5, "dispersion": 1.2 }, + "proportional": { "price": 0.3, "damage": 0.76, "recoil": 0.76, "pierce": 0.5, "dispersion": 1.2 }, "extend": { "effects": [ "RECYCLED", "BLACKPOWDER", "MUZZLE_SMOKE" ] }, "delete": { "effects": [ "NEVER_MISFIRES" ] } }, @@ -64,7 +67,7 @@ "copy-from": "9mmfmj", "type": "AMMO", "name": "9x19mm FMJ blackpowder", - "proportional": { "price": 0.3, "damage": 0.65, "recoil": 0.65, "pierce": 0.5, "dispersion": 1.2 }, + "proportional": { "price": 0.3, "damage": 0.76, "recoil": 0.76, "pierce": 0.5, "dispersion": 1.2 }, "extend": { "effects": [ "RECYCLED", "BLACKPOWDER", "MUZZLE_SMOKE" ] }, "delete": { "effects": [ "NEVER_MISFIRES" ] } }, diff --git a/data/json/items/ammo/9x18.json b/data/json/items/ammo/9x18.json index 014749ba74dca..7caba402a20f3 100644 --- a/data/json/items/ammo/9x18.json +++ b/data/json/items/ammo/9x18.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": "9x18mm 57-N-181S", "description": "9x18mm Makarov ammunition with 93gr steel core FMJ bullets. The 9x18mm round was very common in the Eastern Bloc during the 20th century and remained in Russian military service into the 21st century.", - "weight": 8, + "weight": "8 g", "volume": "250 ml", - "price": 2600, + "price": 100, + "price_postapoc": 2600, "material": [ "steel", "powder" ], "symbol": "=", "color": "yellow", @@ -27,7 +28,8 @@ "type": "AMMO", "name": "9x18mm SP-7", "description": "9x18mm Makarov SP-7 ammunition. The 9x18mm round was very common in the Eastern Bloc during the 20th century and remained in Russian military service into the 21st century.", - "price": 2900, + "price": 150, + "price_postapoc": 2900, "count": 25, "relative": { "range": 2, "damage": 4, "dispersion": -10 }, "proportional": { "recoil": 1.1 } @@ -38,9 +40,28 @@ "type": "AMMO", "name": "9x18mm RG028", "description": "9x18mm Makarov RG028 ammunition. The RG028 round uses bullets with a hardened steel core to improve armor penetration.", - "price": 3100, + "price": 200, + "price_postapoc": 3100, "relative": { "damage": -2, "pierce": 8 } }, + { + "id": "bp_9x18mm", + "copy-from": "9x18mm", + "type": "AMMO", + "name": "9x18mm blackpowder", + "proportional": { "price": 0.3, "damage": 0.76, "recoil": 0.76, "pierce": 0.5, "dispersion": 1.2 }, + "extend": { "effects": [ "RECYCLED", "BLACKPOWDER", "MUZZLE_SMOKE" ] }, + "delete": { "effects": [ "NEVER_MISFIRES" ] } + }, + { + "id": "bp_9x18mmfmj", + "copy-from": "9x18mmfmj", + "type": "AMMO", + "name": "9x18mm FMJ blackpowder", + "proportional": { "price": 0.3, "damage": 0.76, "recoil": 0.76, "pierce": 0.5, "dispersion": 1.2 }, + "extend": { "effects": [ "RECYCLED", "BLACKPOWDER", "MUZZLE_SMOKE" ] }, + "delete": { "effects": [ "NEVER_MISFIRES" ] } + }, { "id": "reloaded_9x18mm", "copy-from": "9x18mm", diff --git a/data/json/items/ammo/atgm.json b/data/json/items/ammo/atgm.json index 63472fc063a64..5984e6d07e6e5 100644 --- a/data/json/items/ammo/atgm.json +++ b/data/json/items/ammo/atgm.json @@ -9,7 +9,7 @@ "description": "A tube-launched, optically tracked, wire-guided missile contained in a steel tube. Designed to be highly effective against vehicles and structures.", "material": [ "steel", "powder" ], "volume": "15 L", - "weight": 22600, + "weight": "22600 g", "bashing": 1, "ammo_type": "atgm", "casing": "atgm_spent", diff --git a/data/json/items/ammo/barb.json b/data/json/items/ammo/barb.json index 31ef616685e99..64f7bc372af4d 100644 --- a/data/json/items/ammo/barb.json +++ b/data/json/items/ammo/barb.json @@ -1,24 +1,24 @@ -{ - "type": "AMMO", - "id": "barb_paralysis", - "price": 400, - "name": "paralyzing barb", - "symbol": "=", - "color": "green", - "description": "Tiny droplets of venom trickle out of the sponge-like tissue of this sharp barb.", - "material": "bone", - "volume": "250ml", - "weight": 37, - "bashing": 6, - "cutting": 2, - "ammo_type": "barb", - "damage": 5, - "pierce": 5, - "dispersion": 120, - "loudness": 0, - "count": 10, - "show_stats": true, - "effects": [ - "PARALYZEPOISON" - ] -} +[ + { + "type": "AMMO", + "id": "barb_paralysis", + "price": 400, + "name": "paralyzing barb", + "symbol": "=", + "color": "green", + "description": "Tiny droplets of venom trickle out of the sponge-like tissue of this sharp barb.", + "material": "bone", + "volume": "250ml", + "weight": "37 g", + "bashing": 6, + "cutting": 2, + "ammo_type": "barb", + "damage": 5, + "pierce": 5, + "dispersion": 120, + "loudness": 0, + "count": 10, + "show_stats": true, + "effects": [ "PARALYZEPOISON" ] + } +] diff --git a/data/json/items/ammo/chemical_spray.json b/data/json/items/ammo/chemical_spray.json index 8bbcbbaeed0c1..1c91b439dfb8a 100644 --- a/data/json/items/ammo/chemical_spray.json +++ b/data/json/items/ammo/chemical_spray.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": "sprayable toxic gas", "description": "A hazardous mixture made from household cleaners, improvised for use in a chemical thrower. Best be used with some kind of mask or mouth protection.", - "weight": 3, + "weight": "3 g", "volume": "250 ml", "price": 3500, + "price_postapoc": 3500, "material": "water", "symbol": "=", "color": "green", @@ -22,9 +23,10 @@ "type": "AMMO", "name": "sprayable fungicide", "description": "Fungicide enhanced with sulfur to create sprayable anti-fungal ammo for the chemical thrower. Best be used with some kind of mask or mouth protection.", - "weight": 3, + "weight": "3 g", "volume": "250 ml", - "price": 3500, + "price": 600, + "price_postapoc": 3500, "material": "water", "symbol": "=", "color": "yellow", @@ -40,9 +42,10 @@ "type": "AMMO", "name": "sprayable insecticide", "description": "Strong sprayable insecticide ammo for the chemical thrower. Best be used with some kind of mask or mouth protection.", - "weight": 3, + "weight": "3 g", "volume": "250 ml", - "price": 3500, + "price": 500, + "price_postapoc": 3500, "material": "water", "symbol": "=", "color": "yellow", diff --git a/data/json/items/ammo/flintlock.json b/data/json/items/ammo/flintlock.json index c6727ac25b218..a39ee42632498 100644 --- a/data/json/items/ammo/flintlock.json +++ b/data/json/items/ammo/flintlock.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": "paper cartridge", "description": "A paper cartridge containing black powder and a metallic projectile. Historically used to reload muzzleloaders in a more reasonable time.", - "weight": 40, + "weight": "40 g", "volume": "250 ml", "price": 1100, + "price_postapoc": 1100, "material": [ "lead", "powder" ], "symbol": "=", "color": "white", @@ -25,9 +26,10 @@ "type": "AMMO", "name": "paper shot cartridge", "description": "A paper cartridge containing black powder and metallic shot. Historically used to reload muzzleloaders in a more reasonable time.", - "weight": 40, + "weight": "40 g", "volume": "250 ml", "price": 1100, + "price_postapoc": 1100, "material": [ "lead", "powder" ], "symbol": "=", "color": "white", diff --git a/data/json/items/ammo/metal_rail.json b/data/json/items/ammo/metal_rail.json index 6c04defe8ae57..4e1d99cf27335 100644 --- a/data/json/items/ammo/metal_rail.json +++ b/data/json/items/ammo/metal_rail.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": "rebar rail", "description": "A short piece of ferromagnetic rebar which has been straightened and sharpened on one end. Could be used as a projectile by a sufficiently powerful electromagnetic weapon.", - "weight": 160, + "weight": "160 g", "volume": "25ml", "price": 1000, + "price_postapoc": 1000, "to_hit": -1, "bashing": 5, "cutting": 1, @@ -29,6 +30,7 @@ "description": "A short piece of steel which has been forged true and sharpened on one end. Could be used as a projectile by a sufficiently powerful electromagnetic weapon.", "volume": "20ml", "price": 1500, + "price_postapoc": 1500, "bashing": 4, "cutting": 2, "material": [ "steel" ], diff --git a/data/json/items/ammo/nail.json b/data/json/items/ammo/nail.json index 51716576124bb..a2054549af5bf 100644 --- a/data/json/items/ammo/nail.json +++ b/data/json/items/ammo/nail.json @@ -16,9 +16,10 @@ "category": "spare_parts", "name": "nail", "description": "A pin-shaped piece of iron, can be used to construct various things with a hammer.", - "weight": 4, + "weight": "4 g", "volume": "250 ml", - "price": 6000, + "price": 1000, + "price_postapoc": 6000, "material": "iron", "symbol": "=", "color": "cyan", diff --git a/data/json/items/ammo/paintball.json b/data/json/items/ammo/paintball.json index 5a9b18f533664..0b28014399196 100644 --- a/data/json/items/ammo/paintball.json +++ b/data/json/items/ammo/paintball.json @@ -2,14 +2,15 @@ { "type": "AMMO", "id": "paintball", - "price": 500, + "price": 1000, + "price_postapoc": 500, "name": "paintball", "symbol": "=", "color": "red", "description": "A tube of small paintballs. They deal virtually no damage.", "material": "plastic", "volume": "250 ml", - "weight": 1, + "weight": "1 g", "ammo_type": "paintball", "damage": 2, "dispersion": 100, diff --git a/data/json/items/ammo/shot.json b/data/json/items/ammo/shot.json index f22d2f84a571c..59ed21ea86d93 100644 --- a/data/json/items/ammo/shot.json +++ b/data/json/items/ammo/shot.json @@ -93,9 +93,10 @@ "type": "AMMO", "name": "00 shot", "description": "A shell filled with metal pellets. Extremely damaging, plus the spread makes it very accurate at short range. Favored by SWAT forces.", - "weight": 32, + "weight": "32 g", "volume": "250 ml", - "price": 3500, + "price": 500, + "price_postapoc": 3500, "material": [ "plastic", "powder" ], "symbol": "=", "color": "red", @@ -115,7 +116,8 @@ "type": "AMMO", "name": "shotgun beanbag", "description": "A beanbag round for shotguns, not deadly but designed to disable.", - "price": 3500, + "price": 500, + "price_postapoc": 3500, "count": 10, "proportional": { "damage": 0.1, "recoil": 0.4, "loudness": 0.6 }, "extend": { "effects": [ "BEANBAG", "NOGIB" ] } @@ -126,7 +128,8 @@ "type": "AMMO", "name": "birdshot", "description": "Weak shotgun ammunition. Designed for hunting birds and other small game, its applications in combat are very limited.", - "price": 2400, + "price": 100, + "price_postapoc": 2400, "proportional": { "damage": 0.3, "recoil": 0.6, "loudness": 0.8 }, "extend": { "effects": [ "NOGIB" ] } }, @@ -136,7 +139,8 @@ "type": "AMMO", "name": "dragon's breath shell", "description": "A shotgun shell filled with magnesium pellets or shards, used mostly as a distress flare or pyrotechnics tool. When the round is fired, high temperature sparks and flames shoot out of the barrel, igniting everything in their path.", - "price": 14000, + "price": 1000, + "price_postapoc": 14000, "proportional": { "damage": 0.2, "recoil": 0.6, "loudness": 0.8, "dispersion": 1.2, "range": 0.5 }, "extend": { "effects": [ "INCENDIARY", "STREAM", "NOGIB" ] } }, @@ -146,7 +150,8 @@ "type": "AMMO", "name": "flechette shell", "description": "A shotgun shell filled with tiny steel darts. Extremely damaging, plus the spread makes it very accurate at short range. Slices through most forms of armor with ease.", - "price": 10000, + "price": 2000, + "price_postapoc": 10000, "count": 10, "relative": { "damage": -6, "pierce": 12 } }, @@ -157,7 +162,8 @@ "name": "explosive slug", "//": "$30/shot thanks to tight regulation, one way or another.", "description": "A shotgun shell shooting a small explosive. Damaging, but rather inaccurate and short ranged. Banned in several states.", - "price": 15000, + "price": 3000, + "price_postapoc": 15000, "count": 5, "damage": 10, "pierce": 0, @@ -173,13 +179,23 @@ "extend": { "effects": [ "RECYCLED" ] }, "delete": { "effects": [ "NEVER_MISFIRES" ] } }, + { + "id": "bp_shot_scrap", + "copy-from": "shot_scrap", + "type": "AMMO", + "name": "makeshift shotgun shot (black powder)", + "proportional": { "price": 0.6, "damage": 0.8 }, + "extend": { "effects": [ "RECYCLED", "MUZZLE_SMOKE" ] }, + "delete": { "effects": [ "NEVER_MISFIRES" ] } + }, { "id": "shot_slug", "copy-from": "shot_00", "type": "AMMO", "name": "shotgun slug", "description": "A heavy metal slug used with shotguns to give them the range capabilities of a rifle. Extremely damaging but rather inaccurate.", - "price": 4500, + "price": 400, + "price_postapoc": 4500, "dispersion": 100, "relative": { "range": 12, "pierce": 6 }, "proportional": { "recoil": 1.4 }, diff --git a/data/json/items/ammo/shotcanister.json b/data/json/items/ammo/shotcanister.json index cbcf51fc581b6..956fd4acadcb6 100644 --- a/data/json/items/ammo/shotcanister.json +++ b/data/json/items/ammo/shotcanister.json @@ -3,13 +3,14 @@ "type": "AMMO", "id": "shotcanister_scrap", "price": 1000, + "price_postapoc": 1000, "name": "scrap shotcanister", "symbol": "=", "color": "green", "description": "This small paper canister resembling a crude shotshell is filled to the brim with assorted pieces of scrap metal.", "material": [ "steel" ], "volume": "250 ml", - "weight": 55, + "weight": "55 g", "bashing": 2, "cutting": 1, "ammo_type": "shotcanister", @@ -24,13 +25,14 @@ "type": "AMMO", "id": "shotcanister_pebble", "price": 1000, + "price_postapoc": 1000, "name": "pebble shotcanister", "symbol": "=", "color": "green", "description": "This small paper canister resembling a crude shotshell is filled to the brim with tiny pebbles. Damage is pathetic but flight is much more stable than scrap", "material": [ "steel" ], "volume": "250 ml", - "weight": 55, + "weight": "55 g", "bashing": 2, "cutting": 1, "ammo_type": "shotcanister", @@ -46,13 +48,14 @@ "type": "AMMO", "id": "shotcanister_flechette", "price": 1000, + "price_postapoc": 1000, "name": "flechette shotcanister", "symbol": "=", "color": "green", "description": "This small paper canister resembling a crude shotshell is filled to the brim with handmade flechettes, giving it some armor piercing capabilities.", "material": [ "steel" ], "volume": "250 ml", - "weight": 55, + "weight": "55 g", "bashing": 2, "cutting": 1, "ammo_type": "shotcanister", @@ -68,13 +71,14 @@ "type": "AMMO", "id": "shotcanister_bearing", "price": 1000, + "price_postapoc": 1000, "name": "bearing shotcanister", "symbol": "=", "color": "green", "description": "This small paper canister resembling a crude shotshell is filled to the brim with handmade bearings, stabilizing it's flight pattern a tiny bit.", "material": [ "steel" ], "volume": "250 ml", - "weight": 55, + "weight": "55 g", "bashing": 2, "cutting": 1, "ammo_type": "shotcanister", diff --git a/data/json/items/ammo/shotpaper.json b/data/json/items/ammo/shotpaper.json new file mode 100644 index 0000000000000..cbb196696c64e --- /dev/null +++ b/data/json/items/ammo/shotpaper.json @@ -0,0 +1,45 @@ +[ + { + "id": "shot_paper_bird", + "copy-from": "shot_paper_00", + "type": "AMMO", + "name": "birdshot paper cartridge", + "description": "A paper cartridge containing a premeasured amount of black powder and an equal volume of birdshot. Used mostly for hunting small game or fowl.", + "damage": 10, + "proportional": { "recoil": 0.6, "loudness": 0.8 }, + "extend": { "effects": [ "NOGIB" ] } + }, + { + "id": "shot_paper_dragon", + "copy-from": "shot_paper_00", + "type": "AMMO", + "name": "pyrotechnic paper cartridge", + "description": "A paper cartridge containing a premeasured amount of black powder and an equal volume of flammable metals. When fired, burning chunks of metal and sparks will shoot out of the barrel, igniting everything in their path.", + "proportional": { "damage": 0.2, "recoil": 0.6, "loudness": 0.8, "dispersion": 1.2, "range": 0.5 }, + "extend": { "effects": [ "INCENDIARY", "STREAM", "NOGIB" ] } + }, + { + "id": "shot_paper_00", + "copy-from": "bp_shot_00", + "type": "AMMO", + "name": "buckshot paper cartridge", + "description": "A paper cartridge containing a premeasured amount of black powder and an equal volume of 00 buckshot.", + "weight": 26, + "volume": "250 ml", + "material": [ "paper", "powder", "lead" ], + "color": "white", + "ammo_type": "shotpaper", + "proportional": { "damage": 0.8, "recoil": 0.8, "loudness": 0.8 }, + "delete": { "effects": [ "RECYCLED" ], "casing": "shot_hull" } + }, + { + "id": "shot_paper_slug", + "copy-from": "shot_paper_00", + "type": "AMMO", + "name": ".62 paper cartridge", + "description": "A paper cartridge containing a premeasured amount of black powder and a .605 inch lead ball.", + "relative": { "range": 12, "pierce": 4 }, + "delete": { "effects": [ "SHOT" ] }, + "dispersion": 100 + } +] diff --git a/data/json/items/ammo/signal_flare.json b/data/json/items/ammo/signal_flare.json index 2c64cf381bf90..0ac2ae6d1abfb 100644 --- a/data/json/items/ammo/signal_flare.json +++ b/data/json/items/ammo/signal_flare.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": "signal flare", "description": "A heavy plastic cartridge made for use in flare guns. It appears to be a modified 12 gauge shotgun shell.", - "weight": 32, + "weight": "32 g", "volume": "250 ml", - "price": 2500, + "price": 500, + "price_postapoc": 2500, "material": [ "plastic", "powder" ], "symbol": "=", "color": "red", diff --git a/data/json/items/ammo/weldgas.json b/data/json/items/ammo/weldgas.json index e829583bc37bc..e855c765f014c 100644 --- a/data/json/items/ammo/weldgas.json +++ b/data/json/items/ammo/weldgas.json @@ -4,9 +4,10 @@ "type": "AMMO", "name": "oxyacetylene", "description": "A highly explosive fuel mixture composed of equal parts of oxygen and acetylene gas.", - "weight": 40, + "weight": "40 g", "volume": "250 ml", "price": 2400, + "price_postapoc": 2400, "material": [ "hydrocarbons" ], "symbol": "=", "color": "red", diff --git a/data/json/items/ammo_types.json b/data/json/items/ammo_types.json index 6095eb91f3d12..90fb087e5be76 100644 --- a/data/json/items/ammo_types.json +++ b/data/json/items/ammo_types.json @@ -71,6 +71,12 @@ "name": "shot", "default": "shot_00" }, + { + "type": "ammunition_type", + "id": "shotpaper", + "name": "20ga percussion", + "default": "shot_paper_00" + }, { "type": "ammunition_type", "id": "410shot", @@ -485,6 +491,12 @@ "name": "paper cartridge", "default": "flintlock_ammo" }, + { + "type": "ammunition_type", + "id": "papershot", + "name": "20ga percussion", + "default": "nail" + }, { "type": "ammunition_type", "id": "36paper", diff --git a/data/json/items/archery.json b/data/json/items/archery.json index 7bab850793b41..ca4880deb4cc0 100644 --- a/data/json/items/archery.json +++ b/data/json/items/archery.json @@ -9,7 +9,7 @@ "description": "A crude pointed wooden shaft with a notch at the back. Stands a very low chance of remaining intact once fired.", "material": "wood", "volume": "250 ml", - "weight": 30, + "weight": "30 g", "bashing": 3, "ammo_type": "arrow", "prop_damage": 0.7, @@ -28,7 +28,7 @@ "description": "A fletched wooden arrow shaft with a pointed tip. Useful for piercing armor. Stands a decent chance of remaining intact once fired.", "material": [ "wood", "steel" ], "volume": "250 ml", - "weight": 55, + "weight": "55 g", "bashing": 3, "ammo_type": "arrow", "prop_damage": 1.12, @@ -48,7 +48,7 @@ "description": "A simple fletched wooden arrow shaft with a blunted tip. Useful for hunting small woodland creatures without splattering them all over the ground. Stands a low chance of remaining intact once fired.", "material": "wood", "volume": "250 ml", - "weight": 35, + "weight": "35 g", "bashing": 4, "ammo_type": "arrow", "prop_damage": 0.5, @@ -67,7 +67,7 @@ "description": "A fletched wooden arrow shaft with a bladed tip. Useful for maximising damage to the target. Stands a decent chance of remaining intact once fired.", "material": [ "wood", "steel" ], "volume": "250 ml", - "weight": 55, + "weight": "55 g", "bashing": 2, "cutting": 1, "ammo_type": "arrow", @@ -88,7 +88,7 @@ "description": "A simple fletched wooden arrow shaft with a fire-hardened and sharpened tip. Stands a low chance of remaining intact once fired.", "material": "wood", "volume": "250 ml", - "weight": 35, + "weight": "35 g", "bashing": 4, "ammo_type": "arrow", "prop_damage": 0.7, @@ -107,7 +107,7 @@ "description": "A fletched wooden arrow shaft with a blunt tip. Useful for hunting small woodland creatures without splattering them all over the ground. Stands a decent chance of remaining intact once fired.", "material": [ "wood", "steel" ], "volume": "250 ml", - "weight": 60, + "weight": "60 g", "bashing": 4, "ammo_type": "arrow", "prop_damage": 0.5, @@ -126,7 +126,7 @@ "description": "A simple fletched wooden arrow shaft with a makeshift arrowhead. Stands a low chance of remaining intact once fired.", "material": "wood", "volume": "250 ml", - "weight": 37, + "weight": "37 g", "bashing": 6, "cutting": 2, "ammo_type": "arrow", @@ -146,7 +146,7 @@ "description": "A simple fletched steel arrow shaft with a flattened and sharpened tip. Stands a somewhat low chance of remaining intact once fired.", "material": "steel", "volume": "250 ml", - "weight": 65, + "weight": "65 g", "bashing": 2, "ammo_type": "arrow", "pierce": 1, @@ -166,7 +166,7 @@ "description": "A fletched aluminum arrow shaft with a bladed tip. Useful for maximising damage to the target. Stands a good chance of remaining intact once fired.", "material": [ "aluminum", "steel" ], "volume": "250 ml", - "weight": 50, + "weight": "50 g", "bashing": 3, "cutting": 2, "ammo_type": "arrow", @@ -188,7 +188,7 @@ "description": "A fletched aluminum arrow shaft with a pointed tip. Useful for piercing armor. Stands a good chance of remaining intact once fired.", "material": [ "aluminum", "steel" ], "volume": "250 ml", - "weight": 50, + "weight": "50 g", "bashing": 3, "cutting": 2, "ammo_type": "arrow", @@ -210,7 +210,7 @@ "description": "A fletched aluminum arrow shaft with a blunt tip. Useful for hunting small woodland creatures without splattering them all over the ground. Stands a good chance of remaining intact once fired.", "material": [ "aluminum", "steel" ], "volume": "250 ml", - "weight": 50, + "weight": "50 g", "bashing": 3, "cutting": 2, "ammo_type": "arrow", @@ -231,7 +231,7 @@ "description": "A fletched carbon fiber arrow shaft with an expanding broadhead tip. Deals impressive damage to targets. Stands a good chance of remaining intact once fired.", "material": [ "kevlar", "steel" ], "volume": "250 ml", - "weight": 40, + "weight": "40 g", "bashing": 1, "ammo_type": "arrow", "prop_damage": 1.35, @@ -252,7 +252,7 @@ "description": "This arrow has a small IED strapped to its tip. Horribly inaccurate, heavy, and bulky, not only does this contraption require expert hands to pull off a shot, it requires one to loose this with a small measure of confidence that the shooter won't be caught in the blast radius.", "material": [ "steel", "powder" ], "volume": "500 ml", - "weight": 633, + "weight": "633 g", "bashing": 2, "ammo_type": "arrow", "damage": 15, @@ -272,7 +272,7 @@ "description": "This simple IED is designed to be attached to an arrow and detonate on impact.", "price": 2000, "material": "steel", - "weight": 562, + "weight": "562 g", "volume": "250 ml", "bashing": 10, "to_hit": -1, @@ -289,7 +289,7 @@ "description": "This arrow has a flaming rag wrapped around the shaft near the head. You should shoot it soon before it burns your bow.", "material": "steel", "volume": "500 ml", - "weight": 150, + "weight": "150 g", "bashing": 2, "ammo_type": "arrow", "damage": 15, @@ -314,7 +314,7 @@ "loudness": 8, "skill": "archery", "ammo": "arrow", - "weight": 1360, + "weight": "1360 g", "volume": "2500 ml", "bashing": 6, "armor_data": { "covers": [ "TORSO" ], "coverage": 5, "material_thickness": 1, "encumbrance": 20 }, @@ -338,7 +338,7 @@ "skill": "archery", "min_strength": 4, "ammo": "arrow", - "weight": 340, + "weight": "340 g", "volume": "1500 ml", "bashing": 6, "armor_data": { "covers": [ "TORSO" ], "coverage": 5, "material_thickness": 1, "encumbrance": 14 }, @@ -365,7 +365,7 @@ "skill": "archery", "min_strength": 6, "ammo": "arrow", - "weight": 907, + "weight": "907 g", "volume": "1500 ml", "bashing": 8, "to_hit": 1, @@ -441,7 +441,7 @@ "skill": "archery", "min_strength": 5, "ammo": "arrow", - "weight": 400, + "weight": "400 g", "volume": "1750 ml", "bashing": 8, "armor_data": { "covers": [ "TORSO" ], "coverage": 5, "material_thickness": 1, "encumbrance": 14 }, @@ -468,7 +468,7 @@ "skill": "archery", "min_strength": 5, "ammo": "arrow", - "weight": 540, + "weight": "540 g", "volume": "2500 ml", "bashing": 12, "armor_data": { "covers": [ "TORSO" ], "coverage": 5, "material_thickness": 1, "encumbrance": 20 }, @@ -495,7 +495,7 @@ "skill": "archery", "ammo": "arrow", "min_strength": 5, - "weight": 400, + "weight": "400 g", "volume": "1500 ml", "bashing": 12, "armor_data": { "covers": [ "TORSO" ], "coverage": 5, "material_thickness": 1, "encumbrance": 14 }, @@ -522,7 +522,7 @@ "skill": "archery", "min_strength": 5, "ammo": "arrow", - "weight": 600, + "weight": "600 g", "volume": "3500 ml", "bashing": 12, "armor_data": { "covers": [ "TORSO" ], "coverage": 5, "material_thickness": 1, "encumbrance": 20 }, @@ -549,7 +549,7 @@ "skill": "archery", "min_strength": 5, "ammo": "arrow", - "weight": 680, + "weight": "680 g", "volume": "3500 ml", "bashing": 10, "armor_data": { "covers": [ "TORSO" ], "coverage": 5, "material_thickness": 1, "encumbrance": 20 }, @@ -572,7 +572,7 @@ "description": "An extremely large and stiff longbow, made with enormous limbs and a thick string to take an immense amount of energy. Takes incredible strength to draw.", "price": 150000, "min_strength": 18, - "weight": 3200, + "weight": "3200 g", "volume": "6250 ml", "armor_data": { "covers": [ "TORSO" ], "coverage": 7, "material_thickness": 2, "encumbrance": 25 }, "dispersion": 200, @@ -595,7 +595,7 @@ "skill": "archery", "min_strength": 18, "ammo": "arrow", - "weight": 2000, + "weight": "2000 g", "volume": "4 L", "bashing": 14, "reload_noise_volume": 4, @@ -621,7 +621,7 @@ "skill": "archery", "min_strength": 6, "ammo": "arrow", - "weight": 450, + "weight": "450 g", "volume": "2 L", "bashing": 12, "armor_data": { "covers": [ "TORSO" ], "coverage": 5, "material_thickness": 1, "encumbrance": 14 }, @@ -647,7 +647,7 @@ "description": "A thin and flat knife made for throwing. Its ineffective cutting edge and odd shape makes it unsuitable for use as a tool.", "material": "steel", "volume": "250 ml", - "weight": 268, + "weight": "268 g", "bashing": 1, "cutting": 10, "thrown_damage": [ { "damage_type": "cut", "amount": 14 } ], @@ -665,7 +665,7 @@ "description": "A lightweight hatchet made for throwing. Its ineffective cutting edge and light weight makes it unsuitable for use as a tool.", "material": [ "steel", "wood" ], "volume": "750 ml", - "weight": 792, + "weight": "792 g", "bashing": 6, "cutting": 16, "thrown_damage": [ { "damage_type": "bash", "amount": 6 }, { "damage_type": "cut", "amount": 16 } ], @@ -683,7 +683,7 @@ "description": "A large plastic dart made for outdoor games.", "material": [ "plastic", "iron" ], "volume": "500 ml", - "weight": 175, + "weight": "175 g", "to_hit": -1, "cutting": 8, "thrown_damage": [ { "damage_type": "stab", "amount": 16 } ], @@ -701,7 +701,7 @@ "description": "A plastic frisbee made for outdoor games.", "material": [ "plastic" ], "volume": "500 ml", - "weight": 175, + "weight": "175 g", "bashing": 1, "thrown_damage": [ { "damage_type": "bash", "amount": 1 } ], "ammo_type": "thrown", @@ -718,7 +718,7 @@ "description": "A plastic disc made for playing disc golf, it is smaller and denser then a normal frisbee.", "material": [ "plastic" ], "volume": "250 ml", - "weight": 170, + "weight": "170 g", "bashing": 2, "thrown_damage": [ { "damage_type": "bash", "amount": 1 } ], "ammo_type": "thrown", @@ -734,7 +734,7 @@ "description": "An underwater fishing spear made from wood tipped with steel. It's very light, but doesn't have much range. Stands a below average chance of remaining intact once fired.", "material": "wood", "volume": "250 ml", - "weight": 18, + "weight": "18 g", "bashing": 1, "ammo_type": "fishspear", "damage": 12, @@ -755,7 +755,7 @@ "description": "An underwater fishing spear made from metal. It's light, but doesn't have much range. Stands a very good chance of remaining intact once fired.", "material": "iron", "volume": "250 ml", - "weight": 28, + "weight": "28 g", "bashing": 1, "ammo_type": "fishspear", "damage": 14, @@ -776,7 +776,7 @@ "description": "An underwater fishing spear made from carbon fiber. It's very light, but doesn't have much range. Stands a bad chance of remaining intact once fired.", "material": "kevlar", "volume": "250 ml", - "weight": 12, + "weight": "12 g", "bashing": 1, "ammo_type": "fishspear", "damage": 14, @@ -797,7 +797,7 @@ "price": 500, "material": [ "wood", "plastic" ], "volume": "250 ml", - "weight": 60, + "weight": "60 g", "bashing": 2, "cutting": 1, "ammo_type": "arrow", diff --git a/data/json/items/armor.json b/data/json/items/armor.json index 1fb1ec5c9eb66..6b78c1d82e923 100644 --- a/data/json/items/armor.json +++ b/data/json/items/armor.json @@ -4,7 +4,7 @@ "type": "ARMOR", "name": "ten-gallon hat", "description": "These may not be the Great Plains, but you can still be the Boss with this high-crowned, wide-brimmed hat.", - "weight": 410, + "weight": "410 g", "volume": "2500 ml", "price": 17900, "material": [ "wool" ], @@ -25,7 +25,7 @@ "name": "pair of 2-by-arm guards", "name_plural": "pairs of 2-by-arm guards", "description": "A pair of improvised arm guards made from broken pieces of a two by four that are tied to your arms with rags and string. They offer good protection, but are really uncomfortable to wear.", - "weight": 300, + "weight": "300 g", "volume": "1500 ml", "price": 500, "to_hit": -1, @@ -48,7 +48,7 @@ "name": "pair of 2-by-shin guards", "name_plural": "pairs of 2-by-shin guards", "description": "A pair of improvised shin guards made from broken pieces of a two by four that are tied to your shins with rags and string. They offer good protection, but are really hard to run with.", - "weight": 300, + "weight": "300 g", "volume": "1500 ml", "price": 500, "to_hit": -1, @@ -69,7 +69,7 @@ "category": "armor", "name": "AEP suit", "description": "An armored environmental protection suit. Custom-built from a cleansuit and body armor, it provides excellent protection against both physical harm and ambient radiation.", - "weight": 7200, + "weight": "7200 g", "volume": "9 L", "price": 140000, "material": [ "kevlar", "plastic" ], @@ -89,7 +89,7 @@ "type": "ARMOR", "name": "American flag", "description": "A large American flag made to fly in even the worst conditions.", - "weight": 3404, + "weight": "3404 g", "volume": "2 L", "price": 5000, "to_hit": -1, @@ -109,7 +109,7 @@ "type": "ARMOR", "name": "leather apron", "description": "An apron made of thick leather. Cumbersome, but offers excellent protection from cuts.", - "weight": 1950, + "weight": "1950 g", "volume": "2250 ml", "price": 1500, "to_hit": 1, @@ -130,7 +130,7 @@ "type": "ARMOR", "name": "arm splint", "description": "A tool to help set bones and hold them in place.", - "weight": 300, + "weight": "300 g", "volume": "1 L", "price": 20000, "material": [ "wood", "cotton" ], @@ -149,7 +149,7 @@ "name": "arm splint XL", "description": "A tool to help set bones and hold them in place. It is specifically designed to fit Huge survivors.", "copy-from": "arm_splint", - "weight": 600, + "weight": "600 g", "volume": "2 L", "price": 25000, "encumbrance": 140, @@ -161,7 +161,7 @@ "name": "pair of arm warmers", "name_plural": "pairs of arm warmers", "description": "Snug, soft cloth sleeves to keep your arms warm.", - "weight": 32, + "weight": "32 g", "volume": "250 ml", "price": 1000, "material": [ "cotton" ], @@ -181,7 +181,7 @@ "name": "pair of bone arm guards", "name_plural": "pairs of bone arm guards", "description": "A pair of arm guards made from leather, reinforced with bone. Light and strong.", - "weight": 645, + "weight": "645 g", "volume": "3 L", "price": 20000, "to_hit": 1, @@ -203,7 +203,7 @@ "name": "pair of chitin arm guards", "name_plural": "pairs of chitin arm guards", "description": "A pair of arm guards made from the exoskeletons of insects. Light and durable.", - "weight": 392, + "weight": "392 g", "volume": "2500 ml", "price": 20000, "to_hit": 1, @@ -236,7 +236,7 @@ "name": "pair of hard arm guards", "name_plural": "pairs of hard arm guards", "description": "A pair of neoprene arm sleeves covered with molded plastic sheaths.", - "weight": 350, + "weight": "350 g", "volume": "3 L", "price": 3500, "to_hit": 1, @@ -258,7 +258,7 @@ "name": "pair of leather arm guards", "name_plural": "pairs of leather arm guards", "description": "A pair of tough leather arm guards. Light and comfortable.", - "weight": 430, + "weight": "430 g", "volume": "2 L", "price": 4000, "to_hit": 1, @@ -279,7 +279,7 @@ "name": "pair of steel arm guards", "name_plural": "pairs of steel arm guards", "description": "A full assembly of medieval arm protection. Rerebraces, couters, and vambraces, with leather straps to secure each piece and connect it as part of a set.", - "weight": 2720, + "weight": "2720 g", "volume": "5500 ml", "price": 20000, "to_hit": -1, @@ -301,7 +301,7 @@ "name_plural": "pairs of metal arm guards", "//": "They're not actually FANCY, so calling them 'very stylish' seemed inaccurate.", "description": "A pair of arm guards hammered out from metal. Perfect for the Post-Apocalyptic Warrior look.", - "weight": 1080, + "weight": "1080 g", "volume": "2750 ml", "price": 30000, "to_hit": 1, @@ -322,7 +322,7 @@ "name": "pair of paper arm guards", "name_plural": "pairs of paper arm guards", "description": "Arm guards made of stacked paper sheets held together with duct tape.", - "weight": 360, + "weight": "360 g", "volume": "500 ml", "price": 230, "to_hit": 1, @@ -343,7 +343,7 @@ "name": "pair of scrap arm guards", "name_plural": "pairs of scrap arm guards", "description": "A pair of arm guards made from scraps of metal secured by simple strings; the loose collection of plates provides decent but not the most convenient protection.", - "weight": 3064, + "weight": "3064 g", "volume": "4750 ml", "price": 20000, "to_hit": 1, @@ -366,7 +366,7 @@ "name": "pair of neoprene arm sleeves", "name_plural": "pairs of neoprene arm sleeves", "description": "A pair of soft neoprene arm sleeves. Often used in contact sports.", - "weight": 258, + "weight": "258 g", "volume": "1500 ml", "price": 1200, "to_hit": 1, @@ -387,7 +387,7 @@ "category": "armor", "name": "boiled leather armor", "description": "Thick leather body armor that has been hardened via chemical treatment. Light and strong.", - "weight": 2108, + "weight": "2108 g", "volume": "9500 ml", "price": 26000, "to_hit": -5, @@ -409,7 +409,7 @@ "category": "armor", "name": "bone body armor", "description": "Body armor consisting of a leather suit with strategically-placed bone reinforcement. Light and strong.", - "weight": 2687, + "weight": "2687 g", "volume": "12500 ml", "price": 100000, "to_hit": -5, @@ -430,7 +430,7 @@ "category": "armor", "name": "chitinous armor", "description": "Leg and body armor made from the exoskeletons of insects. Light and durable.", - "weight": 2632, + "weight": "2632 g", "volume": "17500 ml", "price": 120000, "to_hit": -5, @@ -461,7 +461,7 @@ "category": "armor", "name": "fur body armor", "description": "Thick body armor made from furs. Warm and comfortable.", - "weight": 3414, + "weight": "3414 g", "volume": "10 L", "price": 100000, "to_hit": -5, @@ -484,7 +484,7 @@ "name": "lamellar cuirass", "name_plural": "lamellar cuirasses", "description": "A cuirass made of multiple pieces of tough leather, laced together for durable yet flexible protection.", - "weight": 2108, + "weight": "2108 g", "volume": "9250 ml", "price": 26000, "to_hit": -5, @@ -505,7 +505,7 @@ "category": "armor", "name": "leather body armor", "description": "Thick leather body armor. Light and comfortable.", - "weight": 1498, + "weight": "1498 g", "volume": "7 L", "price": 12000, "to_hit": -5, @@ -527,7 +527,7 @@ "category": "armor", "name": "plate armor", "description": "A suit of Gothic plate armor.", - "weight": 11000, + "weight": "11000 g", "volume": "17500 ml", "price": 60000, "to_hit": -5, @@ -548,7 +548,7 @@ "name": "lorica segmentata", "name_plural": "lorica segmentata", "description": "An ancient Roman laminar armor, made of overlapping metal strips connected to internal leather straps.", - "weight": 5286, + "weight": "5286 g", "volume": "6 L", "price": 50000, "to_hit": -5, @@ -568,7 +568,7 @@ "type": "ARMOR", "name": "nomad gear", "description": "A makeshift outfit made from pre-cataclysm clothing designed for long travels. It has a lot of storage space.", - "weight": 5830, + "weight": "5830 g", "volume": "7500 ml", "price": 35000, "to_hit": -3, @@ -589,7 +589,7 @@ "type": "ARMOR", "name": "light nomad gear", "description": "A light makeshift outfit made from pre-cataclysm clothing designed for long summer travels. It offers less storage space and armor compared to regular nomad gear.", - "weight": 3200, + "weight": "3200 g", "volume": "6500 ml", "price": 29500, "to_hit": -4, @@ -612,7 +612,7 @@ "category": "armor", "name": "plated leather armor", "description": "Thick leather body armor that has been reinforced with strategically-placed metal plates. Strong and comfortable.", - "weight": 4280, + "weight": "4280 g", "volume": "9 L", "price": 110000, "to_hit": -5, @@ -635,7 +635,7 @@ "category": "armor", "name": "ornamental plate armor", "description": "An extremely heavy suit of ornamental armor.", - "weight": 18000, + "weight": "18000 g", "volume": "30 L", "price": 780000, "to_hit": -5, @@ -657,7 +657,7 @@ "name": "riot armor", "description": "Black armor used by riot police officers. The padded layers and hard plastic shoulder guards offer good protection without much encumbrance. The word POLICE is emblazoned across the front.", "looks_like": "kevlar", - "weight": 4000, + "weight": "4000 g", "volume": "7500 ml", "price": 35000, "to_hit": -3, @@ -678,7 +678,7 @@ "category": "armor", "name": "O-yoroi", "description": "An ornamental suit of Japanese samurai armor.", - "weight": 9220, + "weight": "9220 g", "volume": "11500 ml", "price": 90000, "bashing": 8, @@ -697,7 +697,7 @@ "type": "ARMOR", "name": "scavenger gear", "description": "A sturdy scavenger's outfit made from refitted pre-cataclysm protective gear. It has a lot of storage space.", - "weight": 7915, + "weight": "7915 g", "volume": "7500 ml", "price": 180000, "to_hit": -3, @@ -719,7 +719,7 @@ "category": "armor", "name": "scrap suit", "description": "A suit of armor made from scraps of metal secured by simple strings; the loose collection of plates provides decent but not the most convenient protection.", - "weight": 9534, + "weight": "9534 g", "volume": "15500 ml", "price": 60000, "to_hit": -5, @@ -740,7 +740,7 @@ "type": "ARMOR", "name": "camo tank top", "description": "A sleeveless cotton shirt with camouflage dye. Very easy to move in.", - "weight": 78, + "weight": "78 g", "volume": "250 ml", "price": 1500, "material": [ "cotton" ], @@ -757,7 +757,7 @@ "name": "basketball shorts", "name_plural": "basketball shorts", "description": "A pair of basketball shorts. Comfortable and light.", - "weight": 190, + "weight": "190 g", "volume": "1 L", "price": 1300, "to_hit": 1, @@ -776,7 +776,7 @@ "type": "ARMOR", "name": "balaclava", "description": "A warm covering that protects the head and face from the cold.", - "weight": 40, + "weight": "40 g", "volume": "250 ml", "price": 3500, "material": [ "cotton" ], @@ -794,7 +794,7 @@ "type": "ARMOR", "name": "baldric", "description": "A leather scabbard, big enough for anything up to a longsword, or even a bit larger than that. Designed to be worn at the waist, secured by a shoulder belt. Activate to sheath/draw a sword.", - "weight": 1625, + "weight": "1625 g", "volume": "2 L", "price": 7500, "bashing": 4, @@ -820,7 +820,7 @@ "type": "ARMOR", "name": "bandana", "description": "A cotton bandana, worn over the mouth for warmth and minor protection from dust and other contaminants.", - "weight": 42, + "weight": "42 g", "volume": "250 ml", "price": 600, "to_hit": -1, @@ -839,7 +839,7 @@ "type": "ARMOR", "name": "barrette", "description": "A barrette with lots of ornaments.", - "weight": 5, + "weight": "5 g", "volume": 0, "price": 800, "material": [ "plastic" ], @@ -852,7 +852,7 @@ "type": "ARMOR", "name": "laundry basket", "description": "A plastic basket meant for storing and hauling clothing.", - "weight": 680, + "weight": "680 g", "volume": "25 L", "price": 75, "to_hit": -2, @@ -873,7 +873,7 @@ "name": "pair of beekeeping gloves", "name_plural": "pairs of beekeeping gloves", "description": "A pair of white beekeeping gloves made out of smooth leather.", - "weight": 120, + "weight": "120 g", "volume": "250 ml", "price": 3000, "to_hit": 1, @@ -893,7 +893,7 @@ "type": "ARMOR", "name": "beekeeping hood", "description": "A beekeeping hood. Keeps the bees out, but lets fresh air in. Rather cumbersome to wear, as it is rather bulky and hinders vision.", - "weight": 260, + "weight": "260 g", "volume": "1500 ml", "price": 4500, "material": [ "cotton", "plastic" ], @@ -912,7 +912,7 @@ "type": "ARMOR", "name": "beekeeping suit", "description": "A white suit commonly worn by professional beekeepers with straps on your ankles and wrists to prevent bees from flying in. It's not a very tough fabric, but it's lightweight and has plenty of storage thanks to a chest pocket.", - "weight": 1587, + "weight": "1587 g", "volume": "3500 ml", "price": 12000, "to_hit": -5, @@ -933,7 +933,7 @@ "type": "ARMOR", "name": "beret", "description": "A soft cotton hat. Commonly worn by armed forces and existentialists.", - "weight": 120, + "weight": "120 g", "volume": "250 ml", "price": 1200, "material": [ "cotton" ], @@ -950,7 +950,7 @@ "type": "ARMOR", "name": "wool beret", "description": "A soft wool hat. Commonly worn by armed forces and existentialists.", - "weight": 160, + "weight": "160 g", "volume": "250 ml", "price": 1500, "material": [ "wool" ], @@ -967,7 +967,7 @@ "type": "ARMOR", "name": "bikini bottom", "description": "A simple bikini bottom.", - "weight": 32, + "weight": "32 g", "volume": "250 ml", "price": 1000, "material": [ "cotton" ], @@ -984,7 +984,7 @@ "type": "ARMOR", "name": "bikini top", "description": "A simple bikini top.", - "weight": 32, + "weight": "32 g", "volume": "250 ml", "price": 1800, "material": [ "cotton" ], @@ -1000,7 +1000,7 @@ "type": "ARMOR", "name": "fur bikini top", "description": "A simple fur bikini top.", - "weight": 44, + "weight": "44 g", "volume": "250 ml", "price": 4900, "material": [ "fur" ], @@ -1017,7 +1017,7 @@ "type": "ARMOR", "name": "leather bikini top", "description": "A simple leather bikini top.", - "weight": 38, + "weight": "38 g", "volume": "250 ml", "price": 3500, "material": [ "leather" ], @@ -1034,7 +1034,7 @@ "type": "ARMOR", "name": "bindle", "description": "You're ready for a trip down some train tracks. Also known as a hobo stick.", - "weight": 980, + "weight": "980 g", "volume": "3 L", "price": 80, "to_hit": -2, @@ -1054,7 +1054,7 @@ "type": "ARMOR", "name": "blanket", "description": "Hiding under here will not protect you from the monsters.", - "weight": 1123, + "weight": "1123 g", "volume": "2500 ml", "price": 5500, "to_hit": -1, @@ -1074,7 +1074,7 @@ "type": "ARMOR", "name": "blazer", "description": "A professional-looking wool blazer. Quite cumbersome.", - "weight": 680, + "weight": "680 g", "volume": "3500 ml", "price": 12000, "material": [ "wool" ], @@ -1094,7 +1094,7 @@ "name": "blindfold", "//": "A folded bandana still takes up some space on the head.", "description": "A simple fabric covering tied over the eyes to block sight. Useful for sleeping in bright areas.", - "weight": 72, + "weight": "72 g", "volume": "250 ml", "price": 600, "material": [ "cotton" ], @@ -1113,7 +1113,7 @@ "type": "ARMOR", "name": "bondage mask", "description": "A tight mask made of black leather. The eyes and mouth can be closed using zippers.", - "weight": 210, + "weight": "210 g", "volume": "1 L", "price": 4000, "to_hit": -3, @@ -1154,7 +1154,7 @@ "type": "ARMOR", "name": "bondage suit", "description": "A suit of snug, black leather. Has no pockets, but does feature an abundance of unusually located zippers.", - "weight": 1800, + "weight": "1800 g", "volume": "3250 ml", "price": 211000, "to_hit": -3, @@ -1175,7 +1175,7 @@ "category": "armor", "name": "bookplate", "description": "A crude form of armor made from stacked paper and rolls of duct tape, this breastplate offers a surprising amount of protection.", - "weight": 1790, + "weight": "1790 g", "volume": "9500 ml", "price": 4200, "to_hit": -1, @@ -1194,7 +1194,7 @@ "type": "ARMOR", "name": "ankle sheath", "description": "A small concealed knife sheath worn on the ankle. It is awkward to use without practice. Activate to sheathe/draw a weapon.", - "weight": 160, + "weight": "160 g", "volume": "500 ml", "price": 5200, "to_hit": -1, @@ -1220,7 +1220,7 @@ "type": "ARMOR", "name": "spear strap", "description": "A leather strap tied around the torso for toting spears while keeping your hands free. You have to duck to get through doors while one's in it, though. Activate to holster/draw a weapon.", - "weight": 160, + "weight": "160 g", "volume": "500 ml", "price": 5200, "to_hit": -1, @@ -1246,7 +1246,7 @@ "type": "ARMOR", "name": "bowler hat", "description": "The only hat for a made man. Look like a real good fella while laughing in the face of your foes!", - "weight": 213, + "weight": "213 g", "volume": "1250 ml", "price": 4500, "material": [ "cotton" ], @@ -1266,7 +1266,7 @@ "name": "boxer briefs", "name_plural": "boxer briefs", "description": "The age-old question, boxers or briefs? Your answer? Yes.", - "weight": 37, + "weight": "37 g", "volume": "250 ml", "price": 1000, "material": [ "cotton" ], @@ -1284,7 +1284,7 @@ "name": "boxer shorts", "name_plural": "boxer shorts", "description": "Men's boxer shorts. More fashionable than briefs and just as comfortable.", - "weight": 42, + "weight": "42 g", "volume": "250 ml", "price": 1000, "material": [ "cotton" ], @@ -1302,7 +1302,7 @@ "name": "pair of boxing gloves", "name_plural": "pairs of boxing gloves", "description": "A pair of big, red, 8 oz. boxing gloves. They make dexterous tasks near impossible, but provide ample protection.", - "weight": 453, + "weight": "453 g", "volume": "1 L", "price": 4000, "to_hit": 1, @@ -1323,7 +1323,7 @@ "name": "boy shorts", "name_plural": "boy shorts", "description": "Female underwear similar to men's boxer shorts, but much more close-fitting.", - "weight": 42, + "weight": "42 g", "volume": "250 ml", "price": 1000, "material": [ "cotton" ], @@ -1340,7 +1340,7 @@ "type": "ARMOR", "name": "bra", "description": "A simple bra. For protecting those bits you don't want zombies to look at.", - "weight": 32, + "weight": "32 g", "volume": "250 ml", "price": 1000, "material": [ "cotton" ], @@ -1358,7 +1358,7 @@ "name": "breeches", "name_plural": "breeches", "description": "A well-made pair of old-fashioned pants, made of stiff yet baggy material. Comfortable, but lacks pockets.", - "weight": 520, + "weight": "520 g", "volume": "1750 ml", "price": 4900, "to_hit": 1, @@ -1377,7 +1377,7 @@ "type": "ARMOR", "name": "briefcase", "description": "Useful for carrying money, documents, or smuggled goods.", - "weight": 1700, + "weight": "1700 g", "volume": "15 L", "price": 24000, "to_hit": -2, @@ -1398,7 +1398,7 @@ "name": "briefs", "name_plural": "briefs", "description": "A pair of briefs. Comfortable underwear worn by men.", - "weight": 32, + "weight": "32 g", "volume": "250 ml", "price": 1000, "material": [ "cotton" ], @@ -1415,7 +1415,7 @@ "type": "ARMOR", "name": "back scabbard", "description": "A leather scabbard, big enough for almost any sword. Designed to be strapped to the back, it's very difficult to draw from without considerable practice. Activate to sheath/draw a sword.", - "weight": 1890, + "weight": "1890 g", "volume": "2250 ml", "price": 9000, "bashing": 4, @@ -1442,7 +1442,7 @@ "category": "armor", "name": "turnout coat", "description": "A heavy protective coat worn by firefighters. Highly resistant to heat and flame, it provides excellent protection from injury.", - "weight": 1930, + "weight": "1930 g", "volume": "5 L", "price": 91000, "to_hit": -1, @@ -1466,7 +1466,7 @@ "name_plural": "turnout trousers", "//": "Fire-resistant outerwear ain't cheap.", "description": "A heavy pair of protective overalls worn by firefighters. Highly resistant to heat and flame, they provide excellent protection from injury.", - "weight": 2290, + "weight": "2290 g", "volume": "5 L", "price": 81500, "to_hit": -1, @@ -1487,7 +1487,7 @@ "type": "ARMOR", "name": "camisole", "description": "A small camisole made from silk. Typically used as an undergarment, they are light and easy to wear.", - "weight": 42, + "weight": "42 g", "volume": "500 ml", "price": 2000, "to_hit": -5, @@ -1504,7 +1504,7 @@ "type": "ARMOR", "name": "Foodperson's cape", "description": "A brightly-colored cape emblazoned with the \"Fp\" symbol.", - "weight": 900, + "weight": "900 g", "volume": "3 L", "price": 5000, "to_hit": -1, @@ -1524,7 +1524,7 @@ "name": "cassock", "name_plural": "cassocks", "description": "A piece of clerical clothing, usually worn by Christian priests.", - "weight": 1200, + "weight": "1200 g", "volume": "5 L", "price": 20000, "to_hit": -5, @@ -1545,7 +1545,7 @@ "name": "pair of chainmail sleeves", "name_plural": "pairs of chainmail sleeves", "description": "Customized chainmail arms. Each sleeve has straps to connect them with each other. The lack of fingers makes them less cumbersome and allows them to be used with gloves.", - "weight": 2812, + "weight": "2812 g", "volume": "750 ml", "price": 7500, "to_hit": -1, @@ -1564,7 +1564,7 @@ "category": "armor", "name": "chainmail coif", "description": "A customized chainmail hood. Can be worn comfortably under helmets.", - "weight": 2006, + "weight": "2006 g", "volume": "500 ml", "price": 5012, "to_hit": -1, @@ -1584,7 +1584,7 @@ "name": "chainmail leggings", "name_plural": "pairs of chainmail leggings", "description": "Customized chainmail legs. Their straps keep everything in place, and the lack of toes and heels allows them to work perfectly well with footwear.", - "weight": 4212, + "weight": "4212 g", "volume": "1500 ml", "price": 7500, "to_hit": -1, @@ -1603,7 +1603,7 @@ "category": "armor", "name": "chainmail hauberk", "description": "A fully customized chainmail outfit, leaving the head uncovered. The shirt, arms, and leggings have been modified with straps and combined with a gambeson to deal with uneven weight distribution, cold environments and to allow them to be used separately.", - "weight": 14430, + "weight": "14430 g", "volume": "2750 ml", "price": 35988, "to_hit": -1, @@ -1623,7 +1623,7 @@ "category": "armor", "name": "chainmail armor", "description": "A fully customized chainmail suit. The coif, shirt, arms, and leggings have been modified with straps and combined with a gambeson to deal with uneven weight distribution, cold environments and to allow them to be used separately.", - "weight": 16436, + "weight": "16436 g", "volume": "3250 ml", "price": 45000, "to_hit": -1, @@ -1643,7 +1643,7 @@ "category": "armor", "name": "chainmail vest", "description": "A customized chainmail vest. It's a sleeveless piece of chainmail with small straps designed to better distribute the weight.", - "weight": 6953, + "weight": "6953 g", "volume": "1 L", "price": 10000, "to_hit": -1, @@ -1662,7 +1662,7 @@ "name": "leather chaps", "name_plural": "leather chaps", "description": "A pair of black leather chaps. Very tough and light, but doesn't offer any storage.", - "weight": 1414, + "weight": "1414 g", "volume": "1250 ml", "price": 21000, "to_hit": -1, @@ -1682,7 +1682,7 @@ "category": "armor", "name": "hard chest guard", "description": "A plastron of interlocking plastic plate protecting your torso.", - "weight": 1000, + "weight": "1000 g", "volume": "7 L", "price": 60000, "to_hit": -2, @@ -1702,7 +1702,7 @@ "type": "ARMOR", "name": "chestwrap", "description": "Rags wrapped around the chest. Preserves your modesty and keeps things out of the way, but not good for much else.", - "weight": 64, + "weight": "64 g", "volume": "500 ml", "price": 500, "material": [ "cotton" ], @@ -1719,7 +1719,7 @@ "type": "ARMOR", "name": "fur chestwrap", "description": "Fur pelts wrapped around the chest. Preserves your modesty and keeps things out of the way, but not good for much else.", - "weight": 154, + "weight": "154 g", "volume": "750 ml", "price": 700, "material": [ "fur" ], @@ -1737,7 +1737,7 @@ "type": "ARMOR", "name": "leather chestwrap", "description": "Leather patches wrapped around the chest. Preserves your modesty and keeps things out of the way, but not good for much else.", - "weight": 137, + "weight": "137 g", "volume": "750 ml", "price": 525, "material": [ "leather" ], @@ -1755,7 +1755,7 @@ "type": "ARMOR", "name": "wool chestwrap", "description": "Felt patches wrapped around the chest. Preserves your modesty and keeps things out of the way, but not good for much else.", - "weight": 64, + "weight": "64 g", "volume": "500 ml", "price": 500, "material": [ "wool" ], @@ -1773,7 +1773,7 @@ "type": "ARMOR", "name": "cleansuit", "description": "A simple hazardous materials handling suit. Though somewhat restrictive and fragile, wearing it will provide excellent protection against ambient radiation.", - "weight": 2100, + "weight": "2100 g", "volume": "2500 ml", "price": 7700, "material": [ "plastic" ], @@ -1792,7 +1792,7 @@ "type": "ARMOR", "name": "cloak", "description": "A heavy cloak meant to be thrown over your body.", - "weight": 1175, + "weight": "1175 g", "volume": "3 L", "price": 10700, "to_hit": -1, @@ -1812,7 +1812,7 @@ "type": "ARMOR", "name": "fur cloak", "description": "A heavy fur cloak meant to be thrown over your body.", - "weight": 1735, + "weight": "1735 g", "volume": "4 L", "price": 24500, "to_hit": -1, @@ -1832,7 +1832,7 @@ "type": "ARMOR", "name": "leather cloak", "description": "A heavy leather cloak meant to be thrown over your body. Provides decent protection.", - "weight": 2060, + "weight": "2060 g", "volume": "3500 ml", "price": 24500, "to_hit": -1, @@ -1852,7 +1852,7 @@ "type": "ARMOR", "name": "wool cloak", "description": "A heavy woolen cloak meant to be thrown over your body.", - "weight": 1525, + "weight": "1525 g", "volume": "3750 ml", "price": 24500, "to_hit": -1, @@ -1872,7 +1872,7 @@ "type": "ARMOR", "name": "clown suit", "description": "A colorful and ridiculous costume fit for a clown. Provides decent storage.", - "weight": 1420, + "weight": "1420 g", "volume": "5750 ml", "price": 2500, "to_hit": -3, @@ -1892,7 +1892,7 @@ "type": "ARMOR", "name": "fur coat", "description": "A fur coat with a couple small pockets. Extremely warm.", - "weight": 1677, + "weight": "1677 g", "volume": "5750 ml", "price": 45000, "to_hit": -5, @@ -1925,7 +1925,7 @@ "type": "ARMOR", "name": "sable coat", "description": "A very well-made fur coat, featuring thick panels of sable fur. Very warm and very good-looking.", - "weight": 1677, + "weight": "1677 g", "volume": "5750 ml", "price": 7760000, "to_hit": -5, @@ -1946,7 +1946,7 @@ "type": "ARMOR", "name": "lab coat", "description": "A long white coat with several large pockets. Comes with a very nice pocket protector.", - "weight": 580, + "weight": "580 g", "volume": "2250 ml", "price": 2500, "to_hit": -2, @@ -1966,7 +1966,7 @@ "type": "ARMOR", "name": "rain coat", "description": "A plastic coat with a hood and two very large pockets. Provides protection from rain.", - "weight": 960, + "weight": "960 g", "volume": "1750 ml", "price": 7900, "material": [ "plastic", "cotton" ], @@ -1986,7 +1986,7 @@ "type": "ARMOR", "name": "gutskin parka", "description": "An intricately sewn coat of treated and split intestines, prized for its light weight and waterproofness among the indigenous peoples of the arctic.", - "weight": 200, + "weight": "200 g", "volume": "1250 ml", "price": 13000, "material": [ "flesh" ], @@ -2005,7 +2005,7 @@ "type": "ARMOR", "name": "winter coat", "description": "A padded coat with deep pockets and a hood. Very warm.", - "weight": 1340, + "weight": "1340 g", "volume": "6750 ml", "price": 14000, "to_hit": -2, @@ -2026,7 +2026,7 @@ "type": "ARMOR", "name": "leather corset", "description": "A snug, black leather corset. Has no pockets, but its thick material provides good protection from harm.", - "weight": 640, + "weight": "640 g", "volume": "1250 ml", "price": 11000, "to_hit": -3, @@ -2046,7 +2046,7 @@ "type": "ARMOR", "name": "cowboy hat", "description": "Whether yer hunting varmints, fixing up the ranch, or heading into the sunset, this is the hat for the job.", - "weight": 390, + "weight": "390 g", "volume": "2 L", "price": 9500, "material": [ "leather" ], @@ -2065,7 +2065,7 @@ "type": "ARMOR", "name": "knit cowl", "description": "A snuggly woolen cowl. It's one of those stylish and bulky cowls you see in fashion magazines.", - "weight": 272, + "weight": "272 g", "volume": "2 L", "price": 2000, "to_hit": -2, @@ -2084,7 +2084,7 @@ "type": "ARMOR", "name": "golden crown", "description": "A delicate golden crown featuring flowering trees.", - "weight": 1000, + "weight": "1000 g", "volume": "1 L", "price": 30000, "material": [ "gold" ], @@ -2101,7 +2101,7 @@ "type": "ARMOR", "name": "golden crown", "description": "A golden crown for the monarch of survivors.", - "weight": 1000, + "weight": "1000 g", "volume": "1 L", "price": 30000, "material": [ "gold" ], @@ -2120,7 +2120,7 @@ "name": "cuirass", "name_plural": "cuirasses", "description": "A steel breastplate, and a vital part of plate armor. Even as full armor went into decline, cuirasses remained in use among cavalry in Europe.", - "weight": 4200, + "weight": "4200 g", "volume": "6 L", "price": 20000, "to_hit": -1, @@ -2141,7 +2141,7 @@ "name": "scrap cuirass", "name_plural": "scrap cuirasses", "description": "A cuirass made from scraps of metal secured by simple strings; the loose collection of plates provides decent but not the most convenient protection.", - "weight": 3366, + "weight": "3366 g", "volume": "5750 ml", "price": 20000, "to_hit": -1, @@ -2157,12 +2157,34 @@ "material_thickness": 2, "flags": [ "OUTER" ] }, + { + "id": "daypack", + "type": "ARMOR", + "name": "daypack", + "description": "An ultralight nylon backpack intended for one-day hiking trips. Waterproof, slim, and spacious.", + "symbol": "[", + "color": "red", + "weight": 411, + "volume": "2 L", + "//": "REI Co-op 22-liter daypack costs $54.95, so ballpark to $55", + "price": 5500, + "price_postapoc": 10000, + "material": [ "cotton", "plastic" ], + "covers": [ "TORSO" ], + "coverage": 50, + "material_thickness": 1, + "encumbrance": 18, + "storage": 96, + "warmth": 5, + "flags": [ "BELTED", "OVERSIZE", "STURDY" ], + "looks_like": "backpack" + }, { "id": "dinosuit", "type": "ARMOR", "name": "dinosaur suit", "description": "A full-body costume in the form of an anthropomorphic dinosaur. It is quite encumbering and has little storage but is very warm.", - "weight": 7033, + "weight": "7033 g", "volume": "12 L", "price": 14500, "to_hit": -3, @@ -2183,7 +2205,7 @@ "type": "ARMOR", "name": "down-filled blanket", "description": "Hiding under here will not protect you from the monsters, but it'll keep you warm.", - "weight": 1323, + "weight": "1323 g", "volume": "3500 ml", "price": 5500, "to_hit": -1, @@ -2204,7 +2226,7 @@ "category": "armor", "name": "dragon skin vest", "description": "A state-of-the-art, lightweight, flexible, bullet resistant vest. The ceramic disks used in its construction make it impossible to repair, only replace.", - "weight": 2860, + "weight": "2860 g", "volume": "6 L", "price": 190000, "to_hit": -3, @@ -2225,7 +2247,7 @@ "category": "armor", "name": "lamellar kevlar vest", "description": "A lamellar kevlar vest, there are intricately cut voids usually filled with stitched in ceramic disks, you could repair the stitching if needed", - "weight": 2060, + "weight": "2060 g", "volume": "4 L", "price": 1900, "to_hit": -3, @@ -2246,7 +2268,7 @@ "name": "dress", "name_plural": "dresses", "description": "A long cotton dress. Though comfortable to wear, it lacks any storage space.", - "weight": 680, + "weight": "680 g", "volume": "3500 ml", "price": 18000, "to_hit": -5, @@ -2265,7 +2287,7 @@ "type": "ARMOR", "name": "dress shirt", "description": "A white button-down shirt with long sleeves. Looks professional!", - "weight": 250, + "weight": "250 g", "volume": "750 ml", "price": 1500, "material": [ "cotton" ], @@ -2285,7 +2307,7 @@ "name": "wedding dress", "name_plural": "wedding dresses", "description": "A beautiful white wedding dress. What good will it be now?", - "weight": 9333, + "weight": "9333 g", "volume": "18 L", "price": 59000, "to_hit": -5, @@ -2305,7 +2327,7 @@ "name": "tactical dump pouch", "name_plural": "tactical dump pouches", "description": "An expandable pouch secured with straps. Provides a bit of extra storage with minimal encumbrance.", - "weight": 288, + "weight": "288 g", "volume": "500 ml", "price": 4500, "to_hit": 2, @@ -2325,7 +2347,7 @@ "type": "ARMOR", "name": "duster", "description": "A rugged full-length duster coat. Has many pockets for storage.", - "weight": 1120, + "weight": "1120 g", "volume": "5750 ml", "price": 15500, "to_hit": -1, @@ -2346,7 +2368,7 @@ "type": "ARMOR", "name": "fur duster", "description": "A thick fur full-length duster. Has many pockets for storage.", - "weight": 2362, + "weight": "2362 g", "volume": "9750 ml", "price": 97900, "to_hit": -1, @@ -2378,7 +2400,7 @@ "type": "ARMOR", "name": "leather duster", "description": "A thick leather full-length duster. Has many pockets for storage.", - "weight": 2655, + "weight": "2655 g", "volume": "7 L", "price": 24500, "to_hit": -1, @@ -2400,7 +2422,7 @@ "category": "armor", "name": "survivor duster", "description": "A Kevlar armored custom full-length duster, covered with pouches and pockets. Comfortable, durable, and great for storage.", - "weight": 2592, + "weight": "2592 g", "volume": "9500 ml", "price": 40000, "to_hit": -1, @@ -2422,7 +2444,7 @@ "name": "pair of ear plugs", "name_plural": "pairs of ear plugs", "description": "Industrial grade ear plugs. They fit inside the ear.", - "weight": 10, + "weight": "10 g", "volume": 0, "price": 10, "material": [ "cotton" ], @@ -2437,7 +2459,7 @@ "type": "ARMOR", "name": "eboshi", "description": "A high, black cap with a very narrow top. Traditionally worn by Shinto priests.", - "weight": 120, + "weight": "120 g", "volume": "500 ml", "price": 7000, "material": [ "cotton" ], @@ -2456,7 +2478,7 @@ "name": "pair of elbow pads", "name_plural": "pairs of elbow pads", "description": "A pair of elbow pads made of stout plastic and cloth.", - "weight": 110, + "weight": "110 g", "volume": "750 ml", "price": 3500, "to_hit": 1, @@ -2474,7 +2496,7 @@ "name": "pair of stylish sunglasses", "name_plural": "pairs of stylish sunglasses", "description": "A pair of stylish sunglasses. Look good while keeping the glare out of your eyes.", - "weight": 42, + "weight": "42 g", "volume": "250 ml", "price": 27500, "to_hit": -2, @@ -2494,7 +2516,7 @@ "type": "ARMOR", "name": "fanny pack", "description": "Provides a bit of extra storage, with minimal encumbrance.", - "weight": 272, + "weight": "272 g", "volume": "250 ml", "price": 3500, "to_hit": 2, @@ -2515,7 +2537,7 @@ "name": "fencing jacket", "name_plural": "fencing jackets", "description": "A padded jacket with the zipper on the back used by fencers to prevent accidents. It doesn't have any storage room, but it is very comfortable.", - "weight": 800, + "weight": "800 g", "volume": "2500 ml", "price": 3000, "material": [ "cotton", "kevlar" ], @@ -2533,7 +2555,7 @@ "type": "ARMOR", "name": "fencing mask", "description": "A tough hood made of steel mesh used by fencers.", - "weight": 520, + "weight": "520 g", "volume": "1250 ml", "price": 3500, "material": [ "cotton", "steel" ], @@ -2551,7 +2573,7 @@ "name": "fencing pants", "name_plural": "fencing pants", "description": "A pair of reinforced pants used by fencers to prevent injuries.", - "weight": 450, + "weight": "450 g", "volume": "2 L", "price": 2500, "material": [ "cotton", "kevlar" ], @@ -2572,7 +2594,7 @@ "name": "pair of fire gauntlets", "name_plural": "pairs of fire gauntlets", "description": "A heavy pair of gloves, used by firefighters and metalworkers for heat protection. Highly resistant to heat and flame, they provide excellent protection from injury.", - "weight": 572, + "weight": "572 g", "volume": "1 L", "price": 8200, "to_hit": 2, @@ -2593,7 +2615,7 @@ "category": "armor", "name": "firefighter helmet", "description": "A distinctive helmet worn by firefighters. More than just a piece of firefighting equipment, it serves as a badge of honor and respect.", - "weight": 1500, + "weight": "1500 g", "volume": "1250 ml", "price": 24000, "to_hit": 1, @@ -2614,7 +2636,7 @@ "type": "ARMOR", "name": "firefighter belt", "description": "A stout firefighter's belt. Useful for keeping your bunker gear up, it also doubles as an equipment belt with a reinforced loop for holding a large tool.", - "weight": 210, + "weight": "210 g", "volume": "500 ml", "price": 9000, "bashing": 5, @@ -2641,7 +2663,7 @@ "name": "pair of fishing waders", "name_plural": "pairs of fishing waders", "description": "Waterproof plastic fishing waders with a single large front pocket.", - "weight": 1360, + "weight": "1360 g", "volume": "9500 ml", "price": 10000, "material": [ "plastic" ], @@ -2662,7 +2684,7 @@ "name": "pair of fit-over sunglasses", "name_plural": "pairs of fit-over sunglasses", "description": "A pair of fit-over sunglasses designed to be worn over a pair of corrective glasses. Good for keeping the glare out of your eyes.", - "weight": 45, + "weight": "45 g", "volume": "250 ml", "price": 5000, "to_hit": -2, @@ -2682,7 +2704,7 @@ "type": "ARMOR", "name": "flag shirt", "description": "A t-shirt embroidered with the pattern of an American flag.", - "weight": 158, + "weight": "158 g", "volume": "500 ml", "price": 6000, "material": [ "cotton" ], @@ -2699,7 +2721,7 @@ "type": "ARMOR", "name": "flotation vest", "description": "A brightly-colored vest designed to keep you upright and floating in water.", - "weight": 451, + "weight": "451 g", "volume": "9 L", "price": 11000, "to_hit": -3, @@ -2719,7 +2741,7 @@ "type": "ARMOR", "name": "makeshift flotation vest", "description": "A flotation vest made of inflated animal skins.", - "weight": 451, + "weight": "451 g", "volume": "9 L", "price": 11000, "to_hit": -3, @@ -2740,7 +2762,7 @@ "category": "armor", "name": "football armor", "description": "Heavy plastic armor for your upper torso. Normally worn by football players.", - "weight": 2810, + "weight": "2810 g", "volume": "7 L", "price": 11000, "material": [ "plastic", "cotton" ], @@ -2759,7 +2781,7 @@ "category": "armor", "name": "survivor firesuit", "description": "Heavy, hand-built combination armor made from a cut-down bulletproof vest and a reinforced flame-resistant Nomex jumpsuit. Protects the wearer from fire and the elements.", - "weight": 6800, + "weight": "6800 g", "volume": "11500 ml", "price": 200000, "to_hit": -3, @@ -2781,7 +2803,7 @@ "type": "ARMOR", "name": "fur blanket", "description": "A heavy fur blanket that covers most of your body.", - "weight": 1986, + "weight": "1986 g", "volume": "3500 ml", "price": 19500, "to_hit": -1, @@ -2801,7 +2823,7 @@ "type": "ARMOR", "name": "gambeson", "description": "A thick jacket of quilted fabric, designed to be worn underneath mail or other armor. Or worn on its own, if you can't afford proper armor.", - "weight": 453, + "weight": "453 g", "volume": "3 L", "price": 20000, "to_hit": -5, @@ -2822,7 +2844,7 @@ "name": "pair of bone armor gauntlets", "name_plural": "pairs of bone armor gauntlets", "description": "Leather gauntlets with bone armor reinforcement. Very light and strong.", - "weight": 690, + "weight": "690 g", "volume": "1250 ml", "price": 38000, "to_hit": -2, @@ -2845,7 +2867,7 @@ "name": "pair of chitinous gauntlets", "name_plural": "pairs of chitinous gauntlets", "description": "Gauntlets made from the exoskeletons of insects. Very light and durable.", - "weight": 760, + "weight": "760 g", "volume": "1750 ml", "price": 38000, "to_hit": -2, @@ -2879,7 +2901,7 @@ "name": "pair of leather armor gauntlets", "name_plural": "pairs of leather armor gauntlets", "description": "Heavy fingerless leather gloves. Very flexible and comfortable.", - "weight": 350, + "weight": "350 g", "volume": "750 ml", "price": 3400, "to_hit": -2, @@ -2902,7 +2924,7 @@ "name": "pair of ballistic glasses", "name_plural": "pairs of ballistic glasses", "description": "Modern tactical eyewear that protects from small projectiles and fragments. Provides excellent protection from environmental dangers.", - "weight": 184, + "weight": "184 g", "volume": "250 ml", "price": 7500, "to_hit": -2, @@ -2924,7 +2946,7 @@ "name": "pair of eclipse glasses", "name_plural": "pairs of eclipse glasses", "description": "A pair of cardboard-framed glasses with UV and IR-filtered lenses topped with a layer of aluminum coating. They allow safe viewing of extremely bright and harmful sources of light, like the sun during a solar eclipse.", - "weight": 27, + "weight": "27 g", "volume": "250 ml", "price": 2500, "to_hit": -2, @@ -2945,7 +2967,7 @@ "name": "pair of bifocal glasses", "name_plural": "pairs of bifocal glasses", "description": "A pair of bifocal glasses for those who are both near-sighted and far-sighted. You can use them to focus sunlight.", - "weight": 30, + "weight": "30 g", "volume": "250 ml", "price": 7900, "to_hit": -2, @@ -2965,7 +2987,7 @@ "name": "pair of eyeglasses", "name_plural": "pairs of eyeglasses", "description": "A pair of glasses for the near-sighted. The concave lenses diffuse the sunlight, rendering them useless for starting fires.", - "weight": 30, + "weight": "30 g", "volume": "250 ml", "price": 7900, "to_hit": -2, @@ -2984,7 +3006,7 @@ "name": "monocle", "//": "DDA monocle is optical-grade. Costume ones go for about $10.", "description": "An essential article of the gentleman's apparel. Also corrects near-sightedness. The concave lenses diffuse the sunlight, rendering them useless for starting fires.", - "weight": 16, + "weight": "16 g", "volume": "5 ml", "price": 4000, "to_hit": -2, @@ -3003,7 +3025,7 @@ "name": "pair of reading glasses", "name_plural": "pairs of reading glasses", "description": "A pair of glasses for the far-sighted. Useless for anyone else. You can use them to focus sunlight.", - "weight": 30, + "weight": "30 g", "volume": "250 ml", "price": 2000, "to_hit": -2, @@ -3023,7 +3045,7 @@ "name": "pair of safety glasses", "name_plural": "pairs of safety glasses", "description": "A pair of plastic glasses, used in workshops, sports, chemistry labs, and many other places. Provides great protection from damage.", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "price": 1000, "to_hit": -2, @@ -3044,7 +3066,7 @@ "name": "white glove", "name_plural": "white gloves", "description": "A single white glove covered with hundreds of rhinestones.", - "weight": 59, + "weight": "59 g", "volume": "250 ml", "price": 50000, "to_hit": 1, @@ -3063,7 +3085,7 @@ "name": "pair of bag gloves", "name_plural": "pairs of bag gloves", "description": "A pair of disposable plastic bags, adapted to be used as gloves.", - "weight": 6, + "weight": "6 g", "volume": "250 ml", "price": 50, "to_hit": -1, @@ -3082,7 +3104,7 @@ "name": "pair of fingerless gloves", "name_plural": "pairs of fingerless gloves", "description": "A pair of leather gloves with no fingers, allowing greater manual dexterity.", - "weight": 100, + "weight": "100 g", "volume": "250 ml", "price": 1400, "to_hit": 2, @@ -3102,7 +3124,7 @@ "name": "pair of armored fingerless gloves", "name_plural": "pairs of armored fingerless gloves", "description": "A pair of leather gloves with no fingers, allowing greater manual dexterity. These have been crudely reinforced with steel guards across the back.", - "weight": 380, + "weight": "380 g", "volume": "500 ml", "price": 9000, "to_hit": 2, @@ -3123,7 +3145,7 @@ "name": "pair of survivor firegloves", "name_plural": "pairs of survivor firegloves", "description": "A pair of customized, Kevlar armored Nomex gloves, modified to be easy to wear while providing maximum protection under extreme conditions.", - "weight": 410, + "weight": "410 g", "volume": "1 L", "price": 18000, "to_hit": 2, @@ -3144,7 +3166,7 @@ "name": "pair of fur gloves", "name_plural": "pairs of fur gloves", "description": "A pair of warm fur gloves. They are somewhat cumbersome.", - "weight": 410, + "weight": "410 g", "volume": "1 L", "price": 4000, "to_hit": 1, @@ -3164,7 +3186,7 @@ "name": "pair of survivor wetsuit gloves", "name_plural": "pairs of survivor wetsuit gloves", "description": "A pair of customized, Kevlar armored neoprene gloves, modified to be easy to wear while providing maximum protection under extreme conditions.", - "weight": 390, + "weight": "390 g", "volume": "750 ml", "price": 18000, "to_hit": 2, @@ -3186,7 +3208,7 @@ "name": "pair of heavy survivor gloves", "name_plural": "pairs of heavy survivor gloves", "description": "A pair of heavily customized, steel-backed armored Kevlar gloves, modified to be easy to wear while providing maximum protection under extreme conditions.", - "weight": 380, + "weight": "380 g", "volume": "1 L", "price": 18000, "to_hit": 2, @@ -3207,7 +3229,7 @@ "name": "pair of leather gloves", "name_plural": "pairs of leather gloves", "description": "A thin pair of black leather gloves.", - "weight": 160, + "weight": "160 g", "volume": "250 ml", "price": 4500, "to_hit": 2, @@ -3227,7 +3249,7 @@ "name": "pair of light gloves", "name_plural": "pairs of light gloves", "description": "A pair of cotton gloves.", - "weight": 118, + "weight": "118 g", "volume": "250 ml", "price": 1100, "to_hit": 1, @@ -3247,7 +3269,7 @@ "name": "pair of glove liners", "name_plural": "pairs of glove liners", "description": "A pair of thin cotton gloves. Often used as a liner beneath other gloves.", - "weight": 63, + "weight": "63 g", "volume": "250 ml", "price": 600, "to_hit": 1, @@ -3268,7 +3290,7 @@ "name": "pair of light survivor gloves", "name_plural": "pairs of light survivor gloves", "description": "A pair of customized, Kevlar armored cloth gloves, modified to be easy to wear while providing maximum protection under extreme conditions.", - "weight": 190, + "weight": "190 g", "volume": "750 ml", "price": 18000, "to_hit": 2, @@ -3289,7 +3311,7 @@ "name": "pair of medical gloves", "name_plural": "pairs of medical gloves", "description": "A pair of thin latex gloves, designed to limit the spread of disease.", - "weight": 10, + "weight": "10 g", "volume": 0, "price": 1000, "to_hit": 1, @@ -3310,7 +3332,7 @@ "name": "pair of armored gauntlets", "name_plural": "pairs of armored gauntlets", "description": "An extremely heavy set of armor-plated leather gloves.", - "weight": 980, + "weight": "980 g", "volume": "1500 ml", "price": 40000, "to_hit": -2, @@ -3332,7 +3354,7 @@ "name": "pair of rubber gloves", "name_plural": "pairs of rubber gloves", "description": "A pair of rubber gloves, often used while cleaning with caustic materials.", - "weight": 20, + "weight": "20 g", "volume": "1 L", "price": 1300, "to_hit": 2, @@ -3354,7 +3376,7 @@ "name": "pair of survivor gloves", "name_plural": "pairs of survivor gloves", "description": "A pair of customized, Kevlar armored leather gloves, modified to be easy to wear while providing maximum protection under extreme conditions.", - "weight": 230, + "weight": "230 g", "volume": "750 ml", "price": 18000, "to_hit": 2, @@ -3376,7 +3398,7 @@ "name": "pair of tactical gloves", "name_plural": "pairs of tactical gloves", "description": "A pair of reinforced Kevlar tactical gloves. Commonly used by police and military units.", - "weight": 220, + "weight": "220 g", "volume": "500 ml", "price": 5200, "to_hit": 2, @@ -3396,7 +3418,7 @@ "name": "pair of winter gloves", "name_plural": "pairs of winter gloves", "description": "A pair of padded gloves. Cumbersome, but warm.", - "weight": 218, + "weight": "218 g", "volume": "750 ml", "price": 6500, "to_hit": 1, @@ -3415,7 +3437,7 @@ "name": "pair of wool gloves", "name_plural": "pairs of wool gloves", "description": "A thick pair of wool gloves. Cumbersome, but warm.", - "weight": 240, + "weight": "240 g", "volume": "250 ml", "price": 3500, "to_hit": 1, @@ -3434,7 +3456,7 @@ "name": "pair of work gloves", "name_plural": "pairs of work gloves", "description": "A tough pair of gloves, for tough everyday work.", - "weight": 195, + "weight": "195 g", "volume": "250 ml", "price": 4500, "to_hit": 2, @@ -3455,7 +3477,7 @@ "name": "pair of cut resistant gloves", "name_plural": "pairs of cut resistant gloves", "description": "A pair of cut resistant gloves, useful when rapidly breaking down carcasses.", - "weight": 240, + "weight": "240 g", "volume": "250 ml", "price": 9000, "to_hit": 2, @@ -3477,7 +3499,7 @@ "name": "pair of hand wraps", "name_plural": "pairs of hand wraps", "description": "Long pieces of cloth that are meant to be wrapped around your hands. Provide small amounts of protection while punching and performing other general mischief.", - "weight": 100, + "weight": "100 g", "volume": "250 ml", "price": 500, "to_hit": 2, @@ -3496,7 +3518,7 @@ "name": "pair of fur hand wraps", "name_plural": "pairs of fur hand wraps", "description": "Pieces of animal pelt that are meant to be wrapped around your hands. Provide small amounts of protection while punching and performing other general mischief.", - "weight": 250, + "weight": "250 g", "volume": "500 ml", "price": 700, "to_hit": 2, @@ -3516,7 +3538,7 @@ "name": "pair of leather hand wraps", "name_plural": "pairs of leather hand wraps", "description": "Pieces of leather that are meant to be wrapped around your hands. Provide small amounts of protection while punching and performing other general mischief.", - "weight": 200, + "weight": "200 g", "volume": "500 ml", "price": 525, "to_hit": 2, @@ -3536,7 +3558,7 @@ "name": "pair of wool hand wraps", "name_plural": "pairs of wool hand wraps", "description": "Long pieces of wool that are meant to be wrapped around your hands. Provide small amounts of protection while punching and performing other general mischief.", - "weight": 100, + "weight": "100 g", "volume": "250 ml", "price": 500, "to_hit": 2, @@ -3557,7 +3579,7 @@ "name": "pair of winter survivor gloves", "name_plural": "pairs of winter survivor gloves", "description": "A pair of customized, Kevlar armored fur gloves, modified to be easy to wear while providing maximum protection under extreme conditions.", - "weight": 300, + "weight": "300 g", "volume": "1250 ml", "price": 18000, "to_hit": 2, @@ -3579,7 +3601,7 @@ "name": "pair of XL survivor gloves", "name_plural": "pairs of XL survivor gloves", "description": "A massive pair of customized, Kevlar armored leather gloves, modified to be easy to wear while providing maximum protection under extreme conditions.", - "weight": 480, + "weight": "480 g", "volume": "1500 ml", "price": 18000, "to_hit": 2, @@ -3599,7 +3621,7 @@ "type": "ARMOR", "name": "go bag", "description": "A huge duffel bag with backpack attached, both packed to the gills. Judging by the feel, a National Guard soldier could have packed this to be ready for deployment. Activate to unpack and enjoy.", - "weight": 18043, + "weight": "18043 g", "volume": "35750 ml", "price": 100000, "to_hit": -5, @@ -3628,7 +3650,7 @@ "name": "pair of ski goggles", "name_plural": "pairs of ski goggles", "description": "A large pair of goggles that completely seal off your eyes. Provides excellent protection from environmental dangers.", - "weight": 354, + "weight": "354 g", "volume": "500 ml", "price": 4500, "to_hit": -2, @@ -3650,7 +3672,7 @@ "name": "pair of swim goggles", "name_plural": "pairs of swim goggles", "description": "A small pair of goggles made for swimming.", - "weight": 81, + "weight": "81 g", "volume": "250 ml", "price": 1100, "to_hit": -2, @@ -3671,7 +3693,7 @@ "name": "pair of welding goggles", "name_plural": "pairs of welding goggles", "description": "A dark pair of goggles. They make seeing very difficult, but protect you from bright flashes.", - "weight": 153, + "weight": "153 g", "volume": "250 ml", "price": 1400, "to_hit": -3, @@ -3692,7 +3714,7 @@ "type": "ARMOR", "name": "evening gown", "description": "A luxurious evening gown. It accentuates your curves, or lack thereof.", - "weight": 1800, + "weight": "1800 g", "volume": "5 L", "price": 21000, "material": [ "cotton" ], @@ -3710,7 +3732,7 @@ "type": "ARMOR", "name": "greatcoat", "description": "A heavy, full-length wool coat. Cumbersome, but warm and with deep pockets.", - "weight": 2428, + "weight": "2428 g", "volume": "8 L", "price": 18000, "to_hit": -3, @@ -3732,7 +3754,7 @@ "category": "armor", "name": "survivor wetsuit", "description": "A lightweight, hand-built combination armor made from a cut-down bulletproof vest and a reinforced neoprene wetsuit. Protects from the elements as well as from harm.", - "weight": 6400, + "weight": "6400 g", "volume": "7 L", "price": 110000, "to_hit": -3, @@ -3754,7 +3776,7 @@ "type": "ARMOR", "name": "hakama", "description": "Plain black hakama for use in kendo and other martial arts.", - "weight": 350, + "weight": "350 g", "volume": "1 L", "price": 2500, "material": [ "cotton" ], @@ -3772,7 +3794,7 @@ "type": "ARMOR", "name": "hakama", "description": "A flowing, pleated garment which can be worn over a kimono.", - "weight": 500, + "weight": "500 g", "volume": "1500 ml", "price": 3000, "material": [ "cotton" ], @@ -3790,7 +3812,7 @@ "type": "ARMOR", "name": "halter top", "description": "A short top made from cotton. It is light and easy to wear.", - "weight": 42, + "weight": "42 g", "volume": "500 ml", "price": 2000, "to_hit": -5, @@ -3809,7 +3831,7 @@ "name": "baseball cap", "//": "Head encumbrance stops you from wearing additional headgear. No helmet over a ballcap, sorry. But brimmed gear gets the anti-glare flag!", "description": "A Red Sox cap. It provides a little bit of warmth.", - "weight": 88, + "weight": "88 g", "volume": "500 ml", "price": 2500, "material": [ "cotton" ], @@ -3828,7 +3850,7 @@ "type": "ARMOR", "name": "boonie hat", "description": "Also called a \"bucket hat.\" Often used in the military. Its wide brim helps keep the sun out of your eyes.", - "weight": 92, + "weight": "92 g", "volume": "500 ml", "price": 1200, "material": [ "cotton" ], @@ -3847,7 +3869,7 @@ "type": "ARMOR", "name": "toque", "description": "A traditional chef's hat, standing tall and proud against the vulgarities of the world.", - "weight": 140, + "weight": "140 g", "volume": "500 ml", "price": 500, "material": [ "cotton" ], @@ -3865,7 +3887,7 @@ "type": "ARMOR", "name": "cotton hat", "description": "A snug-fitting cotton hat. Quite warm.", - "weight": 78, + "weight": "78 g", "volume": "250 ml", "price": 2000, "material": [ "cotton" ], @@ -3882,7 +3904,7 @@ "type": "ARMOR", "name": "fur hat", "description": "A hat made from the pelts of animals. Extremely warm.", - "weight": 246, + "weight": "246 g", "volume": "750 ml", "price": 5000, "material": [ "fur" ], @@ -3910,7 +3932,7 @@ "type": "ARMOR", "name": "hard hat", "description": "A hard plastic hat worn in construction sites. Excellent protection from cuts and percussion.", - "weight": 796, + "weight": "796 g", "volume": "2500 ml", "price": 1200, "bashing": 6, @@ -3931,7 +3953,7 @@ "category": "armor", "name": "hooded hard hat", "description": "A hard plastic hat worn in construction sites, with a cloth tucked in under it to serve as a makeshift hood. Makes it a bit more comfortable to wear, and better protects the neck from sun and rain.", - "weight": 876, + "weight": "876 g", "volume": "2750 ml", "price": 1200, "bashing": 6, @@ -3951,7 +3973,7 @@ "type": "ARMOR", "name": "hunting cap", "description": "A red plaid hunting cap with ear flaps. Notably warm.", - "weight": 206, + "weight": "206 g", "volume": "750 ml", "price": 3000, "material": [ "wool" ], @@ -3970,7 +3992,7 @@ "type": "ARMOR", "name": "knit hat", "description": "A snug-fitting wool hat. Very warm.", - "weight": 120, + "weight": "120 g", "volume": "250 ml", "price": 3000, "material": [ "wool" ], @@ -3987,7 +4009,7 @@ "type": "ARMOR", "name": "newsboy cap", "description": "A slouching wool cap with a short front brim, traditionally associated with newspaper delivery boys. Quite warm.", - "weight": 100, + "weight": "100 g", "volume": "250 ml", "price": 3000, "material": [ "wool" ], @@ -4004,7 +4026,7 @@ "type": "ARMOR", "name": "noise canceling headgear", "description": "Padding over your ears kept in place by some string. Blocks incoming sounds.", - "weight": 72, + "weight": "72 g", "volume": "500 ml", "price": 2500, "material": [ "cotton" ], @@ -4023,7 +4045,7 @@ "name": "sombrero", "//": "Head encumbrance stops you from wearing additional headgear. No helmet over a sombrero, sorry. But brimmed gear gets the anti-glare flag!", "description": "A felt orange sombrero with traditional white and yellow hand stitching. The wide brim keeps the sun out of your eyes, and a thin strap hooks around your chin.", - "weight": 140, + "weight": "140 g", "volume": "3500 ml", "price": 5500, "material": [ "wool" ], @@ -4042,7 +4064,7 @@ "type": "ARMOR", "name": "headgear", "description": "Lightweight sports headgear designed to protect the head while sparring.", - "weight": 500, + "weight": "500 g", "volume": "1 L", "price": 4000, "to_hit": 1, @@ -4063,7 +4085,7 @@ "category": "armor", "name": "army helmet", "description": "A heavy helmet that provides excellent protection from all sorts of damage.", - "weight": 1383, + "weight": "1383 g", "volume": "1750 ml", "price": 15000, "to_hit": -1, @@ -4085,7 +4107,7 @@ "category": "armor", "name": "baseball helmet", "description": "A hard plastic helmet that covers the head and ears. Designed to protect against a baseball to the head.", - "weight": 453, + "weight": "453 g", "volume": "1750 ml", "price": 3100, "to_hit": -1, @@ -4107,7 +4129,7 @@ "category": "armor", "name": "barbute helm", "description": "A medieval helmet that provides excellent protection for the head, with a Y shaped opening for the face.", - "weight": 1175, + "weight": "1175 g", "volume": "2500 ml", "price": 30000, "bashing": 10, @@ -4128,7 +4150,7 @@ "category": "armor", "name": "bike helmet", "description": "A thick foam helmet. Designed to protect against concussion.", - "weight": 270, + "weight": "270 g", "volume": "1500 ml", "price": 17000, "bashing": 4, @@ -4148,7 +4170,7 @@ "category": "armor", "name": "bone armor helmet", "description": "A grotesque, horned helmet carved from bone. Covers the entire head; very light and strong.", - "weight": 1621, + "weight": "1621 g", "volume": "4250 ml", "price": 42000, "to_hit": -2, @@ -4170,7 +4192,7 @@ "category": "armor", "name": "chitinous helmet", "description": "A helmet made from the exoskeletons of insects. Covers the entire head; very light and durable.", - "weight": 1447, + "weight": "1447 g", "volume": "2500 ml", "price": 38000, "to_hit": -2, @@ -4192,7 +4214,7 @@ "category": "armor", "name": "conical helm", "description": "A conical iron helm with additional protection for the neck, associated with the Mongol Empire.", - "weight": 1425, + "weight": "1425 g", "volume": "3500 ml", "price": 40000, "bashing": 6, @@ -4223,7 +4245,7 @@ "category": "armor", "name": "football helmet", "description": "A heavy plastic helmet normally worn by football players.", - "weight": 1360, + "weight": "1360 g", "volume": "2250 ml", "price": 19800, "material": [ "plastic" ], @@ -4243,7 +4265,7 @@ "name": "galea", "name_plural": "galeae", "description": "An Imperial Roman helmet, with distinct projections protecting the sides of the head.", - "weight": 1310, + "weight": "1310 g", "volume": "2500 ml", "price": 35000, "bashing": 10, @@ -4264,7 +4286,7 @@ "category": "armor", "name": "heavy survivor helmet", "description": "A customized, heavily armored steel and kevlar helmet, modified to provide maximum comfort and protection from harm.", - "weight": 1712, + "weight": "1712 g", "volume": "2500 ml", "price": 58000, "to_hit": -1, @@ -4288,7 +4310,7 @@ "name": "kabuto", "//": "Leaving this at $500 as it's either antique/priceless or player-made/Bartered, leastwise on the initial search.", "description": "A medieval Japanese helmet with a scowling facemask that provides excellent protection to the entire head and face.", - "weight": 1625, + "weight": "1625 g", "volume": "3500 ml", "price": 50000, "bashing": 6, @@ -4310,7 +4332,7 @@ "category": "armor", "name": "leather armor helmet", "description": "A thick leather helmet that provides excellent protection for the head.", - "weight": 435, + "weight": "435 g", "volume": "2 L", "price": 14000, "material": [ "leather" ], @@ -4329,7 +4351,7 @@ "type": "ARMOR", "name": "helmet liner", "description": "This goes inside a helmet to help keep your head warm in cold climates.", - "weight": 110, + "weight": "110 g", "volume": "250 ml", "price": 1000, "to_hit": -1, @@ -4349,7 +4371,7 @@ "category": "armor", "name": "lobster helmet", "description": "A heavy helmet that provides excellent protection from all sorts of damage. It has a tail coming off the back that provides protection to your neck.", - "weight": 1383, + "weight": "1383 g", "volume": "2 L", "price": 28000, "to_hit": -1, @@ -4371,7 +4393,7 @@ "category": "armor", "name": "motorcycle helmet", "description": "A helmet with covers for your head and chin, leaving space in-between for you to wear goggles.", - "weight": 1587, + "weight": "1587 g", "volume": "2250 ml", "price": 32500, "to_hit": -1, @@ -4394,7 +4416,7 @@ "category": "armor", "name": "nasal helm", "description": "An early medieval helmet with a projection guarding the nose, to better protect the face without obstructing vision. Proper viking gear, unlike the stereotypical horned helm.", - "weight": 907, + "weight": "907 g", "volume": "2 L", "price": 26000, "bashing": 10, @@ -4414,7 +4436,7 @@ "type": "ARMOR", "name": "nomad cowl", "description": "A makeshift cowl with protection for the eyes from rain and sun, designed for long travels.", - "weight": 470, + "weight": "470 g", "volume": "2500 ml", "price": 25000, "to_hit": -3, @@ -4435,7 +4457,7 @@ "category": "armor", "name": "great helm", "description": "A medieval helmet that provides excellent protection to the entire head, at the cost of great encumbrance.", - "weight": 2175, + "weight": "2175 g", "volume": "2750 ml", "price": 40000, "bashing": 10, @@ -4456,7 +4478,7 @@ "type": "ARMOR", "name": "scavenger cowl", "description": "A sturdy protective cowl extending down to the neck, fitted with a respirator and eye protection. For dangerous scavenging ventures.", - "weight": 695, + "weight": "695 g", "volume": "2500 ml", "price": 55000, "to_hit": -3, @@ -4477,7 +4499,7 @@ "category": "armor", "name": "scrap helmet", "description": "A helmet made from scraps of metal secured by simple strings; the loose collection of plates provides decent but not the most convenient protection.", - "weight": 1692, + "weight": "1692 g", "volume": "2750 ml", "price": 35000, "to_hit": -1, @@ -4499,7 +4521,7 @@ "category": "armor", "name": "skid lid", "description": "A small metal helmet that covers the head and protects against cuts and percussion.", - "weight": 1315, + "weight": "1315 g", "volume": "1250 ml", "price": 4500, "bashing": 8, @@ -4519,7 +4541,7 @@ "category": "armor", "name": "survivor helmet", "description": "A customized, heavily armored Kevlar helmet, modified with leather reinforcements to provide maximum comfort and protection from harm.", - "weight": 1420, + "weight": "1420 g", "volume": "2500 ml", "price": 58000, "to_hit": -1, @@ -4529,7 +4551,7 @@ "color": "dark_gray", "covers": [ "HEAD" ], "coverage": 100, - "encumbrance": 40, + "encumbrance": 25, "warmth": 15, "material_thickness": 5, "environmental_protection": 3, @@ -4542,7 +4564,7 @@ "category": "armor", "name": "XL survivor helmet", "description": "A massive customized, heavily armored Kevlar helmet, modified with leather reinforcements to provide maximum comfort and protection from harm.", - "weight": 3060, + "weight": "3060 g", "volume": "6 L", "price": 58000, "to_hit": -1, @@ -4573,9 +4595,9 @@ "coverage": 5, "encumbrance": 100, "storage": "15 L", - "material_thickness": 1, - "flags": [ "OVERSIZE", "BELTED", "RESTRICT_HANDS", "WATER_FRIENDLY" ] - } + "material_thickness": 1 + }, + "flags": [ "OVERSIZE", "BELTED", "RESTRICT_HANDS", "WATER_FRIENDLY" ] }, { "id": "hide_tainted_bag", @@ -4591,9 +4613,9 @@ "coverage": 5, "encumbrance": 100, "storage": "15 L", - "material_thickness": 1, - "flags": [ "OVERSIZE", "BELTED", "RESTRICT_HANDS", "WATER_FRIENDLY" ] - } + "material_thickness": 1 + }, + "flags": [ "OVERSIZE", "BELTED", "RESTRICT_HANDS", "WATER_FRIENDLY" ] }, { "id": "hood_fsurvivor", @@ -4601,7 +4623,7 @@ "category": "armor", "name": "survivor firehood", "description": "A customized armored Nomex and Kevlar hood, very strong and durable.", - "weight": 1220, + "weight": "1220 g", "volume": "1500 ml", "price": 58000, "to_hit": -1, @@ -4623,7 +4645,7 @@ "category": "armor", "name": "survivor wetsuit hood", "description": "A customized armored neoprene and Kevlar hood, very strong and durable.", - "weight": 860, + "weight": "860 g", "volume": "1500 ml", "price": 58000, "to_hit": -1, @@ -4645,7 +4667,7 @@ "category": "armor", "name": "light survivor hood", "description": "A customized armored cloth and Kevlar hood, very light and durable.", - "weight": 628, + "weight": "628 g", "volume": "750 ml", "price": 58000, "to_hit": -1, @@ -4666,7 +4688,7 @@ "type": "ARMOR", "name": "rain hood", "description": "A waterproof hood made to be worn in bad weather. Provides extra protection from rain.", - "weight": 160, + "weight": "160 g", "volume": "750 ml", "price": 2000, "material": [ "plastic", "cotton" ], @@ -4685,7 +4707,7 @@ "category": "armor", "name": "survivor hood", "description": "A customized, heavily armored leather and Kevlar hood, designed to provide comfort and protection from harm.", - "weight": 820, + "weight": "820 g", "volume": "2 L", "price": 58000, "to_hit": -1, @@ -4708,7 +4730,7 @@ "category": "armor", "name": "winter survivor hood", "description": "A customized armored fur and Kevlar hood, very warm and durable.", - "weight": 870, + "weight": "870 g", "volume": "1500 ml", "price": 58000, "to_hit": -1, @@ -4730,7 +4752,7 @@ "category": "armor", "name": "XL survivor hood", "description": "A massive customized, heavily armored leather and Kevlar hood, designed to provide comfort and protection from harm.", - "weight": 1640, + "weight": "1640 g", "volume": "4500 ml", "price": 58000, "to_hit": -1, @@ -4752,7 +4774,7 @@ "type": "ARMOR", "name": "hoodie", "description": "A sweatshirt with a hood and a \"kangaroo pocket\" in the front for storage.", - "weight": 420, + "weight": "420 g", "volume": "3 L", "price": 3800, "material": [ "cotton" ], @@ -4772,7 +4794,7 @@ "name": "hot pants", "name_plural": "hot pants", "description": "A simple pair of short shorts.", - "weight": 92, + "weight": "92 g", "volume": "250 ml", "price": 2500, "material": [ "cotton" ], @@ -4789,7 +4811,7 @@ "name": "fur hot pants", "name_plural": "fur hot pants", "description": "A simple pair of fur short shorts.", - "weight": 118, + "weight": "118 g", "volume": "250 ml", "price": 5500, "material": [ "fur" ], @@ -4807,7 +4829,7 @@ "name": "leather hot pants", "name_plural": "leather hot pants", "description": "A simple pair of leather short shorts.", - "weight": 106, + "weight": "106 g", "volume": "250 ml", "price": 2500, "material": [ "leather" ], @@ -4824,7 +4846,7 @@ "type": "ARMOR", "name": "housecoat", "description": "Makes you wish you had running water to take a shower.", - "weight": 580, + "weight": "580 g", "volume": "2 L", "price": 2200, "to_hit": -1, @@ -4846,7 +4868,7 @@ "category": "armor", "name": "heavy survivor suit", "description": "A heavy, hand-built combination armor made from a reinforced bulletproof vest and a metal-plated leather jumpsuit. Protects from the elements as well as from harm.", - "weight": 8500, + "weight": "8500 g", "volume": "12 L", "price": 200000, "to_hit": -3, @@ -4869,7 +4891,7 @@ "name": "pair of snow goggles", "name_plural": "pairs of snow goggles", "description": "Eyewear carved from from wood or bone, with only a thin slit to see out of. Helps reduce glare, traditionally used by the Inuit to protect against snow blindness.", - "weight": 70, + "weight": "70 g", "volume": "250 ml", "price": 4500, "to_hit": -2, @@ -4890,7 +4912,7 @@ "name": "army jacket", "name_plural": "army jacket", "description": "A tough jacket with lots of pockets. Favored by the military.", - "weight": 780, + "weight": "780 g", "volume": "3 L", "price": 3500, "material": [ "cotton", "plastic" ], @@ -4909,7 +4931,7 @@ "type": "ARMOR", "name": "chef's jacket", "description": "This double-breasted uniform is unusually thick to protect against the heat of the kitchen.", - "weight": 720, + "weight": "720 g", "volume": "1750 ml", "price": 7000, "material": [ "cotton" ], @@ -4928,7 +4950,7 @@ "type": "ARMOR", "name": "emergency jacket", "description": "A bright & cheaply made FEMA-issue windbreaker jacket with a hood. One size, fits none. Helps keep you unfrozen & visible for rescuers.", - "weight": 197, + "weight": "197 g", "volume": "2250 ml", "price": 1000, "material": [ "plastic", "cotton" ], @@ -4947,7 +4969,7 @@ "type": "ARMOR", "name": "flannel jacket", "description": "A jacket made from flannel-style denim, favored by outdoorsy types. Provides decent protection from cuts.", - "weight": 958, + "weight": "958 g", "volume": "4250 ml", "price": 6000, "material": [ "cotton" ], @@ -4966,7 +4988,7 @@ "type": "ARMOR", "name": "jean jacket", "description": "A jacket made from denim. Provides decent protection from cuts.", - "weight": 800, + "weight": "800 g", "volume": "3250 ml", "price": 4000, "material": [ "cotton" ], @@ -4991,7 +5013,7 @@ "type": "ARMOR", "name": "leather jacket", "description": "A jacket made from thick leather. Cumbersome, but offers excellent protection from cuts.", - "weight": 1450, + "weight": "1450 g", "volume": "4500 ml", "price": 17900, "to_hit": 1, @@ -5012,7 +5034,7 @@ "type": "ARMOR", "name": "armored leather jacket", "description": "An armored jacket made from thick leather and metal plates. Cumbersome, but offers excellent protection from harm.", - "weight": 2180, + "weight": "2180 g", "volume": "5500 ml", "price": 17900, "to_hit": 1, @@ -5033,7 +5055,7 @@ "type": "ARMOR", "name": "red leather jacket", "description": "A candy-apple-red leather jacket with black strips and shoulder protrusions. It has a number of zippers and snaps in the front.", - "weight": 1450, + "weight": "1450 g", "volume": "4500 ml", "price": 17900, "to_hit": 1, @@ -5054,7 +5076,7 @@ "type": "ARMOR", "name": "light jacket", "description": "A thin cotton jacket with a hood. Good for brisk weather.", - "weight": 227, + "weight": "227 g", "volume": "2250 ml", "price": 4500, "material": [ "cotton" ], @@ -5073,7 +5095,7 @@ "type": "ARMOR", "name": "windbreaker", "description": "A light synthetic jacket with a hood. Not very warm, but will keep out the rain.", - "weight": 197, + "weight": "197 g", "volume": "2250 ml", "price": 1000, "material": [ "plastic" ], @@ -5094,7 +5116,7 @@ "name": "jeans", "name_plural": "jeans", "description": "A pair of blue jeans with two deep pockets.", - "weight": 600, + "weight": "600 g", "volume": "2 L", "price": 5000, "to_hit": 1, @@ -5115,7 +5137,7 @@ "name": "red jeans", "name_plural": "red jeans", "description": "A pair of tight-fitting candy-apple-red jeans with two deep pockets.", - "weight": 600, + "weight": "600 g", "volume": "2 L", "price": 5000, "to_hit": 1, @@ -5135,7 +5157,7 @@ "type": "ARMOR", "name": "Jedi cloak", "description": "Long, flowing robes. Simple and comfortable to wear. Be sure to tear it off dramatically before fighting any foes!", - "weight": 1587, + "weight": "1587 g", "volume": "2500 ml", "price": 22500, "to_hit": -1, @@ -5156,7 +5178,7 @@ "name": "sports jersey", "//": "Genuine team merch, and priced like it!", "description": "A shirt made of thick material imprinted with the name and logo of a sports team.", - "weight": 480, + "weight": "480 g", "volume": "2250 ml", "price": 8900, "material": [ "cotton" ], @@ -5212,7 +5234,7 @@ "type": "ARMOR", "name": "judo belt template", "description": "This is a template for judo belts. If found in a game it is a bug.", - "weight": 200, + "weight": "200 g", "volume": "250 ml", "price": 1000, "to_hit": -1, @@ -5285,7 +5307,7 @@ "type": "ARMOR", "name": "judo gi", "description": "Plain white judo gi. Thick and a little stiff, it gives minor protection from cuts and punches.", - "weight": 1000, + "weight": "1000 g", "volume": "1500 ml", "price": 5000, "material": [ "cotton" ], @@ -5303,7 +5325,7 @@ "type": "ARMOR", "name": "jumpsuit", "description": "A thin, short-sleeved jumpsuit; similar to those worn by prisoners. Provides decent storage and is not very encumbering.", - "weight": 610, + "weight": "610 g", "volume": "3500 ml", "price": 8900, "to_hit": -3, @@ -5331,7 +5353,7 @@ "type": "ARMOR", "name": "XL jumpsuit", "description": "A thin, short-sleeved jumpsuit updated for the trans-human who needs full-body clothing. Provides some storage and is adjustable to minimize encumbrance.", - "weight": 810, + "weight": "810 g", "volume": "5 L", "price": 20000, "to_hit": -3, @@ -5351,7 +5373,7 @@ "type": "ARMOR", "name": "karate gi", "description": "Plain white karate gi. Loose and flowing, it offers little protection, and little encumbrance.", - "weight": 400, + "weight": "400 g", "volume": "1500 ml", "price": 5000, "material": [ "cotton" ], @@ -5368,7 +5390,7 @@ "type": "ARMOR", "name": "kariginu", "description": "A traditional, ankle-length Shinto robe with several layers and very wide sleeves.", - "weight": 1400, + "weight": "1400 g", "volume": "5500 ml", "price": 30000, "to_hit": -5, @@ -5388,7 +5410,7 @@ "type": "ARMOR", "name": "keffiyeh", "description": "A type of headdress traditionally used in the Middle East. It can be used in different ways to protect the head and mouth from the elements.", - "weight": 152, + "weight": "152 g", "volume": "1250 ml", "price": 250, "to_hit": -1, @@ -5417,7 +5439,7 @@ "type": "ARMOR", "name": "keikogi", "description": "Plain white keikogi for use in martial arts.", - "weight": 250, + "weight": "250 g", "volume": "750 ml", "price": 2500, "material": [ "cotton" ], @@ -5435,7 +5457,7 @@ "category": "armor", "name": "Kevlar vest", "description": "A lightweight, bullet resistant vest. Suitable for wearing under clothing.", - "weight": 2860, + "weight": "2860 g", "volume": "6 L", "price": 80000, "to_hit": -3, @@ -5455,7 +5477,7 @@ "type": "ARMOR", "name": "kilt", "description": "No true Scotsman would leave home without his kilt.", - "weight": 1814, + "weight": "1814 g", "volume": "1500 ml", "price": 6500, "material": [ "wool" ], @@ -5473,7 +5495,7 @@ "type": "ARMOR", "name": "leather kilt", "description": "No true Scotsman would leave home without his kilt.", - "weight": 1814, + "weight": "1814 g", "volume": "1500 ml", "price": 6500, "material": [ "leather" ], @@ -5491,7 +5513,7 @@ "type": "ARMOR", "name": "kimono", "description": "A traditional, ankle-length Japanese robe, wrapped around the body with a sash.", - "weight": 1200, + "weight": "1200 g", "volume": "5 L", "price": 20000, "to_hit": -5, @@ -5511,7 +5533,7 @@ "type": "ARMOR", "name": "yukata", "description": "An easy to wear, breezy robe secured with a sash. Essentially Japanese pajamas. Great for summer nights.", - "weight": 900, + "weight": "900 g", "volume": "3 L", "price": 5000, "to_hit": -5, @@ -5531,7 +5553,7 @@ "type": "ARMOR", "name": "haori", "description": "A loose coat with wide sleeves that is worn unfastened over a kimono. It is jet black with sparse, tasteful golden embroidery.", - "weight": 800, + "weight": "800 g", "volume": "2 L", "price": 30000, "to_hit": -5, @@ -5551,7 +5573,7 @@ "name": "kippah", "name_plural": "kippahs", "description": "A thin, rounded skullcap. A traditional headdress in Judaism.", - "weight": 80, + "weight": "80 g", "volume": "250 ml", "price": 5000, "material": [ "cotton" ], @@ -5569,7 +5591,7 @@ "name": "kittel", "name_plural": "kittels", "description": "A white, knee-length cotton robe, traditionally worn by Jews on special occasions.", - "weight": 1000, + "weight": "1000 g", "volume": "4 L", "price": 20000, "to_hit": -5, @@ -5591,7 +5613,7 @@ "name": "pair of knee pads", "name_plural": "pairs of knee pads", "description": "A pair of knee pads made of stout plastic and cloth.", - "weight": 210, + "weight": "210 g", "volume": "1500 ml", "price": 2500, "to_hit": 1, @@ -5609,7 +5631,7 @@ "name": "kufi cap", "name_plural": "kufi caps", "description": "A brimless, short and rounded cap.", - "weight": 88, + "weight": "88 g", "volume": "500 ml", "price": 3000, "material": [ "cotton" ], @@ -5627,7 +5649,7 @@ "type": "ARMOR", "name": "leather belt", "description": "A leather belt. Useful for making your pair of pants fit.", - "weight": 102, + "weight": "102 g", "volume": "250 ml", "price": 9000, "bashing": 5, @@ -5654,7 +5676,7 @@ "name": "leather pouch", "name_plural": "leather pouches", "description": "A bag stitched together from leather scraps. Doesn't hold an awful lot but is easy to wear.", - "weight": 610, + "weight": "610 g", "volume": "500 ml", "price": 1000, "to_hit": 1, @@ -5676,7 +5698,7 @@ "name_plural": "ammo pouches", "description": "A small pouch that can be used to store most types of small ammunition, rockets will not fit. Activate to store ammunition.", "looks_like": "leather_pouch", - "weight": 490, + "weight": "490 g", "rigid": false, "volume": "500 ml", "price": 1000, @@ -5747,7 +5769,7 @@ "type": "ARMOR", "name": "leg splint", "description": "A tool to help set bones and hold them in place.", - "weight": 500, + "weight": "500 g", "volume": "1 L", "price": 20000, "material": [ "wood", "cotton" ], @@ -5766,7 +5788,7 @@ "name": "leg splint XL", "description": "A tool to help set bones and hold them in place. It is specifically designed to fit Huge people.", "copy-from": "leg_splint", - "weight": 1000, + "weight": "1000 g", "volume": "2 L", "price": 25000, "encumbrance": 140, @@ -5778,7 +5800,7 @@ "name": "pair of leg warmers", "name_plural": "pairs of leg warmers", "description": "Snug, soft cloth sleeves to keep your legs warm.", - "weight": 46, + "weight": "46 g", "volume": "500 ml", "price": 1000, "material": [ "cotton" ], @@ -5797,7 +5819,7 @@ "name": "pair of XL leg warmers", "name_plural": "pairs of XL leg warmers", "description": "Large, soft, snug cloth sleeves to keep your exotic anatomy warm.", - "weight": 50, + "weight": "50 g", "volume": "750 ml", "price": 20000, "material": [ "cotton" ], @@ -5816,7 +5838,7 @@ "name": "pair of fetlock furs", "name_plural": "pairs of fetlock furs", "description": "Snug fur sleeves to keep your fetlocks warm.", - "weight": 66, + "weight": "66 g", "volume": "750 ml", "price": 25000, "material": [ "fur" ], @@ -5835,7 +5857,7 @@ "name": "leggings", "name_plural": "leggings", "description": "Skin-tight nylon leggings, sometimes used when exercising, that keep your legs nice and warm.", - "weight": 155, + "weight": "155 g", "volume": "500 ml", "price": 1000, "material": [ "cotton", "plastic" ], @@ -5854,7 +5876,7 @@ "name": "pair of hard leg guards", "name_plural": "pairs of hard leg guards", "description": "A pair of polyurethane leg guards with neoprene backing.", - "weight": 625, + "weight": "625 g", "volume": "3 L", "price": 3400, "to_hit": 1, @@ -5876,7 +5898,7 @@ "name": "pair of steel leg guards", "name_plural": "pairs of steel leg guards", "description": "A full assembly of medieval leg protection. Cuisses, poleyns, and greaves, with leather straps to secure each piece and connect it as part of a set.", - "weight": 4080, + "weight": "4080 g", "volume": "6 L", "price": 20000, "to_hit": -1, @@ -5897,7 +5919,7 @@ "name": "pair of iron greaves", "name_plural": "pairs of iron greaves", "description": "A pair of iron leg guards with a simple leather lining.", - "weight": 2260, + "weight": "2260 g", "volume": "5500 ml", "price": 40000, "to_hit": 1, @@ -5917,7 +5939,7 @@ "name": "pair of paper leg guards", "name_plural": "pairs of paper leg guards", "description": "Leg guards made of stacked paper sheets held together with duct tape.", - "weight": 370, + "weight": "370 g", "volume": "500 ml", "price": 230, "to_hit": 1, @@ -5938,7 +5960,7 @@ "name": "pair of scrap leg guards", "name_plural": "pairs of scrap leg guards", "description": "A pair of leg guards made from scraps of metal secured by simple strings; the loose collection of plates provides decent but not the most convenient protection.", - "weight": 3104, + "weight": "3104 g", "volume": "5 L", "price": 20000, "to_hit": -1, @@ -5960,7 +5982,7 @@ "name": "pair of drop leg pouches", "name_plural": "pairs of drop leg pouches", "description": "A set of pouches that can be worn on the thighs using buckled straps. This variety is favored by the military.", - "weight": 205, + "weight": "205 g", "volume": "500 ml", "price": 3000, "material": [ "cotton" ], @@ -5978,7 +6000,7 @@ "type": "ARMOR", "name": "Linux t-shirt", "description": "A t-shirt with a picture of the Tux mascot on it. Underneath it says \"You wouldn't buy a car with the hood welded shut.\"", - "weight": 110, + "weight": "110 g", "volume": "500 ml", "price": 2000, "material": [ "cotton" ], @@ -6030,7 +6052,7 @@ "type": "ARMOR", "name": "loincloth", "description": "Rags stitched together and tied into a makeshift loincloth. Covers your modesty, but not much else.", - "weight": 32, + "weight": "32 g", "volume": "250 ml", "price": 900, "material": [ "cotton" ], @@ -6046,7 +6068,7 @@ "type": "ARMOR", "name": "fur loincloth", "description": "A fur pelt tied into a loincloth. Covers your modesty, but not much else. Now you are a true barbarian warrior.", - "weight": 64, + "weight": "64 g", "volume": "250 ml", "price": 7500, "material": [ "fur" ], @@ -6063,7 +6085,7 @@ "type": "ARMOR", "name": "leather loincloth", "description": "Leather patches stitched together and tied into a makeshift loincloth. Covers your modesty, but not much else.", - "weight": 64, + "weight": "64 g", "volume": "250 ml", "price": 7500, "material": [ "leather" ], @@ -6079,7 +6101,7 @@ "type": "ARMOR", "name": "wool loincloth", "description": "Bits of wool stitched together and tied into a makeshift loincloth. Covers your modesty, but not much else.", - "weight": 56, + "weight": "56 g", "volume": "250 ml", "price": 900, "material": [ "wool" ], @@ -6097,7 +6119,7 @@ "name": "pair of extra long white gloves", "name_plural": "pairs of extra long white gloves", "description": "Long white costume gloves.", - "weight": 400, + "weight": "400 g", "volume": "1 L", "price": 1100, "to_hit": 1, @@ -6115,7 +6137,7 @@ "type": "ARMOR", "name": "long underwear bottom", "description": "A pair of long underwear that help to maintain body temperature.", - "weight": 88, + "weight": "88 g", "volume": "500 ml", "price": 1500, "material": [ "cotton" ], @@ -6133,7 +6155,7 @@ "type": "ARMOR", "name": "long underwear top", "description": "A long underwear top that helps to maintain body temperature.", - "weight": 96, + "weight": "96 g", "volume": "500 ml", "price": 1500, "material": [ "cotton" ], @@ -6152,7 +6174,7 @@ "name": "sleeveless underwear top", "description": "A sleeveless underwear top that helps to maintain body temperature.", "looks_like": "long_undertop", - "weight": 80, + "weight": "80 g", "volume": "400 ml", "price": 1200, "material": [ "cotton" ], @@ -6170,7 +6192,7 @@ "type": "ARMOR", "name": "long-sleeved shirt", "description": "A long-sleeved cotton shirt.", - "weight": 146, + "weight": "146 g", "volume": "750 ml", "price": 2000, "material": [ "cotton" ], @@ -6189,7 +6211,7 @@ "category": "armor", "name": "light survivor body armor", "description": "Lightweight, custom built body armor made from Kevlar and tough fabric. Mostly waterproof.", - "weight": 3000, + "weight": "3000 g", "volume": "6 L", "price": 60000, "material": [ "kevlar", "cotton" ], @@ -6211,7 +6233,7 @@ "name": "light survivor cargo pants", "name_plural": "light survivor cargo pants", "description": "Lightweight, Kevlar armored cargo pants designed to hold as much as possible. Strong and mostly waterproof.", - "weight": 920, + "weight": "920 g", "volume": "3500 ml", "price": 40000, "material": [ "kevlar", "cotton" ], @@ -6221,7 +6243,7 @@ "coverage": 95, "encumbrance": 16, "storage": "2500 ml", - "warmth": 15, + "warmth": 12, "material_thickness": 3, "environmental_protection": 1, "flags": [ "VARSIZE", "WATERPROOF", "POCKETS", "RAINPROOF", "STURDY" ] @@ -6232,7 +6254,7 @@ "category": "armor", "name": "light survivor suit", "description": "A lightweight, hand-built combination armor made from a cut-down bulletproof vest and a reinforced fabric jumpsuit. Protects from the elements as well as from harm.", - "weight": 5100, + "weight": "5100 g", "volume": "10500 ml", "price": 110000, "material": [ "kevlar", "cotton" ], @@ -6253,7 +6275,7 @@ "name": "French maid clothes", "name_plural": "French maid clothes", "description": "The French maid dress, blue with a frilly white apron.", - "weight": 100, + "weight": "100 g", "volume": "250 ml", "price": 5000, "material": [ "cotton" ], @@ -6272,7 +6294,7 @@ "type": "ARMOR", "name": "French maid hat", "description": "A frilly white headpiece.", - "weight": 10, + "weight": "10 g", "volume": "250 ml", "price": 2500, "material": [ "cotton" ], @@ -6291,7 +6313,7 @@ "category": "armor", "name": "ballistic mask", "description": "A protective reinforced Kevlar mask that covers the face. Provides excellent protection from ballistic threats.", - "weight": 512, + "weight": "512 g", "volume": "750 ml", "price": 20000, "to_hit": -3, @@ -6311,7 +6333,7 @@ "type": "ARMOR", "name": "dust mask", "description": "A simple piece of cotton that straps over the mouth. Provides a small amount of protection from airborne illness and dust.", - "weight": 168, + "weight": "168 g", "volume": "100 ml", "price": 800, "to_hit": -3, @@ -6331,7 +6353,7 @@ "category": "armor", "name": "Guy Fawkes mask", "description": "Remember, remember, the fifth of November.", - "weight": 45, + "weight": "45 g", "volume": "750 ml", "price": 4000, "to_hit": -3, @@ -6353,7 +6375,7 @@ "name": "hockey mask", "//": "Jason-type costume masks are much cheaper and less protective.", "description": "A protective face mask made of thick plastic. Commonly worn by hockey goalies.", - "weight": 228, + "weight": "228 g", "volume": "750 ml", "price": 4000, "to_hit": -3, @@ -6373,7 +6395,7 @@ "type": "ARMOR", "name": "rioter mask", "description": "This is a t-shirt with sleeves tied on the back. These are usually worn by rioters to hide their identity.", - "weight": 123, + "weight": "123 g", "volume": "500 ml", "price": 800, "to_hit": -1, @@ -6394,7 +6416,7 @@ "name": "pair of mittens", "name_plural": "pairs of mittens", "description": "A pair of warm mittens. They are extremely cumbersome.", - "weight": 364, + "weight": "364 g", "volume": "750 ml", "price": 2500, "to_hit": 1, @@ -6413,7 +6435,7 @@ "type": "ARMOR", "name": "motorcycle armor", "description": "A suit of armor used by dirt bikers and motorcyclists.", - "weight": 2125, + "weight": "2125 g", "volume": "1 L", "price": 15000, "bashing": 8, @@ -6435,7 +6457,7 @@ "name": "motorcycle pants", "name_plural": "pairs of motorcycle pants", "description": "A pair of pants designed for dirt bikers and motorcyclists.", - "weight": 1340, + "weight": "1340 g", "volume": "750 ml", "price": 10000, "material": [ "kevlar", "cotton" ], @@ -6455,7 +6477,7 @@ "category": "armor", "name": "protective mouthpiece", "description": "A protective piece of equipment commonly used by athletes, which is worn inside the mouth to protect your teeth.", - "weight": 20, + "weight": "20 g", "volume": "430 ml", "price": 800, "bashing": 2, @@ -6472,7 +6494,7 @@ "type": "ARMOR", "name": "nanoskirt", "description": "Apparently the microskirt wasn't short enough.", - "weight": 11, + "weight": "11 g", "volume": "250 ml", "price": 3000, "material": [ "cotton" ], @@ -6489,7 +6511,7 @@ "name": "pair of flame-resistant gloves", "name_plural": "pairs of flame-resistant gloves", "description": "A snug fitting pair of gloves made from thin and lightweight Nomex fire-resistant fabric. Tough yet breathable, they are light and comfortable to wear under clothing.", - "weight": 190, + "weight": "190 g", "volume": "500 ml", "price": 2000, "to_hit": -5, @@ -6509,7 +6531,7 @@ "type": "ARMOR", "name": "flame-resistant hood", "description": "A snug fitting garment that protects your head and neck, made from lightweight Nomex fire-resistant fabric. Tough yet breathable, it is light and comfortable to wear under clothing.", - "weight": 210, + "weight": "210 g", "volume": "500 ml", "price": 5000, "to_hit": -5, @@ -6530,7 +6552,7 @@ "name": "pair of flame-resistant socks", "name_plural": "pairs of flame-resistant socks", "description": "A snug fitting pair of stockings made from thin and lightweight Nomex fire-resistant fabric. Tough yet breathable, they are light and comfortable to wear under clothing.", - "weight": 200, + "weight": "200 g", "volume": "750 ml", "price": 2000, "to_hit": -5, @@ -6550,7 +6572,7 @@ "type": "ARMOR", "name": "flame-resistant suit", "description": "A snug body suit made from thin and lightweight Nomex fire-resistant fabric. Tough yet breathable, it is light and comfortable to wear under clothing.", - "weight": 688, + "weight": "688 g", "volume": "1500 ml", "price": 13000, "to_hit": -5, @@ -6570,7 +6592,7 @@ "type": "ARMOR", "name": "obi", "description": "A broad, black obi gi.", - "weight": 200, + "weight": "200 g", "volume": "250 ml", "price": 2000, "to_hit": -1, @@ -6583,7 +6605,7 @@ "type": "ARMOR", "name": "FB51 optical cloak", "description": "A plastic cloak embedded with cameras and LEDs that will render you fully invisible to normal vision when powered and worn. You must be carrying a unified power supply, or UPS, to use it. Activate to toggle visibility.", - "weight": 1552, + "weight": "1552 g", "volume": "3500 ml", "price": 5500000, "to_hit": -1, @@ -6609,7 +6631,7 @@ "name": "panties", "name_plural": "panties", "description": "Underwear designed to be worn by women. Preserves your modesty in desperate times.", - "weight": 32, + "weight": "32 g", "volume": "250 ml", "price": 1000, "material": [ "cotton" ], @@ -6627,7 +6649,7 @@ "name": "pants", "name_plural": "pants", "description": "A pair of khaki pants. Slightly warmer than jeans.", - "weight": 560, + "weight": "560 g", "volume": "2 L", "price": 4900, "to_hit": 1, @@ -6648,7 +6670,7 @@ "name": "army pants", "name_plural": "army pants", "description": "A tough pair of pants lined with pockets. Favored by the military.", - "weight": 720, + "weight": "720 g", "volume": "2500 ml", "price": 3500, "material": [ "cotton", "plastic" ], @@ -6668,7 +6690,7 @@ "name": "cargo pants", "name_plural": "cargo pants", "description": "A pair of pants lined with pockets, offering lots of storage.", - "weight": 670, + "weight": "670 g", "volume": "2250 ml", "price": 2500, "material": [ "cotton" ], @@ -6688,7 +6710,7 @@ "name": "checkered pants", "name_plural": "checkered pants", "description": "In a pinch, these pants can be used for an impromptu game of checkers.", - "weight": 630, + "weight": "630 g", "volume": "1250 ml", "price": 4000, "material": [ "cotton" ], @@ -6708,7 +6730,7 @@ "name": "pair of fur leggings", "name_plural": "pairs of fur leggings", "description": "Snug fur sleeves to keep your legs warm. Simple yet effective since prehistoric times.", - "weight": 694, + "weight": "694 g", "volume": "1500 ml", "price": 1500, "material": [ "fur" ], @@ -6727,7 +6749,7 @@ "name": "fur pants", "name_plural": "fur pants", "description": "A hefty pair of fur-lined pants.", - "weight": 920, + "weight": "920 g", "volume": "4 L", "price": 20000, "to_hit": 1, @@ -6759,7 +6781,7 @@ "name": "leather pants", "name_plural": "leather pants", "description": "A pair of black leather pants. Very tough, but cumbersome and without much storage.", - "weight": 980, + "weight": "980 g", "volume": "2500 ml", "price": 12000, "to_hit": 1, @@ -6780,7 +6802,7 @@ "name": "ski pants", "name_plural": "ski pants", "description": "A pair of pants meant for alpine skiing.", - "weight": 450, + "weight": "450 g", "volume": "2 L", "price": 6500, "material": [ "cotton" ], @@ -6802,7 +6824,7 @@ "name": "survivor cargo pants", "name_plural": "survivor cargo pants", "description": "A pair of Kevlar armored pants covered with pouches and pockets. Custom built to be durable, comfortable, and easy to wear.", - "weight": 2100, + "weight": "2100 g", "volume": "3 L", "price": 38000, "material": [ "cotton", "kevlar" ], @@ -6812,7 +6834,7 @@ "coverage": 100, "encumbrance": 20, "storage": "3500 ml", - "warmth": 10, + "warmth": 15, "material_thickness": 4, "environmental_protection": 3, "flags": [ "VARSIZE", "POCKETS", "STURDY", "WATERPROOF" ] @@ -6822,7 +6844,7 @@ "type": "ARMOR", "name": "peacoat", "description": "A heavy wool coat. Cumbersome, but warm and with deep pockets.", - "weight": 1800, + "weight": "1800 g", "volume": "3 L", "price": 18000, "to_hit": -3, @@ -6842,7 +6864,7 @@ "type": "ARMOR", "name": "pearl collar", "description": "A collar made from round and lustrous pearls, its former owner must be a wealthy individual.", - "weight": 30, + "weight": "30 g", "volume": "300 ml", "price": 590000, "price_postapoc": 2000, @@ -6858,7 +6880,7 @@ "name": "pickelhaube", "name_plural": "pickelhauben", "description": "A spiked helmet once worn by German military officers. The spike is very sharp.", - "weight": 980, + "weight": "980 g", "volume": "1750 ml", "price": 24000, "to_hit": -3, @@ -6879,7 +6901,7 @@ "type": "ARMOR", "name": "plastic shopping bag", "description": "A bag used to carry groceries home.", - "weight": 2, + "weight": "2 g", "volume": "250 ml", "price": 1, "to_hit": -2, @@ -6899,7 +6921,7 @@ "name": "police duty belt", "description": "Black leather belt used by police officers. It has several pouches and a holder for a baton.", "looks_like": "fireman_belt", - "weight": 250, + "weight": "250 g", "volume": "2 L", "price": 10000, "bashing": 5, @@ -6925,7 +6947,7 @@ "type": "ARMOR", "name": "polo shirt", "description": "A short-sleeved cotton shirt, slightly thicker than a t-shirt.", - "weight": 136, + "weight": "136 g", "volume": "750 ml", "price": 1500, "material": [ "cotton" ], @@ -6943,7 +6965,7 @@ "type": "ARMOR", "name": "wool poncho", "description": "A simple wool garment worn over the torso. Provides a bit of protection.", - "weight": 907, + "weight": "907 g", "volume": "1250 ml", "price": 12000, "to_hit": -1, @@ -6963,7 +6985,7 @@ "type": "ARMOR", "name": "porkpie hat", "description": "A flat-topped hat with circular indent and a narrow brim. Most popular in the 40s and 50s, still common among those in the mod scene, hipsters, and people named Heisenberg.", - "weight": 213, + "weight": "213 g", "volume": "1250 ml", "price": 5500, "material": [ "cotton" ], @@ -6982,7 +7004,7 @@ "type": "ARMOR", "name": "mail carrier hat", "description": "A traditional mail carrier's cap, with the US postal service logo embroidered on the front above the plastic cap. A symbol of a bygone world.", - "weight": 90, + "weight": "90 g", "volume": "750 ml", "price": 1000, "material": [ "cotton", "plastic" ], @@ -7001,7 +7023,7 @@ "type": "ARMOR", "name": "mail carrier shirt", "description": "A light blue button down shirt with a couple of pockets in front and the US postal service logo embroidered on it.", - "weight": 110, + "weight": "110 g", "volume": "500 ml", "price": 1500, "material": [ "cotton" ], @@ -7020,7 +7042,7 @@ "name": "mail carrier shorts", "name_plural": "mail carrier shorts", "description": "A pair of dark blue shorts, the kind used by postal service workers.", - "weight": 230, + "weight": "230 g", "volume": "1 L", "price": 4000, "to_hit": 1, @@ -7040,7 +7062,7 @@ "category": "armor", "name": "pot helmet", "description": "A helmet made from a soup pot. It's not very good protection, but it's better than nothing.", - "weight": 760, + "weight": "760 g", "volume": "2 L", "price": 4500, "bashing": 10, @@ -7060,7 +7082,7 @@ "type": "ARMOR", "name": "quiver", "description": "A leather quiver worn at the waist that can hold 20 arrows. Activate to store arrows.", - "weight": 260, + "weight": "260 g", "volume": "500 ml", "price": 6500, "bashing": 2, @@ -7079,7 +7101,7 @@ "type": "ARMOR", "name": "birchbark quiver", "description": "A quiver woven from strips of birch bark, worn at the waist, that can hold 20 arrows. Activate to store arrows.", - "weight": 490, + "weight": "490 g", "volume": "500 ml", "price": 6500, "bashing": 2, @@ -7098,7 +7120,7 @@ "type": "ARMOR", "name": "large quiver", "description": "A large leather quiver trimmed with metal, worn on the back, that can hold 60 arrows. Historically used by horse archers, rather than foot archers, but neither of THEM had to fight zombies. Activate to store arrows.", - "weight": 920, + "weight": "920 g", "volume": "1500 ml", "price": 8800, "bashing": 4, @@ -7117,7 +7139,7 @@ "type": "ARMOR", "name": "large birchbark quiver", "description": "A large quiver woven from strips of birchbark, worn on the back, that can hold 60 arrows. Activate to store arrows.", - "weight": 1380, + "weight": "1380 g", "volume": "1500 ml", "price": 8800, "bashing": 4, @@ -7137,7 +7159,7 @@ "name": "pouch", "name_plural": "pouches", "description": "A makeshift bag, cobbled together from rags. Really gets in the way, but provides a decent amount of storage.", - "weight": 560, + "weight": "560 g", "volume": "500 ml", "price": 1000, "to_hit": 1, @@ -7158,7 +7180,7 @@ "name": "robe", "name_plural": "robes", "description": "A loose-fitting outer garment with sleeves, and a mysterious amount of well-hidden pockets.", - "weight": 1000, + "weight": "1000 g", "volume": "5 L", "price": 5000, "to_hit": -5, @@ -7178,7 +7200,7 @@ "type": "ARMOR", "name": "scabbard", "description": "A large, adjustable sheath for holding swords and other large blades. Activate to sheathe/draw a weapon.", - "weight": 1360, + "weight": "1360 g", "volume": "1750 ml", "price": 6000, "bashing": 4, @@ -7203,7 +7225,7 @@ "type": "ARMOR", "name": "shark suit", "description": "A one piece chainmail suit used by scuba divers for protection against shark bites. It comes with attached plastic helmet and booties.", - "weight": 3150, + "weight": "3150 g", "volume": "3500 ml", "price": 35000, "to_hit": -1, @@ -7222,7 +7244,7 @@ "type": "ARMOR", "name": "faraday shark suit", "description": "A one piece chainmail suit used by scuba divers for protection against shark bites. It has been conductively interconnected, protecting against electricity.", - "weight": 3250, + "weight": "3250 g", "volume": "3500 ml", "price": 35000, "to_hit": -1, @@ -7242,7 +7264,7 @@ "name": "sheath", "name_plural": "sheathes", "description": "A leather sheath for holding knives and other small blades. It is easy to use without much practice. Activate to sheathe/draw a weapon.", - "weight": 200, + "weight": "200 g", "volume": "500 ml", "price": 3500, "material": [ "leather" ], @@ -7266,7 +7288,7 @@ "type": "ARMOR", "name": "sheet", "description": "A large fabric sheet, could be used as a curtain or bedsheets; or cut up for a bunch of rags.", - "weight": 771, + "weight": "771 g", "volume": "5 L", "price": 2000, "to_hit": -1, @@ -7285,7 +7307,7 @@ "type": "ARMOR", "name": "sheriff's shirt", "description": "A tan button-down shirt with long sleeves.", - "weight": 250, + "weight": "250 g", "volume": "750 ml", "price": 1100, "material": [ "cotton" ], @@ -7305,7 +7327,7 @@ "name": "shorts", "name_plural": "shorts", "description": "A pair of khaki shorts.", - "weight": 230, + "weight": "230 g", "volume": "1 L", "price": 2000, "to_hit": 1, @@ -7326,7 +7348,7 @@ "name": "cargo shorts", "name_plural": "cargo shorts", "description": "A pair of shorts lined with pockets, offering decent storage.", - "weight": 340, + "weight": "340 g", "volume": "1500 ml", "price": 4000, "to_hit": 1, @@ -7347,7 +7369,7 @@ "name": "denim shorts", "name_plural": "denim shorts", "description": "A pair of denim shorts. Thick and tough, they provide excellent protection from cuts.", - "weight": 260, + "weight": "260 g", "volume": "1250 ml", "price": 2000, "to_hit": 1, @@ -7367,7 +7389,7 @@ "type": "ARMOR", "name": "skinny tie", "description": "A skinny black and white checkered necktie.", - "weight": 12, + "weight": "12 g", "volume": 0, "price": 750, "material": [ "cotton" ], @@ -7375,12 +7397,33 @@ "color": "dark_gray", "flags": [ "FANCY" ] }, + { + "id": "ski_jacket", + "type": "ARMOR", + "name": "ski jacket", + "description": "An insulated, breathable hoodie made for alpine skiing. Very warm, and with sizable pockets.", + "weight": 1105, + "volume": "5 L", + "price": 18000, + "material": [ "cotton", "plastic" ], + "symbol": "[", + "color": "light_blue", + "covers": [ "TORSO", "ARMS" ], + "coverage": 95, + "encumbrance": 22, + "storage": 8, + "warmth": 80, + "material_thickness": 5, + "environmental_protection": 3, + "flags": [ "VARSIZE", "POCKETS", "HOOD", "COLLAR", "OUTER" ], + "looks_like": "coat_winter" + }, { "id": "skirt", "type": "ARMOR", "name": "skirt", "description": "A short, breezy cotton skirt. Easy to move in, but only has a single small pocket.", - "weight": 74, + "weight": "74 g", "volume": "250 ml", "price": 6500, "material": [ "cotton" ], @@ -7398,7 +7441,7 @@ "type": "ARMOR", "name": "leather skirt", "description": "A very short leather skirt, clearly designed to look good, not be practical.", - "weight": 230, + "weight": "230 g", "volume": "250 ml", "price": 9500, "material": [ "leather" ], @@ -7416,7 +7459,7 @@ "type": "ARMOR", "name": "sleeping bag", "description": "A large sleeping bag that covers you head to toe.", - "weight": 981, + "weight": "981 g", "volume": "3500 ml", "price": 20500, "to_hit": -1, @@ -7442,7 +7485,7 @@ "type": "ARMOR", "name": "rolled sleeping bag", "description": "A large sleeping bag rolled up for transport. It has a strap to carry it with.", - "weight": 981, + "weight": "981 g", "volume": "1 L", "price": 20500, "to_hit": -1, @@ -7461,7 +7504,7 @@ "type": "ARMOR", "name": "fur sleeping bag", "description": "A large sleeping bag lined with fur. Who needs a tent?", - "weight": 1175, + "weight": "1175 g", "volume": "4500 ml", "price": 32500, "to_hit": -1, @@ -7487,7 +7530,7 @@ "type": "ARMOR", "name": "rolled fur sleeping bag", "description": "A large sleeping bag lined with fur, rolled for transport. It has a strap to carry it with.", - "weight": 1175, + "weight": "1175 g", "volume": "2 L", "price": 32500, "to_hit": -1, @@ -7512,7 +7555,7 @@ "name": "sleeveless duster", "//": "The general guideline for sleeveless dusters is the components, volume, weight, time to craft, and value are 15% lower (rounded down) than the original. Making it from an original takes 50% the time.", "description": "A rugged full-length duster that leaves your arms unencumbered. Has plenty of storage space due to its many pockets.", - "weight": 857, + "weight": "857 g", "volume": "4500 ml", "price": 13175, "to_hit": -1, @@ -7534,7 +7577,7 @@ "name": "sleeveless fur duster", "//": "The general guideline for sleeveless dusters is the components, volume, weight, time to craft, and value are 15% lower (rounded down) than the original. Making it from an original takes 50% the time.", "description": "A thick fur full-length duster without sleeves, leaving your arms unencumbered. Has plenty of storage space due to its many pockets.", - "weight": 2007, + "weight": "2007 g", "volume": "8250 ml", "price": 83215, "to_hit": -1, @@ -7567,7 +7610,7 @@ "name": "sleeveless leather duster", "//": "The general guideline for sleeveless dusters is the components, volume, weight, time to craft, and value are 15% lower (rounded down) than the original. Making it from an original takes 50% the time.", "description": "A thick leather full-length duster without sleeves, leaving your arms unencumbered. Has plenty of storage space due to its many pockets.", - "weight": 2257, + "weight": "2257 g", "volume": "6 L", "price": 20825, "to_hit": -1, @@ -7590,7 +7633,7 @@ "name": "sleeveless survivor duster", "//": "The general guideline for sleeveless dusters is the components, volume, weight, time to craft, and value are 15% lower (rounded down) than the original. Making it from an original takes 50% the time.", "description": "A custom Kevlar armored full-length duster without sleeves, covered with pouches and pockets. Comfortable, durable, and great for storage.", - "weight": 2203, + "weight": "2203 g", "volume": "8 L", "price": 34000, "to_hit": -1, @@ -7612,7 +7655,7 @@ "name": "sleeveless trenchcoat", "//": "The general guideline for sleeveless trenchcoats is the components, volume, weight, time to craft, and value are 15% lower (rounded down) than the original. Making it from an original takes 50% the time.", "description": "A thin cotton trenchcoat that leaves your arms unencumbered. Has plenty of storage space due to its many pockets.", - "weight": 635, + "weight": "635 g", "volume": "3750 ml", "price": 13175, "to_hit": -1, @@ -7634,7 +7677,7 @@ "name": "sleeveless fur trenchcoat", "//": "The general guideline for sleeveless trenchcoats is the components, volume, weight, time to craft, and value are 15% lower (rounded down) than the original. Making it from an original takes 50% the time.", "description": "A thick fur trenchcoat without sleeves, leaving your arms unencumbered. Has plenty of storage space due to its many pockets.", - "weight": 1487, + "weight": "1487 g", "volume": "6750 ml", "price": 83215, "to_hit": -1, @@ -7667,7 +7710,7 @@ "name": "sleeveless leather trenchcoat", "//": "The general guideline for sleeveless trenchcoats is the components, volume, weight, time to craft, and value are 15% lower (rounded down) than the original. Making it from an original takes 50% the time.", "description": "A thick leather trenchcoat without sleeves, leaving your arms unencumbered. Has plenty of storage space due to its many pockets.", - "weight": 1672, + "weight": "1672 g", "volume": "4250 ml", "price": 20825, "to_hit": -1, @@ -7690,7 +7733,7 @@ "name": "sleeveless survivor trenchcoat", "//": "The general guideline for sleeveless trenchcoats is the components, volume, weight, time to craft, and value are 15% lower (rounded down) than the original. Making it from an original takes 50% the time.", "description": "A custom Kevlar armored trenchcoat without sleeves, covered with pouches and pockets. Comfortable, durable, and great for storage.", - "weight": 1632, + "weight": "1632 g", "volume": "6 L", "price": 34000, "to_hit": -1, @@ -7711,7 +7754,7 @@ "type": "ARMOR", "name": "sleeveless tunic", "description": "A sleeveless cloth garment that covers the torso and legs.", - "weight": 240, + "weight": "240 g", "volume": "1 L", "price": 4000, "to_hit": -5, @@ -7730,7 +7773,7 @@ "type": "ARMOR", "name": "snuggie", "description": "Perfect for reading all those books you scavenged.", - "weight": 625, + "weight": "625 g", "volume": "3 L", "price": 3600, "to_hit": -1, @@ -7751,7 +7794,7 @@ "name": "pair of sock mitts", "name_plural": "pairs of sock mitts", "description": "A pair of improvised gloves made from socks with holes poked through them.", - "weight": 32, + "weight": "32 g", "volume": "250 ml", "price": 0, "material": [ "cotton" ], @@ -7769,7 +7812,7 @@ "name": "pair of socks", "name_plural": "pairs of socks", "description": "Socks. Put 'em on your feet.", - "weight": 32, + "weight": "32 g", "volume": "250 ml", "price": 200, "material": [ "cotton" ], @@ -7787,7 +7830,7 @@ "name": "pair of bag socks", "name_plural": "pairs of bag socks", "description": "A pair of disposable plastic bags, adapted to be used as socks.", - "weight": 6, + "weight": "6 g", "volume": "250 ml", "price": 50, "material": [ "plastic" ], @@ -7805,7 +7848,7 @@ "name": "pair of disposable bowling socks", "name_plural": "pairs of disposable bowling socks", "description": "Cheap one time socks. Can keep your feet clean, but too thin to give any protection.", - "weight": 20, + "weight": "20 g", "volume": "250 ml", "price": 50, "material": [ "cotton" ], @@ -7822,7 +7865,7 @@ "name": "pair of wool socks", "name_plural": "pairs of wool socks", "description": "Warm socks made of wool.", - "weight": 44, + "weight": "44 g", "volume": "250 ml", "price": 1200, "material": [ "wool" ], @@ -7840,7 +7883,7 @@ "type": "ARMOR", "name": "sports bra", "description": "A sturdy nylon bra to provide additional support during physical movement. Typically worn when exercising, it clings to the skin and is easy to wear.", - "weight": 92, + "weight": "92 g", "volume": "500 ml", "price": 4200, "material": [ "cotton", "plastic" ], @@ -7857,7 +7900,7 @@ "type": "ARMOR", "name": "WS-47G moisture retention suit", "description": "The WebbStar moisture retention suit utilizes advanced technology to prevent up to 30% of moisture loss through perspiration. The suit is powered by the micro-motions of the body, especially breathing and walking motions. Because of this your walking speed is impaired while wearing it.", - "weight": 3481, + "weight": "3481 g", "volume": "7500 ml", "price": 4500000, "material": [ "plastic", "neoprene" ], @@ -7876,7 +7919,7 @@ "name": "pair of stockings", "name_plural": "pairs of stockings", "description": "Long cotton socks that reach above the knees to help protect from the cold.", - "weight": 90, + "weight": "90 g", "volume": "250 ml", "price": 500, "material": [ "cotton" ], @@ -7895,7 +7938,7 @@ "name": "pair of tentacle sleeves", "name_plural": "pairs of tentacle sleeves", "description": "Long cotton tubes sized to fit over tentacles and help protect them from the cold.", - "weight": 360, + "weight": "360 g", "volume": "1500 ml", "price": 400, "material": [ "cotton" ], @@ -7914,7 +7957,7 @@ "name": "pair of tentacle stockings", "name_plural": "pairs of tentacle stockings", "description": "Six long cotton tubes sized to fit over tentacles and help protect them from the cold.", - "weight": 270, + "weight": "270 g", "volume": "1500 ml", "price": 1200, "material": [ "cotton" ], @@ -7932,7 +7975,7 @@ "type": "ARMOR", "name": "straw basket", "description": "Hand made straw basket. Carry it with you for extra storage.", - "weight": 100, + "weight": "100 g", "volume": "2500 ml", "price": 200, "to_hit": -1, @@ -7951,7 +7994,7 @@ "type": "ARMOR", "name": "straw hat", "description": "Hat that is woven out of straw. Its brim helps keep the sun out of your eyes.", - "weight": 50, + "weight": "50 g", "volume": "750 ml", "price": 300, "material": [ "paper" ], @@ -7970,7 +8013,7 @@ "name": "striped pants", "name_plural": "striped pants", "description": "A pair of pants with horizontal black and white stripes.", - "weight": 560, + "weight": "560 g", "volume": "2 L", "price": 500, "to_hit": 1, @@ -7990,7 +8033,7 @@ "type": "ARMOR", "name": "striped shirt", "description": "A long-sleeved shirt with horizontal black and white stripes.", - "weight": 146, + "weight": "146 g", "volume": "750 ml", "price": 500, "material": [ "cotton" ], @@ -8008,7 +8051,7 @@ "type": "ARMOR", "name": "subject suit", "description": "A thin, short-sleeved and short-legged one-piece suit. Judging by the odd tailoring and adjustment points... maybe you don't want to know who wore it. Provides nominal storage and is not very encumbering.", - "weight": 810, + "weight": "810 g", "volume": "5 L", "price": 11000, "to_hit": -3, @@ -8028,7 +8071,7 @@ "type": "ARMOR", "name": "suit", "description": "A full-body cotton suit. Makes the apocalypse a truly gentlemanly experience.", - "weight": 1587, + "weight": "1587 g", "volume": "4750 ml", "price": 20000, "to_hit": -5, @@ -8049,7 +8092,7 @@ "name": "suitcase", "//": "You drag it along with you, so it taking a hit is Rare.", "description": "A huge wheeled suitcase used mainly for transporting clothes and other possessions during trips, provides a decent amount of storage but hauling it around is neither fast nor comfortable.", - "weight": 5000, + "weight": "5000 g", "volume": "25 L", "price": 21000, "material": [ "plastic" ], @@ -8067,7 +8110,7 @@ "type": "ARMOR", "name": "suitcase", "description": "A mid-sized suitcase used mainly for transporting clothes and other possessions during trips, provides a decent amount of storage but hauling it around is not exactly comfortable.", - "weight": 900, + "weight": "900 g", "volume": "2500 ml", "price": 21000, "material": [ "cotton" ], @@ -8086,7 +8129,7 @@ "name": "sundress", "name_plural": "sundresses", "description": "A light and breezy cotton dress. Though cool and comfortable to wear, it lacks any storage space.", - "weight": 60, + "weight": "60 g", "volume": "1 L", "price": 4000, "to_hit": -5, @@ -8104,7 +8147,7 @@ "name": "pair of sunglasses", "name_plural": "pairs of sunglasses", "description": "A pair of sunglasses, good for keeping the glare out of your eyes.", - "weight": 35, + "weight": "35 g", "volume": "250 ml", "price": 5000, "to_hit": -2, @@ -8124,7 +8167,7 @@ "type": "ARMOR", "name": "survivor belt", "description": "A custom-built leather utility belt covered with straps and pouches with a sheath to carry a smaller blade. Durable and carefully crafted to be comfortable to wear. Activate to sheathe/draw a weapon.", - "weight": 1249, + "weight": "1249 g", "volume": "2250 ml", "price": 15000, "material": [ "leather" ], @@ -8152,7 +8195,7 @@ "name": "survivor goggles", "name_plural": "pairs of survivor goggles", "description": "A custom-built pair of armored goggles with tinted lenses. Comfortable and built to last, they provide excellent protection from environmental dangers.", - "weight": 212, + "weight": "212 g", "volume": "250 ml", "price": 7500, "to_hit": -2, @@ -8174,7 +8217,7 @@ "category": "armor", "name": "survivor suit", "description": "A hand-built combination armor made from a bulletproof vest and a reinforced leather jumpsuit. Protects from the elements as well as from harm.", - "weight": 6800, + "weight": "6800 g", "volume": "11500 ml", "price": 150000, "material": [ "kevlar", "leather" ], @@ -8194,7 +8237,7 @@ "type": "ARMOR", "name": "swag bag", "description": "A large canvas sack, re-purposed for makeshift storage. Goes well with a striped shirt and a domino mask.", - "weight": 415, + "weight": "415 g", "volume": "1 L", "price": 0, "to_hit": -5, @@ -8215,7 +8258,7 @@ "name": "SWAT armor", "//": "This is well within the pricing structure I found for ballistic vest, shins, and LBE. LEO gear ain't cheap.", "description": "A suit of black bulletproof armor with lots of pockets. The word SWAT is emblazoned across the back.", - "weight": 7800, + "weight": "7800 g", "volume": "13 L", "price": 285000, "to_hit": -3, @@ -8237,7 +8280,7 @@ "type": "ARMOR", "name": "sweater", "description": "A wool shirt. Provides warmth.", - "weight": 344, + "weight": "344 g", "volume": "2 L", "price": 4500, "material": [ "wool" ], @@ -8255,7 +8298,7 @@ "type": "ARMOR", "name": "sweatshirt", "description": "A thick cotton shirt. Provides warmth and a bit of padding.", - "weight": 244, + "weight": "244 g", "volume": "3500 ml", "price": 1800, "material": [ "cotton" ], @@ -8274,7 +8317,7 @@ "name": "pair of tabi", "name_plural": "pairs of tabi", "description": "A pair of black tabi, as worn with traditional Japanese clothes.", - "weight": 50, + "weight": "50 g", "volume": "250 ml", "price": 2500, "material": [ "cotton" ], @@ -8292,7 +8335,7 @@ "name": "pair of gi tabi", "name_plural": "pairs of gi tabi", "description": "A pair of white tabi, as used by martial arts practitioners.", - "weight": 50, + "weight": "50 g", "volume": "250 ml", "price": 2500, "material": [ "cotton" ], @@ -8310,7 +8353,7 @@ "category": "armor", "name": "tactical full helmet", "description": "An all-encompassing black helmet that covers your entire face and neck, providing excellent protection from all sorts of damage.", - "weight": 1324, + "weight": "1324 g", "volume": "2 L", "price": 50000, "to_hit": -1, @@ -8333,7 +8376,7 @@ "category": "armor", "name": "tactical helmet", "description": "A lightweight black helmet that provides excellent protection from all sorts of damage.", - "weight": 1110, + "weight": "1110 g", "volume": "2 L", "price": 37000, "to_hit": -1, @@ -8354,7 +8397,7 @@ "type": "ARMOR", "name": "tank top", "description": "A sleeveless cotton shirt. Very easy to move in.", - "weight": 78, + "weight": "78 g", "volume": "250 ml", "price": 500, "material": [ "cotton" ], @@ -8371,7 +8414,7 @@ "name": "work pants", "name_plural": "pairs of work pants", "description": "A pair of gray work pants.", - "weight": 520, + "weight": "520 g", "volume": "2 L", "price": 5000, "to_hit": 1, @@ -8396,7 +8439,7 @@ "type": "ARMOR", "name": "work t-shirt", "description": "A gray work t-shirt with a small front pocket.", - "weight": 64, + "weight": "64 g", "volume": "250 ml", "price": 1000, "material": [ "cotton" ], @@ -8421,7 +8464,7 @@ "name": "thawb", "name_plural": "thawb", "description": "A long, loose-fitting robe with wide sleeves, a traditional Arab garment.", - "weight": 1200, + "weight": "1200 g", "volume": "4500 ml", "price": 10000, "to_hit": -5, @@ -8441,7 +8484,7 @@ "type": "ARMOR", "name": "bow tie", "description": "A simple black bow tie. Best worn with a suit.", - "weight": 5, + "weight": "5 g", "volume": 0, "price": 1000, "material": [ "cotton" ], @@ -8454,7 +8497,7 @@ "type": "ARMOR", "name": "clip-on tie", "description": "A clip-on necktie, with blue and silver stripes. It's quick and easy to put on, and much better than the necktie.", - "weight": 10, + "weight": "10 g", "volume": 0, "price": 500, "material": [ "cotton" ], @@ -8467,7 +8510,7 @@ "type": "ARMOR", "name": "necktie", "description": "An ordinary, green necktie. It's more difficult to put on, but it takes real skill to do so. Wearing a necktie is much better than wearing a clip-on tie.", - "weight": 15, + "weight": "15 g", "volume": 0, "price": 1000, "material": [ "cotton" ], @@ -8481,7 +8524,7 @@ "name": "tights", "name_plural": "tights", "description": "A snug cloth garment which clings tightly to the legs and feet to protect them from the cold.", - "weight": 114, + "weight": "114 g", "volume": "250 ml", "price": 2000, "material": [ "cotton" ], @@ -8499,7 +8542,7 @@ "category": "armor", "name": "tinfoil hat", "description": "A sheet of aluminum foil that has been molded into a form-fitting hat. Perfect for protecting yourself from the government, Illuminati, aliens, and THEM.", - "weight": 16, + "weight": "16 g", "volume": "250 ml", "price": 16, "material": [ "aluminum" ], @@ -8514,7 +8557,7 @@ "type": "ARMOR", "name": "tool belt", "description": "A common belt with pockets and four small belt loops. Widely used by handymen and electricians.", - "weight": 960, + "weight": "960 g", "volume": "1750 ml", "price": 4500, "bashing": 5, @@ -8544,7 +8587,7 @@ "name": "top hat", "//": "No, you're not wearing anything over your top hat.", "description": "The only hat for a gentleman. Look exquisite while laughing in the face of danger!", - "weight": 233, + "weight": "233 g", "volume": "2500 ml", "price": 19500, "material": [ "cotton" ], @@ -8563,7 +8606,7 @@ "type": "ARMOR", "name": "leather touring suit", "description": "A thick leather body suit made for protection while riding motorcycles. Light and very comfortable.", - "weight": 2214, + "weight": "2214 g", "volume": "6500 ml", "price": 58000, "to_hit": -5, @@ -8585,7 +8628,7 @@ "type": "ARMOR", "name": "trenchcoat", "description": "A thin cotton trenchcoat, lined with pockets. Great for storage.", - "weight": 830, + "weight": "830 g", "volume": "4250 ml", "price": 15500, "to_hit": -1, @@ -8606,7 +8649,7 @@ "type": "ARMOR", "name": "fur trenchcoat", "description": "A thick fur trenchcoat, lined with pockets. Great for storage.", - "weight": 1750, + "weight": "1750 g", "volume": "7250 ml", "price": 97900, "to_hit": -1, @@ -8638,7 +8681,7 @@ "type": "ARMOR", "name": "leather trenchcoat", "description": "A thick leather trenchcoat, lined with pockets. Great for storage.", - "weight": 1967, + "weight": "1967 g", "volume": "5250 ml", "price": 24500, "to_hit": -1, @@ -8660,7 +8703,7 @@ "category": "armor", "name": "survivor trenchcoat", "description": "A Kevlar armored custom trenchcoat, covered with pouches and pockets. Comfortable, durable, and great for storage.", - "weight": 1920, + "weight": "1920 g", "volume": "7 L", "price": 40000, "to_hit": -1, @@ -8681,7 +8724,7 @@ "type": "ARMOR", "name": "tricorne", "description": "A classic design, the \"tricorne\", or three-cornered hat, simply pins a large and floppy brim out of the way, though this example adds well-embroidered designs and is oiled against water. Whether you're the \"guvnah\" of a settlement, or the captain of a post-apocalyptic crew, this is the hat for you.", - "weight": 490, + "weight": "490 g", "volume": "2 L", "price": 7500, "material": [ "leather" ], @@ -8701,7 +8744,7 @@ "name": "pair of swimming trunks", "name_plural": "pairs of swimming trunks", "description": "A pair of swimming trunks, with netting.", - "weight": 210, + "weight": "210 g", "volume": "750 ml", "price": 1800, "to_hit": 1, @@ -8718,7 +8761,7 @@ "type": "ARMOR", "name": "t-shirt", "description": "A short-sleeved cotton shirt.", - "weight": 110, + "weight": "110 g", "volume": "500 ml", "price": 800, "material": [ "cotton" ], @@ -8735,7 +8778,7 @@ "type": "ARMOR", "name": "t-shirt", "description": "A short-sleeved cotton shirt.", - "weight": 110, + "weight": "110 g", "volume": "500 ml", "price": 800, "material": [ "cotton" ], @@ -8802,7 +8845,7 @@ "type": "ARMOR", "name": "tunic", "description": "A simple garment long enough to cover down to the knees.", - "weight": 250, + "weight": "250 g", "volume": "1250 ml", "price": 4200, "to_hit": -5, @@ -8821,7 +8864,7 @@ "type": "ARMOR", "name": "rag tunic", "description": "A poorly made long tunic with a string tied around the waist to keep it all in place.", - "weight": 683, + "weight": "683 g", "volume": "1 L", "price": 70, "material": [ "cotton" ], @@ -8839,7 +8882,7 @@ "type": "ARMOR", "name": "turban", "description": "Rags worn around the head.", - "weight": 110, + "weight": "110 g", "volume": "250 ml", "price": 85, "to_hit": -1, @@ -8858,7 +8901,7 @@ "type": "ARMOR", "name": "headscarf", "description": "A loose cloth worn over the head and around the neck.", - "weight": 70, + "weight": "70 g", "volume": "250 ml", "price": 85, "to_hit": -1, @@ -8877,7 +8920,7 @@ "type": "ARMOR", "name": "tuxedo", "description": "A full-body tuxedo. Makes the apocalypse feel a little more classy.", - "weight": 1587, + "weight": "1587 g", "volume": "5500 ml", "price": 21000, "to_hit": -5, @@ -8897,7 +8940,7 @@ "type": "ARMOR", "name": "compression top", "description": "Nylon sportswear that clings to your chest and maintains body temperature.", - "weight": 92, + "weight": "92 g", "volume": "250 ml", "price": 2000, "material": [ "cotton", "plastic" ], @@ -8915,7 +8958,7 @@ "name": "compression shorts", "name_plural": "compression shorts", "description": "Nylon sportswear that clings to your upper legs, aiding muscle tone and maintaining warmth.", - "weight": 82, + "weight": "82 g", "volume": "250 ml", "price": 2000, "material": [ "cotton", "plastic" ], @@ -8932,7 +8975,7 @@ "type": "ARMOR", "name": "undershirt", "description": "A simple white undershirt. Worn beneath your regular clothes, it provides a little extra warmth.", - "weight": 64, + "weight": "64 g", "volume": "250 ml", "price": 1000, "material": [ "cotton" ], @@ -8949,7 +8992,7 @@ "type": "ARMOR", "name": "union suit", "description": "A one-piece suit of full-body long underwear that helps to maintain body temperature. It laces closed in the front.", - "weight": 168, + "weight": "168 g", "volume": "1 L", "price": 2500, "material": [ "cotton" ], @@ -8969,7 +9012,7 @@ "name": "pair of leather vambraces", "name_plural": "pairs of leather vambraces", "description": "A pair of light leather arm guards, made for archery.", - "weight": 362, + "weight": "362 g", "volume": "1 L", "price": 2000, "to_hit": 1, @@ -8990,7 +9033,7 @@ "name": "wedding veil", "name_plural": "wedding veils", "description": "A lacy white wedding veil.", - "weight": 78, + "weight": "78 g", "volume": "750 ml", "price": 8000, "to_hit": -1, @@ -9009,7 +9052,7 @@ "type": "ARMOR", "name": "utility vest", "description": "A light vest covered in pockets and straps for storage.", - "weight": 516, + "weight": "516 g", "volume": "1 L", "price": 3900, "material": [ "cotton" ], @@ -9028,7 +9071,7 @@ "type": "ARMOR", "name": "leather vest", "description": "A vest made from thick leather. Offers excellent protection from cuts.", - "weight": 997, + "weight": "997 g", "volume": "2500 ml", "price": 5500, "to_hit": 1, @@ -9049,7 +9092,7 @@ "type": "ARMOR", "name": "armored leather vest", "description": "An armored vest made from thick leather and metal plates. Cumbersome, but offers excellent protection from harm.", - "weight": 1210, + "weight": "1210 g", "volume": "3 L", "price": 17900, "to_hit": 1, @@ -9070,7 +9113,7 @@ "type": "ARMOR", "name": "waistcoat", "description": "An elegant waistcoat. Ideal for those occasions when wearing only a shirt would be too casual and a suit would be just overdoing it.", - "weight": 516, + "weight": "516 g", "volume": "1 L", "price": 5000, "material": [ "cotton" ], @@ -9089,7 +9132,7 @@ "type": "ARMOR", "name": "wetsuit", "description": "A full-body neoprene wetsuit.", - "weight": 5110, + "weight": "5110 g", "volume": "5 L", "price": 10000, "to_hit": -3, @@ -9111,7 +9154,7 @@ "name": "pair of swimming gloves", "name_plural": "pairs of swimming gloves", "description": "A pair of very flexible neoprene-silicone rubber gloves, suitable for underwater use.", - "weight": 93, + "weight": "93 g", "volume": "500 ml", "price": 3000, "to_hit": 1, @@ -9131,7 +9174,7 @@ "type": "ARMOR", "name": "wetsuit hood", "description": "A neoprene hood, commonly worn by divers.", - "weight": 270, + "weight": "270 g", "volume": "1 L", "price": 4500, "material": [ "neoprene", "cotton" ], @@ -9150,7 +9193,7 @@ "type": "ARMOR", "name": "spring suit", "description": "A long-sleeved spring wetsuit with pink color details and cleavage-enhancing, hip-accentuating construction. Not as protective as a full-body suit, but also less restrictive.", - "weight": 3120, + "weight": "3120 g", "volume": "4 L", "price": 12000, "to_hit": -3, @@ -9172,7 +9215,7 @@ "name": "pair of army winter gloves", "name_plural": "pairs of army winter gloves", "description": "A pair of padded gloves. Favored by the military.", - "weight": 218, + "weight": "218 g", "volume": "750 ml", "price": 8125, "to_hit": 1, @@ -9191,7 +9234,7 @@ "name": "army winter jacket", "name_plural": "army winter jackets", "description": "A tough hooded jacket with lots of pockets, thickly padded for warmth. Favored by the military.", - "weight": 1000, + "weight": "1000 g", "volume": "3 L", "price": 4375, "material": [ "cotton", "plastic" ], @@ -9211,7 +9254,7 @@ "name": "army winter pants", "name_plural": "army winter pants", "description": "A tough pair of pants lined with pockets, thickly padded for warmth. Favored by the military.", - "weight": 1000, + "weight": "1000 g", "volume": "2500 ml", "price": 4375, "material": [ "cotton", "plastic" ], @@ -9230,7 +9273,7 @@ "type": "ARMOR", "name": "wolf suit", "description": "A full body fursuit in the form of an anthropomorphic wolf. It is quite encumbering and has little storage but is very warm.", - "weight": 7033, + "weight": "7033 g", "volume": "12 L", "price": 14500, "to_hit": -3, @@ -9251,7 +9294,7 @@ "type": "ARMOR", "name": "wool hoodie", "description": "A wool hooded shirt. It offers decent protection against the cold. The front pocket offers both storage room and shelter for your hands.", - "weight": 580, + "weight": "580 g", "volume": "3250 ml", "price": 3500, "material": [ "wool" ], @@ -9270,7 +9313,7 @@ "type": "ARMOR", "name": "wool suit", "description": "An encumbering wool suit covered in nice patterns. It looks like full body armor but it only protects against cold, sadly.", - "weight": 883, + "weight": "883 g", "volume": "3 L", "price": 8000, "to_hit": -1, @@ -9290,7 +9333,7 @@ "category": "armor", "name": "winter survivor suit", "description": "A warm and heavy hand-built combination armor made from a reinforced bulletproof vest and an insulated leather jumpsuit. Protects from the elements as well as from harm.", - "weight": 7800, + "weight": "7800 g", "volume": "14 L", "price": 200000, "to_hit": -3, @@ -9313,7 +9356,7 @@ "category": "armor", "name": "XL survivor suit", "description": "A massive hand-built combination armor made from a bulletproof vest and a reinforced leather jumpsuit. Protects from the elements as well as from harm.", - "weight": 12400, + "weight": "12400 g", "volume": "18 L", "price": 150000, "to_hit": -3, @@ -9337,7 +9380,7 @@ "name": "XL heavy survivor suit", "description": "A massive, heavy, hand-built combination armor made from a reinforced bulletproof vest and a metal-plated leather jumpsuit. Protects from the elements as well as from harm.", "looks_like": "hsurvivor_suit", - "weight": 16500, + "weight": "16500 g", "volume": "18750 ml", "price": 200000, "to_hit": -3, @@ -9359,7 +9402,7 @@ "type": "ARMOR", "name": "zubon", "description": "Plain white zubon for use in martial arts.", - "weight": 150, + "weight": "150 g", "volume": "750 ml", "price": 2500, "material": [ "cotton" ], @@ -9377,7 +9420,7 @@ "name": "violin case", "name_plural": "violin case", "description": "Useful to carry your precious musical instrument around protected from any harm.", - "weight": 2800, + "weight": "2800 g", "volume": "5 L", "price": 24000, "to_hit": -4, @@ -9397,7 +9440,7 @@ "type": "ARMOR", "name": "hazmat suit", "description": "An impermeable whole-body garment worn as protection against hazardous materials. Though very restrictive and fragile, wearing it will provide complete protection against ambient radiation. It requires a separate gas mask for full protection.", - "weight": 5000, + "weight": "5000 g", "volume": "17 L", "price": 117500, "material": [ "plastic" ], @@ -9417,7 +9460,7 @@ "category": "armor", "name": "ANBC suit", "description": "An armored, impermeable full-body suit that functions as body armor, as well as protecting from nuclear, biological, and chemical hazards. It requires a separate gas mask for full protection.", - "weight": 8700, + "weight": "8700 g", "volume": "20 L", "price": 400000, "material": [ "kevlar", "plastic" ], @@ -9436,7 +9479,7 @@ "type": "ARMOR", "name": "Hub 01 enviromental suit", "description": "A lightweight environmental suit worn by Hub personnel in their rare forays aboveground. Colored brown and blue, the white seal of Hub 01 is embroidered on both of its upper arms. It requires a separate gas mask for full protection.", - "weight": 5000, + "weight": "5000 g", "volume": "17 L", "price": 117500, "material": [ "nomex" ], @@ -9456,7 +9499,7 @@ "type": "ARMOR", "name": "entry suit", "description": "A flame-resistant whole-body garment worn by firefighters as protection against extreme heat. Though very restrictive, wearing it will provide excellent protection against fire and smoke. It requires a separate gas mask for full protection.", - "weight": 2900, + "weight": "2900 g", "volume": "6 L", "price": 240500, "material": [ "nomex", "kevlar" ], @@ -9476,7 +9519,7 @@ "name": "pair of golfing gloves", "name_plural": "pairs of golfing gloves", "description": "A thin pair of black leather golfing gloves.", - "weight": 150, + "weight": "150 g", "volume": "250 ml", "price": 4000, "to_hit": 2, @@ -9496,7 +9539,7 @@ "name": "golf cap", "//": "Head encumbrance stops you from wearing additional headgear. No helmet over a ballcap, sorry. But brimmed gear gets the anti-glare flag!", "description": "You're not actually sure if this is called a golf cap but its the stereotypical cap golfers wear.", - "weight": 85, + "weight": "85 g", "volume": "500 ml", "price": 2200, "material": [ "cotton" ], @@ -9516,7 +9559,7 @@ "name": "javelin bag", "name_plural": "javelin bags", "description": "An open medieval-looking bag, designed to store javelins for easy reach.", - "weight": 600, + "weight": "600 g", "volume": "1250 ml", "price": 6000, "rigid": false, @@ -9544,7 +9587,7 @@ "category": "armor", "name": "XL pot helmet", "description": "A huge makeshift helmet made from a canning pot. For the truly desperate man-bear-pig.", - "weight": 6425, + "weight": "6425 g", "volume": "25 L", "price": 22000, "bashing": 10, @@ -9565,7 +9608,7 @@ "category": "armor", "name": "Corinthian helm", "description": "An ancient Greek bronze helmet that provides excellent protection for the head, with slits for the eyes and mouth.", - "weight": 1310, + "weight": "1310 g", "volume": "2500 ml", "price": 30000, "bashing": 10, @@ -9587,7 +9630,7 @@ "category": "armor", "name_plural": "bell cuirasses", "description": "An ancient Greek breastplate, made of bronze.", - "weight": 5896, + "weight": "5896 g", "volume": "6 L", "price": 50000, "to_hit": -5, @@ -9609,7 +9652,7 @@ "name": "pair of bronze greaves", "name_plural": "pairs of bronze greaves", "description": "A pair of bronze leg guards with a simple leather lining.", - "weight": 2520, + "weight": "2520 g", "volume": "5500 ml", "price": 40000, "to_hit": 1, @@ -9628,7 +9671,7 @@ "type": "ARMOR", "name": "tarpaulin", "description": "A plastic sheet with several grommets for securing it with rope or cord. Useful for improvised rain protection.", - "weight": 1244, + "weight": "1244 g", "volume": "2 L", "price": 5000, "to_hit": -1, diff --git a/data/json/items/armor/ammo_pouch.json b/data/json/items/armor/ammo_pouch.json index b156d404068e3..fde60341f9818 100644 --- a/data/json/items/armor/ammo_pouch.json +++ b/data/json/items/armor/ammo_pouch.json @@ -4,7 +4,7 @@ "type": "ARMOR", "name": "ammo satchel", "description": "A fabric ammo bag worn at the waist which is capable of holding a single large magazine close at hand.", - "weight": 180, + "weight": "180 g", "volume": "500 ml", "price": 5000, "material": "cotton", @@ -30,7 +30,7 @@ "name": "chest ammo pouch", "name_plural": "chest ammo pouches", "description": "A fabric ammo pouch that can be strapped to your chest which is capable of holding a single magazine close at hand.", - "weight": 140, + "weight": "140 g", "volume": "250 ml", "price": 2500, "rigid": false, @@ -51,14 +51,14 @@ "flags": [ "WATER_FRIENDLY", "BELTED" ] }, { - "id": "magbandolier", + "id": "chestrig", "type": "ARMOR", - "name": "magazine bandolier", - "name_plural": "magazine bandoliers", - "description": "A bandolier of pouches capable of carrying four magazines close at hand.", - "weight": 600, - "volume": "1250 ml", - "price": 10000, + "name": "chest rig", + "name_plural": "chest rig", + "description": "Popularized during the Vietnam War, chest rigs like these are typically plain, barebones affairs consisting of three or more pouches in a row, with straps to secure them on your chest. This one can hold four magazines in its pouches.", + "weight": "425 g", + "volume": "500 ml", + "price": 3900, "rigid": false, "material": "cotton", "symbol": "[", @@ -78,13 +78,13 @@ "flags": [ "WATER_FRIENDLY", "BELTED" ] }, { - "id": "chestrig", + "id": "tacvest", "type": "ARMOR", - "name": "chest rig", - "description": "A light vest covered in webbing, pockets and straps. This variety is favored by the military, as it is capable of holding four magazines close at hand.", - "weight": 425, - "volume": "500 ml", - "price": 3900, + "name": "tac vest", + "description": "This light vest is meant to carry your gear and ammunition comfortably distributed about your torso. They are popular amongst law enforcement, but less so than combination tactical vests incorporating kevlar. Lightweight and easy to don, this vest can hold four magazines close at hand in its many pouches.", + "weight": "600 g", + "volume": "1250 ml", + "price": 7400, "rigid": false, "material": "cotton", "symbol": "[", @@ -113,7 +113,7 @@ "name_plural": "ankle ammo pouches", "description": "A small fabric ammo pouch that can be strapped to your ankle which is capable of holding a single small magazine close at hand.", "volume": "250 ml", - "weight": 60, + "weight": "60 g", "price": 2000, "material": "cotton", "symbol": "[", @@ -138,7 +138,7 @@ "name": "leg ammo pouch", "name_plural": "leg ammo pouches", "description": "A fabric ammo pouch that can be strapped to your leg and capable of holding two magazine close at hand.", - "weight": 120, + "weight": "120 g", "volume": "250 ml", "price": 2000, "rigid": false, @@ -166,7 +166,7 @@ "name": "MBR vest (empty)", "name_plural": "MBR vests (empty)", "description": "A Modular Bullet Resistant Vest. It has pouches for extra armor inserts, but without them provides little more protection over a regular vest. It has four pouches capable of carrying magazines.", - "weight": 2860, + "weight": "2860 g", "volume": "6 L", "price": 100000, "to_hit": -3, @@ -199,7 +199,7 @@ "name": "MBR vest (ceramic plates)", "name_plural": "MBR vests (ceramic plates)", "description": "A Modular Bullet Resistant Vest. Ceramic plates have been inserted to improve its protection. The ceramic plates cannot be repaired, only replaced. It has four pouches capable of carrying magazines.", - "weight": 4308, + "weight": "4308 g", "volume": "6 L", "price": 120000, "to_hit": -3, @@ -232,7 +232,7 @@ "name": "MBR vest (hard plates)", "name_plural": "MBR vests (hard plates)", "description": "A Modular Bullet Resistant Vest. Hardened steel plates have been inserted, greatly increasing its protection at the cost of a great deal of weight and loss of flexibility. It has four pouches capable of carrying magazines.", - "weight": 14860, + "weight": "14860 g", "volume": "6 L", "price": 120000, "to_hit": -3, @@ -265,7 +265,7 @@ "name": "MBR vest (Kevlar plates)", "name_plural": "MBR vests (Kevlar plates)", "description": "A Modular Bullet Resistant Vest. Kevlar plates have been inserted to improve its protection. It has four pouches capable of carrying magazines.", - "weight": 5721, + "weight": "5721 g", "volume": "6 L", "price": 120000, "to_hit": -3, @@ -298,7 +298,7 @@ "name": "MBR vest (steel plating)", "name_plural": "MBR vests (steel plating)", "description": "A Modular Bullet Resistant Vest. Its armor pouches have steel plates in them; this improves protection, but makes the vest much heavier and encumbering. It has four pouches capable of carrying magazines.", - "weight": 10860, + "weight": "10860 g", "volume": "6 L", "price": 120000, "to_hit": -3, @@ -331,7 +331,7 @@ "name": "MBR vest (superalloy)", "name_plural": "MBR vests (superalloy)", "description": "A Modular Bullet Resistant Vest. Its armor pouches have superalloy plating in them, giving it extra protection with marginal flexibility loss and additional weight. It has four pouches capable of carrying magazines.", - "weight": 6460, + "weight": "6460 g", "volume": "6 L", "price": 180000, "to_hit": -3, @@ -364,7 +364,7 @@ "name": "XL kevlar vest", "description": "A massive, hand-built kevlar vest based on the design of existing bullet resistant vests. It has four pouches capable of carrying magazines.", "looks_like": "modularvest", - "weight": 5148, + "weight": "5148 g", "volume": "10750 ml", "price": 200000, "to_hit": -3, diff --git a/data/json/items/armor/backpacks.json b/data/json/items/armor/backpacks.json index d02bbc0f62a3e..dff4aff4db181 100644 --- a/data/json/items/armor/backpacks.json +++ b/data/json/items/armor/backpacks.json @@ -4,16 +4,18 @@ "type": "ARMOR", "name": "backpack", "description": "A small backpack. Good storage for a little encumbrance.", - "weight": 633, + "weight": "633 g", "volume": "2 L", "price": 3900, + "rigid": false, "material": [ "cotton" ], "symbol": "[", "color": "green", "covers": [ "TORSO" ], "coverage": 30, - "encumbrance": 10, - "storage": "10 L", + "encumbrance": 2, + "max_encumbrance": 15, + "storage": "15 L", "warmth": 6, "material_thickness": 2, "flags": [ "BELTED" ] @@ -23,15 +25,17 @@ "type": "ARMOR", "name": "hiking backpack", "description": "A large sized hiking backpack with plenty of storage space.", - "weight": 2291, + "weight": "2291 g", "volume": "14 L", "price": 10000, + "rigid": false, "material": [ "leather" ], "symbol": "[", "color": "brown", "covers": [ "TORSO" ], "coverage": 50, - "encumbrance": 55, + "encumbrance": 10, + "max_encumbrance": 40, "storage": "55 L", "warmth": 10, "material_thickness": 2, @@ -52,16 +56,18 @@ "type": "ARMOR", "name": "giant novelty backpack", "description": "A huge fabric backpack made mostly as a joke before the cataclysm. Now, it's still rather silly, but it can store a lot of stuff.", - "weight": 1200, + "weight": "1200 g", "volume": "8750 ml", "price": 4500, + "rigid": false, "material": [ "cotton" ], "symbol": "[", "color": "green", "covers": [ "TORSO", "LEGS" ], "coverage": 75, - "encumbrance": 100, - "storage": "35 L", + "encumbrance": 10, + "max_encumbrance": 40, + "storage": "45 L", "warmth": 5, "material_thickness": 2, "flags": [ "BELTED" ] @@ -71,16 +77,18 @@ "type": "ARMOR", "name": "leather backpack", "description": "A small leather backpack. Good storage for a little encumbrance.", - "weight": 818, + "weight": "818 g", "volume": "2 L", "price": 11900, + "rigid": false, "material": [ "leather" ], "symbol": "[", "color": "brown", "covers": [ "TORSO" ], "coverage": 30, - "encumbrance": 11, - "storage": "10 L", + "encumbrance": 4, + "max_encumbrance": 17, + "storage": "15 L", "warmth": 9, "material_thickness": 3, "flags": [ "BELTED", "WATER_FRIENDLY" ] @@ -90,15 +98,17 @@ "type": "ARMOR", "name": "large tactical backpack", "description": "A large tactical multi-compartment backpack that has great lower back support.", - "weight": 2291, + "weight": "2291 g", "volume": "15 L", "price": 9000, + "rigid": false, "material": [ "leather" ], "symbol": "[", "color": "green", "covers": [ "TORSO" ], "coverage": 50, - "encumbrance": 65, + "encumbrance": 10, + "max_encumbrance": 55, "storage": "65 L", "warmth": 10, "material_thickness": 2, @@ -109,16 +119,17 @@ "type": "ARMOR", "name": "high-volume rucksack", "description": "Also know as a \"bigpack\", this rucksack is prized by pack rats but may lead to a bad back.", - "weight": 3539, + "weight": "3539 g", "volume": "21 L", "price": 20000, - "material": [ "leather" ], + "rigid": false, "symbol": "[", "color": "black", "covers": [ "TORSO" ], "coverage": 50, - "encumbrance": 100, - "storage": "100 L", + "encumbrance": 16, + "max_encumbrance": 65, + "storage": "80 L", "warmth": 10, "material_thickness": 2, "flags": [ "BELTED", "WATERPROOF", "ONLY_ONE", "OVERSIZE" ] @@ -128,16 +139,18 @@ "type": "ARMOR", "name": "dive bag", "description": "A lightweight mesh backpack, commonly worn by swimmers and divers.", - "weight": 512, + "weight": "512 g", "volume": "1500 ml", "price": 10900, + "rigid": false, "material": [ "plastic" ], "symbol": "[", "color": "yellow", "covers": [ "TORSO" ], "coverage": 40, - "encumbrance": 10, - "storage": "9500 ml", + "encumbrance": 2, + "max_encumbrance": 12, + "storage": "12 L", "material_thickness": 1, "flags": [ "WATER_FRIENDLY", "BELTED" ] }, @@ -146,16 +159,18 @@ "type": "ARMOR", "name": "duffel bag", "description": "A huge duffel bag. Provides plenty of storage, but is severely encumbering.", - "weight": 933, + "weight": "933 g", "volume": "6 L", "price": 12000, + "rigid": false, "material": [ "cotton" ], "symbol": "[", "color": "green", "covers": [ "TORSO" ], "coverage": 50, - "encumbrance": 30, - "storage": "30 L", + "encumbrance": 5, + "max_encumbrance": 35, + "storage": "35 L", "warmth": 10, "material_thickness": 2, "flags": [ "BELTED", "WATER_FRIENDLY" ] @@ -165,7 +180,7 @@ "type": "ARMOR", "name": "petpack", "description": "Before the Cataclysm this would allow your four-legged friend to see the world, now it's used to shield them from the world.", - "weight": 1316, + "weight": "1316 g", "volume": "10 L", "price": 7900, "material": [ "cotton", "plastic" ], @@ -173,8 +188,8 @@ "color": "blue", "covers": [ "TORSO" ], "coverage": 40, - "encumbrance": 14, - "storage": "3750 ml", + "encumbrance": 10, + "storage": "4 L", "warmth": 8, "material_thickness": 2, "properties": [ [ "monster_size_capacity", "SMALL" ] ], @@ -186,7 +201,7 @@ "type": "ARMOR", "name": "jerrypack", "description": "A jerrycan modified to be worn in a similar manner to a backpack.", - "weight": 1763, + "weight": "1763 g", "volume": "10 L", "price": 1450, "to_hit": -1, @@ -206,15 +221,17 @@ "type": "ARMOR", "name": "makeshift knapsack", "description": "A pair of pants with the bottom ends tied with string, and then passed through the belt loops so the knapsack can be carried on the back.", - "weight": 560, + "weight": "560 g", "volume": "2 L", "price": 1000, + "rigid": false, "material": [ "cotton" ], "symbol": "[", "color": "light_gray", "covers": [ "TORSO" ], "coverage": 30, - "encumbrance": 10, + "encumbrance": 2, + "max_encumbrance": 9, "storage": "5 L", "warmth": 5, "material_thickness": 1, @@ -225,17 +242,19 @@ "type": "ARMOR", "name": "makeshift sling", "description": "A large sheet tied into a crude, over-the-shoulder sling.", - "weight": 771, + "weight": "771 g", "volume": "5 L", "price": 100, + "rigid": false, "to_hit": -2, "material": [ "cotton" ], "symbol": "[", "color": "light_gray", "covers": [ "TORSO" ], "coverage": 40, - "encumbrance": 40, - "storage": "7500 ml", + "encumbrance": 4, + "max_encumbrance": 15, + "storage": "10 L", "warmth": 10, "material_thickness": 1, "flags": [ "OVERSIZE", "BELTED", "WATER_FRIENDLY" ] @@ -246,9 +265,10 @@ "name": "messenger bag", "//": "KA101's ran about $90 but is ballistic nylon. Bit tougher than the DDA model.", "description": "Light and easy to wear, but doesn't offer much storage.", - "weight": 760, + "weight": "760 g", "volume": "1 L", "price": 7900, + "rigid": false, "to_hit": 1, "bashing": 1, "material": [ "cotton", "plastic" ], @@ -256,8 +276,9 @@ "color": "green", "covers": [ "TORSO" ], "coverage": 30, - "encumbrance": 5, - "storage": "6250 ml", + "encumbrance": 1, + "max_encumbrance": 6, + "storage": "6 L", "material_thickness": 1, "flags": [ "BELTED", "WATER_FRIENDLY" ] }, @@ -266,15 +287,17 @@ "type": "ARMOR", "name": "MOLLE pack", "description": "The Modular Lightweight Load-carrying Equipment is an advanced military backpack. Covered with pockets and straps, it strikes a fine balance between storage space and encumbrance.", - "weight": 966, + "weight": "966 g", "volume": "2500 ml", "price": 6700, + "rigid": false, "material": [ "cotton", "kevlar" ], "symbol": "[", "color": "green", "covers": [ "TORSO" ], "coverage": 35, - "encumbrance": 9, + "encumbrance": 2, + "max_encumbrance": 9, "storage": "12 L", "warmth": 10, "material_thickness": 2, @@ -285,9 +308,10 @@ "type": "ARMOR", "name": "purse", "description": "A bit cumbersome to wear, but provides some storage.", - "weight": 297, + "weight": "297 g", "volume": "1 L", "price": 7500, + "rigid": false, "to_hit": 2, "bashing": 2, "material": [ "leather" ], @@ -295,7 +319,8 @@ "color": "dark_gray", "covers": [ "TORSO" ], "coverage": 10, - "encumbrance": 7, + "encumbrance": 2, + "max_encumbrance": 7, "storage": "5 L", "material_thickness": 2, "flags": [ "FANCY", "BELTED", "WATER_FRIENDLY" ] @@ -305,16 +330,18 @@ "type": "ARMOR", "name": "military rucksack", "description": "A huge military rucksack, provides a lot of storage.", - "weight": 1140, + "weight": "1140 g", "volume": "4 L", "price": 9200, + "rigid": false, "material": [ "cotton", "plastic" ], "symbol": "[", "color": "green", "covers": [ "TORSO" ], "coverage": 40, - "encumbrance": 20, - "storage": "20 L", + "encumbrance": 2, + "max_encumbrance": 20, + "storage": "22 L", "warmth": 8, "material_thickness": 2, "flags": [ "BELTED", "WATER_FRIENDLY" ] @@ -324,9 +351,10 @@ "type": "ARMOR", "name": "runner pack", "description": "The obvious choice for outdoor athletes, this ergonomic backpack is light and easy to wear, ensuring comfort when carrying heavy and bulky items.", - "weight": 840, + "weight": "840 g", "volume": "1500 ml", "price": 24000, + "rigid": false, "to_hit": 1, "bashing": 1, "material": [ "cotton", "plastic" ], @@ -334,8 +362,9 @@ "color": "green", "covers": [ "TORSO" ], "coverage": 20, - "encumbrance": 3, - "storage": "4 L", + "encumbrance": 1, + "max_encumbrance": 6, + "storage": "7 L", "warmth": 2, "material_thickness": 1, "flags": [ "BELTED", "WATER_FRIENDLY" ] @@ -346,16 +375,18 @@ "name": "sling pack", "//": "Depends on if you're getting a cheap school version or something more like a range bag.", "description": "A simple single-sling backpack. Easier to access than a normal backpack, but can't comfortably hold as much.", - "weight": 566, + "weight": "566 g", "volume": "1500 ml", "price": 2900, + "rigid": false, "bashing": 1, "material": [ "cotton", "plastic" ], "symbol": "[", "color": "green", "covers": [ "TORSO" ], "coverage": 30, - "encumbrance": 7, + "encumbrance": 2, + "max_encumbrance": 9, "storage": "8 L", "warmth": 2, "material_thickness": 1, @@ -366,16 +397,18 @@ "type": "ARMOR", "name": "survivor duffel bag", "description": "A custom-built heavy duffel bag. Durable and carefully crafted to hold as much stuff as possible.", - "weight": 1000, + "weight": "1000 g", "volume": "7500 ml", "price": 24000, + "rigid": false, "material": [ "leather", "cotton" ], "symbol": "[", "color": "dark_gray", "covers": [ "TORSO" ], "coverage": 40, - "encumbrance": 25, - "storage": "37500 ml", + "encumbrance": 8, + "max_encumbrance": 28, + "storage": "38 L", "material_thickness": 2, "flags": [ "WATER_FRIENDLY", "STURDY", "BELTED", "OVERSIZE" ] }, @@ -384,16 +417,18 @@ "type": "ARMOR", "name": "survivor backpack", "description": "A custom-built backpack. Durable and carefully crafted to hold as much stuff as possible.", - "weight": 600, + "weight": "600 g", "volume": "2500 ml", "price": 24000, + "rigid": false, "material": [ "leather", "cotton" ], "symbol": "[", "color": "brown", "covers": [ "TORSO" ], "coverage": 30, - "encumbrance": 8, - "storage": "12500 ml", + "encumbrance": 3, + "max_encumbrance": 12, + "storage": "16 L", "material_thickness": 2, "flags": [ "WATER_FRIENDLY", "STURDY", "BELTED" ] }, @@ -402,15 +437,17 @@ "type": "ARMOR", "name": "survivor rucksack", "description": "A custom-built heavy backpack. Durable and carefully crafted to hold as much stuff as possible.", - "weight": 800, + "weight": "800 g", "volume": "5 L", "price": 24000, + "rigid": false, "material": [ "leather", "cotton" ], "symbol": "[", "color": "dark_gray", "covers": [ "TORSO" ], "coverage": 40, - "encumbrance": 18, + "encumbrance": 3, + "max_encumbrance": 18, "storage": "25 L", "material_thickness": 2, "flags": [ "WATER_FRIENDLY", "STURDY", "BELTED", "OVERSIZE" ] @@ -420,16 +457,18 @@ "type": "ARMOR", "name": "survivor runner pack", "description": "A custom-built lightweight runner pack. Durable and carefully crafted to hold as much stuff as possible.", - "weight": 440, + "weight": "440 g", "volume": "1750 ml", "price": 24000, + "rigid": false, "material": [ "leather", "cotton" ], "symbol": "[", "color": "brown", "covers": [ "TORSO" ], "coverage": 30, - "encumbrance": 2, - "storage": "4500 ml", + "encumbrance": 1, + "max_encumbrance": 6, + "storage": "8 L", "material_thickness": 2, "flags": [ "WATER_FRIENDLY", "STURDY", "BELTED" ] }, @@ -438,16 +477,18 @@ "type": "ARMOR", "name": "golf bag", "description": "A tall canvas and plastic bag with fold-out legs used for golfing. It even has straps to be worn on the back.", - "weight": 1900, + "weight": "1900 g", "volume": "15 L", "price": 800, + "rigid": false, "material": [ "cotton", "plastic" ], "symbol": "[", "color": "green", "covers": [ "TORSO" ], "coverage": 35, - "encumbrance": 16, - "storage": "15 L", + "encumbrance": 2, + "max_encumbrance": 15, + "storage": "18 L", "warmth": 5, "material_thickness": 3, "flags": [ "BELTED", "OVERSIZE" ], @@ -465,16 +506,18 @@ "type": "ARMOR", "name": "travelpack", "description": "A hiking pack used for short trips.", - "weight": 636, + "weight": "636 g", "volume": "3 L", "price": 7000, + "rigid": false, "material": [ "cotton" ], "symbol": "[", "color": "yellow", "covers": [ "TORSO" ], "coverage": 40, - "encumbrance": 25, - "storage": "25 L", + "encumbrance": 3, + "max_encumbrance": 25, + "storage": "30 L", "warmth": 8, "material_thickness": 2, "flags": [ "BELTED", "WATERPROOF" ] diff --git a/data/json/items/armor/bandolier.json b/data/json/items/armor/bandolier.json index 02f7489f55ef2..5122652e4fb47 100644 --- a/data/json/items/armor/bandolier.json +++ b/data/json/items/armor/bandolier.json @@ -4,7 +4,7 @@ "type": "ARMOR", "name": "pistol bandolier", "description": "An embroidered leather bandolier for keeping pistol cartridges close to hand. If this doesn't make you feel like a cowboy nothing will.", - "weight": 140, + "weight": "140 g", "volume": "250 ml", "price": 1900, "material": "leather", @@ -27,7 +27,7 @@ "type": "ARMOR", "name": "rifle bandolier", "description": "A leather bandolier for keeping rifle cartridges close to hand.", - "weight": 140, + "weight": "140 g", "volume": "250 ml", "price": 1900, "material": "leather", @@ -50,7 +50,7 @@ "type": "ARMOR", "name": "waist shotgun bandolier", "description": "A leather bandolier worn around the waist for keeping shotgun shells close to hand.", - "weight": 140, + "weight": "140 g", "volume": "500 ml", "price": 1900, "material": "leather", @@ -68,7 +68,7 @@ "type": "ARMOR", "name": "torso shotgun bandolier", "description": "A leather bandolier strapped around the torso for keeping shotgun shells close to hand.", - "weight": 200, + "weight": "200 g", "volume": "1 L", "price": 3900, "material": "leather", @@ -87,7 +87,7 @@ "name": "paper cartridge pouch", "name_plural": "paper cartridge pouches", "description": "A covered leather pouch, worn at the waist to store and protect prepared blackpowder cartridges.", - "weight": 160, + "weight": "160 g", "volume": "500 ml", "price": 4900, "material": "leather", @@ -105,7 +105,7 @@ "type": "ARMOR", "name": "wrist bandolier", "description": "A small fabric bandolier for rifle cartridges designed to be worn around the wrist.", - "weight": 30, + "weight": "30 g", "volume": "250 ml", "price": 2900, "material": "cotton", @@ -129,7 +129,7 @@ "name": "grenade pouch", "name_plural": "grenade pouches", "description": "A small pouch for storing cartridge grenades with straps for attaching it to your belt or other webbing.", - "weight": 90, + "weight": "90 g", "volume": "250 ml", "price": 5900, "material": [ "cotton", "plastic" ], @@ -148,7 +148,7 @@ "name": "large grenade pouch", "name_plural": "large grenade pouches", "description": "A pouch for holding up to four full-sized grenades of various types.", - "weight": 600, + "weight": "600 g", "volume": "1250 ml", "price": 3000, "rigid": false, diff --git a/data/json/items/armor/boots.json b/data/json/items/armor/boots.json index 6e76393d39de7..e8bd6b64c7abf 100644 --- a/data/json/items/armor/boots.json +++ b/data/json/items/armor/boots.json @@ -5,7 +5,7 @@ "name": "pair of cord sandals", "name_plural": "pairs of cord sandals", "description": "Lightweight sandals made from wound cord. They offer little in the way of protection, but keep you cool during warmer months.", - "weight": 68, + "weight": "68 g", "volume": "250 ml", "price": 3000, "to_hit": -2, @@ -24,7 +24,7 @@ "name": "pair of boots", "name_plural": "pairs of boots", "description": "Tough leather boots. Very durable.", - "weight": 1060, + "weight": "1060 g", "volume": "2500 ml", "price": 10000, "to_hit": -1, @@ -47,7 +47,7 @@ "name": "pair of bone armor boots", "name_plural": "pairs of bone armor boots", "description": "Leather boots armored with reinforcements made from bone. Light and strong.", - "weight": 1824, + "weight": "1824 g", "volume": "4250 ml", "price": 13500, "to_hit": -1, @@ -70,7 +70,7 @@ "name": "pair of turnout boots", "name_plural": "pairs of turnout boots", "description": "A pair of steel-toed rubber boots, the sort worn by firefighters. Highly resistant to heat and flame, they provide excellent protection from injury.", - "weight": 1930, + "weight": "1930 g", "volume": "3500 ml", "price": 13000, "to_hit": 2, @@ -92,7 +92,7 @@ "name": "pair of chitinous boots", "name_plural": "pairs of chitinous boots", "description": "Boots made from the exoskeletons of insects. Light and durable.", - "weight": 1620, + "weight": "1620 g", "volume": "4250 ml", "price": 13500, "to_hit": -1, @@ -126,7 +126,7 @@ "name": "pair of combat boots", "name_plural": "pairs of combat boots", "description": "Modern reinforced tactical combat boots. Very durable.", - "weight": 1060, + "weight": "1060 g", "volume": "2 L", "price": 7000, "to_hit": -1, @@ -149,7 +149,7 @@ "name": "pair of survivor fireboots", "name_plural": "pairs of survivor fireboots", "description": "A pair of customized, Kevlar armored Nomex boots, modified to provide maximum protection from harm and the elements, even when knee-deep in the dead.", - "weight": 1980, + "weight": "1980 g", "volume": "3 L", "price": 24000, "to_hit": -1, @@ -171,7 +171,7 @@ "name": "pair of fur boots", "name_plural": "pairs of fur boots", "description": "Boots lined with fur for warmth.", - "weight": 1890, + "weight": "1890 g", "volume": "4500 ml", "price": 14000, "to_hit": -1, @@ -194,7 +194,7 @@ "name": "pair of survivor wetsuit boots", "name_plural": "pairs of survivor wetsuit boots", "description": "A pair of customized, kevlar armored neoprene boots, modified to provide maximum protection from harm and the elements, even when knee-deep in the dead.", - "weight": 1180, + "weight": "1180 g", "volume": "1500 ml", "price": 24000, "to_hit": -1, @@ -216,7 +216,7 @@ "name": "pair of hiking boots", "name_plural": "pairs of hiking boots", "description": "Tough yet light leather boots. Durable and comfortable.", - "weight": 960, + "weight": "960 g", "volume": "2 L", "price": 14000, "to_hit": -1, @@ -239,7 +239,7 @@ "name": "pair of heavy survivor boots", "name_plural": "pairs of heavy survivor boots", "description": "A pair of customized kevlar boots, heavily armored with steel and modified to provide maximum protection from harm, even when knee-deep in the dead.", - "weight": 1610, + "weight": "1610 g", "volume": "3 L", "price": 24000, "to_hit": -1, @@ -262,7 +262,7 @@ "name": "pair of leather armor boots", "name_plural": "pairs of leather armor boots", "description": "Thick leather boots made specifically to protect the feet. Light and tough.", - "weight": 902, + "weight": "902 g", "volume": "2 L", "price": 12500, "to_hit": -1, @@ -285,7 +285,7 @@ "name": "pair of light survivor boots", "name_plural": "pairs of light survivor boots", "description": "A pair of customized, kevlar armored cloth boots, modified to provide maximum protection from harm, even when knee-deep in the dead.", - "weight": 1120, + "weight": "1120 g", "volume": "2 L", "price": 24000, "to_hit": -1, @@ -308,7 +308,7 @@ "name": "pair of armored boots", "name_plural": "pairs of armored boots", "description": "An extremely heavy set of armor plated boots.", - "weight": 1890, + "weight": "1890 g", "volume": "3250 ml", "price": 50000, "to_hit": -2, @@ -330,7 +330,7 @@ "name": "pair of rubber boots", "name_plural": "pairs of rubber boots", "description": "A pair of rubber boots, often used while cleaning with caustic materials.", - "weight": 980, + "weight": "980 g", "volume": "3500 ml", "price": 8000, "to_hit": 2, @@ -352,7 +352,7 @@ "name": "pair of scrap boots", "name_plural": "pairs of scrap boots", "description": "Boots made of random scraps.", - "weight": 1845, + "weight": "1845 g", "volume": "3 L", "price": 12000, "to_hit": -1, @@ -374,7 +374,7 @@ "name": "pair of steeltoed boots", "name_plural": "pairs of steeltoed boots", "description": "Leather boots with a steel toe. Extremely durable.", - "weight": 1320, + "weight": "1320 g", "volume": "3 L", "price": 12000, "to_hit": -1, @@ -397,7 +397,7 @@ "name": "pair of survivor boots", "name_plural": "pairs of survivor boots", "description": "A pair of customized leather boots, armored with kevlar and modified to provide maximum protection from harm, even when knee-deep in the dead.", - "weight": 1330, + "weight": "1330 g", "volume": "2500 ml", "price": 24000, "to_hit": -1, @@ -431,7 +431,7 @@ "name": "pair of winter boots", "name_plural": "pairs of winter boots", "description": "Cumbersome boots designed for warmth.", - "weight": 1640, + "weight": "1640 g", "volume": "3500 ml", "price": 7000, "to_hit": -1, @@ -453,7 +453,7 @@ "name": "pair of winter survivor boots", "name_plural": "pairs of winter survivor boots", "description": "A pair of customized, Kevlar armored fur boots, modified to provide maximum protection from harm and the elements, even when knee-deep in the dead.", - "weight": 1760, + "weight": "1760 g", "volume": "3500 ml", "price": 24000, "to_hit": -1, @@ -476,7 +476,7 @@ "name": "pair of XL survivor boots", "name_plural": "pairs of XL survivor boots", "description": "A massive pair of customized leather boots, armored with kevlar and modified to provide maximum protection from harm and the elements, even when knee-deep in the dead.", - "weight": 2460, + "weight": "2460 g", "volume": "5 L", "price": 24000, "to_hit": -1, @@ -498,7 +498,7 @@ "name": "pair of cleats", "name_plural": "pairs of cleats", "description": "Sport shoes with hard undersides, and studs on the bottom designed to dig into the grass.", - "weight": 860, + "weight": "860 g", "volume": "1500 ml", "price": 7000, "bashing": 2, @@ -518,7 +518,7 @@ "name": "pair of golf shoes", "name_plural": "pairs of golf shoes", "description": "Snug fit sport shoes with hard ridges on the bottom.", - "weight": 820, + "weight": "820 g", "volume": "1500 ml", "price": 6500, "bashing": 2, @@ -538,7 +538,7 @@ "name": "pair of wooden clogs", "name_plural": "pairs of wooden clogs", "description": "Known as klompen in the Netherlands and sabots in France, these wooden shoes have endured through the ages due to their simple design and durability.", - "weight": 916, + "weight": "916 g", "volume": "1250 ml", "price": 4000, "to_hit": -2, @@ -560,7 +560,7 @@ "name": "pair of clown shoes", "name_plural": "pairs of clown shoes", "description": "Gigantic shoes fit for a clown. Incredibly difficult to walk in.", - "weight": 1140, + "weight": "1140 g", "volume": "3500 ml", "price": 500, "to_hit": -1, @@ -582,7 +582,7 @@ "name": "pair of dance shoes", "name_plural": "pairs of dance shoes", "description": "Expensive black dance shoes with large heels.", - "weight": 870, + "weight": "870 g", "volume": "1500 ml", "price": 12000, "to_hit": 1, @@ -603,7 +603,7 @@ "name": "pair of dress shoes", "name_plural": "pairs of dress shoes", "description": "Fancy patent leather shoes. Not designed for running in.", - "weight": 870, + "weight": "870 g", "volume": "1500 ml", "price": 12000, "to_hit": 1, @@ -624,7 +624,7 @@ "name": "pair of flip-flops", "name_plural": "pairs of flip-flops", "description": "Simple sandals. Very difficult to run in.", - "weight": 62, + "weight": "62 g", "volume": "250 ml", "price": 500, "to_hit": -2, @@ -643,7 +643,7 @@ "name": "pair of foot rags", "name_plural": "pairs of foot rags", "description": "Rags tied around your feet. Not much of an improvement over being barefoot, still better than nothing.", - "weight": 56, + "weight": "56 g", "volume": "250 ml", "price": 500, "material": [ "cotton" ], @@ -662,7 +662,7 @@ "name": "pair of fur foot wraps", "name_plural": "pairs of fur foot wraps", "description": "Fur pelts tied around your feet. Not much of an improvement over being barefoot, still better than nothing.", - "weight": 135, + "weight": "135 g", "volume": "500 ml", "price": 700, "material": [ "fur" ], @@ -681,7 +681,7 @@ "name": "pair of leather foot wraps", "name_plural": "pairs of leather foot wraps", "description": "Leather patches tied around your feet. Not much of an improvement over being barefoot, still better than nothing.", - "weight": 120, + "weight": "120 g", "volume": "500 ml", "price": 525, "material": [ "leather" ], @@ -700,7 +700,7 @@ "name": "pair of wool foot wraps", "name_plural": "pairs of wool foot wraps", "description": "Felt patches tied around your feet. Not much of an improvement over being barefoot, still better than nothing.", - "weight": 56, + "weight": "56 g", "volume": "250 ml", "price": 500, "material": [ "wool" ], @@ -719,7 +719,7 @@ "name": "pair of geta", "name_plural": "pairs of geta", "description": "Simple wooden geta.", - "weight": 460, + "weight": "460 g", "volume": "1 L", "price": 6500, "to_hit": -2, @@ -741,7 +741,7 @@ "name": "pair of heels", "name_plural": "pairs of heels", "description": "A pair of high heels. Difficult to even walk in.", - "weight": 640, + "weight": "640 g", "volume": "750 ml", "price": 4000, "to_hit": -2, @@ -761,7 +761,7 @@ "name": "pair of knee-high boots", "name_plural": "pairs of knee-high boots", "description": "Very long leather boots that cover the lower legs. Difficult to wear but extremely durable.", - "weight": 1520, + "weight": "1520 g", "volume": "3750 ml", "price": 8000, "to_hit": -1, @@ -783,7 +783,7 @@ "name": "pair of leather sandals", "name_plural": "pairs of leather sandals", "description": "Sturdy leather hiking sandals with a heel strap. Offers little in the way of protection, but keeps you cool during warmer months.", - "weight": 94, + "weight": "94 g", "volume": "250 ml", "price": 4000, "to_hit": -2, @@ -802,7 +802,7 @@ "name": "pair of lowtop tennis shoes", "name_plural": "pairs of lowtop tennis shoes", "description": "Lightweight shoes made of cloth and rubber.", - "weight": 114, + "weight": "114 g", "volume": "750 ml", "price": 1500, "to_hit": -2, @@ -821,7 +821,7 @@ "name": "pair of moccasins", "name_plural": "pairs of moccasins", "description": "Simple shoes made from animal pelts.", - "weight": 230, + "weight": "230 g", "volume": "500 ml", "price": 5000, "material": [ "fur", "leather" ], @@ -840,7 +840,7 @@ "name": "pair of motorcycle boots", "name_plural": "pairs of motorcycle boots", "description": "A pair of durable boots to be used by dirt bikers and motorcyclists.", - "weight": 2125, + "weight": "2125 g", "volume": "2 L", "price": 8000, "bashing": 5, @@ -861,7 +861,7 @@ "name": "pair of rollerblades", "name_plural": "pairs of rollerblades", "description": "A pair of inline skates. Very fast on flat floors, but they make it hard to move on rough terrain, take hits, or to dodge effectively.", - "weight": 1640, + "weight": "1640 g", "volume": "3750 ml", "price": 8500, "to_hit": -2, @@ -882,7 +882,7 @@ "name": "pair of rollerskates", "name_plural": "pairs of rollerskates", "description": "An old-fashioned pair of leather rollerskates with steel frames. While quite fast on flat floors, they make it difficult to take hits or to move on rough terrain.", - "weight": 2720, + "weight": "2720 g", "volume": "3 L", "price": 8500, "to_hit": -2, @@ -904,7 +904,7 @@ "name": "pair of birchbark shoes", "name_plural": "pairs of birchbark shoes", "description": "Simple shoes woven from strips of birch bark. Not very comfortable, but better than going barefoot.", - "weight": 345, + "weight": "345 g", "volume": "500 ml", "price": 3500, "material": [ "wood" ], @@ -923,7 +923,7 @@ "name": "pair of bowling shoes", "name_plural": "pairs of bowling shoes", "description": "A pair of flat-soled shoes designed to give you a grip on slippery surfaces.", - "weight": 840, + "weight": "840 g", "volume": "1500 ml", "price": 4000, "material": [ "cotton", "leather" ], @@ -942,7 +942,7 @@ "name": "pair of slippers", "name_plural": "pairs of slippers", "description": "Soft shoes that keep your feet warm. Not suitable for running.", - "weight": 70, + "weight": "70 g", "volume": "250 ml", "price": 600, "to_hit": -2, @@ -962,7 +962,7 @@ "name": "pair of sneakers", "name_plural": "pairs of sneakers", "description": "Guaranteed to make you run faster and jump higher!", - "weight": 840, + "weight": "840 g", "volume": "1500 ml", "price": 10000, "material": [ "cotton", "leather" ], @@ -981,7 +981,7 @@ "name": "pair of straw sandals", "name_plural": "pairs of straw sandals", "description": "Sandals made from straw rope. Not very comfortable, but can keep your feet safe.", - "weight": 70, + "weight": "70 g", "volume": "500 ml", "price": 2000, "to_hit": -2, @@ -1000,7 +1000,7 @@ "name": "pair of swim fins", "name_plural": "pairs of swim fins", "description": "A pair of rubber flippers worn on the feet which improve swimming speed while greatly impeding the wearer's ability to walk.", - "weight": 680, + "weight": "680 g", "volume": "1250 ml", "price": 2000, "material": [ "plastic" ], @@ -1019,7 +1019,7 @@ "name": "pair of thigh-high boots", "name_plural": "pairs of thigh-high boots", "description": "Very long leather boots that reach past the knees. Difficult to wear but extremely durable.", - "weight": 1540, + "weight": "1540 g", "volume": "4250 ml", "price": 8000, "to_hit": -1, @@ -1041,7 +1041,7 @@ "name": "pair of swimming booties", "name_plural": "pairs of swimming booties", "description": "A pair of neoprene swimming booties, with individual toes.", - "weight": 310, + "weight": "310 g", "volume": "1 L", "price": 6800, "material": [ "neoprene", "cotton" ], @@ -1061,7 +1061,7 @@ "name": "pair of heelys (off)", "name_plural": "pairs of heelys (off)", "description": "A pair of sneakers with wheels, currently the wheels are hidden.", - "weight": 840, + "weight": "840 g", "volume": "1500 ml", "price": 10000, "material": [ "cotton", "leather" ], @@ -1081,7 +1081,7 @@ "name": "pair of heelys (on)", "name_plural": "pairs of heelys (on)", "description": "A pair of sneakers with wheels, currently the wheels are out.", - "weight": 840, + "weight": "840 g", "volume": "1500 ml", "price": 10000, "material": [ "cotton", "leather" ], diff --git a/data/json/items/armor/holster.json b/data/json/items/armor/holster.json index 232dcd8e0fe1e..f9bde549aafa6 100644 --- a/data/json/items/armor/holster.json +++ b/data/json/items/armor/holster.json @@ -4,7 +4,7 @@ "type": "ARMOR", "name": "back holster", "description": "A leather holster, big enough for a rifle or other large gun. Designed to be strapped to the back. Whilst initially cumbersome it becomes much easier to use with practice. Activate to holster/draw a gun.", - "weight": 240, + "weight": "240 g", "volume": "1250 ml", "price": 10000, "material": "leather", @@ -22,7 +22,7 @@ "type": "ARMOR", "name": "ankle holster", "description": "A small concealed holster worn on the ankle. It is awkward to use without practice. Activate to holster/draw a small pistol.", - "weight": 200, + "weight": "200 g", "volume": "250 ml", "price": 7400, "material": "leather", @@ -48,7 +48,7 @@ "name": "bow sling", "name_plural": "bow slings", "description": "A somewhat complicated set of straps and fabric to keep your bow close to hand and (mostly) out of harms way. Activate to holster/draw your bow.", - "weight": 320, + "weight": "320 g", "volume": "500 ml", "price": 8000, "material": [ "cotton" ], @@ -66,7 +66,7 @@ "type": "ARMOR", "name": "holster", "description": "A leather strap worn on the hip for holding pistol sized guns. Activate to holster/draw a gun.", - "weight": 220, + "weight": "220 g", "volume": "500 ml", "price": 9000, "material": "leather", @@ -94,7 +94,7 @@ "type": "ARMOR", "name": "deep concealment holster", "description": "An elastic band with numerous provisions for concealing a very small pistol close to the body. It is awkward to use without practice. Activate to holster/draw a gun.", - "weight": 120, + "weight": "120 g", "volume": "250 ml", "price": 3000, "material": "plastic", @@ -116,7 +116,7 @@ "name": "survivor harness", "name_plural": "survivor harnesses", "description": "A custom-built light harness covered with pouches and including an integral tactical sling for a small rifle or other such weapon. Durable and carefully crafted to be comfortable to wear. Activate to holster/draw your weapon.", - "weight": 320, + "weight": "320 g", "volume": "1250 ml", "price": 20000, "material": [ "leather", "cotton" ], @@ -135,7 +135,7 @@ "type": "ARMOR", "name": "XL holster", "description": "A belt holster consisting of a loop and strap intended for use with larger firearms. Slightly more cumbersome than a standard holster due to the straps that hold it flat against your leg, Activate to holster/draw a gun.", - "weight": 320, + "weight": "320 g", "volume": "250 ml", "price": 9000, "rigid": false, diff --git a/data/json/items/armor/jewelry.json b/data/json/items/armor/jewelry.json index 12da1df53b8e6..88b91b59169c4 100644 --- a/data/json/items/armor/jewelry.json +++ b/data/json/items/armor/jewelry.json @@ -5,7 +5,7 @@ "name": "beaded bracelet", "description": "A simple bracelet of string and wooden beads. You can wear it if you like, but it won't provide any effects.", "looks_like": "copper_bracelet", - "weight": 12, + "weight": "12 g", "volume": 0, "price": 100, "flags": [ "VARSIZE", "FANCY" ], @@ -16,9 +16,10 @@ { "id": "bead_ear", "type": "ARMOR", - "name": "beaded earring", - "description": "A simple bracelet of string and wooden beads. You can wear it if you like, but it won't provide any effects.", - "weight": 7, + "name": "pair of beaded earrings", + "name_plural": "pairs of beaded earrings", + "description": "A simple pair of earrings made of string and wooden beads. You can wear it if you like, but it won't provide any effects.", + "weight": "7 g", "volume": 0, "price": 100, "material": [ "wood" ], @@ -31,7 +32,7 @@ "name": "beaded necklace", "description": "A simple necklace made of string and wooden beads. You can wear it if you like, but it won't provide any effects.", "looks_like": "necklace", - "weight": 15, + "weight": "15 g", "volume": 0, "price": 100, "material": [ "wood" ], @@ -45,7 +46,7 @@ "name": "friendship bracelet", "description": "A homemade bracelet crafted from colorful knickknacks. It's not very expensive, but it's the effort that makes it special.", "looks_like": "copper_bracelet", - "weight": 20, + "weight": "20 g", "volume": 0, "price": 100, "flags": [ "VARSIZE", "FANCY" ], @@ -58,7 +59,7 @@ "type": "ARMOR", "name": "bronze medal", "description": "A medal awarded for achieving third place in some event. It might be worth something if it was made of bronze; this one is made from iron.", - "weight": 25, + "weight": "25 g", "volume": 0, "price": 1000, "material": [ "iron" ], @@ -71,7 +72,7 @@ "type": "ARMOR", "name": "diamond dental grill", "description": "Fake teeth inlaid with diamonds, worn over the teeth. Fits horribly, but looks very shiny. For that high-class gangsta rap look.", - "weight": 10, + "weight": "10 g", "volume": 0, "price": 50000, "price_postapoc": 1500, @@ -89,7 +90,7 @@ "type": "ARMOR", "name": "diamond ring", "description": "A gold ring with a sparkling diamond mounted on top of it. Back in the old days this could be worth a fortune. You can wear it if you like, but it won't provide any effects.", - "weight": 12, + "weight": "12 g", "volume": 0, "price": 190000, "price_postapoc": 1700, @@ -104,7 +105,7 @@ "name": "diver's watch", "name_plural": "diver's watches", "description": "A waterproof, self-winding watch on a stainless steel watchband. Tells the time and current temperature. Activate to check the digital thermometer.", - "weight": 65, + "weight": "65 g", "volume": "250 ml", "price": 12000, "price_postapoc": 700, @@ -122,7 +123,7 @@ "type": "ARMOR", "name": "collar pin", "description": "A staple accessory for gentlemen. Keeps your shirt collar in place and provides a more aesthetically pleasing arc to your necktie. You can wear it if you like, but it won't provide any effects.", - "weight": 10, + "weight": "10 g", "volume": 0, "price": 25000, "price_postapoc": 200, @@ -136,7 +137,7 @@ "type": "ARMOR", "name": "copper bracelet", "description": "An old-fashioned, copper bracelet. You can wear it if you like, but it won't provide any effects.", - "weight": 86, + "weight": "86 g", "volume": 0, "price": 2500, "price_postapoc": 100, @@ -147,9 +148,10 @@ { "id": "copper_ear", "type": "ARMOR", - "name": "copper earring", - "description": "A copper earring. It's pretty heavy. You can wear it if you like, but it won't provide any effects.", - "weight": 50, + "name": "pair of copper earrings", + "name_plural": "pairs of copper earrings", + "description": "A pair of copper earrings. It's pretty heavy. You can wear it if you like, but it won't provide any effects.", + "weight": "50 g", "volume": 0, "price": 2900, "price_postapoc": 50, @@ -162,7 +164,7 @@ "type": "ARMOR", "name": "copper hairpin", "description": "A hairpin made from copper. You can wear it if you like, but it won't provide any effects.", - "weight": 2, + "weight": "2 g", "volume": 0, "price": 500, "material": [ "copper" ], @@ -174,7 +176,7 @@ "type": "ARMOR", "name": "copper locket", "description": "A circular, copper locket. It's been tarnished with use, and has gained some dull green spots. You can wear it if you like, but it won't provide any effects.", - "weight": 45, + "weight": "45 g", "volume": 0, "price": 1000, "material": [ "copper" ], @@ -186,7 +188,7 @@ "type": "ARMOR", "name": "copper necklace", "description": "A simple chain of copper, with a clasp in the middle to create a necklace. You can wear it if you like, but it won't provide any effects.", - "weight": 30, + "weight": "30 g", "volume": 0, "price": 3000, "material": [ "copper" ], @@ -198,7 +200,7 @@ "type": "ARMOR", "name": "copper ring", "description": "A plain, copper ring. Not very shiny, and not very popular. You can wear it if you like, but it won't provide any effects.", - "weight": 50, + "weight": "50 g", "volume": 0, "price": 2000, "material": [ "copper" ], @@ -210,7 +212,7 @@ "type": "ARMOR", "name": "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, + "weight": "15 g", "volume": 0, "price": 3000, "material": [ "silver" ], @@ -222,7 +224,7 @@ "type": "ARMOR", "name": "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, + "weight": "21 g", "volume": 0, "price": 7000, "material": [ "silver", "gold" ], @@ -234,7 +236,7 @@ "type": "ARMOR", "name": "plug", "description": "Those round things people plug into their earlobes as earrings, also called \"ear plug\" or \"ear spool.\" You can wear it if you like, but it won't provide any effects.", - "weight": 10, + "weight": "10 g", "volume": 0, "price": 1200, "price_postapoc": 10, @@ -248,7 +250,7 @@ "type": "ARMOR", "name": "gold bracelet", "description": "A fancy golden bracelet. You can wear it if you like, but it won't provide any effects.", - "weight": 40, + "weight": "40 g", "volume": 0, "price": 46000, "price_postapoc": 1000, @@ -262,7 +264,7 @@ "type": "ARMOR", "name": "gold dental grill", "description": "Fake golden teeth, worn over the teeth. Fits horribly, but looks very shiny.", - "weight": 10, + "weight": "10 g", "volume": 0, "price": 20000, "price_postapoc": 500, @@ -277,9 +279,10 @@ { "id": "gold_ear", "type": "ARMOR", - "name": "gold earring", - "description": "A shiny gold earring. You can wear it if you like, but it won't provide any effects.", - "weight": 10, + "name": "pair of gold earrings", + "name_plural": "pairs of gold earrings", + "description": "A pair of shiny gold earrings. You can wear it if you like, but it won't provide any effects.", + "weight": "10 g", "volume": 0, "price": 13000, "price_postapoc": 500, @@ -293,7 +296,7 @@ "type": "ARMOR", "name": "gold hairpin", "description": "A gold hairpin, designed by the rich, for the rich. You can wear it if you like, but it won't provide any effects.", - "weight": 4, + "weight": "4 g", "volume": 0, "price": 5000, "material": [ "gold" ], @@ -306,7 +309,7 @@ "type": "ARMOR", "name": "gold locket", "description": "A heart-shaped, gold locket with a frame inside to store photographs or small objects. You can wear it if you like, but it won't provide any effects.", - "weight": 50, + "weight": "50 g", "volume": 0, "price": 20000, "material": [ "gold" ], @@ -319,7 +322,7 @@ "type": "ARMOR", "name": "gold medal", "description": "A medal awarded for achieving first place in some event. Before everything fell apart, this could be a source of pride for its owner. Now it's just another shiny bauble.", - "weight": 30, + "weight": "30 g", "volume": 0, "price": 10000, "material": [ "gold" ], @@ -332,7 +335,7 @@ "type": "ARMOR", "name": "gold necklace", "description": "A shiny, unadorned gold necklace. You can wear it if you like, but it won't provide any effects.", - "weight": 30, + "weight": "30 g", "volume": 0, "price": 40000, "material": [ "gold" ], @@ -345,7 +348,7 @@ "type": "ARMOR", "name": "gold ring", "description": "A flashy gold ring. You can wear it if you like, but it won't provide any effects.", - "weight": 10, + "weight": "10 g", "volume": 0, "price": 30000, "material": [ "gold" ], @@ -358,7 +361,7 @@ "name": "gold watch", "name_plural": "gold watches", "description": "A gold-plated steel self-winding wristwatch, suitable for a retirement present. Tells the time and looks good.", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "price": 50000, "price_postapoc": 2000, @@ -375,7 +378,7 @@ "type": "ARMOR", "name": "tie clip", "description": "A fancy silver tie clip, a great match for your skinny tie. You can wear it if you like, but it won't provide any effects.", - "weight": 12, + "weight": "12 g", "volume": 0, "price": 28000, "price_postapoc": 200, @@ -389,7 +392,7 @@ "name": "silver watch", "name_plural": "silver watches", "description": "An elegant silver watch, crafted from silver-plated stainless steel. It's much cheaper than other metal watches, and more classy than an ordinary wristwatch.", - "weight": 80, + "weight": "80 g", "volume": "250 ml", "price": 18000, "to_hit": -1, @@ -405,7 +408,7 @@ "type": "ARMOR", "name": "silver bracelet", "description": "A nice silver bracelet. You can wear it if you like, but it won't provide any effects.", - "weight": 30, + "weight": "30 g", "volume": 0, "price": 25000, "price_postapoc": 500, @@ -417,9 +420,10 @@ { "id": "silver_ear", "type": "ARMOR", - "name": "silver earring", - "description": "A beautiful silver earring. You can wear it if you like, but it won't provide any effects.", - "weight": 9, + "name": "pair of silver earrings", + "name_plural": "pairs of silver earrings", + "description": "A pair of beautiful silver earrings. You can wear it if you like, but it won't provide any effects.", + "weight": "9 g", "volume": 0, "price": 8000, "price_postapoc": 200, @@ -435,7 +439,7 @@ "name_plural": "fancy watches", "//": "That's about the midpoint for a rolex.", "description": "A rather large and expensively made wristwatch. Tells the time in elegantly wrought gold with silver detailing. It's really the only timepiece suitable for someone of your exquisitely discerning tastes.", - "weight": 80, + "weight": "80 g", "volume": "250 ml", "price": 2200000, "price_postapoc": 3000, @@ -452,7 +456,7 @@ "type": "ARMOR", "name": "small relic", "description": "A small relic from a forgotten saint. As extraordinary as the world has become it may have some power yet.", - "weight": 60, + "weight": "60 g", "volume": 0, "price": 1000, "material": [ "bone", "silver" ], @@ -466,7 +470,7 @@ "type": "ARMOR", "name": "holy symbol", "description": "A necklace made of fine gold chain bearing the symbol of a forgotten faith.", - "weight": 22, + "weight": "22 g", "volume": 0, "price": 5000, "price_postapoc": 500, @@ -481,7 +485,7 @@ "type": "ARMOR", "name": "handmade holy symbol", "description": "A simple necklace representing a religious faith.", - "weight": 38, + "weight": "38 g", "volume": 0, "price": 500, "material": [ "wood", "cotton" ], @@ -495,7 +499,7 @@ "name": "jade brooch", "name_plural": "jade brooches", "description": "A hand-crafted jade brooch of Oriental origin. You can wear it if you like, but it won't provide any effects.", - "weight": 26, + "weight": "26 g", "volume": 0, "price": 90000, "material": [ "stone" ], @@ -509,7 +513,7 @@ "name": "platinum watch", "name_plural": "platinum watches", "description": "Flex on those gold-watch wearers with the rare, expensive and superior platinum watch. This one is made from solid platinum.", - "weight": 80, + "weight": "80 g", "volume": "250 ml", "//": "far more expensive than gold watches, around $100,000 for most platinum watches ", "price": 10000000, @@ -526,7 +530,7 @@ "type": "ARMOR", "name": "platinum bracelet", "description": "A flawless platinum bracelet. You can wear it if you like, but it won't provide any effects.", - "weight": 50, + "weight": "50 g", "volume": 0, "price": 38000, "material": [ "platinum" ], @@ -539,7 +543,7 @@ "type": "ARMOR", "name": "platinum dental grill", "description": "Fake platinum-and-silver teeth. They may be cheaper than fake gold teeth, but they're much more rare. Fits horribly, but looks very shiny.", - "weight": 15, + "weight": "15 g", "volume": 0, "price": 15000, "bashing": 2, @@ -553,9 +557,10 @@ { "id": "platinum_ear", "type": "ARMOR", - "name": "gold earring", - "description": "Plain platinum earrings, the rich person's earring - if gold is getting boring, just use another rare metal. You can wear it if you like, but it won't provide any effects.", - "weight": 15, + "name": "pair of platinum earrings", + "name_plural": "pairs of platinum earrings", + "description": "A pair of plain platinum earrings - if gold is getting boring, just use another rare metal. You can wear it if you like, but it won't provide any effects.", + "weight": "15 g", "volume": 0, "price": 12000, "material": [ "platinum" ], @@ -568,7 +573,7 @@ "type": "ARMOR", "name": "platinum hairpin", "description": "The ultimate in esoteric, metal hair accessories, this hairpin is made from pure platinum. You can wear it if you like, but it won't provide any effects.", - "weight": 7, + "weight": "7 g", "volume": 0, "price": 3500, "material": [ "platinum" ], @@ -581,7 +586,7 @@ "type": "ARMOR", "name": "platinum locket", "description": "A small, platinum locket for storing photographs or other small objects. You can wear it if you like, but it won't provide any effects.", - "weight": 65, + "weight": "65 g", "volume": 0, "price": 16000, "material": [ "platinum" ], @@ -594,7 +599,7 @@ "type": "ARMOR", "name": "platinum necklace", "description": "A platinum necklace, with a small, empty heart frame hanging from a chain. You can wear it if you like, but it won't provide any effects.", - "weight": 47, + "weight": "47 g", "volume": 0, "price": 50000, "material": [ "platinum" ], @@ -607,7 +612,7 @@ "type": "ARMOR", "name": "platinum ring", "description": "A platinum ring, engraved with all manner of swirls and spirals. You can wear it if you like, but it won't provide any effects.", - "weight": 13, + "weight": "13 g", "volume": 0, "price": 24000, "material": [ "platinum" ], @@ -620,7 +625,7 @@ "type": "ARMOR", "name": "engagement ring", "description": "This ring is an intricate gold band, with a small cluster of diamonds set in the center. Before the world broke down, this ring would've cost a small fortune.", - "weight": 14, + "weight": "14 g", "volume": 0, "price": 100000, "material": [ "gold", "diamond" ], @@ -633,7 +638,7 @@ "type": "ARMOR", "name": "purity ring", "description": "Also known as a promise ring, this ring is worn as a sign of chastity. This one bears the inscription, \"Love is patient.\"", - "weight": 6, + "weight": "6 g", "volume": 0, "price": 1700, "material": [ "silver" ], @@ -646,7 +651,7 @@ "type": "ARMOR", "name": "signet ring", "description": "A gold and silver ring with a wide stamp attached to the band. A long time ago, the stamp was legible, but now the pattern is too worn to discern its former use.", - "weight": 25, + "weight": "25 g", "volume": 0, "price": 10000, "material": [ "gold", "silver" ], @@ -659,7 +664,7 @@ "type": "ARMOR", "name": "wedding ring", "description": "A flawless ring, ensnaring a diamond with twists of pure gold. It's a constant reminder that the wearer is married.", - "weight": 16, + "weight": "16 g", "volume": 0, "price": 150000, "material": [ "gold", "diamond" ], @@ -672,7 +677,7 @@ "type": "ARMOR", "name": "silver necklace", "description": "A nice silver necklace. You can wear it if you like, but it won't provide any effects.", - "weight": 30, + "weight": "30 g", "volume": 0, "price": 12000, "material": [ "silver" ], @@ -685,7 +690,7 @@ "type": "ARMOR", "name": "silver hairpin", "description": "A shiny, silver hairpin with a tiny bee engraved onto it. You can wear it if you like, but it won't provide any effects.", - "weight": 3, + "weight": "3 g", "volume": 0, "price": 2000, "material": [ "silver" ], @@ -698,7 +703,7 @@ "type": "ARMOR", "name": "silver locket", "description": "A small, silver locket with a frame inside to store photographs or small objects. You can wear it if you like, but it won't provide any effects.", - "weight": 30, + "weight": "30 g", "volume": 0, "price": 4000, "material": [ "silver" ], @@ -711,7 +716,7 @@ "type": "ARMOR", "name": "silver medal", "description": "A medal awarded for achieving second place in some event. Before everything fell apart, this could be a source of pride for its owner. Now it's just another shiny bauble.", - "weight": 20, + "weight": "20 g", "volume": 0, "price": 5000, "material": [ "silver" ], @@ -724,7 +729,7 @@ "type": "ARMOR", "name": "silver ring", "description": "A simple, silver ring. You can wear it if you like, but it won't provide any effects.", - "weight": 6, + "weight": "6 g", "volume": 0, "price": 5000, "material": [ "silver" ], @@ -737,7 +742,7 @@ "type": "ARMOR", "name": "leather collar", "description": "A black leather 'collar' with a bell dangling from the front. Don't worry, the bell is silent.", - "weight": 10, + "weight": "10 g", "volume": "250 ml", "price": 10000, "material": [ "leather" ], @@ -751,7 +756,7 @@ "name": "wrist watch", "name_plural": "wrist watches", "description": "A simple wristwatch on a plastic band. Tells the time and has an alarm clock feature.", - "weight": 50, + "weight": "50 g", "volume": "250 ml", "price": 5000, "price_postapoc": 300, @@ -769,7 +774,7 @@ "name": "radiation badge", "//": "These seem to be sold via subscription; makes a certain amount of sense, but low-bid seems a Bad Idea.", "description": "A plastic badge with an embedded film strip. The film strip changes color as it is exposed to radiation. Wear on your lapel so you can notice if it changes.", - "weight": 20, + "weight": "20 g", "volume": 0, "price": 8000, "material": [ "plastic" ], @@ -782,7 +787,7 @@ "type": "ARMOR", "name": "badge template", "description": "This is a template for police/medical badges. If found in a game it is a bug.", - "weight": 60, + "weight": "60 g", "volume": 0, "price": 5000, "price_postapoc": 700, @@ -839,7 +844,7 @@ "type": "ARMOR", "name": "doctor badge", "material": [ "plastic" ], - "weight": 10, + "weight": "10 g", "price_postapoc": 30, "description": "A plastic name tag marking the wearer as a real doctor of the medical kind." }, @@ -850,7 +855,7 @@ "name": "Foodkid badge", "material": [ "plastic" ], "price_postapoc": 30, - "weight": 10, + "weight": "10 g", "description": "A star shaped badge, on it you can read \"Foodkid\" in bold letters. This is Foodperson's trusty sidekick's badge." }, { @@ -859,7 +864,7 @@ "name": "pair of fuzzy cat ears", "name_plural": "pairs of fuzzy cat ears", "description": "A fuzzy pair of brownish cat ears on a headband. It does nothing, but there's no reason not to look good even if no one's looking.", - "weight": 20, + "weight": "20 g", "volume": "250 ml", "price": 1500, "material": [ "fur", "plastic" ], @@ -882,7 +887,7 @@ "type": "ARMOR", "name": "fuzzy cat tail", "description": "A fuzzy tawny tail weighted down with tiny beads of plastic. Sways behind you when you walk.", - "weight": 80, + "weight": "80 g", "volume": "250 ml", "price": 1000, "bashing": 4, @@ -905,7 +910,7 @@ "type": "ARMOR", "name": "fur kitty collar", "description": "A decorative 'collar' made out of fur, complete with a little bell hanging from the front. Don't worry, it's silent.", - "weight": 10, + "weight": "10 g", "volume": "250 ml", "price": 1000, "material": [ "fur" ], @@ -922,39 +927,13 @@ "material": [ "faux_fur" ], "color": "pink" }, - { - "id": "leather_belt", - "type": "ARMOR", - "name": "leather belt", - "description": "A leather belt. Useful for making your pair of pants fit.", - "weight": 102, - "volume": "250 ml", - "price": 9000, - "bashing": 5, - "material": [ "leather" ], - "symbol": "[", - "color": "brown", - "covers": [ "TORSO" ], - "coverage": 5, - "material_thickness": 1, - "use_action": { - "type": "holster", - "holster_prompt": "Stick what into your belt", - "holster_msg": "You tuck your %s into your %s", - "max_volume": "500 ml", - "max_weight": 400, - "draw_cost": 60, - "flags": [ "BELT_CLIP" ] - }, - "flags": [ "WAIST", "WATER_FRIENDLY" ] - }, { "id": "leather_cat_ears", "type": "ARMOR", "name": "pair of leather cat ears", "name_plural": "pairs of leather cat ears", "description": "A shiny pair of black cat ears on a headband. It does nothing, but there's no reason not to look good even if no one's looking.", - "weight": 20, + "weight": "20 g", "volume": "250 ml", "price": 3000, "material": [ "leather", "plastic" ], @@ -967,7 +946,7 @@ "type": "ARMOR", "name": "leather cat tail", "description": "A glossy black leather tail weighted down with tiny beads of plastic. Sways behind you when you walk.", - "weight": 80, + "weight": "80 g", "volume": "250 ml", "price": 2500, "bashing": 4, diff --git a/data/json/items/armor/pets_dog_armor.json b/data/json/items/armor/pets_dog_armor.json index 9228f37baa2a9..d1b113355ddc6 100644 --- a/data/json/items/armor/pets_dog_armor.json +++ b/data/json/items/armor/pets_dog_armor.json @@ -10,7 +10,7 @@ "price": 30000, "price_postapoc": 3000, "material": [ "kevlar" ], - "weight": 4290, + "weight": "4290 g", "volume": "4500 ml", "bashing": 5, "to_hit": -1, @@ -32,7 +32,7 @@ "price": 50000, "price_postapoc": 5000, "material": [ "acidchitin" ], - "weight": 5362, + "weight": "5362 g", "environmental_protection": 7 }, { @@ -58,7 +58,7 @@ "price": 25000, "price_postapoc": 2500, "material": [ "iron", "budget_steel" ], - "weight": 6434, + "weight": "6434 g", "material_thickness": 0 }, { @@ -72,7 +72,7 @@ "price": 17500, "price_postapoc": 1750, "material": [ "cotton", "leather" ], - "weight": 2145, + "weight": "2145 g", "extend": { "flags": [ "NO_SALVAGE" ] } }, { @@ -85,7 +85,7 @@ "price": 19000, "price_postapoc": 1900, "material": [ "bone", "leather" ], - "weight": 2645 + "weight": "2645 g" }, { "type": "PET_ARMOR", @@ -97,7 +97,7 @@ "price": 10000, "price_postapoc": 1000, "material": [ "neoprene", "plastic" ], - "weight": 1960, + "weight": "1960 g", "material_thickness": 0, "environmental_protection": 10, "min_pet_vol": "15000 ml", @@ -113,7 +113,7 @@ "price": 130000, "price_postapoc": 13000, "material": [ "superalloy" ], - "weight": 3125, + "weight": "3125 g", "storage": "25 L", "min_pet_vol": "20000 ml" } diff --git a/data/json/items/armor/pets_horse_armor.json b/data/json/items/armor/pets_horse_armor.json index ec2280529844b..d7017b98344ab 100644 --- a/data/json/items/armor/pets_horse_armor.json +++ b/data/json/items/armor/pets_horse_armor.json @@ -9,7 +9,7 @@ "price": 50000, "price_postapoc": 5000, "material": [ "kevlar" ], - "weight": 30000, + "weight": "30000 g", "volume": "150 L", "bashing": 10, "to_hit": -3, @@ -130,7 +130,7 @@ "type": "ARMOR", "name": "saddle bags", "description": "A pair of covered pouches laid across the back of a horse behind the saddle.", - "weight": 1000, + "weight": "1000 g", "volume": "7500 ml", "price": 15000, "material": [ "leather" ], diff --git a/data/json/items/armor/power_armor.json b/data/json/items/armor/power_armor.json index 59416d2998dd8..ac0aec9ba8f66 100644 --- a/data/json/items/armor/power_armor.json +++ b/data/json/items/armor/power_armor.json @@ -6,7 +6,7 @@ "name": "salvaged power armor", "//": "These are much cheaper than powered suits, because they're extremely heavy and impractical. The good stuff is gone!", "description": "The DoubleTech Power Armor, Mk. I: A heavy suit of basic power armor, offering very good protection against attacks, but hard to move in. This suit has had its servos and cooling system stripped out, meaning it no longer requires power, but also encumbers you greatly and doesn't provide internal thermal regulation.", - "weight": 12214, + "weight": "12214 g", "volume": "25 L", "price": 70000, "to_hit": 1, @@ -29,7 +29,7 @@ "category": "armor", "name": "salvaged power armor helmet", "description": "A basic helmet, designed for use with the DoubleTech Power Armor, Mk. I. Offers excellent protection from both attacks and environmental hazards. This suit has had its internal computer and cooling system stripped out, meaning it no longer requires power, but it has no internal chronometer and doesn't provide internal thermal regulation.", - "weight": 2416, + "weight": "2416 g", "volume": "5 L", "price": 30000, "to_hit": 1, @@ -52,7 +52,7 @@ "category": "armor", "name": "basic power armor", "description": "The DoubleTech Power Armor, Mk. I: A heavy suit of basic power armor, offering very good protection against attacks, but hard to move in. The UPS compartment can store other things if you don't mind powering the suit yourself. Like all DoubleTech power armor, the control and climate-regulation systems require direct skin contact.", - "weight": 20339, + "weight": "20339 g", "volume": "25 L", "price": 7000000, "to_hit": 1, @@ -77,7 +77,7 @@ "category": "armor", "name": "power armor hauling frame", "description": "A heavy duty hauling frame designed to interface with power armor.", - "weight": 1640, + "weight": "1640 g", "volume": "12 L", "price": 1000000, "to_hit": 1, @@ -98,7 +98,7 @@ "category": "armor", "name": "heavy power armor", "description": "A suit of DoubleTech Power Armor, Mk. II-H. This model offers several improvements over the Mk. I, most notably the improved environmental protection. Like all DoubleTech power armor, the control and climate-regulation systems require direct skin contact.", - "weight": 29009, + "weight": "29009 g", "volume": "30 L", "price": 11500000, "to_hit": 1, @@ -123,7 +123,7 @@ "category": "armor", "name": "basic power armor helmet", "description": "A basic helmet, designed for use with the DoubleTech Power Armor, Mk. I. Offers excellent protection from both attacks and environmental hazards. Like all DoubleTech power armor, the control and climate-regulation systems require direct skin contact.", - "weight": 3628, + "weight": "3628 g", "volume": "5 L", "price": 2500000, "to_hit": 1, @@ -147,7 +147,7 @@ "category": "armor", "name": "heavy power armor helmet", "description": "A power armor helmet designed for use with the DoubleTech Power Armor, Mk. II-H. This improved design is heavier than the Mk. I helmet, but cooler, and offers better environmental protection. Like all DoubleTech power armor, the control and climate-regulation systems require direct skin contact.", - "weight": 5442, + "weight": "5442 g", "volume": "7 L", "price": 3750000, "to_hit": 1, @@ -171,7 +171,7 @@ "category": "armor", "name": "light power armor helmet", "description": "A power armor helmet designed for use with the DoubleTech Power Armor, Mk. II-L. This improved design is lighter and cooler than the Mk. I helmet. Like all DoubleTech power armor, the control and climate-regulation systems require direct skin contact.", - "weight": 1814, + "weight": "1814 g", "volume": "4 L", "price": 3750000, "to_hit": 1, @@ -195,7 +195,7 @@ "category": "armor", "name": "light power armor", "description": "A suit of DoubleTech Power Armor, Mk. II-L. This model offers several improvements over the Mk. I, most notably the reduced weight. Like all DoubleTech power armor, the control and climate-regulation systems require direct skin contact.", - "weight": 7670, + "weight": "7670 g", "volume": "15 L", "price": 11500000, "to_hit": 1, diff --git a/data/json/items/battery.json b/data/json/items/battery.json index ef0ebacce0d7b..93d2ca43919a6 100644 --- a/data/json/items/battery.json +++ b/data/json/items/battery.json @@ -6,7 +6,7 @@ "name": "test battery", "name_plural": "test batteries", "description": "This is a testing item for the BATTERY item type. If you found one in game it's a bug.", - "weight": 200, + "weight": "200 g", "volume": "250 ml", "price": 1500, "material": [ "iron", "plastic" ], @@ -23,7 +23,7 @@ "name": "ultra-light battery", "name_plural": "ultra-light batteries", "description": "This is a light battery cell designed for small size over everything else. It retains its universal compatibility, though.", - "weight": 5, + "weight": "5 g", "volume": 0, "price": 1500, "material": [ "iron", "plastic" ], @@ -41,7 +41,7 @@ "name": "ultra-light plutonium fuel battery", "name_plural": "ultra-light plutonium fuel batteries", "description": "This battery uses a thin plutonium-244 rod to stablize an exotic nanocompound. It is universally compatible with small devices. Although it stores a huge amount of power, it cannot be recharged.", - "weight": 80, + "weight": "80 g", "volume": 0, "price": 15000, "material": [ "iron", "plastic" ], @@ -60,7 +60,7 @@ "name": "ultra-light disposable battery", "name_plural": "ultra-light disposable batteries", "description": "This is a light battery cell designed for small size over everything else. It retains its universal compatibility, though. The battery's chemistry means that it has a very high capacity, but cannot be recharged.", - "weight": 5, + "weight": "5 g", "volume": 0, "price": 3000, "material": [ "iron", "plastic" ], @@ -79,7 +79,7 @@ "name": "light battery", "name_plural": "light batteries", "description": "This is a light battery cell, universally compatible with all kinds of small devices.", - "weight": 50, + "weight": "50 g", "volume": "75ml", "price": 3500, "material": [ "iron", "plastic" ], @@ -97,7 +97,7 @@ "name": "light battery (high-capacity)", "name_plural": "light batteries (high-capacity)", "description": "This is a high-capacity light battery cell, universally compatible with all kinds of small devices.", - "weight": 75, + "weight": "75 g", "volume": "115ml", "price": 5000, "material": [ "iron", "plastic" ], @@ -115,7 +115,7 @@ "name": "light plutonium fuel battery", "name_plural": "light plutonium fuel batteries", "description": "This battery uses a thin plutonium-244 rod to stabilize an exotic nanocompound. It is universally compatible with all kinds of personal electronic devices. Although it stores a huge amount of power, it cannot be recharged.", - "weight": 160, + "weight": "160 g", "volume": "115ml", "price": 50000, "material": [ "iron", "plastic" ], @@ -134,7 +134,7 @@ "name": "light disposable battery", "name_plural": "light disposable batteries", "description": "This is a light battery cell, universally compatible with all kinds of small devices. The battery's chemistry means that it has a very high capacity, but cannot be recharged.", - "weight": 75, + "weight": "75 g", "volume": "115ml", "price": 10000, "material": [ "iron", "plastic" ], @@ -153,7 +153,7 @@ "name": "medium battery", "name_plural": "medium batteries", "description": "This is a medium battery cell, universally compatible with all kinds of appliances and power tools.", - "weight": 250, + "weight": "250 g", "volume": "375ml", "price": 10000, "material": [ "iron", "plastic" ], @@ -171,7 +171,7 @@ "name": "medium battery (high-capacity)", "name_plural": "medium batteries (high-capacity)", "description": "This is a high-capacity medium battery cell, universally compatible with all kinds of appliances and power tools.", - "weight": 350, + "weight": "350 g", "volume": "450ml", "price": 12500, "material": [ "iron", "plastic" ], @@ -189,7 +189,7 @@ "name": "medium plutonium fuel battery", "name_plural": "medium plutonium fuel batteries", "description": "This battery uses a thin plutonium-244 rod to stablize an exotic nanocompound. It is universally compatible with all kinds of appliances and power tools. Although it stores a huge amount of power, it cannot be recharged.", - "weight": 800, + "weight": "800 g", "volume": "375ml", "price": 100000, "material": [ "iron", "plastic" ], @@ -208,7 +208,7 @@ "name": "medium disposable battery", "name_plural": "medium disposable batteries", "description": "This is a medium battery cell, universally compatible with all kinds of appliances and power tools. The battery's chemistry means that it has a very high capacity, but cannot be recharged.", - "weight": 350, + "weight": "350 g", "volume": "450ml", "price": 10000, "material": [ "iron", "plastic" ], @@ -227,7 +227,7 @@ "name": "heavy battery", "name_plural": "heavy batteries", "description": "This is a heavy battery cell, universally compatible with all kinds of industrial-grade equipment and large tools.", - "weight": 500, + "weight": "500 g", "volume": "750ml", "price": 10000, "material": [ "iron", "plastic" ], @@ -245,7 +245,7 @@ "name": "heavy battery (high-capacity)", "name_plural": "heavy batteries (high-capacity)", "description": "This is a high-capacity heavy battery cell, universally compatible with all kinds of industrial-grade equipment and large tools.", - "weight": 950, + "weight": "950 g", "volume": "1000ml", "price": 12500, "material": [ "iron", "plastic" ], @@ -263,7 +263,7 @@ "name": "heavy plutonium fuel battery", "name_plural": "heavy plutonium fuel batteries", "description": "This battery uses a thin plutonium-244 rod to stablize an exotic nanocompound. It is universally compatible with all kinds of industrial-grade equipment and large tools. Although it stores a huge amount of power, it cannot be recharged.", - "weight": 1600, + "weight": "1600 g", "volume": "750ml", "price": 100000, "material": [ "iron", "plastic" ], @@ -281,7 +281,7 @@ "category": "spare_parts", "name": "military plutonium fuel cell", "description": "This battery uses a huge plutonium-244 rod to stablize an exotic nanocompound. It was used in military mech-suits, was highly experimental, and had no civilian applications. Although it stores a stupendous amount of power, it cannot be recharged.", - "weight": 64000, + "weight": "64000 g", "volume": "30 L", "price": 100000, "material": [ "superalloy", "plastic" ], @@ -300,7 +300,7 @@ "name": "heavy disposable battery", "name_plural": "heavy disposable batteries", "description": "This is a heavy battery cell, universally compatible with all kinds of industrial-grade equipment and large tools. The battery's chemistry means that it has a very high capacity, but cannot be recharged.", - "weight": 950, + "weight": "950 g", "volume": "1000ml", "price": 10000, "material": [ "iron", "plastic" ], diff --git a/data/json/items/bionics.json b/data/json/items/bionics.json index 61b1873ec762f..473130f78d58c 100644 --- a/data/json/items/bionics.json +++ b/data/json/items/bionics.json @@ -4,7 +4,7 @@ "type": "BIONIC_ITEM", "category": "bionics", "name": "abstract bionic module", - "weight": 2041, + "weight": "2041 g", "volume": "2500 ml", "bashing": 8, "material": [ "steel", "plastic" ], @@ -27,7 +27,7 @@ "type": "BIONIC_ITEM", "name": "abstract faulty bionic module", "price": 0, - "weight": 500, + "weight": "500 g", "description": "This CBM is broken beyond repair, you can't do anything with it." }, { @@ -37,7 +37,7 @@ "name": "Adrenaline Pump CBM", "description": "A stimulator system that is implanted alongside the adrenal glands, allowing the user to trigger their body's adrenaline response at the cost of some bionic power.", "price": 4000, - "weight": 250, + "weight": "250 g", "difficulty": 6 }, { @@ -45,9 +45,9 @@ "copy-from": "bionic_general_npc_usable", "type": "BIONIC_ITEM", "name": "Active Defense System CBM", - "description": "This bionic projects a thin forcefield around the user's body. Anything attempting to penetrate this field has a chance of being deflected at the cost of energy. Bullets will be stopped more often than swords and those in turn more often than massive objects.", + "description": "This bionic projects a thin forcefield around the user's body. Anything attempting to penetrate this field has a chance of being deflected at the cost of energy, reducing their ability to deal damage. Bullets will be deflected more than swords and those in turn more than massive objects.", "price": 950000, - "weight": 1000, + "weight": "1000 g", "difficulty": 7 }, { @@ -57,7 +57,7 @@ "name": "Alarm System CBM", "description": "A motion-detecting alarm system will notice almost all movement within a fifteen-foot radius, and will silently alert the user. This is very useful during sleep, or if the user suspects a cloaked pursuer.", "price": 25000, - "weight": 500, + "weight": "500 g", "difficulty": 1 }, { @@ -76,7 +76,7 @@ "name": "Protective Lenses CBM", "description": "A bionic package that seals the user's eye sockets with highly protective mirrored lenses and re-routes their tear ducts to their mouth. When the user cries, they must spit out or swallow their tears.", "price": 550000, - "weight": 500, + "weight": "500 g", "difficulty": 5 }, { @@ -86,7 +86,7 @@ "name": "Head Alloy Plating CBM", "description": "Alloy plating that replaces the flesh on the user's head, protecting both their head and jaw regions.", "price": 350000, - "weight": 1000, + "weight": "1000 g", "difficulty": 5 }, { @@ -105,7 +105,7 @@ "name": "Torso Alloy Plating CBM", "description": "Alloy plating that replaces the flesh on the user's torso, protecting it from physical trauma.", "price": 350000, - "weight": 3000, + "weight": "3000 g", "difficulty": 4 }, { @@ -115,7 +115,7 @@ "name": "Battery System CBM", "description": "A battery draining attachment to make use of the energy contained in normal, everyday batteries.", "price": 80000, - "weight": 250, + "weight": "250 g", "difficulty": 4 }, { @@ -125,7 +125,7 @@ "name": "Monomolecular Blade CBM", "description": "A deadly foot-long blade made of advanced material that is installed inside the forearm, capable of being extended through the back of the user's wrist at the cost of a small amount of power. Though exceptionally sharp, it will prevent the user from holding anything else while extended.", "price": 8000, - "weight": 250, + "weight": "250 g", "difficulty": 8 }, { @@ -144,7 +144,7 @@ "name": "Blood Analysis CBM", "description": "Small sensors that are implanted in the user's heart, allowing them to analyze their blood. This will detect many illnesses, drugs, and other conditions.", "price": 320000, - "weight": 150, + "weight": "150 g", "difficulty": 2 }, { @@ -154,7 +154,7 @@ "name": "Blood Filter CBM", "description": "A filtration system that is installed in the heart and can actively filter out chemical impurities, primarily drugs, with limited impact on viruses. Note that it is not a targeted filter; ALL drugs in the system will be affected.", "price": 350000, - "weight": 200, + "weight": "200 g", "difficulty": 3 }, { @@ -164,7 +164,7 @@ "name": "Cable Charger System CBM", "description": "A complex port that is mounted above the hip. While active, it will recharge bionic power when connected to a battery via jumper cable.", "price": 80000, - "weight": 250, + "weight": "250 g", "difficulty": 4 }, { @@ -192,7 +192,7 @@ "name": "Bionic Claws CBM", "description": "Vicious, retractable claws that are implanted inside the user's fingers. These do considerable cutting damage, but prevent the user from holding anything else while extended.", "price": 550000, - "weight": 500, + "weight": "500 g", "difficulty": 5 }, { @@ -220,7 +220,7 @@ "name": "Close Quarters Battle CBM", "description": "A set of bionic processors and databanks, loaded with martial arts combat programs. Whilst active, the CQB module will improve the user's hand to hand combat skills, but prevents them from improving them through combat experience.", "price": 220000, - "weight": 250, + "weight": "250 g", "difficulty": 8 }, { @@ -230,7 +230,7 @@ "name": "Wired Reflexes CBM", "description": "Bionic nerve stimulators that greatly enhance reaction times, granting a +2 bonus to dexterity.", "price": 800000, - "weight": 500, + "weight": "500 g", "difficulty": 11 }, { @@ -249,7 +249,7 @@ "name": "Enhanced Hearing CBM", "description": "While this bionic is active, the user's hearing will be drastically improved, allowing them to hear ten times better than the average person. Additionally, high-intensity sounds will be automatically dampened before they can damage their hearing.", "price": 500000, - "weight": 500, + "weight": "500 g", "difficulty": 6 }, { @@ -295,7 +295,7 @@ "name": "Diamond Cornea CBM", "description": "A set of diamond corneas which greatly enhance the user's vision, granting a +2 bonus to perception.", "price": 800000, - "weight": 100, + "weight": "100 g", "difficulty": 11 }, { @@ -305,7 +305,7 @@ "name": "Telescopic Eyes CBM", "description": "An array of high-powered, auto-focusing lenses that replaces much of the material in the inner eye. This fixes any vision problems and allows for an increased vision range akin to binoculars.", "price": 500000, - "weight": 100, + "weight": "100 g", "difficulty": 5 }, { @@ -315,7 +315,7 @@ "name": "Facial Distortion CBM", "description": "Through controlled application of electrochemical impulses, this bionic mudule lets the user alter their facial structure so as to subtly affect the reactions of others. This grants a bonus to all social interactions.", "price": 850000, - "weight": 200, + "weight": "200 g", "difficulty": 5 }, { @@ -325,7 +325,7 @@ "name": "Dielectric Capacitance System CBM", "description": "A network of miniature piezoelectric capacitors, implanted throughout the body to protect from external electrical discharge.", "price": 5000, - "weight": 500, + "weight": "500 g", "difficulty": 5 }, { @@ -335,7 +335,7 @@ "name": "Fingerhack CBM", "description": "A miniature electrohack, surgically embedded in a finger of the right hand. This is an all-purpose hacking unit used to override control panels and the like, but not computers. Computer proficiency is important, and a failed use may cause damage.", "price": 350000, - "weight": 100, + "weight": "100 g", "difficulty": 2 }, { @@ -345,7 +345,7 @@ "name": "Flashbang Generator CBM", "description": "A combination of LEDs and speakers that create a flash and sound comparable to a flashbang grenade, deafening and blinding nearby enemies.", "price": 720000, - "weight": 500, + "weight": "500 g", "difficulty": 5 }, { @@ -355,7 +355,7 @@ "name": "Cranial Flashlight CBM", "description": "A small, but powerful LED flashlight that is mounted between the eyes.", "price": 20000, - "weight": 250, + "weight": "250 g", "difficulty": 2 }, { @@ -365,7 +365,7 @@ "name": "LED Tattoo", "description": "An LED display implanted beneath the epidermis that can display patterns or pictures through the skin. When active it glows dimly, providing a very small amount of light.", "price": 20000, - "weight": 20, + "weight": "20 g", "difficulty": 1 }, { @@ -375,7 +375,7 @@ "name": "Integrated Dosimeter CBM", "description": "Small radiation sensors that are implanted throughout the body, allowing the user to analyze their level of absorbed radiation. They will also alert the user whenever exposed to environmental radiation.", "price": 350000, - "weight": 150, + "weight": "150 g", "difficulty": 3 }, { @@ -385,7 +385,7 @@ "name": "Respirator CBM", "description": "A complex respiration augmentation system that increases the user's maximal oxygen uptake and allows for underwater breathing akin to gills. Will automatically activate if the user is drowning.", "price": 450000, - "weight": 700, + "weight": "700 g", "difficulty": 6 }, { @@ -395,7 +395,7 @@ "name": "Terranian Sonar CBM", "description": "Precision sonar equipment, implanted in the feet to allow the detection of below-ground movement, buried traps, and unstable terrain.", "price": 450000, - "weight": 500, + "weight": "500 g", "difficulty": 5 }, { @@ -405,7 +405,7 @@ "name": "Heat Drain CBM", "description": "While fighting unarmed against a warm-blooded opponent, there is a chance that a successful hit will drain body heat, inflicting a small amount of extra damage, and recharging the user's bionic power reserves slightly.", "price": 550000, - "weight": 500, + "weight": "500 g", "difficulty": 5 }, { @@ -433,7 +433,7 @@ "name": "Infrared Vision CBM", "description": "A bionic module that extends the range of vision into the infrared, allowing the user to see warm-blooded creatures in the dark and through smoke.", "price": 450000, - "weight": 500, + "weight": "500 g", "difficulty": 6 }, { @@ -443,7 +443,7 @@ "name": "Cerebral Booster CBM", "description": "Bionic coprocessors that are implanted in the brain, granting a +2 bonus to intelligence.", "price": 800000, - "weight": 100, + "weight": "100 g", "difficulty": 11 }, { @@ -453,7 +453,7 @@ "name": "Finger-Mounted Laser CBM", "description": "A small, high-powered laser that is embedded in the fingertip. This long range weapon is not incredibly damaging, but is very accurate, and has the potential to start fires.", "price": 720000, - "weight": 500, + "weight": "500 g", "difficulty": 5 }, { @@ -463,7 +463,7 @@ "name": "Leukocyte Breeder System CBM", "description": "Bionic stimulators which augment the user's haematopoiesis system, allowing them to accelerate white blood cell production using bionic power. It is designed for continuous use and may cause unpleasant side effects when turned off.", "price": 6000, - "weight": 600, + "weight": "600 g", "difficulty": 7 }, { @@ -473,7 +473,7 @@ "name": "Mini-Flamethrower CBM", "description": "Powerful fire starters which extend from the tip of both hands' index fingers.", "price": 130000, - "weight": 500, + "weight": "500 g", "difficulty": 4 }, { @@ -483,7 +483,7 @@ "name": "Fingerpick CBM", "description": "An electronic lockpick that is embedded in a fingertip. This automatic system will quickly unlock all but the most advanced key locks without any skill required on the part of the user.", "price": 350000, - "weight": 200, + "weight": "200 g", "difficulty": 2 }, { @@ -493,7 +493,7 @@ "name": "Electromagnetic Unit CBM", "description": "A powerful electromagnet that is implanted into the user's right hand, allowing them to indiscriminately pull all nearby magnetic objects towards them. Unlucky bystanders might be injured or killed by flying objects.", "price": 200000, - "weight": 700, + "weight": "700 g", "difficulty": 2 }, { @@ -503,7 +503,7 @@ "name": "Nictating Membrane CBM", "description": "A thin membrane that closes over the eyes while underwater, negating any vision penalties.", "price": 450000, - "weight": 1, + "weight": "1 g", "difficulty": 6 }, { @@ -513,7 +513,7 @@ "name": "Enhanced Memory Banks CBM", "description": "A set of highly-advanced quantum storage drives used to enhance memory. While active, they increase the rate that the user learns skills, and give them near-perfect memory of skills and terrain.", "price": 1000000, - "weight": 100, + "weight": "100 g", "difficulty": 9 }, { @@ -523,7 +523,7 @@ "name": "Metabolic Interchange CBM", "description": "This module interconnects the user's digestive system and power supply, letting them replenish bionic energy by burning calories.", "price": 70000, - "weight": 700, + "weight": "700 g", "difficulty": 4 }, { @@ -533,7 +533,7 @@ "name": "Weather Reader CBM", "description": "A multitude of scientific instruments and sensors collect environmental data. The data is compiled and presented as a simple readout of the current weather. It also passively tells the user their external temperature.", "price": 350000, - "weight": 700, + "weight": "700 g", "difficulty": 3 }, { @@ -543,7 +543,7 @@ "name": "Repair Nanobots CBM", "description": "A fleet of tiny dormant robots. While activated they will flit about the user's body, repairing damage and stopping bleeding at the cost of power.", "price": 950000, - "weight": 200, + "weight": "200 g", "difficulty": 6 }, { @@ -562,7 +562,7 @@ "name": "Implanted Night Vision CBM", "description": "This bionic module modifies the user's eyes to amplify existing light, allowing them to see in the dark.", "price": 900000, - "weight": 100, + "weight": "100 g", "difficulty": 11 }, { @@ -572,7 +572,7 @@ "name": "Offensive Defense System CBM", "description": "A thin forcefield gets projected around the user's body, continually draining power. This field does not deflect attacks, but rather delivers a strong shock, damaging unarmed attackers and those with a conductive weapon.", "price": 950000, - "weight": 1000, + "weight": "1000 g", "difficulty": 7 }, { @@ -582,7 +582,7 @@ "name": "Sensory Dulling CBM", "description": "This module lets the user's nervous system inhibit pain signals, allowing them to dull their senses at will. However, the use of this system may cause delayed reaction times and drowsiness.", "price": 200000, - "weight": 300, + "weight": "300 g", "difficulty": 4 }, { @@ -592,7 +592,7 @@ "name": "Power Armor Interface CBM", "description": "Interfaces the user's bionic power system with the internal charging port on suits of power armor, allowing them to draw from the user's bionic power banks.", "price": 120000, - "weight": 500, + "weight": "500 g", "difficulty": 1 }, { @@ -602,7 +602,7 @@ "name": "Power Armor Mk. II Interface CBM", "description": "Interfaces the user's bionic power system with the internal charging port on suits of power armor, allowing them to draw from the user's bionic power banks. Twice as efficient as the Mk. I model. The Mk. II was designed by DoubleTech Inc., to meet the popularity of the Mk. II power armor series.", "price": 1000000, - "weight": 400, + "weight": "400 g", "difficulty": 8 }, { @@ -612,7 +612,7 @@ "name": "Power Storage CBM", "description": "A Compact Bionics Module that upgrades the user's power capacity by 100 units. Having at least one of these is a prerequisite to using powered bionics. The user will also need a power supply, found in various CBMs.", "price": 380000, - "weight": 70, + "weight": "70 g", "difficulty": 1 }, { @@ -623,7 +623,7 @@ "name_plural": "Power Storage CBM Mk. II", "description": "A Compact Bionics Module developed at DoubleTech Industries as a replacement for the highly successful Power Storage CBM. Increases the user's power capacity by 250 units.", "price": 1000000, - "weight": 50, + "weight": "50 g", "difficulty": 1 }, { @@ -642,7 +642,7 @@ "name": "Air Filtration System CBM", "description": "An advanced filtration system that is implanted in the trachea. If toxins, or airborne diseases find their way into the windpipe, the filter will attempt to remove them.", "price": 450000, - "weight": 100, + "weight": "100 g", "difficulty": 4 }, { @@ -652,7 +652,7 @@ "name": "Radiation Scrubber System CBM", "description": "A system of advanced piezomechanical blood filters that are implanted throughout your body, allowing the user to purge themself of absorbed radiation at the cost of some bionic power.", "price": 450000, - "weight": 100, + "weight": "100 g", "difficulty": 4 }, { @@ -662,7 +662,7 @@ "name": "Railgun CBM", "description": "EM field generators in the user's arms increase the range and damage of thrown magnetic objects at a cost of 1 bionic power per throw. They will create a trail of electricity that can cause additional damage.", "price": 220000, - "weight": 1000, + "weight": "1000 g", "difficulty": 3 }, { @@ -672,9 +672,19 @@ "name": "Fingertip Razors CBM", "description": "A set of ten double-edged, four centimeter long razor-sharp claws that are implanted underneath the fingernails. These will deal a small amount of unarmed slashing damage whenever the user's fingertips are uncovered.", "price": 450000, - "weight": 5, + "weight": "5 g", "difficulty": 4 }, + { + "id": "bio_fuel_cell_gasoline", + "copy-from": "bionic_general", + "type": "BIONIC_ITEM", + "name": "Gasoline Fuel Cell CBM", + "description": "A small gasoline fuel cell able to convert gasoline to bionic power. It's connected to a diffuse network of bio-plastic bladders able to hold up to 500 ml of gasoline.", + "price": 450000, + "weight": 600, + "difficulty": 7 + }, { "id": "bio_recycler", "copy-from": "bionic_general_npc_usable", @@ -682,7 +692,7 @@ "name": "Recycler Unit CBM", "description": "A series of filters and processors that is implanted in the user's digestive system, allowing them to reclaim waste liquid and, to a lesser degree, nutrients. The net effect is a greatly reduced need to eat and drink.", "price": 850000, - "weight": 1500, + "weight": "1500 g", "difficulty": 6 }, { @@ -692,7 +702,7 @@ "name": "Remote Controller CBM", "description": "A small module that connects to the user's brain and allows them to interface with nearby devices with wireless capabilities.", "price": 600000, - "weight": 250, + "weight": "250 g", "difficulty": 6 }, { @@ -711,7 +721,7 @@ "name": "Olfactory Mask CBM", "description": "While this system is powered, the user's body will produce very little odor, making it nearly impossible for creatures to track them by scent.", "price": 850000, - "weight": 1000, + "weight": "1000 g", "difficulty": 5 }, { @@ -721,7 +731,7 @@ "name": "Scent Vision CBM", "description": "This system lets the user visually sense their own scent, making it possible for them to recognize their surroundings even in complete darkness.", "price": 450000, - "weight": 100, + "weight": "100 g", "difficulty": 8 }, { @@ -731,7 +741,7 @@ "name": "Electroshock Unit CBM", "description": "While fighting unarmed, or with a weapon that conducts electricity, there is a chance that a successful hit will shock the user's opponent, inflicting extra damage and disabling them temporarily at the cost of some energy.", "price": 550000, - "weight": 1000, + "weight": "1000 g", "difficulty": 5 }, { @@ -741,7 +751,7 @@ "name": "Shockwave Generator CBM", "description": "This bionic module generates a powerful shockwave, knocking back all nearby creatures. Targets are stunned briefly, take damage and additional stun upon impact with impassable terrain, and knock back any creatures they collide with.", "price": 550000, - "weight": 1000, + "weight": "1000 g", "difficulty": 5 }, { @@ -751,7 +761,7 @@ "name": "Synaptic Accelerator CBM", "description": "Bionic stimulators that enhance the nervous system, granting a 10% boost to your speed.", "price": 10000, - "weight": 400, + "weight": "400 g", "difficulty": 12 }, { @@ -761,7 +771,7 @@ "name": "Muscle Augmentation CBM", "description": "Myomer fibers that enhance the muscular system, granting a +2 bonus to strength.", "price": 800000, - "weight": 1500, + "weight": "1500 g", "difficulty": 11 }, { @@ -771,7 +781,7 @@ "name": "Autonomous Surgical Scalpels CBM", "description": "A system of surgical grade scalpels that is implanted in the user's fingers. They allow for automated precise cuts and can be used as a high-quality butchering tool.", "price": 220000, - "weight": 20, + "weight": "20 g", "difficulty": 4 }, { @@ -781,7 +791,7 @@ "name": "Anti-Glare Compensators CBM", "description": "A set of quick-reacting transition lenses that are installed over the user's eyes. They negate glare penalties, partially protect from bright flashes, and protect the eyes when welding.", "price": 450000, - "weight": 1, + "weight": "1 g", "difficulty": 4 }, { @@ -791,7 +801,7 @@ "name": "Targeting System CBM", "description": "This bionic module contains range finders and synchronizes the movement of the user's eyes with their arms, to a degree. Shots they fire will be much more accurate, particularly at long ranges.", "price": 650000, - "weight": 250, + "weight": "250 g", "difficulty": 5 }, { @@ -828,7 +838,7 @@ "name": "Joint Torsion Ratchet CBM", "description": "Torsion ratchets that replace the user's joints to slowly generate power when they move. These can be toggled to generate more power, but movement will require more effort.", "price": 380000, - "weight": 1000, + "weight": "1000 g", "difficulty": 4 }, { @@ -838,7 +848,7 @@ "name": "Joint Servo CBM", "description": "A set of servomotors that get installed on leg joints to provide power-assisted movement. They are optimized for running, but walking also requires less effort while this bionic is active. However, when it's offline it will hamper the user's movement.", "price": 450000, - "weight": 1000, + "weight": "1000 g", "difficulty": 4 }, { @@ -848,7 +858,7 @@ "name": "Uncanny Dodge CBM", "description": "Bionic processors that augment the the user's nervous system, allowing them to dodge attacks beyond normal human capability, including bullets.", "price": 950000, - "weight": 1000, + "weight": "1000 g", "difficulty": 11 }, { @@ -858,7 +868,7 @@ "name": "Unified Power System CBM", "description": "A Unified Power System that is wired into the user's bionic power banks. Objects that run on a UPS can now directly draw power from the bionic power supply.", "price": 25000, - "weight": 700, + "weight": "700 g", "difficulty": 3 }, { @@ -868,7 +878,7 @@ "name": "Internal Chronometer CBM", "description": "This bionic module contains an atomic clock, complete with silent alarm clock function.", "price": 1000, - "weight": 10, + "weight": "10 g", "difficulty": 1 }, { @@ -878,7 +888,7 @@ "name": "Water Extraction Unit CBM", "description": "This module contains nanotubes that are embedded in the palm of the hand to pump any available fluid out of a dead body, cleanse it of impurities and convert it into potable water. Water container not included.", "price": 550000, - "weight": 100, + "weight": "100 g", "difficulty": 5 }, { @@ -888,7 +898,7 @@ "name": "Intravenous Needletip CBM", "description": "A small tube with a retractable needle that terminates in a net of tiny hoses instead of a plunger. Installed, it allows the user to draw substances directly into their bloodstream akin to a regular syringe.", "price": 1000, - "weight": 10, + "weight": "10 g", "difficulty": 1 }, { @@ -898,7 +908,7 @@ "name": "Titanium Skeletal Bracing CBM", "description": "A set of hinges, springs, and other synthetic augments for the skeletal structure. These artificial enhancers strengthen the knees and elbows, allowing the user to carry more weight.", "price": 50000, - "weight": 3000, + "weight": "3000 g", "difficulty": 3 }, { @@ -908,7 +918,7 @@ "name": "Kinetic Shock Absorbers CBM", "description": "A set of hydraulic springs and foldable padding that replaces most of the flesh in the limbs and upper torso. While active, these absorbers will negate damage from severe impacts such as falling, at the cost of reducing the user's ability to move effectively.", "price": 10000, - "weight": 3000, + "weight": "3000 g", "difficulty": 4 }, { @@ -918,7 +928,7 @@ "name": "Taste Modifier CBM", "description": "A set of highly sensitive sensors implanted in the user's mouth, combined with a sophisticated analyzer. While active, it will block all unpleasant taste and texture at the cost of bionic energy.", "price": 40000, - "weight": 100, + "weight": "100 g", "difficulty": 5 }, { @@ -928,7 +938,7 @@ "name": "Soporific Induction CBM", "description": "A microscopic electrode designed to gently stimulate a particular cluster of neurons in the hypothalamus, helping the user to fall asleep.", "price": 350000, - "weight": 50, + "weight": "50 g", "difficulty": 2 }, { @@ -938,7 +948,7 @@ "name": "Squeaky Ankles", "name_plural": "Squeaky Ankles", "description": "A pair of defective bionics that make squeaking noises.", - "weight": 100, + "weight": "100 g", "difficulty": 4 }, { @@ -956,7 +966,7 @@ "type": "BIONIC_ITEM", "name": "Acidic Leaking CBM", "description": "This CBM has been breached in several places and some acid is leaking from it.", - "weight": 700, + "weight": "700 g", "difficulty": 11 }, { @@ -965,7 +975,7 @@ "type": "BIONIC_ITEM", "name": "Faulty Electric System", "description": "This CBM is a mess of naked wire and burnt resistors.", - "weight": 700, + "weight": "700 g", "difficulty": 5 }, { @@ -974,7 +984,7 @@ "type": "BIONIC_ITEM", "name": "Electrical Drain", "description": "This CBM was wired incorrectly and would drain power from any system connected to it.", - "weight": 900, + "weight": "900 g", "difficulty": 5 }, { @@ -983,7 +993,7 @@ "type": "BIONIC_ITEM", "name": "Itchy Metal Thing", "description": "You can't recognise what this is supposed to be, but it's a very awkward thing to have in one's body.", - "weight": 200, + "weight": "200 g", "difficulty": 3 }, { @@ -992,7 +1002,7 @@ "type": "BIONIC_ITEM", "name": "Glowy Thing", "description": "It's a... thing? And it glows, at least it did when it was plugged in.", - "weight": 5, + "weight": "5 g", "difficulty": 3 }, { @@ -1001,7 +1011,7 @@ "type": "BIONIC_ITEM", "name": "Leaky Bionic", "description": "A mess of pierced pipes and broken seals, something unpleasant is leaking from it.", - "weight": 600, + "weight": "600 g", "difficulty": 7 }, { @@ -1010,7 +1020,7 @@ "type": "BIONIC_ITEM", "name": "Noisemaker", "description": "A malfunctioning bionic. When powered, it occasionally emits a loud burst of noise.", - "weight": 250, + "weight": "250 g", "difficulty": 3 }, { @@ -1019,7 +1029,7 @@ "type": "BIONIC_ITEM", "name": "Bionic Nostril", "description": "This thing was up someone's nose, they're probably glad to be rid of it.", - "weight": 50, + "weight": "50 g", "difficulty": 3 }, { @@ -1028,7 +1038,7 @@ "type": "BIONIC_ITEM", "name": "Bionic Visual Impairment", "description": "A defective bionic that impairs vision.", - "weight": 100, + "weight": "100 g", "difficulty": 8 }, { @@ -1053,7 +1063,7 @@ "type": "BIONIC_ITEM", "name": "Endocrine Enervator", "description": "This malfunctioning bionic causes fatigue by altering the unfortunate user's brain chemistry.", - "weight": 100, + "weight": "100 g", "difficulty": 11 }, { @@ -1080,7 +1090,7 @@ "name": "Self-Locking Thumbs", "name_plural": "Self-Locking Thumbs", "description": "A pair of faulty, self-locking thumb bionics.", - "weight": 50, + "weight": "50 g", "difficulty": 5 }, { @@ -1089,7 +1099,7 @@ "type": "BIONIC_ITEM", "name": "Visual Disruptor", "description": "A pair of defective ocular bionics that cause visual distortion and pixelation.", - "weight": 100, + "weight": "100 g", "difficulty": 8 }, { @@ -1098,7 +1108,7 @@ "type": "BIONIC_ITEM", "name": "Voice Remodulator", "description": "Part of the autodoc's 'Cyborg Identity Package', this bionic gives the user a creepy robot voice.", - "weight": 100, + "weight": "100 g", "difficulty": 5 } ] diff --git a/data/json/items/biosignatures.json b/data/json/items/biosignatures.json index 7c0e922fc3c43..168f06ceec3b2 100644 --- a/data/json/items/biosignatures.json +++ b/data/json/items/biosignatures.json @@ -4,7 +4,7 @@ "id": "feces_bird", "name": "bird litter", "category": "chems", - "weight": 40, + "weight": "40 g", "color": "brown", "spoils_in": "4 days 16 hours", "comestible_type": "FOOD", @@ -25,7 +25,7 @@ "id": "feces_cow", "name": "cow pie", "copy-from": "feces_bird", - "weight": 750, + "weight": "750 g", "volume": "1 L", "description": "A fresh cow pie, could probably be used to make some great fertilizer." }, @@ -41,7 +41,7 @@ "id": "feces_manure", "name": "manure", "copy-from": "feces_bird", - "weight": 250, + "weight": "250 g", "volume": "500 ml", "description": "Common manure, could probably be used to make some great fertilizer." }, diff --git a/data/json/items/book/archery.json b/data/json/items/book/archery.json index 069eb622a2068..33c3973cdad35 100644 --- a/data/json/items/book/archery.json +++ b/data/json/items/book/archery.json @@ -5,7 +5,7 @@ "name": "Lessons for the Novice Bowhunter", "name_plural": "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, + "weight": "932 g", "volume": "1250 ml", "price": 2000, "material": [ "paper" ], @@ -22,7 +22,7 @@ "name": "Archery for Kids", "name_plural": "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, + "weight": "60 g", "volume": "250 ml", "price": 480, "material": [ "paper" ], @@ -40,7 +40,7 @@ "name": "Zen and the Art of Archery", "name_plural": "Zen and the Art of Archery", "description": "This massive book contains a wealth of vital information for the novice archer.", - "weight": 1454, + "weight": "1454 g", "volume": "1250 ml", "price": 1900, "material": [ "paper" ], diff --git a/data/json/items/book/barter.json b/data/json/items/book/barter.json index c432a67b58c46..143a32d988df1 100644 --- a/data/json/items/book/barter.json +++ b/data/json/items/book/barter.json @@ -4,7 +4,7 @@ "type": "BOOK", "name": "car buyer's guide", "description": "Normally this glossy, ad-filled magazine about cars would be pointless, but it has a series of articles on haggling techniques.", - "weight": 90, + "weight": "90 g", "volume": "250 ml", "price": 450, "material": [ "paper" ], @@ -21,7 +21,7 @@ "name": "How to Succeed in Business", "name_plural": "How to Succeed in Business", "description": "Useful if you want to get a good deal when purchasing goods.", - "weight": 454, + "weight": "454 g", "volume": "750 ml", "price": 1900, "material": [ "paper" ], @@ -40,7 +40,7 @@ "name_plural": "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, + "weight": "1587 g", "volume": "1750 ml", "price": 9800, "bashing": 5, diff --git a/data/json/items/book/bashing.json b/data/json/items/book/bashing.json index 2439c1122bf26..b6ec917aaa953 100644 --- a/data/json/items/book/bashing.json +++ b/data/json/items/book/bashing.json @@ -5,7 +5,7 @@ "name": "Batter Up!", "name_plural": "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, + "weight": "80 g", "volume": "250 ml", "price": 450, "material": [ "paper" ], @@ -22,7 +22,7 @@ "type": "BOOK", "name": "tactical baton defense manual", "description": "An informative guide to self-defense using clubs and batons. Aimed at the law enforcement and military market, it is packed with time tested, no-nonsense information and written to be understandable for beginners.", - "weight": 454, + "weight": "454 g", "volume": "250 ml", "price": 2000, "material": [ "paper" ], diff --git a/data/json/items/book/computer.json b/data/json/items/book/computer.json index 489c8f5f79d05..e4c9b4b118b64 100644 --- a/data/json/items/book/computer.json +++ b/data/json/items/book/computer.json @@ -4,7 +4,7 @@ "type": "BOOK", "name": "SICP", "description": "A classic text, \"The Structure and Interpretation of Computer Programs.\" Written with examples in LISP, but applicable to any language.", - "weight": 1587, + "weight": "1587 g", "volume": "1500 ml", "price": 7800, "bashing": 6, @@ -24,7 +24,7 @@ "name": "Computer Science 301", "name_plural": "Computer Science 301", "description": "A college textbook on computer science.", - "weight": 1587, + "weight": "1587 g", "volume": "1750 ml", "price": 7900, "bashing": 5, @@ -44,7 +44,7 @@ "name": "How to Browse the Web", "name_plural": "How to Browse the Web", "description": "Very beginner-level information about computers.", - "weight": 454, + "weight": "454 g", "volume": "750 ml", "price": 1700, "material": [ "paper" ], @@ -61,7 +61,7 @@ "name": "Computer World", "name_plural": "Computer World", "description": "An informative magazine all about computers, both hardware and software.", - "weight": 80, + "weight": "80 g", "volume": "250 ml", "price": 450, "material": [ "paper" ], @@ -79,7 +79,7 @@ "name_plural": "Computer Science 101", "//": "College-level textbooks are Cheap at $60.", "description": "An entry-level textbook about computers.", - "weight": 462, + "weight": "462 g", "volume": "750 ml", "price": 5500, "material": [ "paper" ], @@ -96,7 +96,7 @@ "name": "Principles of Advanced Programming", "name_plural": "Principles of Advanced Programming", "description": "A heavy textbook dedicated to advanced-level software design, written for several different programming languages.", - "weight": 2206, + "weight": "2206 g", "volume": "1750 ml", "price": 8500, "bashing": 5, diff --git a/data/json/items/book/cooking.json b/data/json/items/book/cooking.json index a6766164a80ad..c0b15258f25cb 100644 --- a/data/json/items/book/cooking.json +++ b/data/json/items/book/cooking.json @@ -5,7 +5,7 @@ "name": "Advanced Physical Chemistry", "name_plural": "Advanced Physical Chemistry", "description": "A university-level textbook on advanced principles of chemistry, both organic and inorganic.", - "weight": 1712, + "weight": "1712 g", "volume": "2 L", "price": 7950, "bashing": 5, @@ -24,7 +24,7 @@ "type": "BOOK", "name": "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, + "weight": "1587 g", "volume": "1500 ml", "price": 4950, "bashing": 4, @@ -43,7 +43,7 @@ "type": "BOOK", "name": "Cooking on a Budget", "description": "A nice cook book that goes beyond recipes and into the chemistry of food.", - "weight": 454, + "weight": "454 g", "volume": "1 L", "price": 1900, "material": [ "paper" ], @@ -61,7 +61,7 @@ "name_plural": "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, + "weight": "454 g", "volume": "1 L", "price": 40000, "material": [ "paper" ], @@ -80,7 +80,7 @@ "name": "Cucina Italiana", "name_plural": "Cucina Italiana", "description": "This cookbook is written in Italian, but handily illustrated with step by step photo instructions.", - "weight": 454, + "weight": "454 g", "volume": "1 L", "price": 2000, "material": [ "paper" ], @@ -98,7 +98,7 @@ "name": "Sushi Made Easy", "name_plural": "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, + "weight": "921 g", "volume": "750 ml", "price": 3500, "bashing": 1, @@ -116,7 +116,7 @@ "type": "BOOK", "name": "family cookbook", "description": "A big binder full of somebody's family recipes. The well-turned pages and creased corners speak volumes of the culinary knowledge contained within. You could probably learn a lot about cooking from studying this domestic artifact.", - "weight": 1887, + "weight": "1887 g", "volume": "1250 ml", "price": 1950, "bashing": 5, @@ -136,7 +136,7 @@ "name": "Bon Appetit", "name_plural": "Bon Appetit", "description": "Exciting recipes and restaurant reviews. Full of handy tips about cooking.", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "price": 450, "material": [ "paper" ], @@ -153,7 +153,7 @@ "type": "BOOK", "name": "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, + "weight": "160 g", "volume": "500 ml", "price": 450, "material": [ "paper" ], @@ -171,7 +171,7 @@ "name": "The Modern Tanner", "name_plural": "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, + "weight": "568 g", "volume": "750 ml", "price": 2000, "material": [ "paper", "leather" ], @@ -189,7 +189,7 @@ "name": "PE050 \"Alpha\": Preliminary Report", "name_plural": "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, + "weight": "50 g", "volume": "500 ml", "price": 125000, "material": [ "paper" ], @@ -208,7 +208,7 @@ "name": "lab journal-Dionne", "name_plural": "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, + "weight": "1700 g", "volume": "500 ml", "price": 50000, "material": [ "paper" ], @@ -227,7 +227,7 @@ "name": "PE065 \"Chimera\": Best Practices", "name_plural": "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, + "weight": "50 g", "volume": "500 ml", "price": 125000, "material": [ "paper" ], @@ -246,7 +246,7 @@ "name": "lab journal-Smythe", "name_plural": "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, + "weight": "1700 g", "volume": "500 ml", "price": 50000, "material": [ "paper" ], @@ -264,7 +264,7 @@ "type": "BOOK", "name": "standpipe maintenance log", "description": "This binder details the scheduled maintenance for several plumbing systems throughout the facility. However, some of the log sheets seem to be filled with...a chemical formula?", - "weight": 400, + "weight": "400 g", "volume": "750 ml", "price": 400, "material": [ "paper", "plastic" ], @@ -283,7 +283,7 @@ "name": "chemical reference-CLASSIFIED", "name_plural": "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, + "weight": "2000 g", "volume": "500 ml", "price": 64000, "material": [ "paper" ], @@ -302,7 +302,7 @@ "name": "lab journal-x-|xp", "name_plural": "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, + "weight": "1700 g", "volume": "500 ml", "price": 50000, "material": [ "paper" ], @@ -321,7 +321,7 @@ "name": "PE023 \"Medical\": Application and Findings", "name_plural": "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, + "weight": "1934 g", "volume": "1750 ml", "price": 62000, "bashing": 5, @@ -341,7 +341,7 @@ "name": "PE070 \"Raptor\": Proposal", "name_plural": "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, + "weight": "50 g", "volume": "500 ml", "price": 125000, "material": [ "paper" ], @@ -360,7 +360,7 @@ "name": "Best Practices for Compound Delivery", "name_plural": "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, + "weight": "1700 g", "volume": "500 ml", "price": 50000, "material": [ "paper" ], @@ -373,6 +373,24 @@ "time": "45 m", "fun": -4 }, + { + "id": "reference_cooking", + "type": "BOOK", + "name": "CRC-Merck handbook, 4th edition", + "name_plural": "copies of the 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, + "volume": "1750 ml", + "price": 9000, + "price_postapoc": 30000, + "bashing": 7, + "material": [ "paper" ], + "symbol": "?", + "color": "light_green", + "intelligence": 4, + "time": "30 m", + "fun": -2 + }, { "id": "scots_cookbook", "type": "BOOK", @@ -380,7 +398,7 @@ "name_plural": "copies of Ye Scots Beuk o Cuikery", "//": "That would translate out to The Scottish Book of Cookery, or The Scottish Cookbook.", "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, + "weight": "1887 g", "volume": "1250 ml", "price": 1950, "bashing": 5, @@ -399,7 +417,7 @@ "type": "BOOK", "name": "chemistry textbook", "description": "A college textbook on chemistry.", - "weight": 1587, + "weight": "1587 g", "volume": "2 L", "price": 7950, "bashing": 5, diff --git a/data/json/items/book/cutting.json b/data/json/items/book/cutting.json index 38537c95658f7..1886d5dd5d5ac 100644 --- a/data/json/items/book/cutting.json +++ b/data/json/items/book/cutting.json @@ -5,7 +5,7 @@ "name": "All About Swords", "name_plural": "All About Swords", "description": "An interesting magazine that contains information about swords and sword fighting techniques from all across the world.", - "weight": 80, + "weight": "80 g", "volume": "250 ml", "price": 450, "material": [ "paper" ], @@ -23,7 +23,7 @@ "name": "knife fighter's notes", "name_plural": "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, + "weight": "454 g", "volume": "250 ml", "price": 2000, "material": [ "paper" ], @@ -40,7 +40,7 @@ "name": "Spetsnaz Knife Techniques", "name_plural": "Spetsnaz Knife Techniques", "description": "A classic Soviet text on the art of attacking with a blade.", - "weight": 454, + "weight": "454 g", "volume": "250 ml", "price": 5200, "material": [ "paper" ], diff --git a/data/json/items/book/dodge.json b/data/json/items/book/dodge.json index 47e624e6e16bf..df7fd4b16f66c 100644 --- a/data/json/items/book/dodge.json +++ b/data/json/items/book/dodge.json @@ -5,7 +5,7 @@ "name": "Dance Dance Dance!", "name_plural": "Dance Dance Dance!", "description": "Learn the moves of the trendiest dances right now.", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "price": 490, "material": [ "paper" ], @@ -23,7 +23,7 @@ "name": "The Book of Dances", "name_plural": "Books 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, + "weight": "2330 g", "volume": "1250 ml", "price": 7200, "material": [ "paper" ], @@ -40,7 +40,7 @@ "name": "Break a Leg!", "name_plural": "Break a Leg!", "description": "The Kids' Guide to Acting and Stagecraft.", - "weight": 72, + "weight": "72 g", "volume": "250 ml", "price": 500, "material": [ "paper" ], diff --git a/data/json/items/book/driving.json b/data/json/items/book/driving.json index 2096fde3fb37e..6aeaa239a2389 100644 --- a/data/json/items/book/driving.json +++ b/data/json/items/book/driving.json @@ -5,7 +5,7 @@ "name": "AAA Guide", "name_plural": "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, + "weight": "220 g", "volume": "500 ml", "price": 2000, "material": [ "paper" ], @@ -22,7 +22,7 @@ "type": "BOOK", "name": "Top Gear magazine", "description": "Lots of articles about cars and driving techniques.", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "price": 450, "material": [ "paper" ], @@ -40,7 +40,7 @@ "name": "The Rules of the Road", "name_plural": "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, + "weight": "404 g", "volume": "500 ml", "price": 2200, "material": [ "paper" ], @@ -57,7 +57,7 @@ "name": "AAA Guide", "name_plural": "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, + "weight": "223 g", "volume": "500 ml", "price": 5000, "material": [ "paper" ], diff --git a/data/json/items/book/electronics.json b/data/json/items/book/electronics.json index e0d56e2c77565..f636bdcac8a0c 100644 --- a/data/json/items/book/electronics.json +++ b/data/json/items/book/electronics.json @@ -5,7 +5,7 @@ "name": "Advanced Electronics", "name_plural": "Advanced Electronics", "description": "A college textbook on circuit design.", - "weight": 1587, + "weight": "1587 g", "volume": "1750 ml", "price": 8200, "bashing": 5, @@ -25,7 +25,7 @@ "name": "Ham Radio Illustrated", "name_plural": "Ham Radio Illustrated", "description": "An amusing magazine about ham radio, with lots of diagrams and illustrations for making your own electronic devices.", - "weight": 45, + "weight": "45 g", "volume": "250 ml", "price": 450, "material": [ "paper" ], @@ -43,7 +43,7 @@ "name": "What's a Transistor?", "name_plural": "What's a Transistor?", "description": "A basic manual of electronics and circuit design.", - "weight": 454, + "weight": "454 g", "volume": "750 ml", "price": 2200, "material": [ "paper" ], @@ -60,7 +60,7 @@ "name": "Amateur Home Radio for Enthusiasts", "name_plural": "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, + "weight": "1587 g", "volume": "1750 ml", "price": 3300, "bashing": 5, @@ -79,7 +79,7 @@ "type": "BOOK", "name": "computer printout", "description": "One side of this sheet is printed with a meaningless jumble of characters, but the other side shows a complicated, hand-drawn circuit diagram.", - "weight": 10, + "weight": "10 g", "volume": 0, "price": 40000, "material": [ "paper" ], @@ -98,7 +98,7 @@ "name": "Augmentative Tech Review", "name_plural": "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, + "weight": "1909 g", "volume": "500 ml", "price": 3000, "material": [ "paper" ], @@ -117,7 +117,7 @@ "name": "lab journal-Herrera", "name_plural": "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, + "weight": "2000 g", "volume": "500 ml", "price": 56000, "material": [ "paper" ], @@ -136,7 +136,7 @@ "name": "2XI design binder-CLASSIFIED", "name_plural": "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, + "weight": "1409 g", "volume": "500 ml", "price": 74000, "material": [ "paper" ], @@ -155,7 +155,7 @@ "name": "plans for a radio repeater mod", "name_plural": "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, + "weight": "5 g", "volume": "250 ml", "price": 5000, "bashing": 1, @@ -174,7 +174,7 @@ "name": "Electronic Circuit Theory", "name_plural": "Electronic Circuit Theory", "description": "An advanced college textbook on circuit theory, design, and organization.", - "weight": 1587, + "weight": "1587 g", "volume": "1750 ml", "price": 9300, "bashing": 5, @@ -194,7 +194,7 @@ "name": "Robots for Fun & Profit", "name_plural": "Robots for Fun & Profit", "description": "A rare book on the design of robots, with lots of helpful step-by-step guides.", - "weight": 2063, + "weight": "2063 g", "volume": "2 L", "price": 9200, "bashing": 8, @@ -213,7 +213,7 @@ "type": "BOOK", "name": "schematics generic", "description": "seeing this is a bug", - "weight": 30, + "weight": "30 g", "volume": "250 ml", "price": 100000, "to_hit": -1, diff --git a/data/json/items/book/fabrication.json b/data/json/items/book/fabrication.json index 8a4592c2ba713..543975aad07c6 100644 --- a/data/json/items/book/fabrication.json +++ b/data/json/items/book/fabrication.json @@ -5,7 +5,7 @@ "name": "The Art of Glassblowing", "name_plural": "The Art of Glassblowing", "description": "A textbook that illustrates the science and technique of the ancient art of glassblowing.", - "weight": 1620, + "weight": "1620 g", "volume": "1250 ml", "price": 4500, "bashing": 4, @@ -24,7 +24,7 @@ "name": "Antique Adornments", "name_plural": "Antique Adornments", "description": "A comprehensive and illustrated history of crown, bracelet, necklace and others.", - "weight": 600, + "weight": "600 g", "volume": "1250 ml", "price": 2000, "material": [ "paper" ], @@ -42,7 +42,7 @@ "name": "Crafty Crafter's Quarterly", "name_plural": "Crafty Crafter's Quarterly", "description": "A fun quarterly magazine all about macaroni art and things you can make by supergluing found objects together.", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "price": 450, "material": [ "paper" ], @@ -60,7 +60,7 @@ "name": "101 Crafts for Beginners", "name_plural": "101 Crafts for Beginners", "description": "A large, paperback book detailing a hundred and one beginner's projects in fabrication.", - "weight": 510, + "weight": "510 g", "volume": "750 ml", "price": 2200, "material": [ "paper" ], @@ -78,7 +78,7 @@ "name": "The Fletcher's Friend", "name_plural": "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, + "weight": "1454 g", "volume": "1250 ml", "price": 4800, "material": [ "paper" ], @@ -96,7 +96,7 @@ "name": "The Bowyer's Buddy", "name_plural": "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, + "weight": "1454 g", "volume": "1250 ml", "price": 4800, "material": [ "paper" ], @@ -114,7 +114,7 @@ "name": "The Handloader's Helper", "name_plural": "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, + "weight": "1454 g", "volume": "1500 ml", "price": 12000, "material": [ "paper" ], @@ -131,7 +131,7 @@ "type": "BOOK", "name": "Rivtech design binder", "description": "This Rivtech binder warns that \"Unauthorized readers are our best test subjects.\" With good reason: it contains complete design specs and technical drawings for their entire line of products.", - "weight": 1409, + "weight": "1409 g", "volume": "500 ml", "price": 84000, "material": [ "paper" ], @@ -150,7 +150,7 @@ "name": "lab journal-Gustav", "name_plural": "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, + "weight": "2000 g", "volume": "500 ml", "price": 50000, "material": [ "paper" ], @@ -168,7 +168,7 @@ "type": "BOOK", "name": "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, + "weight": "954 g", "volume": "1500 ml", "price": 8300, "material": [ "paper" ], @@ -186,7 +186,7 @@ "name": "238-NK: Practicality Enhancement", "name_plural": "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, + "weight": "854 g", "volume": "1500 ml", "price": 30000, "material": [ "paper" ], @@ -204,7 +204,7 @@ "name": "The Art of Japanese Armormaking", "name_plural": "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, + "weight": "654 g", "volume": "1250 ml", "price": 6400, "material": [ "paper" ], @@ -223,7 +223,7 @@ "name": "Arms and Armor of Imperial China", "name_plural": "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, + "weight": "654 g", "volume": "1250 ml", "price": 6400, "material": "paper", @@ -242,7 +242,7 @@ "name": "Studies in Historic Armorsmithing", "name_plural": "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, + "weight": "654 g", "volume": "1250 ml", "price": 6400, "material": [ "paper" ], @@ -260,7 +260,7 @@ "type": "BOOK", "name": "DIY Compendium", "description": "A thick, hardbound book detailing countless projects for inventions that claim to improve all aspects of life.", - "weight": 2100, + "weight": "2100 g", "volume": "1750 ml", "price": 4500, "bashing": 4, @@ -279,7 +279,7 @@ "name": "A History of Firefighting", "name_plural": "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, + "weight": "528 g", "volume": "1 L", "price": 6500, "material": [ "paper" ], @@ -297,7 +297,7 @@ "name": "Art and Science of Chemical Warfare", "name_plural": "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, + "weight": "854 g", "volume": "1500 ml", "price": 400, "material": [ "paper" ], @@ -316,7 +316,7 @@ "name": "The Swords of the Samurai", "name_plural": "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, + "weight": "654 g", "volume": "1250 ml", "price": 6400, "material": [ "paper" ], @@ -335,7 +335,7 @@ "name": "The Historic Weaponsmith", "name_plural": "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, + "weight": "654 g", "volume": "1250 ml", "price": 6400, "material": [ "paper" ], @@ -354,7 +354,7 @@ "name": "Welding and Metallurgy", "name_plural": "Welding and Metallurgy", "description": "A rather technical textbook that illustrates the science and technique of becoming a better welder.", - "weight": 2100, + "weight": "2100 g", "volume": "1750 ml", "price": 6500, "bashing": 4, @@ -373,7 +373,7 @@ "name": "101 Home Repairs", "name_plural": "101 Home Repairs", "description": "A paperback book detailing 101 home repair projects the novice carpenter.", - "weight": 454, + "weight": "454 g", "volume": "500 ml", "price": 1800, "material": [ "paper" ], @@ -390,7 +390,7 @@ "name": "The Complete Home Repair Guide", "name_plural": "Complete Home Repair Guides", "description": "A massive book that details virtually every aspect of remodeling and repairing a home, with concise terminology aimed at experienced carpenters.", - "weight": 2490, + "weight": "2490 g", "volume": "2 L", "price": 8200, "bashing": 8, @@ -410,7 +410,7 @@ "name": "Birdhouse Monthly", "name_plural": "Birdhouse Monthlies", "description": "A riveting periodical all about birdhouses and their construction.", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "price": 450, "material": [ "paper" ], @@ -428,7 +428,7 @@ "name": "Building for Beginners", "name_plural": "Building for Beginners", "description": "A large, paperback book detailing several beginner's projects in construction.", - "weight": 454, + "weight": "454 g", "volume": "500 ml", "price": 2200, "material": [ "paper" ], @@ -445,7 +445,7 @@ "name": "Engineering 301", "name_plural": "Engineering 301", "description": "A textbook on civil engineering and construction.", - "weight": 1587, + "weight": "1587 g", "volume": "1500 ml", "price": 6500, "bashing": 4, @@ -458,5 +458,23 @@ "intelligence": 8, "time": "30 m", "fun": -1 + }, + { + "id": "reference_fabrication1", + "type": "BOOK", + "name": "Machinery's Handbook", + "name_plural": "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, + "volume": "500 ml", + "price": 8000, + "price_postapoc": 50000, + "bashing": 7, + "material": [ "paper" ], + "symbol": "?", + "color": "blue", + "intelligence": 4, + "time": "30 m", + "fun": -2 } ] diff --git a/data/json/items/book/firstaid.json b/data/json/items/book/firstaid.json index b640008d3946d..ee741ab12a29c 100644 --- a/data/json/items/book/firstaid.json +++ b/data/json/items/book/firstaid.json @@ -5,7 +5,7 @@ "name": "Guide to Advanced Emergency Care", "name_plural": "Guides to Advanced Emergency Care", "description": "A thick textbook for paramedics describing advanced lifesaving procedures and field-expedient care methods.", - "weight": 2063, + "weight": "2063 g", "volume": "2 L", "price": 9200, "bashing": 8, @@ -25,7 +25,7 @@ "name": "Paramedics", "name_plural": "Paramedics", "description": "An educational magazine for EMTs.", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "price": 480, "material": [ "paper" ], @@ -43,7 +43,7 @@ "name": "The Big Book of First Aid", "name_plural": "Big Books of First Aid", "description": "It's big and heavy, but full of great information about first aid.", - "weight": 454, + "weight": "454 g", "volume": "1250 ml", "price": 2500, "material": [ "paper" ], @@ -60,7 +60,7 @@ "name": "Pocket Guide to First Aid", "name_plural": "Pocket Guides 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, + "weight": "192 g", "volume": "250 ml", "price": 4000, "material": [ "paper", "leather" ], @@ -77,7 +77,7 @@ "name": "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, + "weight": "1360 g", "volume": "2 L", "price": 8500, "bashing": 4, @@ -96,7 +96,7 @@ "name": "First Aid Kit Instruction Booklet", "name_plural": "First Aid Kit Instruction Booklets", "description": "Illustrated how-to guide for your first aid kit.", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "price": 480, "material": [ "paper" ], @@ -106,5 +106,39 @@ "max_level": 1, "time": "8 m", "fun": 1 + }, + { + "id": "reference_firstaid1", + "type": "BOOK", + "name": "Physicians' Desk Reference", + "name_plural": "copies of the 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, + "volume": "500 ml", + "price": 10000, + "bashing": 7, + "material": [ "paper" ], + "symbol": "?", + "color": "blue", + "intelligence": 4, + "time": "30 m", + "fun": -2 + }, + { + "id": "reference_firstaid2", + "type": "BOOK", + "name": "Merck Veterinary Manual", + "name_plural": "copies of The 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, + "volume": "500 ml", + "price": 8000, + "price_postapoc": 50000, + "bashing": 7, + "material": [ "paper" ], + "symbol": "?", + "color": "blue", + "intelligence": 4, + "time": "30 m" } ] diff --git a/data/json/items/book/gun.json b/data/json/items/book/gun.json index 6584477e4819e..aa6660196775e 100644 --- a/data/json/items/book/gun.json +++ b/data/json/items/book/gun.json @@ -5,7 +5,7 @@ "name": "Guns n Ammo", "name_plural": "Guns n Ammo", "description": "Reviews of firearms, and various useful tips about their use.", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "price": 480, "material": [ "paper" ], @@ -22,7 +22,7 @@ "type": "BOOK", "name": "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, + "weight": "462 g", "volume": "500 ml", "price": 3800, "material": [ "paper" ], @@ -39,7 +39,7 @@ "name": "Pocket Guide to Firearm Safety", "name_plural": "Pocket Guides 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, + "weight": "226 g", "volume": "250 ml", "price": 4000, "material": [ "paper", "leather" ], diff --git a/data/json/items/book/launcher.json b/data/json/items/book/launcher.json index ed5d066110583..5d8e1bd4f3c96 100644 --- a/data/json/items/book/launcher.json +++ b/data/json/items/book/launcher.json @@ -5,7 +5,7 @@ "name": "High Explosives Quarterly", "name_plural": "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, + "weight": "90 g", "volume": "250 ml", "price": 450, "material": [ "paper" ], @@ -23,7 +23,7 @@ "name": "Jane's Mortars and Rocket Launchers", "name_plural": "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, + "weight": "734 g", "volume": "250 ml", "price": 2000, "material": [ "paper" ], diff --git a/data/json/items/book/maps.json b/data/json/items/book/maps.json index 1ee656e24e0ad..537d453db0f6b 100644 --- a/data/json/items/book/maps.json +++ b/data/json/items/book/maps.json @@ -5,7 +5,7 @@ "category": "maps", "name": "abstract map", "description": "seeing this is a bug", - "weight": 30, + "weight": "30 g", "volume": "250 ml", "price": 1000, "to_hit": -1, diff --git a/data/json/items/book/mechanics.json b/data/json/items/book/mechanics.json index 38105b82be8f0..ff557bd85eb37 100644 --- a/data/json/items/book/mechanics.json +++ b/data/json/items/book/mechanics.json @@ -5,7 +5,7 @@ "name": "Internal Combustion Fundamentals", "name_plural": "Internal Combustion Fundamentals", "description": "A college-level textbook that details the operation, maintenance, and repair of internal combustion engines.", - "weight": 1587, + "weight": "1587 g", "volume": "1500 ml", "price": 5950, "bashing": 4, @@ -34,7 +34,7 @@ "name": "Popular Mechanics", "name_plural": "Popular Mechanics", "description": "A magazine about mechanical innovations. Full of entertaining articles and advertisements for esoteric gadgets.", - "weight": 70, + "weight": "70 g", "volume": "250 ml", "price": 450, "material": [ "paper" ], @@ -51,7 +51,7 @@ "type": "BOOK", "name": "Under the Hood", "description": "An advanced mechanics manual, covering all sorts of topics.", - "weight": 454, + "weight": "454 g", "volume": "750 ml", "price": 5500, "material": [ "paper" ], @@ -62,13 +62,23 @@ "intelligence": 5, "time": "18 m" }, + { + "id": "textbook_atomic_lab", + "type": "BOOK", + "copy-from": "recipe_lab_cvd", + "name": "lab journal-Curie", + "name_plural": "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 + }, { "id": "textbook_biodiesel", "type": "BOOK", "name": "Biodiesel: Renewable Fuel Resource", "name_plural": "Biodiesel: Renewable Fuel Resource", "description": "A large textbook for college students about biodiesel.", - "weight": 1200, + "weight": "1200 g", "volume": "2 L", "price": 1500, "bashing": 4, @@ -87,7 +97,7 @@ "name": "Mechanical Mastery", "name_plural": "Mechanical Mastery", "description": "An advanced guide on mechanics and welding, covering topics like \"Grinding off rust\" and \"Making cursive E's\".", - "weight": 1587, + "weight": "1587 g", "volume": "1500 ml", "price": 4950, "bashing": 4, diff --git a/data/json/items/book/melee.json b/data/json/items/book/melee.json index ccd730b817986..9fd1432a71569 100644 --- a/data/json/items/book/melee.json +++ b/data/json/items/book/melee.json @@ -5,7 +5,7 @@ "name": "CQB Monthly", "name_plural": "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, + "weight": "70 g", "volume": "250 ml", "price": 450, "material": [ "paper" ], @@ -22,7 +22,7 @@ "type": "BOOK", "name": "Close Quarter Fighting Manual", "description": "A well-thumbed hardbound book which illustrates simple strategies and techniques for close quarters combat encounters.", - "weight": 564, + "weight": "564 g", "volume": "250 ml", "price": 2000, "material": [ "paper" ], diff --git a/data/json/items/book/misc.json b/data/json/items/book/misc.json index 33a14f15d32bb..c009756235937 100644 --- a/data/json/items/book/misc.json +++ b/data/json/items/book/misc.json @@ -4,7 +4,7 @@ "type": "BOOK", "name": "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, + "weight": "227 g", "volume": "1 L", "price": 1290, "material": [ "paper" ], @@ -21,7 +21,7 @@ "name": "black box transcript", "//": "ooh, military records, probably Classified!", "description": "A full flight log for a military aircraft. Nothing of interest stands out.", - "weight": 566, + "weight": "566 g", "volume": "1250 ml", "price": 5000, "bashing": 5, @@ -37,7 +37,7 @@ "type": "BOOK", "name": "children's book", "description": "A little book for little readers. The colorful cartoon characters and sweet stories contained herein belong to a different time, before the dead walked and the world moved on.", - "weight": 52, + "weight": "52 g", "volume": "250 ml", "price": 550, "material": [ "paper" ], @@ -53,7 +53,7 @@ "name": "Ranch Prospectus", "name_plural": "Ranch Prospectus", "description": "A short paper of the economic viability of constructing an agricultural outpost.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 3000, "bashing": 1, @@ -68,7 +68,7 @@ "type": "BOOK", "name": "standpipe maintenance log", "description": "This binder details the scheduled maintenance for several plumbing systems throughout the facility.", - "weight": 400, + "weight": "400 g", "volume": "750 ml", "price": 400, "material": [ "paper", "plastic" ], @@ -84,7 +84,7 @@ "name": "book of essays", "name_plural": "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, + "weight": "700 g", "volume": "750 ml", "price": 1250, "material": [ "paper" ], @@ -101,7 +101,7 @@ "name": "book of fairy tales", "name_plural": "books of fairy tales", "description": "An amusing collection of folklore featuring the usual cast of fairies, goblins, and trolls.", - "weight": 410, + "weight": "410 g", "volume": "750 ml", "price": 950, "material": [ "paper" ], @@ -118,7 +118,7 @@ "name": "The Hitchhiker's Guide to the Cataclysm", "name_plural": "Hitchhiker's Guides to the Cataclysm", "description": "Inscribed on the cover in large, friendly letters, is the message \"Don't Panic\".", - "weight": 1764, + "weight": "1764 g", "volume": "1 L", "price": 88200, "bashing": 2, @@ -133,7 +133,7 @@ "type": "BOOK", "name": "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, + "weight": "368 g", "volume": "1 L", "price": 550, "material": [ "paper" ], @@ -149,7 +149,7 @@ "type": "BOOK", "name": "King James Bible", "description": "An English translation of the Christian Bible, which originated in England in the early 1600s.", - "weight": 368, + "weight": "368 g", "volume": "1 L", "price": 550, "material": [ "paper" ], @@ -165,7 +165,7 @@ "type": "BOOK", "name": "Eastern Orthodox Bible", "description": "An English copy of the Eastern Orthodox translation of The Holy Bible.", - "weight": 428, + "weight": "428 g", "volume": "1250 ml", "price": 550, "material": [ "paper" ], @@ -181,7 +181,7 @@ "type": "BOOK", "name": "Gideon Bible", "description": "An English translation of the Christian Bible, distributed free of charge by Gideons International.", - "weight": 368, + "weight": "368 g", "volume": "1 L", "price": 550, "material": [ "paper" ], @@ -198,7 +198,7 @@ "name": "The Guru Granth Sahib", "name_plural": "copies of The Guru Granth Sahib", "description": "A single-volume copy of the central religious texts of Sikhism.", - "weight": 590, + "weight": "590 g", "volume": "1 L", "price": 550, "material": [ "paper" ], @@ -214,7 +214,7 @@ "type": "BOOK", "name": "Hadith", "description": "A Muslim religious text containing an account of the sayings and actions of the prophet Muhammad.", - "weight": 398, + "weight": "398 g", "volume": "1 L", "price": 550, "material": [ "paper" ], @@ -231,7 +231,7 @@ "name": "Principia Discordia", "name_plural": "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, + "weight": "292 g", "volume": "1 L", "price": 550, "material": [ "paper" ], @@ -248,7 +248,7 @@ "name": "The Kojiki", "name_plural": "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, + "weight": "368 g", "volume": "1 L", "price": 550, "material": [ "paper" ], @@ -265,7 +265,7 @@ "name": "The Book of Mormon", "name_plural": "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, + "weight": "368 g", "volume": "1 L", "price": 550, "material": [ "paper" ], @@ -282,7 +282,7 @@ "name": "The Gospel of the Flying Spaghetti Monster", "name_plural": "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, + "weight": "292 g", "volume": "1 L", "price": 550, "material": [ "paper" ], @@ -298,7 +298,7 @@ "type": "BOOK", "name": "Quran", "description": "An English translation of the Muslim book of holy scriptures, with explanatory notes and commentaries to aid in understanding.", - "weight": 412, + "weight": "412 g", "volume": "1 L", "price": 550, "material": [ "paper" ], @@ -315,7 +315,7 @@ "name": "Dianetics", "name_plural": "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, + "weight": "486 g", "volume": "1 L", "price": 550, "material": [ "paper" ], @@ -332,7 +332,7 @@ "name": "The Book of the SubGenius", "name_plural": "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, + "weight": "292 g", "volume": "1 L", "price": 550, "material": [ "paper" ], @@ -349,7 +349,7 @@ "name": "The Sutras of the Buddha", "name_plural": "copies of The Sutras of the Buddha", "description": "A collection of discourses attributed to the Buddha and his close disciples.", - "weight": 496, + "weight": "496 g", "volume": "1 L", "price": 550, "material": [ "paper" ], @@ -365,7 +365,7 @@ "type": "BOOK", "name": "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, + "weight": "460 g", "volume": "1 L", "price": 550, "material": [ "paper" ], @@ -381,7 +381,7 @@ "type": "BOOK", "name": "Tanakh", "description": "A single-volume book containing the complete canon of the Jewish Bible.", - "weight": 512, + "weight": "512 g", "volume": "1 L", "price": 550, "material": [ "paper" ], @@ -398,7 +398,7 @@ "name": "The Tripitaka", "name_plural": "copies of the Tripitaka", "description": "A collection of sacred Buddhist writings describing their canons of scriptures.", - "weight": 513, + "weight": "513 g", "volume": "1 L", "price": 550, "material": [ "paper" ], @@ -415,7 +415,7 @@ "name": "The Upanishads", "name_plural": "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, + "weight": "482 g", "volume": "1 L", "price": 550, "material": [ "paper" ], @@ -432,7 +432,7 @@ "name": "The Four Vedas", "name_plural": "copies of The Four Vedas", "description": "A single volume containing all four Vedas, which are the oldest scriptures of Hinduism.", - "weight": 540, + "weight": "540 g", "volume": "1 L", "price": 550, "material": [ "paper" ], @@ -448,7 +448,7 @@ "type": "BOOK", "name": "comic book", "description": "A super-hero comic.", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "price": 300, "material": [ "paper" ], @@ -462,7 +462,7 @@ "type": "BOOK", "name": "Computer Gaming", "description": "Reviews of recently released computer games and previews of upcoming titles.", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "price": 300, "material": [ "paper" ], @@ -477,7 +477,7 @@ "type": "BOOK", "name": "TIME magazine", "description": "Current events concerning a bunch of people who're all (un)dead now.", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "price": 400, "material": [ "paper" ], @@ -492,7 +492,7 @@ "type": "BOOK", "name": "Playboy", "description": "You can read it for the articles. Or not.", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "price": 400, "material": [ "paper" ], @@ -508,7 +508,7 @@ "name": "frequency list", "name_plural": "frequency lists", "description": "A notepad with a number of frequencies scribbled on it.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 3000, "bashing": 1, @@ -523,7 +523,7 @@ "type": "BOOK", "name": "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, + "weight": "80 g", "volume": "250 ml", "price": 350, "material": [ "paper" ], @@ -538,7 +538,7 @@ "type": "BOOK", "name": "adventure novel", "description": "The stirring tale of a race against time, in search of a lost city located in the dark heart of the African continent.", - "weight": 404, + "weight": "404 g", "volume": "750 ml", "price": 850, "material": [ "paper" ], @@ -554,7 +554,7 @@ "type": "BOOK", "name": "buddy novel", "description": "A gripping tale of two friends struggling to survive on the streets of New York City.", - "weight": 244, + "weight": "244 g", "volume": "500 ml", "price": 650, "material": [ "paper" ], @@ -570,7 +570,7 @@ "type": "BOOK", "name": "coming of age novel", "description": "A classic tale about growing up, portraying one young man's funny and poignant experiences with life, love, and sex.", - "weight": 187, + "weight": "187 g", "volume": "500 ml", "price": 750, "material": [ "paper" ], @@ -594,7 +594,7 @@ "type": "BOOK", "name": "crime novel", "description": "After their diamond heist goes wrong, the surviving criminals begin to suspect that one of them is a police informant.", - "weight": 227, + "weight": "227 g", "volume": "750 ml", "price": 850, "material": [ "paper" ], @@ -618,7 +618,7 @@ "type": "BOOK", "name": "drama novel", "description": "A real book for real adults.", - "weight": 227, + "weight": "227 g", "volume": "1 L", "price": 850, "material": [ "paper" ], @@ -634,7 +634,7 @@ "type": "BOOK", "name": "erotic novel", "description": "Hackneyed narrative concealing low-grade literary smut.", - "weight": 200, + "weight": "200 g", "volume": "500 ml", "price": 750, "material": [ "paper" ], @@ -650,7 +650,7 @@ "type": "BOOK", "name": "experimental novel", "description": "A bizarre play about the philosophy of existential absurdity. Or maybe it's about two guys waiting for their friend to show up. It's confusing.", - "weight": 142, + "weight": "142 g", "volume": "500 ml", "price": 750, "material": [ "paper" ], @@ -666,7 +666,7 @@ "type": "BOOK", "name": "fantasy novel", "description": "Basic sword & sorcery.", - "weight": 227, + "weight": "227 g", "volume": "1 L", "price": 850, "material": [ "paper" ], @@ -682,7 +682,7 @@ "type": "BOOK", "name": "horror novel", "description": "Maybe not the best reading material considering the situation.", - "weight": 227, + "weight": "227 g", "volume": "1 L", "price": 850, "material": [ "paper" ], @@ -698,7 +698,7 @@ "type": "BOOK", "name": "mystery novel", "description": "A detective investigates an unusual murder in a secluded location.", - "weight": 227, + "weight": "227 g", "volume": "1 L", "price": 750, "material": [ "paper" ], @@ -714,7 +714,7 @@ "type": "BOOK", "name": "pulp novel", "description": "A hardboiled detective tale filled with hard hitting action and intrigue.", - "weight": 300, + "weight": "300 g", "volume": "750 ml", "price": 650, "material": [ "paper" ], @@ -730,7 +730,7 @@ "type": "BOOK", "name": "road novel", "description": "A tale about a group of friends who wander the USA in the 1960s against a backdrop of jazz, poetry and drug use.", - "weight": 244, + "weight": "244 g", "volume": "500 ml", "price": 750, "material": [ "paper" ], @@ -746,7 +746,7 @@ "type": "BOOK", "name": "romance novel", "description": "Drama and mild smut.", - "weight": 227, + "weight": "227 g", "volume": "1 L", "price": 650, "material": [ "paper" ], @@ -762,7 +762,7 @@ "type": "BOOK", "name": "samurai novel", "description": "The classic tale of a wandering swordsman who comes to a small settlement and is hired to help the townsfolk defend themselves from a band of marauding outlaws.", - "weight": 322, + "weight": "322 g", "volume": "750 ml", "price": 750, "material": [ "paper" ], @@ -778,7 +778,7 @@ "type": "BOOK", "name": "satire novel", "description": "A political satire of the pre-apocalypse world. Looking back on it from this side of Armageddon makes it seem all the more ridiculous.", - "weight": 520, + "weight": "520 g", "volume": "750 ml", "price": 850, "material": [ "paper" ], @@ -794,7 +794,7 @@ "type": "BOOK", "name": "scifi novel", "description": "Aliens, ray guns, and space ships.", - "weight": 227, + "weight": "227 g", "volume": "750 ml", "price": 850, "material": [ "paper" ], @@ -803,14 +803,158 @@ "intelligence": 6, "time": "20 m", "chapters": 24, - "fun": 3 + "fun": 3, + "snippet_category": [ + { + "id": "scifi1_1", + "text": "This is a copy of Gibson's \"Neuromancer\". Written in the eighties, it was surprisingly accurate in predicting much of modern society... Until recently." + }, + { + "id": "scifi1_2", + "text": "This is a copy of \"The Stars My Destination\" by Alfred Bester. \n\nTyger, Tyger, Burning bright, \nIn the forests of the night: \nWhat immortal hand or eye, \nDare frame thy fearful symmetry?" + }, + { + "id": "scifi1_3", + "text": "This is a copy of \"The Lathe of Heaven\" by Ursula Le Guin. Dirty finger-stains have smudged the occasional word." + }, + { "id": "scifi1_4", "text": "This is a copy of \"The Dispossessed\" by Ursula Le Guin." }, + { "id": "scifi1_5", "text": "This copy of Ray Bradbury's \"Fahrenheit 451\"." }, + { + "id": "scifi1_5", + "text": "This is a well-worn copy of \"The Hitchhikers Guide to the Galaxy\" by Douglas Adams." + }, + { "id": "scifi1_6", "text": "This is a copy of \"Hyperion\" by Dan Simmons." }, + { + "id": "scifi1_7", + "text": "This is a copy of \"Endymion\" by Dan Simmons. It opens with a poem by D.H. Lawrence:\n\nGive us gods. Oh give them us! \nGive us gods. \nWe are so tired of men \nAnd motor-power." + }, + { "id": "scifi1_8", "text": "This is a copy of Philip K. Dick's \"Do Androids Dream of Electric Sheep?\"." }, + { "id": "scifi1_9", "text": "This is a dog-eared copy of \"Nova Express\" by William Burroughs." }, + { + "id": "scifi1_10", + "text": "This is a copy of \"Foundation\" by Isaac Asimov. The back cover has been ripped off." + }, + { + "id": "scifi1_11", + "text": "This is a dog-eared copy of \"Dune\" by Frank Herbert. It has sand between some of its pages. Weird." + }, + { "id": "scifi1_12", "text": "This is a copy of \"The Trial\" by Franz Kafka. This book is rather worn." }, + { "id": "scifi1_13", "text": "This is a copy of \"The Handmaid's Tale\" by Margaret Atwood." }, + { + "id": "scifi1_14", + "text": "This is a copy of \"The Windup Girl\" by Paolo Bacigalupi. The blurb makes you wonder how Thailand fared the end of the world." + }, + { "id": "scifi1_15", "text": "This is a copy of \"Islands in the Net\" by Bruce Sterling." }, + { + "id": "scifi1_16", + "text": "This is a copy of \"Foundation and Empire\" by Isaac Asimov. The back page contains a hand-written grocery list." + }, + { + "id": "scifi1_17", + "text": "This is an almost new copy of \"A Scanner Darkly\" by Philip K. Dick. It still has the smell of new books within it's pages." + }, + { + "id": "scifi1_18", + "text": "This is a copy of \"Mirrorshades: A Cyberpunk Anthology\" compiled by Bruce Sterling. The cover has rings of coffee stains over it." + }, + { + "id": "scifi1_19", + "text": "This is a copy of \"The World of Null-A\" by A. E. van Vogt. This copy looks to have been used to press flowers." + }, + { "id": "scifi1_20", "text": "This is a copy of \"Altered Carbon\" by Richard Morgan." }, + { + "id": "scifi1_21", + "text": "This is a copy of Mary Shelly's \"Frankenstein\". Wasn't that the name of the monster?" + }, + { + "id": "scifi1_22", + "text": "This is a copy of \"Wasp\" by Eric Frank Russel. The futuristic terrorists handbook." + }, + { + "id": "scifi1_23", + "text": "This is a copy of \"I Am Legend\" by Richard Matheson. The sleeve is covered in dried blood." + }, + { "id": "scifi1_24", "text": "This is a copy of \"Roadside Picnic\" by Arkady and Boris Strugatsky." }, + { + "id": "scifi1_25", + "text": "This is a copy of \"The Forever War\" by Joe Haldeman. This copy looks as if it's been slightly chewed by a dog or other large animal." + }, + { "id": "scifi1_26", "text": "This is a copy of \"The Moon Is a Harsh Mistress\" by Robert A. Heinlein." }, + { + "id": "scifi1_27", + "text": "This is a copy of \"Cat's Cradle\" by Kurt Vonnegut. You notice there is a typo in the authors name on the spine of the book." + }, + { + "id": "scifi1_28", + "text": "This is a copy of Samuel R. Delany's \"Nova\". The cover reads \"Review Copy. Not for re-sale.\"" + }, + { "id": "scifi1_29", "text": "This is a copy of Vonnegut's \"The Sirens of Titan\"." }, + { + "id": "scifi1_30", + "text": "This is a copy of \"Grass\" by Sheri S. Tepper. A child has scribbled over the first pages in crayon." + }, + { + "id": "scifi1_31", + "text": "This is a copy of William Gibson's \"Count Zero\". The spine is stamped with 'Library Copy'. And a sticker reading 'Science Fiction'." + }, + { + "id": "scifi1_32", + "text": "This is a copy of \"The Fifth Season\" by N.K. Jemsin. It smells faintly of dirt." + }, + { "id": "scifi1_33", "text": "This is a copy of \"The Weapon Makers\" by A. E. van Vogt." }, + { + "id": "scifi1_34", + "text": "This is a copy of \"Record of a Spaceborn Few\" by Becky Chambers. It looks almost brand new." + }, + { + "id": "scifi1_35", + "text": "This is a copy of \"Use of Weapons\" by Ian M. Banks. The spine is cracked and worn, some pages appear to be loose." + }, + { "id": "scifi1_36", "text": "This is a copy of Jean-Baptiste Cousin de Grainville's \"Le Dernier Homme\"." }, + { + "id": "scifi1_37", + "text": "This is a copy of Orwells \"Nineteen Eighty-Four\". The pages are loose and thin. You should probably be careful with this copy." + }, + { + "id": "scifi1_38", + "text": "This is a copy of Heinlein's \"Stranger in a Strange Land\". The cover is dog-eared and worn." + }, + { "id": "scifi1_39", "text": "This is a copy of Orson Scott Card's \"Ender's Game\"." }, + { "id": "scifi1_40", "text": "This is a weather worn copy of \"Brave New World\" by Aldous Huxley." }, + { "id": "scifi1_41", "text": "This is a copy of \"The Lost World\" by Arthur Conan Doyle." }, + { "id": "scifi1_42", "text": "This is a copy of \"Islands in the Sky\" by Arthur C. Clarke." }, + { "id": "scifi1_43", "text": "This is a copy of H. G. Wells' \"The Island of Doctor Moreau\"." }, + { "id": "scifi1_44", "text": "This is a copy of Stanislaw Lem's \"His Masters Voice\"." }, + { "id": "scifi_45", "text": "This is a copy of Fred Hoyle's \"The Black Cloud\"." }, + { "id": "scifi_46", "text": "This is a copy of \"Last and First Men\" by Olaf Stapeldon." }, + { "id": "scifi_47", "text": "This is a copy of Stanislaw Lem's \"Solaris\"." }, + { "id": "scifi_48", "text": "This is a copy of Theodore Sturgeon's \"More Than Human\"." }, + { "id": "scifi1_49", "text": "This is a copy of \"Vurt\" by Jeff Noon." }, + { "id": "scifi1_50", "text": "This is a copy of \"A Canticle for Leibowitz\" by Walter M. Miller Jr." }, + { "id": "scifi1_51", "text": "This is a copy of \"The War of The Worlds\" by H.G Wells." }, + { "id": "scifi1_52", "text": "This is a copy of \"Iron Sunrise\" by Charles Stross." }, + { + "id": "scifi1_53", + "text": "This is a copy of \"The Hunger Games\" by Suzanne Collins. Reading the blurb reminds you of a Japanese movie you think you once caught on the television late at night." + }, + { "id": "scifi1_54", "text": "This is a copy of \"The Day of the Triffids\" by John Wyndham." }, + { "id": "scifi1_55", "text": "This is a copy of \"A Clockwork Orange\" by Anthony Burges." }, + { "id": "scifi1_56", "text": "This is a copy of \"The Man Who Fell to Earth\" by Walter Tevis." }, + { "id": "scifi1_57", "text": "This is a copy of \"Simulacron-3\" by Daniel F. Galouye." }, + { "id": "scifi1_58", "text": "This is a copy of \"The Glass Bees\" by Ernst Jünger." }, + { "id": "scifi1_59", "text": "This is a copy of \"Journey to The Center of the Earth\" by Jules Verne." }, + { + "id": "scifi1_60", + "text": "This is a copy of Larry Niven's \"Ringworld\". There are a couple of pages missing from the end of the book. Luckily only mail-order advertisements." + } + ] }, { "id": "novel_sports", "type": "BOOK", "name": "sports novel", "description": "The dramatic tale of a small-time boxer who gets a rare chance to fight the heavy-weight champion, and seize his one chance to make a better life for himself while impressing the cute girl who works in the pet store.", - "weight": 688, + "weight": "688 g", "volume": "750 ml", "price": 750, "material": [ "paper" ], @@ -826,7 +970,7 @@ "type": "BOOK", "name": "spy novel", "description": "A tale of intrigue and espionage amongst Nazis, no, Commies, no, Iraqis!", - "weight": 227, + "weight": "227 g", "volume": "1 L", "price": 750, "material": [ "paper" ], @@ -842,7 +986,7 @@ "type": "BOOK", "name": "swashbuckling novel", "description": "An exciting seventeenth century tale of how an enslaved Irish doctor and his comrades-in-chains escape and become heroic pirates of the Robin Hood variety.", - "weight": 582, + "weight": "582 g", "volume": "750 ml", "price": 750, "material": [ "paper" ], @@ -858,7 +1002,7 @@ "type": "BOOK", "name": "thriller novel", "description": "A suspenseful tale of betrayal and revenge.", - "weight": 269, + "weight": "269 g", "volume": "1 L", "price": 650, "material": [ "paper" ], @@ -874,7 +1018,7 @@ "type": "BOOK", "name": "tragedy novel", "description": "The story of two young lovers whose feuding families threaten to keep them apart.", - "weight": 263, + "weight": "263 g", "volume": "1 L", "price": 750, "material": [ "paper" ], @@ -890,7 +1034,7 @@ "type": "BOOK", "name": "war novel", "description": "A thrilling narrative of survival in a prisoner of war camp during the Second World War, filled with riveting subplots about rat farming and dysentery.", - "weight": 686, + "weight": "686 g", "volume": "750 ml", "price": 750, "material": [ "paper" ], @@ -914,7 +1058,7 @@ "type": "BOOK", "name": "western novel", "description": "The classic tale of a gunfighting stranger who comes to a small settlement and is hired to help the townsfolk defend themselves from a band of marauding outlaws.", - "weight": 322, + "weight": "322 g", "volume": "750 ml", "price": 750, "material": [ "paper" ], @@ -954,7 +1098,7 @@ }, { "id": "philosophy6", - "text": "A collection of texts and essays by Jacques Derrida. It's pages loose and yellowed, you should probably handle it with care." + "text": "A collection of texts and essays by Jacques Derrida. Its pages are loose and yellowed - you should probably handle it with care." }, { "id": "philosophy7", @@ -1063,7 +1207,7 @@ "text": "This is a copy of \"Up-Wingers: A Futurist Manifesto\" by FM-2030. It seems that the author's real name is Fereidoun M. Esfandiary." } ], - "weight": 350, + "weight": "350 g", "volume": "750 ml", "price": 1250, "material": [ "paper" ], @@ -1080,7 +1224,7 @@ "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, + "weight": "854 g", "volume": "2500 ml", "price": 800, "bashing": 2, @@ -1097,7 +1241,7 @@ "type": "BOOK", "name": "photo album", "description": "A leather album full of photos of somebody's family. You don't know any of the people in them, but seeing these pictures still makes you think of happier times.", - "weight": 180, + "weight": "180 g", "volume": "250 ml", "price": 3000, "material": [ "paper", "leather" ], @@ -1114,7 +1258,7 @@ "name": "book of plays", "name_plural": "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, + "weight": "700 g", "volume": "750 ml", "price": 1150, "material": [ "paper" ], @@ -1131,7 +1275,7 @@ "name": "book of poetry", "name_plural": "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, + "weight": "400 g", "volume": "500 ml", "price": 1050, "material": [ "paper" ], @@ -1148,7 +1292,7 @@ "name": "priest's diary", "name_plural": "priest's diaries", "description": "A small book filled with journal entries in Latin.", - "weight": 340, + "weight": "340 g", "volume": "750 ml", "price": 1500, "bashing": 3, @@ -1165,7 +1309,7 @@ "type": "BOOK", "name": "corporate accounting ledger", "description": "If you knew what to look for something might stand out...", - "weight": 566, + "weight": "566 g", "volume": "1250 ml", "price": 2000, "bashing": 5, @@ -1182,7 +1326,7 @@ "name": "patient treatment records", "name_plural": "patient treatment records", "description": "A massive stack of medical records that contain every gory detail.", - "weight": 680, + "weight": "680 g", "volume": "1500 ml", "price": 500, "bashing": 6, @@ -1199,7 +1343,7 @@ "name": "national weather transcripts", "name_plural": "national weather transcripts", "description": "Old weather records are about as interesting as a rock.", - "weight": 454, + "weight": "454 g", "volume": "1750 ml", "price": 500, "bashing": 7, @@ -1216,7 +1360,7 @@ "name": "big book of short stories", "name_plural": "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, + "weight": "1720 g", "volume": "1 L", "price": 1400, "material": [ "paper" ], @@ -1233,7 +1377,7 @@ "name": "book of tall tales", "name_plural": "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, + "weight": "360 g", "volume": "750 ml", "price": 1050, "material": [ "paper" ], @@ -1250,7 +1394,7 @@ "name": "Visions in Solitude", "name_plural": "Visions in Solitude", "description": "A small book detailing 'visions' a prisoner had on death row.", - "weight": 227, + "weight": "227 g", "volume": "750 ml", "price": 2900, "bashing": 3, @@ -1268,7 +1412,7 @@ "name": "Hávamál", "name_plural": "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, + "weight": "292 g", "volume": "750 ml", "price": 550, "material": [ "paper" ], @@ -1359,7 +1503,7 @@ { "id": "classic29", "text": "This is a copy of \"The Count of Monte Cristo\" by Dumas." }, { "id": "classic30", "text": "This is a copy of \"The Secret Garden\" by Frances Burnett." } ], - "weight": 350, + "weight": "350 g", "volume": "750 ml", "price": 2000, "material": [ "paper" ], @@ -1454,7 +1598,7 @@ "text": "This is a first edition copy of Terry Pratchett's \"The Colour of Magic\". In the inner cover is a handwritten note that reads \"To Chris, thanks for believing I could do it. Best regards, Terry.\"" } ], - "weight": 400, + "weight": "400 g", "volume": "750 ml", "price": 4550, "material": [ "paper" ], diff --git a/data/json/items/book/pistol.json b/data/json/items/book/pistol.json index 56c790bf91b3b..e5e995e2c4c5d 100644 --- a/data/json/items/book/pistol.json +++ b/data/json/items/book/pistol.json @@ -4,7 +4,7 @@ "type": "BOOK", "name": "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, + "weight": "90 g", "volume": "250 ml", "price": 450, "material": [ "paper" ], @@ -22,7 +22,7 @@ "name": "The Tao of the Handgun", "name_plural": "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, + "weight": "440 g", "volume": "500 ml", "price": 2200, "material": [ "paper" ], diff --git a/data/json/items/book/rifle.json b/data/json/items/book/rifle.json index eac9d2e726519..0ccb3d87e60e3 100644 --- a/data/json/items/book/rifle.json +++ b/data/json/items/book/rifle.json @@ -5,7 +5,7 @@ "name": "Modern Rifleman", "name_plural": "Modern Rifleman", "description": "An informative magazine all about rifles and shooting. There is an excellent article about proper maintenance in this issue.", - "weight": 100, + "weight": "100 g", "volume": "250 ml", "price": 450, "material": [ "paper" ], @@ -22,7 +22,7 @@ "type": "BOOK", "name": "FM 23-16 Army marksmanship manual", "description": "A hefty military field manual about automatic rifle usage and techniques which improve marksmanship and proper weapons-handling.", - "weight": 454, + "weight": "454 g", "volume": "250 ml", "price": 2000, "material": [ "paper" ], diff --git a/data/json/items/book/shotgun.json b/data/json/items/book/shotgun.json index b7d4debb67fb7..6f80c4537aaf3 100644 --- a/data/json/items/book/shotgun.json +++ b/data/json/items/book/shotgun.json @@ -5,7 +5,7 @@ "name": "Trap and Field", "name_plural": "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, + "weight": "90 g", "volume": "250 ml", "price": 450, "material": [ "paper" ], @@ -23,7 +23,7 @@ "name": "Shotguns: The art and science", "name_plural": "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, + "weight": "400 g", "volume": "500 ml", "price": 2100, "material": [ "paper" ], diff --git a/data/json/items/book/smg.json b/data/json/items/book/smg.json index d63f7186193cb..8064f563ec8bc 100644 --- a/data/json/items/book/smg.json +++ b/data/json/items/book/smg.json @@ -5,7 +5,7 @@ "name": "Submachine Gun Enthusiast", "name_plural": "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, + "weight": "90 g", "volume": "250 ml", "price": 450, "material": [ "paper" ], @@ -22,7 +22,7 @@ "type": "BOOK", "name": "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, + "weight": "362 g", "volume": "500 ml", "price": 2100, "material": [ "paper" ], diff --git a/data/json/items/book/speech.json b/data/json/items/book/speech.json index d5ce242103f6d..24f4418f6d797 100644 --- a/data/json/items/book/speech.json +++ b/data/json/items/book/speech.json @@ -5,7 +5,7 @@ "name": "US Weekly", "name_plural": "US Weeklies", "description": "Weekly news about a bunch of famous people who're all (un)dead now.", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "price": 400, "material": [ "paper" ], @@ -23,7 +23,7 @@ "name": "Self-Esteem for Dummies", "name_plural": "Self-Esteem for Dummies", "description": "Full of useful tips for showing confidence in your speech.", - "weight": 454, + "weight": "454 g", "volume": "750 ml", "price": 1600, "material": [ "paper" ], @@ -40,7 +40,7 @@ "name": "Principles of Effective Communication", "name_plural": "Principles of Effective Communication", "description": "A hardbound book devoted to being an effective and persuasive speaker.", - "weight": 1120, + "weight": "1120 g", "volume": "2 L", "price": 4000, "bashing": 4, @@ -59,7 +59,7 @@ "name": "Dungeon Master's Guide: 6th Edition", "name_plural": "Dungeon Master's Guide: 6th Editions", "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, + "weight": "2267 g", "volume": "2500 ml", "price": 3000, "bashing": 7, diff --git a/data/json/items/book/stabbing.json b/data/json/items/book/stabbing.json index fc2381db30084..2d6cd809945eb 100644 --- a/data/json/items/book/stabbing.json +++ b/data/json/items/book/stabbing.json @@ -4,7 +4,7 @@ "type": "BOOK", "name": "Duelist's Annual", "description": "An annual publication about fencing and dueling. There are many good illustrations which describe proper technique and form.", - "weight": 80, + "weight": "80 g", "volume": "250 ml", "price": 450, "material": [ "paper" ], @@ -21,7 +21,7 @@ "type": "BOOK", "name": "FM 23-25 Army bayonet manual", "description": "A hefty military field manual about bayonet usage and combat theory.", - "weight": 454, + "weight": "454 g", "volume": "250 ml", "price": 2000, "material": [ "paper" ], diff --git a/data/json/items/book/survival.json b/data/json/items/book/survival.json index 1a44a04d5a749..e917a6b603784 100644 --- a/data/json/items/book/survival.json +++ b/data/json/items/book/survival.json @@ -5,7 +5,7 @@ "name": "Survival Under Atomic Attack", "name_plural": "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, + "weight": "1920 g", "volume": "2 L", "price": 920, "bashing": 8, @@ -25,7 +25,7 @@ "name": "Through the Lens", "name_plural": "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, + "weight": "440 g", "volume": "250 ml", "price": 450, "material": [ "paper" ], @@ -44,7 +44,7 @@ "name": "Alpha Male Quarterly", "name_plural": "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, + "weight": "180 g", "volume": "500 ml", "price": 450, "material": [ "paper" ], @@ -62,7 +62,7 @@ "name": "Outdoor Adventures", "name_plural": "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, + "weight": "80 g", "volume": "250 ml", "price": 450, "material": [ "paper" ], @@ -80,7 +80,7 @@ "name": "Pitching a Tent", "name_plural": "copies of Pitching a Tent", "description": "A guide detailing the basics of woodsmanship and outdoor survival.", - "weight": 454, + "weight": "454 g", "volume": "750 ml", "price": 2900, "material": [ "paper" ], @@ -96,7 +96,7 @@ "type": "BOOK", "name": "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, + "weight": "212 g", "volume": "250 ml", "price": 4000, "material": [ "paper", "leather" ], @@ -114,7 +114,7 @@ "name_plural": "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, + "weight": "1920 g", "volume": "2 L", "price": 920, "bashing": 8, @@ -133,7 +133,7 @@ "type": "BOOK", "name": "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, + "weight": "910 g", "volume": "2 L", "price": 6000, "bashing": 4, diff --git a/data/json/items/book/swimming.json b/data/json/items/book/swimming.json index f468296f78550..b1e13625e3668 100644 --- a/data/json/items/book/swimming.json +++ b/data/json/items/book/swimming.json @@ -5,7 +5,7 @@ "name": "Swim Planet", "name_plural": "Swim Planet", "description": "The world's leading resource about aquatic sports.", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "price": 460, "material": [ "paper" ], @@ -22,7 +22,7 @@ "type": "BOOK", "name": "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, + "weight": "400 g", "volume": "500 ml", "price": 2200, "material": [ "paper" ], diff --git a/data/json/items/book/tailor.json b/data/json/items/book/tailor.json index ab80c255864e4..8ca3f153b5cb2 100644 --- a/data/json/items/book/tailor.json +++ b/data/json/items/book/tailor.json @@ -12,7 +12,7 @@ "type": "BOOK", "name": "Beauty Magazine", "description": "This is a full-size glossy women's magazine. There are a few simple patterns and basic sewing tips somewhere in between the fashion photos and the makeup advertisements.", - "weight": 180, + "weight": "180 g", "volume": "500 ml", "price": 450, "material": [ "paper" ], @@ -30,7 +30,7 @@ "name": "Sew Awesome Monthly", "name_plural": "Sew Awesome Monthlies", "description": "A well presented monthly magazine all about knitting, crocheting, and needlepoint. Filled with ideas and project patterns.", - "weight": 75, + "weight": "75 g", "volume": "250 ml", "price": 400, "material": [ "paper" ], @@ -48,7 +48,7 @@ "name": "Sew What? Clothing!", "name_plural": "Sew What? Clothing!", "description": "A colorful book about tailoring.", - "weight": 454, + "weight": "454 g", "volume": "750 ml", "price": 1900, "material": [ "paper" ], @@ -64,7 +64,7 @@ "type": "BOOK", "name": "clothing designer's portfolio", "description": "A leather bound portfolio that once belonged to a clothing designer. Filled with sketches and notes, a skilled tailor could learn a lot from this volume.", - "weight": 2063, + "weight": "2063 g", "volume": "2 L", "price": 9200, "bashing": 8, @@ -83,7 +83,7 @@ "type": "BOOK", "name": "Traditional Japanese Kimono", "description": "An illustrated textbook on the crafting of Japanese traditional garb.", - "weight": 2400, + "weight": "2400 g", "volume": "1500 ml", "price": 8000, "bashing": 8, @@ -101,7 +101,7 @@ "type": "BOOK", "name": "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, + "weight": "2267 g", "volume": "1 L", "price": 5000, "bashing": 5, @@ -121,7 +121,7 @@ "name": "Sewing Techniques for Designers", "name_plural": "Sewing Techniques for Designers", "description": "A massive, hardbound book full of a wealth of information for the professional clothing designer.", - "weight": 2600, + "weight": "2600 g", "volume": "2 L", "price": 6000, "bashing": 4, diff --git a/data/json/items/book/throw.json b/data/json/items/book/throw.json index 09901d95387ad..0d6b7eda89f15 100644 --- a/data/json/items/book/throw.json +++ b/data/json/items/book/throw.json @@ -5,7 +5,7 @@ "name": "Diskobolus", "name_plural": "Diskobolus", "description": "A biannual magazine devoted to the art and science of discus-throwing.", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "price": 480, "material": [ "paper" ], @@ -23,7 +23,7 @@ "name": "The Complete Guide to Pitching", "name_plural": "Complete Guides 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, + "weight": "400 g", "volume": "500 ml", "price": 2800, "material": [ "paper" ], diff --git a/data/json/items/book/traps.json b/data/json/items/book/traps.json index ca197b2a719e1..32a7646e49290 100644 --- a/data/json/items/book/traps.json +++ b/data/json/items/book/traps.json @@ -5,7 +5,7 @@ "name": "How to Trap Anything", "name_plural": "How to Trap Anything", "description": "A worn manual that describes how to set and disarm a wide variety of traps.", - "weight": 454, + "weight": "454 g", "volume": "500 ml", "price": 2400, "material": [ "paper" ], @@ -22,7 +22,7 @@ "name": "Trapper's Life", "name_plural": "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, + "weight": "80 g", "volume": "250 ml", "price": 450, "material": [ "paper" ], @@ -38,7 +38,7 @@ "type": "BOOK", "name": "The Modern Trapper", "description": "An extensive volume that details numerous methods of trapping game.", - "weight": 422, + "weight": "422 g", "volume": "500 ml", "price": 2400, "material": [ "paper" ], @@ -56,7 +56,7 @@ "name_plural": "The Compleat Trapper", "//": "The spelling is intentionally archaic, as this form is commonly used in the titles of books.", "description": "An in-depth book about trapping game animals, covering methods both modern and ancient.", - "weight": 1100, + "weight": "1100 g", "volume": "2 L", "price": 6000, "bashing": 4, @@ -75,7 +75,7 @@ "name": "The Trapper's Companion", "name_plural": "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, + "weight": "1920 g", "volume": "2 L", "price": 920, "bashing": 8, diff --git a/data/json/items/book/unarmed.json b/data/json/items/book/unarmed.json index a52064fcfe408..3e4a902452bb7 100644 --- a/data/json/items/book/unarmed.json +++ b/data/json/items/book/unarmed.json @@ -5,7 +5,7 @@ "name": "Boxing Monthly", "name_plural": "Boxing Monthlies", "description": "An exciting monthly magazine about boxing. There are lots of large, colorful photos of pugilistic exploits.", - "weight": 90, + "weight": "90 g", "volume": "250 ml", "price": 450, "material": [ "paper" ], @@ -23,7 +23,7 @@ "name": "101 Wrestling Moves", "name_plural": "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, + "weight": "227 g", "volume": "500 ml", "price": 3800, "material": [ "paper" ], diff --git a/data/json/items/chemicals_and_resources.json b/data/json/items/chemicals_and_resources.json index ef445ba028755..95a6b7586938b 100644 --- a/data/json/items/chemicals_and_resources.json +++ b/data/json/items/chemicals_and_resources.json @@ -28,7 +28,7 @@ "description": "A handful of yellow grains of pure sulfur. Primarily used to make battery acid, sulfur is sometimes used as fuel for explosives. Can be burned to produce acidic smoke, that is deadly to bacteria and humans alike, or oxidized to make paper-bleaching agents.", "material": "powder", "volume": "250 ml", - "weight": 5, + "weight": "5 g", "//": "NOTE: Weights are given for ONE UNIT. The actual weight of a spawned pile of sulfur is now 5*100 = 500g. For reference, 1 C:DDA unit of volume is around a quarter of a liter (calculated from the weight of water).", "bashing": 1, "ammo_type": "components", @@ -47,7 +47,7 @@ "description": "A large chunk of pure sulfur. Break it up to use it.", "material": "powder", "volume": "1250 ml", - "weight": 500, + "weight": "500 g", "bashing": 1, "ammo_type": "components" }, @@ -63,7 +63,7 @@ "description": "Portland is most likely long gone, but its memory persists in cement. This ubiquitous binder can be used for all kinds of advanced masonry. Just add water.", "material": "powder", "volume": "250 ml", - "weight": 20, + "weight": "20 g", "bashing": 1, "ammo_type": "components", "count": 50 @@ -80,7 +80,7 @@ "description": "A handful of small chunks of limestone. Useful for experiments at science fairs, but pretty useless as ammo. Maybe something could be crafted from this stuff…", "material": "stone", "volume": "250 ml", - "weight": 14, + "weight": "14 g", "bashing": 1, "ammo_type": "components", "count": 50 @@ -97,7 +97,7 @@ "description": "The product of burning limestone, this white powder is a crucial ingredient in making cement. That said, it is also extremely caustic and will cause severe burns to any tissue it comes in contact with. This property could probably be exploited.", "material": "powder", "volume": "250 ml", - "weight": 15, + "weight": "15 g", "bashing": 1, "ammo_type": "components", "count": 50 @@ -114,7 +114,7 @@ "description": "A handful of New England sand. If you had a stoked furnace, you could turn it into glass. Otherwise, it's only good for making cement.", "material": "powder", "volume": "250 ml", - "weight": 8, + "weight": "8 g", "bashing": 1, "ammo_type": "components", "count": 50 @@ -131,7 +131,7 @@ "description": "A pile of loosely packed, slightly damp loamy soil. This mixture of sand, silt and clay is ideal for growing plants.", "material": "soil", "volume": "5L", - "weight": 6500, + "weight": "6500 g", "bashing": 1, "ammo_type": "components", "stack_size": 1 @@ -146,7 +146,7 @@ "description": "A small shard of limestone. Pretty flimsy and not much of a weapon, but its alkaline properties may yet find some use.", "price": 500, "material": "stone", - "weight": 700, + "weight": "700 g", "volume": "1 L", "bashing": 2, "to_hit": -2 @@ -164,7 +164,37 @@ "description": "A handful of rock salt crystals. Could be refined into table salt.", "material": "stone", "volume": "3500 ml", - "weight": 650, + "weight": "650 g", + "bashing": 1 + }, + { + "type": "GENERIC", + "id": "material_rhodonite", + "category": "spare_parts", + "price": 250, + "name": "rhodonite", + "name_plural": "rhodonite", + "symbol": "*", + "color": "red", + "description": "A chunk of rhodonite. It has manganese dioxide covering and going through it in veins, which can be obtained using a chisel.", + "material": "stone", + "volume": "2500 ml", + "weight": 500, + "bashing": 1 + }, + { + "type": "GENERIC", + "id": "material_zincite", + "category": "spare_parts", + "price": 250, + "name": "zincite", + "name_plural": "zincite", + "symbol": "*", + "color": "red", + "description": "A chunk of zincite. Could be refined into zinc oxide, then into zinc by reduction with a source of carbon.", + "material": "stone", + "volume": "2500 ml", + "weight": 500, "bashing": 1 }, { @@ -172,7 +202,7 @@ "id": "bleach", "name": "bleach", "name_plural": "bleach", - "weight": 138, + "weight": "138 g", "color": "white", "use_action": "BLECH", "container": "jug_plastic", @@ -195,7 +225,7 @@ "id": "ammonia", "name": "ammonia", "name_plural": "ammonia", - "weight": 124, + "weight": "124 g", "color": "white", "use_action": "BLECH", "container": "jug_plastic", @@ -217,7 +247,7 @@ "id": "fertilizer_liquid", "name": "liquid fertilizer", "name_plural": "liquid fertilizer", - "weight": 67, + "weight": "67 g", "color": "yellow", "flags": [ "FERTILIZER", "NUTRIENT_OVERRIDE" ], "use_action": "PLANTBLECH", @@ -240,7 +270,7 @@ "id": "fertilizer_commercial", "name": "commercial fertilizer", "name_plural": "commercial fertilizer", - "weight": 350, + "weight": "350 g", "color": "yellow", "flags": [ "FERTILIZER" ], "use_action": "PLANTBLECH", @@ -265,7 +295,7 @@ "category": "chems", "name": "fungicide", "name_plural": "fungicide", - "weight": 1, + "weight": "1 g", "//": "Typically sold in larger quantities, but that's handed in the charge count.", "color": "pink", "use_action": "FUNGICIDE", @@ -290,7 +320,7 @@ "category": "chems", "name": "insecticide", "name_plural": "insecticide", - "weight": 1, + "weight": "1 g", "//": "Typically sold in larger quantities, but that's handed in the charge count.", "color": "pink", "looks_like": "fungicide", @@ -314,7 +344,7 @@ "id": "salt_water", "name": "salt water", "name_plural": "salt water", - "weight": 260, + "weight": "260 g", "color": "light_cyan", "container": "bottle_plastic", "comestible_type": "DRINK", @@ -334,7 +364,7 @@ "id": "water_acid", "name": "acid water", "name_plural": "acid water", - "weight": 260, + "weight": "260 g", "color": "light_green", "flags": [ "ACID" ], "use_action": "BLECH", @@ -355,7 +385,7 @@ "id": "water_acid_weak", "name": "weak acid water", "name_plural": "weak acid water", - "weight": 255, + "weight": "255 g", "color": "light_green", "flags": [ "ACID" ], "use_action": "BLECH", @@ -376,7 +406,7 @@ "id": "acid", "name": "concentrated acid", "name_plural": "concentrated acid", - "weight": 250, + "weight": "250 g", "color": "green", "flags": [ "ACID", "DROP_ACTION_ONLY_IF_LIQUID" ], "use_action": "BLECH", @@ -398,7 +428,7 @@ "type": "COMESTIBLE", "id": "sewage", "name": "sewage sample", - "weight": 280, + "weight": "280 g", "color": "green", "use_action": "SEWAGE", "container": "bottle_plastic", @@ -425,7 +455,7 @@ "description": "A handful of finely ground aluminum powder. This strong reducing agent was used in combination with various oxidants for chemical welding and explosives alike. Just before the Cataclysm, however, it was the basis of virtually all commercial metallic-hued paints and anti-corrosive coatings.", "material": "powder", "volume": "250 ml", - "weight": 2, + "weight": "2 g", "//": "Weight should be 1.76g but the game will round down the number to 1g and 1.76g is closer to 2g", "bashing": 1, "ammo_type": "components", @@ -444,12 +474,84 @@ "description": "A handful of zinc powder. While commercially used mostly in cosmetics and for paints, hobbyists used to mix it with sulfur to make basic rocket fuel / smokescreen. When treated with a strong acid, it will produce hydrogen.", "material": "powder", "volume": "250 ml", - "weight": 8.4, + "weight": "8400 mg", + "bashing": 1, + "ammo_type": "components", + "container": "bottle_plastic_small", + "count": 100 + }, + { + "type": "AMMO", + "id": "chem_zinc", + "category": "chems", + "price": 200, + "name": "zinc oxide", + "name_plural": "zinc oxide", + "symbol": "=", + "color": "white", + "description": "A handful of zinc oxide. It can be reduced into zinc, or used for some other reactions of its own.", + "material": "powder", + "volume": "250 ml", + "weight": 12.8, "bashing": 1, "ammo_type": "components", "container": "bottle_plastic_small", "count": 100 }, + { + "type": "AMMO", + "id": "chem_manganese_dioxide", + "category": "chems", + "price": 600, + "name": "manganese dioxide", + "name_plural": "manganese dioxide", + "symbol": "=", + "color": "white", + "description": "A handful of manganese dioxide powder. Occurring naturally in the mineral pyrolusite, it is used commercially in the production of alkaline and zinc-carbon batteries.", + "material": "powder", + "volume": "250 ml", + "weight": 12.6, + "bashing": 1, + "ammo_type": "components", + "container": "bag_plastic", + "count": 100 + }, + { + "type": "AMMO", + "id": "chem_potassium_chloride", + "category": "chems", + "price": 600, + "name": "potassium chloride", + "name_plural": "potassium chloride", + "symbol": "=", + "color": "white", + "description": "A handful of potassium chloride. Although it occurs naturally in the mineral sylvite, it can be produced as a byproduct of the reaction of saltpeter and hydrochloric acid. It can be used for making fertilizer, or potassium hydroxide by way of electrolysis.", + "material": "powder", + "volume": "250 ml", + "weight": 5, + "bashing": 1, + "ammo_type": "components", + "container": "bag_plastic", + "count": 100 + }, + { + "type": "AMMO", + "id": "chem_potassium_hydroxide", + "category": "chems", + "price": 600, + "name": "potassium hydroxide", + "name_plural": "potassium hydroxide", + "symbol": "=", + "color": "white", + "description": "A handful of potassium hydroxide. Commonly called caustic potash, it was mainly used industrially for its caustic nature. It can be used as an electrolyte in alkaline batteries, among other applications.", + "material": "powder", + "volume": "250 ml", + "weight": 5.1, + "bashing": 1, + "ammo_type": "components", + "container": "bag_plastic", + "count": 100 + }, { "type": "AMMO", "id": "chem_sulphuric_acid", @@ -462,6 +564,27 @@ "flags": [ "DROP_ACTION_ONLY_IF_LIQUID" ], "description": "Sulfuric acid: viscous, foul-smelling and extremely corrosive, particularly to organic matter and evil clowns. Although used to prepare a number of chemicals, it is mostly known as battery acid, due to its widest commercial application.", "volume": "250 ml", + "weight": "460 g", + "bashing": 1, + "ammo_type": "components", + "charges": 2, + "phase": "liquid", + "container": "bottle_glass", + "freezing_point": 25, + "drop_action": { "type": "emit_actor", "emits": [ "emit_acid_drop" ], "scale_qty": true } + }, + { + "type": "AMMO", + "id": "chem_muriatic_acid", + "category": "chems", + "price": 250, + "name": "hydrochloric acid", + "name_plural": "hydrochloric acid", + "symbol": "=", + "color": "white", + "flags": [ "DROP_ACTION_ONLY_IF_LIQUID" ], + "description": "Hydrochloric acid, also known as muriatic acid. It is a strong acid that has a distinctive smell, important and frequently used ever since its discovery. It still has a vast multitude of uses.", + "volume": "250 ml", "weight": 460, "bashing": 1, "ammo_type": "components", @@ -482,7 +605,7 @@ "color": "white", "description": "Acetone, best known as the primary constituent of most nail polish removers. Flammable and can be easily used for potent home-made explosives, as demonstrated by the terrorist attacks of 2016.", "volume": "250 ml", - "weight": 200, + "weight": "200 g", "bashing": 1, "ammo_type": "components", "phase": "liquid", @@ -500,7 +623,7 @@ "flags": [ "DROP_ACTION_ONLY_IF_LIQUID" ], "description": "Nitric acid, a strong oxidant and extremely corrosive material. Mainly used in the production of synthetic fertilizers, for etching of circuit boards and in woodworking. Remains quite useful both for making a vast array of pyrotechnic and explosive agents and as a direct weapon: not many beings enjoy being doused in nitric acid.", "volume": "250 ml", - "weight": 375, + "weight": "375 g", "bashing": 1, "ammo_type": "components", "charges": 2, @@ -521,7 +644,7 @@ "description": "A handful of chromium oxide pellets. This substance, typically known as the only stable green pigment for paints, is also a mild oxidizer, which can be mixed with aluminum powder to make thermite for welding. If one had access to a CVD machine and a laboratory worth of reagents, they might be able to produce very durable ceramic layers.", "material": "powder", "volume": "250 ml", - "weight": 13.05, + "weight": "13050 mg", "bashing": 1, "ammo_type": "components", "container": "bag_canvas", @@ -539,7 +662,7 @@ "description": "A handful of calcium carbide chunks, giving off a faint, garlic-like smell. Commercially, calcium carbide was used for on-the-spot manufacture of acetylene and historically to power acetylene lamps. If mixed with water and sealed, it will explode with little strength, but with relatively loud noise and could maybe be used as a decoy.", "material": "powder", "volume": "250 ml", - "weight": 5.55, + "weight": "5550 mg", "bashing": 1, "ammo_type": "components", "container": "bag_plastic", @@ -557,7 +680,7 @@ "description": "A handful of waxy hexamine tablets. This ubiquitous fuel was used to start up almost every garden grill and no 'real' camping trip could do its cooking without it, until the Cataclysm. Nowadays, it is even more valuable then before, being the key component in the preparation of several military-grade explosives.", "material": "powder", "volume": "250 ml", - "weight": 16.625, + "weight": "16625 mg", "bashing": 1, "ammo_type": "esbit", "container": "box_small", @@ -574,7 +697,7 @@ "color": "white", "description": "Concentrated hydrogen peroxide is a powerful oxidant, violently decomposing in contact with most reducing agents. Can be used as rocket fuel or to make high explosives. Causes severe burns to any organic matter and may ignite it on contact.", "volume": "250 ml", - "weight": 325, + "weight": "325 g", "bashing": 1, "ammo_type": "components", "phase": "liquid", @@ -592,7 +715,7 @@ "description": "A handful of ammonium nitrate. This white, crystalline powder is commonly used as a component of fertilizers and explosives. Could also be dissolved in water to sharply lower its temperature, but is there any use for this quality in this new world?", "material": "powder", "volume": "250 ml", - "weight": 8.6, + "weight": "8600 mg", "bashing": 1, "ammo_type": "components", "container": "bag_canvas", @@ -610,7 +733,7 @@ "description": "A handful of saltpeter. Sometimes used as a fertilizer, this ubiquitous nitrate is the principal constituent of black gunpowder and simple rocket propellants, such as rocket candy.", "material": "powder", "volume": "250 ml", - "weight": 5.275, + "weight": "5275 mg", "bashing": 1, "ammo_type": "components", "container": "bag_canvas", @@ -628,7 +751,7 @@ "description": "A large crystal of niter, the mineral form of potassium nitrate. It can be processed into saltpeter.", "material": "powder", "volume": "1250 ml", - "weight": 790, + "weight": "790 g", "bashing": 1, "ammo_type": "components" }, @@ -644,7 +767,7 @@ "description": "Several crystals of aluminum sulfate. Historically, an agent for purifying water and as molluscicide, due to the fact that it degenerates their slime. Just before the Cataclysm, its main uses were for adjusting the acidity of the soil and as an additive to baking powder. If mixed with a strong acid, it could be used to saturate the soil with aluminum, causing all but the most resistant of plants to wither and die.", "material": "powder", "volume": "250 ml", - "weight": 13.35, + "weight": "13350 mg", "bashing": 1, "ammo_type": "components", "container": "bag_canvas", @@ -661,7 +784,7 @@ "color": "white", "description": "Concentrated acetic acid, typically used as a chemical reagent and antifungal agent. Despite its horrid smell, it was used to prepare several types of perfumes, but would making perfume not be too fancy for postapocalyptic New England?", "volume": "250 ml", - "weight": 300, + "weight": "300 g", "bashing": 1, "ammo_type": "components", "phase": "liquid", @@ -678,7 +801,7 @@ "color": "white", "description": "Formaldehyde, here dissolved in water, was widely used before the Cataclysm as a precursor to production of many chemicals and materials and as an embalming agent. Easily identifiable by its pungent odor. Terribly toxic, carcinogenic, and volatile.", "volume": "250 ml", - "weight": 300, + "weight": "300 g", "bashing": 1, "ammo_type": "components", "phase": "liquid", @@ -696,7 +819,7 @@ "description": "A handful of silvery-greenish powder, produced by mixing aluminum and chromium oxide. This mixture, burning at a constant pace and at extremely high temperature, was once used for on-the-spot welding. Can be used as an incendiary material in a pinch.", "material": "powder", "volume": "250 ml", - "weight": 10, + "weight": "10 g", "//": "Weight might not be accurate.", "bashing": 1, "ammo_type": "components", @@ -715,7 +838,7 @@ "description": "Several brownish pellets that were made by absorbing organic fuel on ammonium nitrate. This ammonium nitrate-fuel oil or ANFO, as it is called, mixture is a common industrial explosive due to its stability and low price. Burns fast, but needs an explosive primer to detonate.", "material": "powder", "volume": "250 ml", - "weight": 90, + "weight": "90 g", "bashing": 1, "ammo_type": "components", "container": "bag_canvas", @@ -733,7 +856,7 @@ "description": "A handful of black gunpowder, made by mixing charcoal and sulfur with saltpeter. Pretty useless for making modern cartridges, as the soot produced when it burns will quickly clog any firearm, but it could be used to make some vicious bombs.", "material": "powder", "volume": "250 ml", - "weight": 1, + "weight": "1 g", "bashing": 1, "ammo_type": "components", "container": "bag_canvas", @@ -751,7 +874,7 @@ "description": "Several off-white crystals of RDX or hexogen: a military-grade, shelf-stable high explosive. Can be cast into shaped charges or mixed with scrap to pepper the blast area with high-velocity shrapnel.", "material": "powder", "volume": "250 ml", - "weight": 100, + "weight": "100 g", "bashing": 1, "ammo_type": "components", "count": 5 @@ -768,7 +891,7 @@ "description": "Hexamine peroxide: this fine, yellowish powder is a powerful primary explosive, used to initiate detonation of more stable explosives, such as RDX. Relatively stable, but best not store it for too long.", "material": "powder", "volume": "250 ml", - "weight": 200, + "weight": "200 g", "bashing": 1, "ammo_type": "components", "container": "bag_plastic", @@ -786,7 +909,7 @@ "description": "A chunk of a zinc powder and sulfur mixture, bound together by superglue, that can be used as an impromptu rocket fuel.", "material": "powder", "volume": "250 ml", - "weight": 70, + "weight": "70 g", "bashing": 1, "ammo_type": "components", "container": "bag_plastic", @@ -797,7 +920,7 @@ "id": "pur_tablets", "name": "water purification tablet", "category": "chems", - "weight": 1, + "weight": "1 g", "color": "white", "use_action": "WATER_PURIFIER", "container": "bottle_plastic_small", @@ -820,7 +943,7 @@ "description": "A root from a hickory tree. It has an earthy smell.", "price": 0, "material": "wood", - "weight": 500, + "weight": "500 g", "volume": "500 ml", "to_hit": -2 }, @@ -835,7 +958,7 @@ "description": "A handful of hard nuts from a hickory tree, still in their shell.", "spoils_in": "180 days", "price": 0, - "weight": 212, + "weight": "212 g", "volume": "250 ml", "to_hit": -2 }, @@ -850,7 +973,7 @@ "description": "A handful of hard nuts from a pecan tree, still in their shell.", "spoils_in": "180 days", "price": 0, - "weight": 212, + "weight": "212 g", "volume": "250 ml", "to_hit": -2 }, @@ -865,7 +988,7 @@ "description": "A handful of hard nuts from a pistachio tree, still in their shell.", "spoils_in": "90 days", "price": 0, - "weight": 180, + "weight": "180 g", "volume": "250 ml", "to_hit": -2 }, @@ -880,7 +1003,7 @@ "description": "A handful of hard nuts from a almond tree, still in their shell.", "spoils_in": "300 days", "price": 0, - "weight": 212, + "weight": "212 g", "volume": "250 ml", "to_hit": -2 }, @@ -895,7 +1018,7 @@ "description": "A handful of hard nuts from a peanut bush, still in their shell.", "spoils_in": "240 days", "price": 0, - "weight": 200, + "weight": "200 g", "volume": "250 ml", "to_hit": -2 }, @@ -910,7 +1033,7 @@ "description": "A handful of hard nuts from a hazelnut tree, still in their shell.", "spoils_in": "150 days", "price": 0, - "weight": 212, + "weight": "212 g", "volume": "250 ml", "to_hit": -2 }, @@ -925,7 +1048,7 @@ "description": "A handful of hard nuts from a chestnut tree, still in their shell.", "spoils_in": "180 days", "price": 0, - "weight": 240, + "weight": "240 g", "volume": "250 ml", "to_hit": -2 }, @@ -940,7 +1063,7 @@ "description": "A handful of hard nuts from a walnut tree, still in their shell.", "spoils_in": "180 days", "price": 0, - "weight": 240, + "weight": "240 g", "volume": "250 ml", "to_hit": -2 }, @@ -949,7 +1072,7 @@ "id": "water_sewage", "name": "sewage water", "name_plural": "sewage water", - "weight": 280, + "weight": "280 g", "color": "green", "container": "bottle_plastic", "comestible_type": "DRINK", @@ -973,7 +1096,7 @@ "description": "A popular pre-cataclysm washing powder.", "material": "powder", "volume": "250 ml", - "weight": 1, + "weight": "1 g", "ammo_type": "components", "container": "box_small", "count": 20 @@ -983,7 +1106,7 @@ "id": "lye", "name": "lye", "name_plural": "lye", - "weight": 125, + "weight": "125 g", "color": "white", "container": "bottle_plastic", "symbol": "~", @@ -1009,7 +1132,7 @@ "description": "Steel canisters containing carbon, iron, titanium, copper and other elements in specifically engineered atomic scale configurations. A nanofabricator can assemble them into usable items.", "material": "steel", "volume": "15 L", - "weight": 250, + "weight": "250 g", "ammo_type": "components", "count": 50 }, @@ -1025,7 +1148,7 @@ "description": "This is almost weightless residue left after the burning of some substance.", "material": "powder_nonflam", "volume": "164ml", - "weight": 1, + "weight": "1 g", "ammo_type": "components", "count": 100 }, @@ -1130,7 +1253,7 @@ "description": "This is a pre-mixed salty solution of protein and sugar. It's meant for bacteria to eat, but if you were desperate you could eat it too; it's not much different from cup noodle stock.", "material": "powder_nonflam", "volume": 0.1, - "weight": 1 + "weight": "1 g" }, { "type": "COMESTIBLE", @@ -1149,7 +1272,7 @@ "description": "These clear flakes of processed seaweed can be dissolved in boiling water to create a very sturdy, temperature resistant gel. Not only is it good for making gels to separate molecules by size, but it's a great cheat ingredient to make sure your jellies set properly.", "material": "powder_nonflam", "volume": 0.1, - "weight": 1 + "weight": "1 g" }, { "type": "COMESTIBLE", @@ -1169,7 +1292,7 @@ "description": "This highly carcinogenic white powder can be readily polymerized into a whole bunch of useful water-soluble gels.", "material": "powder_nonflam", "volume": 0.1, - "weight": 1 + "weight": "1 g" }, { "id": "steel_grille", @@ -1177,7 +1300,7 @@ "category": "other", "name": "steel grille", "description": "This is a metal grille. It can be used as a framework for making a chemical catalyst.", - "weight": 600, + "weight": "600 g", "volume": "250 ml", "price": 500, "to_hit": 1, @@ -1200,7 +1323,7 @@ "material": [ "steel", "plastic" ], "flags": [ "LEAK_ALWAYS", "RADIOACTIVE" ], "volume": "250 ml", - "weight": 80 + "weight": "80 g" }, { "id": "wooden_bead", @@ -1208,7 +1331,7 @@ "category": "spare_parts", "name": "wooden bead", "description": "This is a wooden bead. It can be used to craft inscribable jewelry or create a beaded curtain door.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 1, "material": "wood", @@ -1224,7 +1347,7 @@ "category": "other", "name": "sandbag", "description": "This is a canvas sack filled with sand. It can be used to construct simple barricades.", - "weight": 24415, + "weight": "24415 g", "volume": "16L", "price": 0, "material": [ "cotton", "powder" ], @@ -1239,7 +1362,7 @@ "category": "other", "name": "earthbag", "description": "This is a canvas sack filled with soil. It can be used to construct simple barricades.", - "weight": 19500, + "weight": "19500 g", "volume": "16L", "price": 0, "material": [ "cotton", "powder" ], @@ -1254,7 +1377,7 @@ "category": "chems", "name": "rosin", "description": "This is a chunk of yellowish rosin, usable as a flux for soldering.", - "weight": 1, + "weight": "1 g", "volume": "10 ml", "count": 10, "price": 0, @@ -1269,7 +1392,7 @@ "name": "acetylene", "category": "chems", "description": "A flammable gas that explodes under pressure. Combined with oxygen, acetylene makes a great welding gas.", - "weight": 40, + "weight": "40 g", "volume": "250 ml", "price": 1200, "material": [ "hydrocarbons" ], diff --git a/data/json/items/classes/book.json b/data/json/items/classes/book.json index 8d6b9b2335ed7..ebc75337944d6 100644 --- a/data/json/items/classes/book.json +++ b/data/json/items/classes/book.json @@ -3,7 +3,7 @@ "abstract": "book_magazine", "type": "BOOK", "name": "Readable magazine", - "weight": 70, + "weight": "70 g", "volume": "250 ml", "material": "paper", "symbol": "?", @@ -18,7 +18,7 @@ "type": "GENERIC", "category": "books", "name": "Martial art manual", - "weight": 150, + "weight": "150 g", "volume": "250 ml", "price": 20000, "material": "paper", diff --git a/data/json/items/classes/comestible.json b/data/json/items/classes/comestible.json index 8d5e1a78c7be4..708f03fe1afe9 100644 --- a/data/json/items/classes/comestible.json +++ b/data/json/items/classes/comestible.json @@ -6,7 +6,7 @@ "name": "Spice", "//": "Spices are inedible in their base form but useful in crafting", "flags": "NUTRIENT_OVERRIDE", - "weight": 5, + "weight": "5 g", "volume": "250 ml", "price": 250, "container": "bag_plastic", diff --git a/data/json/items/classes/gun.json b/data/json/items/classes/gun.json index 6a47d8956de1f..f8c5ddaf5e8e0 100644 --- a/data/json/items/classes/gun.json +++ b/data/json/items/classes/gun.json @@ -6,7 +6,7 @@ "name": "base gun", "symbol": "(", "color": "light_gray", - "faults": [ "fault_gun_blackpowder", "fault_gun_clogged" ] + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged", "fault_gun_chamber_spent" ] }, { "abstract": "flamethrower_base", @@ -29,7 +29,8 @@ "skill": "launcher", "modes": [ [ "DEFAULT", "single", 1, "NPC_AVOID" ] ], "valid_mod_locations": [ [ "accessories", 2 ], [ "barrel", 1 ], [ "sights", 1 ], [ "sling", 1 ] ], - "flags": [ "RELOAD_ONE", "RELOAD_EJECT", "NEVER_JAMS" ] + "flags": [ "RELOAD_ONE", "RELOAD_EJECT", "NEVER_JAMS" ], + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged" ] }, { "abstract": "pistol_base", @@ -80,6 +81,7 @@ "proportional": { "reload": 0.7 }, "extend": { "flags": [ "RELOAD_ONE", "RELOAD_EJECT", "NEVER_JAMS" ] }, "//": "Revolvers exclude the muzzle location preventing installation of suppressors", + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged" ], "valid_mod_locations": [ [ "accessories", 2 ], [ "barrel", 1 ], @@ -92,6 +94,24 @@ [ "underbarrel mount", 1 ] ] }, + { + "abstract": "pistol_revolver_cap_ball", + "copy-from": "pistol_base", + "type": "GUN", + "name": "cap & ball revolver", + "reload": 150, + "extend": { "flags": [ "RELOAD_ONE", "NO_UNLOAD" ] }, + "//": "Slower reloads, no unloading. Base, unskilled person should take 1.5 seconds per chamber. No underbarrel mods, that's where the ram goes.", + "valid_mod_locations": [ + [ "accessories", 2 ], + [ "barrel", 1 ], + [ "bore", 1 ], + [ "grip", 1 ], + [ "stock", 1 ], + [ "rail mount", 1 ], + [ "sights mount", 1 ] + ] + }, { "abstract": "rifle_base", "copy-from": "gun_base", @@ -121,6 +141,7 @@ "name": "rifle with manual actions", "name_plural": "rifles with manual actions", "//": "Manual actions exclude the magazine location preventing installation of belt-feed adaptors", + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged" ], "valid_mod_locations": [ [ "accessories", 4 ], [ "barrel", 1 ], @@ -176,7 +197,8 @@ "type": "GUN", "name": "pump action shotgun", "reload_noise": "chuk chuk.", - "flags": [ "RELOAD_ONE", "PUMP_ACTION" ] + "flags": [ "RELOAD_ONE", "PUMP_ACTION" ], + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged" ] }, { "abstract": "smg_base", diff --git a/data/json/items/comestibles/alcohol.json b/data/json/items/comestibles/alcohol.json index cfeb5bdcfcfb7..fe5c2e6193ee8 100644 --- a/data/json/items/comestibles/alcohol.json +++ b/data/json/items/comestibles/alcohol.json @@ -4,7 +4,7 @@ "id": "wine_mycus", "name": "marloss wine", "name_plural": "marloss wine", - "weight": 33, + "weight": "33 g", "color": "white", "addiction_type": "alcohol", "use_action": "MYCUS", @@ -31,7 +31,7 @@ "id": "wine_riesling", "name": "Riesling", "name_plural": "Riesling", - "weight": 50, + "weight": "50 g", "color": "white", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -59,7 +59,7 @@ "id": "wine_chardonnay", "name": "Chardonnay", "name_plural": "Chardonnay", - "weight": 50, + "weight": "50 g", "color": "white", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -87,7 +87,7 @@ "id": "wine_cabernet", "name": "Cabernet Sauvignon", "name_plural": "Cabernet Sauvignon", - "weight": 50, + "weight": "50 g", "color": "red", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -113,7 +113,7 @@ "id": "wine_noir", "name": "pinot noir", "name_plural": "pinot noir", - "weight": 50, + "weight": "50 g", "color": "red", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -140,7 +140,7 @@ "id": "wine_marsala", "name": "marsala", "name_plural": "marsala", - "weight": 50, + "weight": "50 g", "color": "red", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -167,7 +167,7 @@ "id": "wine_vermouth", "name": "vermouth", "name_plural": "vermouth", - "weight": 50, + "weight": "50 g", "color": "red", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -194,7 +194,7 @@ "id": "wine_barley", "name": "barley wine", "name_plural": "barley wine", - "weight": 249, + "weight": "249 g", "color": "brown", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -222,7 +222,7 @@ "id": "whiskey", "name": "whiskey", "name_plural": "whiskey", - "weight": 33, + "weight": "33 g", "color": "brown", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -250,7 +250,7 @@ "id": "vodka", "name": "vodka", "name_plural": "vodka", - "weight": 33, + "weight": "33 g", "color": "light_cyan", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -277,7 +277,7 @@ "id": "gin", "name": "gin", "name_plural": "gin", - "weight": 33, + "weight": "33 g", "color": "light_cyan", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -304,7 +304,7 @@ "id": "rum", "name": "rum", "name_plural": "rum", - "weight": 33, + "weight": "33 g", "color": "light_cyan", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -331,7 +331,7 @@ "id": "tequila", "name": "tequila", "name_plural": "tequila", - "weight": 34, + "weight": "34 g", "color": "yellow", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -358,7 +358,7 @@ "id": "triple_sec", "name": "triple sec", "name_plural": "triple sec", - "weight": 30, + "weight": "30 g", "color": "light_cyan", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -385,7 +385,7 @@ "id": "bum_wine", "name": "cheap wine", "name_plural": "cheap wine", - "weight": 35, + "weight": "35 g", "color": "red", "addiction_type": "alcohol", "use_action": "ALCOHOL_WEAK", @@ -413,7 +413,7 @@ "id": "mixed_alcohol_strong", "name": "strong mixed alcohol", "name_plural": "strong mixed alcohol", - "weight": 34, + "weight": "34 g", "color": "red", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -440,7 +440,7 @@ "id": "mixed_alcohol_weak", "name": "weak mixed alcohol", "name_plural": "weak mixed alcohol", - "weight": 248, + "weight": "248 g", "color": "light_red", "addiction_type": "alcohol", "use_action": "ALCOHOL_WEAK", @@ -467,7 +467,7 @@ "id": "fruit_wine", "name": "fruit wine", "name_plural": "fruit wine", - "weight": 36, + "weight": "36 g", "color": "light_red", "addiction_type": "alcohol", "use_action": "ALCOHOL_WEAK", @@ -495,7 +495,7 @@ "id": "brandy", "name": "brandy", "name_plural": "brandy", - "weight": 34, + "weight": "34 g", "color": "light_red", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -522,7 +522,7 @@ "id": "irish_coffee", "name": "Irish coffee", "name_plural": "Irish coffee", - "weight": 260, + "weight": "260 g", "color": "brown", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -548,7 +548,7 @@ "id": "long_island", "name": "Long Island iced tea", "name_plural": "Long Island iced tea", - "weight": 51, + "weight": "51 g", "color": "brown", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -575,7 +575,7 @@ "type": "COMESTIBLE", "id": "drink_screwdriver", "name": "screwdriver cocktail", - "weight": 258, + "weight": "258 g", "color": "yellow", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -603,7 +603,7 @@ "id": "drink_wild_apple", "name": "wild apple", "name_plural": "wild apple", - "weight": 258, + "weight": "258 g", "color": "brown", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -631,7 +631,7 @@ "id": "drink_rumcola", "name": "rum & cola", "name_plural": "rum & cola", - "weight": 251, + "weight": "251 g", "color": "brown", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -658,7 +658,7 @@ "id": "beer", "name": "beer", "name_plural": "beer", - "weight": 251, + "weight": "251 g", "color": "brown", "addiction_type": "alcohol", "use_action": "ALCOHOL_WEAK", @@ -685,7 +685,7 @@ "id": "mead", "name": "spiced mead", "name_plural": "spiced mead", - "weight": 36, + "weight": "36 g", "color": "yellow", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -712,7 +712,7 @@ "id": "dandelion_wine", "name": "dandelion wine", "name_plural": "dandelion wine", - "weight": 35, + "weight": "35 g", "color": "yellow", "addiction_type": "alcohol", "use_action": "ALCOHOL_WEAK", @@ -740,7 +740,7 @@ "id": "pine_wine", "name": "pine wine", "name_plural": "pine wine", - "weight": 35, + "weight": "35 g", "color": "light_green", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -768,7 +768,7 @@ "id": "hb_beer", "name": "homebrew beer", "name_plural": "homebrew beer", - "weight": 249, + "weight": "249 g", "color": "brown", "addiction_type": "alcohol", "use_action": "ALCOHOL_WEAK", @@ -795,7 +795,7 @@ "id": "moonshine", "name": "moonshine", "name_plural": "moonshine", - "weight": 35, + "weight": "35 g", "color": "brown", "addiction_type": "alcohol", "use_action": "ALCOHOL_STRONG", @@ -822,7 +822,7 @@ "id": "european_pilsner", "name": "European pilsner", "name_plural": "European pilsner", - "weight": 249, + "weight": "249 g", "color": "brown", "addiction_type": "alcohol", "use_action": "ALCOHOL_WEAK", @@ -850,7 +850,7 @@ "id": "pale_ale", "name": "American pale ale", "name_plural": "American pale ale", - "weight": 249, + "weight": "249 g", "color": "brown", "addiction_type": "alcohol", "use_action": "ALCOHOL_WEAK", @@ -878,7 +878,7 @@ "id": "india_pale_ale", "name": "India pale ale", "name_plural": "India pale ale", - "weight": 249, + "weight": "249 g", "color": "brown", "addiction_type": "alcohol", "use_action": "ALCOHOL_WEAK", @@ -906,7 +906,7 @@ "id": "stout", "name": "stout", "name_plural": "stout", - "weight": 205, + "weight": "205 g", "color": "brown", "addiction_type": "alcohol", "use_action": "ALCOHOL_WEAK", @@ -934,7 +934,7 @@ "id": "belgian_ale", "name": "Belgian ale", "name_plural": "Belgian ale", - "weight": 249, + "weight": "249 g", "color": "brown", "addiction_type": "alcohol", "use_action": "ALCOHOL_WEAK", @@ -962,7 +962,7 @@ "id": "imperial_stout", "name": "imperial stout", "name_plural": "imperial stout", - "weight": 249, + "weight": "249 g", "color": "brown", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -989,7 +989,7 @@ "type": "COMESTIBLE", "id": "drink_strawberry_surprise", "name": "strawberry surprise", - "weight": 43, + "weight": "43 g", "color": "pink", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -1018,7 +1018,7 @@ "id": "drink_boozeberry", "name": "boozeberry", "name_plural": "boozeberries", - "weight": 43, + "weight": "43 g", "color": "cyan", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -1047,7 +1047,7 @@ "id": "single_malt_whiskey", "name": "single malt whiskey", "name_plural": "single malt whiskey", - "weight": 33, + "weight": "33 g", "color": "brown", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -1074,7 +1074,7 @@ "type": "COMESTIBLE", "id": "drink_hobo", "name": "fancy hobo", - "weight": 50, + "weight": "50 g", "color": "yellow", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -1101,7 +1101,7 @@ "type": "COMESTIBLE", "id": "drink_kalimotxo", "name": "kalimotxo", - "weight": 250, + "weight": "250 g", "color": "red", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -1128,7 +1128,7 @@ "type": "COMESTIBLE", "id": "drink_beeknees", "name": "bee's knees", - "weight": 248, + "weight": "248 g", "color": "yellow", "addiction_type": "alcohol", "use_action": "ALCOHOL_WEAK", @@ -1153,7 +1153,7 @@ "type": "COMESTIBLE", "id": "drink_wsour", "name": "whiskey sour", - "weight": 249, + "weight": "249 g", "color": "yellow", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -1178,7 +1178,7 @@ "type": "COMESTIBLE", "id": "honey_gold", "name": "honeygold brew", - "weight": 259, + "weight": "259 g", "color": "yellow", "use_action": "ALCOHOL_WEAK", "stim": 1, @@ -1202,7 +1202,7 @@ "type": "COMESTIBLE", "id": "honey_ant", "name": "honey ball", - "weight": 178, + "weight": "178 g", "color": "yellow", "addiction_type": "alcohol", "use_action": "ALCOHOL_WEAK", @@ -1227,7 +1227,7 @@ "type": "COMESTIBLE", "id": "eggnog_spiked", "name": "spiked eggnog", - "weight": 132, + "weight": "132 g", "color": "white", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -1256,7 +1256,7 @@ "type": "COMESTIBLE", "id": "drink_martini", "name": "martini", - "weight": 248, + "weight": "49600 mg", "color": "white", "addiction_type": "alcohol", "use_action": "ALCOHOL", @@ -1264,14 +1264,15 @@ "container": "bottle_glass", "comestible_type": "DRINK", "symbol": "~", - "quench": 25, + "quench": 5, "addiction_potential": 4, - "calories": 61, + "calories": 13, "description": "This is a popular cocktail made with gin and dry vermouth, dating from the Prohibition era.", "price": 850, "material": [ "alcohol", "water" ], "primary_material": "alcohol", "volume": "500 ml", + "charges": 5, "phase": "liquid", "flags": [ "EATEN_COLD" ], "freezing_point": -22, diff --git a/data/json/items/comestibles/bread.json b/data/json/items/comestibles/bread.json index 58d17f90ca37e..9e7ad6b48cef5 100644 --- a/data/json/items/comestibles/bread.json +++ b/data/json/items/comestibles/bread.json @@ -1,11 +1,32 @@ [ + { + "id": "donut_holes", + "type": "COMESTIBLE", + "name": "donut holes", + "name_plural": "donut holes", + "weight": 226, + "color": "yellow", + "spoils_in": "10 days", + "comestible_type": "FOOD", + "symbol": "%", + "calories": 60, + "quench": -1, + "healthy": -1, + "description": "These balls of dough have been cut into shape, covered with sugar, and cooked to a crisp. A staple of fairgrounds everywhere.", + "price": 100, + "volume": "250 ml", + "charges": 4, + "flags": [ "EATEN_HOT" ], + "looks_like": "bread", + "fun": 4 + }, { "id": "sourdough_young", "type": "GENERIC", "category": "food", "name": "juvenile sourdough starter", "description": "This jar contains a floury paste that is slowly going bad. Someday it will be sourdough.", - "weight": 52, + "weight": "52 g", "volume": "250 ml", "price": 10, "bashing": 8, @@ -28,7 +49,7 @@ "category": "food", "name": "freshly fed sourdough starter", "description": "This jar contains a floury paste with sourdough starter mixed in. It needs a few hours to recover its strength before it can be used again.", - "weight": 52, + "weight": "52 g", "volume": "250 ml", "price": 10, "bashing": 8, @@ -51,7 +72,7 @@ "category": "food", "name": "sourdough starter", "description": "This jar contains a precious mix of flour, water, molds and bacteria from the air. When you add flour and water to it, after a few hours it froths and rises.", - "weight": 52, + "weight": "52 g", "looks_like": "jar_glass", "volume": "250 ml", "price": 50, @@ -64,7 +85,7 @@ "type": "COMESTIBLE", "id": "sourdough_bread", "name": "sourdough bread", - "weight": 56, + "weight": "56 g", "color": "brown", "spoils_in": "8 days", "container": "bag_plastic", @@ -85,7 +106,7 @@ "type": "COMESTIBLE", "id": "flatbread", "name": "flatbread", - "weight": 85, + "weight": "85 g", "color": "brown", "spoils_in": "11 days 16 hours", "container": "bag_plastic", @@ -103,7 +124,7 @@ "type": "COMESTIBLE", "id": "bread", "name": "bread", - "weight": 60, + "weight": "60 g", "color": "brown", "spoils_in": "10 days", "container": "bag_plastic", @@ -124,7 +145,7 @@ "type": "COMESTIBLE", "id": "cornbread", "name": "cornbread", - "weight": 60, + "weight": "60 g", "color": "yellow", "spoils_in": "30 days", "container": "bag_plastic", @@ -146,7 +167,7 @@ "type": "COMESTIBLE", "id": "johnnycake", "name": "johnnycake", - "weight": 49, + "weight": "49 g", "color": "yellow", "spoils_in": "20 days", "comestible_type": "FOOD", @@ -166,7 +187,7 @@ "type": "COMESTIBLE", "id": "tortilla_corn", "name": "corn tortilla", - "weight": 24, + "weight": "24 g", "color": "brown", "spoils_in": "20 days", "container": "bag_plastic", @@ -188,7 +209,7 @@ "type": "COMESTIBLE", "id": "hardtack", "name": "hardtack", - "weight": 80, + "weight": "80 g", "color": "white", "spoils_in": "360 days", "comestible_type": "FOOD", @@ -209,7 +230,7 @@ "type": "COMESTIBLE", "id": "biscuit", "name": "biscuit", - "weight": 30, + "weight": "30 g", "color": "brown", "spoils_in": "7 days 12 hours", "container": "box_small", @@ -229,7 +250,7 @@ "type": "COMESTIBLE", "id": "wastebread", "name": "wastebread", - "weight": 60, + "weight": "60 g", "color": "white", "spoils_in": 990, "comestible_type": "FOOD", diff --git a/data/json/items/comestibles/brewing.json b/data/json/items/comestibles/brewing.json index 2ea3950d1258f..86d225ee20597 100644 --- a/data/json/items/comestibles/brewing.json +++ b/data/json/items/comestibles/brewing.json @@ -4,7 +4,7 @@ "id": "brew_mycus_wine", "name": "mycus wine must", "description": "Unfermented mycus wine. A goopy white mess, made from fruit of mycus. It smells sweetly of mushrooms.", - "weight": 33, + "weight": "33 g", "color": "white", "container": "bottle_glass", "flags": [ "EATEN_COLD", "MYCUS_OK" ], @@ -24,7 +24,7 @@ "id": "brew_whiskey", "name": "whiskey wort", "description": "Unfermented whiskey. The base of a fine drink. Not the traditional preparation, but you don't have the time.", - "weight": 33, + "weight": "33 g", "color": "brown", "container": "bottle_glass", "flags": [ "TRADER_AVOID", "NUTRIENT_OVERRIDE" ], @@ -45,7 +45,7 @@ "name": "whiskey wash", "name_plural": "whiskey washes", "description": "Fermented, but not distilled whiskey. No longer tastes sweet.", - "weight": 33, + "weight": "33 g", "color": "brown", "addiction_type": "alcohol", "addiction_potential": 1, @@ -70,7 +70,7 @@ "name": "fermenting gin mash", "name_plural": "fermenting gin mashes", "description": "Undistilled gin mash. Distilling it will produce gin.", - "weight": 33, + "weight": "33 g", "color": "brown", "container": "bottle_glass", "flags": [ "TRADER_AVOID", "NUTRIENT_OVERRIDE" ], @@ -91,7 +91,7 @@ "name": "gin mash", "name_plural": "gin mashes", "description": "Gin mash, after the junipers have had time to add flavor, ready to be distilled or drunk as is.", - "weight": 33, + "weight": "33 g", "color": "yellow", "addiction_type": "alcohol", "addiction_potential": 1, @@ -115,7 +115,7 @@ "id": "brew_vodka", "name": "vodka wort", "description": "Unfermented vodka. Water with sugar from enzymatic breakdown of malted grains or just added in pure form.", - "weight": 50, + "weight": "50 g", "color": "light_cyan", "container": "bottle_glass", "symbol": "~", @@ -136,7 +136,7 @@ "name": "vodka wash", "name_plural": "vodka washes", "description": "Fermented, but not distilled vodka. No longer tastes sweet.", - "weight": 33, + "weight": "33 g", "color": "light_cyan", "addiction_type": "alcohol", "addiction_potential": 1, @@ -160,7 +160,7 @@ "id": "brew_rum", "name": "rum wort", "description": "Unfermented rum. Sugar caramel or molasses brewed into sweet water. Basically a saccharine soup.", - "weight": 33, + "weight": "33 g", "color": "light_cyan", "container": "bottle_glass", "flags": [ "TRADER_AVOID", "NUTRIENT_OVERRIDE" ], @@ -181,7 +181,7 @@ "name": "rum wash", "name_plural": "rum washes", "description": "Fermented, but not distilled rum. No longer tastes sweet.", - "weight": 50, + "weight": "50 g", "color": "light_cyan", "addiction_type": "alcohol", "addiction_potential": 1, @@ -205,7 +205,7 @@ "id": "brew_fruit_wine", "name": "fruit wine must", "description": "Unfermented fruit wine. A sweet, boiled juice made from berries or fruit.", - "weight": 46, + "weight": "46 g", "color": "light_red", "container": "bottle_glass", "flags": [ "TRADER_AVOID", "NUTRIENT_OVERRIDE" ], @@ -226,7 +226,7 @@ "id": "brew_mead", "name": "spiced mead must", "description": "Unfermented spiced mead. Diluted honey and yeast.", - "weight": 38, + "weight": "38 g", "color": "yellow", "container": "bottle_glass", "flags": [ "TRADER_AVOID", "NUTRIENT_OVERRIDE" ], @@ -248,7 +248,7 @@ "id": "brew_dandelion_wine", "name": "dandelion wine must", "description": "Unfermented dandelion wine. A sticky mixture of water, sugar, yeast, and dandelion petals.", - "weight": 38, + "weight": "38 g", "color": "yellow", "container": "bottle_glass", "symbol": "~", @@ -268,7 +268,7 @@ "id": "brew_pine_wine", "name": "pine wine must", "description": "Unfermented pine wine. A sticky mixture of water, sugar, yeast, and pine resins.", - "weight": 38, + "weight": "38 g", "color": "green", "container": "bottle_glass", "symbol": "~", @@ -288,7 +288,7 @@ "id": "brew_hb_beer", "name": "beer wort", "description": "Unfermented homebrew beer. A boiled and chilled mash of malted barley, spiced with some fine hops.", - "weight": 249, + "weight": "249 g", "color": "brown", "container": "jug_plastic", "flags": [ "TRADER_AVOID", "NUTRIENT_OVERRIDE" ], @@ -308,7 +308,7 @@ "name": "moonshine mash", "name_plural": "moonshine mashes", "description": "Unfermented moonshine. Just some water, sugar and corn, like good ol' aunt's recipe.", - "weight": 50, + "weight": "50 g", "color": "brown", "container": "jug_plastic", "flags": [ "TRADER_AVOID", "NUTRIENT_OVERRIDE" ], @@ -329,7 +329,7 @@ "name": "moonshine wash", "name_plural": "moonshine washes", "description": "Fermented, but not distilled moonshine. Contains all the contaminants you don't want in your moonshine.", - "weight": 50, + "weight": "50 g", "color": "brown", "addiction_type": "alcohol", "addiction_potential": 1, @@ -352,7 +352,7 @@ "type": "COMESTIBLE", "id": "brew_milk_curdled", "name": "curdling milk", - "weight": 236, + "weight": "236 g", "color": "white", "spoils_in": "28 days", "container": "waterskin", @@ -374,7 +374,7 @@ "id": "brew_vinegar", "name": "unfermented vinegar", "description": "Mixture of water, alcohol and fruit juice that will eventually become vinegar.", - "weight": 127, + "weight": "127 g", "color": "yellow", "container": "jug_plastic", "symbol": "~", diff --git a/data/json/items/comestibles/carnivore.json b/data/json/items/comestibles/carnivore.json index 7baeb0254ccd2..fb5eb7cc51202 100644 --- a/data/json/items/comestibles/carnivore.json +++ b/data/json/items/comestibles/carnivore.json @@ -18,7 +18,7 @@ "name_plural": "fillets of fish", "description": "Freshly caught fish. Makes a passable meal raw.", "//": "Nutrition information based on cod", - "weight": 148, + "weight": "148 g", "volume": "250 ml", "price": 500, "spoils_in": "12 hours", @@ -85,7 +85,7 @@ "name": "chunk of meat", "name_plural": "chunks of meat", "description": "Freshly butchered meat. You could eat it raw, but cooking it is better.", - "weight": 296, + "weight": "296 g", "volume": "250 ml", "price": 500, "spoils_in": "1 day", @@ -119,7 +119,7 @@ "name_plural": "butchery refuse", "charges": 15, "volume": "2500 ml", - "weight": 250, + "weight": "250 g", "color": "black", "looks_like": "feces_manure", "description": "Eugh. This is a mess of dirt, excreta, connective tissue, and bits of matter like hair and claws, leftover from the butchering process. Eating it isn't even worth thinking about, but disposing of it might be a concern as it could attract vermin.", @@ -217,7 +217,7 @@ "type": "COMESTIBLE", "name": "stomach", "description": "The stomach of a woodland creature. It is surprisingly durable.", - "weight": 72, + "weight": "72 g", "volume": "250 ml", "price": 200, "spoils_in": "8 hours", @@ -242,7 +242,7 @@ "name_plural": "meat jerky", "description": "Salty dried meat that lasts for a long time, but will make you thirsty.", "primary_material": "cured_meat", - "weight": 85, + "weight": "85 g", "container": "bag_plastic", "color": "brown", "spoils_in": "24 days", @@ -292,7 +292,7 @@ "quench": -5, "fun": 4, "calories": 348, - "weight": 85, + "weight": "85 g", "vitamins": [ [ "vitA", 0 ], [ "vitC", 0 ], [ "calcium", 2 ], [ "iron", 1 ], [ "vitB", 8 ] ], "proportional": { "price": 0.44 } }, @@ -343,7 +343,7 @@ "name": "piece of raw lung", "name_plural": "pieces of raw lung", "description": "A portion of lung from an animal. It's spongy and pink, and spoils very quickly. It can be a delicacy if properly prepared - but if improperly prepared, it's a chewy lump of flavorless connective tissue.", - "weight": 56, + "weight": "56 g", "volume": "250 ml", "color": "pink", "charges": 4, @@ -436,7 +436,8 @@ "description": "No, this is not beans.", "healthy": -2, "quench": -2, - "fun": -3 + "fun": -3, + "parasites": 0 }, { "id": "sweetbread", @@ -466,7 +467,7 @@ "id": "blood", "name": "blood", "name_plural": "blood", - "weight": 265, + "weight": "265 g", "color": "red", "container": "flask_glass", "comestible_type": "DRINK", @@ -486,7 +487,7 @@ "id": "bone", "category": "spare_parts", "name": "bone", - "weight": 225, + "weight": "225 g", "color": "white", "symbol": "%", "description": "A bone from some creature or other. Could be used to make some stuff, like needles.", @@ -500,7 +501,7 @@ "id": "fat", "name": "chunk of fat", "name_plural": "chunks of fat", - "weight": 220, + "weight": "220 g", "color": "pink", "spoils_in": "7 days", "comestible_type": "FOOD", @@ -520,7 +521,7 @@ "type": "COMESTIBLE", "id": "tallow", "name": "tallow", - "weight": 110, + "weight": "110 g", "color": "white", "spoils_in": "60 days", "comestible_type": "FOOD", @@ -551,7 +552,7 @@ "category": "other", "name": "chunk of tainted meat", "name_plural": "chunks of tainted meat", - "weight": 238, + "weight": "238 g", "color": "red", "spoils_in": "4 hours", "use_action": "POISON", @@ -571,7 +572,7 @@ "id": "bone_tainted", "category": "other", "name": "tainted bone", - "weight": 212, + "weight": "212 g", "color": "light_gray", "use_action": "POISON", "comestible_type": "FOOD", @@ -598,7 +599,7 @@ "id": "fat_tainted", "category": "other", "name": "tainted fat", - "weight": 192, + "weight": "192 g", "color": "yellow", "spoils_in": "4 hours", "use_action": "POISON", @@ -618,7 +619,7 @@ "id": "tallow_tainted", "name": "tainted tallow", "category": "other", - "weight": 128, + "weight": "128 g", "color": "light_gray", "use_action": "POISON", "comestible_type": "FOOD", @@ -639,7 +640,7 @@ "type": "COMESTIBLE", "id": "stomach_boiled", "name": "large boiled stomach", - "weight": 145, + "weight": "145 g", "color": "red", "spoils_in": "1 day", "comestible_type": "FOOD", @@ -664,7 +665,7 @@ "type": "COMESTIBLE", "id": "small_stomach_boiled", "name": "boiled stomach", - "weight": 72, + "weight": "72 g", "color": "red", "spoils_in": "1 day", "comestible_type": "FOOD", @@ -690,7 +691,7 @@ "id": "raw_leather", "category": "spare_parts", "name": "raw hide", - "weight": 15, + "weight": "15 g", "color": "pink", "spoils_in": "1 day 12 hours", "comestible_type": "FOOD", @@ -729,7 +730,7 @@ "id": "raw_fur", "category": "spare_parts", "name": "raw pelt", - "weight": 17, + "weight": "17 g", "color": "brown", "spoils_in": "1 day 12 hours", "comestible_type": "FOOD", @@ -761,7 +762,7 @@ "comestible_type": "FOOD", "id": "flesh_golem_heart", "name": "seeping heart", - "weight": 2035, + "weight": "2035 g", "color": "black_red", "symbol": "%", "healthy": -10, @@ -779,7 +780,7 @@ "comestible_type": "FOOD", "id": "jabberwock_heart", "name": "putrid heart", - "weight": 4535, + "weight": "4535 g", "color": "black_red", "symbol": "%", "healthy": -10, @@ -797,7 +798,7 @@ "comestible_type": "FOOD", "id": "jabberwock_heart_desiccated", "name": "desiccated putrid heart", - "weight": 1360, + "weight": "1360 g", "color": "black_red", "symbol": "%", "healthy": -5, diff --git a/data/json/items/comestibles/dairy.json b/data/json/items/comestibles/dairy.json index 5e0d9c144d4f0..124978adb0080 100644 --- a/data/json/items/comestibles/dairy.json +++ b/data/json/items/comestibles/dairy.json @@ -27,7 +27,7 @@ "id": "milk_evap", "name": "evaporated milk", "name_plural": "evaporated milk", - "weight": 20, + "weight": "20 g", "color": "white", "spoils_in": "1 day", "container": "can_food", @@ -50,7 +50,7 @@ "id": "buttermilk", "name": "buttermilk", "name_plural": "buttermilk", - "weight": 258, + "weight": "258 g", "color": "white", "spoils_in": "2 d", "container": "bottle_plastic", @@ -65,14 +65,13 @@ "volume": "250 ml", "phase": "liquid", "flags": [ "EATEN_COLD" ], - "fun": "0", "vitamins": [ [ "vitA", 1 ], [ "vitC", 1 ], [ "calcium", 1 ] ] }, { "type": "COMESTIBLE", "id": "yoghurt", "name": "yogurt", - "weight": 238, + "weight": "238 g", "color": "magenta", "spoils_in": "20 hours", "container": "cup_plastic", @@ -93,7 +92,7 @@ "id": "butter", "name": "butter", "name_plural": "butter", - "weight": 14.18, + "weight": "14180 mg", "color": "yellow", "spoils_in": "14 days", "comestible_type": "FOOD", @@ -115,7 +114,7 @@ "name": "ghee", "name_plural": "ghee", "copy-from": "butter", - "weight": 13.5, + "weight": "13500 mg", "spoils_in": "90 days", "container": "jar_glass_sealed", "calories": 112, @@ -127,7 +126,7 @@ "type": "COMESTIBLE", "id": "pudding", "name": "pudding", - "weight": 232, + "weight": "232 g", "color": "light_gray", "spoils_in": "7 days 12 hours", "container": "cup_plastic", @@ -146,7 +145,7 @@ "type": "COMESTIBLE", "id": "milk_curdled", "name": "curdled milk", - "weight": 236, + "weight": "236 g", "color": "white", "spoils_in": "28 days", "container": "waterskin", @@ -166,7 +165,7 @@ "id": "cheese_hard", "name": "hard cheese", "name_plural": "hard cheese", - "weight": 34, + "weight": "34 g", "color": "yellow", "spoils_in": "180 days", "stim": 1, @@ -188,7 +187,7 @@ "id": "cheese", "name": "cheese", "name_plural": "cheese", - "weight": 30, + "weight": "30 g", "color": "yellow", "spoils_in": "28 days", "stim": 1, @@ -209,7 +208,7 @@ "type": "COMESTIBLE", "id": "quesadilla_cheese", "name": "quesadilla", - "weight": 116, + "weight": "116 g", "color": "brown", "spoils_in": "20 days", "container": "wrapper", @@ -231,7 +230,7 @@ "id": "milk_powder", "name": "powdered milk", "name_plural": "powdered milk", - "weight": 7, + "weight": "7 g", "color": "white", "container": "bag_plastic", "comestible_type": "FOOD", @@ -254,7 +253,7 @@ "id": "con_milk", "name": "condensed milk", "name_plural": "condensed milk", - "weight": 32, + "weight": "32 g", "color": "white", "spoils_in": "1 day", "container": "can_food", diff --git a/data/json/items/comestibles/drink.json b/data/json/items/comestibles/drink.json index 2c7b01f907c8a..4b2152c33616c 100644 --- a/data/json/items/comestibles/drink.json +++ b/data/json/items/comestibles/drink.json @@ -4,7 +4,7 @@ "id": "apple_cider", "name": "apple cider", "name_plural": "apple cider", - "weight": 263, + "weight": "263 g", "color": "brown", "spoils_in": "6 days", "container": "bottle_plastic", @@ -27,7 +27,7 @@ "type": "COMESTIBLE", "id": "almond_milk", "name": "almond milk", - "weight": 258, + "weight": "258 g", "color": "white", "spoils_in": "3 days", "container": "jug_plastic", @@ -49,7 +49,7 @@ "type": "COMESTIBLE", "id": "soy_milk", "name": "soy milk", - "weight": 258, + "weight": "258 g", "color": "white", "spoils_in": "3 days", "container": "jug_plastic", @@ -105,7 +105,7 @@ "type": "COMESTIBLE", "id": "can_coconut", "name": "coconut milk", - "weight": 238, + "weight": "238 g", "color": "white", "spoils_in": "1 day", "container": "can_food", @@ -126,7 +126,7 @@ "id": "chai_tea", "name": "chai tea", "name_plural": "chai tea", - "weight": 259, + "weight": "259 g", "color": "brown", "spoils_in": "12 hours", "use_action": "CAFF", @@ -164,7 +164,7 @@ "type": "COMESTIBLE", "id": "choc_drink", "name": "chocolate drink", - "weight": 236, + "weight": "236 g", "color": "brown", "container": "can_drink", "comestible_type": "DRINK", @@ -185,7 +185,7 @@ "id": "coffee", "name": "coffee", "name_plural": "coffee", - "weight": 250, + "weight": "250 g", "color": "brown", "addiction_type": "caffeine", "use_action": "CAFF", @@ -209,7 +209,7 @@ "id": "coffee_substitute", "name": "coffee substitute", "name_plural": "coffee substitute", - "weight": 250, + "weight": "250 g", "color": "brown", "container": "bottle_plastic", "comestible_type": "DRINK", @@ -230,7 +230,7 @@ "id": "chicory_coffee", "name": "chicory brew", "name_plural": "chicory brew", - "weight": 252, + "weight": "252 g", "color": "brown", "comestible_type": "DRINK", "symbol": "~", @@ -249,7 +249,7 @@ "type": "COMESTIBLE", "id": "cola", "name": "dark cola", - "weight": 248, + "weight": "248 g", "color": "brown", "addiction_type": "caffeine", "use_action": "CAFF", @@ -274,7 +274,7 @@ "type": "COMESTIBLE", "id": "colamdew", "name": "energy cola", - "weight": 234, + "weight": "234 g", "color": "light_green", "addiction_type": "caffeine", "use_action": "CAFF", @@ -300,7 +300,7 @@ "id": "con_milk", "name": "condensed milk", "name_plural": "condensed milk", - "weight": 32, + "weight": "32 g", "color": "white", "spoils_in": "1 day", "container": "can_food", @@ -322,7 +322,7 @@ "type": "COMESTIBLE", "id": "creamsoda", "name": "cream soda", - "weight": 247, + "weight": "247 g", "color": "light_gray", "addiction_type": "caffeine", "use_action": "CAFF", @@ -347,7 +347,7 @@ "type": "COMESTIBLE", "id": "cranberry_juice", "name": "cranberry juice", - "weight": 250, + "weight": "250 g", "color": "magenta", "spoils_in": "20 d", "container": "bottle_plastic", @@ -371,7 +371,7 @@ "id": "crispycran", "name": "crispy cranberry", "name_plural": "crispy cranberries", - "weight": 250, + "weight": "250 g", "color": "pink", "container": "can_drink", "comestible_type": "DRINK", @@ -393,7 +393,7 @@ "id": "dandelion_tea", "name": "dandelion tea", "name_plural": "dandelion tea", - "weight": 252, + "weight": "252 g", "color": "yellow", "comestible_type": "DRINK", "symbol": "~", @@ -412,7 +412,7 @@ "type": "COMESTIBLE", "id": "eggnog", "name": "eggnog", - "weight": 134, + "weight": "134 g", "color": "white", "spoils_in": "8 hours", "container": "bottle_glass", @@ -434,7 +434,7 @@ "type": "COMESTIBLE", "id": "energy_drink", "name": "energy drink", - "weight": 253, + "weight": "253 g", "color": "magenta", "addiction_type": "caffeine", "use_action": "CAFF", @@ -477,7 +477,7 @@ "id": "herbal_tea", "name": "herbal tea", "name_plural": "herbal tea", - "weight": 250, + "weight": "250 g", "color": "green", "container": "bottle_plastic", "comestible_type": "DRINK", @@ -501,7 +501,7 @@ "name": "hot chocolate", "name_plural": "hot chocolate", "description": "Also known as hot cocoa, this heated chocolate beverage is perfect for a cold winter day.", - "weight": 289, + "weight": "289 g", "volume": "250 ml", "price": 285, "phase": "liquid", @@ -522,7 +522,7 @@ "type": "COMESTIBLE", "id": "juice", "name": "fruit juice", - "weight": 125, + "weight": "125 g", "color": "light_red", "spoils_in": "5 days", "container": "bottle_plastic", @@ -546,7 +546,7 @@ "type": "COMESTIBLE", "id": "kompot", "name": "kompot", - "weight": 250, + "weight": "250 g", "color": "red", "spoils_in": "7 days 12 hours", "container": "jar_3l_glass", @@ -570,7 +570,7 @@ "id": "lemonade", "name": "lemonade", "name_plural": "lemonade", - "weight": 260, + "weight": "260 g", "color": "yellow", "container": "bottle_plastic", "comestible_type": "DRINK", @@ -592,7 +592,7 @@ "type": "COMESTIBLE", "id": "lemonlime", "name": "lemon-lime soda", - "weight": 258, + "weight": "258 g", "color": "yellow", "container": "can_drink", "comestible_type": "DRINK", @@ -616,7 +616,7 @@ "name": "Mexican hot chocolate", "name_plural": "Mexican hot chocolate", "description": "This semi-bitter chocolate drink made from cocoa, cinnamon, and chilies, traces its history to the Maya and Aztecs. Perfect for a cold winter day.", - "weight": 263, + "weight": "263 g", "volume": "250 ml", "price": 335, "phase": "liquid", @@ -637,7 +637,7 @@ "id": "milk", "name": "milk", "name_plural": "milk", - "weight": 258, + "weight": "258 g", "color": "white", "spoils_in": "1 d", "container": "jug_plastic", @@ -668,7 +668,7 @@ "type": "COMESTIBLE", "id": "milk_coffee", "name": "coffee milk", - "weight": 259, + "weight": "259 g", "color": "brown", "addiction_type": "caffeine", "spoils_in": "14 hours", @@ -694,7 +694,7 @@ "type": "COMESTIBLE", "id": "milk_tea", "name": "milk tea", - "weight": 259, + "weight": "259 g", "color": "brown", "spoils_in": "12 hours", "use_action": "CAFF", @@ -719,7 +719,7 @@ "type": "COMESTIBLE", "id": "oj", "name": "orange juice", - "weight": 263, + "weight": "263 g", "color": "yellow", "spoils_in": "5 days", "container": "bottle_plastic", @@ -743,7 +743,7 @@ "type": "COMESTIBLE", "id": "orangesoda", "name": "orange soda", - "weight": 248, + "weight": "248 g", "color": "yellow", "container": "can_drink", "comestible_type": "DRINK", @@ -765,7 +765,7 @@ "id": "pine_tea", "name": "pine needle tea", "name_plural": "pine needle tea", - "weight": 268, + "weight": "268 g", "color": "light_green", "comestible_type": "DRINK", "symbol": "~", @@ -784,7 +784,7 @@ "type": "COMESTIBLE", "id": "purple_drink", "name": "grape drink", - "weight": 260, + "weight": "260 g", "color": "magenta", "stim": 2, "container": "can_drink", @@ -808,7 +808,7 @@ "id": "rootbeer", "name": "root beer", "name_plural": "root beer", - "weight": 260, + "weight": "260 g", "color": "brown", "container": "can_drink", "comestible_type": "DRINK", @@ -829,7 +829,7 @@ "type": "COMESTIBLE", "id": "spezi", "name": "spezi", - "weight": 250, + "weight": "250 g", "color": "brown", "addiction_type": "caffeine", "stim": 4, @@ -853,7 +853,7 @@ "type": "COMESTIBLE", "id": "sports_drink", "name": "sports drink", - "weight": 257, + "weight": "257 g", "color": "light_red", "container": "bottle_plastic", "comestible_type": "DRINK", @@ -874,7 +874,7 @@ "id": "sweet_water", "name": "sweet water", "name_plural": "sweet water", - "weight": 260, + "weight": "260 g", "color": "light_cyan", "container": "bottle_plastic", "comestible_type": "DRINK", @@ -893,7 +893,7 @@ "type": "COMESTIBLE", "id": "tea", "name": "tea", - "weight": 250, + "weight": "250 g", "color": "brown", "use_action": "CAFF", "stim": 3, @@ -914,7 +914,7 @@ "type": "COMESTIBLE", "id": "tea_bark", "name": "bark tea", - "weight": 251, + "weight": "251 g", "color": "brown", "use_action": "ANTIPARASITIC", "container": "bottle_plastic", @@ -933,7 +933,7 @@ "type": "COMESTIBLE", "id": "V8", "name": "V8", - "weight": 250, + "weight": "250 g", "color": "red", "spoils_in": "10 days", "container": "can_drink", diff --git a/data/json/items/comestibles/drink_other.json b/data/json/items/comestibles/drink_other.json index 11d9359303cf5..070fa133a91f3 100644 --- a/data/json/items/comestibles/drink_other.json +++ b/data/json/items/comestibles/drink_other.json @@ -3,7 +3,7 @@ "type": "COMESTIBLE", "id": "sauce_red", "name": "red sauce", - "weight": 32, + "weight": "32 g", "color": "red", "spoils_in": "3 days", "container": "can_food", @@ -31,7 +31,7 @@ "copy-from": "syrup", "description": "A water and sugar solution that has been extracted from a maple tree.", "price": 50, - "weight": 250, + "weight": "250 g", "volume": "250 ml", "charges": 1, "comestible_type": "DRINK", @@ -56,7 +56,7 @@ "description": "A gloppy mix of egg, oil, and salt that is traditionally used to moisten sandwiches.", "price": 187, "material": [ "junk", "egg" ], - "weight": 15, + "weight": "15 g", "volume": "250 ml", "comestible_type": "DRINK", "container": "bottle_plastic", @@ -77,7 +77,7 @@ "description": "A viscous paste of tomato, salt, and vinegar.", "price": 1875, "material": [ "veggy", "junk" ], - "weight": 18, + "weight": "18 g", "volume": "250 ml", "comestible_type": "DRINK", "container": "bottle_plastic", @@ -97,7 +97,7 @@ "description": "A condiment made from the seeds of a mustard plant (/Brassica/ or /Sinapis/), vinegar, salt, and spices.", "price": 50, "material": "junk", - "weight": 5, + "weight": "5 g", "volume": "250 ml", "comestible_type": "DRINK", "container": "bottle_plastic", @@ -117,7 +117,7 @@ "description": "Honey, that stuff bees make. This one is \"forest honey\", a liquid form of honey. This honey won't spoil and is good for your digestion.", "price": 250, "material": "honey", - "weight": 22, + "weight": "22 g", "volume": "250 ml", "comestible_type": "DRINK", "container": "bottle_plastic", @@ -138,7 +138,7 @@ "description": "A brown goo that tastes very little like its namesake. It's not bad, but it'll stick to the roof of your mouth.", "price": 195, "//": "Two tablespoons per charge.", - "weight": 50, + "weight": "50 g", "volume": "250 ml", "comestible_type": "DRINK", "container": "jar_glass_sealed", @@ -164,7 +164,7 @@ "id": "vinegar", "name": "vinegar", "name_plural": "vinegar", - "weight": 15, + "weight": "15 g", "color": "white", "container": "jug_plastic", "comestible_type": "DRINK", @@ -183,7 +183,7 @@ "id": "cooking_oil", "name": "vegetable cooking oil", "name_plural": "vegetable cooking oil", - "weight": 15, + "weight": "15 g", "color": "yellow", "container": "jug_plastic", "comestible_type": "DRINK", @@ -215,7 +215,7 @@ "id": "molasses", "name": "molasses", "name_plural": "molasses", - "weight": 89, + "weight": "89 g", "color": "brown", "stim": 3, "container": "jar_glass", @@ -245,7 +245,7 @@ "description": "A spicy grated root vegetable packed in vinegared brine.", "price": 75, "material": "veggy", - "weight": 6, + "weight": "6 g", "volume": "250 ml", "comestible_type": "FOOD", "container": "jar_glass", @@ -262,7 +262,7 @@ "id": "coffee_syrup", "name": "coffee syrup", "name_plural": "coffee syrup", - "weight": 32, + "weight": "32 g", "color": "brown", "addiction_type": "caffeine", "use_action": "CAFF", diff --git a/data/json/items/comestibles/egg.json b/data/json/items/comestibles/egg.json index f0668c0d2e483..d0f1b7a118bd1 100644 --- a/data/json/items/comestibles/egg.json +++ b/data/json/items/comestibles/egg.json @@ -3,7 +3,7 @@ "type": "COMESTIBLE", "id": "egg_bird", "name": "bird egg", - "weight": 57, + "weight": "57 g", "color": "brown", "spoils_in": "7 days", "comestible_type": "FOOD", @@ -51,7 +51,7 @@ "copy-from": "egg_chicken", "calories": 130, "volume": "83 ml", - "weight": 70, + "weight": "70 g", "vitamins": [ [ "vitA", 15 ], [ "calcium", 5 ], [ "iron", 15 ], [ "vitB", 158 ] ], "rot_spawn": "GROUP_EGG_DUCK" }, @@ -62,7 +62,7 @@ "copy-from": "egg_chicken", "calories": 266, "volume": "125 ml", - "weight": 144, + "weight": "144 g", "vitamins": [ [ "vitA", 30 ], [ "calcium", 9 ], [ "iron", 29 ], [ "vitB", 306 ] ], "rot_spawn": "GROUP_EGG_GOOSE_CANADIAN" }, @@ -72,7 +72,7 @@ "name": "turkey egg", "copy-from": "egg_chicken", "volume": "83 ml", - "weight": 79, + "weight": "79 g", "calories": 135, "vitamins": [ [ "vitA", 15 ], [ "calcium", 8 ], [ "iron", 18 ], [ "vitB", 56 ] ], "rot_spawn": "GROUP_EGG_TURKEY" @@ -95,7 +95,7 @@ "type": "COMESTIBLE", "id": "egg_reptile", "name": "reptile egg", - "weight": 60, + "weight": "60 g", "color": "white", "spoils_in": "28 days", "comestible_type": "FOOD", @@ -187,7 +187,7 @@ "type": "COMESTIBLE", "id": "razorclaw_roe", "name": "razorclaw roe", - "weight": 236, + "weight": "236 g", "color": "red", "spoils_in": "1 day", "comestible_type": "FOOD", @@ -205,7 +205,7 @@ "type": "COMESTIBLE", "id": "egg_fish", "name": "roe", - "weight": 24, + "weight": "24 g", "color": "red", "spoils_in": "1 day", "comestible_type": "FOOD", @@ -226,7 +226,7 @@ "id": "powder_eggs", "name": "powdered egg", "name_plural": "powdered eggs", - "weight": 7, + "weight": "7 g", "color": "yellow", "container": "bottle_plastic_small", "comestible_type": "FOOD", diff --git a/data/json/items/comestibles/frozen.json b/data/json/items/comestibles/frozen.json index 1ceda7a50b132..f58f84cd9a816 100644 --- a/data/json/items/comestibles/frozen.json +++ b/data/json/items/comestibles/frozen.json @@ -6,7 +6,7 @@ "name_plural": "milkshakes", "//": "they bring the boys to the yard", "description": "An all-natural cold beverage made with milk and sweeteners. Tastes great when frozen.", - "weight": 160, + "weight": "160 g", "volume": "250 ml", "container": "styrofoam_cup", "comestible_type": "DRINK", @@ -59,7 +59,7 @@ "name": "ice cream", "name_plural": "ice cream scoops", "description": "A sweet, frozen food made of milk with liberal amounts of sugar.", - "weight": 70, + "weight": "70 g", "volume": "250 ml", "container": "plastic_bucket", "comestible_type": "FOOD", @@ -143,7 +143,7 @@ "description": "Tarter than ice cream, this is made with yogurt and other dairy products, and is generally low-fat compared to ice cream itself.", "calories": 127, "price": 275, - "weight": 80, + "weight": "80 g", "primary_material": "ice_cream", "vitamins": [ [ "vitC", 4 ], [ "calcium", 10 ] ], "material": [ "milk" ] @@ -160,7 +160,7 @@ "quench": 8, "fun": 10, "price": 175, - "weight": 106, + "weight": "106 g", "vitamins": [ ], "material": [ "water", "fruit" ] }, @@ -173,7 +173,7 @@ "description": "Italian-style ice cream. Less airy, and more dense, giving it a richer flavor and texture.", "calories": 148, "price": 300, - "weight": 90, + "weight": "90 g", "primary_material": "ice_cream", "vitamins": [ [ "calcium", 2 ], [ "iron", 2 ] ], "material": [ "milk" ] diff --git a/data/json/items/comestibles/fruit_dishes.json b/data/json/items/comestibles/fruit_dishes.json index b87aac3b4a2d5..51ad0e8a9a5d3 100644 --- a/data/json/items/comestibles/fruit_dishes.json +++ b/data/json/items/comestibles/fruit_dishes.json @@ -22,7 +22,7 @@ "type": "COMESTIBLE", "id": "fruit_leather", "name": "fruit leather", - "weight": 34, + "weight": "34 g", "color": "pink", "spoils_in": "360 days", "container": "bag_plastic", @@ -62,7 +62,7 @@ "id": "can_peach", "name": "peaches in syrup", "name_plural": "peaches in syrup", - "weight": 277, + "weight": "277 g", "color": "yellow", "spoils_in": "1 day 6 hours", "container": "can_food", @@ -81,7 +81,7 @@ "type": "COMESTIBLE", "id": "can_pineapple", "name": "canned pineapple", - "weight": 268, + "weight": "268 g", "color": "yellow", "spoils_in": "1 day", "container": "can_food", @@ -102,7 +102,7 @@ "id": "lemonade_powder", "name": "lemonade drink mix", "name_plural": "servings of lemonade drink mix", - "weight": 19, + "weight": "19 g", "color": "yellow", "container": "bottle_plastic_small", "comestible_type": "FOOD", @@ -123,7 +123,7 @@ "type": "COMESTIBLE", "id": "fruit_cooked", "name": "cooked fruit", - "weight": 150, + "weight": "150 g", "color": "red", "spoils_in": "3 days 18 hours", "container": "jar_3l_glass", @@ -144,7 +144,7 @@ "type": "COMESTIBLE", "id": "jam_fruit", "name": "fruit jam", - "weight": 15, + "weight": "15 g", "color": "red", "spoils_in": "10 days", "container": "jar_3l_glass_sealed", @@ -165,7 +165,7 @@ "id": "dry_fruit", "name": "dehydrated fruit", "name_plural": "dehydrated fruit", - "weight": 75, + "weight": "75 g", "color": "magenta", "spoils_in": "360 days", "comestible_type": "FOOD", @@ -187,7 +187,7 @@ "id": "rehydrated_fruit", "name": "rehydrated fruit", "name_plural": "rehydrated fruit", - "weight": 150, + "weight": "150 g", "color": "pink", "spoils_in": "18 hours", "comestible_type": "FOOD", @@ -205,7 +205,7 @@ "type": "COMESTIBLE", "id": "apple_sugar", "name": "fruit slice", - "weight": 42, + "weight": "42 g", "color": "red", "spoils_in": "7 days 12 hours", "container": "plastic_bag_vac", @@ -227,7 +227,7 @@ "id": "apple_canned", "name": "canned fruit", "name_plural": "canned fruit", - "weight": 170, + "weight": "170 g", "color": "red", "spoils_in": "7 days 12 hours", "container": "can_food", diff --git a/data/json/items/comestibles/irradiated_veggy.json b/data/json/items/comestibles/irradiated_veggy.json index f78bc98a9cb5d..13c0fd8770dab 100644 --- a/data/json/items/comestibles/irradiated_veggy.json +++ b/data/json/items/comestibles/irradiated_veggy.json @@ -108,7 +108,7 @@ "type": "COMESTIBLE", "id": "irradiated_cucumber", "name": "irradiated cucumber", - "weight": 150, + "weight": "150 g", "color": "green", "container": "bag_plastic", "comestible_type": "FOOD", @@ -126,7 +126,7 @@ "type": "COMESTIBLE", "id": "irradiated_celery", "name": "irradiated celery", - "weight": 80, + "weight": "80 g", "color": "light_green", "container": "bag_plastic", "comestible_type": "FOOD", diff --git a/data/json/items/comestibles/junkfood.json b/data/json/items/comestibles/junkfood.json index 3fe3d96a6db73..e33a8c207c703 100644 --- a/data/json/items/comestibles/junkfood.json +++ b/data/json/items/comestibles/junkfood.json @@ -3,7 +3,7 @@ "type": "COMESTIBLE", "id": "toastem", "name": "toast-em", - "weight": 50, + "weight": "50 g", "color": "red", "spoils_in": "90 days", "container": "box_small", @@ -41,7 +41,7 @@ "id": "toasterpastryfrozen", "name": "toaster pastry (uncooked)", "name_plural": "toaster pastries (uncooked)", - "weight": 52, + "weight": "52 g", "color": "red", "spoils_in": "2 days 12 hours", "//": "Semi-arbitrary spoilage of 60 hours, as the cooked product.", @@ -92,7 +92,7 @@ "id": "kernels", "name": "popcorn kernels", "name_plural": "popcorn kernels", - "weight": 85, + "weight": "85 g", "color": "brown", "container": "bag_plastic", "comestible_type": "FOOD", @@ -110,7 +110,7 @@ "id": "popcorn", "name": "popcorn", "name_plural": "popcorn", - "weight": 12, + "weight": "12 g", "color": "white", "spoils_in": "360 days", "container": "bag_plastic", @@ -155,7 +155,7 @@ "id": "pretzels", "name": "pretzels", "name_plural": "pretzels", - "weight": 62, + "weight": "62 g", "color": "brown", "spoils_in": "90 days", "container": "bag_plastic", @@ -176,7 +176,7 @@ "type": "COMESTIBLE", "id": "chocpretzels", "name": "chocolate-covered pretzel", - "weight": 96, + "weight": "96 g", "color": "brown", "spoils_in": "90 days", "container": "bag_plastic", @@ -196,7 +196,7 @@ "type": "COMESTIBLE", "id": "chocolate", "name": "chocolate bar", - "weight": 34, + "weight": "34 g", "color": "brown", "spoils_in": "360 days", "stim": 1, @@ -217,7 +217,7 @@ "id": "marshmallow", "name": "marshmallows", "name_plural": "marshmallows", - "weight": 53, + "weight": "53 g", "color": "white", "spoils_in": "90 days", "container": "bag_plastic", @@ -236,7 +236,7 @@ "id": "smores", "name": "s'mores", "name_plural": "s'mores", - "weight": 180, + "weight": "180 g", "color": "brown", "spoils_in": "90 days", "stim": 8, @@ -257,7 +257,7 @@ "id": "candy", "name": "peanut butter candy", "name_plural": "peanut butter candies", - "weight": 39, + "weight": "39 g", "color": "brown", "spoils_in": "360 days", "stim": 1, @@ -280,7 +280,7 @@ "id": "candy2", "name": "chocolate candy", "name_plural": "chocolate candies", - "weight": 57, + "weight": "57 g", "color": "red", "spoils_in": "360 days", "stim": 2, @@ -303,7 +303,7 @@ "id": "candy3", "name": "chewy candy", "name_plural": "chewy candies", - "weight": 46, + "weight": "46 g", "color": "yellow", "spoils_in": "360 days", "stim": 2, @@ -325,7 +325,7 @@ "id": "powder_candy", "name": "powder candy sticks", "name_plural": "powder candy sticks", - "weight": 46, + "weight": "46 g", "color": "red", "spoils_in": "360 days", "stim": 2, @@ -347,7 +347,7 @@ "id": "maple_candy", "name": "maple syrup candy", "name_plural": "maple syrup candies", - "weight": 18, + "weight": "18 g", "color": "brown", "spoils_in": "360 days", "stim": 1, @@ -369,7 +369,7 @@ "type": "COMESTIBLE", "id": "grahmcrackers", "name": "graham cracker", - "weight": 31, + "weight": "31 g", "color": "brown", "spoils_in": "90 days", "stim": 2, @@ -391,7 +391,7 @@ "type": "COMESTIBLE", "id": "cookies", "name": "cookie", - "weight": 33, + "weight": "33 g", "color": "brown", "spoils_in": "60 days", "container": "box_small", @@ -414,7 +414,7 @@ "id": "syrup", "name": "maple syrup", "name_plural": "maple syrup", - "weight": 21, + "weight": "21 g", "color": "brown", "container": "bottle_glass", "comestible_type": "FOOD", @@ -436,7 +436,7 @@ "id": "beet_syrup", "name": "sugar beet syrup", "name_plural": "sugar beet syrup", - "weight": 15, + "weight": "15 g", "color": "brown", "container": "bottle_glass", "comestible_type": "FOOD", @@ -455,7 +455,7 @@ "type": "COMESTIBLE", "id": "jihelucake", "name": "cake", - "weight": 38, + "weight": "38 g", "color": "white", "comestible_type": "FOOD", "symbol": "%", @@ -490,7 +490,7 @@ "type": "COMESTIBLE", "id": "choco_coffee_beans", "name": "chocolate-covered coffee bean", - "weight": 30, + "weight": "30 g", "color": "brown", "spoils_in": "360 days", "addiction_type": "caffeine", @@ -516,7 +516,7 @@ "id": "fries", "name": "fast-food French fries", "name_plural": "fast-food French fries", - "weight": 71, + "weight": "71 g", "color": "yellow", "container": "box_small", "comestible_type": "FOOD", @@ -547,7 +547,7 @@ "id": "mintpatties", "name": "peppermint patty", "name_plural": "peppermint patties", - "weight": 43, + "weight": "43 g", "color": "brown", "spoils_in": "180 days", "stim": 1, @@ -569,7 +569,7 @@ "id": "neccowafers", "name": "Necco wafers", "name_plural": "Necco wafers", - "weight": 60, + "weight": "60 g", "color": "magenta", "spoils_in": "180 days", "stim": 1, @@ -590,7 +590,7 @@ "type": "COMESTIBLE", "id": "candycigarette", "name": "candy cigarette", - "weight": 18, + "weight": "18 g", "color": "white", "spoils_in": "180 days", "stim": 1, @@ -613,7 +613,7 @@ "id": "sugar_fried", "name": "caramel", "name_plural": "caramel", - "weight": 67, + "weight": "67 g", "color": "white", "stim": 4, "container": "box_small", @@ -635,7 +635,7 @@ "id": "chips", "name": "potato chips", "name_plural": "potato chips", - "weight": 28, + "weight": "28 g", "color": "yellow", "spoils_in": "30 days", "container": "bag_plastic", @@ -656,7 +656,7 @@ "type": "COMESTIBLE", "id": "cereal", "name": "sugary cereal", - "weight": 38, + "weight": "38 g", "color": "yellow", "spoils_in": "90 days", "stim": 4, @@ -677,7 +677,7 @@ "type": "COMESTIBLE", "id": "cereal3", "name": "corn cereal", - "weight": 39, + "weight": "39 g", "color": "yellow", "spoils_in": "90 days", "stim": 4, @@ -699,7 +699,7 @@ "id": "nachos", "name": "tortilla chips", "name_plural": "tortilla chips", - "weight": 80, + "weight": "80 g", "color": "yellow", "spoils_in": "30 days", "container": "bag_plastic", @@ -720,7 +720,7 @@ "id": "nachosc", "name": "nachos with cheese", "name_plural": "nachos with cheese", - "weight": 85, + "weight": "85 g", "color": "yellow", "spoils_in": "1 day", "container": "bag_plastic", @@ -742,7 +742,7 @@ "id": "nachosm", "name": "nachos with meat", "name_plural": "nachos with meat", - "weight": 125, + "weight": "125 g", "color": "yellow", "spoils_in": "1 day", "container": "bag_plastic", @@ -783,7 +783,7 @@ "id": "nachosmc", "name": "nachos with meat and cheese", "name_plural": "nachos with meat and cheese", - "weight": 22, + "weight": "22 g", "color": "yellow", "spoils_in": "20 hours", "container": "bag_plastic", @@ -804,7 +804,7 @@ "type": "COMESTIBLE", "id": "porkstick", "name": "pork stick", - "weight": 56, + "weight": "56 g", "color": "brown", "spoils_in": "24 days", "container": "bag_plastic", @@ -825,7 +825,7 @@ "type": "COMESTIBLE", "id": "junk_burrito", "name": "microwave burrito", - "weight": 142, + "weight": "142 g", "color": "brown", "spoils_in": "2 days 12 hours", "container": "bag_plastic", @@ -846,7 +846,7 @@ "type": "COMESTIBLE", "id": "frozen_dinner", "name": "uncooked TV dinner", - "weight": 453, + "weight": "453 g", "color": "brown", "spoils_in": "2 days 12 hours", "container": "box_small", @@ -866,7 +866,7 @@ "type": "COMESTIBLE", "id": "cooked_dinner", "name": "cooked TV dinner", - "weight": 450, + "weight": "450 g", "color": "brown", "spoils_in": "12 hours", "comestible_type": "FOOD", @@ -887,7 +887,7 @@ "type": "COMESTIBLE", "id": "fchicken", "name": "deep-fried chicken", - "weight": 168, + "weight": "168 g", "color": "red", "spoils_in": "1 day", "container": "box_small", @@ -908,7 +908,7 @@ "id": "chilidogs", "name": "chili dogs", "name_plural": "chili dogs", - "weight": 318, + "weight": "318 g", "color": "red", "spoils_in": "1 day", "container": "wrapper", @@ -939,7 +939,7 @@ "id": "corndogs_frozen", "name": "uncooked corn dogs", "name_plural": "uncooked corn dogs", - "weight": 78, + "weight": "78 g", "color": "yellow", "spoils_in": "11 days 16 hours", "container": "bag_plastic", @@ -973,7 +973,7 @@ "copy-from": "pancakes", "name": "chocolate pancake", "name_plural": "chocolate pancakes", - "weight": 78, + "weight": "78 g", "healthy": 0, "calories": 219, "description": "Fluffy and delicious pancakes with real maple syrup, with delicious chocolate baked right in.", @@ -987,7 +987,7 @@ "type": "COMESTIBLE", "id": "choc_waffles", "name": "chocolate waffle", - "weight": 70, + "weight": "70 g", "color": "brown", "spoils_in": "10 days", "comestible_type": "FOOD", @@ -1006,7 +1006,7 @@ "type": "COMESTIBLE", "id": "can_cheese", "name": "cheese spread", - "weight": 30, + "weight": "30 g", "color": "yellow", "spoils_in": "4 days", "stim": 1, @@ -1029,7 +1029,7 @@ "id": "cheese_fries", "name": "cheese fries", "name_plural": "cheese fries", - "weight": 101, + "weight": "101 g", "color": "yellow", "spoils_in": "3 days", "container": "box_small", @@ -1050,7 +1050,7 @@ "type": "COMESTIBLE", "id": "onion_rings", "name": "onion ring", - "weight": 166, + "weight": "166 g", "color": "brown", "spoils_in": "3 days", "container": "box_small", @@ -1071,7 +1071,7 @@ "id": "hotdogs_frozen", "name": "uncooked hot dog", "name_plural": "uncooked hot dogs", - "weight": 43, + "weight": "43 g", "color": "red", "spoils_in": "11 days 16 hours", "container": "bag_plastic", @@ -1104,7 +1104,7 @@ "id": "hotdogs_cooked", "name": "cooked hot dog", "name_plural": "cooked hot dogs", - "weight": 383, + "weight": "383 g", "color": "red", "spoils_in": "1 day", "container": "wrapper", @@ -1124,7 +1124,7 @@ "type": "COMESTIBLE", "id": "maltballs", "name": "malted milk ball", - "weight": 40, + "weight": "40 g", "color": "brown", "spoils_in": "180 days", "stim": 3, diff --git a/data/json/items/comestibles/meat_dishes.json b/data/json/items/comestibles/meat_dishes.json index 9f774e216eadf..ebff6ac7e8a7c 100644 --- a/data/json/items/comestibles/meat_dishes.json +++ b/data/json/items/comestibles/meat_dishes.json @@ -3,7 +3,7 @@ "type": "COMESTIBLE", "id": "sausage_raw", "name": "raw sausage", - "weight": 148, + "weight": "148 g", "color": "red", "spoils_in": "1 day", "comestible_type": "FOOD", @@ -59,7 +59,7 @@ "id": "sweet_sausage", "name": "sweet sausage", "name_plural": "sweet sausages", - "weight": 148, + "weight": "148 g", "color": "brown", "spoils_in": "2 days", "comestible_type": "FOOD", @@ -78,7 +78,7 @@ "id": "bratwurst_sausage", "name": "bratwurst", "name_plural": "bratwursts", - "weight": 100, + "weight": "100 g", "color": "brown", "spoils_in": "2 days", "comestible_type": "FOOD", @@ -97,7 +97,7 @@ "type": "COMESTIBLE", "id": "royal_beef", "name": "royal beef", - "weight": 446, + "weight": "446 g", "color": "white", "spoils_in": "3 days 8 hours", "use_action": "ROYAL_JELLY", @@ -117,7 +117,7 @@ "id": "bacon", "name": "bacon", "name_plural": "pieces of bacon", - "weight": 85, + "weight": "85 g", "color": "pink", "spoils_in": "24 days", "container": "bag_plastic", @@ -164,7 +164,7 @@ "id": "cracklins", "name": "cracklins", "name_plural": "cracklins", - "weight": 42, + "weight": "42 g", "color": "brown", "spoils_in": "7 days", "container": "bag_plastic", @@ -185,7 +185,7 @@ "type": "COMESTIBLE", "id": "glazed_tenderloin", "name": "glazed tenderloins", - "weight": 205, + "weight": "205 g", "color": "brown", "spoils_in": "2 days 8 hours", "comestible_type": "FOOD", @@ -207,7 +207,7 @@ "type": "COMESTIBLE", "id": "currywurst", "name": "currywurst", - "weight": 85, + "weight": "85 g", "color": "red", "spoils_in": "2 days", "container": "wrapper", @@ -228,7 +228,7 @@ "type": "COMESTIBLE", "id": "meat_aspic", "name": "aspic", - "weight": 154, + "weight": "154 g", "color": "red", "spoils_in": "3 days 8 hours", "comestible_type": "FOOD", @@ -249,7 +249,7 @@ "name_plural": "dehydrated fish", "copy-from": "fish_cooked", "primary_material": "cured_meat", - "weight": 85, + "weight": "85 g", "color": "light_gray", "spoils_in": "360 days", "quench": -3, @@ -303,7 +303,7 @@ "id": "fish_fried", "name": "batter fried fish", "name_plural": "batter fried fish", - "weight": 201, + "weight": "201 g", "color": "yellow", "spoils_in": "1 day", "container": "box_small", @@ -322,7 +322,7 @@ "type": "COMESTIBLE", "id": "lunchmeat", "name": "lunch meat", - "weight": 56, + "weight": "56 g", "color": "red", "spoils_in": "2 days 12 hours", "container": "bag_plastic", @@ -341,7 +341,7 @@ "type": "COMESTIBLE", "id": "bologna", "name": "bologna", - "weight": 56, + "weight": "56 g", "//": "Rebalanced: the recipe looks to easily make two pounds.", "color": "red", "spoils_in": "23 days 8 hours", @@ -361,7 +361,7 @@ "type": "COMESTIBLE", "id": "lutefisk", "name": "lutefisk", - "weight": 175, + "weight": "175 g", "color": "light_gray", "spoils_in": "360 days", "container": "bag_plastic", @@ -383,7 +383,7 @@ "type": "COMESTIBLE", "id": "can_spam", "name": "SPAM", - "weight": 84, + "weight": "84 g", "color": "pink", "spoils_in": "1 day", "container": "can_food", @@ -404,7 +404,7 @@ "type": "COMESTIBLE", "id": "can_sardine", "name": "canned sardine", - "weight": 200, + "weight": "200 g", "color": "light_gray", "spoils_in": "1 day", "container": "can_food", @@ -425,7 +425,7 @@ "id": "sausagegravy", "name": "sausage gravy", "name_plural": "sausage gravies", - "weight": 60, + "weight": "60 g", "color": "light_gray", "spoils_in": "2 days", "//": "Semi-arbitrary spoilage of 48 hours set: pretty confident sausage gravy goes bad.", @@ -444,7 +444,7 @@ "type": "COMESTIBLE", "id": "pemmican", "name": "pemmican", - "weight": 106, + "weight": "106 g", "color": "brown", "spoils_in": "360 days", "container": "bag_plastic", @@ -463,7 +463,7 @@ "type": "COMESTIBLE", "id": "macaroni_helper", "name": "hamburger helper", - "weight": 170, + "weight": "170 g", "color": "red", "spoils_in": "1 day", "container": "box_small", @@ -484,7 +484,7 @@ "type": "COMESTIBLE", "id": "ravioli", "name": "ravioli", - "weight": 170, + "weight": "170 g", "color": "light_red", "spoils_in": "2 days", "container": "can_food", @@ -503,7 +503,7 @@ "id": "chili", "name": "chili con carne", "name_plural": "chilis con carne", - "weight": 253, + "weight": "253 g", "color": "red", "spoils_in": "1 day", "container": "can_food", @@ -524,7 +524,7 @@ "id": "pork_beans", "name": "pork and beans", "name_plural": "pork and beans", - "weight": 267, + "weight": "267 g", "color": "brown", "spoils_in": "1 day 12 hours", "container": "can_food", @@ -545,7 +545,7 @@ "id": "can_tuna", "name": "canned tuna fish", "name_plural": "canned tuna fish", - "weight": 154, + "weight": "154 g", "color": "light_gray", "spoils_in": "1 day", "container": "can_food", @@ -563,7 +563,7 @@ "type": "COMESTIBLE", "id": "can_salmon", "name": "canned salmon", - "weight": 200, + "weight": "200 g", "color": "pink", "spoils_in": "1 day", "container": "can_food", @@ -581,7 +581,7 @@ "type": "COMESTIBLE", "id": "can_chicken", "name": "canned chicken", - "weight": 54, + "weight": "54 g", "color": "pink", "spoils_in": "1 day", "container": "can_food", @@ -600,7 +600,7 @@ "type": "COMESTIBLE", "id": "can_herring", "name": "pickled herring", - "weight": 232, + "weight": "232 g", "color": "white", "spoils_in": "4 days", "container": "can_food", @@ -620,7 +620,7 @@ "id": "can_clams", "name": "canned clam", "name_plural": "canned clams", - "weight": 169, + "weight": "169 g", "color": "light_gray", "spoils_in": "1 day", "container": "can_food", @@ -639,7 +639,7 @@ "type": "COMESTIBLE", "id": "can_chowder", "name": "clam chowder", - "weight": 253, + "weight": "253 g", "color": "white", "spoils_in": "1 day", "container": "can_food", @@ -660,7 +660,7 @@ "id": "deluxe_beans", "name": "baked beans", "name_plural": "baked beans", - "weight": 293, + "weight": "293 g", "color": "brown", "spoils_in": "15 days", "comestible_type": "FOOD", @@ -681,7 +681,7 @@ "id": "deluxe_rice", "name": "meat fried rice", "name_plural": "meat fried rice", - "weight": 187, + "weight": "187 g", "color": "yellow", "spoils_in": "15 days", "comestible_type": "FOOD", @@ -702,7 +702,7 @@ "id": "deluxe_beansnrice", "name": "deluxe beans and rice", "name_plural": "deluxe beans and rice", - "weight": 312, + "weight": "312 g", "color": "brown", "spoils_in": "15 days", "comestible_type": "FOOD", @@ -722,7 +722,7 @@ "type": "COMESTIBLE", "id": "pie_meat", "name": "meat pie", - "weight": 189, + "weight": "189 g", "color": "brown", "spoils_in": "3 days 8 hours", "container": "box_small", @@ -744,7 +744,7 @@ "type": "COMESTIBLE", "id": "pizza_meat", "name": "meat pizza", - "weight": 230, + "weight": "230 g", "color": "light_red", "spoils_in": "2 days", "container": "box_small", @@ -765,7 +765,7 @@ "id": "deluxe_eggs", "name": "deluxe scrambled eggs", "name_plural": "deluxe scrambled eggs", - "weight": 198, + "weight": "198 g", "color": "yellow", "spoils_in": "2 days", "comestible_type": "FOOD", @@ -814,7 +814,7 @@ "id": "spaghetti_bolognese", "name": "spaghetti bolognese", "name_plural": "spaghetti bolognese", - "weight": 150, + "weight": "150 g", "color": "red", "spoils_in": "2 days", "comestible_type": "FOOD", @@ -834,7 +834,7 @@ "type": "COMESTIBLE", "id": "lasagne", "name": "lasagne", - "weight": 255, + "weight": "255 g", "color": "red", "spoils_in": 64, "comestible_type": "FOOD", @@ -869,7 +869,7 @@ "type": "COMESTIBLE", "id": "cheeseburger", "name": "cheeseburger", - "weight": 133, + "weight": "133 g", "color": "brown", "spoils_in": "1 day 12 hours", "stim": 1, @@ -890,7 +890,7 @@ "type": "COMESTIBLE", "id": "hamburger", "name": "hamburger", - "weight": 99, + "weight": "99 g", "color": "brown", "spoils_in": "1 day 12 hours", "stim": 1, @@ -910,7 +910,7 @@ "type": "COMESTIBLE", "id": "sloppyjoe", "name": "sloppy joe", - "weight": 113, + "weight": "113 g", "color": "brown", "spoils_in": "1 day 12 hours", "stim": 1, @@ -930,7 +930,7 @@ "type": "COMESTIBLE", "id": "taco", "name": "taco", - "weight": 102, + "weight": "102 g", "color": "yellow", "spoils_in": "1 day", "container": "wrapper", @@ -963,7 +963,7 @@ "id": "dry_meat", "name": "dehydrated meat", "copy-from": "meat_cooked", - "weight": 85, + "weight": "85 g", "color": "red", "spoils_in": "360 days", "quench": -3, @@ -989,8 +989,8 @@ "id": "haggis", "name": "haggis", "name_plural": "haggii", - "//": "Yes, that is the correct plural form.", - "weight": 156, + "//": "That's whisky without an 'e' because we're talking about Scotch whisky.", + "weight": "156 g", "color": "brown", "spoils_in": "15 days", "comestible_type": "FOOD", @@ -999,7 +999,6 @@ "healthy": 1, "calories": 441, "description": "This traditional Scottish savory pudding is made of meat and offal mixed with oatmeal, which is sewn into an animal's stomach and boiled. Surprisingly tasty and quite filling, it is best served with boiled root vegetables and strong whisky.", - "//": "That's whisky without an 'e' because we're talking about Scotch whisky.", "price": 750, "material": [ "wheat", "flesh" ], "volume": "250 ml", @@ -1012,7 +1011,7 @@ "id": "sushi_fishroll", "name": "fish makizushi", "name_plural": "fish makizushi", - "weight": 159, + "weight": "159 g", "color": "green", "spoils_in": "12 hours", "comestible_type": "FOOD", @@ -1032,7 +1031,7 @@ "id": "sushi_meatroll", "name": "meat temaki", "name_plural": "meat temaki", - "weight": 273, + "weight": "273 g", "color": "green", "spoils_in": "1 day", "comestible_type": "FOOD", @@ -1066,7 +1065,7 @@ "id": "dry_meat_tainted", "name": "dehydrated tainted meat", "copy-from": "meat_tainted", - "weight": 85, + "weight": "85 g", "color": "red", "spoils_in": "360 days", "use_action": "POISON", @@ -1082,7 +1081,7 @@ "type": "COMESTIBLE", "id": "pelmeni", "name": "pelmeni", - "weight": 151, + "weight": "151 g", "color": "light_red", "spoils_in": "2 days", "container": "can_food", @@ -1102,7 +1101,7 @@ "type": "COMESTIBLE", "id": "homemade_burrito", "name": "homemade burrito", - "weight": 142, + "weight": "142 g", "color": "brown", "spoils_in": "1 days 4 hours", "comestible_type": "FOOD", diff --git a/data/json/items/comestibles/med.json b/data/json/items/comestibles/med.json index da546a1eac5c3..c7be0e8408f55 100644 --- a/data/json/items/comestibles/med.json +++ b/data/json/items/comestibles/med.json @@ -5,7 +5,7 @@ "category": "drugs", "name": "first aid kit", "description": "A full medical kit, with bandages, local anesthetics, and rapid healing agents. Used for healing large amounts of damage. Disassemble to get its content.", - "weight": 1750, + "weight": "1750 g", "volume": "1250 ml", "price": 3000, "material": "plastic", @@ -21,7 +21,7 @@ "name": "Adderall", "name_plural": "Adderall", "description": "Medical grade amphetamine salts mixed with Dextroamphetamine salts, commonly prescribed to treat hyperactive attention deficits. It suppresses the appetite, and is quite addictive.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 14500, "charges": 10, @@ -41,7 +41,7 @@ "name": "syringe of adrenaline", "name_plural": "syringes of adrenaline", "description": "A syringe filled with a shot of adrenaline. It serves as a powerful stimulant when you inject yourself with it. Asthmatics can use it in an emergency to clear their asthma.", - "weight": 12, + "weight": "12 g", "volume": "10ml", "price": 3400, "material": "plastic", @@ -57,7 +57,7 @@ "name": "antibiotics", "name_plural": "antibiotics", "description": "A prescription-strength antibacterial medication designed to prevent or stop the spread of infection. It's the quickest and most reliable way to cure any infections you might have. One dose lasts twelve hours.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 9000, "charges": 15, @@ -73,7 +73,7 @@ "comestible_type": "MED", "name": "antifungal drug", "description": "Powerful chemical tablets designed to eliminate fungal infections in living creatures.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 1000, "charges": 5, @@ -90,7 +90,7 @@ "comestible_type": "MED", "name": "antiparasitic drug", "description": "Broad spectrum chemical tablets designed to eliminate parasitic infestations in living creatures. Though designed for use on pets and livestock, it will likely work on humans as well.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 3200, "charges": 5, @@ -108,7 +108,7 @@ "comestible_type": "MED", "name": "aspirin", "description": "Acetylsalicylic acid, a mild anti-inflammatory. Take to relieve pain and swelling.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 500, "charges": 20, @@ -129,7 +129,7 @@ "comestible_type": "MED", "name": "bandage", "description": "Simple cloth bandages. Used for healing small amounts of damage.", - "weight": 70, + "weight": "70 g", "volume": "250 ml", "price": 600, "material": "cotton", @@ -174,7 +174,7 @@ "name": "antiseptic powder", "name_plural": "antiseptic powder", "description": "A powdered form of chemical antiseptic, this bismuth formic iodide cleans wounds quickly and painlessly.", - "weight": 6, + "weight": "6 g", "volume": "250 ml", "price": 900, "charges": 4, @@ -193,7 +193,7 @@ "name": "caffeinated chewing gum", "description": "Chewing gum with added caffeine. Sugary and bad for your teeth, but it's a nice pick-me-up.", "category": "drugs", - "weight": 3, + "weight": "3 g", "volume": "250 ml", "price": 140, "charges": 10, @@ -212,7 +212,7 @@ "comestible_type": "MED", "name": "caffeine pill", "description": "No-doz brand caffeine pills, maximum strength. Useful in pulling an all-nighter, one pill is about equivalent to a strong cup of coffee.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 1000, "charges": 10, @@ -231,7 +231,7 @@ "comestible_type": "MED", "name": "chewing tobacco", "description": "Mint flavored chewing tobacco. While still absolutely terrible for your health, it was once a favorite amongst baseball players, cowboys, and other macho types.", - "weight": 4, + "weight": "4 g", "volume": "250 ml", "price": 2000, "charges": 20, @@ -255,7 +255,7 @@ "name": "hydrogen peroxide", "name_plural": "hydrogen peroxide", "description": "Dilute hydrogen peroxide, for use as an antiseptic and for bleaching hair or textiles. Foams a little when in contact with organic matter, but otherwise harmless.", - "weight": 28, + "weight": "28 g", "volume": "250 ml", "price": 100, "charges": 10, @@ -272,7 +272,7 @@ "comestible_type": "MED", "name": "cigarette", "description": "A mixture of dried tobacco leaf, pesticides, and chemical additives, rolled into a filtered paper tube. Stimulates mental acuity and reduces appetite. Highly addictive and hazardous to health.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 800, "charges": 20, @@ -294,7 +294,7 @@ "comestible_type": "MED", "name": "cigar", "description": "Rolled, cured tobacco leaf, addictive and hazardous to health.\nA gentleman's vice, cigars set the civil man apart from the savage.", - "weight": 3, + "weight": "3 g", "volume": "250 ml", "price": 1000, "charges": 5, @@ -314,7 +314,7 @@ "comestible_type": "MED", "name": "chloroform soaked rag", "description": "A debug item that lets you put NPCs (or yourself) to sleep.", - "weight": 240, + "weight": "240 g", "volume": "250 ml", "price": 3000, "material": "cotton", @@ -330,7 +330,7 @@ "name": "codeine", "name_plural": "codeine", "description": "A mild opiate used in the suppression of pain, cough, and other ailments. While relatively weak for a narcotic, it is still addictive, with a potential for overdose.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 1200, "charges": 10, @@ -354,7 +354,7 @@ "name": "cocaine", "name_plural": "cocaine", "description": "Crystalline extract of the coca leaf, or at least, a white powder with some of that in it. A topical analgesic, it is more commonly used for its stimulatory properties. Highly addictive.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 10000, "charges": 8, @@ -376,7 +376,7 @@ "id": "cola_meth", "name": "methacola", "category": "drugs", - "weight": 61, + "weight": "61 g", "color": "brown", "addiction_type": "amphetamine", "use_action": "CAFF", @@ -404,7 +404,7 @@ "name": "pair of contact lenses", "name_plural": "pairs of contact lenses", "description": "A pair of extended wear contacts with soft lenses designed to be discarded after a week of use. They are a great replacement to wearing glasses and sit comfortably on the surface of the eye.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 2600, "charges": 6, @@ -423,7 +423,7 @@ "name_plural": "cotton balls", "description": "Fluffy balls of clean white cotton. Can serve as makeshift bandages in an emergency.", "category": "spare_parts", - "weight": 22, + "weight": "22 g", "volume": "250 ml", "price": 500, "charges": 2, @@ -441,7 +441,7 @@ "name": "crack", "name_plural": "crack", "description": "Deprotonated cocaine crystals, incredibly addictive and deleterious to brain chemistry.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 72000, "charges": 4, @@ -473,7 +473,7 @@ "name": "non-drowsy cough syrup", "name_plural": "non-drowsy cough syrup", "description": "Daytime cold and flu medication. Non-drowsy formula. Will suppress coughing, aching, headaches and runny noses, but you'll still need lots of fluids and rest.", - "weight": 48, + "weight": "48 g", "volume": "250 ml", "price": 800, "charges": 5, @@ -490,7 +490,7 @@ "comestible_type": "MED", "name": "antiseptic", "description": "A powerful antiseptic commonly used for contaminated wounds.", - "weight": 27, + "weight": "27 g", "volume": "250 ml", "price": 1500, "charges": 10, @@ -517,7 +517,7 @@ "name": "diazepam", "name_plural": "diazepam", "description": "A strong benzodiazepine drug used to treat muscle spasms, anxiety, seizures, and panic attacks.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 15000, "charges": 10, @@ -537,7 +537,7 @@ "comestible_type": "MED", "name": "electronic cigarette", "description": "This battery-operated device vaporizes a liquid that contains flavorings and nicotine. A less harmful alternative to traditional cigarettes, but it's still addictive. It can't be reused once it's empty.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 3000, "charges": 40, @@ -559,7 +559,7 @@ "name_plural": "saline eye drops", "description": "Sterile saline eye drops. Can be used to treat dry eyes, or to wash out contaminants.", "volume": "10ml", - "weight": 3, + "weight": "3 g", "price": 300, "charges": 10, "symbol": "!", @@ -573,7 +573,7 @@ "comestible_type": "MED", "name": "flu shot", "description": "Pharmaceutical flu shot designed for mass vaccinations, still in the packaging. Purported to provide immunity to influenza.", - "weight": 12, + "weight": "12 g", "volume": "10ml", "price": 5000, "material": "plastic", @@ -590,7 +590,7 @@ "name_plural": "chewing gum", "description": "Bright pink chewing gum. Sugary, sweet, and bad for your teeth.", "category": "food", - "weight": 3, + "weight": "3 g", "volume": "250 ml", "price": 100, "charges": 10, @@ -609,7 +609,7 @@ "comestible_type": "MED", "name": "hand-rolled cigarette", "description": "A roll-your-own made from tobacco and rolling paper. Stimulates mental acuity and reduces appetite. Despite being hand crafted, it's still highly addictive and hazardous to health.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 90, "//": "Tougher to market a hand rolled, could be anything in there.", @@ -631,7 +631,7 @@ "name": "heroin", "name_plural": "heroin", "description": "An extremely strong opioid narcotic derived from morphine. Incredibly addictive, the risk of overdose is extreme, and the drug is contraindicated for nearly all medical purposes.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 14000, "charges": 4, @@ -663,7 +663,7 @@ "comestible_type": "MED", "name": "potassium iodide tablet", "description": "Potassium iodide tablets. If taken prior to exposure, they help to mitigate injury caused by radiation absorption.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 1000, "charges": 10, @@ -682,7 +682,7 @@ "comestible_type": "MED", "name": "joint", "description": "Marijuana, cannabis, pot. Whatever you want to call it, it's rolled up in a piece of paper and ready for smokin'.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 500, "stack_size": 100, @@ -702,7 +702,7 @@ "comestible_type": "MED", "name": "pink tab", "description": "Tiny pink tabs resembling postage stamps, already dosed with some sort of drug. Really only useful for entertainment. Will cause hallucinations.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 10000, "charges": 5, @@ -724,7 +724,7 @@ "comestible_type": "MED", "name": "medical gauze", "description": "This is decent sized piece of cotton, sterilized and sealed. It's designed for medical purposes.", - "weight": 90, + "weight": "90 g", "price": 350, "material": "cotton", "symbol": ",", @@ -739,7 +739,7 @@ "name": "low-grade methamphetamine", "name_plural": "low-grade methamphetamine", "description": "A profoundly addictive and powerful stimulant. While extremely effective at enhancing alertness, it is hazardous to health and the risk of an adverse reaction is great.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 15000, "charges": 6, @@ -763,7 +763,7 @@ "comestible_type": "MED", "name": "morphine", "description": "A very strong semi-synthetic narcotic used to treat intense pain in hospital settings. This injectable drug is very addictive.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 4000, "charges": 4, @@ -790,7 +790,7 @@ "comestible_type": "MED", "name": "mugwort oil", "description": "Some essential oil made from mugwort, which may kill parasites when ingested. Consume it with water!", - "weight": 40, + "weight": "40 g", "volume": "250 ml", "price": 0, "material": "oil", @@ -809,7 +809,7 @@ "comestible_type": "MED", "name": "nicotine gum", "description": "Mint flavored nicotine chewing gum. For smokers who desire to quit.", - "weight": 4, + "weight": "4 g", "volume": "250 ml", "price": 1000, "charges": 10, @@ -829,7 +829,7 @@ "name": "cough syrup", "name_plural": "cough syrup", "description": "Nighttime cold and flu medication. Useful when trying to sleep with a head full of virions. Will cause drowsiness.", - "weight": 48, + "weight": "48 g", "volume": "250 ml", "price": 800, "charges": 5, @@ -848,7 +848,7 @@ "comestible_type": "MED", "name": "oxycodone", "description": "A strong semi-synthetic narcotic used in the treatment of intense pain. Highly addictive.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 55000, "//": "Fairly controlled substance as they go.", @@ -873,7 +873,7 @@ "comestible_type": "MED", "name": "Ambien", "description": "A habit-forming tranquilizer with a variety of psychoactive side effects. Used in the treatment of insomnia. Its generic name is zolpidem tartrate.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 3000, "charges": 10, @@ -893,7 +893,7 @@ "comestible_type": "MED", "name": "poppy painkiller", "description": "Potent opioid palliative produced by the refining of the mutated poppy. Notably devoid of euphoric or sedative effects, as an opiate it may still be addictive.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 3000, "charges": 10, @@ -916,7 +916,7 @@ "comestible_type": "MED", "name": "poppy sleep", "description": "A potent sleep aid extracted from mutated poppy seeds. Effective, but as an opiate, it may be addictive.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 2000, "charges": 10, @@ -935,7 +935,7 @@ "name": "poppy cough syrup", "name_plural": "poppy cough syrup", "description": "Cough syrup made from mutated poppy. Will make you sleepy.", - "weight": 48, + "weight": "48 g", "volume": "250 ml", "price": 2500, "charges": 5, @@ -955,7 +955,7 @@ "comestible_type": "MED", "name": "Prozac", "description": "A common and popular antidepressant. It will elevate mood, and can profoundly affect the action of other drugs. It is only rarely habit-forming, though adverse reactions are not uncommon. Its generic name is fluoxetine.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 9000, "//": "Don't have a cite for this one.", @@ -974,7 +974,7 @@ "comestible_type": "MED", "name": "Prussian blue tablet", "description": "Tablets containing oxidized ferrous ferrocyanide salts. Capable of purging nuclear contaminants from the body if taken after radiation exposure.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 3000, "charges": 10, @@ -996,7 +996,7 @@ "name": "hemostatic powder", "name_plural": "hemostatic powder", "description": "A powdered antihemorrhagic compound that reacts with blood to immediately form a gel-like substance that stops bleeding.", - "weight": 5, + "weight": "5 g", "volume": "250 ml", "price": 550, "charges": 6, @@ -1014,7 +1014,7 @@ "comestible_type": "MED", "name": "saline solution", "description": "A solution of sterilized water and salt for intravenous infusion or washing contaminants from one's eyes.", - "weight": 51, + "weight": "51 g", "volume": "250 ml", "price": 500, "charges": 5, @@ -1031,7 +1031,7 @@ "comestible_type": "MED", "name": "Thorazine", "description": "Anti-psychotic medication. Used to stabilize brain chemistry, it can arrest hallucinations and other symptoms of psychosis. Carries a sedative effect. Its generic name is chlorpromazine.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 5000, "charges": 10, @@ -1047,7 +1047,7 @@ "comestible_type": "MED", "name": "thyme oil", "description": "Some essential oil made from thyme, which can act as a mildly irritating antiseptic.", - "weight": 40, + "weight": "40 g", "volume": "250 ml", "price": 0, "material": "oil", @@ -1064,7 +1064,7 @@ "comestible_type": "MED", "name": "rolling tobacco", "description": "Loose, fine-cut tobacco leaves. Popular in Europe and among hipsters. Highly addictive and hazardous to health.\nCan either be rolled into a cigarette with some rolling papers or smoked through a pipe.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 1100, "charges": 20, @@ -1095,7 +1095,7 @@ "comestible_type": "MED", "name": "tramadol", "description": "A painkiller used to manage moderate pain. The effects last for several hours, but are relatively subdued for an opioid.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 24500, "charges": 10, @@ -1117,7 +1117,7 @@ "comestible_type": "MED", "name": "gamma globulin shot", "description": "This immunoglobulin booster contains concentrated antibodies prepared for intravenous injection to temporarily strengthen the immune system. It is still in its original packaging.", - "weight": 12, + "weight": "12 g", "volume": "10ml", "price": 5000, "material": "plastic", @@ -1132,7 +1132,7 @@ "comestible_type": "MED", "name": "multivitamin", "description": "Essential dietary nutrients conveniently packaged in pill form. An option of last resort when a balanced diet is not possible. Excess use can cause hypervitaminosis.", - "weight": 1, + "weight": "1 g", "volume": "100 ml", "price": 500, "price_postapoc": 5000, @@ -1152,7 +1152,7 @@ "comestible_type": "MED", "name": "calcium tablet", "description": "White calcium tablets. Widely used by elderly people with osteoporosis as a method to supplement calcium before the apocalypse.", - "weight": 1, + "weight": "1 g", "volume": "100 ml", "price": 400, "price_postapoc": 4000, @@ -1168,7 +1168,7 @@ "comestible_type": "MED", "name": "bone meal tablet", "description": "Homemade calcium supplement made out of bone meal. Tastes horrible and is hard to swallow but it does its job.", - "weight": 2, + "weight": "2 g", "volume": "500 ml", "price": 10, "fun": -8, @@ -1187,7 +1187,7 @@ "comestible_type": "MED", "name": "flavored bone meal tablet", "description": "Homemade calcium supplement made out of bone meal. Due to some sweetness mixed in to counteract the powdery texture and the taste of ash, it's almost as palatable as the pre-cataclysm tablets.", - "weight": 2, + "weight": "2 g", "volume": "500 ml", "price": 300, "fun": -2, @@ -1216,7 +1216,7 @@ "comestible_type": "MED", "name": "injectable vitamin B", "description": "Small vials of pale yellow liquid containing soluble vitamin B for injection.", - "weight": 40, + "weight": "40 g", "volume": "250 ml", "price": 150, "price_postapoc": 1500, @@ -1238,7 +1238,7 @@ "comestible_type": "MED", "name": "injectable iron", "description": "Small vials of dark yellow liquid containing soluble iron for injection.", - "weight": 40, + "weight": "40 g", "volume": "250 ml", "price": 2000, "price_postapoc": 2500, @@ -1261,7 +1261,7 @@ "name": "marijuana", "name_plural": "marijuana", "description": "The dried flower buds and leaves harvested from a psychoactive variety of hemp plant. Used to reduce nausea, stimulate appetite and elevate mood. It can be habit-forming, and adverse reactions are possible.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 2500, "charges": 5, @@ -1292,7 +1292,7 @@ "name": "Xanax", "name_plural": "Xanax", "description": "Anti-anxiety agent with a powerful sedative effect. May cause dissociation and loss of memory. It is dangerously addictive, and withdrawal from regular use should be gradual. Its generic name is alprazolam.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 6000, "//": "Yeah, kinda guessing at these ones, but generic is cheaper.", @@ -1314,7 +1314,7 @@ "name": "antiseptic soaked rag", "name_plural": "antiseptic soaked rags", "description": "A rag soaked in antiseptic. Useful for light wounds, probaby won't help with deep bites.", - "weight": 80, + "weight": "80 g", "//": "Can't copy-from rag, it breaks the stacking for some reason!", "volume": "250 ml", "price": 250, @@ -1337,7 +1337,7 @@ "name": "antiseptic soaked cotton balls", "name_plural": "antiseptic soaked cotton balls", "description": "Fluffy balls of clean white cotton. Now soaked with antiseptic, they are somewhat useful to disinfect a wound.", - "weight": 25, + "weight": "25 g", "//": "Can't copy-from cotton_ball, breaks volume", "volume": "125 ml", "price": 250, @@ -1361,7 +1361,7 @@ "name": "Atreyupan", "name_plural": "Atreyupan", "description": "A broad-spectrum antibiotic used to suppress infections and prevent them from setting in. It isn't strong enough to purge infections outright, but it boosts the body's resistance against them. One dose lasts twelve hours.", - "weight": 15, + "weight": "15 g", "volume": "250 ml", "price": 1500, "charges": 5, @@ -1379,7 +1379,7 @@ "comestible_type": "MED", "name": "heartburn medicine", "description": "Creamy pink heartburn syrup that soothes upset stomachs and quells vomitous urges; with a twist off cap that doubles as a dosage cup.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 1000, "container": "bottle_plastic_small", @@ -1401,7 +1401,7 @@ "name": "Panaceus", "name_plural": "Panaceii", "description": "An apple-red gel capsule the size of your thumbnail, filled with a thick oily liquid that shifts from black to purple at unpredictable intervals, flecked with tiny gray dots. Given the place you got it from, it's either very potent, or highly experimental. Holding it, all the little aches and pains seem to fade, just for a moment...", - "weight": 15, + "weight": "15 g", "volume": "5 ml", "price": 1000000, "stack_size": 5, @@ -1420,7 +1420,7 @@ "name_plural": "cattail jellies", "description": "Clear jelly harvested from cattail, has antiseptic properties and works as a painkiller.", "container": "bottle_plastic_small", - "weight": 50, + "weight": "50 g", "volume": "250 ml", "charges": 7, "price": 50, diff --git a/data/json/items/comestibles/mre.json b/data/json/items/comestibles/mre.json index 18fa410572140..8326c0a6c5d73 100644 --- a/data/json/items/comestibles/mre.json +++ b/data/json/items/comestibles/mre.json @@ -8,7 +8,7 @@ "category": "food", "description": "A generic MRE box, you shouldn't see this.", "price": 1500, - "weight": 900, + "weight": "900 g", "volume": "750 ml", "material": [ "plastic" ], "looks_like": "mre_beef_box", @@ -23,7 +23,7 @@ "category": "food", "description": "A generic small MRE box, you shouldn't see this", "price": 500, - "weight": 300, + "weight": "300 g", "volume": "250 ml", "material": [ "plastic" ], "looks_like": "mre_beef_box", @@ -33,7 +33,7 @@ "abstract": "mre_entree", "type": "COMESTIBLE", "name": "MRE entree", - "weight": 125, + "weight": "125 g", "color": "brown", "spoils_in": "3 days 8 hours", "comestible_type": "FOOD", diff --git a/data/json/items/comestibles/mushroom.json b/data/json/items/comestibles/mushroom.json index a3a8a47048cb2..55b8c77c7a1f0 100644 --- a/data/json/items/comestibles/mushroom.json +++ b/data/json/items/comestibles/mushroom.json @@ -15,7 +15,7 @@ "type": "COMESTIBLE", "id": "mushroom_morel", "name": "morel mushroom", - "weight": 78, + "weight": "78 g", "color": "brown", "spoils_in": "2 days", "use_action": "POISON", @@ -62,7 +62,7 @@ "type": "COMESTIBLE", "id": "dry_mushroom", "name": "dried mushroom", - "weight": 7, + "weight": "7 g", "color": "brown", "spoils_in": "360 days", "comestible_type": "FOOD", @@ -82,7 +82,7 @@ "type": "COMESTIBLE", "id": "mushroom", "name": "mushroom", - "weight": 69, + "weight": "69 g", "color": "brown", "spoils_in": "2 days", "comestible_type": "FOOD", diff --git a/data/json/items/comestibles/mutagen.json b/data/json/items/comestibles/mutagen.json index 9765c40ca5ba1..53a5599ce0e8b 100644 --- a/data/json/items/comestibles/mutagen.json +++ b/data/json/items/comestibles/mutagen.json @@ -8,7 +8,7 @@ "//": "Not commercially traded, in case there was any question.", "comestible_type": "DRINK", "category": "mutagen", - "weight": 250, + "weight": "250 g", "volume": "250 ml", "phase": "liquid", "container": "flask_glass", @@ -30,7 +30,7 @@ "name": "abstract iv mutagen flavor", "description": "A super-concentrated mutagen. You need a syringe to inject it... if you really want to?", "price": 200000, - "weight": 10, + "weight": "10 g", "volume": "10ml", "symbol": "!", "color": "green", @@ -460,7 +460,7 @@ "category": "mutagen", "name": "purifier smart shot", "description": "An experimental stem cell treatment, offering limited control over which mutations are purified. The liquid sloshes strangely inside of this syringe.", - "weight": 12, + "weight": "12 g", "volume": "10ml", "price": 1200000, "material": "plastic", @@ -477,7 +477,7 @@ "category": "other", "name": "misshapen fetus", "name_plural": "misshapen fetuses", - "weight": 760, + "weight": "760 g", "color": "pink", "spoils_in": "2 days", "use_action": { "type": "mutagen", "is_weak": true }, @@ -497,7 +497,7 @@ "id": "arm", "category": "other", "name": "mutated arm", - "weight": 3767, + "weight": "3767 g", "color": "brown", "spoils_in": "2 days", "use_action": { "type": "mutagen", "is_weak": true }, @@ -517,7 +517,7 @@ "id": "leg", "category": "other", "name": "mutated leg", - "weight": 11071, + "weight": "11071 g", "color": "brown", "spoils_in": "2 days", "use_action": { "type": "mutagen", "is_weak": true }, @@ -537,7 +537,7 @@ "id": "taint_tornado", "name": "tainted tornado", "category": "mutagen", - "weight": 100, + "weight": "100 g", "color": "red", "addiction_type": "alcohol", "use_action": { "type": "mutagen", "is_weak": true }, @@ -563,7 +563,7 @@ "type": "COMESTIBLE", "id": "drink_sewerbrew", "name": "sewer brew", - "weight": 250, + "weight": "250 g", "color": "yellow", "addiction_type": "alcohol", "stim": -20, diff --git a/data/json/items/comestibles/nuts.json b/data/json/items/comestibles/nuts.json index f1bae69ee13da..73c921678a380 100644 --- a/data/json/items/comestibles/nuts.json +++ b/data/json/items/comestibles/nuts.json @@ -4,7 +4,7 @@ "id": "pine_nuts", "name": "handful of pine nuts", "name_plural": "handfuls of pine nuts", - "weight": 30, + "weight": "30 g", "color": "brown", "spoils_in": 1080, "container": "bag_plastic", @@ -27,7 +27,7 @@ "id": "juniper", "name": "handful of junipers", "name_plural": "handful of junipers", - "weight": 122, + "weight": "122 g", "color": "blue", "comestible_type": "FOOD", "symbol": "%", @@ -46,7 +46,7 @@ "id": "pistachio_unshelled", "name": "handful of shelled pistachios", "name_plural": "handfuls of shelled pistachios", - "weight": 30, + "weight": "30 g", "color": "green", "spoils_in": "90 days", "container": "bag_plastic", @@ -81,7 +81,7 @@ "id": "almond_unshelled", "name": "handful of shelled almonds", "name_plural": "handfuls of shelled almonds", - "weight": 30, + "weight": "30 g", "color": "brown", "spoils_in": "300 days", "container": "bag_plastic", @@ -116,7 +116,7 @@ "id": "cashews", "name": "handful of cashews", "name_plural": "handfuls of cashews", - "weight": 30, + "weight": "30 g", "color": "brown", "spoils_in": "240 days", "container": "bag_plastic", @@ -139,7 +139,7 @@ "id": "pecan_unshelled", "name": "handful of shelled pecans", "name_plural": "handfuls of shelled pecans", - "weight": 30, + "weight": "30 g", "color": "brown", "spoils_in": "180 days", "container": "bag_plastic", @@ -173,7 +173,7 @@ "id": "peanut_unshelled", "name": "handful of shelled peanuts", "name_plural": "handful of shelled peanuts", - "weight": 30, + "weight": "30 g", "color": "brown", "spoils_in": "240 days", "container": "bag_plastic", @@ -196,7 +196,7 @@ "id": "beech_nuts", "name": "handful of beech nuts", "name_plural": "handfuls of beech nuts", - "weight": 30, + "weight": "30 g", "color": "brown", "spoils_in": "90 days", "comestible_type": "FOOD", @@ -217,7 +217,7 @@ "id": "walnut_unshelled", "name": "handful of shelled walnuts", "name_plural": "handfuls of shelled walnuts", - "weight": 30, + "weight": "30 g", "color": "brown", "spoils_in": "180 days", "comestible_type": "FOOD", @@ -251,7 +251,7 @@ "id": "chestnut_unshelled", "name": "handful of shelled chestnuts", "name_plural": "handfuls of shelled chestnuts", - "weight": 30, + "weight": "30 g", "color": "brown", "spoils_in": "180 days", "comestible_type": "FOOD", @@ -285,7 +285,7 @@ "id": "hazelnut_unshelled", "name": "handful of shelled hazelnuts", "name_plural": "handfuls of shelled hazelnuts", - "weight": 30, + "weight": "30 g", "color": "brown", "spoils_in": "150 days", "comestible_type": "FOOD", @@ -307,7 +307,7 @@ "id": "edamame_roasted", "name": "handful of roasted edamame", "name_plural": "handful of roasted edamame", - "weight": 30, + "weight": "30 g", "color": "brown", "spoils_in": "240 days", "comestible_type": "FOOD", @@ -329,7 +329,7 @@ "id": "soy_nuts", "name": "handful of roasted soy nuts", "name_plural": "handful of roasted soy nuts", - "weight": 30, + "weight": "30 g", "color": "brown", "spoils_in": "240 days", "comestible_type": "FOOD", @@ -363,7 +363,7 @@ "id": "hickory_nut_unshelled", "name": "handful of shelled hickory nuts", "name_plural": "handfuls of shelled hickory nuts", - "weight": 30, + "weight": "30 g", "color": "brown", "spoils_in": "180 days", "comestible_type": "FOOD", @@ -396,7 +396,7 @@ "type": "COMESTIBLE", "id": "hickory_nut_ambrosia", "name": "hickory nut ambrosia", - "weight": 254, + "weight": "254 g", "color": "brown", "spoils_in": "10 days 19 hours", "container": "bottle_plastic", @@ -419,13 +419,13 @@ "id": "acorns", "name": "handful of acorns", "name_plural": "handfuls of acorns", - "weight": 30, + "weight": "30 g", "color": "brown", "spoils_in": "240 days", "comestible_type": "FOOD", "symbol": "%", "quench": -5, - "//": "most acorns contain various amount of tannins, which can make you fairly sick. it also tastes pretty bad.", + "//": "no vitamins here", "healthy": -5, "calories": 114, "description": "A handful of acorns, still in their shells. Squirrels like them, but they're not very good for you to eat in this state.", @@ -454,7 +454,7 @@ "id": "acorns_cooked", "name": "cooked acorn meal", "name_plural": "cooked acorn meal", - "weight": 22, + "weight": "22 g", "color": "brown", "spoils_in": "30 days", "comestible_type": "FOOD", diff --git a/data/json/items/comestibles/offal_dishes.json b/data/json/items/comestibles/offal_dishes.json index 014a7fb8bccf4..090a9f04dc692 100644 --- a/data/json/items/comestibles/offal_dishes.json +++ b/data/json/items/comestibles/offal_dishes.json @@ -10,7 +10,7 @@ "description": "Thought it's not technically foie gras, you don't have to think about that.", "material": [ "flesh", "fruit" ], "color": "brown", - "weight": 75, + "weight": "75 g", "volume": "250 ml", "charges": 3, "spoils_in": "12 hours", @@ -32,7 +32,7 @@ "description": "A classic way to serve liver.", "material": [ "flesh", "veggy" ], "color": "brown", - "weight": 206, + "weight": "206 g", "volume": "250 ml", "charges": 2, "spoils_in": "1 day", @@ -53,7 +53,7 @@ "material": [ "flesh", "wheat", "milk" ], "primary_material": "flesh", "color": "brown", - "weight": 58, + "weight": "58 g", "volume": "250 ml", "charges": 3, "spoils_in": "3 days", @@ -80,7 +80,7 @@ "material": [ "wheat", "flesh" ], "primary_material": "processed_food", "volume": "750ml", - "weight": 249, + "weight": "249 g", "charges": 3, "flags": [ "EATEN_HOT" ], "vitamins": [ [ "vitA", 36 ], [ "vitC", 15 ], [ "calcium", 1 ], [ "iron", 40 ], [ "vitB", 171 ] ] @@ -101,7 +101,7 @@ "color": "brown", "spoils_in": "1 days", "volume": "250 ml", - "weight": 70, + "weight": "70 g", "flag": [ "EATEN_HOT" ], "calories": 130 }, @@ -121,7 +121,7 @@ "color": "brown", "spoils_in": "1 days", "volume": "250 ml", - "weight": 70, + "weight": "70 g", "flag": [ "EATEN_HOT" ], "calories": 310 }, @@ -140,7 +140,7 @@ "color": "magenta", "spoils_in": "360 days", "volume": "1750 ml", - "weight": 112, + "weight": "112 g", "charges": 14, "calories": 344, "vitamins": [ [ "vitA", 43 ], [ "vitC", 0 ], [ "calcium", 1 ], [ "iron", 5 ], [ "vitB", 193 ] ] @@ -160,7 +160,7 @@ "color": "brown", "spoils_in": "1 days", "volume": "250 ml", - "weight": 250, + "weight": "250 g", "flag": [ "EATEN_HOT" ], "calories": 285, "charges": 3, @@ -181,7 +181,7 @@ "color": "yellow", "spoils_in": "1 days", "volume": "250 ml", - "weight": 180, + "weight": "180 g", "charges": 3, "flag": [ "EATEN_HOT" ], "calories": 301, diff --git a/data/json/items/comestibles/other.json b/data/json/items/comestibles/other.json index 6c0fc9a2a5c6c..b51a3f24a00c1 100644 --- a/data/json/items/comestibles/other.json +++ b/data/json/items/comestibles/other.json @@ -3,7 +3,7 @@ "type": "COMESTIBLE", "id": "testcomest", "name": "diet pill", - "weight": 100, + "weight": "100 g", "color": "red", "spoils_in": "4 days 4 hours", "container": "bag_plastic", @@ -19,7 +19,7 @@ "id": "slime_scrap", "category": "other", "name": "blob glob", - "weight": 238, + "weight": "238 g", "color": "dark_gray", "use_action": "POISON", "comestible_type": "FOOD", @@ -34,7 +34,7 @@ "type": "COMESTIBLE", "id": "honeycomb", "name": "honey comb", - "weight": 150, + "weight": "150 g", "color": "yellow", "use_action": "HONEYCOMB", "comestible_type": "FOOD", @@ -52,7 +52,7 @@ "id": "wax", "name": "wax", "name_plural": "waxes", - "weight": 97, + "weight": "97 g", "color": "white", "comestible_type": "FOOD", "symbol": "%", @@ -70,7 +70,7 @@ "name": "royal jelly", "name_plural": "royal jellies", "category": "drugs", - "weight": 150, + "weight": "150 g", "color": "white", "use_action": "ROYAL_JELLY", "comestible_type": "FOOD", @@ -89,7 +89,7 @@ "id": "marloss_berry", "name": "marloss berry", "name_plural": "marloss berries", - "weight": 177, + "weight": "177 g", "color": "pink", "addiction_type": "marloss_r", "use_action": "MARLOSS", @@ -112,7 +112,7 @@ "id": "marloss_gel", "name": "marloss gelatin", "name_plural": "marloss gelatin", - "weight": 177, + "weight": "177 g", "color": "yellow", "addiction_type": "marloss_y", "use_action": "MARLOSS_GEL", @@ -134,7 +134,7 @@ "id": "mycus_fruit", "name": "mycus fruit", "name_plural": "mycus fruits", - "weight": 354, + "weight": "354 g", "color": "light_gray", "use_action": "MYCUS", "comestible_type": "FOOD", @@ -154,7 +154,7 @@ "type": "COMESTIBLE", "id": "yeast", "name": "yeast", - "weight": 11, + "weight": "11 g", "color": "white", "container": "bag_plastic", "comestible_type": "FOOD", @@ -173,7 +173,7 @@ "type": "COMESTIBLE", "id": "meal_bone", "name": "bone meal", - "weight": 112, + "weight": "112 g", "color": "white", "comestible_type": "FOOD", "symbol": "%", @@ -189,7 +189,7 @@ "type": "COMESTIBLE", "id": "meal_bone_tainted", "name": "tainted bone meal", - "weight": 112, + "weight": "112 g", "color": "white", "use_action": "POISON", "comestible_type": "FOOD", @@ -207,7 +207,7 @@ "id": "meal_chitin_piece", "name": "chitin powder", "name_plural": "chitin powder", - "weight": 112, + "weight": "112 g", "color": "brown", "comestible_type": "FOOD", "symbol": "%", @@ -226,7 +226,7 @@ "id": "paper", "name": "paper", "category": "spare_parts", - "weight": 3, + "weight": "3 g", "color": "white", "comestible_type": "FOOD", "symbol": "`", @@ -244,7 +244,7 @@ "id": "can_beans", "name": "canned beans", "name_plural": "beans", - "weight": 256, + "weight": "256 g", "color": "brown", "spoils_in": "2 days", "container": "can_food", @@ -264,7 +264,7 @@ "id": "dry_beans", "name": "dried beans", "name_plural": "dried beans", - "weight": 56, + "weight": "56 g", "color": "light_gray", "spoils_in": "360 days", "container": "bag_plastic", @@ -288,7 +288,7 @@ "id": "beans_cooked", "name": "cooked beans", "name_plural": "cooked beans", - "weight": 270, + "weight": "270 g", "color": "light_gray", "spoils_in": "10 days", "comestible_type": "FOOD", @@ -309,7 +309,7 @@ "id": "tofu", "name": "tofu", "name_plural": "tofu", - "weight": 85, + "weight": "85 g", "color": "white", "spoils_in": "4 days", "comestible_type": "FOOD", @@ -330,7 +330,7 @@ "id": "tofu_fried", "name": "fried tofu", "name_plural": "fried tofu", - "weight": 85, + "weight": "85 g", "color": "white", "spoils_in": "4 days", "comestible_type": "FOOD", @@ -350,7 +350,7 @@ "id": "dry_tofu", "name": "dehydrated tofu", "name_plural": "dehydrated tofu", - "weight": 65, + "weight": "65 g", "color": "white", "spoils_in": "360 days", "comestible_type": "FOOD", @@ -369,7 +369,7 @@ "name": "soybeans", "name_plural": "soybeans", "copy-from": "seed", - "weight": 160, + "weight": "160 g", "symbol": ".", "color": "yellow", "healthy": -5, @@ -386,7 +386,7 @@ "id": "raw_edamame", "name": "raw edamame", "copy-from": "seed", - "weight": 160, + "weight": "160 g", "symbol": ".", "color": "green", "healthy": -2, @@ -403,7 +403,7 @@ "id": "dry_lentils", "name": "dried lentils", "name_plural": "dried lentils", - "weight": 132, + "weight": "132 g", "color": "light_gray", "comestible_type": "FOOD", "symbol": ",", @@ -424,7 +424,7 @@ "id": "lentils_cooked", "name": "cooked lentils", "name_plural": "cooked lentils", - "weight": 198, + "weight": "198 g", "copy-from": "dry_lentils", "color": "light_gray", "spoils_in": "5 days", @@ -442,7 +442,7 @@ "id": "coffee_raw", "name": "coffee powder", "name_plural": "coffee powder", - "weight": 14, + "weight": "14 g", "color": "brown", "addiction_type": "caffeine", "addiction_potential": 1, @@ -481,7 +481,7 @@ "description": "Honey, that stuff the bees make. This variant is \"candied honey\", a variant of very thick consistence. This honey won't spoil and is good for your digestion.", "price": 800, "material": "honey", - "weight": 51, + "weight": "51 g", "volume": "250 ml", "comestible_type": "FOOD", "container": "jar_glass", @@ -496,7 +496,7 @@ "id": "can_tomato", "name": "canned tomato", "name_plural": "canned tomatoes", - "weight": 256, + "weight": "256 g", "color": "red", "spoils_in": "3 days 18 hours", "container": "can_food", @@ -517,7 +517,7 @@ "id": "human_brain_embalmed", "name": "embalmed human brain", "name_plural": "embalmed human brains", - "weight": 56, + "weight": "56 g", "color": "pink", "looks_like": "offal", "use_action": "POISON", @@ -541,7 +541,7 @@ "name": "cattle fodder", "name_plural": "cattle fodder", "description": "What cattle eat. Mainly made of grass, silage or legumes. It's perfect for ruminants.", - "weight": 300, + "weight": "300 g", "volume": "250 ml", "price": 100, "to_hit": -5, @@ -563,7 +563,7 @@ "name": "bird food", "name_plural": "bird food", "description": "What birds eat. Mainly made of seeds, silage or legumes. It's perfect for small birds.", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "price": 20, "to_hit": -5, @@ -584,7 +584,7 @@ "name": "dog food", "name_plural": "dog food", "description": "This is food for dogs. It smells strange, but dogs seem to love it.", - "weight": 554, + "weight": "554 g", "spoils_in": "1 day", "container": "can_food", "volume": "250 ml", @@ -608,7 +608,7 @@ "name": "cat food", "name_plural": "cat food", "description": "This is food for cats. It smells strange, but cats seem to love it.", - "weight": 223, + "weight": "223 g", "spoils_in": "1 day", "container": "can_food", "volume": "250 ml", @@ -630,7 +630,7 @@ "id": "grass", "name": "grass", "name_plural": "grasses", - "weight": 100, + "weight": "100 g", "color": "green", "comestible_type": "FOOD", "symbol": "%", @@ -647,7 +647,7 @@ "id": "underbrush", "name": "underbrush", "name_plural": "underbrushes", - "weight": 100, + "weight": "100 g", "color": "green", "comestible_type": "FOOD", "symbol": "%", @@ -664,7 +664,7 @@ "id": "nectar", "name": "nectar", "name_plural": "nectars", - "weight": 100, + "weight": "100 g", "color": "green", "comestible_type": "FOOD", "symbol": "%", diff --git a/data/json/items/comestibles/protein.json b/data/json/items/comestibles/protein.json index cfcd10683a011..b3e38106fc054 100644 --- a/data/json/items/comestibles/protein.json +++ b/data/json/items/comestibles/protein.json @@ -40,7 +40,7 @@ "comestible_type": "DRINK", "name": "protein drink", "description": "A thin slurry of refined protein mixed with water. While quite nutritious, it is not particularly tasty.", - "weight": 288, + "weight": "288 g", "volume": "250 ml", "price": 200, "symbol": "~", @@ -62,7 +62,7 @@ "name": "protein powder", "name_plural": "servings of protein powder", "description": "Raw, refined protein. While quite nutritious, it is impossible to enjoy in its pure form, try adding water.", - "weight": 38, + "weight": "38 g", "volume": "250 ml", "price": 1100, "charges": 4, diff --git a/data/json/items/comestibles/raw_fruit.json b/data/json/items/comestibles/raw_fruit.json index 8a65b752b4569..139d4139992a8 100644 --- a/data/json/items/comestibles/raw_fruit.json +++ b/data/json/items/comestibles/raw_fruit.json @@ -3,7 +3,7 @@ "type": "COMESTIBLE", "id": "apple", "name": "apple", - "weight": 182, + "weight": "182 g", "color": "red", "spoils_in": "6 days 16 hours", "comestible_type": "FOOD", @@ -24,7 +24,7 @@ "type": "COMESTIBLE", "id": "banana", "name": "banana", - "weight": 118, + "weight": "118 g", "color": "yellow", "spoils_in": "5 days", "comestible_type": "FOOD", @@ -44,7 +44,7 @@ "type": "COMESTIBLE", "id": "orange", "name": "orange", - "weight": 140, + "weight": "140 g", "color": "light_red", "spoils_in": "21 days", "comestible_type": "FOOD", @@ -65,7 +65,7 @@ "type": "COMESTIBLE", "id": "lemon", "name": "lemon", - "weight": 84, + "weight": "84 g", "color": "yellow", "spoils_in": "21 days", "comestible_type": "FOOD", @@ -87,7 +87,7 @@ "id": "blueberries", "name": "handful of blueberries", "name_plural": "handful of blueberries", - "weight": 156, + "weight": "156 g", "color": "blue", "spoils_in": "2 days 12 hours", "comestible_type": "FOOD", @@ -109,7 +109,7 @@ "id": "strawberries", "name": "handful of strawberries", "name_plural": "handful of strawberries", - "weight": 144, + "weight": "144 g", "color": "red", "spoils_in": "2 days 12 hours", "comestible_type": "FOOD", @@ -131,7 +131,7 @@ "id": "cranberries", "name": "handful of cranberries", "name_plural": "handful of cranberries", - "weight": 116, + "weight": "116 g", "color": "red", "spoils_in": 640, "comestible_type": "FOOD", @@ -153,7 +153,7 @@ "id": "raspberries", "name": "handful of raspberries", "name_plural": "handful of raspberries", - "weight": 148, + "weight": "148 g", "color": "red", "spoils_in": "2 days 12 hours", "comestible_type": "FOOD", @@ -175,7 +175,7 @@ "id": "huckleberries", "name": "handful of huckleberries", "name_plural": "handful of huckleberries", - "weight": 150, + "weight": "150 g", "color": "blue", "spoils_in": "2 days 12 hours", "comestible_type": "FOOD", @@ -197,7 +197,7 @@ "id": "mulberries", "name": "handful of mulberries", "name_plural": "handful of mulberries", - "weight": 148, + "weight": "148 g", "color": "red", "spoils_in": "2 days 12 hours", "comestible_type": "FOOD", @@ -219,7 +219,7 @@ "id": "elderberries", "name": "handful of elderberries", "name_plural": "handful of elderberries", - "weight": 153, + "weight": "153 g", "color": "red", "spoils_in": "2 days 12 hours", "comestible_type": "FOOD", @@ -241,7 +241,7 @@ "id": "rose_hips", "name": "handful of rose hips", "name_plural": "handful of rose hips", - "weight": 134, + "weight": "134 g", "color": "red", "spoils_in": "2 days 12 hours", "comestible_type": "FOOD", @@ -262,7 +262,7 @@ "type": "COMESTIBLE", "id": "juice_pulp", "name": "juice pulp", - "weight": 62, + "weight": "62 g", "color": "light_red", "spoils_in": "2 days 12 hours", "comestible_type": "FOOD", @@ -283,7 +283,7 @@ "type": "COMESTIBLE", "id": "pear", "name": "pear", - "weight": 148, + "weight": "148 g", "color": "yellow", "spoils_in": "4 days", "comestible_type": "FOOD", @@ -304,7 +304,7 @@ "type": "COMESTIBLE", "id": "grapefruit", "name": "grapefruit", - "weight": 246, + "weight": "246 g", "color": "yellow", "spoils_in": 336, "comestible_type": "FOOD", @@ -326,7 +326,7 @@ "id": "cherries", "name": "handful of cherries", "name_plural": "handful of cherries", - "weight": 146, + "weight": "146 g", "color": "red", "spoils_in": "2 days 12 hours", "comestible_type": "FOOD", @@ -347,7 +347,7 @@ "type": "COMESTIBLE", "id": "plums", "name": "plum", - "weight": 66, + "weight": "66 g", "color": "magenta", "spoils_in": "2 days 12 hours", "comestible_type": "FOOD", @@ -369,7 +369,7 @@ "id": "grapes", "name": "handful of grapes", "name_plural": "handful of grapes", - "weight": 97, + "weight": "97 g", "color": "light_green", "spoils_in": "5 days", "comestible_type": "FOOD", @@ -390,7 +390,7 @@ "type": "COMESTIBLE", "id": "pineapple", "name": "pineapple", - "weight": 174, + "weight": "174 g", "color": "brown", "spoils_in": "3 days", "comestible_type": "FOOD", @@ -413,7 +413,7 @@ "type": "COMESTIBLE", "id": "coconut", "name": "coconut", - "weight": 84, + "weight": "84 g", "color": "brown", "spoils_in": "360 days", "comestible_type": "FOOD", @@ -434,7 +434,7 @@ "id": "peach", "name": "peach", "name_plural": "peaches", - "weight": 163, + "weight": "163 g", "color": "yellow", "spoils_in": "3 days", "comestible_type": "FOOD", @@ -455,7 +455,7 @@ "type": "COMESTIBLE", "id": "watermelon", "name": "watermelon", - "weight": 161, + "weight": "161 g", "color": "green", "spoils_in": "7 days 12 hours", "comestible_type": "FOOD", @@ -480,7 +480,7 @@ "id": "melon", "name": "melon", "//": "based on a canteloupe", - "weight": 165, + "weight": "165 g", "color": "light_green", "spoils_in": "7 days 12 hours", "comestible_type": "FOOD", @@ -504,7 +504,7 @@ "id": "blackberries", "name": "handful of blackberries", "name_plural": "handful of blackberries", - "weight": 166, + "weight": "166 g", "color": "blue", "spoils_in": "2 days 12 hours", "comestible_type": "FOOD", @@ -525,7 +525,7 @@ "type": "COMESTIBLE", "id": "mango", "name": "mango", - "weight": 174, + "weight": "174 g", "color": "red", "spoils_in": "5 days", "comestible_type": "FOOD", @@ -548,7 +548,7 @@ "type": "COMESTIBLE", "id": "pomegranate", "name": "pomegranate", - "weight": 184, + "weight": "184 g", "color": "red", "spoils_in": 336, "comestible_type": "FOOD", @@ -570,7 +570,7 @@ "type": "COMESTIBLE", "id": "papaya", "name": "papaya", - "weight": 243, + "weight": "243 g", "color": "yellow", "spoils_in": "5 days", "comestible_type": "FOOD", @@ -592,7 +592,7 @@ "type": "COMESTIBLE", "id": "kiwi", "name": "kiwi", - "weight": 74, + "weight": "74 g", "color": "brown", "spoils_in": "7 days", "comestible_type": "FOOD", @@ -615,7 +615,7 @@ "name": "handful of apricots", "name_plural": "handful of apricots", "//": "a handful of apricots is about 4.6 apricots", - "weight": 164, + "weight": "164 g", "color": "yellow", "spoils_in": "2 days", "comestible_type": "FOOD", @@ -636,7 +636,7 @@ "type": "COMESTIBLE", "id": "cactus_pad", "name": "cactus pad", - "weight": 100, + "weight": "100 g", "color": "green", "spoils_in": "1 days", "comestible_type": "FOOD", diff --git a/data/json/items/comestibles/raw_veggy.json b/data/json/items/comestibles/raw_veggy.json index 2827e20aef2c4..ec069de459539 100644 --- a/data/json/items/comestibles/raw_veggy.json +++ b/data/json/items/comestibles/raw_veggy.json @@ -3,7 +3,7 @@ "type": "COMESTIBLE", "id": "barley", "name": "barley", - "weight": 211, + "weight": "211 g", "color": "brown", "comestible_type": "FOOD", "symbol": ",", @@ -27,7 +27,7 @@ "comestible_type": "FOOD", "calories": 9, "fun": -5, - "weight": 40, + "weight": "40 g", "to_hit": -3, "color": "white", "symbol": ",", @@ -40,7 +40,7 @@ "id": "broccoli", "name": "broccoli", "name_plural": "broccoli", - "weight": 96, + "weight": "96 g", "color": "green", "spoils_in": "6 days 16 hours", "comestible_type": "FOOD", @@ -60,7 +60,7 @@ "id": "buckwheat", "name": "buckwheat", "name_plural": "buckwheat", - "weight": 180, + "weight": "180 g", "color": "brown", "comestible_type": "FOOD", "symbol": ",", @@ -80,7 +80,7 @@ "type": "COMESTIBLE", "id": "cabbage", "name": "cabbage", - "weight": 139, + "weight": "139 g", "color": "white", "spoils_in": "10 days", "comestible_type": "FOOD", @@ -103,7 +103,7 @@ "id": "spinach", "name": "spinach", "name_plural": "spinach", - "weight": 139, + "weight": "139 g", "color": "green", "spoils_in": "8 days", "comestible_type": "FOOD", @@ -124,7 +124,7 @@ "id": "carrot", "name": "carrot", "name_plural": "carrots", - "weight": 68, + "weight": "68 g", "color": "light_red", "spoils_in": "5 days", "comestible_type": "FOOD", @@ -146,7 +146,7 @@ "id": "cattail_rhizome", "name": "cattail rhizome", "name_plural": "cattail rhizomes", - "weight": 209, + "weight": "209 g", "color": "brown", "spoils_in": "3 days 8 hours", "comestible_type": "FOOD", @@ -164,7 +164,7 @@ "id": "cattail_stalk", "name": "cattail stalk", "name_plural": "cattail stalks", - "weight": 100, + "weight": "100 g", "color": "green", "spoils_in": "3 days 8 hours", "comestible_type": "FOOD", @@ -183,7 +183,7 @@ "type": "COMESTIBLE", "id": "celery", "name": "celery", - "weight": 107, + "weight": "107 g", "color": "light_green", "spoils_in": "6 days 6 hours", "comestible_type": "FOOD", @@ -203,7 +203,7 @@ "id": "corn", "name": "corn", "name_plural": "corn", - "weight": 153, + "weight": "153 g", "color": "light_green", "spoils_in": "5 days", "comestible_type": "FOOD", @@ -225,7 +225,7 @@ "name": "cotton boll", "name_plural": "cotton bolls", "category": "other", - "weight": 26, + "weight": "26 g", "color": "light_green", "comestible_type": "FOOD", "symbol": "%", @@ -243,7 +243,7 @@ "type": "COMESTIBLE", "id": "chili_pepper", "name": "chili pepper", - "weight": 53, + "weight": "53 g", "color": "red", "spoils_in": "30 days", "comestible_type": "FOOD", @@ -263,7 +263,7 @@ "type": "COMESTIBLE", "id": "cucumber", "name": "cucumber", - "weight": 330, + "weight": "330 g", "color": "green", "spoils_in": "6 days 6 hours", "comestible_type": "FOOD", @@ -283,7 +283,7 @@ "type": "COMESTIBLE", "id": "dahlia_root", "name": "dahlia root", - "weight": 190, + "weight": "190 g", "color": "brown", "spoils_in": "30 days", "comestible_type": "FOOD", @@ -301,7 +301,7 @@ "id": "salsify_raw", "name": "salsify", "name_plural": "handfuls of salsify", - "weight": 133, + "weight": "133 g", "color": "green", "spoils_in": "30 days", "comestible_type": "FOOD", @@ -322,7 +322,7 @@ "id": "chicory_raw", "name": "chicory", "name_plural": "handfuls of chicory", - "weight": 60, + "weight": "60 g", "color": "cyan", "spoils_in": "30 days", "comestible_type": "FOOD", @@ -360,7 +360,7 @@ "calories": 9, "fun": -15, "healthy": -2, - "weight": 40, + "weight": "40 g", "to_hit": -3, "color": "magenta", "symbol": ",", @@ -372,7 +372,7 @@ "type": "COMESTIBLE", "id": "garlic", "name": "garlic bulb", - "weight": 14, + "weight": "14 g", "color": "white", "spoils_in": "360 days", "comestible_type": "FOOD", @@ -393,7 +393,7 @@ "id": "hops", "name": "hops flower", "name_plural": "hops flowers", - "weight": 92, + "weight": "92 g", "color": "light_green", "comestible_type": "FOOD", "symbol": ",", @@ -412,7 +412,7 @@ "type": "COMESTIBLE", "id": "lettuce", "name": "lettuce", - "weight": 38, + "weight": "38 g", "color": "light_green", "spoils_in": "10 days", "comestible_type": "FOOD", @@ -437,7 +437,7 @@ "spoils_in": "10 days", "calories": 9, "fun": -8, - "weight": 40, + "weight": "40 g", "to_hit": -3, "color": "magenta", "symbol": ",", @@ -449,7 +449,7 @@ "type": "COMESTIBLE", "id": "onion", "name": "onion", - "weight": 150, + "weight": "150 g", "color": "white", "spoils_in": "30 days", "comestible_type": "FOOD", @@ -470,7 +470,7 @@ "type": "COMESTIBLE", "id": "plant_sac", "name": "fungal fluid sac", - "weight": 278, + "weight": "278 g", "color": "light_green", "spoils_in": "3 days 8 hours", "//": "wild vegetables as a reference", @@ -492,7 +492,7 @@ "id": "potato", "name": "raw potato", "name_plural": "raw potatoes", - "weight": 210, + "weight": "210 g", "color": "brown", "spoils_in": "60 days", "comestible_type": "FOOD", @@ -512,7 +512,7 @@ "type": "COMESTIBLE", "id": "pumpkin", "name": "pumpkin", - "weight": 123, + "weight": "123 g", "color": "light_red", "spoils_in": "60 days", "comestible_type": "FOOD", @@ -536,7 +536,7 @@ "id": "raw_dandelion", "name": "handful of dandelions", "name_plural": "handfuls of dandelions", - "weight": 58, + "weight": "58 g", "color": "yellow", "spoils_in": "1 day 6 hours", "comestible_type": "FOOD", @@ -557,7 +557,7 @@ "type": "COMESTIBLE", "id": "rhubarb", "name": "rhubarb", - "weight": 129, + "weight": "129 g", "color": "red", "spoils_in": "6 days 16 hours", "comestible_type": "FOOD", @@ -577,7 +577,7 @@ "type": "COMESTIBLE", "id": "sugar_beet", "name": "sugar beet", - "weight": 143, + "weight": "143 g", "color": "brown", "spoils_in": "95 days", "stim": 1, @@ -599,7 +599,7 @@ "id": "tea_raw", "name": "tea leaf", "name_plural": "tea leaves", - "weight": 14, + "weight": "14 g", "color": "green", "use_action": "CAFF", "stim": 1, @@ -621,7 +621,7 @@ "id": "tomato", "name": "tomato", "name_plural": "tomatoes", - "weight": 212, + "weight": "212 g", "color": "red", "spoils_in": "3 days 18 hours", "comestible_type": "FOOD", @@ -641,7 +641,7 @@ "type": "COMESTIBLE", "id": "veggy", "name": "plant marrow", - "weight": 119, + "weight": "119 g", "color": "green", "spoils_in": "3 days 8 hours", "comestible_type": "FOOD", @@ -686,7 +686,7 @@ "type": "COMESTIBLE", "id": "zucchini", "name": "zucchini", - "weight": 196, + "weight": "196 g", "color": "light_green", "spoils_in": "5 days", "comestible_type": "FOOD", @@ -709,7 +709,7 @@ "comestible_type": "FOOD", "calories": 9, "fun": -8, - "weight": 40, + "weight": "40 g", "to_hit": -3, "color": "magenta", "symbol": ",", @@ -725,7 +725,7 @@ "color": "brown", "spoils_in": "2 days", "comestible_type": "FOOD", - "weight": 194, + "weight": "194 g", "symbol": "%", "healthy": -2, "calories": 56, @@ -746,7 +746,7 @@ "color": "light_green", "spoils_in": "2 days", "comestible_type": "FOOD", - "weight": 194, + "weight": "194 g", "symbol": "%", "healthy": -2, "calories": 42, diff --git a/data/json/items/comestibles/sandwich.json b/data/json/items/comestibles/sandwich.json index 408c3df035cbe..6297fe7e92a72 100644 --- a/data/json/items/comestibles/sandwich.json +++ b/data/json/items/comestibles/sandwich.json @@ -4,7 +4,7 @@ "id": "sandwich_cheese_grilled", "name": "grilled cheese sandwich", "name_plural": "grilled cheese sandwiches", - "weight": 106, + "weight": "106 g", "color": "brown", "spoils_in": "1 day 10 hours", "stim": 1, @@ -27,7 +27,7 @@ "id": "sandwich_deluxe", "name": "deluxe sandwich", "name_plural": "deluxe sandwiches", - "weight": 292, + "weight": "292 g", "color": "brown", "spoils_in": "1 day 8 hours", "stim": 1, @@ -51,7 +51,7 @@ "id": "sandwich_cucumber", "name": "cucumber sandwich", "name_plural": "cucumber sandwiches", - "weight": 500, + "weight": "500 g", "color": "light_green", "spoils_in": "1 day 12 hours", "container": "wrapper", @@ -73,7 +73,7 @@ "id": "sandwich_cheese", "name": "cheese sandwich", "name_plural": "cheese sandwiches", - "weight": 106, + "weight": "106 g", "color": "brown", "spoils_in": "1 day 12 hours", "stim": 1, @@ -94,7 +94,7 @@ "id": "sandwich_jam", "name": "jam sandwich", "name_plural": "jam sandwiches", - "weight": 97, + "weight": "97 g", "color": "brown", "spoils_in": "1 day 13 hours", "container": "wrapper", @@ -115,7 +115,7 @@ "id": "sandwich_fairy", "name": "fairy bread", "name_plural": "fairy bread", - "weight": 114, + "weight": "114 g", "color": "brown", "spoils_in": "3 days", "container": "wrapper", @@ -134,7 +134,7 @@ "id": "sandwich_honey", "name": "honey sandwich", "name_plural": "honey sandwiches", - "weight": 192, + "weight": "192 g", "color": "brown", "spoils_in": "10 days", "container": "wrapper", @@ -171,7 +171,7 @@ "id": "sandwich_veggy", "name": "vegetable sandwich", "name_plural": "vegetable sandwiches", - "weight": 289, + "weight": "289 g", "color": "light_gray", "spoils_in": "2 days", "container": "wrapper", @@ -193,7 +193,7 @@ "id": "sandwich_t", "name": "meat sandwich", "name_plural": "meat sandwiches", - "weight": 233, + "weight": "233 g", "color": "light_gray", "spoils_in": "1 day 12 hours", "container": "wrapper", @@ -213,7 +213,7 @@ "id": "sandwich_pb", "name": "peanut butter sandwich", "name_plural": "peanut butter sandwiches", - "weight": 204, + "weight": "204 g", "color": "brown", "spoils_in": "1 day 12 hours", "container": "wrapper", @@ -233,7 +233,7 @@ "id": "sandwich_pbj", "name": "PB&J sandwich", "name_plural": "PB&J sandwiches", - "weight": 102, + "weight": "102 g", "color": "brown", "spoils_in": "1 day 12 hours", "container": "wrapper", @@ -254,7 +254,7 @@ "id": "sandwich_pbh", "name": "PB&H sandwich", "name_plural": "PB&H sandwiches", - "weight": 97, + "weight": "97 g", "color": "brown", "spoils_in": "1 day 12 hours", "container": "wrapper", @@ -275,7 +275,7 @@ "id": "sandwich_pbm", "name": "PB&M sandwich", "name_plural": "PB&M sandwiches", - "weight": 225, + "weight": "225 g", "color": "brown", "spoils_in": "1 day 12 hours", "container": "wrapper", @@ -295,7 +295,7 @@ "id": "fish_sandwich", "name": "fish sandwich", "name_plural": "fish sandwiches", - "weight": 201, + "weight": "201 g", "color": "yellow", "spoils_in": "1 day", "container": "wrapper", @@ -313,7 +313,7 @@ "type": "COMESTIBLE", "id": "blt", "name": "BLT", - "weight": 220, + "weight": "220 g", "color": "brown", "spoils_in": "2 days 12 hours", "stim": 1, diff --git a/data/json/items/comestibles/seed.json b/data/json/items/comestibles/seed.json index b114697111536..1a9c9223e3f03 100644 --- a/data/json/items/comestibles/seed.json +++ b/data/json/items/comestibles/seed.json @@ -7,7 +7,7 @@ "name_plural": "seeds", "category": "seeds", "volume": "250 ml", - "weight": 1, + "weight": "1 g", "price": 120, "charges": 4, "stack_size": 100, @@ -42,7 +42,7 @@ "name": "hop rhizomes", "name_plural": "hop rhizomes", "description": "Roots of a hop plant, for growing your own.", - "weight": 152, + "weight": "152 g", "price": 160, "charges": 2, "stack_size": 8, @@ -155,7 +155,7 @@ "name": "barley seeds", "name_plural": "barley seeds", "description": "Some barley seeds.", - "weight": 5, + "weight": "5 g", "charges": 2, "stack_size": 40, "seed_data": { "plant_name": "barley", "fruit": "barley", "byproducts": [ "straw_pile" ], "grow": "70 days" } @@ -169,7 +169,7 @@ "name_plural": "sugar beet seeds", "description": "Some sugar beet seeds.", "volume": 0, - "weight": 5, + "weight": "5 g", "stack_size": 40, "seed_data": { "plant_name": "sugar beet", "fruit": "sugar_beet", "grow": "90 days" } }, @@ -212,7 +212,7 @@ "name": "cotton seeds", "name_plural": "cotton seeds", "description": "Some cotton seeds. Can be processed to produce an edible oil.", - "weight": 5, + "weight": "5 g", "charges": 8, "stack_size": 40, "seed_data": { "plant_name": "cotton", "fruit": "cotton_boll", "byproducts": [ "withered" ], "grow": "130 days" } @@ -334,7 +334,7 @@ "id": "garlic_clove", "name": "garlic clove", "name_plural": "garlic cloves", - "weight": 3, + "weight": "3 g", "color": "white", "spoils_in": "360 days", "comestible_type": "FOOD", @@ -400,7 +400,7 @@ "name": "seed potato", "name_plural": "seed potatoes", "description": "A raw potato, cut into pieces, separating each bud for planting.", - "weight": 20, + "weight": "20 g", "stack_size": 10, "seed_data": { "plant_name": "potatoes", "fruit": "potato", "byproducts": [ "withered" ], "grow": "95 days" } }, @@ -417,7 +417,7 @@ "calories": 17, "description": "Seeds of the cannabis plant. Filled with vitamins, they can be roasted or eaten raw.", "price": 100, - "weight": 2, + "weight": "2 g", "charges": 2, "seed_data": { "plant_name": "cannabis", "fruit": "cannabis", "grow": "91 days" } }, @@ -440,7 +440,7 @@ "category": "seeds", "name": "marloss seed", "name_plural": "marloss seeds", - "weight": 177, + "weight": "177 g", "color": "cyan", "addiction_type": "marloss_b", "use_action": "MARLOSS_SEED", @@ -465,7 +465,7 @@ "copy-from": "seed", "name": "bean seeds", "name_plural": "bean seeds", - "weight": 194, + "weight": "194 g", "symbol": "%", "description": "Raw, uncooked beans, ready for planting.", "charges": 2, @@ -478,7 +478,7 @@ "copy-from": "seed", "name": "soybean seeds", "name_plural": "soybean seeds", - "weight": 160, + "weight": "160 g", "symbol": ".", "color": "yellow", "description": "Some soybean seeds.", @@ -491,7 +491,7 @@ "copy-from": "seed", "name": "raw lentils", "name_plural": "raw lentils", - "weight": 194, + "weight": "194 g", "symbol": "%", "description": "Raw, uncooked lentils, ready for planting.", "charges": 2, @@ -527,7 +527,7 @@ "copy-from": "seed", "name": "pumpkin seeds", "name_plural": "pumpkin seeds", - "weight": 2, + "weight": "2 g", "color": "green", "use_action": "SEED", "calories": 17, @@ -542,7 +542,7 @@ "copy-from": "seed", "name": "sunflower seeds", "name_plural": "sunflower seeds", - "weight": 2, + "weight": "2 g", "color": "green", "use_action": "SEED", "calories": 17, @@ -664,7 +664,7 @@ "name": "datura seeds", "name_plural": "datura seeds", "description": "Small, dark seeds from the spiny pods of a datura plant. Full of powerful psychoactive chemicals, these tiny seeds are a potent analgesic and deliriant, and can be deadly in cases of overdose.", - "weight": 2, + "weight": "2 g", "price": 0, "stim": 6, "healthy": -2, @@ -692,7 +692,7 @@ "description": "Some oat seeds.", "material": "wheat", "primary_material": "dried_vegetable", - "weight": 5, + "weight": "5 g", "stack_size": 40, "seed_data": { "plant_name": "oats", "fruit": "oats", "byproducts": [ "withered" ], "grow": "45 days" } }, @@ -703,7 +703,7 @@ "name": "wheat seeds", "name_plural": "wheat seeds", "description": "Some wheat seeds.", - "weight": 5, + "weight": "5 g", "price": 50, "stack_size": 40, "material": "wheat", @@ -715,7 +715,7 @@ "id": "fried_seeds", "name": "fried seeds", "name_plural": "fried seeds", - "weight": 32, + "weight": "32 g", "color": "yellow", "container": "bag_plastic", "comestible_type": "FOOD", @@ -737,7 +737,7 @@ "name": "Kentucky coffee pod", "name_plural": "Kentucky coffee pods", "category": "other", - "weight": 26, + "weight": "26 g", "color": "light_green", "comestible_type": "FOOD", "looks_like": "hickory_nuts", @@ -776,7 +776,7 @@ "vitamins": [ [ "calcium", 4 ], [ "iron", 8 ] ], "flags": [ "EDIBLE_FROZEN" ], "stack_size": 40, - "weight": 106 + "weight": "106 g" }, { "type": "COMESTIBLE", diff --git a/data/json/items/comestibles/soup.json b/data/json/items/comestibles/soup.json index 3575b01dfd6ef..0efe41c5fada2 100644 --- a/data/json/items/comestibles/soup.json +++ b/data/json/items/comestibles/soup.json @@ -3,7 +3,7 @@ "type": "COMESTIBLE", "id": "broth", "name": "broth", - "weight": 253, + "weight": "253 g", "color": "yellow", "spoils_in": "6 days 16 hours", "container": "can_food", @@ -24,7 +24,7 @@ "type": "COMESTIBLE", "id": "broth_bone", "name": "bone broth", - "weight": 267, + "weight": "267 g", "color": "yellow", "spoils_in": "6 days 16 hours", "container": "can_food", @@ -55,7 +55,7 @@ "type": "COMESTIBLE", "id": "soup_veggy", "name": "vegetable soup", - "weight": 254, + "weight": "254 g", "color": "red", "spoils_in": "5 days", "container": "can_food", @@ -77,7 +77,7 @@ "type": "COMESTIBLE", "id": "soup_meat", "name": "meat soup", - "weight": 253, + "weight": "253 g", "color": "red", "spoils_in": "5 days", "container": "can_food", @@ -99,7 +99,7 @@ "type": "COMESTIBLE", "id": "soup_fish", "name": "fish soup", - "weight": 265, + "weight": "265 g", "color": "light_gray", "spoils_in": "5 days", "container": "can_food", @@ -122,7 +122,7 @@ "id": "curry_veggy", "name": "curry", "name_plural": "curries", - "weight": 263, + "weight": "263 g", "color": "red", "spoils_in": "5 days", "container": "can_food", @@ -145,7 +145,7 @@ "id": "curry_meat", "name": "curry with meat", "name_plural": "curries with meat", - "weight": 289, + "weight": "289 g", "color": "red", "spoils_in": "5 days", "container": "can_food", @@ -168,7 +168,7 @@ "type": "COMESTIBLE", "id": "soup_woods", "name": "woods soup", - "weight": 250, + "weight": "250 g", "color": "red", "spoils_in": "5 days", "container": "can_food", @@ -199,7 +199,7 @@ "type": "COMESTIBLE", "id": "soup_chicken", "name": "chicken noodle soup", - "weight": 261, + "weight": "261 g", "color": "light_gray", "spoils_in": "5 days", "container": "can_food", @@ -222,7 +222,7 @@ "type": "COMESTIBLE", "id": "soup_mushroom", "name": "mushroom soup", - "weight": 266, + "weight": "266 g", "color": "light_gray", "spoils_in": "5 days", "container": "can_food", @@ -245,7 +245,7 @@ "type": "COMESTIBLE", "id": "soup_tomato", "name": "tomato soup", - "weight": 257, + "weight": "257 g", "color": "red", "spoils_in": "6 days 16 hours", "container": "can_food", @@ -268,7 +268,7 @@ "id": "soup_dumplings", "name": "chicken and dumplings", "name_plural": "chicken and dumplings", - "weight": 263, + "weight": "263 g", "color": "light_gray", "spoils_in": "6 days 16 hours", "container": "can_food", @@ -291,7 +291,7 @@ "type": "COMESTIBLE", "id": "soup_cullenskink", "name": "cullen skink", - "weight": 261, + "weight": "261 g", "color": "white", "spoils_in": "5 days", "container": "can_food", diff --git a/data/json/items/comestibles/spice.json b/data/json/items/comestibles/spice.json index a7b59e5ebcec8..8c8b8dbbda88e 100644 --- a/data/json/items/comestibles/spice.json +++ b/data/json/items/comestibles/spice.json @@ -67,7 +67,7 @@ "id": "sugar", "name": "sugar", "name_plural": "sugar", - "weight": 5, + "weight": "5 g", "color": "white", "container": "box_small", "comestible_type": "FOOD", @@ -87,7 +87,7 @@ "id": "sprinkles", "name": "sprinkles", "name_plural": "sprinkles", - "weight": 4, + "weight": "4 g", "copy-from": "sugar", "container": "bottle_plastic_small", "description": "Known as nonpareils, sprinkles, jimmies, sugar strands or 'hundreds-and-thousands', these colorful balls, rods or flakes of sugar and starch are intended for use decorating soft surfaces of sweets. Like sugar, they are bad for your teeth and surprisingly not very tasty on their own.", @@ -100,7 +100,7 @@ "id": "wild_herbs", "name": "wild herbs", "name_plural": "wild herbs", - "weight": 7, + "weight": "7 g", "color": "green", "comestible_type": "FOOD", "symbol": "%", @@ -124,7 +124,7 @@ "name_plural": "soy sauce", "description": "Salty fermented soybean sauce.", "price": 190, - "weight": 24, + "weight": "24 g", "volume": "250 ml", "calories": 17, "comestible_type": "DRINK", @@ -145,7 +145,7 @@ "comestible_type": "FOOD", "calories": 9, "fun": -4, - "weight": 40, + "weight": "40 g", "to_hit": -3, "color": "magenta", "symbol": ",", diff --git a/data/json/items/comestibles/veggy_dishes.json b/data/json/items/comestibles/veggy_dishes.json index fa88406b4b6b1..bd4433dced8fb 100644 --- a/data/json/items/comestibles/veggy_dishes.json +++ b/data/json/items/comestibles/veggy_dishes.json @@ -16,7 +16,7 @@ "id": "starch", "name": "starch", "name_plural": "starch", - "weight": 180, + "weight": "180 g", "color": "light_gray", "spoils_in": "1 day 6 hours", "comestible_type": "FOOD", @@ -82,7 +82,7 @@ "type": "COMESTIBLE", "id": "veggy_aspic", "name": "vegetable aspic", - "weight": 120, + "weight": "120 g", "color": "green", "spoils_in": "3 days 8 hours", "comestible_type": "FOOD", @@ -126,7 +126,7 @@ "type": "COMESTIBLE", "id": "cornmeal", "name": "cornmeal", - "weight": 19, + "weight": "19 g", "color": "yellow", "spoils_in": "360 days", "container": "box_small", @@ -148,7 +148,7 @@ "id": "deluxe_veggy_beans", "name": "vegetarian baked beans", "name_plural": "vegetarian baked beans", - "weight": 270, + "weight": "270 g", "color": "brown", "spoils_in": "15 days", "comestible_type": "FOOD", @@ -169,7 +169,7 @@ "id": "dry_rice", "name": "dried rice", "name_plural": "dried rice", - "weight": 40, + "weight": "40 g", "color": "white", "spoils_in": "360 days", "container": "bag_plastic", @@ -194,7 +194,7 @@ "name": "cooked rice", "name_plural": "cooked rice", "copy-from": "dry_rice", - "weight": 62, + "weight": "62 g", "color": "light_gray", "spoils_in": "10 days", "quench": 0, @@ -212,7 +212,7 @@ "id": "deluxe_veggy_rice", "name": "fried rice", "name_plural": "fried rice", - "weight": 135, + "weight": "135 g", "color": "yellow", "spoils_in": "15 days", "comestible_type": "FOOD", @@ -232,7 +232,7 @@ "id": "beansnrice", "name": "beans and rice", "name_plural": "beans and rice", - "weight": 70, + "weight": "70 g", "color": "light_gray", "spoils_in": "10 days", "comestible_type": "FOOD", @@ -252,7 +252,7 @@ "id": "tofu_rice", "name": "tofu fried rice", "name_plural": "tofu fried rice", - "weight": 135, + "weight": "135 g", "color": "yellow", "spoils_in": "15 days", "comestible_type": "FOOD", @@ -272,7 +272,7 @@ "id": "tofu_stirfry", "name": "tofu stirfry", "name_plural": "tofu stirfry", - "weight": 135, + "weight": "135 g", "color": "yellow", "spoils_in": "4 days", "comestible_type": "FOOD", @@ -293,7 +293,7 @@ "id": "deluxe_veggy_beansnrice", "name": "deluxe vegetarian beans and rice", "name_plural": "deluxe vegetarian beans and rice", - "weight": 140, + "weight": "140 g", "color": "brown", "spoils_in": "15 days", "comestible_type": "FOOD", @@ -314,7 +314,7 @@ "id": "potato_baked", "name": "baked potato", "name_plural": "baked potatoes", - "weight": 241, + "weight": "241 g", "color": "brown", "spoils_in": "2 days", "comestible_type": "FOOD", @@ -348,7 +348,7 @@ "type": "COMESTIBLE", "id": "pie_veggy", "name": "vegetable pie", - "weight": 240, + "weight": "240 g", "color": "brown", "spoils_in": "3 days", "container": "box_small", @@ -370,7 +370,7 @@ "type": "COMESTIBLE", "id": "pizza_veggy", "name": "vegetable pizza", - "weight": 230, + "weight": "230 g", "color": "light_green", "spoils_in": "2 days", "container": "box_small", @@ -390,7 +390,7 @@ "type": "COMESTIBLE", "id": "sauce_pesto", "name": "pesto", - "weight": 65, + "weight": "65 g", "color": "light_green", "spoils_in": 144, "container": "jar_glass", @@ -412,7 +412,7 @@ "id": "veggy_canned", "name": "canned veggy", "name_plural": "canned veggies", - "weight": 259, + "weight": "259 g", "color": "green", "spoils_in": "2 days 12 hours", "container": "can_food", @@ -430,7 +430,7 @@ "type": "COMESTIBLE", "id": "veggy_salted", "name": "salted veggy chunk", - "weight": 192, + "weight": "192 g", "color": "green", "spoils_in": "3 days", "container": "plastic_bag_vac", @@ -450,7 +450,7 @@ "id": "spaghetti_pesto", "name": "spaghetti al pesto", "name_plural": "spaghetti al pesto", - "weight": 80, + "weight": "80 g", "color": "green", "spoils_in": "2 days", "comestible_type": "FOOD", @@ -485,7 +485,7 @@ "id": "sauerkraut_onions", "name": "sauerkraut w/ sautee'd onions", "name_plural": "sauerkraut w/ sautee'd onions", - "weight": 424, + "weight": "424 g", "color": "light_gray", "spoils_in": "5 days", "comestible_type": "FOOD", @@ -547,7 +547,7 @@ "type": "COMESTIBLE", "id": "veggy_salad", "name": "vegetable salad", - "weight": 227, + "weight": "227 g", "color": "green", "spoils_in": "5 days 20 hours", "container": "bowl_plastic", @@ -569,7 +569,7 @@ "id": "dried_salad", "name": "dried salad", "copy-from": "veggy_salad", - "weight": 150, + "weight": "150 g", "spoils_in": "360 days", "container": "box_small", "quench": -2, @@ -621,7 +621,7 @@ "id": "sushi_rice", "name": "sushi rice", "name_plural": "sushi rice", - "weight": 55, + "weight": "55 g", "color": "white", "spoils_in": "3 days", "comestible_type": "FOOD", @@ -642,7 +642,7 @@ "id": "onigiri", "name": "onigiri", "name_plural": "onigiri", - "weight": 99, + "weight": "99 g", "color": "white", "spoils_in": "1 day 12 hours", "comestible_type": "FOOD", @@ -663,7 +663,7 @@ "id": "sushi_veggyroll", "name": "vegetable hosomaki", "name_plural": "vegetable hosomaki", - "weight": 312, + "weight": "312 g", "color": "green", "spoils_in": "1 day 12 hours", "comestible_type": "FOOD", @@ -695,7 +695,7 @@ "id": "sauerkraut", "name": "sauerkraut", "name_plural": "sauerkraut", - "weight": 255, + "weight": "255 g", "color": "green", "spoils_in": "30 days", "container": "jar_glass", @@ -715,7 +715,7 @@ "type": "COMESTIBLE", "id": "nopalitos", "name": "nopalito", - "weight": 200, + "weight": "200 g", "color": "green", "spoils_in": "10 days", "symbol": "%", diff --git a/data/json/items/comestibles/wheat.json b/data/json/items/comestibles/wheat.json index 65b82319025b9..105b6af60c5cf 100644 --- a/data/json/items/comestibles/wheat.json +++ b/data/json/items/comestibles/wheat.json @@ -3,7 +3,7 @@ "type": "COMESTIBLE", "id": "cereal2", "name": "wheat cereal", - "weight": 52, + "weight": "52 g", "color": "yellow", "spoils_in": "90 days", "stim": 4, @@ -27,7 +27,7 @@ "id": "wheat", "name": "wheat", "name_plural": "wheat", - "weight": 203, + "weight": "203 g", "color": "brown", "comestible_type": "FOOD", "symbol": ",", @@ -47,7 +47,7 @@ "id": "spaghetti_raw", "name": "raw spaghetti pasta", "name_plural": "raw spaghetti pasta", - "weight": 60, + "weight": "60 g", "color": "yellow", "spoils_in": "360 days", "container": "box_small", @@ -68,7 +68,7 @@ "name": "raw lasagne pasta", "name_plural": "raw lasagne pasta", "spoils_in": "360 days", - "weight": 60, + "weight": "60 g", "color": "yellow", "container": "box_small", "comestible_type": "FOOD", @@ -87,7 +87,7 @@ "id": "spaghetti_cooked", "name": "boiled noodles", "name_plural": "boiled noodles", - "weight": 148, + "weight": "148 g", "color": "yellow", "spoils_in": "20 hours", "container": "box_small", @@ -107,7 +107,7 @@ "id": "macaroni_raw", "name": "raw macaroni", "name_plural": "raw macaroni", - "weight": 60, + "weight": "60 g", "color": "yellow", "spoils_in": "360 days", "container": "box_small", @@ -127,7 +127,7 @@ "id": "macaroni_cooked", "name": "mac & cheese", "name_plural": "mac & cheese", - "weight": 209, + "weight": "209 g", "color": "yellow", "spoils_in": "10 hours", "container": "box_small", @@ -148,7 +148,7 @@ "id": "flour", "name": "flour", "name_plural": "flour", - "weight": 13, + "weight": "13 g", "color": "white", "spoils_in": "360 days", "container": "box_small", @@ -169,7 +169,7 @@ "type": "COMESTIBLE", "id": "oatmeal", "name": "oatmeal", - "weight": 25, + "weight": "25 g", "color": "light_gray", "spoils_in": "360 days", "container": "box_small", @@ -191,7 +191,7 @@ "id": "oats", "name": "oats", "name_plural": "oats", - "weight": 86, + "weight": "86 g", "color": "brown", "comestible_type": "FOOD", "symbol": ",", @@ -210,7 +210,7 @@ "type": "COMESTIBLE", "id": "oatmeal_cooked", "name": "cooked oatmeal", - "weight": 247, + "weight": "247 g", "color": "light_gray", "spoils_in": "10 days", "comestible_type": "FOOD", @@ -229,7 +229,7 @@ "type": "COMESTIBLE", "id": "oatmeal_deluxe", "name": "deluxe cooked oatmeal", - "weight": 164, + "weight": "164 g", "color": "light_gray", "spoils_in": "10 days", "comestible_type": "FOOD", @@ -250,7 +250,7 @@ "id": "pancakes", "name": "pancake", "name_plural": "pancakes", - "weight": 40, + "weight": "40 g", "color": "brown", "spoils_in": "10 days", "comestible_type": "FOOD", @@ -273,7 +273,7 @@ "copy-from": "pancakes", "name": "fruit pancake", "name_plural": "fruit pancakes", - "weight": 80, + "weight": "80 g", "color": "brown", "calories": 217, "description": "Fluffy and delicious pancakes with real maple syrup, made sweeter and healthier with the addition of wholesome fruit.", @@ -286,7 +286,7 @@ "id": "frenchtoast", "name": "French toast", "name_plural": "French toasts", - "weight": 42, + "weight": "42 g", "color": "brown", "spoils_in": "10 days", "comestible_type": "FOOD", @@ -307,7 +307,7 @@ "type": "COMESTIBLE", "id": "waffles", "name": "waffle", - "weight": 75, + "weight": "75 g", "color": "yellow", "spoils_in": "10 days", "comestible_type": "FOOD", @@ -326,7 +326,7 @@ "type": "COMESTIBLE", "id": "fruit_waffles", "name": "fruit waffle", - "weight": 156, + "weight": "156 g", "color": "yellow", "spoils_in": "10 days", "comestible_type": "FOOD", @@ -346,7 +346,7 @@ "type": "COMESTIBLE", "id": "crackers", "name": "cracker", - "weight": 56, + "weight": "56 g", "color": "brown", "spoils_in": "90 days", "container": "box_small", @@ -367,7 +367,7 @@ "type": "COMESTIBLE", "id": "pie", "name": "fruit pie", - "weight": 125, + "weight": "125 g", "color": "brown", "spoils_in": "3 days", "stim": 2, @@ -391,7 +391,7 @@ "type": "COMESTIBLE", "id": "pizza_cheese", "name": "cheese pizza", - "weight": 170, + "weight": "170 g", "color": "yellow", "spoils_in": "2 days", "stim": 1, @@ -413,7 +413,7 @@ "type": "COMESTIBLE", "id": "granola", "name": "granola", - "weight": 32, + "weight": "32 g", "color": "brown", "spoils_in": "180 days", "container": "bag_plastic", @@ -436,7 +436,7 @@ "type": "COMESTIBLE", "id": "pie_maple", "name": "maple pie", - "weight": 74, + "weight": "74 g", "color": "brown", "spoils_in": "3 days", "stim": 2, @@ -461,7 +461,7 @@ "id": "noodles_fast", "name": "fast noodles", "name_plural": "fast noodles", - "weight": 81, + "weight": "81 g", "color": "yellow", "spoils_in": "360 days", "container": "bag_plastic", @@ -480,7 +480,7 @@ "type": "COMESTIBLE", "id": "cloutie_dumpling", "name": "cloutie dumpling", - "weight": 91, + "weight": "91 g", "color": "brown", "spoils_in": "2 days", "container": "box_small", @@ -500,7 +500,7 @@ "type": "COMESTIBLE", "id": "brioche", "name": "brioche", - "weight": 77, + "weight": "77 g", "color": "brown", "spoils_in": "10 days", "container": "box_small", @@ -525,7 +525,7 @@ "name": "sponge cake", "description": "Plain, fluffy cake for the proletariat.", "container": "box_small", - "weight": 68, + "weight": "68 g", "volume": "750 ml", "price": 5000, "charges": 4, @@ -553,7 +553,7 @@ "name": "brownie", "copy-from": "sponge_cake", "description": "A rich chocolate brownie, just like how grandma used to bake them.", - "weight": 45, + "weight": "45 g", "calories": 292, "fun": 7 }, diff --git a/data/json/items/containers.json b/data/json/items/containers.json index 931b41e1c3fda..c3ead892eff5c 100644 --- a/data/json/items/containers.json +++ b/data/json/items/containers.json @@ -5,7 +5,7 @@ "category": "clothing", "name": "2.5L canteen", "description": "A large plastic water canteen, with a 2.5 liter capacity and carrying strap.", - "weight": 155, + "weight": "155 g", "volume": "2500 ml", "price": 1000, "to_hit": -1, @@ -25,7 +25,7 @@ "category": "other", "name": "30 gallon barrel", "description": "A huge plastic barrel with a resealable lid.", - "weight": 6800, + "weight": "6800 g", "volume": "112500 ml", "price": 5000, "to_hit": -5, @@ -45,7 +45,7 @@ "name": "steel drum (100L)", "name_plural": "steel drums (100L)", "description": "A huge steel barrel with a resealable lid.", - "weight": 12000, + "weight": "12000 g", "volume": "100 L", "price": 8000, "to_hit": -5, @@ -65,7 +65,7 @@ "name": "steel drum (200L)", "name_plural": "steel drums (200L)", "description": "A massive steel barrel with a resealable lid.", - "weight": 20000, + "weight": "20000 g", "volume": "200 L", "price": 10000, "to_hit": -5, @@ -84,7 +84,7 @@ "category": "other", "name": "canvas sack", "description": "A large and sturdy canvas sack. Smells faintly of earth and hard work.", - "weight": 415, + "weight": "415 g", "volume": "1 L", "price": 0, "to_hit": -5, @@ -101,7 +101,7 @@ "category": "other", "name": "canvas bag", "description": "Small bag made of canvas. Looks fine to store dried herbs in.", - "weight": 5, + "weight": "5 g", "volume": "250 ml", "price": 0, "to_hit": -5, @@ -118,7 +118,7 @@ "category": "other", "name": "plastic bag", "description": "A small, open plastic bag. Essentially trash.", - "weight": 2, + "weight": "2 g", "volume": 0, "price": 0, "to_hit": -1, @@ -136,7 +136,7 @@ "name": "zipper bag", "looks_like": "bag_plastic", "description": "An inexpensive flexible rectangular storage bag on its typical small size. Transparent and made of plastic, it can be sealed and opened by a slider which works in a similar way to a zip fastener.", - "weight": 2, + "weight": "2 g", "volume": 0, "price": 0, "rigid": false, @@ -154,7 +154,7 @@ "name": "body bag", "looks_like": "bag_canvas", "description": "A large, human size, rectangular bag made of strong plastic, with a zipper in the middle. Used to hold a dead body.", - "weight": 500, + "weight": "500 g", "volume": "1 L", "price": 0, "to_hit": -5, @@ -171,7 +171,7 @@ "category": "other", "name": "glass bottle", "description": "A resealable glass bottle, holds 750 ml of liquid.", - "weight": 200, + "weight": "200 g", "volume": "750 ml", "price": 0, "to_hit": 1, @@ -190,7 +190,7 @@ "category": "other", "name": "plastic bottle", "description": "A resealable plastic bottle, holds 500 ml of liquid.", - "weight": 13, + "weight": "13 g", "volume": "500 ml", "price": 0, "to_hit": 1, @@ -207,7 +207,7 @@ "category": "other", "name": "small plastic bottle", "description": "A resealable plastic bottle, holds 250 ml of liquid.", - "weight": 7, + "weight": "7 g", "volume": "250 ml", "price": 0, "to_hit": 1, @@ -224,7 +224,7 @@ "category": "other", "name": "large plastic bottle", "description": "It's a two-liter plastic bottle that can hold a lot of soda, or, nowadays, boiled water.", - "weight": 13, + "weight": "13 g", "volume": "2 L", "price": 25, "price_postapoc": 500, @@ -241,7 +241,7 @@ "category": "other", "name": "clay bowl", "description": "A clay bowl with a waterproofed hide lid. Can be used as a container or as a tool. Holds 250 ml of liquid.", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "price": 100, "to_hit": -1, @@ -260,7 +260,7 @@ "name": "pack", "name_plural": "packs", "description": "SURGEON GENERAL'S WARNING: Smoking Causes Lung Cancer, Heart Disease, Emphysema And May Complicate Pregnancy.", - "weight": 15, + "weight": "15 g", "volume": "250 ml", "price": 0, "material": "paper", @@ -275,7 +275,7 @@ "name": "small cardboard box", "name_plural": "small cardboard boxes", "description": "A small cardboard box. No bigger than a foot in dimension.", - "weight": 151, + "weight": "151 g", "volume": "1 L", "price": 0, "material": "paper", @@ -290,7 +290,7 @@ "name": "cardboard box", "name_plural": "cardboard boxes", "description": "A sturdy cardboard box, about the size of a banana box. Great for packing.", - "weight": 850, + "weight": "850 g", "volume": "2 L", "//": "Volume is much lower than the actual volume of a box this size because presumably if it's in your pack, it isn't empty and full of air; and if it's in your hands, it's irrelevant what the volume is.", "price": 0, @@ -306,7 +306,7 @@ "name": "large cardboard box", "name_plural": "large cardboard boxes", "description": "A very large cardboard box, the sort children would have loved to hide in, when there were still children.", - "weight": 1250, + "weight": "1250 g", "volume": "3 L", "//": "Volume is much lower than the actual volume of a box this size because presumably if it's in your pack, it isn't empty and full of air; and if it's in your hands, it's irrelevant what the volume is.", "price": 0, @@ -323,7 +323,7 @@ "name": "bucket", "name_plural": "buckets", "description": "A galvanized bucket for peanuts, chilled wine, iced beer, lobster, crab legs, French fries, animal feed, farm use, tailgating, crafts, planting flowers, holding gift baskets, containing a fruit basket and herbs, loose item storage or as an ice bucket.", - "weight": 725, + "weight": "725 g", "volume": "5 L", "price": 300, "material": "steel", @@ -339,7 +339,7 @@ "category": "other", "name": "hydration pack", "description": "A slim and lightweight insulated plastic bladder worn on the back. It has a large pocket and a capped mouth for filling with liquid with a hose that allows the wearer to drink hands-free.", - "weight": 286, + "weight": "286 g", "volume": "2500 ml", "price": 10000, "to_hit": -1, @@ -359,7 +359,7 @@ "category": "other", "name": "aluminum can", "description": "An aluminum can, like what soda comes in.", - "weight": 13, + "weight": "13 g", "volume": "250 ml", "price": 0, "to_hit": -3, @@ -390,7 +390,7 @@ "category": "other", "name": "paper carton", "description": "A half gallon carton constructed of a paper, aluminum and plastic laminate. It has a threaded cap for easy resealing.", - "weight": 28, + "weight": "28 g", "volume": "2 L", "price": 0, "to_hit": 1, @@ -422,7 +422,7 @@ "category": "other", "name": "vacuum-packed bag", "description": "This is a bag of vacuum-packed food.", - "weight": 2, + "weight": "2 g", "volume": 0, "contains": "500 ml", "price": 0, @@ -440,7 +440,7 @@ "category": "other", "name": "tin can", "description": "A tin can, like what beans come in.", - "weight": 40, + "weight": "40 g", "volume": "250 ml", "price": 0, "material": "steel", @@ -469,7 +469,7 @@ "category": "clothing", "name": "plastic canteen", "description": "A military-style water canteen with a 1.5 liter capacity. Commonly worn at the hip.", - "weight": 155, + "weight": "155 g", "volume": "1500 ml", "price": 800, "to_hit": 1, @@ -489,7 +489,7 @@ "name": "thermos", "name_plural": "thermoses", "description": "A Thermos brand vacuum flask. Built for temperature retention, helps keep things hot or cold. Contains 1L of liquid.", - "weight": 530, + "weight": "530 g", "price": 1595, "volume": "1250 ml", "contains": "1 L", @@ -506,7 +506,7 @@ "category": "other", "name": "clay canister", "description": "A fragile clay vessel. It can be used to make crude impact grenades or to store liquid.", - "weight": 268, + "weight": "268 g", "volume": "250 ml", "price": 1000, "to_hit": 1, @@ -524,7 +524,7 @@ "category": "other", "name": "clay hydria", "description": "A 15-liter clay pot with three handles for carrying and for pouring.", - "weight": 1955, + "weight": "1955 g", "volume": "15 L", "price": 2000, "to_hit": -1, @@ -543,7 +543,7 @@ "category": "other", "name": "large clay pot", "description": "A bulky and heavy clay pot with a waterproofed hide lid, meant to store water, but can carry other liquids in a pinch.", - "weight": 4887, + "weight": "4887 g", "volume": "37500 ml", "price": 10000, "to_hit": -2, @@ -561,7 +561,7 @@ "category": "other", "name": "plastic cup", "description": "A small, vacuum formed cup.", - "weight": 6, + "weight": "6 g", "volume": "250 ml", "price": 0, "to_hit": 1, @@ -589,7 +589,7 @@ "category": "other", "name": "glass flask", "description": "A 250 ml laboratory conical flask, with a rubber bung.", - "weight": 48, + "weight": "48 g", "volume": "250 ml", "price": 400, "to_hit": 1, @@ -608,7 +608,7 @@ "category": "other", "name": "test tube", "description": "A 10ml laboratory cylindrical test tube, with a rubber stopper.", - "weight": 36, + "weight": "36 g", "volume": "10ml", "price": 300, "to_hit": -1, @@ -627,7 +627,7 @@ "category": "other", "name": "beaker", "description": "A 250ml laboratory beaker. Basically a cup with delusions of grandeur.", - "weight": 150, + "weight": "150 g", "volume": "250ml", "price": 500, "to_hit": -1, @@ -645,7 +645,7 @@ "category": "other", "name": "graduated cylinder", "description": "A tall, narrow glass cylinder with precise markings for measuring fluid quantities. An important science tool, it is also useful for anal retentive chefs.", - "weight": 150, + "weight": "150 g", "volume": "100ml", "price": 500, "to_hit": -1, @@ -663,7 +663,7 @@ "category": "other", "name": "microcentrifuge tube", "description": "These plastic tubes, with little built in snap-caps, are a great way to store a tiny amount of liquid. Great for jello shooters if 1mL is enough for a shot for you. Cool people call these \"eppies\".", - "weight": 1, + "weight": "1 g", "volume": "1ml", "price": 10, "to_hit": -1, @@ -681,7 +681,7 @@ "category": "clothing", "name": "hip flask", "description": "A 250 ml metal flask with a hinged screw-on lid, commonly used to discreetly transport alcohol.", - "weight": 120, + "weight": "120 g", "volume": "250 ml", "price": 1000, "to_hit": 1, @@ -701,7 +701,7 @@ "type": "CONTAINER", "name": "3L glass jar", "description": "A three-liter glass jar with a metal screw top lid, used for canning.", - "weight": 365, + "weight": "365 g", "volume": "3 L", "price": 0, "to_hit": -1, @@ -733,7 +733,7 @@ "category": "other", "name": "glass jar", "description": "A half-liter glass jar with a metal screw top lid, used for canning.", - "weight": 150, + "weight": "150 g", "volume": "500 ml", "price": 0, "bashing": 4, @@ -764,7 +764,7 @@ "category": "other", "name": "plastic jerrycan", "description": "A bulky plastic jerrycan, meant to carry fuel, but can carry other liquids in a pinch.", - "weight": 1587, + "weight": "1587 g", "volume": "10L", "price": 1250, "to_hit": -2, @@ -781,7 +781,7 @@ "category": "other", "name": "steel jerrycan", "description": "A steel jerrycan, meant to carry fuel, but can carry other liquids in a pinch.", - "weight": 4815, + "weight": "4815 g", "volume": "20L", "price": 5000, "to_hit": -3, @@ -800,7 +800,7 @@ "category": "other", "name": "clay jug", "description": "A clay container with a lid, used to hold and pour liquids.", - "weight": 400, + "weight": "400 g", "volume": "1 L", "price": 100, "bashing": 1, @@ -818,7 +818,7 @@ "category": "other", "name": "gallon jug", "description": "A standard plastic jug used for milk and household cleaning chemicals.", - "weight": 190, + "weight": "190 g", "volume": "3750 ml", "price": 0, "to_hit": 1, @@ -835,7 +835,7 @@ "category": "other", "name": "aluminum keg", "description": "A reusable lightweight aluminum keg, used for shipping beer. It has a capacity of 50 liters.", - "weight": 5040, + "weight": "5040 g", "volume": "50 L", "price": 10000, "to_hit": -5, @@ -854,7 +854,7 @@ "category": "other", "name": "steel keg", "description": "A reusable heavy steel keg, used for shipping beer. It has a capacity of 50 liters.", - "weight": 12600, + "weight": "12600 g", "volume": "50 L", "price": 8000, "to_hit": -5, @@ -873,7 +873,7 @@ "category": "other", "name": "large sealed stomach", "description": "The stomach of a large creature, cleaned and sealed with strings. It can hold 3 liters of water.", - "weight": 783, + "weight": "783 g", "volume": "500 ml", "price": 4000, "to_hit": -1, @@ -893,7 +893,7 @@ "name": "metal tank (60L)", "name_plural": "metal tanks (60L)", "description": "A large metal tank for holding liquids. Useful for crafting.", - "weight": 5668, + "weight": "5668 g", "volume": "60L", "price": 10000, "to_hit": -4, @@ -913,7 +913,7 @@ "name": "metal tank (2L)", "name_plural": "metal tanks (2L)", "description": "A small metal tank for gas or liquids. Useful for crafting.", - "weight": 800, + "weight": "800 g", "volume": "2L", "price": 1000, "to_hit": -4, @@ -932,7 +932,7 @@ "category": "clothing", "name": "wooden canteen", "description": "A water canteen made from wood, secured by metal bands and sealed with wax or pitch. Holds 1.5 liters and has a simple carry strap.", - "weight": 232, + "weight": "232 g", "volume": "1750 ml", "price": 800, "to_hit": 1, @@ -951,7 +951,7 @@ "category": "other", "name": "sealed stomach", "description": "The stomach of a creature, cleaned and sealed with a string. It can hold 1.5 liters of water.", - "weight": 453, + "weight": "453 g", "volume": "250 ml", "price": 2000, "to_hit": -1, @@ -970,7 +970,7 @@ "category": "clothing", "name": "small waterskin", "description": "A small watertight leather bag with a carrying strap, can hold 1.5 liters of water.", - "weight": 453, + "weight": "453 g", "volume": "250 ml", "price": 2000, "to_hit": -1, @@ -991,7 +991,7 @@ "category": "clothing", "name": "waterskin", "description": "A watertight leather bag with a carrying strap, can hold 3 liters of water.", - "weight": 783, + "weight": "783 g", "volume": "500 ml", "price": 4000, "to_hit": -1, @@ -1012,7 +1012,7 @@ "category": "clothing", "name": "large waterskin", "description": "A large watertight leather bag with a carrying strap, can hold 5 liters of water.", - "weight": 990, + "weight": "990 g", "volume": "750 ml", "price": 6000, "to_hit": -1, @@ -1033,7 +1033,7 @@ "category": "other", "name": "wooden barrel", "description": "Traditionally made of white oak; these vessels are known for delivering delicious whiskey to the future. It has a capacity of 100 liters.", - "weight": 42408, + "weight": "42408 g", "volume": "100 L", "price": 12000, "to_hit": -5, @@ -1052,7 +1052,7 @@ "category": "other", "name": "paper wrapper", "description": "Just a piece of butcher's paper. Good for starting fires.", - "weight": 3, + "weight": "3 g", "volume": 0, "price": 0, "to_hit": -2, @@ -1069,7 +1069,7 @@ "category": "other", "name": "styrofoam cup", "description": "A cheap, disposable cup with a plastic lid and straw.", - "weight": 50, + "weight": "50 g", "volume": "500 ml", "price": 0, "material": "plastic", @@ -1085,7 +1085,7 @@ "category": "other", "name": "plastic tub", "description": "A big, square plastic bucket usually used for carrying ice cream.", - "weight": 1360, + "weight": "1360 g", "volume": "4 L", "price": 10, "price_postapoc": 100, @@ -1102,7 +1102,7 @@ "category": "other", "name": "condom", "description": "A gentleman's balloon. A single use life preventer. A thumbless latex mitten. This could be used as a makeshift water container, but otherwise it's anyone's guess what it's for.", - "weight": 5, + "weight": "5 g", "volume": 0, "price": 0, "to_hit": -5, @@ -1121,7 +1121,7 @@ "category": "other", "name": "large tin can", "description": "A large tin can, like what beans come in. Holds a substantial amount of food.", - "weight": 350, + "weight": "350 g", "volume": "3L", "price": 0, "material": "steel", diff --git a/data/json/items/corpses.json b/data/json/items/corpses.json new file mode 100644 index 0000000000000..e5e0803afa2eb --- /dev/null +++ b/data/json/items/corpses.json @@ -0,0 +1,167 @@ +[ + { + "type": "GENERIC", + "id": "corpse", + "symbol": "%", + "color": "white", + "name": "corpse", + "description": "A dead body.", + "//": "most of the properties depend on the monster type and are created at runtime!", + "price": 0, + "volume": 0, + "flags": [ "NO_UNLOAD", "TRADER_AVOID", "CORPSE" ] + }, + { + "type": "GENERIC", + "id": "rmi2_corpse", + "symbol": "%", + "color": "white", + "name": "desiccated corpse", + "description": "A badly mangled and desiccated partial corpse. It seems whatever thing killed him did so with a single swipe of a gigantic claw.", + "category": "other", + "material": "hflesh", + "price": 0, + "volume": "7500 ml", + "flags": [ "TRADER_AVOID" ] + }, + { + "type": "GENERIC", + "id": "corpse_generic_male", + "copy-from": "corpse", + "name": "corpse", + "description": "A dead body of a middle-aged man.", + "looks_like": "corpse", + "material": "hflesh" + }, + { + "type": "GENERIC", + "id": "corpse_generic_female", + "copy-from": "corpse", + "name": "corpse", + "description": "A dead body of a young woman.", + "looks_like": "corpse", + "volume": "40000 ml", + "weight": "52000 g", + "material": "hflesh" + }, + { + "type": "GENERIC", + "id": "corpse_generic_boy", + "copy-from": "corpse", + "name": "corpse", + "description": "A dead body of a little boy.", + "looks_like": "corpse", + "material": "hflesh" + }, + { + "type": "GENERIC", + "id": "corpse_generic_girl", + "copy-from": "corpse", + "name": "corpse", + "description": "A dead body of a little girl.", + "looks_like": "corpse", + "material": "hflesh" + }, + { + "type": "GENERIC", + "id": "corpse_child_calm", + "copy-from": "corpse", + "name": "corpse", + "description": "Facial expression of this child is surprisingly calm. It seems that he died instantly and most probably didn't even know that he is dying. You could even say he's a lucky to die this way in this crazy world.", + "looks_like": "corpse", + "volume": "30000 ml", + "weight": "40750 g", + "material": "hflesh" + }, + { + "type": "GENERIC", + "id": "corpse_child_gunned", + "copy-from": "corpse", + "name": "corpse", + "description": "You can't even say for sure if it's a boy or a girl because the body of this poor little creature has been literally riddled by bullets. It's beyond your understanding what kind of a monster could have done this to a child.", + "looks_like": "corpse", + "volume": "30000 ml", + "weight": "40750 g", + "material": "hflesh" + }, + { + "type": "GENERIC", + "id": "corpse_oldwoman_jewelry", + "copy-from": "corpse", + "name": "corpse", + "description": "A dead body of a old woman. You notice that both of her earlobes are torn, and several fingers on both of her hands are chopped off, and she is missing many teeth in her mouth, and her bloodied lips are smashed. It seems that someone naive is thinking that jewelry still worth something even after the Cataclysm.", + "looks_like": "corpse", + "volume": "40000 ml", + "weight": "52000 g", + "material": "hflesh" + }, + { + "type": "GENERIC", + "id": "corpse_bloody", + "copy-from": "corpse", + "name": "corpse", + "description": "A dead body lying in the puddle of its own blood.", + "looks_like": "corpse", + "material": "hflesh" + }, + { + "type": "GENERIC", + "id": "corpse_painful", + "copy-from": "corpse", + "name": "corpse", + "description": "It's hard to tell how exactly did this person die, but judging from his twisted body and frightful grimace, it was a really painful death.", + "looks_like": "corpse", + "material": "hflesh" + }, + { + "type": "GENERIC", + "id": "corpse_scorched", + "copy-from": "corpse", + "name": "corpse", + "description": "An awful mass of charred flesh. You're not even sure if it's a man or a woman. Judging by the stain of vaporized blood next to the body, they probably were shot prior to the burning.", + "looks_like": "corpse", + "material": "hflesh" + }, + { + "type": "GENERIC", + "id": "corpse_stabbed", + "copy-from": "corpse", + "name": "corpse", + "description": "A dead body with a big hole in the back of its neck. Looks like someone backstabbed this fellow. You can only guess whether he deserved it.", + "looks_like": "corpse", + "material": "hflesh" + }, + { + "type": "GENERIC", + "id": "corpse_gunned", + "copy-from": "corpse", + "name": "corpse", + "description": "One might say that face of this woman is devoid of flaws. That could be true if there wasn't this big ugly hole right in the center of her forehead, and even bigger hole in the back of her head.", + "looks_like": "corpse", + "volume": "40000 ml", + "weight": "52000 g", + "material": "hflesh" + }, + { + "type": "GENERIC", + "id": "corpse_halved_upper", + "copy-from": "corpse", + "name": "corpse", + "description": "An upper half of someone's body. Looks like its lower half has been brutally torn away by someone or something with enormous force. Some remnants of its wrecked bowels are still attached to the body. Everything else below the waistline is missing.", + "looks_like": "corpse", + "volume": "30000 ml", + "weight": "40000 g", + "material": "hflesh" + }, + { + "type": "GENERIC", + "id": "corpse_half_beheaded", + "copy-from": "corpse", + "name": "corpse", + "description": "The remains of lower jaw and cheeks are still visible on this half-decapitated body. Looks like half of its head has been torn off after hit of a high-caliber bullet. Or maybe it was bit off by some huge beast?", + "looks_like": "corpse", + "volume": "57000 ml", + "weight": "78000 g", + "material": "hflesh" + } +] diff --git a/data/json/items/corpses/inactive_bots.json b/data/json/items/corpses/inactive_bots.json index 83b7d997cbfed..0bb10dc18ec18 100644 --- a/data/json/items/corpses/inactive_bots.json +++ b/data/json/items/corpses/inactive_bots.json @@ -4,7 +4,7 @@ "type": "TOOL", "name": "inactive EMP hack", "description": "This is an inactive EMP hack. EMP hacks are fist-sized robots that fly through the air. This one contains a EMP grenade and attacks by flying at its target and detonating. Use this item to reprogram and release the EMP hack. Electronics and computer skill determines if the targeting matrix is reprogrammed successfully.", - "weight": 4700, + "weight": "4700 g", "volume": "750 ml", "price": 64500, "to_hit": -3, @@ -30,7 +30,7 @@ "type": "TOOL", "name": "inactive C-4 hack", "description": "This is an inactive C-4 hack. C-4 hacks are fist-sized robots that fly through the air. This one contains some C-4 and attacks by flying at its target and detonating. Use this item to reprogram and activate the C-4 hack. Electronics and computer skill determines if the targeting matrix is reprogrammed successfully.", - "weight": 5870, + "weight": "5870 g", "volume": "250 ml", "price": 67500, "to_hit": -3, @@ -56,7 +56,7 @@ "type": "TOOL", "name": "inactive flashbang hack", "description": "This is an inactive flashbang hack. Flashbang hacks are fist-sized robots that fly through the air. This one contains a flashbang and attacks by flying at its target and detonating. Use this item to reprogram and activate the flashbang hack. Electronics and computer skill determines if the targeting matrix is reprogrammed successfully.", - "weight": 4536, + "weight": "4536 g", "volume": "750 ml", "price": 59500, "to_hit": -3, @@ -82,7 +82,7 @@ "type": "TOOL", "name": "inactive tear gas hack", "description": "This is an inactive tear gas hack. Tear gas hacks are fist-sized robots that fly through the air. This one contains a tear gas canister and attacks by flying at its target and releasing tear gas. Use this item to reprogram and activate the tear gas hack. Electronics and computer skill determines if the targeting matrix is reprogrammed successfully.", - "weight": 5360, + "weight": "5360 g", "volume": "750 ml", "price": 60500, "to_hit": -3, @@ -108,7 +108,7 @@ "type": "TOOL", "name": "inactive grenade hack", "description": "This is an inactive grenade hack. Grenade hacks are fist-sized robots that fly through the air. This one contains a grenade and attacks by flying at its target and detonating. Use this item to reprogram and activate the grenade hack. Electronics and computer skill determines if the targeting matrix is reprogrammed successfully.", - "weight": 4480, + "weight": "4480 g", "volume": "250 ml", "price": 60000, "to_hit": -3, @@ -134,7 +134,7 @@ "type": "TOOL", "name": "inactive laser turret", "description": "This is an inactive laser turret. Using this item involves turning it on and placing it on the ground, where it will attach itself. If reprogrammed and rewired successfully the turret will identify you as a friendly, and attack all enemies with its revolving laser cannons. It requires sunlight in order to fire.", - "weight": 1450, + "weight": "1450 g", "volume": "3 L", "price": 600000, "to_hit": -3, @@ -154,9 +154,9 @@ { "id": "bot_antimateriel", "type": "TOOL", - "name": "inactive anti-materiel turret", - "description": "This is an inactive anti-materiel turret. Using this item involves loading the unit with the factory-loaded .50 BMG Ball rounds in your inventory (if you wish to divide your ammunition, set aside whatever .50 BMG Ball you do NOT want to give the turret) turning it on, and placing it on the ground, where it will attach itself. If reprogrammed and rewired successfully the turret will identify you as a friendly, and attack all enemies with a built-in rifle.", - "weight": 1550, + "name": "inactive M2HB autonomous CROWS II", + "description": "This is an inactive turret. Using this item involves loading the unit with the factory-loaded .50 BMG rounds in your inventory (if you wish to divide your ammunition, set aside whatever .50 BMG rounds you do NOT want to give the turret) turning it on, and placing it on the ground, where it will attach itself. If programmed successfully the turret will then identify you as a friendly, and attack all enemies with its M2HB.", + "weight": "1550 g", "volume": "3500 ml", "price": 500500, "to_hit": -3, @@ -178,7 +178,7 @@ "type": "TOOL", "name": "inactive manhack", "description": "This is an inactive manhack. Manhacks are fist-sized robots that fly through the air. They are covered with whirring blades and attack by throwing themselves against their target. Use this item to reprogram and activate the manhack. Electronics and computer skill determines if the targeting matrix is reprogrammed successfully.", - "weight": 5400, + "weight": "5400 g", "volume": "750 ml", "price": 60000, "to_hit": -3, @@ -204,7 +204,7 @@ "type": "TOOL", "name": "inactive mininuke hack", "description": "This is an inactive mininuke hack. Many times as large as a normal manhack, a mininuke hack contains a mininuke and attack by flying at their target and detonating. Use this item to reprogram and activate the mininuke hack. Electronics and computer skill determines if the targeting matrix is reprogrammed successfully.", - "weight": 25000, + "weight": "25000 g", "volume": "18750 ml", "price": 2677500, "to_hit": -3, @@ -228,9 +228,9 @@ { "id": "bot_rifleturret", "type": "TOOL", - "name": "inactive rifle turret", - "description": "This is an inactive turret. Using this item involves loading the unit with the factory-loaded 5.56 NATO rounds in your inventory (if you wish to divide your ammunition, set aside whatever 5.56 you do NOT want to give the turret) turning it on, and placing it on the ground, where it will attach itself. If reprogrammed and rewired successfully the turret will then identify you as a friendly, and attack all enemies with a built-in rifle.", - "weight": 1507, + "name": "inactive autonomous M249 CROWS II", + "description": "This is an inactive turret. Using this item involves loading the unit with the factory-loaded 5.56x45mm rounds in your inventory (if you wish to divide your ammunition, set aside whatever 5.56x45mm rounds you do NOT want to give the turret) turning it on, and placing it on the ground, where it will attach itself. If programmed successfully the turret will then identify you as a friendly, and attack all enemies with its M249.", + "weight": "1507 g", "volume": "3500 ml", "price": 500000, "to_hit": -3, @@ -247,12 +247,34 @@ "skill2": "computer" } }, + { + "id": "bot_crows_m240", + "type": "TOOL", + "name": "inactive autonomous M240 CROWS II", + "description": "This is an inactive turret. Using this item involves loading the unit with the factory-loaded 7.62x51mm rounds in your inventory (if you wish to divide your ammunition, set aside whatever 7.62x51mm rounds you do NOT want to give the turret) turning it on, and placing it on the ground, where it will attach itself. If programmed successfully the turret will then identify you as a friendly, and attack all enemies with its M240.", + "weight": "1507 g", + "volume": "3500 ml", + "price": 500000, + "to_hit": -3, + "bashing": 8, + "material": [ "steel", "plastic" ], + "symbol": ";", + "color": "green", + "use_action": { + "type": "place_monster", + "monster_id": "mon_crows_m240", + "difficulty": 6, + "moves": 100, + "skill1": "electronics", + "skill2": "computer" + } + }, { "id": "bot_turret", "type": "TOOL", "name": "inactive turret", - "description": "This is an inactive turret. Using this item involves loading the unit with the factory-loaded 9x19mm rounds in your inventory (if you wish to divide your ammunition, set aside whatever 9x19mm you do NOT want to give the turret) turning it on, and placing it on the ground, where it will attach itself. If reprogrammed and rewired successfully the turret will then identify you as a friendly, and attack all enemies with a built-in SMG.", - "weight": 1507, + "description": "This is an inactive turret. Using this item involves loading the unit with the factory-loaded 9x19mm rounds in your inventory (if you wish to divide your ammunition, set aside whatever 9x19mm you do NOT want to give the turret) turning it on, and placing it on the ground. If reprogrammed and rewired successfully the turret will then identify you as a friendly, and attack all enemies with its SMG.", + "weight": "1507 g", "volume": "3 L", "price": 400000, "to_hit": -3, @@ -272,9 +294,9 @@ { "id": "bot_secubot", "type": "TOOL", - "name": "inactive security bot", - "description": "This is an inactive security bot. Using this item involves loading the unit with the factory-loaded 9x19mm rounds in your inventory (if you wish to divide your ammunition, set aside whatever 9x19mm you do NOT want to give the robot) turning it on, and placing it on the ground. If reprogrammed and rewired successfully the security bot will then identify you as a friendly, roam around or follow you, and attack all enemies with a built-in SMG.", - "weight": 40750, + "name": "inactive TALON UGV", + "description": "This is an inactive TALON UGV equipped with an M16A4. Using this item involves loading the unit with the factory-loaded 5.56x45mm rounds in your inventory (if you wish to divide your ammunition, set aside whatever 5.56x45mm you do NOT want to give the robot) turning it on, and placing it on the ground. If reprogrammed and rewired successfully the security bot will then identify you as a friendly, roam around or follow you, and attack all enemies with its rifle.", + "weight": "40750 g", "volume": "30 L", "price": 750000, "to_hit": -3, @@ -293,13 +315,37 @@ "skill2": "computer" } }, + { + "id": "bot_talon_m202a1", + "type": "TOOL", + "name": "inactive M202A1 TALON UGV", + "description": "This is an inactive TALON UGV equipped with an M202A1. Using this item involves loading the unit with the M235 rockets in your inventory (if you wish to divide your ammunition, set aside whatever M235 rockets you do NOT want to give the robot) turning it on, and placing it on the ground. If reprogrammed and rewired successfully the security bot will then identify you as a friendly, roam around or follow you, and attack all enemies with its M202A1.", + "weight": "40750 g", + "volume": "30 L", + "price": 750000, + "to_hit": -3, + "bashing": 8, + "material": [ "steel" ], + "symbol": ";", + "color": "light_green", + "use_action": { + "type": "place_monster", + "monster_id": "mon_talon_m202a1", + "friendly_msg": "The security bot beeps affirmatively and begins scanning for hostiles.", + "hostile_msg": "You misprogram the security bot and it trains its gun on you. RUN!", + "difficulty": 6, + "moves": 150, + "skill1": "electronics", + "skill2": "computer" + } + }, { "id": "bot_nursebot", "type": "TOOL", "name": "inactive nurse bot", "description": "This is an inactive nurse bot. Using this item involves placing it on the ground and reactivating its mechanical body. If reprogrammed and rewired successfully the nurse bot will then identify you as a friendly, roam around or follow you, and assist you in surgeries.", "volume": "62500 ml", - "weight": 81500, + "weight": "81500 g", "price": 750000, "to_hit": -3, "bashing": 8, @@ -322,7 +368,7 @@ "type": "TOOL", "name": "inactive broken cyborg", "description": "This is a deactivated broken cyborg, the last shreds of its humanity still rotting away. Using this item involves placing it on the ground and reactivating its mechanical body. If reprogrammed and rewired successfully the cyborg will then follow you and attack enemies. You monster.", - "weight": 81500, + "weight": "81500 g", "volume": "62500 ml", "//": "It is a disgusting mass of rotting flesh and jagged metal pieces, no one will buy it.", "price": 0, @@ -348,7 +394,7 @@ "type": "TOOL", "name": "inactive prototype cyborg", "description": "This is a deactivated prototype cyborg, glimpses of humanity can still be seen in its empty eyes. Using this item involves placing it on the ground and reactivating its mechanical body. If reprogrammed and rewired successfully the cyborg will then follow you and attack enemies. You monster.", - "weight": 81500, + "weight": "81500 g", "volume": "62500 ml", "//": "It is an affront to humanity, no one will buy it.", "price": 0, @@ -374,7 +420,7 @@ "type": "TOOL", "name": "inactive chicken walker", "description": "This is an inactive chicken walker. Using this item involves placing it on the ground, loading the unit with the factory-loaded 5.56 rounds and 40mm cartridge grenades in your inventory (if you wish to divide your ammunition, set aside whatever ammunition you do NOT want to give the robot) and turning it on. If reprogrammed and rewired successfully the chicken walker will then identify you as a friendly, roam around or follow you, and attack all enemies with a built-in firearm and grenade launcher.", - "weight": 120000, + "weight": "120000 g", "volume": "92500 ml", "price": 50000000, "to_hit": -3, @@ -400,7 +446,7 @@ "type": "TOOL", "name": "inactive police bot", "description": "This is an inactive police robot. Using this item involves placing it on the ground and turning it on. If reprogrammed and rewired successfully the police bot will then identify you as law enforcement, roam around or follow you, and attempt to detain lawbreakers.", - "weight": 81500, + "weight": "81500 g", "volume": "62500 ml", "price": 100000, "to_hit": -3, @@ -426,7 +472,7 @@ "type": "TOOL", "name": "inactive eyebot", "description": "This is an inactive eyebot. Using this item involves turning it on and launching the UAV. If reprogrammed and rewired successfully the eyebot will then keep watch for intruders.", - "weight": 40750, + "weight": "40750 g", "volume": "30 L", "price": 10000, "to_hit": -3, @@ -451,7 +497,7 @@ "type": "TOOL", "name": "inactive cleaner bot", "description": "This is an inactive cleaner bot. Using this item involves placing it on the ground and turning it on. If reprogrammed and rewired successfully the cleaner bot will respond to future commands.", - "weight": 81500, + "weight": "81500 g", "volume": "62500 ml", "price": 10000, "to_hit": -3, @@ -477,7 +523,7 @@ "type": "TOOL", "name": "inactive miner bot", "description": "This is an inactive mining robot. Using this item involves placing it on the ground and turning it on. If reprogrammed and rewired successfully the miner bot will respond to future commands.", - "weight": 81500, + "weight": "81500 g", "volume": "62500 ml", "price": 25000, "to_hit": -3, @@ -503,7 +549,7 @@ "type": "TOOL", "name": "inactive riot control bot", "description": "This is an inactive riot control bot. Using this item involves placing it on the ground and turning it on. If reprogrammed and rewired successfully the robot will bring order and peace to the horde.", - "weight": 81500, + "weight": "81500 g", "volume": "62500 ml", "price": 35000, "to_hit": -3, @@ -529,7 +575,7 @@ "type": "TOOL", "name": "inactive skitterbot", "description": "This is an inactive skitterbot. Using this item involves placing it on the ground and turning it on. If reprogrammed and rewired successfully the robot will race towards enemies and shock them.", - "weight": 40750, + "weight": "40750 g", "volume": "30 L", "price": 80000, "to_hit": -3, @@ -555,7 +601,7 @@ "type": "TOOL", "name": "inactive lab defense bot", "description": "This is an inactive experimental robot plundered from a science lab. It resembles a human-sized spider and was designed to deploy manhacks. Using this item involves placing it on the ground and turning it on. If reprogrammed and rewired successfully the robot will race towards enemies and deploy a variety of experimental devices.", - "weight": 100000, + "weight": "100000 g", "volume": "65000 ml", "price": 80000, "to_hit": -3, @@ -581,7 +627,7 @@ "type": "TOOL", "name": "inactive tank drone", "description": "This is an inactive Beagle Mini-Tank UGV. Using this item involves placing it on the ground, loading the unit with the factory-loaded 5.56 rounds and 40mm cartridge grenades in your inventory (if you wish to divide your ammunition, set aside whatever ammunition you do NOT want to give the robot) and turning it on. If reprogrammed and rewired successfully the tank drone will then identify you as a friendly, roam around or follow you, and attack all enemies with a built-in firearm and grenade launcher.", - "weight": 200000, + "weight": "200000 g", "//": "cheating a bit with the volume due to lack of proper vehicle storage options", "volume": "250 L", "price": 100000000, @@ -608,7 +654,7 @@ "type": "TOOL", "name": "inactive tripod", "description": "This is an inactive Honda Regnal. Using this item involves placing it on the ground, wondering how it fuels its flamethrower and turning it on. If reprogrammed and rewired successfully the tribot will then identify you as an ally, roam around or follow you, and impale hostiles with its spiked cable weapons.", - "weight": 120000, + "weight": "120000 g", "volume": "92500 ml", "price": 100000000, "to_hit": -3, @@ -633,7 +679,7 @@ "type": "TOOL", "name": "inactive milspec searchlight", "description": "This is an inactive military-grade automated searchlight. Using this item involves placing it on the ground and turning it on. If reprogrammed and rewired successfully the searchlight will then identify you as an ally, survey the area, and illuminate approaching hostiles. Seems to have an unhealthy fascination with you.", - "weight": 120000, + "weight": "120000 g", "volume": "92500 ml", "price": 500000, "to_hit": -3, @@ -659,7 +705,7 @@ "name": "inactive dispatch", "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": "95000 ml", - "weight": 100000, + "weight": "100000 g", "price": 10000000, "price_postapoc": 100000, "to_hit": -3, @@ -684,7 +730,7 @@ "name": "inactive military dispatch", "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": "95000 ml", - "weight": 100000, + "weight": "100000 g", "price": 100000000, "price_postapoc": 500000, "to_hit": -3, diff --git a/data/json/items/crossbows.json b/data/json/items/crossbows.json index bd04cf5cb9189..7dc46ad9dccbd 100644 --- a/data/json/items/crossbows.json +++ b/data/json/items/crossbows.json @@ -9,7 +9,7 @@ "description": "A crude pointed wooden crossbow bolt with a notch at the back. Stands a very low chance of remaining intact once fired.", "material": "wood", "volume": "250 ml", - "weight": 20, + "weight": "20 g", "bashing": 3, "ammo_type": "bolt", "prop_damage": 0.7, @@ -28,7 +28,7 @@ "description": "A simple fletched wooden crossbow bolt with a fire-hardened and sharpened tip. Stands a low chance of remaining intact once fired.", "material": "wood", "volume": "250 ml", - "weight": 25, + "weight": "25 g", "bashing": 4, "ammo_type": "bolt", "prop_damage": 0.7, @@ -47,7 +47,7 @@ "description": "A simple fletched wooden crossbow bolt with a blunted tip. Useful for hunting small woodland creatures without splattering them all over the ground. Stands a low chance of remaining intact once fired.", "material": "wood", "volume": "250 ml", - "weight": 25, + "weight": "25 g", "bashing": 4, "ammo_type": "bolt", "prop_damage": 0.5, @@ -66,7 +66,7 @@ "description": "A simple fletched wooden crossbow bolt with a makeshift head. Stands a low chance of remaining intact once fired.", "material": "wood", "volume": "250 ml", - "weight": 27, + "weight": "27 g", "bashing": 6, "cutting": 2, "ammo_type": "bolt", @@ -86,7 +86,7 @@ "description": "A fletched wooden crossbow bolt with a bladed tip. Useful for maximising damage to the target. Stands a decent chance of remaining intact once fired.", "material": [ "wood", "steel" ], "volume": "250 ml", - "weight": 45, + "weight": "45 g", "bashing": 1, "ammo_type": "bolt", "prop_damage": 1.25, @@ -106,7 +106,7 @@ "description": "A fletched wooden crossbow bolt with a pointed tip. Useful for piercing armor. Stands a decent chance of remaining intact once fired.", "material": [ "wood", "steel" ], "volume": "250 ml", - "weight": 45, + "weight": "45 g", "bashing": 3, "ammo_type": "bolt", "prop_damage": 1.12, @@ -126,7 +126,7 @@ "description": "A fletched wooden crossbow bolt with a blunt tip. Useful for hunting small woodland creatures without splattering them all over the ground. Stands a decent chance of remaining intact once fired.", "material": [ "wood", "steel" ], "volume": "250 ml", - "weight": 50, + "weight": "50 g", "bashing": 4, "ammo_type": "bolt", "prop_damage": 0.5, @@ -145,7 +145,7 @@ "description": "A simple fletched steel crossbow bolt with a flattened and sharpened tip. Stands a somewhat low chance of remaining intact once fired.", "material": "steel", "volume": "250 ml", - "weight": 55, + "weight": "55 g", "bashing": 1, "ammo_type": "bolt", "pierce": 1, @@ -165,7 +165,7 @@ "description": "A fletched aluminum crossbow bolt with a bladed tip. Useful for maximising damage to the target. Stands a good chance of remaining intact once fired.", "material": [ "aluminum", "steel" ], "volume": "250 ml", - "weight": 40, + "weight": "40 g", "bashing": 5, "ammo_type": "bolt", "prop_damage": 1.25, @@ -186,7 +186,7 @@ "description": "A fletched aluminum crossbow bolt with a pointed tip. Useful for piercing armor. Stands a good chance of remaining intact once fired.", "material": [ "aluminum", "steel" ], "volume": "250 ml", - "weight": 40, + "weight": "40 g", "bashing": 3, "cutting": 2, "ammo_type": "bolt", @@ -208,7 +208,7 @@ "description": "A fletched aluminum crossbow bolt with a blunt tip. Useful for hunting small woodland creatures without splattering them all over the ground. Stands a good chance of remaining intact once fired.", "material": [ "aluminum", "steel" ], "volume": "250 ml", - "weight": 40, + "weight": "40 g", "bashing": 3, "cutting": 2, "ammo_type": "bolt", @@ -230,7 +230,7 @@ "description": "A lightweight, sharpened bolt made from some kind of metal. It is fairly unwieldy and only provides moderate accuracy, due to being filled with explosives and fitted with an impact trigger.", "material": [ "steel", "powder" ], "volume": "250 ml", - "weight": 620, + "weight": "620 g", "bashing": 1, "ammo_type": "bolt", "damage": 12, @@ -254,7 +254,7 @@ "flags": "PRIMITIVE_RANGED_WEAPON", "skill": "pistol", "ammo": "bolt", - "weight": 900, + "weight": "900 g", "volume": "500 ml", "bashing": 4, "ranged_damage": 7, @@ -286,7 +286,7 @@ "flags": [ "STR_RELOAD", "PRIMITIVE_RANGED_WEAPON" ], "skill": "rifle", "ammo": "bolt", - "weight": 2728, + "weight": "2728 g", "volume": "1500 ml", "bashing": 11, "to_hit": 1, @@ -322,7 +322,7 @@ "flags": [ "STR_RELOAD", "PRIMITIVE_RANGED_WEAPON" ], "skill": "rifle", "ammo": "bolt", - "weight": 3500, + "weight": "3500 g", "volume": "1750 ml", "bashing": 11, "to_hit": 1, @@ -358,7 +358,7 @@ "flags": [ "STR_RELOAD", "PRIMITIVE_RANGED_WEAPON" ], "skill": "rifle", "ammo": "bolt", - "weight": 3000, + "weight": "3000 g", "volume": "1750 ml", "bashing": 11, "to_hit": 1, @@ -395,7 +395,7 @@ "flags": [ "FIRE_TWOHAND", "STR_RELOAD", "PRIMITIVE_RANGED_WEAPON", "TRADER_AVOID" ], "skill": "rifle", "ammo": "bolt", - "weight": 6803, + "weight": "6803 g", "volume": "5 L", "bashing": 20, "to_hit": -1, @@ -431,7 +431,7 @@ "flags": [ "FIRE_TWOHAND", "PRIMITIVE_RANGED_WEAPON", "TRADER_AVOID" ], "skill": "smg", "ammo": "bolt", - "weight": 3628, + "weight": "3628 g", "volume": "2500 ml", "bashing": 13, "to_hit": -1, diff --git a/data/json/items/fake.json b/data/json/items/fake.json index caad22a045428..58e7a7614f424 100644 --- a/data/json/items/fake.json +++ b/data/json/items/fake.json @@ -78,7 +78,7 @@ "description": "Item to test aep_clairvoyance_plus flag. If this spawns randomly, then it's a bug.", "price": 5000, "material": [ "steel" ], - "weight": 150, + "weight": "150 g", "volume": "750 ml", "bashing": 1, "to_hit": -1, @@ -110,7 +110,7 @@ "flags": [ "REACH_ATTACK" ], "skill": "archery", "ammo": "arrow", - "weight": 340, + "weight": "340 g", "volume": "1500 ml", "bashing": 6, "ranged_damage": 3, diff --git a/data/json/items/fluff.json b/data/json/items/fluff.json index f675025690b83..00199fd6afb81 100644 --- a/data/json/items/fluff.json +++ b/data/json/items/fluff.json @@ -6,7 +6,7 @@ "name": "Magic 8-Ball", "name_plural": "Magic 8-Balls", "description": "A fortune-telling device from the 1950s. The kind of moral support you didn't know you needed.", - "weight": 40, + "weight": "40 g", "volume": "250 ml", "price": 1000, "material": [ "plastic" ], @@ -21,7 +21,7 @@ "name": "coin", "name_plural": "coins", "description": "A now-ancient form of currency. Stripped of its original purpose, it now serves, faithfully, flippant Flippists for free.", - "weight": 6, + "weight": "6 g", "volume": 0, "price": 25, "material": [ "silver" ], @@ -36,7 +36,7 @@ "category": "other", "name": "family photo", "description": "A photo of a smiling family on a camping trip. One of the parents looks like a cleaner, happier version of the person you know.", - "weight": 1, + "weight": "1 g", "volume": 0, "price": 800, "material": [ "paper" ], diff --git a/data/json/items/fuel.json b/data/json/items/fuel.json index e86e42b1f52b4..151ce35758b6c 100644 --- a/data/json/items/fuel.json +++ b/data/json/items/fuel.json @@ -5,7 +5,7 @@ "name": "ethanol", "name_plural": "ethanol", "description": "Extremely pure alcohol suitable for use as a component in chemical reactions. You could also water it down and drink it, or use it as fuel in alcohol-burning stoves.", - "weight": 1, + "weight": "1 g", "volume": "200ml", "price": 200, "price_postapoc": 500, @@ -48,7 +48,7 @@ "name_plural": "diesel", "description": "Petroleum-based fuel made from a byproduct of the gasoline making process.", "category": "fuel", - "weight": 1, + "weight": "1 g", "volume": "200ml", "price": 50, "price_postapoc": 500, @@ -91,7 +91,7 @@ "name_plural": "gasoline", "description": "Gasoline is a highly flammable liquid. When under pressure, it has the potential for violent explosion.", "category": "fuel", - "weight": 1, + "weight": "1 g", "volume": "200ml", "price": 40, "price_postapoc": 800, @@ -120,7 +120,7 @@ "name_plural": "lamp oil", "description": "A thin and clean-burning oil made for use in oil lamps.", "category": "fuel", - "weight": 1, + "weight": "1 g", "volume": "200ml", "price": 20, "price_postapoc": 200, @@ -149,7 +149,7 @@ "name_plural": "napalm", "description": "This is gasoline mixed with some other components to make it stick to the surface and increase burning temperature, meant to be used with a flamethrower.", "category": "fuel", - "weight": 1, + "weight": "1 g", "volume": "200ml", "price": 8000, "count": 250, diff --git a/data/json/items/generic.json b/data/json/items/generic.json index 71525a2ea1366..fa06a0f676ca6 100644 --- a/data/json/items/generic.json +++ b/data/json/items/generic.json @@ -1,16 +1,4 @@ [ - { - "type": "GENERIC", - "id": "corpse", - "symbol": "%", - "color": "white", - "name": "corpse", - "description": "A dead body.", - "//": "most of the properties depend on the monster type and are created at runtime!", - "price": 0, - "volume": 0, - "flags": [ "NO_UNLOAD", "TRADER_AVOID" ] - }, { "type": "GENERIC", "//": "pseudo item, used as fuel type for engines that are animal-powered", @@ -101,7 +89,7 @@ "name": "file", "category": "books", "description": "Several documents with all kinds of information, customer data and charts kept together, pretty useless now though.", - "weight": 15, + "weight": "15 g", "to_hit": -3, "color": "white", "symbol": ",", @@ -120,7 +108,7 @@ "price": 0, "material": "paper", "flags": "TRADER_AVOID", - "weight": 3, + "weight": "3 g", "volume": 0 }, { @@ -131,7 +119,7 @@ "name": "withered plant", "description": "A dead plant. Good for starting fires or making a pile of leaves to sleep on.", "material": "paper", - "weight": 20, + "weight": "20 g", "volume": "250 ml", "to_hit": -2, "flags": [ "TRADER_AVOID" ] @@ -146,7 +134,7 @@ "price": 1000, "material": [ "fur", "leather" ], "flags": [ "NO_SALVAGE" ], - "weight": 114, + "weight": "114 g", "volume": "250 ml", "category": "spare_parts" }, @@ -170,7 +158,7 @@ "price": 2000, "material": [ "leather", "flesh" ], "flags": [ "NO_SALVAGE" ], - "weight": 100, + "weight": "100 g", "volume": "250 ml", "category": "spare_parts", "to_hit": -1 @@ -186,7 +174,7 @@ "price": 2000, "material": [ "wool" ], "flags": [ "NO_SALVAGE" ], - "weight": 100, + "weight": "100 g", "volume": "250 ml", "category": "spare_parts", "to_hit": -1 @@ -204,7 +192,7 @@ "price_postapoc": 200, "material": [ "nomex" ], "flags": [ "NO_SALVAGE" ], - "weight": 42, + "weight": "42 g", "volume": "250 ml" }, { @@ -217,7 +205,7 @@ "description": "A tube of strong glue. Used in many crafting recipes.", "price": 1800, "material": "plastic", - "weight": 45, + "weight": "45 g", "volume": "250 ml", "to_hit": -2, "flags": [ "UNRECOVERABLE" ] @@ -232,7 +220,7 @@ "description": "Glue made from boiling animal bones. The adhesive isn't strong enough for heavy duty usages, but it can be used as a varnish or holding together small items.", "price": 1800, "material": "bone", - "weight": 45, + "weight": "45 g", "volume": "250 ml", "to_hit": -2, "flags": [ "UNRECOVERABLE" ] @@ -252,7 +240,7 @@ "category": "spare_parts", "name": "steel chain", "description": "A heavy steel chain. Useful as a weapon, or for crafting. It has a chance to wrap around your target, allowing for a bonus unarmed attack.", - "weight": 3628, + "weight": "3628 g", "color": "dark_gray", "symbol": "/", "material": [ "steel" ], @@ -272,7 +260,7 @@ "description": "A piece of an insect's exoskeleton. It is light and very durable.", "price": 0, "material": "chitin", - "weight": 89, + "weight": "89 g", "volume": "250 ml", "bashing": 1, "to_hit": -2 @@ -288,7 +276,7 @@ "description": "A set of small slightly elongated disks, made of high-grade ceramic. They remind you of scales", "price": 0, "material": "lightceramic", - "weight": 100, + "weight": "100 g", "volume": "250 ml", "bashing": 1, "to_hit": -3 @@ -311,7 +299,7 @@ "name": "bundle of rags", "name_plural": "bundles of rags", "description": "Cotton rags, bundled tightly together for storage. Disassemble to unpack.", - "weight": 800, + "weight": "800 g", "volume": "750 ml", "price": 0, "material": "cotton", @@ -325,7 +313,7 @@ "name": "bundle of leather", "name_plural": "bundles of leather", "description": "Leather patches, bundled tightly together for storage. Disassemble to unpack.", - "weight": 1000, + "weight": "1000 g", "volume": "1 L", "price": 20000, "material": "leather", @@ -339,7 +327,7 @@ "name": "bundle of felt", "name_plural": "bundles of felt", "description": "Felt patches, bundled tightly together for storage. Disassemble to unpack.", - "weight": 1000, + "weight": "1000 g", "volume": "1 L", "price": 20000, "material": "wool", @@ -355,7 +343,7 @@ "description": "An unopened biollante flower, brilliant purple in color. It may still have its sap-producing organ intact.", "price": 0, "material": "veggy", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "to_hit": -3 }, @@ -367,7 +355,7 @@ "name": "empty canister", "description": "An empty canister, which may have once held tear gas or other substances.", "material": "steel", - "weight": 158, + "weight": "158 g", "volume": "250 ml", "bashing": 2, "to_hit": -1, @@ -384,7 +372,7 @@ "price": 200000, "price_postapoc": 1000, "material": "stone", - "weight": 907, + "weight": "907 g", "volume": "250 ml", "bashing": 6, "to_hit": -1, @@ -401,7 +389,7 @@ "price": 20000, "price_postapoc": 1000, "material": "stone", - "weight": 493, + "weight": "493 g", "volume": "250 ml", "bashing": 6, "to_hit": -1, @@ -417,7 +405,7 @@ "price": 10000, "price_postapoc": 100, "material": "plastic", - "weight": 18, + "weight": "18 g", "volume": 0, "to_hit": -3 }, @@ -431,7 +419,7 @@ "price": 10000, "price_postapoc": 100, "material": "plastic", - "weight": 18, + "weight": "18 g", "volume": 0, "to_hit": -3 }, @@ -441,7 +429,7 @@ "category": "other", "name": "golf tee", "description": "A pin shaped piece of wood meant for holding a golf ball slightly off the ground.", - "weight": 3, + "weight": "3 g", "volume": "250 ml", "price": 1000, "material": "wood", @@ -454,7 +442,7 @@ "category": "other", "name": "golf ball", "description": "A small ball with round indentations on it.", - "weight": 50, + "weight": "50 g", "volume": "250 ml", "price": 2000, "material": "plastic", @@ -474,7 +462,7 @@ "price": 3000, "price_postapoc": 0, "material": "plastic", - "weight": 170, + "weight": "170 g", "volume": "250 ml", "bashing": 8, "to_hit": -3 @@ -489,7 +477,7 @@ "category": "other", "price": 30, "material": "ceramic", - "weight": 2000, + "weight": "2000 g", "volume": "2500 ml", "bashing": 16, "to_hit": -2 @@ -505,7 +493,7 @@ "price": 10000, "price_postapoc": 100, "material": "gold", - "weight": 1500, + "weight": "1500 g", "volume": "250 ml", "bashing": 9 }, @@ -520,7 +508,7 @@ "price": 28000, "price_postapoc": 1000, "material": "steel", - "weight": 553, + "weight": "553 g", "volume": "750 ml", "bashing": 6, "cutting": 8, @@ -538,7 +526,7 @@ "price": 28000, "price_postapoc": 1000, "material": "steel", - "weight": 1000, + "weight": "1000 g", "volume": "1500 ml", "bashing": 6, "cutting": 8, @@ -556,7 +544,7 @@ "price": 20000, "price_postapoc": 1000, "material": "steel", - "weight": 349, + "weight": "349 g", "volume": "250 ml", "cutting": 14, "flags": [ "HURT_WHEN_WIELDED" ], @@ -572,7 +560,7 @@ "category": "tools", "price": 5, "material": "steel", - "weight": 11, + "weight": "11 g", "volume": 0 }, { @@ -586,7 +574,7 @@ "price": 20000, "price_postapoc": 300, "material": "steel", - "weight": 151, + "weight": "151 g", "volume": "500 ml", "to_hit": -2 }, @@ -600,7 +588,7 @@ "price": 20000, "price_postapoc": 500, "material": "steel", - "weight": 302, + "weight": "302 g", "volume": "500 ml", "to_hit": -2 }, @@ -615,7 +603,7 @@ "price": 7500, "price_postapoc": 1000, "material": "steel", - "weight": 908, + "weight": "908 g", "volume": "1500 ml", "bashing": 12, "to_hit": 2, @@ -634,7 +622,7 @@ "price": 10000, "price_postapoc": 100, "material": "powder", - "weight": 2340, + "weight": "2340 g", "volume": "1 L", "bashing": 4 }, @@ -648,7 +636,7 @@ "category": "other", "material": "bone", "flags": [ "NO_SALVAGE", "TRADER_AVOID" ], - "weight": 10, + "weight": "10 g", "volume": 0, "to_hit": -5, "qualities": [ [ "COOK", 1 ] ] @@ -663,7 +651,7 @@ "description": "A torch that has consumed all its fuel; it can be recrafted into another torch.", "category": "other", "material": "wood", - "weight": 751, + "weight": "751 g", "volume": "750 ml", "bashing": 8, "to_hit": 3, @@ -680,7 +668,7 @@ "description": "This is a spent magnesium flare. It is essentially trash.", "material": "plastic", "flags": "TRADER_AVOID", - "weight": 39, + "weight": "39 g", "volume": "250 ml", "to_hit": -1 }, @@ -695,7 +683,7 @@ "price": 1000, "price_postapoc": 100, "material": "iron", - "weight": 3220, + "weight": "3220 g", "volume": "750 ml" }, { @@ -709,7 +697,7 @@ "price": 5000, "price_postapoc": 500, "material": "steel", - "weight": 8440, + "weight": "8440 g", "volume": "5 L" }, { @@ -723,7 +711,7 @@ "price": 10000, "price_postapoc": 500, "material": [ "steel", "iron" ], - "weight": 22680, + "weight": "22680 g", "volume": "6250 ml", "bashing": 6, "to_hit": -4 @@ -737,7 +725,7 @@ "description": "A small tent, just big enough to fit a person comfortably. This tent is broken and cannot be deployed.", "price": 6500, "material": [ "plastic", "aluminum" ], - "weight": 1133, + "weight": "1133 g", "volume": "2500 ml", "bashing": 4, "to_hit": -3, @@ -752,7 +740,7 @@ "description": "A family sized tent, very bulky but with plenty of space. This tent is broken and can not be deployed.", "price": 10000, "material": [ "plastic", "aluminum" ], - "weight": 2266, + "weight": "2266 g", "volume": "10 L", "bashing": 4, "to_hit": -3, @@ -769,7 +757,7 @@ "price": 1000, "price_postapoc": 100, "material": "iron", - "weight": 226, + "weight": "226 g", "volume": "250 ml" }, { @@ -783,7 +771,7 @@ "price": 1000, "price_postapoc": 100, "material": "iron", - "weight": 226, + "weight": "226 g", "volume": "250 ml" }, { @@ -795,7 +783,7 @@ "description": "A large cathode ray tube television, full of delicious electronics.", "price": 0, "material": "plastic", - "weight": 22600, + "weight": "22600 g", "volume": "3 L", "bashing": 5, "to_hit": -5 @@ -811,7 +799,7 @@ "price": 1000, "price_postapoc": 50, "material": [ "aluminum", "plastic" ], - "weight": 5, + "weight": "5 g", "volume": 0 }, { @@ -823,7 +811,7 @@ "description": "A small two slice toaster, not much use as anything but spare parts", "price": 1000, "material": [ "aluminum", "plastic" ], - "weight": 725, + "weight": "725 g", "volume": "750 ml" }, { @@ -835,7 +823,7 @@ "description": "A home microwave, has probably seen its share of baked beans. Good for scrap parts.", "price": 1000, "material": [ "steel", "plastic" ], - "weight": 11339, + "weight": "11339 g", "volume": "3 L" }, { @@ -848,7 +836,7 @@ "description": "A broken laptop, basically a paperweight now.", "price": 1000, "material": [ "plastic", "aluminum" ], - "weight": 2721, + "weight": "2721 g", "volume": "750 ml", "bashing": 6 }, @@ -862,7 +850,7 @@ "description": "A broken eyebot. Much less threatening now that it won't be calling for backup. Could be gutted for parts.", "price": 1000, "material": [ "steel", "plastic" ], - "weight": 31520, + "weight": "31520 g", "volume": "15 L", "bashing": 6, "cutting": 6, @@ -879,7 +867,7 @@ "description": "A broken skitterbot. Much less threatening now that it lies limp on solid ground. Could be gutted for parts.", "price": 1000, "material": [ "steel", "plastic" ], - "weight": 62650, + "weight": "62650 g", "volume": "30 L", "bashing": 4, "cutting": 4, @@ -896,7 +884,7 @@ "description": "A broken lab defense bot, with its casing broken and fluid drained. Could be gutted for parts.", "price": 1000, "material": [ "steel", "plastic" ], - "weight": 100000, + "weight": "100000 g", "volume": "65000 ml", "bashing": 4, "cutting": 4, @@ -914,7 +902,7 @@ "price": 30000, "price_postapoc": 1000, "material": [ "steel", "plastic" ], - "weight": 140000, + "weight": "140000 g", "volume": "62500 ml", "bashing": 6, "cutting": 6, @@ -932,7 +920,7 @@ "price": 30000, "price_postapoc": 1000, "material": [ "steel", "plastic" ], - "weight": 140000, + "weight": "140000 g", "volume": "62500 ml", "bashing": 6, "cutting": 6, @@ -956,7 +944,7 @@ "price": 30000, "price_postapoc": 1000, "material": [ "steel", "plastic" ], - "weight": 140000, + "weight": "140000 g", "volume": "62500 ml", "bashing": 6, "cutting": 6, @@ -974,7 +962,7 @@ "price": 30000, "price_postapoc": 1000, "material": [ "steel", "plastic" ], - "weight": 140000, + "weight": "140000 g", "volume": "62500 ml", "bashing": 6, "cutting": 6, @@ -992,7 +980,7 @@ "price": 20000, "price_postapoc": 1000, "material": [ "steel", "plastic" ], - "weight": 170200, + "weight": "170200 g", "volume": "62500 ml", "bashing": 6, "cutting": 10, @@ -1009,7 +997,7 @@ "description": "A broken tribot. Now that its legs lie broken and immobile, the world seems a little less threatening. Could be gutted for parts.", "price": 1000, "material": [ "steel", "plastic" ], - "weight": 430000, + "weight": "430000 g", "volume": "187500 ml", "bashing": 10, "cutting": 6, @@ -1026,7 +1014,7 @@ "description": "A broken tank drone. Still looks intimidating despite being permanently inoperative, possibly due to the sheer size and mass. Could be gutted for parts.", "price": 1000, "material": [ "steel", "plastic" ], - "weight": 1223850, + "weight": "1223850 g", "volume": "875 L", "bashing": 20, "cutting": 15, @@ -1038,7 +1026,7 @@ "id": "broken_mech_recon", "name": "broken recon mech", "description": "This is a broken mech exoskeleton suit, it looks beyond repair.", - "weight": 700388, + "weight": "700388 g", "volume": "125 L", "price": 1000, "to_hit": -3, @@ -1053,7 +1041,7 @@ "id": "broken_mech_lifter", "name": "broken mech lifter", "description": "This is a broken mech exoskeleton suit, it looks beyond repair.", - "weight": 1280388, + "weight": "1280388 g", "volume": "250 L", "price": 1000, "to_hit": -3, @@ -1068,7 +1056,7 @@ "id": "broken_mech_combat", "name": "broken combat mech", "description": "This is a broken mech exoskeleton suit, it looks beyond repair.", - "weight": 1480388, + "weight": "1480388 g", "volume": "250 L", "price": 1000, "to_hit": -3, @@ -1088,7 +1076,7 @@ "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, "material": [ "steel", "plastic" ], - "weight": 100000, + "weight": "100000 g", "volume": "85000 ml", "bashing": 4, "cutting": 4, @@ -1105,7 +1093,7 @@ "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, "material": [ "steel", "plastic" ], - "weight": 100000, + "weight": "100000 g", "volume": "85000 ml", "bashing": 4, "cutting": 4, @@ -1122,7 +1110,7 @@ "description": "A broken manhack. Much less threatening now that it lies limp on solid ground. Could be gutted for parts.", "price": 1000, "material": [ "aluminum", "plastic" ], - "weight": 5400, + "weight": "5400 g", "volume": "750 ml", "bashing": 6, "cutting": 6, @@ -1140,7 +1128,7 @@ "price": 9000, "price_postapoc": 1000, "material": [ "aluminum", "plastic" ], - "weight": 4480, + "weight": "4480 g", "volume": "750 ml", "bashing": 6, "cutting": 6, @@ -1158,7 +1146,7 @@ "price": 18000, "price_postapoc": 1000, "material": [ "aluminum", "plastic" ], - "weight": 25000, + "weight": "25000 g", "volume": "18750 ml", "bashing": 6, "cutting": 6, @@ -1176,7 +1164,7 @@ "price": 9000, "price_postapoc": 1000, "material": [ "aluminum", "plastic" ], - "weight": 5360, + "weight": "5360 g", "volume": "750 ml", "bashing": 6, "cutting": 6, @@ -1194,7 +1182,7 @@ "price": 9000, "price_postapoc": 1000, "material": [ "aluminum", "plastic" ], - "weight": 4700, + "weight": "4700 g", "volume": "750 ml", "bashing": 6, "cutting": 6, @@ -1212,7 +1200,7 @@ "price": 9000, "price_postapoc": 1000, "material": [ "aluminum", "plastic" ], - "weight": 4536, + "weight": "4536 g", "volume": "750 ml", "bashing": 6, "cutting": 6, @@ -1230,7 +1218,7 @@ "price": 9000, "price_postapoc": 1000, "material": [ "aluminum", "plastic" ], - "weight": 5870, + "weight": "5870 g", "volume": "750 ml", "bashing": 6, "cutting": 6, @@ -1247,7 +1235,7 @@ "description": "A central processor unit, useful in advanced electronics crafting.", "price": 12000, "material": [ "plastic" ], - "weight": 56, + "weight": "56 g", "volume": "250 ml", "to_hit": -1 }, @@ -1261,7 +1249,7 @@ "description": "A stick of memory. Useful in advanced electronics crafting.", "price": 9000, "material": [ "plastic" ], - "weight": 30, + "weight": "30 g", "volume": "250 ml", "to_hit": -1 }, @@ -1275,7 +1263,7 @@ "description": "A power supply unit. Useful in lots of electronics recipes.", "price": 17000, "material": [ "aluminum", "plastic" ], - "weight": 113, + "weight": "113 g", "volume": "1 L", "bashing": 5, "to_hit": -1 @@ -1290,7 +1278,7 @@ "description": "A circuit designed to amplify the strength of a signal. Useful in lots of electronics recipes.", "price": 20000, "material": [ "plastic" ], - "weight": 114, + "weight": "114 g", "volume": "250 ml", "to_hit": -1 }, @@ -1304,7 +1292,7 @@ "description": "A circuit designed to repeat a signal. Useful for crafting communications equipment.", "price": 14000, "material": [ "aluminum", "plastic" ], - "weight": 480, + "weight": "480 g", "volume": "250 ml", "to_hit": -1 }, @@ -1318,7 +1306,7 @@ "description": "A module designed to receive many forms of signals. Useful for crafting communications equipment.", "price": 13500, "material": [ "aluminum", "plastic" ], - "weight": 114, + "weight": "114 g", "volume": "250 ml", "to_hit": -1 }, @@ -1332,7 +1320,7 @@ "description": "A small backlit screen, used for displaying images. Useful in some electronics recipes.", "price": 24000, "material": "plastic", - "weight": 500, + "weight": "500 g", "volume": "250 ml", "to_hit": -4 }, @@ -1347,7 +1335,7 @@ "description": "A high-quality lens, useful for focusing or diffusing light. Might be useful for starting a fire.", "price": 120000, "material": "glass", - "weight": 340, + "weight": "340 g", "volume": 0, "to_hit": -3, "use_action": { "type": "firestarter", "moves": 1000, "moves_slow": 30000, "need_sunlight": true }, @@ -1364,7 +1352,7 @@ "description": "A small high-quality lens, useful for focusing or diffusing light. Might be useful for crafting.", "price": 6000, "material": "glass", - "weight": 170, + "weight": "170 g", "volume": 0 }, { @@ -1378,7 +1366,7 @@ "description": "A pair of small darkened glass, like the one that sunglasses are made of.", "price": 1000, "material": "glass", - "weight": 340, + "weight": "340 g", "volume": 0, "to_hit": -3 }, @@ -1392,7 +1380,7 @@ "description": "Once a valuable bionic implant, it has not held up well under repeated use. This object has been destroyed by excessive electric current and is now useless.", "price": 13500, "material": [ "steel", "plastic" ], - "weight": 317, + "weight": "317 g", "volume": "2500 ml", "to_hit": -1, "flags": [ "TRADER_AVOID" ] @@ -1408,7 +1396,7 @@ "price": 150000, "price_postapoc": 15000, "material": [ "steel", "plastic" ], - "weight": 317, + "weight": "317 g", "volume": "250 ml", "to_hit": -1, "flags": [ "NANOFAB_TEMPLATE", "TRADER_AVOID" ] @@ -1435,7 +1423,7 @@ "description": "A simple thin aluminum shaft. Useful in lots of electronics recipes.", "price": 8000, "material": "aluminum", - "weight": 68, + "weight": "68 g", "volume": "250 ml", "to_hit": 2 }, @@ -1449,7 +1437,7 @@ "description": "A very small electric motor like those used in RC cars. Useful in lots of electronics recipes.", "price": 1000, "material": [ "steel", "plastic" ], - "weight": 110, + "weight": "110 g", "volume": "250 ml" }, { @@ -1462,7 +1450,7 @@ "description": "A printed card that supports and electrically connects electronic components on a non-conductive substrate.", "price": 5000, "material": "plastic", - "weight": 26, + "weight": "26 g", "volume": 0, "to_hit": 2 }, @@ -1476,7 +1464,7 @@ "description": "A random collection of resistors, capacitors, and diodes which have been stripped from printed circuits.", "price": 3000, "material": "aluminum", - "weight": 14, + "weight": "14 g", "volume": 0, "to_hit": 2 }, @@ -1490,7 +1478,7 @@ "description": "A system designed to convert a radio station into an autonomous repeater.", "price": 25000, "material": [ "aluminum", "plastic" ], - "weight": 21000, + "weight": "21000 g", "volume": "2 L", "bashing": 4, "to_hit": 1 @@ -1505,7 +1493,7 @@ "price": 1000, "price_postapoc": 100, "material": [ "aluminum", "plastic" ], - "weight": 2857, + "weight": "2857 g", "volume": "1 L" }, { @@ -1519,7 +1507,7 @@ "price": 8000, "price_postapoc": 1000, "material": "ceramic", - "weight": 362, + "weight": "362 g", "volume": "500 ml", "bashing": 4 }, @@ -1533,7 +1521,7 @@ "description": "A filled fish bowl, the tag says 'to Ed' and the fish's name, 'Hoss'. The fish appears to have tiny antlers.", "price": 100, "material": "glass", - "weight": 7042, + "weight": "7042 g", "volume": "1 L", "to_hit": -6 }, @@ -1546,7 +1534,7 @@ "description": "A large rag, drenched in blood. It could be cleaned with boiling water.", "material": "cotton", "flags": [ "NO_SALVAGE", "TRADER_AVOID" ], - "weight": 80, + "weight": "80 g", "volume": "250 ml" }, { @@ -1554,7 +1542,7 @@ "type": "GENERIC", "name": "pipe cleaner", "description": "This is a tool designed to clean interior surface of pipes, bottles, and similar objects. This one is thin enough to be used for cleaning firearm barrels from dirt and fouling.", - "weight": 50, + "weight": "50 g", "volume": "250 ml", "price": 500, "material": [ "steel", "cotton" ], @@ -1571,7 +1559,7 @@ "price": 1000, "price_postapoc": 0, "material": [ "plastic", "steel" ], - "weight": 725, + "weight": "725 g", "volume": "250 ml", "bashing": 4, "to_hit": -3 @@ -1588,7 +1576,7 @@ "price": 200, "price_postapoc": 0, "material": "steel", - "weight": 50, + "weight": "50 g", "volume": "250 ml" }, { @@ -1601,7 +1589,7 @@ "category": "other", "description": "This not-so-little bundle of joy contains Leadworks, LLC's premier offerings: the Enforcer autorevolver (with holster) and Long Ranger rifle. Maintenance kit, batteries for same, and a complimentary copy of the Gun Owner's Handbook are included. The perfect investment for a new family starting out! Disassemble to unpack and enjoy.", "price": 463500, - "weight": 8932, + "weight": "8932 g", "volume": "4500 ml", "to_hit": -2, "material": [ "wood", "steel" ] @@ -1616,7 +1604,7 @@ "category": "other", "description": "A beautiful wooden stock and hardware built to support common Mosin-Nagant actions. With gunsmithing tools, some skill, and a few hours, you could take a 'tacti-cool' rifle and convert it to the classic Russian design.", "price": 12000, - "weight": 2000, + "weight": "2000 g", "volume": "2750 ml", "to_hit": -2, "material": [ "wood", "steel" ] @@ -1631,7 +1619,7 @@ "category": "spare_parts", "description": "A synthetic stock and hardware designed to accommodate common Mosin-Nagant actions. With gunsmithing tools, some skill, and a few hours, you could give the classic Russian design modern furniture and customization capacity.", "price": 12000, - "weight": 2000, + "weight": "2000 g", "volume": "2750 ml", "to_hit": -2, "material": [ "plastic", "steel" ] @@ -1646,7 +1634,7 @@ "category": "spare_parts", "description": "All the parts necessary to convert an L523 to the Carbine configuration, Leadworks LLC's choice for close-quarters work. In order to reconfigure an already-configured L523, you'll need to disassemble it to the base platform, then assemble with the parts you prefer.", "price": 170000, - "weight": 400, + "weight": "400 g", "volume": "500 ml", "to_hit": -2, "material": [ "steel", "plastic" ] @@ -1661,7 +1649,7 @@ "category": "spare_parts", "description": "All the parts necessary to convert an L523 to a Main Battle Rifle, a balanced weapon for all situations. In order to reconfigure an already-configured L523, you'll need to disassemble it to the base platform, then assemble with the parts you prefer.", "price": 170000, - "weight": 700, + "weight": "700 g", "volume": "750 ml", "to_hit": -2, "material": [ "steel", "plastic" ] @@ -1676,7 +1664,7 @@ "category": "spare_parts", "description": "All the parts necessary to convert an L523 to a Designated Shootist Rifle, suitable for long-ranged work. In order to reconfigure an already-configured L523, you'll need to disassemble it to the base platform, then assemble with the parts you prefer.", "price": 200000, - "weight": 1900, + "weight": "1900 g", "volume": "2500 ml", "to_hit": -2, "material": [ "steel", "plastic" ] @@ -1691,7 +1679,7 @@ "category": "spare_parts", "description": "All the parts necessary to convert an L523 to a light machine gun. In order to reconfigure an already-configured L523, you'll need to disassemble it to the base platform, then assemble with the parts you prefer.", "price": 270000, - "weight": 2300, + "weight": "2300 g", "volume": "2750 ml", "to_hit": -2, "material": [ "steel", "plastic" ] @@ -1707,7 +1695,7 @@ "price_postapoc": 0, "material": "plastic", "flags": [ "MC_MOBILE", "MC_RANDOM_STUFF", "MC_MAY_BE_ENCRYPTED", "MC_TURN_USED" ], - "weight": 5, + "weight": "5 g", "volume": 0 }, { @@ -1722,7 +1710,7 @@ "price_postapoc": 0, "material": "plastic", "flags": [ "MC_MOBILE", "MC_USED" ], - "weight": 5, + "weight": "5 g", "volume": 0 }, { @@ -1737,7 +1725,7 @@ "price_postapoc": 0, "material": "plastic", "flags": [ "MC_MOBILE", "MC_ENCRYPTED", "MC_TURN_USED" ], - "weight": 5, + "weight": "5 g", "volume": 0 }, { @@ -1752,7 +1740,7 @@ "price_postapoc": 0, "material": "plastic", "flags": [ "MC_MOBILE", "MC_ENCRYPTED", "MC_TURN_USED", "MC_SCIENCE_STUFF" ], - "weight": 5, + "weight": "5 g", "volume": 0 }, { @@ -1764,7 +1752,7 @@ "description": "A small hand mirror.", "price": 15000, "material": "glass", - "weight": 300, + "weight": "300 g", "volume": "750 ml", "bashing": 2, "to_hit": -3 @@ -1780,7 +1768,7 @@ "price": 20000, "material": "iron", "flags": [ "DURABLE_MELEE", "TRADER_AVOID" ], - "weight": 36287, + "weight": "36287 g", "volume": "3 L", "bashing": 20, "to_hit": -5 @@ -1793,7 +1781,7 @@ "name": "pine bough", "description": "A branch from a pine tree, oozing sticky sap and bristling with prickly needles.", "material": "wood", - "weight": 220, + "weight": "220 g", "volume": "500 ml", "to_hit": -2, "flags": [ "TRADER_AVOID", "FIREWOOD" ] @@ -1805,7 +1793,7 @@ "color": "brown", "name": "pinecone", "description": "A spiny pod from a pine tree. Dry seeds rattle around inside when you shake it.", - "weight": 90, + "weight": "90 g", "volume": "250 ml", "to_hit": -2, "flags": [ "TRADER_AVOID" ] @@ -1815,7 +1803,7 @@ "id": "poppy_flower", "name": "poppy flower", "description": "A poppy stalk with some petals.", - "weight": 40, + "weight": "40 g", "to_hit": -3, "color": "light_red", "symbol": ",", @@ -1828,7 +1816,7 @@ "id": "poppy_bud", "name": "poppy bud", "description": "A poppy bud. Contains some substances commonly produced by a mutated poppy flower.", - "weight": 30, + "weight": "30 g", "to_hit": -3, "color": "light_red", "symbol": ",", @@ -1841,7 +1829,7 @@ "id": "bluebell_flower", "name": "bluebell", "description": "A bluebell stalk with some petals.", - "weight": 40, + "weight": "40 g", "to_hit": -3, "color": "blue", "symbol": ",", @@ -1854,7 +1842,7 @@ "id": "bluebell_bud", "name": "bluebell bud", "description": "A bluebell bud. Contains some substances commonly produced by a bluebell flower.", - "weight": 30, + "weight": "30 g", "to_hit": -3, "color": "blue", "symbol": ",", @@ -1867,7 +1855,7 @@ "id": "dahlia_flower", "name": "dahlia", "description": "A dahlia stalk with some petals.", - "weight": 40, + "weight": "40 g", "to_hit": -3, "color": "magenta", "symbol": ",", @@ -1880,7 +1868,7 @@ "id": "dahlia_bud", "name": "dahlia bud", "description": "A dahlia bud. Contains some substances commonly produced by a dahlia.", - "weight": 30, + "weight": "30 g", "to_hit": -3, "color": "magenta", "symbol": ",", @@ -1893,7 +1881,7 @@ "id": "rose_flower", "name": "rose", "description": "A rose stalk with some petals.", - "weight": 40, + "weight": "40 g", "to_hit": -3, "color": "red", "symbol": ",", @@ -1906,7 +1894,7 @@ "id": "rose_bud", "name": "rose bud", "description": "A rose bud. Contains some substances commonly produced by a rose flower.", - "weight": 30, + "weight": "30 g", "to_hit": -3, "color": "red", "symbol": ",", @@ -1919,7 +1907,7 @@ "id": "hydrangea_flower", "name": "hydrangea", "description": "A hydrangea stalk with some petals.", - "weight": 40, + "weight": "40 g", "to_hit": -3, "color": "light_blue", "symbol": ",", @@ -1932,7 +1920,7 @@ "id": "hydrangea_bud", "name": "hydrangea bud", "description": "A hydrangea bud. Contains some substances commonly produced by a hydrangea flower.", - "weight": 30, + "weight": "30 g", "to_hit": -3, "color": "light_blue", "symbol": ",", @@ -1945,7 +1933,7 @@ "id": "tulip_flower", "name": "tulip", "description": "A tulip stalk with some petals.", - "weight": 40, + "weight": "40 g", "to_hit": -3, "color": "magenta", "symbol": ",", @@ -1958,7 +1946,7 @@ "id": "tulip_bud", "name": "tulip bud", "description": "A tulip bud. Contains some substances commonly produced by a tulip flower.", - "weight": 30, + "weight": "30 g", "to_hit": -3, "color": "magenta", "symbol": ",", @@ -1971,7 +1959,7 @@ "id": "spurge_flower", "name": "spurge", "description": "A spurge stalk with some petals.", - "weight": 40, + "weight": "40 g", "to_hit": -3, "color": "light_green", "symbol": ",", @@ -1984,7 +1972,7 @@ "id": "spurge_bud", "name": "spurge bud", "description": "A spurge bud. Contains some substances commonly produced by a spurge flower.", - "weight": 30, + "weight": "30 g", "to_hit": -3, "color": "light_green", "symbol": ",", @@ -1997,7 +1985,7 @@ "id": "black_eyed_susan_flower", "name": "black eyed susan", "description": "A black eyed susan stalk with some petals.", - "weight": 40, + "weight": "40 g", "to_hit": -3, "color": "yellow", "symbol": ",", @@ -2010,7 +1998,7 @@ "id": "black_eyed_susan_bud", "name": "black eyed susan bud", "description": "A black eyed susan bud. Contains some substances commonly produced by a black eyed susan flower.", - "weight": 30, + "weight": "30 g", "to_hit": -3, "color": "yellow", "symbol": ",", @@ -2023,7 +2011,7 @@ "id": "lily_flower", "name": "lily", "description": "A lily stalk with some petals.", - "weight": 40, + "weight": "40 g", "to_hit": -3, "color": "magenta", "symbol": ",", @@ -2036,7 +2024,7 @@ "id": "lily_bud", "name": "lily bud", "description": "A lily bud. Contains some substances commonly produced by a lily flower.", - "weight": 30, + "weight": "30 g", "to_hit": -3, "color": "magenta", "symbol": ",", @@ -2049,7 +2037,7 @@ "id": "lotus_flower", "name": "lotus", "description": "A lotus stalk with some petals.", - "weight": 40, + "weight": "40 g", "to_hit": -3, "color": "yellow", "symbol": ",", @@ -2062,7 +2050,7 @@ "id": "lotus_bud", "name": "lotus bud", "description": "A lotus bud. Contains some substances commonly produced by a lotus flower.", - "weight": 30, + "weight": "30 g", "to_hit": -3, "color": "yellow", "symbol": ",", @@ -2075,7 +2063,7 @@ "id": "lilac_flower", "name": "lilac", "description": "A lilac stalk with some petals.", - "weight": 40, + "weight": "40 g", "to_hit": -3, "color": "magenta", "symbol": ",", @@ -2088,7 +2076,7 @@ "id": "lilac_bud", "name": "lilac bud", "description": "A lilac bud. Contains some substances commonly produced by a lilac flower.", - "weight": 30, + "weight": "30 g", "to_hit": -3, "color": "magenta", "symbol": ",", @@ -2101,7 +2089,7 @@ "id": "sunflower", "name": "sunflower", "description": "The top of a sunflower, with yellow pedals and some seeds that have yet to be eaten by animals.", - "weight": 450, + "weight": "450 g", "to_hit": -2, "color": "yellow", "symbol": ",", @@ -2115,7 +2103,7 @@ "name": "handful of chamomile flowers", "name_plural": "handfuls of chamomile flowers", "description": "White chamomile flowers, used as a herbal remedy since the ancient times.", - "weight": 50, + "weight": "50 g", "color": "white", "symbol": ",", "material": [ "veggy" ], @@ -2133,7 +2121,7 @@ "description": "A fresh piece of clay. Useful for some crafting recipes.", "price": 531, "material": "freshclay", - "weight": 530, + "weight": "530 g", "volume": "250 ml", "to_hit": -4 }, @@ -2147,7 +2135,7 @@ "description": "A fire hardened building block used in masonry construction.", "price": 2500, "material": [ "clay", "stone" ], - "weight": 969, + "weight": "969 g", "volume": "500 ml", "bashing": 8, "to_hit": -2, @@ -2165,7 +2153,7 @@ "container": "bag_canvas", "price": 5000, "material": "powder", - "weight": 2340, + "weight": "2340 g", "volume": "1 L", "bashing": 4 }, @@ -2180,7 +2168,7 @@ "description": "A compacted mass of soil and natural fibers, still too wet to build with. Load it onto a pallet and leave it to dry.", "price": 0, "material": "soil", - "weight": 1750, + "weight": "1750 g", "volume": "750 ml", "bashing": 2, "to_hit": -3, @@ -2205,7 +2193,7 @@ "description": "A compacted mass of soil and natural fibers, baked dry enough to harden into a brick.", "material": "soil", "flags": "NONCONDUCTIVE", - "weight": 1500, + "weight": "1500 g", "volume": "750 ml", "bashing": 10, "to_hit": -2, @@ -2224,7 +2212,7 @@ "container": "bag_canvas", "price": 200, "material": "soil", - "weight": 2340, + "weight": "2340 g", "volume": "1 L", "bashing": 4 }, @@ -2237,7 +2225,7 @@ "description": "A sheet of tannin-rich bark from a tree, useful for tanning leather", "price": 0, "material": "wood", - "weight": 323, + "weight": "323 g", "volume": "250 ml", "bashing": 4, "to_hit": 1 @@ -2251,7 +2239,7 @@ "description": "A sheet of tough, water-resistant bark taken from a birch tree.", "price": 0, "material": "wood", - "weight": 323, + "weight": "323 g", "volume": "250 ml", "bashing": 4, "to_hit": 1 @@ -2265,7 +2253,7 @@ "description": "A sheet of bark taken from a willow tree. Used in the production of aspirin.", "price": 0, "material": "wood", - "weight": 323, + "weight": "323 g", "volume": "250 ml", "bashing": 4, "to_hit": 1 @@ -2280,7 +2268,7 @@ "price": 1000000, "price_postapoc": 100, "material": "diamond", - "weight": 120, + "weight": "120 g", "volume": "250 ml", "to_hit": -5 }, @@ -2295,7 +2283,7 @@ "price": 2000, "material": [ "flesh" ], "flags": [ "NO_SALVAGE" ], - "weight": 600, + "weight": "600 g", "volume": "750 ml", "category": "spare_parts", "to_hit": -1 @@ -2310,7 +2298,7 @@ "description": "A folded sheet of leather made from carefully tanned animal hide. Can be cut up or used as is.", "price": 5000, "material": [ "leather" ], - "weight": 600, + "weight": "600 g", "volume": "1500 ml", "category": "spare_parts", "to_hit": -1 @@ -2326,7 +2314,7 @@ "price": 2000, "material": [ "fur", "flesh" ], "flags": [ "NO_SALVAGE" ], - "weight": 684, + "weight": "684 g", "volume": "1 L", "category": "spare_parts", "to_hit": -1 @@ -2341,7 +2329,7 @@ "description": "A folded sheet of leather made from carefully tanned animal hide, with the fur still intact. Can be cut up or used as is.", "price": 5000, "material": [ "fur" ], - "weight": 684, + "weight": "684 g", "volume": "1500 ml", "category": "spare_parts", "to_hit": -1 @@ -2357,7 +2345,7 @@ "description": "A pile of dry grass. Can be used to craft a straw bed if there is nothing else to sleep on.", "material": [ "paper" ], "flags": "TRADER_AVOID", - "weight": 20, + "weight": "20 g", "volume": "250 ml", "to_hit": -2 }, @@ -2371,7 +2359,7 @@ "description": "Old straw doll. Represents a woman in a dress.", "price": 100, "material": [ "paper" ], - "weight": 80, + "weight": "80 g", "volume": "500 ml" }, { @@ -2383,7 +2371,7 @@ "description": "A pillow to rest your head on when sleeping.", "price": 1000, "material": [ "cotton" ], - "weight": 514, + "weight": "514 g", "volume": "1 L", "flags": [ "SLEEP_AID" ], "category": "other" @@ -2397,7 +2385,7 @@ "description": "A big, body-sized pillow with a print of an anime character on the front and their scantily clad version on the back.", "price": 1500, "material": [ "cotton" ], - "weight": 774, + "weight": "774 g", "volume": "1750 ml", "flags": [ "SLEEP_AID" ], "category": "other" @@ -2411,7 +2399,7 @@ "description": "A fluffy pillow to rest your head on when sleeping.", "price": 1000, "material": [ "cotton" ], - "weight": 514, + "weight": "514 g", "volume": "1 L", "flags": [ "SLEEP_AID" ], "category": "other" @@ -2425,7 +2413,7 @@ "description": "An old and half rotten teddy bear. Looks like this one commemorates the grave of the child who once owned it.", "price": 200, "material": [ "cotton" ], - "weight": 514, + "weight": "514 g", "volume": "750 ml", "flags": [ "SLEEP_AID" ] }, @@ -2434,7 +2422,7 @@ "id": "money_bundle", "name": "money bundle", "description": "A bundle holding many 20 dollar bills, pretty useless now though.", - "weight": 20, + "weight": "20 g", "to_hit": -3, "color": "green", "symbol": ",", @@ -2450,7 +2438,7 @@ "name": "autoclave pouch", "name_plural": "autoclave pouches", "description": "This is a medical device that bears the approval of the FDA (Food and Drug Administration). If used properly, these pouches can keep things sterile indefinitely.", - "weight": 2, + "weight": "2 g", "volume": 0, "price": 5, "use_action": "PACK_CBM", @@ -2563,7 +2551,7 @@ "description": "A psychoactive plant indigenous to Central Asia and the Indian subcontinent traditionally cultivated for its fiber, oil, for medicinal purposes, and for use as a recreational drug. It requires further processing to be useful.", "price": 2000, "material": "veggy", - "weight": 420, + "weight": "420 g", "volume": "1 L" }, { @@ -2577,7 +2565,7 @@ "looks_like": "wild_herbs", "price": 300, "material": "veggy", - "weight": 100, + "weight": "100 g", "volume": "250 ml" }, { @@ -2591,7 +2579,7 @@ "price_postapoc": 10, "material": "plastic", "flags": [ "NO_UNLOAD", "NO_RELOAD" ], - "weight": 6, + "weight": "6 g", "volume": 0, "to_hit": -3, "max_charges": 200000000, @@ -2647,23 +2635,10 @@ "category": "other", "price": 500, "material": "plastic", - "weight": 6, + "weight": "6 g", "volume": 0, "to_hit": -3 }, - { - "type": "GENERIC", - "id": "rmi2_corpse", - "symbol": "%", - "color": "white", - "name": "desiccated corpse", - "description": "A badly mangled and desiccated partial corpse. It seems whatever thing killed him did so with a single swipe of a gigantic claw.", - "category": "other", - "material": "hflesh", - "price": 0, - "volume": "7500 ml", - "flags": [ "TRADER_AVOID" ] - }, { "id": "gasdiscount_silver", "type": "TOOL", @@ -2675,7 +2650,7 @@ "price": 500, "material": "plastic", "flags": [ "GAS_DISCOUNT", "DISCOUNT_VALUE_1" ], - "weight": 6, + "weight": "6 g", "volume": 0, "to_hit": -3 }, @@ -2690,7 +2665,7 @@ "price": 500, "material": "plastic", "flags": [ "GAS_DISCOUNT", "DISCOUNT_VALUE_2" ], - "weight": 6, + "weight": "6 g", "volume": 0, "to_hit": -3 }, @@ -2705,7 +2680,7 @@ "price": 500, "material": "plastic", "flags": [ "GAS_DISCOUNT", "DISCOUNT_VALUE_3" ], - "weight": 6, + "weight": "6 g", "volume": 0, "to_hit": -3 }, @@ -2719,7 +2694,7 @@ "price": 60000, "price_postapoc": 5000, "material": "plastic", - "weight": 6, + "weight": "6 g", "volume": 0, "to_hit": -3 }, @@ -2733,7 +2708,7 @@ "price": 120000, "price_postapoc": 10000, "material": "plastic", - "weight": 6, + "weight": "6 g", "volume": 0, "to_hit": -3 }, @@ -2748,7 +2723,7 @@ "price": 120000, "price_postapoc": 10000, "material": "plastic", - "weight": 6, + "weight": "6 g", "volume": 0, "to_hit": -3 }, @@ -2762,7 +2737,7 @@ "price": 1000, "material": "neoprene", "flags": [ "NO_SALVAGE" ], - "weight": 80, + "weight": "80 g", "volume": "250 ml", "category": "spare_parts" }, @@ -2775,7 +2750,7 @@ "description": "A laser cannon stripped from the barrel of a TX-5LR Cerberus laser turret. Unusable as a weapon on its own without the necessary parts.", "price": 5000000, "material": [ "steel", "plastic" ], - "weight": 5000, + "weight": "5000 g", "volume": "750 ml", "category": "spare_parts" }, @@ -2787,7 +2762,7 @@ "symbol": ",", "color": "white", "material": "glass", - "weight": 10, + "weight": "10 g", "volume": "250 ml", "price": 500 }, @@ -2796,7 +2771,7 @@ "type": "AMMO", "name": "shrapnel", "description": "A twisted shard of jagged metal.", - "weight": 5, + "weight": "5 g", "volume": "250 ml", "price": 0, "stack_size": 50, @@ -2811,7 +2786,7 @@ "category": "other", "name": "clay flower pot", "description": "A nice looking clay pot used for planting.", - "weight": 480, + "weight": "480 g", "volume": "2500 ml", "price": 600, "bashing": 1, @@ -2825,7 +2800,7 @@ "category": "other", "name": "plastic flower pot", "description": "A cheap plastic pot used for planting.", - "weight": 190, + "weight": "190 g", "volume": "2500 ml", "price": 300, "bashing": 1, @@ -2839,7 +2814,7 @@ "category": "other", "name": "fluid preserved brain", "description": "This 3L jar contains a human brain preserved in a formaldehyde solution.", - "weight": 365, + "weight": "365 g", "volume": "3 L", "price": 100, "to_hit": -1, @@ -2855,7 +2830,7 @@ "category": "spare_parts", "name": "evaporator coil", "description": "A set of long, snakelike tubes for evaporating refrigerant.", - "weight": 20000, + "weight": "20000 g", "volume": "2 L", "price": 1000, "material": "steel", @@ -2868,7 +2843,7 @@ "category": "spare_parts", "name": "condensor coil", "description": "A compressor and a fan work together to cool down the refrigerant.", - "weight": 20000, + "weight": "20000 g", "volume": "2 L", "price": 1000, "material": "steel", @@ -2881,7 +2856,7 @@ "name": "refrigerant tank", "name_plural": "refrigerant tanks", "description": "A small tank containing some sort of refrigerant often used in devices such as freezers. Hermetically sealed to prevent evaporation - cannot be opened without prior connection to compatible valve.", - "weight": 410, + "weight": "410 g", "volume": "1L", "price": 3000, "to_hit": -4, @@ -2900,7 +2875,7 @@ "description": "An armor plating made of a very thick steel, specifically engineered for use in a bullet resistant vest.", "price": 10000, "material": "hardsteel", - "weight": 1500, + "weight": "1500 g", "volume": "500 ml", "bashing": 6 }, @@ -2914,7 +2889,7 @@ "description": "A steel armor plate, specifically engineered for use in a bullet resistant vest.", "price": 9000, "material": "steel", - "weight": 1000, + "weight": "1000 g", "volume": "500 ml", "bashing": 5 }, @@ -2928,7 +2903,7 @@ "description": "A small lock, with a set of keys still inserted.", "price": 500, "material": "steel", - "weight": 5, + "weight": "5 g", "volume": "250 ml", "bashing": 1 }, @@ -2940,7 +2915,7 @@ "name": "in progress craft", "description": "This is an in progress craft.", "price": 0, - "weight": 1, + "weight": "1 g", "volume": "250 ml", "max_charges": 20, "use_action": "CRAFT", @@ -2956,7 +2931,7 @@ "description": "A bumper mounted rig for attaching and storing a spare tire on the back of a vehicle. Combine it with a wheel to get a mountable piece.", "price": 3500, "material": "steel", - "weight": 5000, + "weight": "5000 g", "volume": "5 L", "bashing": 8 }, @@ -2970,7 +2945,7 @@ "name": "welding component kit", "description": "A set of components useful for constructing a full-featured welding station, complete with soldering capability.", "price": 9000, - "weight": 4500, + "weight": "4500 g", "volume": "3 L", "bashing": 8 }, @@ -2984,7 +2959,7 @@ "price": 25000, "price_postapoc": 2000, "material": [ "steel", "plastic", "wood" ], - "weight": 11339, + "weight": "11339 g", "volume": "3 L" }, { @@ -2997,7 +2972,7 @@ "description": "A broken turret. Much less threatening now that it's laid limp on solid ground. Could be gutted for parts.", "price": 1000, "material": [ "steel", "plastic" ], - "weight": 62650, + "weight": "62650 g", "volume": "30 L", "bashing": 4, "cutting": 4, @@ -3009,8 +2984,17 @@ "id": "broken_turret_rifle", "symbol": ",", "color": "green", - "name": "broken milspec turret", - "weight": 70000, + "name": "broken M249 autonomous CROWS II", + "weight": "70000 g", + "copy-from": "broken_turret" + }, + { + "type": "GENERIC", + "id": "broken_crows_m240", + "symbol": ",", + "color": "green", + "name": "broken M240 autonomous CROWS II", + "weight": "70000 g", "copy-from": "broken_turret" }, { @@ -3018,8 +3002,8 @@ "id": "broken_turret_bmg", "symbol": ",", "color": "green", - "name": "broken antimateriel turret", - "weight": 100000, + "name": "broken M2 autonomous CROWS II", + "weight": "100000 g", "copy-from": "broken_turret" }, { @@ -3028,7 +3012,7 @@ "symbol": ",", "color": "green", "name": "broken laser turret", - "weight": 110000, + "weight": "110000 g", "copy-from": "broken_turret" }, { @@ -3041,7 +3025,24 @@ "description": "A broken secubot, with its casing broken and fluid drained. Could be gutted for parts.", "price": 1000, "material": [ "steel", "plastic" ], - "weight": 100000, + "weight": "100000 g", + "volume": "65000 ml", + "bashing": 4, + "cutting": 4, + "to_hit": -3, + "flags": [ "TRADER_AVOID", "NO_REPAIR" ] + }, + { + "type": "GENERIC", + "id": "broken_talon_m202a1", + "symbol": ",", + "color": "green", + "name": "broken M202A1 TALON", + "category": "other", + "description": "A broken TALON UGV, with its casing broken and fluid drained. Could be gutted for parts.", + "price": 1000, + "material": [ "steel", "plastic" ], + "weight": "100000 g", "volume": "65000 ml", "bashing": 4, "cutting": 4, @@ -3058,7 +3059,7 @@ "description": "A reinforced brick designed to withstand intense heat.", "price": 2500, "material": [ "clay", "stone" ], - "weight": 969, + "weight": "969 g", "volume": "500 ml", "bashing": 8, "to_hit": -2, diff --git a/data/json/items/generic/ammolink.json b/data/json/items/generic/ammolink.json index e6e2234d3f819..7d08013a2769f 100644 --- a/data/json/items/generic/ammolink.json +++ b/data/json/items/generic/ammolink.json @@ -5,7 +5,7 @@ "category": "spare_parts", "name": "ammo belt linkage", "description": "A small metal linkage from a disintegrating ammo belt.", - "weight": 2, + "weight": "2 g", "volume": "2ml", "stackable": true, "material": "steel", @@ -32,7 +32,7 @@ "copy-from": "ammolink", "type": "GENERIC", "name": "40mm grenade belt linkage", - "weight": 10, + "weight": "10 g", "volume": "10ml", "use_action": { "type": "ammobelt", "belt": "belt40mm" } }, diff --git a/data/json/items/generic/casing.json b/data/json/items/generic/casing.json index d52ccb6c33167..e278185091429 100644 --- a/data/json/items/generic/casing.json +++ b/data/json/items/generic/casing.json @@ -16,7 +16,7 @@ "type": "GENERIC", "name": ".223 casing", "description": "An empty casing from a .223 round.", - "weight": 5, + "weight": "5 g", "volume": "5ml" }, { @@ -25,7 +25,7 @@ "type": "GENERIC", "name": ".22 LR casing", "description": "An empty casing from a .22 LR round. These can't be hand-reloaded.", - "weight": 2, + "weight": "2 g", "volume": "3ml" }, { @@ -34,7 +34,7 @@ "type": "GENERIC", "name": ".30-06 casing", "description": "An empty casing from a .30-06 round.", - "weight": 7, + "weight": "7 g", "volume": "10ml" }, { @@ -43,7 +43,7 @@ "type": "GENERIC", "name": ".270 Winchester casing", "description": "An empty casing from a .270 Winchester round.", - "weight": 7, + "weight": "7 g", "volume": "10ml" }, { @@ -52,7 +52,7 @@ "type": "GENERIC", "name": ".300 Win Mag casing", "description": "An empty casing from a .300 Winchester Magnum round.", - "weight": 7, + "weight": "7 g", "volume": "10ml" }, { @@ -61,7 +61,7 @@ "type": "GENERIC", "name": ".308 casing", "description": "An empty casing from a .308 round.", - "weight": 6, + "weight": "6 g", "volume": "9ml" }, { @@ -70,7 +70,7 @@ "type": "GENERIC", "name": "7.62x51mm casing", "description": "An empty casing from a 7.62x51mm M80 round.", - "weight": 6, + "weight": "6 g", "volume": "9ml" }, { @@ -79,7 +79,7 @@ "type": "GENERIC", "name": ".32 ACP casing", "description": "An empty casing from a .32 ACP round.", - "weight": 2, + "weight": "2 g", "volume": "3ml" }, { @@ -88,7 +88,7 @@ "type": "GENERIC", "name": ".38 Special casing", "description": "An empty casing from a .38 Special round.", - "weight": 3, + "weight": "3 g", "volume": "4ml" }, { @@ -97,7 +97,7 @@ "type": "GENERIC", "name": ".38 Super casing", "description": "An empty casing from a .38 Super round.", - "weight": 3, + "weight": "3 g", "volume": "4ml" }, { @@ -106,7 +106,7 @@ "type": "GENERIC", "name": ".40 S&W casing", "description": "An empty casing from a .40 S&W round.", - "weight": 3, + "weight": "3 g", "volume": "5ml" }, { @@ -115,7 +115,7 @@ "type": "GENERIC", "name": "10mm Auto casing", "description": "An empty casing from a 10mm Auto round.", - "weight": 3, + "weight": "3 g", "volume": "5ml" }, { @@ -124,7 +124,7 @@ "category": "spare_parts", "name": "40mm canister", "description": "A large canister from a spent 40mm grenade.", - "weight": 50, + "weight": "50 g", "volume": "25ml", "material": "steel", "symbol": "=", @@ -136,7 +136,7 @@ "type": "GENERIC", "name": ".44 Magnum casing", "description": "An empty casing from a .44 Magnum round.", - "weight": 4, + "weight": "4 g", "volume": "6ml" }, { @@ -145,7 +145,7 @@ "type": "GENERIC", "name": ".454 Casull casing", "description": "An empty casing from a .454 Casull round.", - "weight": 7, + "weight": "7 g", "volume": "10ml" }, { @@ -154,7 +154,7 @@ "type": "GENERIC", "name": ".45 ACP casing", "description": "An empty casing from a .45 ACP round.", - "weight": 4, + "weight": "4 g", "volume": "6ml" }, { @@ -163,7 +163,7 @@ "type": "GENERIC", "name": ".45 Colt casing", "description": "An empty casing from a .45 Colt round.", - "weight": 4, + "weight": "4 g", "volume": "6ml" }, { @@ -172,7 +172,7 @@ "type": "GENERIC", "name": ".45-70 casing", "description": "An empty casing from a .45-70 Government round.", - "weight": 4, + "weight": "4 g", "volume": "10ml" }, { @@ -181,7 +181,7 @@ "type": "GENERIC", "name": "4.6x30mm casing", "description": "An empty casing from a 4.6x30mm round.", - "weight": 2, + "weight": "2 g", "volume": "3ml" }, { @@ -190,7 +190,7 @@ "type": "GENERIC", "name": ".460 Rowland casing", "description": "An empty casing from a .460 Rowland round. It looks deceptively like a .45ACP casing.", - "weight": 4, + "weight": "4 g", "volume": "6ml" }, { @@ -199,7 +199,7 @@ "type": "GENERIC", "name": "5x50mm hull", "description": "An empty plastic hull from a 5x50mm flechette round.", - "weight": 1, + "weight": "1 g", "volume": "5ml", "material": "plastic", "color": "light_green" @@ -210,7 +210,7 @@ "type": "GENERIC", "name": ".500 S&W Magnum casing", "description": "An empty casing from a .500 S&W Magnum round.", - "weight": 7, + "weight": "7 g", "volume": "10ml" }, { @@ -219,7 +219,7 @@ "type": "GENERIC", "name": ".50 BMG casing", "description": "An empty casing from a .50 BMG round. These are rare, so you might want to hold onto these.", - "weight": 18, + "weight": "18 g", "volume": "12ml" }, { @@ -228,7 +228,7 @@ "type": "GENERIC", "name": "5.45x39mm casing", "description": "An empty casing from a 5.45x39mm round.", - "weight": 4, + "weight": "4 g", "volume": "7ml" }, { @@ -237,7 +237,7 @@ "type": "GENERIC", "name": "5.7x28mm casing", "description": "An empty casing from a 5.7x28mm round.", - "weight": 2, + "weight": "2 g", "volume": "3ml" }, { @@ -246,7 +246,7 @@ "type": "GENERIC", "name": ".700 NX casing", "description": "An empty casing from a .700 NX round. These are rare, so you might want to hold onto these.", - "weight": 18, + "weight": "18 g", "volume": "12ml" }, { @@ -255,7 +255,7 @@ "type": "GENERIC", "name": "7.62x54mmR casing", "description": "An empty casing from a 7.62x54mmR round.", - "weight": 7, + "weight": "7 g", "volume": "10ml" }, { @@ -264,7 +264,7 @@ "type": "GENERIC", "name": "7.62x39mm casing", "description": "An empty casing from a 7.62x39mm round.", - "weight": 6, + "weight": "6 g", "volume": "9ml" }, { @@ -273,7 +273,7 @@ "type": "GENERIC", "name": "7.62x25mm casing", "description": "An empty casing from a 7.62x25mm round.", - "weight": 4, + "weight": "4 g", "volume": "7ml" }, { @@ -282,7 +282,7 @@ "type": "GENERIC", "name": "9x19mm casing", "description": "An empty casing from a 9x19mm round.", - "weight": 3, + "weight": "3 g", "volume": "5ml" }, { @@ -291,7 +291,7 @@ "type": "GENERIC", "name": ".357 SIG casing", "description": "An empty casing from a .357 SIG round.", - "weight": 3, + "weight": "3 g", "volume": "5ml" }, { @@ -300,7 +300,7 @@ "type": "GENERIC", "name": ".357 magnum casing", "description": "An empty casing from a .357 magnum round.", - "weight": 3, + "weight": "3 g", "volume": "5ml" }, { @@ -309,7 +309,7 @@ "type": "GENERIC", "name": "9x18mm casing", "description": "An empty casing from a 9x18mm round.", - "weight": 3, + "weight": "3 g", "volume": "5ml" }, { @@ -318,7 +318,7 @@ "type": "GENERIC", "name": ".380 ACP casing", "description": "An empty casing from a .380 ACP round.", - "weight": 3, + "weight": "3 g", "volume": "5ml" }, { @@ -329,7 +329,7 @@ "color": "dark_gray", "description": "An empty steel tube which once contained a 152mm ATGM. Now it's essentially just a huge pipe.", "material": "steel", - "weight": 9500, + "weight": "9500 g", "volume": "7500 ml" }, { @@ -338,7 +338,7 @@ "category": "spare_parts", "name": "shotgun hull", "description": "An empty hull from a shotgun shell.", - "weight": 8, + "weight": "8 g", "volume": "12ml", "stackable": true, "material": "plastic", @@ -352,7 +352,7 @@ "category": "spare_parts", "name": ".410 hull", "description": "An empty hull from a .410 shotgun shell.", - "weight": 8, + "weight": "8 g", "volume": "12ml", "stackable": true, "material": "plastic", @@ -366,7 +366,7 @@ "type": "GENERIC", "name": ".300BLK casing", "description": "An empty casing from a .300 AAC Blackout round.", - "weight": 6, + "weight": "6 g", "volume": "9ml" } ] diff --git a/data/json/items/generic/currency.json b/data/json/items/generic/currency.json index 78fd96a5dd74c..666d35ed9f6af 100644 --- a/data/json/items/generic/currency.json +++ b/data/json/items/generic/currency.json @@ -7,7 +7,7 @@ "price": 5000, "price_postapoc": 320, "//": "$50 bills have substantial pre-Cataclysm value, but are worth 1 meat jerky", - "weight": 1, + "weight": "1 g", "to_hit": -3, "color": "white", "symbol": "$", @@ -21,7 +21,7 @@ "price": 90000, "price_postapoc": 5000, "//": "Low carat gold alloy for hardness, but it's still the best part of an ounce of gold. Yes, the weight is correct for the volume.", - "weight": 28, + "weight": "28 g", "to_hit": -3, "color": "brown", "symbol": "$", @@ -35,7 +35,7 @@ "description": "This is a coin that has been flattened in a novelty coin flattening machine. The machine has been somewhat crudely altered so that the design - which appears to once have been Mickey Mouse - is overlayed with a handwritten emblem of a book. There is some text that faintly reads 'Campus Exchange Token'.", "price": 5, "price_postapoc": 320, - "weight": 18, + "weight": "18 g", "to_hit": -3, "color": "brown", "symbol": "$", @@ -48,7 +48,7 @@ "description": "This is a slip of paper signed by the issuer.", "price": 5, "price_postapoc": 320, - "weight": 1, + "weight": "1 g", "to_hit": -3, "color": "white", "symbol": "$", diff --git a/data/json/items/generic/dining_kitchen.json b/data/json/items/generic/dining_kitchen.json index e78fa69d59fb5..3e2ee89af1b28 100644 --- a/data/json/items/generic/dining_kitchen.json +++ b/data/json/items/generic/dining_kitchen.json @@ -8,7 +8,7 @@ "color": "light_gray", "price": 100, "price_postapoc": 0, - "weight": 48, + "weight": "48 g", "volume": "25 ml", "material": "steel", "bashing": 2, @@ -24,7 +24,7 @@ "color": "light_gray", "price": 200, "price_postapoc": 0, - "weight": 158, + "weight": "158 g", "volume": "75 ml", "material": "steel", "bashing": 3, @@ -40,7 +40,7 @@ "color": "light_gray", "price": 10, "price_postapoc": 0, - "weight": 28, + "weight": "28 g", "volume": "25 ml", "material": "plastic", "bashing": 1, @@ -57,7 +57,7 @@ "price": 1200, "price_postapoc": 0, "material": "ceramic", - "weight": 322, + "weight": "322 g", "volume": "250 ml", "bashing": 3, "to_hit:": -1 @@ -72,7 +72,7 @@ "price": 1400, "price_postapoc": 0, "material": "glass", - "weight": 322, + "weight": "322 g", "volume": "250 ml", "bashing": 3, "to_hit:": -1 @@ -87,7 +87,7 @@ "price": 400, "price_postapoc": 0, "material": "tin", - "weight": 262, + "weight": "262 g", "volume": "250 ml", "bashing": 2, "to_hit:": -1 @@ -102,7 +102,7 @@ "price": 400, "price_postapoc": 0, "material": "plastic", - "weight": 130, + "weight": "130 g", "volume": "250 ml", "bashing": 1, "to_hit:": -1 @@ -521,7 +521,7 @@ "color": "light_gray", "price": 100, "price_postapoc": 0, - "weight": 28, + "weight": "28 g", "volume": "15 ml", "material": "wood", "bashing": 1, @@ -601,7 +601,7 @@ "id": "rolling_pin", "name": "rolling pin", "description": "A stout piece of hardwood, turned and sanded smooth, with rounded handles at the ends. This timeless kitchen tool also doubles as a very effective club.", - "weight": 725, + "weight": "725 g", "to_hit": 1, "color": "brown", "symbol": "/", @@ -621,7 +621,7 @@ "copy-from": "base_cookpot", "material": "steel", "color": "light_gray", - "weight": 550, + "weight": "550 g", "volume": "2 L", "bashing": 6, "container_data": { "contains": "2 L", "watertight": true } @@ -635,7 +635,7 @@ "copy-from": "base_cookpot", "material": "iron", "color": "dark_gray", - "weight": 3000, + "weight": "3000 g", "volume": "2 L", "bashing": 10, "container_data": { "contains": "2 L", "watertight": true } @@ -649,7 +649,7 @@ "copy-from": "base_cookpot", "material": "copper", "color": "light_red", - "weight": 750, + "weight": "750 g", "volume": "2 L", "bashing": 6, "container_data": { "contains": "2 L", "watertight": true } @@ -663,7 +663,7 @@ "copy-from": "base_cookpot", "material": "ceramic", "color": "white", - "weight": 650, + "weight": "650 g", "volume": "2 L", "bashing": 4, "container_data": { "contains": "2 L", "watertight": true } @@ -677,7 +677,7 @@ "copy-from": "base_cookpot", "material": "steel", "color": "light_gray", - "weight": 2490, + "weight": "2490 g", "volume": "9 L", "//": "Volume assumes you can stick some stuff in the pot inside your bag", "bashing": 8, @@ -689,7 +689,7 @@ "category": "tools", "name": "canning pot", "description": "A very large 25 liter pot, primarily meant for canning food in glass jars via the water bath method, though it can cook normal foods just as well. Canning foods with it will require a lot of water. If you're only canning a couple of jars at a time, you'd fill it up with rocks or something to displace the water above the lids.", - "weight": 5625, + "weight": "5625 g", "volume": "25 L", "price": 20000, "to_hit": -2, @@ -711,7 +711,7 @@ "material": "iron", "color": "dark_gray", "proportional": { "to_hit": 2 }, - "weight": 2628, + "weight": "2628 g", "volume": "1 L", "bashing": 12, "container_data": { "contains": "1 L", "watertight": true }, @@ -728,7 +728,7 @@ "material": "steel", "color": "light_gray", "proportional": { "to_hit": 2 }, - "weight": 528, + "weight": "528 g", "volume": "1 L", "bashing": 8, "container_data": { "contains": "2 L", "watertight": true }, @@ -745,7 +745,7 @@ "material": "copper", "color": "light_red", "proportional": { "to_hit": 2 }, - "weight": 628, + "weight": "628 g", "volume": "1 L", "bashing": 7, "container_data": { "contains": "1 L", "watertight": true }, @@ -758,7 +758,7 @@ "category": "tools", "name": "makeshift pot", "description": "A sheet of metal crudely hammered into a cooking pot. Good enough to cook food and boil water, but not as useful as proper cookware.", - "weight": 6000, + "weight": "6000 g", "volume": "1 L", "price": 200, "price_postapoc": 5, @@ -777,7 +777,7 @@ "category": "tools", "name": "makeshift copper pot", "description": "A cooking pot crudely hammered out of copper. Good enough to cook food and boil water, but not as useful as proper cookware.", - "weight": 884, + "weight": "884 g", "volume": "1 L", "price": 200, "price_postapoc": 5, @@ -799,7 +799,7 @@ "copy-from": "base_cookpot", "material": "steel", "color": "light_gray", - "weight": 728, + "weight": "728 g", "volume": "1500 ml", "bashing": 5, "container_data": { "contains": "1500 ml", "watertight": true }, @@ -834,7 +834,7 @@ "category": "other", "name": "cutting board", "description": "A large flat piece of wood for chopping vegetables on without ruining your knife or your countertop.", - "weight": 945, + "weight": "945 g", "to_hit": -1, "color": "brown", "symbol": "/", diff --git a/data/json/items/generic/spares.json b/data/json/items/generic/spares.json index 9d74f72bc0a8c..7814edabf8aa4 100644 --- a/data/json/items/generic/spares.json +++ b/data/json/items/generic/spares.json @@ -16,7 +16,7 @@ "name": "drive belt", "description": "A synthetic rubber V-belt with steel reinforcement fibers commonly fitted to engines or other industrial equipment.", "material": [ "plastic", "steel" ], - "weight": 850, + "weight": "850 g", "volume": "500 ml", "price": 1200 }, @@ -27,7 +27,7 @@ "name": "makeshift drive belt", "description": "An improvised belt useful for repairing engines or other industrial equipment when no better alternative is available.", "material": [ "cotton", "leather" ], - "weight": 1250, + "weight": "1250 g", "volume": "750 ml", "price": 200 }, @@ -38,7 +38,7 @@ "name": "air filter", "description": "A plastic box containing crêped paper used to filter the air supply for combustion engines or other industrial equipment.", "material": [ "plastic", "paper" ], - "weight": 360, + "weight": "360 g", "volume": "500 ml", "price": 1900 }, @@ -49,7 +49,7 @@ "name": "makeshift air filter", "description": "An improvised air filter useful for repairing engines or other industrial equipment when no better alternative is available.", "material": [ "plastic", "paper" ], - "weight": 480, + "weight": "480 g", "volume": "750 ml", "price": 200 }, @@ -60,7 +60,7 @@ "name": "automotive filter", "description": "A steel can containing filter paper designed for automotive use.", "material": [ "steel", "paper" ], - "weight": 480, + "weight": "480 g", "volume": "500 ml", "price": 1900 }, @@ -71,7 +71,7 @@ "name": "makeshift automotive filter", "description": "An improvised automotive filter useful for repairing engines or other industrial equipment when no better alternative is available.", "material": [ "steel", "paper" ], - "weight": 690, + "weight": "690 g", "volume": "750 ml", "price": 200 }, @@ -82,7 +82,7 @@ "name": "glow plug", "description": "A cylindrical heating device designed to be screwed in to a diesel engine to aid starting in cold weather.", "material": [ "plastic", "copper" ], - "weight": 260, + "weight": "260 g", "volume": "250 ml", "price": 2300 }, @@ -93,7 +93,7 @@ "name": "high-pressure pump", "description": "An complex mechanical pump capable of achieving high pressures. Far beyond anything you could reasonably improvise.", "material": "iron", - "weight": 2800, + "weight": "2800 g", "volume": "1250 ml", "price": 28900 }, @@ -104,7 +104,7 @@ "name": "mechanical pump", "description": "An simple cast iron mechanical impeller pump. It's not good for much of anything on its own.", "material": "iron", - "weight": 2400, + "weight": "2400 g", "volume": "1 L", "price": 1800 } diff --git a/data/json/items/generic/string.json b/data/json/items/generic/string.json index e2462ac8e19d2..4245e49612ac5 100644 --- a/data/json/items/generic/string.json +++ b/data/json/items/generic/string.json @@ -5,7 +5,7 @@ "category": "spare_parts", "name": "small string", "description": "A 6-inch long piece of cotton string.", - "weight": 6, + "weight": "6 g", "volume": "10ml", "price": 10, "material": "cotton", @@ -78,6 +78,6 @@ "health": -20, "volume": "1 L", "stack_size": 10, - "weight": 80 + "weight": "80 g" } ] diff --git a/data/json/items/generic/toys_and_sports.json b/data/json/items/generic/toys_and_sports.json index 0fdb1db4b1cc7..b28140f1c4e9d 100644 --- a/data/json/items/generic/toys_and_sports.json +++ b/data/json/items/generic/toys_and_sports.json @@ -4,7 +4,7 @@ "type": "TOOL", "name": "talking doll", "description": "This is a talking doll, meant for children. Fortunately it still works, and you could unload the batteries out of it.", - "weight": 907, + "weight": "907 g", "volume": "750 ml", "price": 2000, "to_hit": -1, @@ -19,13 +19,13 @@ [ "battery", [ + "light_minus_disposable_cell", + "light_disposable_cell", "light_minus_battery_cell", "light_battery_cell", "light_plus_battery_cell", "light_atomic_battery_cell", - "light_minus_atomic_battery_cell", - "light_minus_disposable_cell", - "light_disposable_cell" + "light_minus_atomic_battery_cell" ] ] ], @@ -36,7 +36,7 @@ "type": "TOOL", "name": "talking doll", "description": "This is a talking doll, meant for children. Fortunately it still works, and you could unload the batteries out of it.", - "weight": 907, + "weight": "907 g", "volume": "750 ml", "price": 2000, "to_hit": -1, @@ -51,13 +51,13 @@ [ "battery", [ + "light_minus_disposable_cell", + "light_disposable_cell", "light_minus_battery_cell", "light_battery_cell", "light_plus_battery_cell", "light_atomic_battery_cell", - "light_minus_atomic_battery_cell", - "light_minus_disposable_cell", - "light_disposable_cell" + "light_minus_atomic_battery_cell" ] ] ], @@ -73,7 +73,7 @@ "description": "A baseball, good for throwing at enemies. Getting hit with one of these hurts a lot more than you might think.", "price": 1000, "material": "leather", - "weight": 150, + "weight": "150 g", "volume": "250 ml", "bashing": 6, "to_hit": 3 @@ -88,7 +88,7 @@ "description": "An oval made of leather and string, it's easily thrown but does little damage. You could take it apart into leather if you wanted.", "price": 1000, "material": "leather", - "weight": 400, + "weight": "400 g", "volume": "750 ml", "bashing": 4, "to_hit": -1 @@ -103,7 +103,7 @@ "description": "A high-quality indoor basketball. You may throw it at zombies.", "price": 1200, "material": "leather", - "weight": 800, + "weight": "800 g", "volume": "1 L", "bashing": 6, "to_hit": -1 @@ -118,7 +118,7 @@ "description": "A heavy circular block of solid rubber, normally used for playing hockey. You can throw it to cause some serious harm.", "price": 1000, "material": "plastic", - "weight": 170, + "weight": "170 g", "volume": "250 ml", "bashing": 7, "to_hit": 2 diff --git a/data/json/items/grenades.json b/data/json/items/grenades.json index 9ea91b6f512a3..db1eab4e9eda1 100644 --- a/data/json/items/grenades.json +++ b/data/json/items/grenades.json @@ -5,7 +5,7 @@ "category": "weapons", "name": "grenade", "description": "This is a military-grade fragmentary hand grenade. Use this item to pull the pin and light the fuse. You will then have five turns before it explodes; throwing it would be a good idea.", - "weight": 397, + "weight": "397 g", "volume": "250 ml", "price": 1500, "to_hit": -1, @@ -29,7 +29,7 @@ "category": "weapons", "name": "active grenade", "description": "This is an active grenade, and will explode any second now. Better throw it!", - "weight": 397, + "weight": "397 g", "volume": "250 ml", "price": 0, "to_hit": -1, @@ -55,7 +55,7 @@ "type": "TOOL", "name": "makeshift grenade", "description": "An improvised explosive device cobbled together from parts. Use this item to pull the pin and light the fuse. You will then have some amount of time before it explodes; throwing it would be a good idea.", - "weight": 350, + "weight": "350 g", "price": 750, "material": [ "aluminum", "iron" ], "symbol": "*", @@ -97,7 +97,7 @@ "category": "weapons", "name": "incendiary grenade", "description": "This is a military-grade incendiary hand grenade. Use this item to pull the pin and light the fuse. You will then have five turns before it explodes into a raging inferno; throwing it would be a good idea.", - "weight": 180, + "weight": "180 g", "volume": "250 ml", "price": 2000, "to_hit": -1, @@ -121,7 +121,7 @@ "category": "weapons", "name": "active incendiary grenade", "description": "This is an active incendiary grenade, likely to burst into an inferno any second now. Better throw it!", - "weight": 180, + "weight": "180 g", "volume": "250 ml", "price": 0, "to_hit": -1, @@ -142,7 +142,7 @@ "category": "weapons", "name": "scrambler grenade", "description": "This is a highly modified EMP grenade, designed to scramble robots' IFF control chips rather than destroy them. This converts the robot to your side for a short time, before the backup systems kick in. Use this item to pull the pin and light the fuse, turning it into an active scrambler grenade.", - "weight": 500, + "weight": "500 g", "volume": "250 ml", "price": 6000, "to_hit": -1, @@ -166,7 +166,7 @@ "category": "weapons", "name": "active scrambler grenade", "description": "This scrambler grenade is active, and will soon detonate, releasing a control wave that temporarily converts robots to your side.", - "weight": 500, + "weight": "500 g", "volume": "250 ml", "price": 0, "to_hit": -1, @@ -193,7 +193,7 @@ "type": "GENERIC", "category": "weapons", "name": "canister grenade", - "weight": 1058, + "weight": "1058 g", "volume": "250 ml", "material": [ "steel" ], "symbol": "*", @@ -228,7 +228,7 @@ "name": "nail bomb", "description": "A crude and bulky improvised fragmentation grenade. Use this item to light the fuse. You will then have five turns before it explodes; throwing it would be a good idea.", "category": "weapons", - "weight": 470, + "weight": "470 g", "volume": "500 ml", "bashing": 4, "to_hit": 1, diff --git a/data/json/items/gun/12mm.json b/data/json/items/gun/12mm.json index 4047789e1006d..4f9b8a5f9511b 100644 --- a/data/json/items/gun/12mm.json +++ b/data/json/items/gun/12mm.json @@ -5,7 +5,7 @@ "type": "GUN", "name": "H&K G80 Railgun", "description": "Developed by Heckler & Koch in 2033, the railgun magnetically propels a ferromagnetic projectile using an alternating current. Powered by UPS.", - "weight": 3914, + "weight": "3914 g", "volume": "2750 ml", "price": 1920000, "to_hit": -1, diff --git a/data/json/items/gun/20x66mm.json b/data/json/items/gun/20x66mm.json index 062ff834ada05..2c903c1145e18 100644 --- a/data/json/items/gun/20x66mm.json +++ b/data/json/items/gun/20x66mm.json @@ -6,7 +6,7 @@ "reload_noise": "chuk chuk.", "name": "RM120c shotgun", "description": "Utilizing a powerful and unusual caliber, the Rivtech RM120c caseless pump-action shotgun was designed for hunting big game, with durability and ease of use as priorities.", - "weight": 1880, + "weight": "1880 g", "volume": "2250 ml", "price": 310000, "to_hit": -1, @@ -41,7 +41,7 @@ "reload_noise_volume": 10, "name": "RM20 autoshotgun", "description": "Utilizing a powerful and unusual caliber, the Rivtech RM20 caseless automatic combat shotgun was designed with durability and overwhelming power in mind.", - "weight": 2820, + "weight": "2820 g", "volume": "1750 ml", "price": 1320000, "to_hit": -1, @@ -75,7 +75,7 @@ "reload_noise_volume": 10, "name": "RM228 PDW", "description": "Chambering the powerful 20x66mm caseless shotgun cartridge, the Rivtech RM228 PDW was designed for the civilian personal defense market with durability and ease of use as priorities. While lauded for its small size and light weight, its hefty price tag kept it out of the reach of casual collectors.", - "weight": 780, + "weight": "780 g", "volume": "750 ml", "price": 330000, "to_hit": -2, diff --git a/data/json/items/gun/22.json b/data/json/items/gun/22.json index f80075afbbcae..026ad368bdf8d 100644 --- a/data/json/items/gun/22.json +++ b/data/json/items/gun/22.json @@ -6,7 +6,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, + "weight": "1840 g", "volume": "1250 ml", "price": 163000, "to_hit": -2, @@ -44,7 +44,7 @@ "name": "Marlin 39A", "name_plural": "Marlin 39A", "description": "The oldest and longest-produced shoulder firearm in the world. Though it fires the weak .22 round, it is highly accurate and damaging, and has essentially no recoil.", - "weight": 2948, + "weight": "2948 g", "volume": "2500 ml", "price": 23000, "to_hit": -1, @@ -82,7 +82,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, + "weight": "130 g", "volume": "137ml", "price": 110000, "to_hit": -1, @@ -113,7 +113,7 @@ "name": "pipe rifle: .22", "name_plural": "pipe rifles: .22", "description": "A home-made rifle. It is simply a pipe attached to a stock, with a hammer to strike the single round it holds.", - "weight": 1953, + "weight": "1953 g", "volume": "1750 ml", "price": 10000, "to_hit": -1, @@ -148,7 +148,7 @@ "reload_noise_volume": 10, "name": "RM360 rotary carbine", "description": "This unusual Rivtech carbine features five rotating barrels and a large capacity helical magazine. Durable and easy to handle, it was designed to overcome the deficiencies of its low power .22LR cartridge by rapidly delivering a large number of projectiles.", - "weight": 1620, + "weight": "1620 g", "volume": "1 L", "price": 180000, "to_hit": -2, @@ -184,7 +184,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, + "weight": "2220 g", "volume": "2500 ml", "price": 27000, "to_hit": -1, @@ -232,7 +232,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, + "weight": "640 g", "volume": "250 ml", "price": 36000, "to_hit": -2, @@ -268,7 +268,7 @@ "name": "S&W 22A", "name_plural": "S&W 22A", "description": "A popular .22 pistol.", - "weight": 900, + "weight": "900 g", "volume": "500 ml", "price": 35000, "to_hit": -2, @@ -287,7 +287,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, + "weight": "340 g", "volume": "123ml", "price": 7000, "to_hit": -3, @@ -305,7 +305,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, + "weight": "480 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 fcd9be7ff9a7e..f05dc5aea9cdc 100644 --- a/data/json/items/gun/223.json +++ b/data/json/items/gun/223.json @@ -5,7 +5,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, + "weight": "3495 g", "volume": "2 L", "price": 234300, "to_hit": -1, @@ -29,7 +29,7 @@ "name": "AR-15", "//": "This is assumed to be the standard model matching the (currently not in-game) M16.", "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, + "weight": "2815 g", "volume": "2 L", "price": 125000, "to_hit": -1, @@ -49,7 +49,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, + "weight": "1920 g", "volume": "1750 ml", "price": 540000, "to_hit": -1, @@ -70,7 +70,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, + "weight": "3270 g", "volume": "2500 ml", "price": 210000, "to_hit": -1, @@ -92,7 +92,7 @@ "name_plural": "L2037 Backups", "//": "Most real-life autorevolvers use 6-7.5 inch barrel, but this one's mentioned to be particularly massive.", "description": "The logical extension of Leadworks' autorevolver series, this massive 'sidearm' fires 5.56 NATO to share ammo with a soldier's rifle. The muzzle flash and report of this 5-shot revolver are incredible, producing ballistics similar to .357 Magnum. Similar to other Leadworks products it doesn't accept third-party modifications.", - "weight": 2370, + "weight": "2370 g", "volume": "750 ml", "price": 267000, "to_hit": -2, @@ -118,7 +118,7 @@ "name": "L523 platform", "//": "Current milspec, so Expensive.", "description": "Leadworks LLC's bullpup L523 platform utilizes the ubiquitous 5.56 round in multiple applications, and is designed to part-swap quickly, safely, and effectively from one to the next. The base mechanism could--theoretically--be used on its own, but such use is inadvisable and will void your warranty. There's no real place to incorporate aftermarket modifications on this barren proto-weapon.", - "weight": 2500, + "weight": "2500 g", "volume": "1500 ml", "price": 350000, "material": [ "steel", "plastic" ], @@ -228,7 +228,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, + "weight": "6400 g", "volume": "3 L", "price": 750000, "to_hit": -1, @@ -263,7 +263,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, + "weight": "3495 g", "burst": 13, "magazines": [ [ "223", [ "stanag30", "stanag50", "survivor223mag" ] ] ], "relative": { "ranged_damage": 1, "durability": 1 } @@ -274,7 +274,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, + "weight": "2520 g", "volume": "1750 ml", "price": 240000, "to_hit": -1, @@ -289,6 +289,26 @@ "burst": 14, "magazines": [ [ "223", [ "stanag30", "stanag50", "survivor223mag" ] ] ] }, + { + "id": "m16a4", + "copy-from": "rifle_semi", + "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", + "volume": "1750 ml", + "price": 240000, + "to_hit": -1, + "bashing": 12, + "material": [ "steel", "plastic" ], + "symbol": "(", + "color": "dark_gray", + "ammo": "223", + "dispersion": 150, + "durability": 7, + "modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "BURST", "3rd burst", 3 ] ], + "magazines": [ [ "223", [ "stanag30", "stanag50", "survivor223mag" ] ] ] + }, { "id": "rifle_223", "copy-from": "gun_base", @@ -296,7 +316,7 @@ "name": "pipe rifle: .223", "name_plural": "pipe rifles: .223", "description": "A homemade rifle. It is simply a pipe attached to a stock, with a hammer to strike the single round it holds.", - "weight": 4080, + "weight": "4080 g", "volume": "3 L", "price": 110000, "to_hit": -1, @@ -331,7 +351,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, + "weight": "2800 g", "volume": "2 L", "price": 92100, "to_hit": -1, @@ -366,7 +386,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, + "weight": "2960 g", "volume": "2250 ml", "price": 280000, "to_hit": -1, @@ -387,7 +407,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, + "weight": "3200 g", "volume": "1750 ml", "price": 320000, "to_hit": -1, @@ -406,7 +426,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, + "weight": "3184 g", "volume": "1500 ml", "price": 490000, "to_hit": -1, @@ -442,7 +462,7 @@ "name": "handmade carbine", "//": "It's smaller than an M4A1, plus it's a homemade firearm.", "description": "A well-designed improvised carbine with a shortened barrel. Accepting crude detachable magazines or STANAG magazines, this is one of the better homemade weapons.", - "weight": 1950, + "weight": "1950 g", "volume": "1500 ml", "price": 10000, "to_hit": -1, diff --git a/data/json/items/gun/270win.json b/data/json/items/gun/270win.json index 17c4a8ddafc3c..4b8566ed7a710 100644 --- a/data/json/items/gun/270win.json +++ b/data/json/items/gun/270win.json @@ -5,7 +5,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, + "weight": "4080 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 0158ca8fb77e5..84d5c6c9ce48f 100644 --- a/data/json/items/gun/300.json +++ b/data/json/items/gun/300.json @@ -7,7 +7,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, + "weight": "4002 g", "volume": "2750 ml", "price": 1701000, "to_hit": -1, @@ -28,7 +28,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, + "weight": "4200 g", "volume": "3 L", "price": 259500, "to_hit": -1, @@ -49,7 +49,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, + "weight": "4100 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 c68b4c552f83d..339c343b332b6 100644 --- a/data/json/items/gun/3006.json +++ b/data/json/items/gun/3006.json @@ -6,7 +6,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, + "weight": "3135 g", "volume": "3 L", "price": 85000, "to_hit": -1, @@ -43,7 +43,7 @@ "reload_noise_volume": 10, "name": "M1 Garand", "description": "A semi-automatic .30-06 battle rifle, developed to replace the M1903 Springfield. It didn't completely supplant the older bolt-action until after World War II.", - "weight": 4280, + "weight": "4280 g", "volume": "2500 ml", "price": 90000, "to_hit": -1, @@ -78,7 +78,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, + "weight": "4080 g", "volume": "3 L", "price": 80000, "to_hit": -1, @@ -113,7 +113,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, + "weight": "7050 g", "volume": "2500 ml", "price": 350000, "to_hit": -1, @@ -150,7 +150,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, + "weight": "4080 g", "volume": "3 L", "price": 87000, "to_hit": -1, @@ -172,7 +172,7 @@ "name_plural": "pipe rifles: .30-06", "//": "It's the same size as the others, but it's still a scrap weapon.", "description": "A homemade rifle. It is simply a pipe attached to a stock, with a hammer to strike the single round it holds.", - "weight": 4080, + "weight": "4080 g", "volume": "3 L", "price": 110000, "to_hit": -1, diff --git a/data/json/items/gun/300BLK.json b/data/json/items/gun/300BLK.json index cb8ef67564906..269ebfe923e82 100644 --- a/data/json/items/gun/300BLK.json +++ b/data/json/items/gun/300BLK.json @@ -5,7 +5,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, + "weight": "3495 g", "volume": "2 L", "price": 234300, "to_hit": -1, @@ -28,7 +28,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, + "weight": "3400 g", "volume": "1500 ml", "price": 490000, "to_hit": -1, @@ -63,7 +63,7 @@ "name": "AR-15", "//": "This is assumed to be the standard model matching the (currently not in-game) M16.", "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, + "weight": "2815 g", "volume": "2 L", "price": 125000, "to_hit": -1, diff --git a/data/json/items/gun/308.json b/data/json/items/gun/308.json index c73774aefd34b..9a1e3f95f06fd 100644 --- a/data/json/items/gun/308.json +++ b/data/json/items/gun/308.json @@ -6,7 +6,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, + "weight": "3840 g", "volume": "2 L", "price": 350000, "to_hit": -1, @@ -29,7 +29,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, + "weight": "3980 g", "volume": "2 L", "price": 205000, "to_hit": -1, @@ -50,7 +50,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, + "weight": "19500 g", "volume": "6 L", "price": 5500000, "to_hit": -4, @@ -77,7 +77,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, + "weight": "4820 g", "price": 195000, "material": [ "steel", "plastic" ], "burst": 12, @@ -103,7 +103,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, + "weight": "3940 g", "volume": "2250 ml", "price": 130000, "to_hit": -1, @@ -138,7 +138,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, + "weight": "8800 g", "volume": "3 L", "price": 1000000, "to_hit": -1, @@ -173,7 +173,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, + "weight": "8300 g", "volume": "3 L", "price": 1000000, "to_hit": -1, @@ -211,7 +211,7 @@ "name_plural": "pipe rifles: .308", "//": "It's amongst the smallest of the .308 firearms, and a scrap weapon as well. This means a short handmade barrel, and considerable loss of energy.", "description": "A homemade lever-action rifle. While still a primitive pipe and 2x4 design, some minor improvements have been made, such as an integral magazine for rounds, and chambering the more powerful .308 rounds.", - "weight": 2311, + "weight": "2311 g", "volume": "2 L", "price": 10000, "to_hit": -1, @@ -249,7 +249,7 @@ "name": "Savage 111F", "name_plural": "Savage 111F", "description": "A very accurate rifle chambered for the powerful .308 round. Its very low ammo capacity is offset by its accuracy and near-complete lack of recoil.", - "weight": 2993, + "weight": "2993 g", "volume": "3 L", "price": 53000, "to_hit": -1, @@ -283,7 +283,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, + "weight": "4500 g", "volume": "2750 ml", "price": 350000, "to_hit": -1, @@ -319,7 +319,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, + "weight": "3870 g", "volume": "1750 ml", "price": 320000, "to_hit": -1, @@ -341,7 +341,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, + "weight": "3800 g", "volume": "2 L", "price": 320000, "to_hit": -1, @@ -362,7 +362,7 @@ "type": "GUN", "name": "AR-10", "description": "Somewhat similar to the later AR-15, the AR-10 is a gas operated, rotating bolt rifle chambered for 7.62x51mm rounds.", - "weight": 3290, + "weight": "3290 g", "volume": "2 L", "price": 120000, "to_hit": -1, diff --git a/data/json/items/gun/32.json b/data/json/items/gun/32.json index e6e622b681843..7f7f8ca02b450 100644 --- a/data/json/items/gun/32.json +++ b/data/json/items/gun/32.json @@ -6,7 +6,7 @@ "name": "SIG Sauer P230", "name_plural": "SIG Sauer P230", "description": "The SIG Sauer P230 is a small, semi-automatic handgun chambered in .32 ACP. Due to its small dimensions, it was often carried as a backup weapon.", - "weight": 460, + "weight": "460 g", "volume": "250 ml", "price": 43000, "to_hit": -1, @@ -18,6 +18,7 @@ "skill": "pistol", "dispersion": 480, "durability": 8, + "min_cycle_recoil": 135, "valid_mod_locations": [ [ "accessories", 2 ], [ "barrel", 1 ], @@ -31,6 +32,7 @@ [ "stock", 1 ], [ "underbarrel", 1 ] ], + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged", "fault_gun_chamber_spent" ], "magazine_well": 1, "magazines": [ [ "32", [ "sigp230mag" ] ] ] }, @@ -41,7 +43,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, + "weight": "1102 g", "volume": "750 ml", "price": 150000, "to_hit": -2, @@ -53,6 +55,7 @@ "skill": "smg", "dispersion": 360, "durability": 6, + "min_cycle_recoil": 135, "burst": 14, "built_in_mods": [ "folding_stock" ], "valid_mod_locations": [ @@ -69,6 +72,7 @@ [ "stock", 1 ], [ "underbarrel", 1 ] ], + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged", "fault_gun_chamber_spent" ], "magazines": [ [ "32", [ "skorpion61mag" ] ] ] }, { @@ -78,7 +82,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, + "weight": "525 g", "volume": "250 ml", "price": 45000, "to_hit": -1, @@ -90,6 +94,7 @@ "skill": "pistol", "dispersion": 480, "durability": 8, + "min_cycle_recoil": 135, "valid_mod_locations": [ [ "accessories", 2 ], [ "barrel", 1 ], @@ -103,6 +108,7 @@ [ "stock", 1 ], [ "underbarrel", 1 ] ], + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged", "fault_gun_chamber_spent" ], "magazine_well": 1, "magazines": [ [ "32", [ "ppkmag" ] ] ] }, @@ -112,7 +118,7 @@ "type": "GUN", "name": "Kel-Tec P32", "description": "One of Kel-tec's oldest designs, the P32 is a popular option for deep concealment and backup usage. Despite its extreme light weight and small size, its .32 ACP chambering makes for good handling and recoil control.", - "weight": 186, + "weight": "186 g", "volume": "186ml", "price": 14000, "to_hit": -3, @@ -122,6 +128,7 @@ "ammo": "32", "dispersion": 480, "durability": 8, + "min_cycle_recoil": 135, "magazines": [ [ "32", [ "kp32mag" ] ] ] } ] diff --git a/data/json/items/gun/357sig.json b/data/json/items/gun/357sig.json index f4056c967f398..9c4962fd88b4c 100644 --- a/data/json/items/gun/357sig.json +++ b/data/json/items/gun/357sig.json @@ -5,7 +5,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, + "weight": "800 g", "volume": "500 ml", "price": 50000, "to_hit": -1, @@ -34,7 +34,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, + "weight": "800 g", "volume": "500 ml", "price": 69000, "to_hit": -2, diff --git a/data/json/items/gun/36paper.json b/data/json/items/gun/36paper.json index 4c41fd6334022..6faa9d58bb5b0 100644 --- a/data/json/items/gun/36paper.json +++ b/data/json/items/gun/36paper.json @@ -1,12 +1,12 @@ [ { "id": "colt_navy", - "copy-from": "pistol_revolver", + "copy-from": "pistol_revolver_cap_ball", "type": "GUN", "name": "Colt M1861 Navy", "name_plural": "Colt M1861 Navy", "description": "The Colt Model 1861 Navy cap & ball .36-caliber revolver was a six-shot, single-action percussion weapon produced by Colt's Manufacturing Company from 1861 until 1873.", - "weight": 1190, + "weight": "1190 g", "volume": "750 ml", "price": 30000, "to_hit": -1, @@ -15,6 +15,7 @@ "ammo": "36paper", "dispersion": 450, "durability": 7, + "blackpowder_tolerance": 96, "clip_size": 6, "proportional": { "reload": 2 } } diff --git a/data/json/items/gun/38.json b/data/json/items/gun/38.json index ba46a8ebee15c..781465e80a304 100644 --- a/data/json/items/gun/38.json +++ b/data/json/items/gun/38.json @@ -6,7 +6,7 @@ "name": "2 Shot Special", "//": "It's hard to say just how big this is, although it's (very large) pistol sized. But it is a handmade weapon.", "description": "A crudely made double barrel pistol firing 38 special ammo. Unfortunately, the name is less about the double barrels and more about the number of shots you'll get before it breaks down on you.", - "weight": 750, + "weight": "750 g", "volume": "1 L", "price": 2000, "to_hit": -1, @@ -19,6 +19,7 @@ "ranged_damage": -1, "dispersion": 620, "durability": 3, + "blackpowder_tolerance": 60, "clip_size": 2, "reload": 200, "valid_mod_locations": [ @@ -29,6 +30,7 @@ [ "rail mount", 1 ], [ "stock mount", 1 ] ], + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged" ], "flags": [ "RELOAD_ONE", "RELOAD_EJECT" ] }, { @@ -38,7 +40,7 @@ "name": "COP .38", "name_plural": "COP .38", "description": "The COP .38 is a small, chubby derringer pistol that bears a slight resemblance to the Mossberg Brownie. It has four barrels arranged in a square formation.", - "weight": 857, + "weight": "857 g", "volume": "399ml", "price": 120000, "to_hit": -1, @@ -48,6 +50,7 @@ "range": 3, "dispersion": 520, "durability": 6, + "blackpowder_tolerance": 96, "clip_size": 4, "valid_mod_locations": [ [ "accessories", 2 ], @@ -59,6 +62,7 @@ [ "stock mount", 1 ], [ "underbarrel mount", 1 ] ], + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged" ], "flags": [ "RELOAD_ONE", "NEVER_JAMS", "RELOAD_EJECT" ] }, { @@ -68,7 +72,7 @@ "name": "pipe rifle: .38 Special", "name_plural": "pipe rifles: .38 Special", "description": "A home-made rifle. It is simply a pipe attached to a stock, with a hammer to strike the single round it holds.", - "weight": 2114, + "weight": "2114 g", "volume": "2 L", "price": 10000, "to_hit": -1, @@ -80,6 +84,7 @@ "ranged_damage": 1, "dispersion": 550, "durability": 6, + "blackpowder_tolerance": 60, "loudness": 25, "clip_size": 1, "reload": 200, @@ -94,6 +99,7 @@ [ "sights mount", 1 ], [ "underbarrel mount", 1 ] ], + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged" ], "flags": [ "RELOAD_EJECT" ] }, { @@ -103,7 +109,7 @@ "name": "Ruger LCR .38", "name_plural": "Ruger LCR .38", "description": "A compact, double-action-only revolver designed for easy concealment, with a stainless steel cylinder and aluminum frame.", - "weight": 382, + "weight": "382 g", "volume": "250 ml", "price": 54500, "to_hit": -2, @@ -115,6 +121,7 @@ "ranged_damage": -2, "dispersion": 480, "durability": 10, + "blackpowder_tolerance": 56, "clip_size": 5, "magazines": [ [ "38", [ "38_speedloader5" ] ] ], "valid_mod_locations": [ @@ -136,7 +143,7 @@ "name": "S&W 619", "name_plural": "S&W 619", "description": "A seven-round .38 revolver sold by Smith & Wesson. It features a fixed rear sight and a reinforced frame.", - "weight": 1074, + "weight": "1074 g", "volume": "500 ml", "price": 62000, "to_hit": -2, @@ -147,6 +154,7 @@ "ammo": [ "357mag", "38" ], "dispersion": 320, "durability": 10, + "blackpowder_tolerance": 56, "clip_size": 7, "magazines": [ [ "38", [ "38_speedloader" ] ] ], "valid_mod_locations": [ @@ -168,7 +176,7 @@ "name": "Taurus Pro .38", "name_plural": "Taurus Pro .38", "description": "A popular .38 pistol. Designed with numerous safety features and built from high-quality, durable materials.", - "weight": 515, + "weight": "515 g", "volume": "500 ml", "price": 64000, "to_hit": -2, @@ -180,6 +188,7 @@ "skill": "pistol", "dispersion": 480, "durability": 7, + "min_cycle_recoil": 225, "valid_mod_locations": [ [ "accessories", 2 ], [ "barrel", 1 ], @@ -193,6 +202,7 @@ [ "stock", 1 ], [ "underbarrel", 1 ] ], + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged", "fault_gun_chamber_spent" ], "magazine_well": 1, "magazines": [ [ "38", [ "taurus38mag" ] ] ] } diff --git a/data/json/items/gun/380.json b/data/json/items/gun/380.json index c00b135442695..22a0d98f7561f 100644 --- a/data/json/items/gun/380.json +++ b/data/json/items/gun/380.json @@ -5,11 +5,12 @@ "type": "GUN", "name": "MAC-11", "description": "A lesser known variant of the MAC-10, this machine pistol is chambered in .380 ACP for a smaller overall size while remaining inherently subsonic. Smaller in almost every dimension, this inexpensive automatic weapon was declared 'fit only for combat in a phone booth' due to its low weight and absurd fire rate ranging from 1200 to 1400 rounds per minute.", - "weight": 1590, + "weight": "1590 g", "volume": "500 ml", "price": 160000, "bashing": 5, "ammo": "380", + "min_cycle_recoil": 270, "burst": 23, "magazines": [ [ "380", [ "mac11mag" ] ] ] }, @@ -19,10 +20,11 @@ "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, + "weight": "240 g", "volume": "231ml", "price": 25000, "ammo": "380", + "min_cycle_recoil": 270, "magazines": [ [ "380", [ "kp3atmag" ] ] ] }, { @@ -31,7 +33,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, + "weight": "680 g", "volume": "186ml", "price": 75000, "to_hit": -3, @@ -41,6 +43,7 @@ "ammo": "380", "dispersion": 480, "durability": 7, + "min_cycle_recoil": 270, "magazines": [ [ "380", [ "fn1910mag" ] ] ] }, { @@ -49,7 +52,7 @@ "type": "GUN", "name": "Ruger LCP", "description": "One of the best selling modern day 'pocket pistol's, the LCP is an affordable, polymer framed pistol chambered in .380 ACP. Despite the round's relatively low power, the pistol's low weight and short sight radius make for a moderately poor handling pistol.", - "weight": 267, + "weight": "267 g", "volume": "250 ml", "price": 21000, "to_hit": -3, @@ -59,6 +62,7 @@ "ammo": "380", "dispersion": 480, "durability": 8, + "min_cycle_recoil": 270, "magazines": [ [ "380", [ "rugerlcpmag" ] ] ] }, { @@ -67,7 +71,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, + "weight": "709 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 52e75f5c34a86..b6221d38e8415 100644 --- a/data/json/items/gun/38super.json +++ b/data/json/items/gun/38super.json @@ -5,7 +5,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, + "weight": "1035 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 c5f882ec16d8f..0f60f2313ef75 100644 --- a/data/json/items/gun/40.json +++ b/data/json/items/gun/40.json @@ -6,7 +6,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, + "weight": "440 g", "volume": "500 ml", "price": 69000, "to_hit": -2, @@ -19,6 +19,8 @@ "ranged_damage": 1, "dispersion": 480, "durability": 6, + "blackpowder_tolerance": 48, + "min_cycle_recoil": 425, "valid_mod_locations": [ [ "accessories", 2 ], [ "barrel", 1 ], @@ -32,6 +34,7 @@ [ "stock", 1 ], [ "underbarrel", 1 ] ], + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged", "fault_gun_chamber_spent" ], "magazine_well": 1, "magazines": [ [ "40", [ "glock40mag", "glock40bigmag" ] ] ] }, @@ -42,7 +45,7 @@ "name": "pipe rifle: .40 S&W", "name_plural": "pipe rifles: .40 S&W", "description": "A home-made rifle. It is simply a pipe attached to a stock, with a hammer to strike the single round it holds.", - "weight": 2114, + "weight": "2114 g", "volume": "2 L", "price": 10000, "to_hit": -1, @@ -54,6 +57,7 @@ "ranged_damage": 1, "dispersion": 550, "durability": 6, + "blackpowder_tolerance": 60, "loudness": 25, "clip_size": 1, "reload": 200, @@ -68,6 +72,7 @@ [ "sights mount", 1 ], [ "underbarrel mount", 1 ] ], + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged" ], "flags": [ "RELOAD_EJECT" ] }, { @@ -77,7 +82,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, + "weight": "680 g", "volume": "500 ml", "price": 75000, "to_hit": -2, @@ -89,6 +94,7 @@ "skill": "pistol", "dispersion": 480, "durability": 7, + "min_cycle_recoil": 504, "valid_mod_locations": [ [ "accessories", 2 ], [ "barrel", 1 ], @@ -102,6 +108,7 @@ [ "stock", 1 ], [ "underbarrel", 1 ] ], + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged", "fault_gun_chamber_spent" ], "magazine_well": 1, "magazines": [ [ "40", [ "sig40mag" ] ] ] }, @@ -113,7 +120,7 @@ "name_plural": "Luty SMGs: .40 S&W", "description": "A Luty pattern makeshift smoothbore SMG crudely constructed out of various steel parts using some of the more advanced powered hand tools; likely one of the most complex guns that are feasible to make outside of a machine shop, but still very unreliable. This one is chambered for .40 S&W cartridges and accepts Glock 22 magazines, or alternatively custom-made makeshift ones.", "//": "Crafting recipe must make use of angle grinder, bench grinder, set square and vise, which don't yet exist in game. No factory mags until UMP40, mp5/40, or other straight .40 mags are implemented.", - "weight": 3274, + "weight": "3274 g", "volume": "1750 ml", "price": 20000, "to_hit": -1, @@ -124,6 +131,8 @@ "ranged_damage": -4, "dispersion": 590, "durability": 4, + "blackpowder_tolerance": 24, + "min_cycle_recoil": 425, "modes": [ [ "DEFAULT", "auto", 10 ] ], "loudness": 25, "barrel_length": 1, @@ -148,7 +157,7 @@ "reload_noise_volume": 10, "name": "handmade six-shooter", "description": "A homemade 6-shot revolver. While it's not as good as the pre-Cataclysm manufactured weapons, it's a decent piece of work, all things considered.", - "weight": 1333, + "weight": "1333 g", "volume": "750 ml", "price": 15000, "to_hit": -2, @@ -161,6 +170,7 @@ "ranged_damage": -1, "dispersion": 620, "durability": 6, + "blackpowder_tolerance": 60, "loudness": 25, "clip_size": 6, "reload": 200, @@ -174,6 +184,7 @@ [ "underbarrel", 1 ], [ "rail mount", 1 ] ], + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged" ], "flags": [ "RELOAD_ONE", "NEVER_JAMS", "RELOAD_EJECT" ] }, { @@ -183,7 +194,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, + "weight": "1133 g", "volume": "500 ml", "price": 74000, "to_hit": -2, @@ -195,6 +206,7 @@ "ranged_damage": 1, "dispersion": 320, "durability": 8, + "blackpowder_tolerance": 56, "clip_size": 6, "magazines": [ [ "40", [ "40_speedloader6" ] ] ], "valid_mod_locations": [ @@ -214,7 +226,7 @@ "type": "GUN", "name": "Browning Hi-Power .40 S&W", "description": "The Browning Hi-Power is a semi-automatic handgun developed shortly before the second world war. Widely issued since then, it remains in use by India, Canada and Australia. This is a commercial variant produced by Browning Arms in .40 S&W.", - "weight": 900, + "weight": "900 g", "volume": "418 ml", "price": 54000, "to_hit": -2, @@ -233,7 +245,7 @@ "type": "GUN", "name": "Walther PPQ .40 S&W", "description": "The Walther PPQ is a semi-automatic pistol originating from the Walther P99QA, and maintains compatibility with some of its predecessor's accessories. This model is chambered in .40 S&W.", - "weight": 625, + "weight": "625 g", "volume": "422 ml", "price": 72500, "bashing": 8, @@ -251,7 +263,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, + "weight": "800 g", "volume": "703 ml", "price": 7500, "to_hit": -2, diff --git a/data/json/items/gun/40mm.json b/data/json/items/gun/40mm.json index 1576845ae05b5..a9b605ed1ff50 100644 --- a/data/json/items/gun/40mm.json +++ b/data/json/items/gun/40mm.json @@ -5,7 +5,7 @@ "type": "GUN", "name": "tube 40mm launcher", "description": "A simple, home-made grenade launcher. Basically a tube with a pin firing mechanism to activate the grenade.", - "weight": 2267, + "weight": "2267 g", "volume": "1250 ml", "price": 40000, "to_hit": -3, @@ -33,7 +33,7 @@ "type": "GUN", "name": "M320 stand alone launcher", "description": "Heckler & Koch's M320 grenade launcher offers the functionality of larger launchers in a very small package at the cost of decreased accuracy. This one is combined with a buttstock for stand alone operation.", - "weight": 2100, + "weight": "2100 g", "volume": "750 ml", "price": 850000, "to_hit": -3, @@ -52,7 +52,7 @@ "type": "GUN", "name": "M79 launcher", "description": "A widely-used grenade launcher that first saw use by American forces in the Vietnam war. Though mostly replaced by more modern launchers, the M79 still sees use with many units worldwide.", - "weight": 2930, + "weight": "2930 g", "volume": "1 L", "price": 400000, "to_hit": -3, @@ -81,7 +81,7 @@ "type": "GUN", "name": "Mark 19 grenade launcher", "description": "A heavy, tripod-mounted belt-fed grenade launcher used by the US Military since the start of the cold war all the way to the cataclysm, and if you can find some 40mm grenades, maybe even beyond.", - "weight": 35200, + "weight": "35200 g", "volume": "4 L", "price": 1650000, "to_hit": -1, @@ -113,7 +113,7 @@ "name": "Milkor MGL", "name_plural": "Milkor MGL", "description": "The Milkor Multi-Grenade Launcher is designed to compensate for the drawback of single-shot grenade launchers by allowing sustained heavy firepower. However, it is still slow to reload and must be used with careful planning.", - "weight": 5300, + "weight": "5300 g", "volume": "2250 ml", "price": 1040000, "to_hit": -3, @@ -142,7 +142,7 @@ "name": "RM802 grenade launcher", "//": "Either Rivtech or milspec would make it Expensive. Combined, you could buy a half-decent car for the price.", "description": "The Rivtech RM802 pump-action 40mm grenade launcher was designed to be a step ahead of single-shot grenade launchers by allowing sustained heavy firepower. However, its capacity is fairly limited so it must be used with careful planning.", - "weight": 3120, + "weight": "3120 g", "volume": "1500 ml", "price": 2920000, "to_hit": -1, diff --git a/data/json/items/gun/410shot.json b/data/json/items/gun/410shot.json index 2c6705a9dd6e8..cec4e28b82f9d 100644 --- a/data/json/items/gun/410shot.json +++ b/data/json/items/gun/410shot.json @@ -5,7 +5,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, + "weight": "3550 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 4c2d995483e58..a4c239f22ebc0 100644 --- a/data/json/items/gun/44.json +++ b/data/json/items/gun/44.json @@ -6,7 +6,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, + "weight": "1800 g", "volume": "750 ml", "price": 87500, "to_hit": -2, @@ -19,6 +19,7 @@ "ranged_damage": -1, "dispersion": 480, "durability": 7, + "min_cycle_recoil": 1413, "valid_mod_locations": [ [ "accessories", 2 ], [ "barrel", 1 ], @@ -32,6 +33,7 @@ [ "stock", 1 ], [ "underbarrel", 1 ] ], + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged", "fault_gun_chamber_spent" ], "magazine_well": 1, "magazines": [ [ "44", [ "deaglemag" ] ] ] }, @@ -42,7 +44,7 @@ "name": "Henry Big Boy .44", "name_plural": "Henry Big Boy .44", "description": "This fine lever action rifle is chambered in the powerful .44 magnum cartridge and features a sleek octagonal barrel with a tube fed magazine. Go get 'em cowboy!", - "weight": 3937, + "weight": "3937 g", "volume": "3 L", "price": 89995, "to_hit": -1, @@ -53,6 +55,7 @@ "ranged_damage": 2, "dispersion": 180, "durability": 8, + "blackpowder_tolerance": 32, "clip_size": 10, "valid_mod_locations": [ [ "accessories", 2 ], @@ -69,38 +72,6 @@ [ "underbarrel mount", 1 ] ] }, - { - "id": "lemat_revolver", - "copy-from": "pistol_revolver", - "type": "GUN", - "name": "LeMat revolver", - "//": "Could only find barrel figures for the Baby LeMat; this is a best-guess estimate.", - "description": "A modernized version of the original LeMat revolver, a rare and expensive firearm produced during the civil war. With a capacity of 9 modern .44 cartridges and a single 12 gauge shell, it makes a great companion for those who wander the \"Earth-that-was\".", - "weight": 1295, - "volume": "750 ml", - "price": 86100, - "bashing": 4, - "material": [ "steel", "wood" ], - "symbol": "(", - "color": "brown", - "ammo": "44", - "ranged_damage": -1, - "dispersion": 360, - "durability": 8, - "clip_size": 9, - "built_in_mods": [ "lemat_revolver_shotgun" ], - "valid_mod_locations": [ - [ "accessories", 2 ], - [ "barrel", 1 ], - [ "bore", 1 ], - [ "grip", 1 ], - [ "mechanism", 4 ], - [ "rail", 1 ], - [ "sights", 1 ], - [ "stock", 1 ], - [ "underbarrel", 1 ] - ] - }, { "id": "rifle_44", "copy-from": "gun_base", @@ -108,7 +79,7 @@ "name": "pipe rifle: .44 Magnum", "name_plural": "pipe rifles: .44 Magnum", "description": "A home-made rifle. It is simply a pipe attached to a stock, with a hammer to strike the single round it holds.", - "weight": 2114, + "weight": "2114 g", "volume": "2 L", "price": 10000, "to_hit": -1, @@ -120,6 +91,7 @@ "ranged_damage": 1, "dispersion": 550, "durability": 6, + "blackpowder_tolerance": 60, "loudness": 25, "clip_size": 1, "reload": 200, @@ -134,6 +106,7 @@ [ "sights mount", 1 ], [ "underbarrel mount", 1 ] ], + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged" ], "flags": [ "RELOAD_EJECT" ] }, { @@ -143,7 +116,7 @@ "name": "Ruger Redhawk", "name_plural": "Ruger Redhawk", "description": "One of the most powerful handguns in the world when it was released in 1979, the Redhawk offers very sturdy construction, with an appearance that is reminiscent of \"Wild West\" revolvers.", - "weight": 1386, + "weight": "1386 g", "volume": "750 ml", "price": 86100, "to_hit": -2, @@ -154,6 +127,7 @@ "ammo": "44", "dispersion": 280, "durability": 8, + "blackpowder_tolerance": 56, "clip_size": 6, "magazines": [ [ "44", [ "44_speedloader6" ] ] ], "valid_mod_locations": [ @@ -175,7 +149,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, + "weight": "1276 g", "volume": "750 ml", "price": 86100, "bashing": 10, @@ -186,6 +160,7 @@ "ranged_damage": -1, "dispersion": 280, "durability": 8, + "blackpowder_tolerance": 56, "clip_size": 6, "magazines": [ [ "44", [ "44_speedloader6" ] ] ], "valid_mod_locations": [ diff --git a/data/json/items/gun/44paper.json b/data/json/items/gun/44paper.json index eb80319e6fd6b..4a5494bb81311 100644 --- a/data/json/items/gun/44paper.json +++ b/data/json/items/gun/44paper.json @@ -1,12 +1,12 @@ [ { "id": "colt_army", - "copy-from": "pistol_revolver", + "copy-from": "pistol_revolver_cap_ball", "type": "GUN", "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, + "weight": "1220 g", "volume": "750 ml", "price": 43000, "to_hit": -1, @@ -15,7 +15,38 @@ "ammo": "44paper", "dispersion": 400, "durability": 7, - "clip_size": 5, - "proportional": { "reload": 2 } + "blackpowder_tolerance": 96, + "clip_size": 5 + }, + { + "id": "lemat_revolver", + "copy-from": "pistol_revolver_cap_ball", + "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, + "volume": "851 ml", + "price": 120000, + "bashing": 4, + "material": [ "steel", "wood" ], + "symbol": "(", + "color": "brown", + "ammo": "44paper", + "dispersion": 420, + "durability": 6, + "blackpowder_tolerance": 56, + "clip_size": 9, + "valid_mod_locations": [ + [ "accessories", 2 ], + [ "barrel", 1 ], + [ "bore", 1 ], + [ "grip", 1 ], + [ "stock", 1 ], + [ "underbarrel", 1 ], + [ "rail mount", 1 ], + [ "sights mount", 1 ] + ], + "built_in_mods": [ "lemat_revolver_shotgun" ], + "extend": { "flags": [ "NO_UNLOAD" ] } } ] diff --git a/data/json/items/gun/45.json b/data/json/items/gun/45.json index 328febeb11fd2..2dcb39c36d378 100644 --- a/data/json/items/gun/45.json +++ b/data/json/items/gun/45.json @@ -5,7 +5,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, + "weight": "2600 g", "volume": "1750 ml", "price": 310000, "to_hit": -2, @@ -17,6 +17,7 @@ "skill": "smg", "dispersion": 280, "durability": 7, + "min_cycle_recoil": 540, "burst": 20, "valid_mod_locations": [ [ "accessories", 3 ], @@ -32,6 +33,7 @@ [ "stock", 1 ], [ "underbarrel", 1 ] ], + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged", "fault_gun_chamber_spent" ], "magazine_well": 2, "magazines": [ [ "45", [ "tdi_mag" ] ] ] }, @@ -41,7 +43,7 @@ "reload_noise_volume": 10, "name": "H&K UMP45", "description": "Developed as a successor to the MP5 submachine gun, the UMP45 retains the earlier model's supreme accuracy and low recoil, but in the higher .45 caliber.", - "weight": 2300, + "weight": "2300 g", "volume": "1250 ml", "price": 290000, "to_hit": -2, @@ -54,6 +56,7 @@ "ranged_damage": 1, "dispersion": 240, "durability": 8, + "min_cycle_recoil": 540, "burst": 10, "valid_mod_locations": [ [ "accessories", 3 ], @@ -69,6 +72,7 @@ [ "stock", 1 ], [ "underbarrel", 1 ] ], + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged", "fault_gun_chamber_spent" ], "magazines": [ [ "45", [ "ump45mag" ] ] ] }, { @@ -78,7 +82,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, + "weight": "1035 g", "volume": "500 ml", "price": 78400, "to_hit": -2, @@ -89,6 +93,8 @@ "ammo": "45", "dispersion": 480, "durability": 7, + "min_cycle_recoil": 540, + "blackpowder_tolerance": 48, "magazine_well": 1, "magazines": [ [ "45", [ "m1911mag", "m1911bigmag" ] ] ] }, @@ -110,7 +116,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, + "weight": "2630 g", "volume": "750 ml", "price": 180000, "to_hit": -2, @@ -122,6 +128,7 @@ "skill": "smg", "dispersion": 520, "durability": 7, + "min_cycle_recoil": 540, "burst": 18, "built_in_mods": [ "wire_stock" ], "valid_mod_locations": [ @@ -138,6 +145,7 @@ [ "stock", 1 ], [ "underbarrel", 1 ] ], + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged", "fault_gun_chamber_spent" ], "magazine_well": 1, "magazines": [ [ "45", [ "mac10mag" ] ] ] }, @@ -148,7 +156,7 @@ "name": "pipe rifle: .45", "name_plural": "pipe rifles: .45", "description": "A home-made rifle. It is simply a pipe attached to a stock, with a hammer to strike the single round it holds.", - "weight": 2114, + "weight": "2114 g", "volume": "2 L", "price": 10000, "to_hit": -1, @@ -161,6 +169,7 @@ "ranged_damage": 1, "dispersion": 550, "durability": 6, + "blackpowder_tolerance": 60, "loudness": 25, "clip_size": 1, "reload": 200, @@ -175,6 +184,7 @@ [ "sights mount", 1 ], [ "underbarrel mount", 1 ] ], + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged" ], "flags": [ "RELOAD_EJECT" ] }, { @@ -185,7 +195,7 @@ "name_plural": "Luty SMGs: .45", "description": "A Luty pattern makeshift smoothbore SMG crudely constructed out of various steel parts using some of the more advanced powered hand tools; likely one of the most complex guns that are feasible to make outside of a machine shop, but still very unreliable. This one is chambered for .45 ACP cartridges and accepts MAC-10 magazines, or alternatively custom-made makeshift ones.", "//": "Crafting recipe must make use of angle grinder, bench grinder, set square and vise, which don't yet exist in game.", - "weight": 3274, + "weight": "3274 g", "volume": "1750 ml", "price": 20000, "to_hit": -1, @@ -196,6 +206,8 @@ "ranged_damage": -4, "dispersion": 590, "durability": 4, + "blackpowder_tolerance": 24, + "min_cycle_recoil": 456, "modes": [ [ "DEFAULT", "auto", 10 ] ], "loudness": 25, "barrel_length": 1, @@ -221,7 +233,7 @@ "name": "homemade hand cannon", "//": "On one hand, it's very big for a handgun. On the other, it's still a scrap weapon.", "description": "A large and heavy pistol evidently welded from scrap. It's not pretty, but the .45 it's chambered with packs a serious punch. Just watch out for the kick.", - "weight": 1200, + "weight": "1200 g", "volume": "1 L", "price": 60000, "to_hit": -3, @@ -233,6 +245,7 @@ "ranged_damage": 2, "dispersion": 620, "durability": 7, + "blackpowder_tolerance": 60, "loudness": 25, "clip_size": 5 }, @@ -242,7 +255,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, + "weight": "4630 g", "volume": "2 L", "price": 450000, "to_hit": -2, @@ -255,6 +268,7 @@ "ranged_damage": 2, "dispersion": 360, "durability": 7, + "min_cycle_recoil": 540, "burst": 10, "barrel_length": 2, "valid_mod_locations": [ @@ -271,6 +285,7 @@ [ "stock", 1 ], [ "underbarrel", 1 ] ], + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged", "fault_gun_chamber_spent" ], "magazines": [ [ "45", [ "thompson_mag", "thompson_bigmag", "thompson_drum" ] ] ] }, { @@ -300,7 +315,7 @@ "type": "GUN", "name": "Walther PPQ .45 ACP", "description": "The Walther PPQ is a semi-automatic pistol originating from the Walther P99QA, and maintains compatibility with some of its predecessor's accessories. This model is chambered in .45 ACP.", - "weight": 714, + "weight": "714 g", "volume": "470 ml", "price": 80000, "bashing": 8, @@ -318,7 +333,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, + "weight": "800 g", "volume": "720 ml", "price": 7500, "to_hit": -2, @@ -329,6 +344,6 @@ "dispersion": 480, "durability": 7, "magazine_well": 1, - "magzines": [ [ "45", [ "hptjhpmag" ] ] ] + "magazines": [ [ "45", [ "hptjhpmag" ] ] ] } ] diff --git a/data/json/items/gun/454.json b/data/json/items/gun/454.json index 4656f9572b870..f77932835115d 100644 --- a/data/json/items/gun/454.json +++ b/data/json/items/gun/454.json @@ -6,7 +6,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, + "weight": "1700 g", "volume": "750 ml", "price": 64100, "to_hit": -2, @@ -14,9 +14,10 @@ "material": [ "steel", "plastic" ], "symbol": "(", "color": "light_gray", - "ammo": [ "454", "45colt" ], + "ammo": [ "454", "410shot", "45colt" ], "dispersion": 280, "durability": 8, + "blackpowder_tolerance": 56, "clip_size": 5, "magazines": [ [ "454", [ "454_speedloader5" ] ] ], "valid_mod_locations": [ diff --git a/data/json/items/gun/4570.json b/data/json/items/gun/4570.json index 1acd41844bf5e..676966f184572 100644 --- a/data/json/items/gun/4570.json +++ b/data/json/items/gun/4570.json @@ -5,7 +5,7 @@ "type": "GUN", "name": "Marlin 1895 SBL", "description": "A handy but powerful lever-action rifle chambered for .45-70 Government. Designed for wilderness guides for defense against large predators such as grizzly bears, moose, and dinosaurs.", - "weight": 3650, + "weight": "3650 g", "volume": "2250 ml", "price": 100000, "to_hit": 1, @@ -37,7 +37,7 @@ "type": "GUN", "name": "Magnum Research BFR", "description": "A massive single-action revolver. While the .45-70 rifle round loses significant velocity in its short pistol barrel, it still competes with other large magnum handguns in terms of power.", - "weight": 1950, + "weight": "1950 g", "volume": "1 L", "price": 105000, "to_hit": -2, @@ -68,7 +68,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, + "weight": "5500 g", "volume": "3250 ml", "price": 210000, "to_hit": 1, diff --git a/data/json/items/gun/45colt.json b/data/json/items/gun/45colt.json new file mode 100644 index 0000000000000..65a6023bedc52 --- /dev/null +++ b/data/json/items/gun/45colt.json @@ -0,0 +1,21 @@ +[ + { + "id": "colt_saa", + "copy-from": "pistol_revolver", + "type": "GUN", + "name": "Uberti Cattleman", + "name_plural": "Uberti Cattleman", + "description": "This 7.5\" barreled Uberti Cattleman is a modern reproduction of the legendary Colt Single Action Army, or Colt Peacemaker, one of the first revolvers to use a modern self-contained cartridge. Made famous by westerns, it is still in demand for Cowboy Action Shooting, reenactors and collectors. Unlike modern revolvers, the cylinder cannot swing out for loading, and spent brass must be ejected one at a time.", + "weight": 1048, + "volume": "500 ml", + "price": 47900, + "to_hit": -1, + "bashing": 8, + "material": [ "steel", "wood" ], + "ammo": "45colt", + "dispersion": 360, + "durability": 8, + "clip_size": 6, + "proportional": { "reload": 1.5 } + } +] diff --git a/data/json/items/gun/46.json b/data/json/items/gun/46.json index 8cd5144be7741..b44e2145b0977 100644 --- a/data/json/items/gun/46.json +++ b/data/json/items/gun/46.json @@ -5,9 +5,9 @@ "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, - "volume": "3587 ml", - "price": 340000, + "weight": "1780 g", + "volume": "2034 ml", + "price": 175000, "to_hit": -2, "bashing": 7, "material": [ "steel", "plastic" ], @@ -17,6 +17,7 @@ "skill": "smg", "dispersion": 260, "durability": 8, + "min_cycle_recoil": 81, "burst": 16, "built_in_mods": [ "wire_stock" ], "valid_mod_locations": [ @@ -32,6 +33,7 @@ [ "stock", 1 ], [ "underbarrel", 1 ] ], + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged", "fault_gun_chamber_spent" ], "magazine_well": 1, "magazines": [ [ "46", [ "hk46mag", "hk46bigmag" ] ] ] } diff --git a/data/json/items/gun/460.json b/data/json/items/gun/460.json index 8dc01286010b0..d100bb54ec71a 100644 --- a/data/json/items/gun/460.json +++ b/data/json/items/gun/460.json @@ -8,6 +8,7 @@ "price": 90000, "ammo": [ "460", "45" ], "magazines": [ [ "460", [ "lw12mag" ] ], [ "45", [ "lw12mag" ] ] ], + "min_cycle_recoil": 540, "relative": { "durability": -1 }, "built_in_mods": [ "lead_holo_sight", "muzzle_brake", "lead_laser_sight" ] }, @@ -19,6 +20,7 @@ "description": "After the success of their 9x19mm machine pistol, Leadworks LLC developed the L39B-45 from their .460 Rowland semi-autos, intending them to be used with .45ACP. Because it shares most of its parts with the L39-460, this variant retains the ability to fire fearsome .460 Rowland, though users are strongly advised not to do so during automatic fire. Comes with built in red dot, recoil compensator and laser sights. Similar to other Leadworks products it doesn't accept third-party modifications.", "ammo": [ "460", "45" ], "magazines": [ [ "460", [ "lw12mag" ] ], [ "45", [ "lw12mag" ] ] ], + "min_cycle_recoil": 540, "relative": { "durability": -1 }, "built_in_mods": [ "lead_holo_sight", "muzzle_brake", "lead_laser_sight" ] }, @@ -30,7 +32,7 @@ "name_plural": "L2031 Enforcer", "//": "Real-life Autorevolvers tended to vary between 6-7.5 inch barrels, so we'll err on the side of a +1 here.", "description": "An \"autorevolver\", this Leadworks LLC six-shooter combines the ease-of-action of a semi-auto with the ease-of-reloading and style of a revolver. In addition to ubiquitous .45 ACP, the Enforcer also fires powerful .460 Rowland, offering .44 Magnum performance in a smaller package. It achieved overnight stardom when it appeared in \"Treasure Trail\", a popular space-Western series. Comes with built in holographic and laser sights. Similar to other Leadworks products it doesn't accept third-party modifications.", - "weight": 1370, + "weight": "1370 g", "volume": "500 ml", "price": 83000, "to_hit": -2, @@ -42,6 +44,7 @@ "ranged_damage": 1, "dispersion": 360, "durability": 8, + "blackpowder_tolerance": 56, "clip_size": 6, "magazines": [ [ "460", [ "460_speedloader6" ] ], [ "45", [ "460_speedloader6" ] ] ], "built_in_mods": [ "lead_holo_sight", "lead_laser_sight" ], @@ -62,7 +65,7 @@ "name_plural": "L1820 Long Ranger", "//": "If it's based off the Winchester 94, it's likely got a 20 inch barrel. For sanity's sake though, let's cap it at +4.", "description": "The Leadworks Long Ranger was designed to give Enforcer users (or anyone using .460/.45 caliber cartridges) a little extra reach while using the same ammunition. Loaded with powerful .460 Rowland ammunition, this rifle offers a competitive replacement to the AR-15 in politically restrictive climates, but was met with disgust from lever action purists because of its synthetic furniture and built in holographic and laser sights. Similar to other Leadworks products it doesn't accept third-party modifications.", - "weight": 4175, + "weight": "4175 g", "volume": "3250 ml", "price": 90000, "to_hit": -1, @@ -76,6 +79,7 @@ "ranged_damage": 4, "dispersion": 180, "durability": 9, + "blackpowder_tolerance": 32, "clip_size": 12, "barrel_length": 2, "built_in_mods": [ "lead_holo_sight", "lead_laser_sight" ], @@ -90,6 +94,7 @@ [ "rail mount", 1 ], [ "stock mount", 1 ] ], + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged" ], "flags": [ "RELOAD_ONE" ] } ] diff --git a/data/json/items/gun/50.json b/data/json/items/gun/50.json index 8c185c65f6efb..e2233bfafafbd 100644 --- a/data/json/items/gun/50.json +++ b/data/json/items/gun/50.json @@ -7,7 +7,7 @@ "name_plural": "Barrett M107A1", "//": "Price based on unit cost quote for fiscal year 2005 listed at inetres.com, with gunmod modifiers to be added later.", "description": "A large, shoulder-fired, .50 caliber anti-materiel rifle. Its large size, recoil, and noise is offset by its damage and range.", - "weight": 12602, + "weight": "12602 g", "volume": "3500 ml", "price": 1483300, "to_hit": -1, @@ -28,10 +28,10 @@ "id": "m2browning", "copy-from": "gun_base", "type": "GUN", - "name": "M2 Browning HMG", - "name_plural": "M2 Browning HMG", + "name": "M2HB Browning HMG", + "name_plural": "M2HB Browning HMG", "description": "A heavy machine gun used by the US Military from its inception to the cataclysm, and even rarely by cataclysm survivors. Its massive size and design make it impossible to use unless deployed or mounted to a vehicle.", - "weight": 38000, + "weight": "38000 g", "volume": "5 L", "price": 1800000, "to_hit": -1, @@ -44,7 +44,7 @@ "durability": 8, "reload": 400, "barrel_length": 5, - "modes": [ [ "DEFAULT", "auto", 8 ], [ "SEMI", "semi-auto", 1 ] ], + "modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "AUTO", "auto", 8 ] ], "valid_mod_locations": [ [ "accessories", 4 ], [ "barrel", 1 ], diff --git a/data/json/items/gun/500.json b/data/json/items/gun/500.json index 15e2321081d3b..914e52db98862 100644 --- a/data/json/items/gun/500.json +++ b/data/json/items/gun/500.json @@ -6,7 +6,7 @@ "name": "Big Horn Model 89", "name_plural": "Big Horn Model 89", "description": "Built in the image of the venerable Winchester Model 1886, Big Horn Armory's Model 89 rifle packs all the power of the .500 S&W Magnum cartridge in to a package less likely to break one's wrist.", - "weight": 3447, + "weight": "3447 g", "volume": "3 L", "price": 329900, "to_hit": -1, @@ -17,6 +17,7 @@ "ranged_damage": 2, "dispersion": 180, "durability": 8, + "blackpowder_tolerance": 32, "clip_size": 7, "valid_mod_locations": [ [ "accessories", 2 ], @@ -40,7 +41,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, + "weight": "2055 g", "volume": "750 ml", "price": 90000, "to_hit": -2, @@ -51,6 +52,7 @@ "ammo": "500", "dispersion": 280, "durability": 8, + "blackpowder_tolerance": 56, "clip_size": 5, "magazines": [ [ "500", [ "500_speedloader5" ] ] ], "valid_mod_locations": [ diff --git a/data/json/items/gun/545x39.json b/data/json/items/gun/545x39.json index f07e63ca9aa1f..c4b827601b875 100644 --- a/data/json/items/gun/545x39.json +++ b/data/json/items/gun/545x39.json @@ -6,7 +6,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, + "weight": "3170 g", "volume": "1750 ml", "price": 390000, "to_hit": -1, @@ -43,7 +43,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, + "weight": "3620 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 47cdd2bb6e5bc..02e4655068908 100644 --- a/data/json/items/gun/57.json +++ b/data/json/items/gun/57.json @@ -5,7 +5,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, + "weight": "490 g", "volume": "500 ml", "price": 124900, "to_hit": -2, @@ -18,6 +18,7 @@ "ranged_damage": -2, "dispersion": 440, "durability": 8, + "min_cycle_recoil": 81, "valid_mod_locations": [ [ "accessories", 2 ], [ "barrel", 1 ], @@ -31,6 +32,7 @@ [ "underbarrel", 1 ] ], "magazine_well": 1, + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged", "fault_gun_chamber_spent" ], "magazines": [ [ "57", [ "fn57mag" ] ] ] }, { @@ -39,7 +41,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, + "weight": "2300 g", "volume": "1500 ml", "price": 350000, "to_hit": -2, @@ -51,6 +53,7 @@ "skill": "smg", "dispersion": 260, "durability": 8, + "min_cycle_recoil": 81, "burst": 15, "valid_mod_locations": [ [ "accessories", 3 ], @@ -66,6 +69,7 @@ [ "underbarrel", 1 ] ], "magazine_well": 2, + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged", "fault_gun_chamber_spent" ], "magazines": [ [ "57", [ "fnp90mag" ] ] ] } ] diff --git a/data/json/items/gun/5x50.json b/data/json/items/gun/5x50.json index c96d6dc9ae9c2..1827c111e41d3 100644 --- a/data/json/items/gun/5x50.json +++ b/data/json/items/gun/5x50.json @@ -5,7 +5,7 @@ "reload_noise_volume": 10, "name": "RM216 SPIW", "description": "This light carbine fires 5x50mm armor-piercing flechette cartridges. Classified as a special purpose individual weapon, this advanced firearm was developed by Rivtech for the US military shortly before the end of the world. Designed to be fired in bursts, it excels in close combat.", - "weight": 1302, + "weight": "1302 g", "volume": "1250 ml", "price": 2320000, "to_hit": -2, @@ -44,7 +44,7 @@ "reload_noise_volume": 10, "name": "RM232 IDW", "description": "This lightweight machine pistol fires 5x50mm armor-piercing flechette cartridges. Classified as an individual defense weapon, this advanced firearm was developed by Rivtech for the US military shortly before the end of the world. Designed to be fired in bursts, it excels in close combat.", - "weight": 682, + "weight": "682 g", "volume": "750 ml", "price": 1200000, "to_hit": -2, diff --git a/data/json/items/gun/66mm.json b/data/json/items/gun/66mm.json new file mode 100644 index 0000000000000..c685a0d489b9b --- /dev/null +++ b/data/json/items/gun/66mm.json @@ -0,0 +1,28 @@ +[ + { + "id": "m202_flash", + "type": "GUN", + "symbol": "(", + "color": "dark_gray", + "name": "M202A1 FLASH", + "name_plural": "M202A1 FLASH", + "description": "An American rocket launcher designed in the 1970s to replace WW2 era flamethrowers still in use in Vietnam. It has four barrels sharing the 66mm caliber of the M72 LAW.", + "price": 2900000, + "material": "steel", + "skill": "launcher", + "ammo": "m235", + "weight": "5220 g", + "volume": "6 L", + "reload_noise_volume": 10, + "bashing": 12, + "to_hit": -3, + "dispersion": 300, + "durability": 7, + "modes": [ [ "DEFAULT", "single shot", 1 ], [ "BURST", "all barrels", 4 ] ], + "magazines": [ [ "m235", [ "m74_clip" ] ] ], + "reload": 600, + "loudness": 200, + "valid_mod_locations": [ [ "accessories", 4 ], [ "grip", 1 ], [ "sling", 1 ] ], + "flags": [ "BACKBLAST", "NEVER_JAMS" ] + } +] diff --git a/data/json/items/gun/700nx.json b/data/json/items/gun/700nx.json index 80c83ff531890..b1f3c43d71b3b 100644 --- a/data/json/items/gun/700nx.json +++ b/data/json/items/gun/700nx.json @@ -5,7 +5,7 @@ "reload_noise_volume": 10, "name": "Elephant gun", "description": "A custom-made single shot rifle specially designed for the hunting of huge game. You could obviously kill everything with this, EVERYTHING. If you ever find enough ammo of course.", - "weight": 8082, + "weight": "8082 g", "volume": "3 L", "price": 2000000, "to_hit": 1, diff --git a/data/json/items/gun/762.json b/data/json/items/gun/762.json index 510c7c750593d..875861494f443 100644 --- a/data/json/items/gun/762.json +++ b/data/json/items/gun/762.json @@ -5,7 +5,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, + "weight": "2710 g", "volume": "1750 ml", "price": 290000, "to_hit": -1, @@ -44,7 +44,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, + "weight": "2800 g", "volume": "1750 ml", "price": 450000, "to_hit": -1, @@ -81,7 +81,7 @@ "reload_noise_volume": 10, "name": "SKS", "description": "Developed by the Soviets in 1945, this rifle was quickly replaced by the full-auto AK47. However, due to its superb accuracy, low recoil and deployable integrated bayonet, this gun maintains immense popularity.", - "weight": 3850, + "weight": "3850 g", "volume": "2500 ml", "price": 38000, "to_hit": -1, diff --git a/data/json/items/gun/762R.json b/data/json/items/gun/762R.json index 752b0d55f5caa..bf11bf1efe134 100644 --- a/data/json/items/gun/762R.json +++ b/data/json/items/gun/762R.json @@ -40,7 +40,7 @@ "name": "Mosin-Nagant 1891/30", "name_plural": "Mosin-Nagant 1891/30", "description": "The Mosin-Nagant 1891/30 is a bolt action, internal magazine-fed, military rifle, developed by the Russian Empire, and later used and perfected by the Soviet Union.", - "weight": 4000, + "weight": "4000 g", "volume": "3 L", "price": 19000, "to_hit": -1, diff --git a/data/json/items/gun/762x25.json b/data/json/items/gun/762x25.json index 4e525282f9299..aefaba094d9ab 100644 --- a/data/json/items/gun/762x25.json +++ b/data/json/items/gun/762x25.json @@ -5,7 +5,7 @@ "reload_noise_volume": 10, "name": "PPSh-41", "description": "The Soviet-made PPSh-41 is a mass-produced selective-fire submachine gun. It has a relatively high rate of fire.", - "weight": 3630, + "weight": "3630 g", "volume": "1750 ml", "price": 280000, "to_hit": -2, @@ -19,6 +19,7 @@ "ranged_damage": 2, "dispersion": 120, "durability": 8, + "min_cycle_recoil": 270, "barrel_length": 2, "modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "AUTO", "auto", 15 ] ], "valid_mod_locations": [ @@ -34,6 +35,7 @@ [ "underbarrel", 1 ], [ "rail mount", 1 ] ], + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged", "fault_gun_chamber_spent" ], "magazines": [ [ "762x25", [ "ppshmag", "ppshdrum" ] ] ] }, { @@ -44,7 +46,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, + "weight": "798 g", "volume": "500 ml", "price": 100000, "to_hit": -2, @@ -53,6 +55,7 @@ "ammo": "762x25", "dispersion": 225, "durability": 7, + "min_cycle_recoil": 270, "magazine_well": 1, "magazines": [ [ "762x25", [ "tokarevmag" ] ] ] } diff --git a/data/json/items/gun/84x246mm.json b/data/json/items/gun/84x246mm.json index ea82c3a220515..535f0635808f7 100644 --- a/data/json/items/gun/84x246mm.json +++ b/data/json/items/gun/84x246mm.json @@ -12,7 +12,7 @@ "flags": [ "RELOAD_ONE", "BACKBLAST", "NEVER_JAMS" ], "skill": "launcher", "ammo": "84x246mm", - "weight": 6900, + "weight": "6900 g", "volume": "4500 ml", "bashing": 8, "to_hit": -3, @@ -38,7 +38,7 @@ "description": "Mil-Spec rocket launcher. An 84-mm unguided, portable, single-shot recoilless smoothbore weapon used primarily by the US military.", "extend": { "flags": [ "FIRE_TWOHAND", "NO_REPAIR" ] }, "ammo": "84x246mm", - "weight": 6803, + "weight": "6803 g", "volume": "3500 ml", "bashing": 4, "dispersion": 200, diff --git a/data/json/items/gun/8x40mm.json b/data/json/items/gun/8x40mm.json index 145263279caf9..9845f215b3620 100644 --- a/data/json/items/gun/8x40mm.json +++ b/data/json/items/gun/8x40mm.json @@ -6,7 +6,7 @@ "name": "RM103A automagnum", "//": "Rivtech don't come cheap.", "description": "Considered overkill by many, the Rivtech M103A remains one of the most powerful sidearms ever developed. Accepts stick magazines.", - "weight": 1450, + "weight": "1450 g", "volume": "750 ml", "price": 230000, "to_hit": -2, @@ -39,7 +39,7 @@ "reload_noise_volume": 10, "name": "RM11B scout rifle", "description": "Intended to function as a long-range sharpshooter support weapon for the military, the Rivtech RM11B scout rifle was designed for durability and accuracy under less than ideal circumstances. Its bullpup layout, integrated suppressor and digital scope, and two round burst mode allows it to deliver precise long-range takedowns, utilizing the proprietary Rivtech 8mm caseless round. Accepts stick magazines.", - "weight": 3100, + "weight": "3100 g", "volume": "2 L", "price": 2900000, "to_hit": -1, @@ -75,7 +75,7 @@ "reload_noise_volume": 10, "name": "RM2000 submachine gun", "description": "Utilizing a powerful and unusual caliber, the Rivtech RM2000 submachine gun was designed for durability and ease of carrying under less than ideal circumstances. Accepts stick magazines.", - "weight": 1900, + "weight": "1900 g", "volume": "1 L", "price": 1900000, "to_hit": -2, @@ -109,7 +109,7 @@ "reload_noise_volume": 10, "name": "RM298 HMG", "description": "Utilizing a powerful and unusual caliber, the Rivtech RM298 heavy machine gun was designed for durability and extreme volume of sustained fire under the worst possible circumstances. Accepts RMXB500 box and RMGD250 drum magazines.", - "weight": 24500, + "weight": "24500 g", "volume": "4500 ml", "price": 7500000, "to_hit": -4, @@ -137,7 +137,7 @@ "reload_noise_volume": 10, "name": "RM51 assault rifle", "description": "Originally produced for military use, the Rivtech RM51 assault rifle was designed for durability and ease of use under less than ideal circumstances, with its considerable bulk minimized by a compact and ergonomic layout. Accepts box magazines.", - "weight": 2850, + "weight": "2850 g", "volume": "1750 ml", "price": 1800000, "to_hit": -1, @@ -172,7 +172,7 @@ "reload_noise_volume": 10, "name": "RM614 LMG", "description": "Utilizing a powerful and unusual caliber, the Rivtech RM614 light machine gun was designed for durability and extreme volume of sustained fire under the worst possible circumstances. Accepts RMXB500 box and RMGD250 drum magazines.", - "weight": 4600, + "weight": "4600 g", "volume": "2750 ml", "price": 3750000, "to_hit": -1, @@ -209,7 +209,7 @@ "reload_noise_volume": 10, "name": "RM88 battle rifle", "description": "Originally produced for military use, the Rivtech RM88 battle rifle was designed for durability and extreme firepower under less than ideal circumstances, with a heavy ported barrel for maximum controllability. Accepts box and RMGD250 drum magazines.", - "weight": 3200, + "weight": "3200 g", "volume": "2500 ml", "price": 900000, "to_hit": -1, @@ -245,7 +245,7 @@ "name": "RM99 revolver", "//": "Bear in mind that most revolvers don't reach $1K. Expensive.", "description": "Considered overkill by some, the Rivtech M99 remains an exceedingly powerful addition to the arsenal of any gunslinger.", - "weight": 1204, + "weight": "1204 g", "volume": "750 ml", "price": 210000, "to_hit": -2, diff --git a/data/json/items/gun/9mm.json b/data/json/items/gun/9mm.json index d6b93e9af6651..bd355100efe48 100644 --- a/data/json/items/gun/9mm.json +++ b/data/json/items/gun/9mm.json @@ -5,7 +5,7 @@ "reload_noise_volume": 10, "name": "briefcase SMG", "description": "A custom built 9x19mm submachine gun camouflaged to look as the average businessman suitcase, panes of cutting edge materials and its clever internal construction allowed it to bypass even the most scrupulous of security checkpoints. Due to the fact that the average security guard is now only concerned in eating you, this million dollar baby has been reduced to little more than a novelty item.", - "weight": 2640, + "weight": "2640 g", "volume": "1250 ml", "price": 400000, "bashing": 15, @@ -19,7 +19,7 @@ "min_cycle_recoil": 450, "modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "BURST", "3 rd.", 3 ], [ "AUTO", "auto", 5 ] ], "armor_data": { "covers": [ "ARM_EITHER", "HAND_EITHER" ], "coverage": 10, "encumbrance": 30, "material_thickness": 1 }, - "faults": [ "fault_gun_blackpowder", "fault_gun_clogged" ], + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged", "fault_gun_chamber_spent" ], "magazines": [ [ "9mm", [ "stenmag", "survivor9mm_mag" ] ] ], "valid_mod_locations": [ [ "rail mount", 1 ] ], "flags": [ "OVERSIZE", "BELTED", "FANCY", "RESTRICT_HANDS" ] @@ -32,7 +32,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, + "weight": "1680 g", "volume": "1 L", "price": 240000, "to_hit": -2, @@ -61,7 +61,7 @@ [ "stock", 1 ], [ "underbarrel", 1 ] ], - "faults": [ "fault_gun_blackpowder", "fault_gun_clogged" ], + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged", "fault_gun_chamber_spent" ], "magazine_well": 1, "magazines": [ [ "9mm", [ "calicomag" ] ] ] }, @@ -71,7 +71,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, + "weight": "2300 g", "volume": "1500 ml", "price": 90000, "to_hit": -1, @@ -85,6 +85,7 @@ "ranged_damage": 2, "dispersion": 180, "durability": 10, + "min_cycle_recoil": 450, "barrel_length": 1, "valid_mod_locations": [ [ "accessories", 4 ], @@ -100,7 +101,7 @@ [ "stock", 1 ], [ "underbarrel", 1 ] ], - "faults": [ "fault_gun_blackpowder", "fault_gun_clogged" ], + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged", "fault_gun_chamber_spent" ], "magazine_well": 1, "magazines": [ [ "9mm", [ "m9bigmag", "m9mag" ] ] ] }, @@ -110,7 +111,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, + "weight": "595 g", "volume": "500 ml", "price": 69000, "to_hit": -2, @@ -123,6 +124,7 @@ "dispersion": 480, "durability": 6, "blackpowder_tolerance": 48, + "min_cycle_recoil": 380, "magazine_well": 1, "magazines": [ [ "9mm", [ "glockmag", "glockbigmag", "glock17_17", "glock17_22", "glock_drum_50rd", "glock_drum_100rd" ] ] ] }, @@ -132,7 +134,7 @@ "reload_noise_volume": 10, "name": "H&K MP5", "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, + "weight": "2550 g", "volume": "1250 ml", "price": 280000, "to_hit": -2, @@ -162,7 +164,7 @@ [ "stock", 1 ], [ "underbarrel", 1 ] ], - "faults": [ "fault_gun_blackpowder", "fault_gun_clogged" ], + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged", "fault_gun_chamber_spent" ], "magazines": [ [ "9mm", [ "mp5mag", "mp5bigmag" ] ] ] }, { @@ -185,7 +187,6 @@ [ "stock", 1 ], [ "underbarrel", 1 ] ], - "faults": [ "fault_gun_blackpowder", "fault_gun_clogged" ], "modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "BURST", "3 rd.", 3 ], [ "AUTO", "auto", 12 ] ], "built_in_mods": [ "mp5sd_suppressor" ] }, @@ -196,7 +197,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, + "weight": "1985 g", "volume": "1750 ml", "price": 75000, "to_hit": -1, @@ -210,6 +211,7 @@ "ranged_damage": 3, "dispersion": 180, "durability": 7, + "min_cycle_recoil": 450, "barrel_length": 1, "built_in_mods": [ "folding_stock" ], "valid_mod_locations": [ @@ -224,7 +226,7 @@ [ "sights", 1 ], [ "sling", 1 ] ], - "faults": [ "fault_gun_blackpowder", "fault_gun_clogged" ], + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged", "fault_gun_chamber_spent" ], "magazine_well": 1, "magazines": [ [ "9mm", [ "glockmag", "glockbigmag", "glock17_17", "glock17_22", "glock_drum_50rd", "glock_drum_100rd" ] ] ] }, @@ -248,7 +250,6 @@ "description": "A selective-firing 9x19mm handgun introduced by Leadworks LLC's, L39B provides accurate single-shot placement as well as controllable short-range firepower with its three-round burst mode. Users praised its accuracy and fearsome appearance. Comes with built in red dot and laser sights. Similar to other Leadworks products it doesn't accept third-party modifications.", "price": 95000, "burst": 3, - "min_cycle_recoil": 450, "relative": { "weight": 130, "durability": -1 } }, { @@ -258,7 +259,7 @@ "name": "L39", "//": "L39s are based off the Robocop Auto-9, in turn a dolled-up Beretta 93R.", "description": "A semiautomatic 9x19mm handgun introduced by Leadworks LLC's, L39 provides accurate single-shot placement in a very robust frame with built in red dot and laser sights. Several urban legends describe using it in ways that would have destroyed a lesser weapon. Similar to other Leadworks products it doesn't accept third-party modifications.", - "weight": 935, + "weight": "935 g", "volume": "500 ml", "price": 70000, "to_hit": -2, @@ -270,6 +271,7 @@ "range": 1, "dispersion": 340, "durability": 9, + "min_cycle_recoil": 450, "built_in_mods": [ "lead_red_dot_sight", "lead_laser_sight" ], "valid_mod_locations": [ [ "accessories", 2 ], @@ -291,7 +293,7 @@ "type": "GUN", "name": "Beretta M9", "description": "A very popular 9x19mm pistol, the M9 has been the standard issue sidearm of the US army since 1985.", - "weight": 590, + "weight": "590 g", "volume": "500 ml", "price": 65000, "to_hit": -2, @@ -303,6 +305,7 @@ "range": 1, "dispersion": 480, "durability": 6, + "min_cycle_recoil": 450, "magazine_well": 1, "magazines": [ [ "9mm", [ "m9mag", "m9bigmag" ] ] ] }, @@ -314,7 +317,7 @@ "name_plural": "pipe rifles: 9x19mm", "//": "Despite its quality, it IS a small rifle, although not as effective as a genuine pistol carbine.", "description": "A home-made rifle. It is simply a pipe attached to a stock, with a hammer to strike the single round it holds.", - "weight": 2114, + "weight": "2114 g", "volume": "2 L", "price": 10000, "to_hit": -1, @@ -353,7 +356,7 @@ "name_plural": "Luty SMGs: 9x19mm", "description": "A Luty pattern makeshift smoothbore SMG crudely constructed out of various steel parts using some of the more advanced powered hand tools; likely one of the most complex guns that are feasible to make outside of a machine shop, but still very unreliable. This one is chambered for 9x19mm cartridges and accepts STEN magazines, or alternatively custom-made makeshift ones.", "//": "Crafting recipe must make use of angle grinder, bench grinder, set square and vise, which don't yet exist in game.", - "weight": 3274, + "weight": "3274 g", "volume": "1750 ml", "price": 20000, "to_hit": -1, @@ -365,7 +368,7 @@ "dispersion": 590, "durability": 4, "blackpowder_tolerance": 24, - "min_cycle_recoil": 325, + "min_cycle_recoil": 380, "modes": [ [ "DEFAULT", "auto", 10 ] ], "loudness": 25, "barrel_length": 1, @@ -390,7 +393,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, + "weight": "2945 g", "volume": "1750 ml", "price": 40000, "bashing": 10, @@ -415,7 +418,7 @@ [ "sights mount", 1 ], [ "underbarrel mount", 1 ] ], - "faults": [ "fault_gun_blackpowder", "fault_gun_clogged" ], + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged", "fault_gun_chamber_spent" ], "magazines": [ [ "9mm", [ "stenmag", "survivor9mm_mag" ] ] ] }, { @@ -425,7 +428,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, + "weight": "1080 g", "volume": "500 ml", "price": 125000, "to_hit": -2, @@ -453,7 +456,7 @@ [ "stock", 1 ], [ "underbarrel", 1 ] ], - "faults": [ "fault_gun_blackpowder", "fault_gun_clogged" ], + "faults": [ "fault_gun_blackpowder", "fault_gun_clogged", "fault_gun_chamber_spent" ], "magazine_well": 1, "magazines": [ [ "9mm", [ "tec9mag" ] ] ] }, @@ -464,7 +467,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, + "weight": "520 g", "volume": "500 ml", "price": 68000, "to_hit": -2, @@ -477,6 +480,7 @@ "dispersion": 400, "durability": 9, "blackpowder_tolerance": 48, + "min_cycle_recoil": 450, "magazine_well": 1, "magazines": [ [ "9mm", [ "usp9mag" ] ] ] }, @@ -488,7 +492,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, + "weight": "3300 g", "volume": "1250 ml", "price": 208000, "to_hit": -2, @@ -525,7 +529,7 @@ "type": "GUN", "name": "Glock 17", "description": "Designed for all shooters, the Glock 17 is marketed towards law-enforcement and military.", - "weight": 595, + "weight": "595 g", "volume": "500 ml", "price": 69000, "to_hit": -2, @@ -537,6 +541,7 @@ "dispersion": 480, "durability": 6, "blackpowder_tolerance": 48, + "min_cycle_recoil": 380, "magazine_well": 1, "//": "Glock 17s cannot load a 15 round magazine. See http://guns-of-fun.com/portals/0/LiveContent/Mounts/Glock-Mags-Comp.jpg and #33038", "magazines": [ [ "9mm", [ "glockbigmag", "glock17_17", "glock17_22", "glock_drum_50rd", "glock_drum_100rd" ] ] ] @@ -549,8 +554,7 @@ "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.", "price": 100000, "burst": 20, - "built_in_mods": [ "barrel_ported" ], - "min_cycle_recoil": 325 + "built_in_mods": [ "barrel_ported" ] }, { "id": "kpf9", @@ -558,12 +562,13 @@ "type": "GUN", "name": "Kel-Tec PF-9", "description": "The Kel-Tec PF-9 remains one of the most popular backup pistols due to its history of reliability, affordability, and concealability. Chambered in 9x19mm, recoil is best described as unpleasant, and follow up shots are difficult to place quickly.", - "weight": 360, + "weight": "360 g", "volume": "360ml", "ranged_damage": -1, "price": 18000, "bashing": 2, "ammo": "9mm", + "min_cycle_recoil": 450, "magazines": [ [ "9mm", [ "kpf9mag" ] ] ] }, { @@ -572,7 +577,7 @@ "type": "GUN", "name": "M17", "description": "The M17 is a semi automatic, short recoil operated pistol derived from the SIG Sauer P320.", - "weight": 800, + "weight": "800 g", "volume": "500 ml", "price": 69000, "to_hit": -2, @@ -582,6 +587,7 @@ "ammo": "9mm", "dispersion": 480, "durability": 6, + "min_cycle_recoil": 450, "magazine_well": 1, "magazines": [ [ "9mm", [ "p320mag_17rd_9x19mm" ] ] ] }, @@ -591,7 +597,7 @@ "type": "GUN", "name": "Browning Hi-Power 9x19mm", "description": "The Browning Hi-Power is a semi-automatic handgun developed shortly before the second world war. Widely issued since then, it remains in use by India, Canada and Australia. This is a commercial variant produced by Browning Arms in 9x19mm Parabellum.", - "weight": 900, + "weight": "900 g", "volume": "418 ml", "price": 32000, "to_hit": -2, @@ -610,7 +616,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, + "weight": "950 g", "volume": "547 ml", "price": 39000, "to_hit": -2, @@ -629,7 +635,7 @@ "type": "GUN", "name": "Walther PPQ 9mm", "description": "The Walther PPQ is a semi-automatic pistol originating from the Walther P99QA, and maintains compatibility with some of its predecessor's accessories. This model is chambered in 9x19mm Parabellum.", - "weight": 615, + "weight": "615 g", "volume": "413 ml", "price": 65000, "bashing": 8, @@ -647,7 +653,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, + "weight": "709 g", "volume": "539 ml", "price": 7500, "to_hit": -2, @@ -666,7 +672,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, + "weight": "1120 g", "volume": "526 ml", "price": 10000, "to_hit": -2, @@ -685,7 +691,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, + "weight": "633 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 3a20ab8353523..78d0fb13b3bc9 100644 --- a/data/json/items/gun/9x18.json +++ b/data/json/items/gun/9x18.json @@ -6,7 +6,7 @@ "name": "Makarov PM", "//": "10 and 12-round magazines exist, but were made for the newer PMM, and are not compatible with the old PM.", "description": "The Pistolet Makarova was developed by the Soviet Union to replace the WWII-era TT-33 pistol. It uses the 9x18mm cartridge, which remains in use among various former Soviet countries.", - "weight": 730, + "weight": "730 g", "volume": "250 ml", "price": 25000, "to_hit": -2, @@ -16,6 +16,7 @@ "ammo": "9x18", "dispersion": 480, "durability": 6, + "min_cycle_recoil": 270, "valid_mod_locations": [ [ "accessories", 2 ], [ "barrel", 1 ], @@ -39,8 +40,9 @@ "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, + "weight": "1251 g", "ammo": "9x18", + "min_cycle_recoil": 270, "burst": 15, "magazines": [ [ "9x18", [ "skorpion82mag" ] ] ] } diff --git a/data/json/items/gun/atgm.json b/data/json/items/gun/atgm.json index f8f7390f39c20..0f85ccb6cda32 100644 --- a/data/json/items/gun/atgm.json +++ b/data/json/items/gun/atgm.json @@ -6,7 +6,7 @@ "name": "BGM-71F TOW", "name_plural": "BGM-71F TOW", "description": "A launcher for anti-tank guided missiles, capable of being deployed as a crew-served weapon or mounted on vehicles. While fairly accurate, it isn't fire-and-forget.", - "weight": 93000, + "weight": "93000 g", "volume": "25 L", "price": 8500000, "to_hit": -6, diff --git a/data/json/items/gun/bio.json b/data/json/items/gun/bio.json index 02ba153c2033a..1d7fef4a58782 100644 --- a/data/json/items/gun/bio.json +++ b/data/json/items/gun/bio.json @@ -24,7 +24,7 @@ "type": "GUN", "name": "EMP Projector", "description": "this a pseudo item", - "weight": 2950, + "weight": "2950 g", "volume": "2 L", "price": 1600000, "to_hit": -1, diff --git a/data/json/items/gun/blunderbuss.json b/data/json/items/gun/blunderbuss.json index 9a834c72f8c3e..1dbd7fac55f2b 100644 --- a/data/json/items/gun/blunderbuss.json +++ b/data/json/items/gun/blunderbuss.json @@ -6,7 +6,7 @@ "name": "blunderbuss", "name_plural": "blunderbusses", "description": "A homemade version of a crude precursor to the shotgun. Able to fire just about anything you put down the barrel, but it will degrade pretty quick.", - "weight": 8267, + "weight": "8267 g", "volume": "3 L", "price": 15000, "to_hit": -1, diff --git a/data/json/items/gun/chemical_spray.json b/data/json/items/gun/chemical_spray.json index 843960a5ca5e2..9e7dc9c1eb01e 100644 --- a/data/json/items/gun/chemical_spray.json +++ b/data/json/items/gun/chemical_spray.json @@ -6,7 +6,7 @@ "reload_noise": "slosh.", "name": "makeshift chemical thrower", "description": "A bulky, self-made chemical sprayer with an internal conversion mechanism that allows all sorts of chemicals to be dispersed to your surroundings.", - "weight": 4588, + "weight": "4588 g", "volume": "4250 ml", "price": 10000, "to_hit": -1, diff --git a/data/json/items/gun/faults_gun.json b/data/json/items/gun/faults_gun.json index e83d7b8b47655..3211654de0a80 100644 --- a/data/json/items/gun/faults_gun.json +++ b/data/json/items/gun/faults_gun.json @@ -11,6 +11,15 @@ "tools": [ [ [ "pipe_cleaner", -1 ], [ "small_repairkit", -1 ], [ "large_repairkit", -1 ] ] ] } }, + { + "id": "fault_gun_chamber_spent", + "type": "fault", + "name": "spent casing in chamber", + "description": "This gun currently has an empty casing chambered. It will have to be removed before firing.", + "time": 50, + "skills": [ ], + "requirements": { } + }, { "id": "fault_gun_clogged", "type": "fault", diff --git a/data/json/items/gun/flammable.json b/data/json/items/gun/flammable.json index f9e5bf69e087a..f085a27d79d28 100644 --- a/data/json/items/gun/flammable.json +++ b/data/json/items/gun/flammable.json @@ -5,7 +5,7 @@ "type": "GUN", "name": "flamethrower", "description": "A large flamethrower with substantial gas reserves. Very menacing and deadly.", - "weight": 1587, + "weight": "1587 g", "volume": "4 L", "price": 80000, "to_hit": -1, @@ -32,7 +32,7 @@ "type": "GUN", "name": "RM451 flamethrower", "description": "A military-grade combat flamethrower designed by Rivtech, the RM451 flamethrower incorporates a cycling pressure rapid-feed fuel system with a high-speed piezoelectric igniter. Solidly built with durability in mind, it serves as an incredibly destructive weapon in the right hands.", - "weight": 1320, + "weight": "1320 g", "volume": "3500 ml", "price": 970000, "to_hit": -1, diff --git a/data/json/items/gun/flintlock.json b/data/json/items/gun/flintlock.json index be315774cc83d..0b42d0d1992ba 100644 --- a/data/json/items/gun/flintlock.json +++ b/data/json/items/gun/flintlock.json @@ -34,7 +34,7 @@ "reload_noise_volume": 10, "name": "flintlock pistol", "description": "A beautifully decorated flintlock pistol. If using this doesn't makes you feel a pirate, nothing will.", - "weight": 753, + "weight": "753 g", "volume": "750 ml", "price": 35000, "to_hit": -1, @@ -66,7 +66,7 @@ "reload_noise_volume": 10, "name": "flintlock rifle", "description": "For once, something *good* came back from the dead. This ancient design lacks the fire-rate of modern weapons, but packs as much punch as the best of 'em and rewards the skilled shooter with easily-crafted ammunition.", - "weight": 1950, + "weight": "1950 g", "volume": "2500 ml", "price": 41000, "to_hit": -1, diff --git a/data/json/items/gun/metal_rail.json b/data/json/items/gun/metal_rail.json index ab70e915530f9..53c94951b072b 100644 --- a/data/json/items/gun/metal_rail.json +++ b/data/json/items/gun/metal_rail.json @@ -5,7 +5,7 @@ "reload_noise_volume": 10, "name": "heavy rail rifle", "description": "This overpowered and overengineered variant of the ferromagnetic rail rifle was designed to deliver electromagnetically-driven obliteration right through whatever obstacles that lies in front of it, be it buildings, vehicles or hordes of walking dead. However, the hefty bulk and weight of this weapon compared to most contemporary rifles makes it somewhat cumbersome to wield; not to mention that it consumes UPS charges at a tremendous rate, making it impractical for use in prolonged engagements.", - "weight": 11500, + "weight": "11500 g", "volume": "4500 ml", "price": 900000, "to_hit": -1, @@ -41,7 +41,7 @@ "reload_noise_volume": 10, "name": "ferromagnetic rail rifle", "description": "A single-shot, electrically propelled, steel rail launcher handcrafted from scrap. The hypervelocity metal stake that it fires is accelerated to the point of spontaneous combustion by a Lorentz force generated by electromagnetic induction, powered by a standard UPS.", - "weight": 4213, + "weight": "4213 g", "volume": "2500 ml", "price": 550000, "to_hit": -3, diff --git a/data/json/items/gun/monster_gun.json b/data/json/items/gun/monster_gun.json index 8806081e2f6ca..c8506e441fb22 100644 --- a/data/json/items/gun/monster_gun.json +++ b/data/json/items/gun/monster_gun.json @@ -1,33 +1,33 @@ -{ - "id": "barb_launcher", - "type": "GUN", - "symbol": "%", - "color": "red", - "name": "barb launching organ", - "description": "A mutated organ capable of launching bony barbs at great speed.", - "material": [ - "hflesh" - ], - "flags": [ - "PRIMITIVE_RANGED_WEAPON", - "NEVER_JAMS", - "NONCONDUCTIVE", - "NO_REPAIR", - "WATERPROOF_GUN", - "NO_SALVAGE", - "NO_UNLOAD", - "RELOAD_AND_SHOOT" - ], - "skill": "pistol", - "ammo": "barb", - "clip_size": 1, - "weight": 540, - "volume": "750ml", - "bashing": 2, - "to_hit": 1, - "reload_noise_volume": 2, - "loudness": 2, - "range": 12, - "dispersion": 100, - "durability": 8 -} +[ + { + "id": "barb_launcher", + "type": "GUN", + "symbol": "%", + "color": "red", + "name": "barb launching organ", + "description": "A mutated organ capable of launching bony barbs at great speed.", + "material": [ "hflesh" ], + "flags": [ + "PRIMITIVE_RANGED_WEAPON", + "NEVER_JAMS", + "NONCONDUCTIVE", + "NO_REPAIR", + "WATERPROOF_GUN", + "NO_SALVAGE", + "NO_UNLOAD", + "RELOAD_AND_SHOOT" + ], + "skill": "pistol", + "ammo": "barb", + "clip_size": 1, + "weight": "540 g", + "volume": "750ml", + "bashing": 2, + "to_hit": 1, + "reload_noise_volume": 2, + "loudness": 2, + "range": 12, + "dispersion": 100, + "durability": 8 + } +] diff --git a/data/json/items/gun/nail.json b/data/json/items/gun/nail.json index 00893999384b7..e38c791c11c53 100644 --- a/data/json/items/gun/nail.json +++ b/data/json/items/gun/nail.json @@ -6,7 +6,7 @@ "name": "coilgun", "//": "Hard to make, plentiful and cheap ammo, and silent - people will want this thing.", "description": "A homemade gun, using electromagnets to accelerate a ferromagnetic projectile to high velocity. Powered by UPS.", - "weight": 3341, + "weight": "3341 g", "volume": "2750 ml", "price": 75000, "to_hit": -2, @@ -38,7 +38,7 @@ "reload_noise_volume": 10, "name": "nail gun", "description": "A tool used to drive nails into wood or other material. It could also be used as a ad-hoc weapon.", - "weight": 3904, + "weight": "3904 g", "volume": "750 ml", "price": 13000, "to_hit": -2, diff --git a/data/json/items/gun/paintball.json b/data/json/items/gun/paintball.json index 50aa9daf9882e..5dfb5b8954cc7 100644 --- a/data/json/items/gun/paintball.json +++ b/data/json/items/gun/paintball.json @@ -12,7 +12,7 @@ "flags": "NEVER_JAMS", "skill": "smg", "ammo": "paintball", - "weight": 1600, + "weight": "1600 g", "volume": "1250 ml", "bashing": 5, "to_hit": -1, diff --git a/data/json/items/gun/shot.json b/data/json/items/gun/shot.json index 761aa6b99a418..4321239ab327c 100644 --- a/data/json/items/gun/shot.json +++ b/data/json/items/gun/shot.json @@ -5,7 +5,7 @@ "type": "GUN", "name": "heavy automatic shotgun", "description": "Modified from the massive M2 Browning, this heavy machine gun has been re-chambered and re-bored for shotgun shells, and completely redesigned to be wielded unmounted by one user.", - "weight": 21800, + "weight": "21800 g", "volume": "4 L", "price": 745000, "to_hit": -3, @@ -27,7 +27,7 @@ "reload_noise_volume": 10, "name": "12 gauge pistol", "description": "A single shot pistol that loads 12 gauge shotgun shells, handcrafted from scrap.", - "weight": 828, + "weight": "828 g", "volume": "500 ml", "price": 100000, "to_hit": -2, @@ -60,7 +60,7 @@ "name": "manual autoshotgun", "//": "Hard to value this thing, but considering what a $2000 pricepoint puts it on par with, that is too much.", "description": "A six-barrel hand-cranked automatic shotgun made from bicycle parts. Though a bit unwieldy, it is exceedingly powerful for such a simple machine.", - "weight": 4980, + "weight": "4980 g", "volume": "2500 ml", "price": 180000, "to_hit": -2, @@ -89,7 +89,7 @@ "name": "Kel-Tec KSG", "name_plural": "Kel-Tec KSG", "description": "A bullpup pump-action shotgun, the Kel-Tec KSG uses a pair of magazine tubes to increase its capacity. Each tube has to be loaded separately, but this offers the option of loading different ammunition for different situations.", - "weight": 1550, + "weight": "1550 g", "volume": 0, "price": 99000, "to_hit": -1, @@ -122,7 +122,7 @@ "name_plural": "L12 Defender", "//": "Similar stats to the NeoStead 2000 which has a similar operating mechanism", "description": "Leadworks LLC's sole shotgun offering to date is surprisingly compact thanks to its moving barrel and forward-back pump mechanism. Additionally it has built in red dot and laser sights. Like most other Leadworks products it doesn't accept third-party modifications.", - "weight": 3850, + "weight": "3850 g", "volume": "1500 ml", "price": 92000, "to_hit": -1, @@ -152,7 +152,7 @@ "name": "M1014 shotgun", "name_plural": "M1014 shotguns", "description": "Its relative simplicity and reliability made the Benelli M4 the most successful semi-automatic shotgun ever created.", - "weight": 3820, + "weight": "3820 g", "volume": "2500 ml", "price": 169900, "to_hit": -1, @@ -172,7 +172,7 @@ "name": "Mossberg 500", "name_plural": "Mossberg 500", "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.", - "weight": 3401, + "weight": "3401 g", "volume": "2500 ml", "price": 53800, "to_hit": -1, @@ -211,7 +211,7 @@ "type": "GUN", "name": "pipe shotgun", "description": "A home-made shotgun. It is simply a pipe attached to a stock, with a hammer to strike the single round it holds.", - "weight": 2267, + "weight": "2267 g", "volume": "2250 ml", "price": 20000, "to_hit": -1, @@ -243,7 +243,7 @@ "name": "Remington 870", "name_plural": "Remington 870", "description": "One of the most popular shotguns on the market, the Remington 870 is used by hunters and law enforcement agencies alike thanks to its high accuracy and muzzle velocity.", - "weight": 3400, + "weight": "3400 g", "volume": "2500 ml", "price": 58700, "to_hit": -1, @@ -261,7 +261,7 @@ "type": "GUN", "name": "shotgun revolver", "description": "A shotgun modified to use a revolver cylinder mechanism, it can hold 6 cartridges.", - "weight": 5443, + "weight": "5443 g", "volume": "3 L", "price": 75000, "to_hit": -1, @@ -290,7 +290,7 @@ "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.", - "weight": 3550, + "weight": "3550 g", "volume": "2750 ml", "price": 189000, "to_hit": -1, @@ -331,7 +331,7 @@ "type": "GUN", "name": "single barrel shotgun", "description": "An old shotgun, possibly antique. It is little more than a barrel, a wood stock, and a hammer to strike the cartridge. Its simple design keeps it both light and accurate.", - "weight": 5216, + "weight": "5216 g", "volume": "2 L", "price": 40000, "to_hit": -1, @@ -361,7 +361,7 @@ "type": "GUN", "name": "handmade lever shotgun", "description": "A well designed homemade lever-action shotgun. With a 8 round magazine, this is one of the better homemade weapons.", - "weight": 3934, + "weight": "3934 g", "volume": "2500 ml", "price": 135000, "to_hit": -1, diff --git a/data/json/items/gun/signal_flare.json b/data/json/items/gun/signal_flare.json index 0093e286bd648..9c87aa5321cf6 100644 --- a/data/json/items/gun/signal_flare.json +++ b/data/json/items/gun/signal_flare.json @@ -5,7 +5,7 @@ "reload_noise_volume": 10, "name": "flaregun", "description": "A plastic single shot pistol that can be loaded with signal flares.", - "weight": 213, + "weight": "213 g", "volume": "500 ml", "price": 5000, "material": [ "plastic", "steel" ], diff --git a/data/json/items/gun/ups.json b/data/json/items/gun/ups.json index 9c79cb2a598f4..31ce0f1b34b01 100644 --- a/data/json/items/gun/ups.json +++ b/data/json/items/gun/ups.json @@ -5,7 +5,7 @@ "reload_noise_volume": 10, "name": "XM34 EMP projector", "description": "A powerful electrolaser developed by the R&D outfit \"Aerial Labs\". Especially effective against electronic targets.", - "weight": 2950, + "weight": "2950 g", "volume": "3 L", "price": 1600000, "to_hit": -1, @@ -42,7 +42,7 @@ "reload_noise_volume": 20, "name": "CMES laser cannon", "description": "This is the integral weapon system for the CMES exoskeleton mech-suit, a rotating-barrel active-cooled rapid-fire laser system, can spray death downrange with ease.", - "weight": 39500, + "weight": "39500 g", "volume": "11 L", "price": 9500000, "to_hit": -4, @@ -69,7 +69,7 @@ "reload_noise_volume": 2, "name": "RMES marksman system", "description": "This is the integral weapon system for the RMES exoskeleton mech-suit, a quiet and accurate marksman laser rifle.", - "weight": 12500, + "weight": "12500 g", "volume": "5500 ml", "price": 9500000, "to_hit": -2, @@ -86,7 +86,6 @@ "loudness": 1, "ups_charges": 180, "reload": 0, - "default_mods": [ "inter_bayonet" ], "ammo_effects": [ "LASER", "INCENDIARY" ], "flags": [ "NO_UNLOAD", "NEVER_JAMS", "MECH_WEAPON", "NO_UNWIELD", "NO_SALVAGE", "NO_REPAIR", "UNBREAKABLE_MELEE" ] }, @@ -96,7 +95,7 @@ "reload_noise_volume": 10, "name": "handheld laser cannon", "description": "This is a laser cannon stripped from the barrel of a TX-5LR Cerberus laser turret that has been modified to use UPS power for firing.", - "weight": 5140, + "weight": "5140 g", "volume": "1500 ml", "price": 400000, "to_hit": -1, @@ -132,7 +131,7 @@ "reload_noise_volume": 10, "name": "A7 laser rifle", "description": "A state of the art laser rifle developed by the R&D outfit \"Aerial Labs\". Initial performance rivaled Rivtech's finest, with rumors flying about corporate skulduggery. Though the cataclysm put that on the ash heap of history, this weapon can still do the same to your foes.", - "weight": 2950, + "weight": "2950 g", "volume": "3 L", "price": 1600000, "to_hit": -1, @@ -170,7 +169,7 @@ "reload_noise_volume": 10, "name": "V29 laser pistol", "description": "The V29 laser pistol was designed in the mid-21st century and was one of the first handheld laser weapons. It is larger than most traditional handguns, but displays no recoil whatsoever.", - "weight": 680, + "weight": "680 g", "volume": "1 L", "price": 720000, "to_hit": -2, @@ -199,41 +198,5 @@ ], "ammo_effects": [ "LASER", "INCENDIARY" ], "flags": [ "NEVER_JAMS", "NO_UNLOAD" ] - }, - { - "id": "v29_cheap", - "type": "GUN", - "reload_noise_volume": 10, - "name": "homemade laser pistol", - "description": "This laser pistol was based on the V29 laser pistol designed in the mid-21st century. While little more than duct tape and electronics, it runs on a standard UPS.", - "weight": 540, - "volume": "2 L", - "price": 500000, - "to_hit": -2, - "bashing": 5, - "material": [ "steel", "plastic" ], - "symbol": "(", - "color": "magenta", - "skill": "pistol", - "range": 30, - "ranged_damage": 10, - "pierce": 6, - "dispersion": 180, - "durability": 4, - "loudness": 7, - "ups_charges": 20, - "reload": 300, - "valid_mod_locations": [ - [ "accessories", 2 ], - [ "emitter", 1 ], - [ "grip", 1 ], - [ "lens", 1 ], - [ "rail", 1 ], - [ "sights", 1 ], - [ "stock", 1 ], - [ "underbarrel mount", 1 ] - ], - "ammo_effects": [ "LASER", "INCENDIARY" ], - "flags": [ "NO_UNLOAD" ] } ] diff --git a/data/json/items/gunmod/accessories.json b/data/json/items/gunmod/accessories.json index cf38eff2d85e6..0f24b985a77e8 100644 --- a/data/json/items/gunmod/accessories.json +++ b/data/json/items/gunmod/accessories.json @@ -4,7 +4,7 @@ "type": "GUNMOD", "name": "arrow rest", "description": "A small extension above the grip which an arrow rests upon while being aimed. Improves accuracy with no drawbacks.", - "weight": 16, + "weight": "16 g", "volume": "250 ml", "integral_volume": 0, "price": 4000, @@ -21,7 +21,7 @@ "type": "GUNMOD", "name": "bow stabilizer", "description": "A counterweight placed forward of the bow's grip allows for greater accuracy. Aside from increased weight and size, there are no drawbacks.", - "weight": 88, + "weight": "88 g", "volume": "500 ml", "price": 4000, "material": [ "aluminum", "plastic" ], @@ -38,7 +38,7 @@ "type": "GUNMOD", "name": "bow stabilizer system", "description": "A set of three stabilizing, dampened rods with a spring-loaded bracket to mount on modern bows. Takes extra time to set up when wielding, but doesn't take much extra space.", - "weight": 300, + "weight": "300 g", "volume": "500 ml", "price": 15000, "material": [ "aluminum", "plastic" ], @@ -56,7 +56,7 @@ "type": "GUNMOD", "name": "bow dampening kit", "description": "A set of simple pads and strips of fur or rubber with adhesive backing, designed to stick on the limbs and string of a bow to absorb vibrations. This substantially reduces noise during firing and can help with accuracy.", - "weight": 50, + "weight": "50 g", "volume": "250 ml", "price": 500, "material": [ "plastic" ], @@ -74,7 +74,7 @@ "type": "GUNMOD", "name": "belt clip", "description": "This is a belt clip that attaches to the grip or slide of a pistol so as to facilitate 'Mexican carry', the practice of carrying without a holster. It does not offer any protection for the trigger, so users are strongly advised to carry with the chamber empty or select a firearm with a very heavy trigger pull.", - "weight": 40, + "weight": "40 g", "volume": "250 ml", "integral_volume": 0, "price": 2000, diff --git a/data/json/items/gunmod/barrel.json b/data/json/items/gunmod/barrel.json index ecd2fa06f61e5..e0cdf596f6a2a 100644 --- a/data/json/items/gunmod/barrel.json +++ b/data/json/items/gunmod/barrel.json @@ -20,7 +20,7 @@ "type": "GUNMOD", "name": "upstest", "description": "Testmod for UPS drain on mods, this should never spawn, if you see this, it's a bug. 50 UPS drain.", - "weight": 450, + "weight": "450 g", "volume": "500 ml", "price": 20000, "bashing": 5, diff --git a/data/json/items/gunmod/bionicmods.json b/data/json/items/gunmod/bionicmods.json index dcd43b18d773e..81c97d0cee89f 100644 --- a/data/json/items/gunmod/bionicmods.json +++ b/data/json/items/gunmod/bionicmods.json @@ -4,7 +4,7 @@ "type": "GUNMOD", "name": "Power shot", "description": "This is a pseudo item -- the builtin part of a fusion blaster for the maximum power firing mode.", - "weight": 1, + "weight": "1 g", "volume": 0, "price": 85000, "material": [ "steel" ], diff --git a/data/json/items/gunmod/brass_catcher.json b/data/json/items/gunmod/brass_catcher.json index faa9f0023a093..9319edf089cb8 100644 --- a/data/json/items/gunmod/brass_catcher.json +++ b/data/json/items/gunmod/brass_catcher.json @@ -4,7 +4,7 @@ "type": "GUNMOD", "name": "brass catcher", "description": "A bag that hangs off the side of your gun and catches ejected casings so you don't have to pick them up.", - "weight": 114, + "weight": "114 g", "volume": "250 ml", "price": 2000, "material": [ "cotton" ], diff --git a/data/json/items/gunmod/conversions.json b/data/json/items/gunmod/conversions.json index 0c09d24470176..c1f590501879e 100644 --- a/data/json/items/gunmod/conversions.json +++ b/data/json/items/gunmod/conversions.json @@ -4,7 +4,7 @@ "type": "GUNMOD", "name": ".300 AAC Blackout AR-15 conversion kit", "description": "A complete AR-15 upper assembly with a .300 AAC Blackout barrel.", - "weight": 1000, + "weight": "1000 g", "volume": "500 ml", "integral_volume": 0, "integral_weight": 0, @@ -13,7 +13,7 @@ "symbol": ":", "color": "green", "location": "bore", - "mod_targets": [ "ar15", "m4a1", "h&k416a5", "m27iar" ], + "mod_targets": [ "ar15", "m4a1", "m16a4", "h&k416a5", "m27iar" ], "install_time": "1 m", "ammo_modifier": "300blk", "magazine_adaptor": [ [ "300blk", [ "stanag30", "stanag50" ] ] ], diff --git a/data/json/items/gunmod/grip.json b/data/json/items/gunmod/grip.json index 95170309ca7e6..d941a244cdc81 100644 --- a/data/json/items/gunmod/grip.json +++ b/data/json/items/gunmod/grip.json @@ -4,7 +4,7 @@ "type": "GUNMOD", "name": "lightweight replacement furniture", "description": "A set of lightweight composite grips and furniture that reduces a firearm's weight, and as a consequence, its handling and melee damage.", - "weight": 140, + "weight": "140 g", "volume": "250 ml", "integral_volume": 0, "price": 48000, @@ -22,7 +22,7 @@ "type": "GUNMOD", "name": "ergonomic grip", "description": "A set of ergonomic replacement furniture for a firearm improving handling.", - "weight": 125, + "weight": "125 g", "volume": "250 ml", "integral_volume": 0, "integral_weight": 0, diff --git a/data/json/items/gunmod/laser_gunmods.json b/data/json/items/gunmod/laser_gunmods.json index d810e72de47ac..3646b1e600f49 100644 --- a/data/json/items/gunmod/laser_gunmods.json +++ b/data/json/items/gunmod/laser_gunmods.json @@ -4,7 +4,7 @@ "type": "GUNMOD", "name": "beam scatterer", "description": "A set of optics made to fit on laser weapons, which will diffract the laser beam into several lower powered beams. This increases point-blank damage, but greatly reduces range.", - "weight": 380, + "weight": "380 g", "volume": "250 ml", "price": 84000, "material": [ "steel" ], @@ -22,7 +22,7 @@ "type": "GUNMOD", "name": "focusing lens", "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, + "weight": "380 g", "volume": "250 ml", "price": 84000, "material": [ "steel" ], @@ -40,7 +40,7 @@ "type": "GUNMOD", "name": "electrolaser conversion", "description": "A set of high-tech electronics and optics. These converts a laser pistol into a less-lethal electrolaser capable of stunning targets, at the cost of a decreased damage output and increased power consumption.", - "weight": 380, + "weight": "380 g", "volume": "1 L", "price": 84000, "material": [ "steel" ], @@ -59,7 +59,7 @@ "type": "GUNMOD", "name": "effective emitter", "description": "A set of electronics to optimize emitter workcycle and increase overall energy efficiency. Decreases power consumption.", - "weight": 380, + "weight": "380 g", "volume": "250 ml", "integral_volume": 0, "price": 84000, @@ -76,7 +76,7 @@ "type": "GUNMOD", "name": "high density capacitor", "description": "A capacitor with a higher energy density increases range and damage; at the cost of a markedly increased power consumption.", - "weight": 380, + "weight": "380 g", "volume": "250 ml", "integral_volume": 0, "price": 84000, diff --git a/data/json/items/gunmod/magazine.json b/data/json/items/gunmod/magazine.json index ef24027bb3606..df499def0809c 100644 --- a/data/json/items/gunmod/magazine.json +++ b/data/json/items/gunmod/magazine.json @@ -4,7 +4,7 @@ "type": "GUNMOD", "name": "Leadworks magazine adapter", "description": "A bootleg adapter for permanently converting a firearm to accept proprietary Leadworks magazines. Guaranteed to void your warranty.", - "weight": 140, + "weight": "140 g", "volume": "250 ml", "integral_volume": "250 ml", "price": 48000, diff --git a/data/json/items/gunmod/mechanism.json b/data/json/items/gunmod/mechanism.json index f64a0f939545a..38f8645fe82e4 100644 --- a/data/json/items/gunmod/mechanism.json +++ b/data/json/items/gunmod/mechanism.json @@ -4,7 +4,7 @@ "type": "GUNMOD", "name": "match trigger", "description": "A precision weighted trigger assembly that slightly improves a firearm's accuracy.", - "weight": 120, + "weight": "120 g", "volume": "250 ml", "integral_volume": 0, "integral_weight": 0, @@ -23,7 +23,7 @@ "type": "GUNMOD", "name": "drop-in auto sear", "description": "This is a vaguely 'U' shaped piece of metal with a vaguely 'T' shaped flapper on a pin. Once tucked into an AR-15's lower receiver, the rifle will become selective fire-capable. The handcrafted-sear surface isn't as good as actual full-auto parts, so precision and reliability suffer slightly.", - "weight": 113, + "weight": "113 g", "volume": "250 ml", "integral_volume": 0, "integral_weight": 0, @@ -45,7 +45,7 @@ "type": "GUNMOD", "name": "lightning link", "description": "Originally designed for the Colt SP-1, this 'reproduction' is intended to convert an AR-15 into a full-auto only rifle. Once the necessary modifications are made and the link is in place, semi-auto is disabled and full-auto is enabled. Reliability and precision suffer greatly due to questionable craftsmanship and lack of unobtainium SP-1 parts.", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "integral_volume": 0, "price": 24000, @@ -69,7 +69,7 @@ "type": "GUNMOD", "name": "firearm waterproofing", "description": "A set of seals and gaskets that will allow a firearm to operate reliably while submerged in water.", - "weight": 220, + "weight": "220 g", "volume": "250 ml", "integral_volume": 0, "price": 50000, diff --git a/data/json/items/gunmod/mount.json b/data/json/items/gunmod/mount.json index 0f3cf6a6c46e4..a696327589556 100644 --- a/data/json/items/gunmod/mount.json +++ b/data/json/items/gunmod/mount.json @@ -4,7 +4,7 @@ "type": "GUNMOD", "name": "replaceable furniture kit", "description": "This is a kit consisting of various steel and plastic parts; when installed, it would permanently modify and partially replace some of the weapon's furniture so that it could be easily changed if needed. This allows installing any kind of more advanced grips or other furniture.", - "weight": 80, + "weight": "80 g", "volume": "50ml", "integral_volume": 0, "price": 6000, @@ -23,7 +23,7 @@ "type": "GUNMOD", "name": "side mount", "description": "This is a plastic mount for attaching a rail accessory, designed to be permanently installed onto almost any weapon, along with some fasteners. Ideal for bringing out your inner tacticool on older guns.", - "weight": 10, + "weight": "10 g", "volume": "8ml", "price": 6000, "material": [ "steel", "plastic" ], @@ -41,7 +41,7 @@ "type": "GUNMOD", "name": "sights mount", "description": "This is a plastic mount for attaching a sight, designed to be permanently installed onto almost any weapon other than launchers and pistols, along with some fasteners. Ideal for bringing out your inner tacticool on older guns.", - "weight": 10, + "weight": "10 g", "volume": "8ml", "price": 6000, "material": [ "steel", "plastic" ], @@ -59,7 +59,7 @@ "type": "GUNMOD", "name": "launcher sights mount", "description": "This is a plastic mount for attaching a sight, designed to be permanently installed onto almost any launcher, along with some fasteners. Ideal for bringing out your inner tacticool on rocket launchers.", - "weight": 60, + "weight": "60 g", "volume": "80ml", "price": 6000, "material": [ "steel", "plastic" ], @@ -77,7 +77,7 @@ "type": "GUNMOD", "name": "pistol sights mount", "description": "This is a plastic mount for attaching a sight, designed to be permanently installed onto almost any pistol, along with some fasteners. Ideal for bringing out your inner tacticool on pocket pistols.", - "weight": 60, + "weight": "60 g", "volume": "80ml", "price": 6000, "material": [ "steel", "plastic" ], @@ -95,7 +95,7 @@ "type": "GUNMOD", "name": "replaceable stock kit", "description": "This is a kit consisting of various steel parts; when installed, it would remove the weapon's original fixed stock, install a new stock mount on its place, modify original stock to fit it and then reattach it to the gun, or simply attach a stock mount if gun had no stock to start with. This allows easy installation of any kind of more advanced stocks.", - "weight": 80, + "weight": "80 g", "volume": "50ml", "integral_volume": 0, "price": 6000, @@ -114,7 +114,7 @@ "type": "GUNMOD", "name": "bottom mount", "description": "This is a plastic mount for attaching an underbarrel accessory, designed to be permanently installed onto almost any weapon, along with some fasteners. Ideal for bringing out your inner tacticool on older guns.", - "weight": 10, + "weight": "10 g", "volume": "8ml", "price": 6000, "material": [ "steel", "plastic" ], diff --git a/data/json/items/gunmod/muzzle.json b/data/json/items/gunmod/muzzle.json index ff011ece69d15..81946e1ef1a2c 100644 --- a/data/json/items/gunmod/muzzle.json +++ b/data/json/items/gunmod/muzzle.json @@ -4,7 +4,7 @@ "type": "GUNMOD", "name": "ported barrel", "description": "A ported barrel redirects exhaust gases to compensate for muzzle climb, improves recoil but increases noise and reduces accuracy slightly.", - "weight": 225, + "weight": "225 g", "integral_weight": 0, "volume": 0, "price": 72000, @@ -23,7 +23,7 @@ "type": "GUNMOD", "name": "muzzle brake", "description": "A muzzle brake redirects exhaust gases to compensate for muzzle climb, improving recoil but increasing bulk, noise, and reducing accuracy slightly.", - "weight": 380, + "weight": "380 g", "volume": "250 ml", "price": 84000, "material": [ "steel" ], @@ -41,7 +41,7 @@ "type": "GUNMOD", "name": "homemade suppressor", "description": "A homemade suppressor made from a pipe and improvised wipe media. For as long as the wipes hold up, it will reduce the amount of noise and muzzle flash generated by the report of a firearm. Gunfire is extremely loud and can damage your hearing without protection; a suppressor will bring the loudness of a report down to generally safe levels, as well as slightly reducing recoil and muzzle velocity. This simple suppressor is large and, when attached, will interfere with your ability to aim down the base sights of the gun.", - "weight": 880, + "weight": "880 g", "volume": "750 ml", "price": 480, "to_hit": 1, @@ -64,7 +64,7 @@ "type": "GUNMOD", "name": "'solvent trap' suppressor", "description": "This is an automotive filter crudely adapted to mate up with a firearm's barrel, generating an illegal, unregistered suppressor. Good thing there don't seem to be any ATF agents around to arrest you. While close in design to a real suppressor, it was not designed for high pressures involved and will eventually lose effectiveness. The installed filter is large and, when attached, will interfere with your ability to aim down the base sights of the gun.", - "weight": 880, + "weight": "880 g", "volume": "750 ml", "price": 480, "to_hit": 1, @@ -86,7 +86,7 @@ "type": "GUNMOD", "name": "soda bottle silencer", "description": "This is a 'silencer' made from a 2 liter soda bottle, some smaller bottles for baffles, and a generous length of duct tape. Gunfire is extremely loud and can damage your hearing without protection and you can be certain that this will not save your ears whatsoever. What it might do is allow you to get a shot or two off with a slightly quieter report. This simple suppressor is large and, when attached, will interfere with your ability to aim down the base sights of the gun.", - "weight": 202, + "weight": "202 g", "volume": "2 L", "price": 480, "material": [ "plastic" ], @@ -107,7 +107,7 @@ "type": "GUNMOD", "name": "RK6S34 suppressor", "description": "A suppressor reduces the amount of noise and muzzle flash generated by the report of a firearm. This RK6S34 Mustela is a rather advanced version integral to the RM11B rifle system.", - "weight": 0, + "weight": "0 g", "volume": 0, "price": 0, "material": [ "superalloy", "ceramic" ], @@ -122,7 +122,7 @@ "type": "GUNMOD", "name": "shotgun suppressor", "description": "A suppressor designed to work with shotguns. It's a lot more complex than a suppressor for a pistol or rifle.", - "weight": 600, + "weight": "600 g", "volume": "1 L", "price": 140000, "to_hit": 1, @@ -144,7 +144,7 @@ "type": "GUNMOD", "name": "suppressor", "description": "A suppressor reduces the amount of noise and muzzle flash generated by the report of a firearm. Gunfire is extremely loud and can damage your hearing without protection; a suppressor will bring the loudness of a report down to generally safe levels.", - "weight": 410, + "weight": "410 g", "volume": "500 ml", "price": 48000, "to_hit": 1, @@ -157,7 +157,8 @@ "install_time": "0 m", "handling_modifier": 2, "consume_divisor": 840, - "loudness_modifier": -50 + "loudness_modifier": -50, + "flags": [ "CONSUMABLE" ] }, { "id": "mp5sd_suppressor", @@ -166,7 +167,7 @@ "name": "mp5sd integral suppressor", "description": "The integrated suppressor for the mp5sd.", "damage_modifier": -7, - "weight": 250, + "weight": "250 g", "integral_volume": 0, "//": "weight is accounted for in gun item", "integral_weight": 0, @@ -181,7 +182,7 @@ "type": "GUNMOD", "name": "compact suppressor", "description": "A compact suppressor designed for pistols and best used with smaller calibers.", - "weight": 140, + "weight": "140 g", "volume": "250 ml", "price": 78000, "material": "steel", @@ -193,6 +194,7 @@ "consume_chance": 7000, "consume_divisor": 85, "handling_modifier": 1, - "loudness_modifier": -30 + "loudness_modifier": -30, + "flags": [ "CONSUMABLE" ] } ] diff --git a/data/json/items/gunmod/rail.json b/data/json/items/gunmod/rail.json index c5d61f2fd48f6..565a3bdf91463 100644 --- a/data/json/items/gunmod/rail.json +++ b/data/json/items/gunmod/rail.json @@ -4,7 +4,7 @@ "type": "GUNMOD", "name": "rail-mounted crossbow", "description": "A kit to attach a pair of crossbow arms and a firing rail to the barrel of a long firearm. It allows crossbow bolts to be fired.", - "weight": 1450, + "weight": "1450 g", "volume": "500 ml", "price": 50000, "material": [ "steel", "wood" ], @@ -43,7 +43,7 @@ "type": "GUNMOD", "name": "offset sight rail", "description": "An additional rail set at 45° for attaching a secondary optic.", - "weight": 40, + "weight": "40 g", "volume": "125ml", "price": 6000, "material": [ "steel" ], @@ -59,7 +59,7 @@ "type": "GUNMOD", "name": "rail laser sight", "description": "A small visible-light laser that mounts on a firearm's accessory rail to enhance ease and speed of target acquisition. Aside from increased weight, there are no drawbacks.", - "weight": 120, + "weight": "120 g", "volume": "250 ml", "integral_volume": 0, "price": 12000, @@ -77,7 +77,7 @@ "type": "GUNMOD", "name": "gyroscopic stabilizer", "description": "An advanced unit that straps onto the side of your firearm and reduces vibration, greatly reducing recoil and slightly increasing accuracy.", - "weight": 286, + "weight": "286 g", "volume": "750 ml", "integral_volume": "500 ml", "price": 68000, @@ -96,7 +96,7 @@ "type": "GUNMOD", "name": "LW gyroscopic stabilizer", "description": "An advanced Leadworks built in gyroscopic stabilizer.", - "weight": 0, + "weight": "0 g", "volume": 0, "price": 0, "flags": [ "IRREMOVABLE" ] diff --git a/data/json/items/gunmod/sights.json b/data/json/items/gunmod/sights.json index 167dc8830d226..63332c14007f4 100644 --- a/data/json/items/gunmod/sights.json +++ b/data/json/items/gunmod/sights.json @@ -4,7 +4,7 @@ "type": "GUNMOD", "name": "five pin bow sight", "description": "A set of adjustable optic fiber aiming pins with a bracket to mount on modern bows. Improves accuracy substantially, but takes a bit longer to line up.", - "weight": 120, + "weight": "120 g", "volume": "250 ml", "integral_volume": 0, "price": 5000, @@ -22,7 +22,7 @@ "type": "GUNMOD", "name": "single pin bow sight", "description": "A single aluminum pin with a bracket to mount on modern bows. Quick to use, but not very accurate.", - "weight": 80, + "weight": "80 g", "volume": "250 ml", "integral_volume": 0, "price": 3000, @@ -39,7 +39,7 @@ "type": "GUNMOD", "name": "bow scope", "description": "A single magnifying scope mounted on an adjustable bracket, with accompanying clarifier peep sight. Designed for extra long shots, but easily adjusted for short range. Spectacularly accurate.", - "weight": 180, + "weight": "180 g", "volume": "250 ml", "integral_volume": 0, "price": 20000, @@ -57,7 +57,7 @@ "type": "GUNMOD", "name": "holographic sight", "description": "Used extensively by military forces, it increases accuracy and weight. This is a step up from a red dot sight.", - "weight": 400, + "weight": "400 g", "volume": "250 ml", "price": 68000, "material": [ "plastic", "steel" ], @@ -76,7 +76,7 @@ "name": "iron sights", "name_plural": "iron sights", "description": "A basic set of iron sights", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "integral_volume": 0, "integral_weight": 0, @@ -96,7 +96,7 @@ "type": "GUNMOD", "name": "pistol scope", "description": "A small scope intended for use on a handgun. Increases weight but improves accuracy greatly.", - "weight": 212, + "weight": "212 g", "volume": "250 ml", "price": 54000, "material": [ "aluminum", "glass" ], @@ -114,7 +114,7 @@ "type": "GUNMOD", "name": "red dot sight", "description": "Adds a red dot optic to the top of your gun, replacing the iron sights. Increases accuracy and weight.", - "weight": 300, + "weight": "300 g", "volume": "250 ml", "integral_volume": 0, "price": 68000, @@ -133,7 +133,7 @@ "type": "GUNMOD", "name": "rifle scope", "description": "A long ranged rifle scope used by civilians and military alike, increases weight but improves accuracy greatly.", - "weight": 450, + "weight": "450 g", "volume": "500 ml", "price": 68000, "material": [ "aluminum", "glass" ], @@ -152,7 +152,7 @@ "type": "GUNMOD", "name": "ACOG scope", "description": "An Advanced Combat Optical Gunsight, a milspec medium magnification scope. Increases weight but improves accuracy significantly.", - "weight": 450, + "weight": "450 g", "volume": "500 ml", "price": 68000, "material": [ "aluminum", "glass" ], @@ -172,7 +172,7 @@ "type": "GUNMOD", "name": "RS1219 scope", "description": "An integral component of the RM11B rifle system, the RS1219 Accipiter digital scope provides auto-adjusting focal length, a user-selectable reticle, and an offset reflex sight for close objectives.", - "weight": 0, + "weight": "0 g", "volume": 0, "price": 0, "material": [ "superalloy", "ceramic" ], @@ -184,7 +184,7 @@ "type": "GUNMOD", "name": "telescopic sight", "description": "A simple telescopic sight, essentially a small telescope with crosshairs. Increases weight but improves accuracy.", - "weight": 300, + "weight": "300 g", "volume": "250 ml", "price": 30000, "material": [ "plastic", "steel", "glass" ], @@ -205,7 +205,7 @@ "type": "GUNMOD", "name": "telescopic pistol sight", "description": "A simple telescopic sight intended for use on a handgun. Increases weight but improves accuracy greatly.", - "weight": 220, + "weight": "220 g", "volume": "250 ml", "price": 27000, "material": [ "plastic", "steel", "glass" ], @@ -226,7 +226,7 @@ "type": "GUNMOD", "name": "LW red dot sight", "description": "Built in red-dot sight for the Leadworks weapon.", - "weight": 0, + "weight": "0 g", "volume": 0, "price": 0, "flags": [ "DISABLE_SIGHTS", "IRREMOVABLE" ] @@ -237,7 +237,7 @@ "type": "GUNMOD", "name": "LW rifle scope", "description": "Built in rifle scope for the Leadworks weapon.", - "weight": 0, + "weight": "0 g", "volume": 0, "price": 0, "flags": [ "DISABLE_SIGHTS", "ZOOM", "IRREMOVABLE" ] @@ -248,7 +248,7 @@ "type": "GUNMOD", "name": "LW ACOG scope", "description": "An Leadworks built in Advanced Combat Optical Gunsight, a milspec medium magnification scope. Improves accuracy significantly.", - "weight": 0, + "weight": "0 g", "volume": 0, "price": 0, "flags": [ "DISABLE_SIGHTS", "ZOOM", "IRREMOVABLE" ] @@ -259,7 +259,7 @@ "type": "GUNMOD", "name": "LW holographic sight", "description": "Leadworks built in holographic sight.", - "weight": 0, + "weight": "0 g", "price": 0, "flags": [ "DISABLE_SIGHTS", "IRREMOVABLE" ] } diff --git a/data/json/items/gunmod/sling.json b/data/json/items/gunmod/sling.json index fea50d8f8c2c6..1299bbc098c05 100644 --- a/data/json/items/gunmod/sling.json +++ b/data/json/items/gunmod/sling.json @@ -4,7 +4,7 @@ "type": "GUNMOD", "name": "shoulder strap", "description": "A shoulder strap allows the rifle to be worn over your shoulders like a piece of clothing. However, it offers no protection.", - "weight": 100, + "weight": "100 g", "volume": "250 ml", "integral_volume": 0, "price": 480, diff --git a/data/json/items/gunmod/stock.json b/data/json/items/gunmod/stock.json index f1070c7938bf9..1c68143a5c9b3 100644 --- a/data/json/items/gunmod/stock.json +++ b/data/json/items/gunmod/stock.json @@ -4,7 +4,7 @@ "type": "GUNMOD", "name": "adjustable stock", "description": "An adjustable replacement stock improving both recoil and accuracy.", - "weight": 350, + "weight": "350 g", "volume": "500 ml", "integral_volume": 0, "integral_weight": 0, @@ -24,7 +24,7 @@ "type": "GUNMOD", "name": "folding stock", "description": "A folding stock which reduces volume but needs unfolding before use. Increases the time needed to wield the weapon.", - "weight": 200, + "weight": "200 g", "volume": "500 ml", "integral_volume": 0, "integral_weight": 0, @@ -42,7 +42,7 @@ "type": "GUNMOD", "name": "folding wire stock", "description": "A folding wire stock which folds up very compactly but needs unfolding before use. It's somewhat wobbly but is better than nothing at all. Increases the time needed to wield the weapon.", - "weight": 170, + "weight": "170 g", "volume": "250 ml", "integral_volume": 0, "integral_weight": 0, @@ -61,7 +61,7 @@ "type": "GUNMOD", "name": "pistol stock", "description": "An add on stock for handguns considerably improving control of recoil.", - "weight": 350, + "weight": "350 g", "volume": "500 ml", "price": 38000, "material": [ "plastic", "steel" ], @@ -77,7 +77,7 @@ "type": "GUNMOD", "name": "recoil stock", "description": "A replacement stock designed to absorb perceived recoil.", - "weight": 960, + "weight": "960 g", "volume": "500 ml", "integral_volume": 0, "integral_weight": 0, @@ -97,7 +97,7 @@ "type": "GUNMOD", "name": "cheek pad", "description": "A stock accessory for sniper rifles and even DMRs considerably improving eye relief efficiency, prevents slipping, and reduces recoil to the neck and cheek.", - "weight": 300, + "weight": "300 g", "volume": "250 ml", "integral_volume": 0, "price": 4500, diff --git a/data/json/items/gunmod/underbarrel.json b/data/json/items/gunmod/underbarrel.json index 6d4ebe9901e33..e662e1cf9d7cf 100644 --- a/data/json/items/gunmod/underbarrel.json +++ b/data/json/items/gunmod/underbarrel.json @@ -4,7 +4,7 @@ "type": "GUNMOD", "name": "aux flamethrower", "description": "This custom-built miniature flamethrower is made to be attached to almost any sort of firearm, greatly expanding its lethality.", - "weight": 1820, + "weight": "1820 g", "volume": "1 L", "price": 85000, "material": [ "steel" ], @@ -24,7 +24,7 @@ "type": "GUNMOD", "name": "bipod", "description": "Bipods are commonly used on rifles and machine guns to provide a forward rest and reduce motion. Although they greatly improve handling of recoil they are usable only on certain surfaces and are slow to equip.", - "weight": 400, + "weight": "400 g", "volume": "500 ml", "price": 68000, "to_hit": -1, @@ -43,7 +43,7 @@ "type": "GUNMOD", "name": "combination gun shotgun", "description": "The integrated underbarrel shotgun of a combination gun which holds two shots. It's irremovable.", - "weight": 2600, + "weight": "2600 g", "volume": 0, "price": 95000, "to_hit": -1, @@ -61,7 +61,7 @@ "type": "GUNMOD", "name": "pipe combination gun shotgun", "description": "The integrated underbarrel shotgun of a pipe combination gun which holds two shots. It's irremovable.", - "weight": 1134, + "weight": "1134 g", "volume": "1 L", "price": 10000, "to_hit": -1, @@ -78,7 +78,7 @@ "type": "GUNMOD", "name": "forward grip", "description": "A grip placed forward on the barrel allows for greater control. Not as effective as a bipod but usable under all conditions.", - "weight": 113, + "weight": "113 g", "volume": "250 ml", "price": 6000, "material": [ "steel", "plastic" ], @@ -95,7 +95,7 @@ "type": "GUNMOD", "name": "integrated bayonet", "description": "This is the bayonet integrated in the firearm.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 4000, "to_hit": -1, @@ -115,7 +115,7 @@ "type": "GUNMOD", "name": "KSG second magazine", "description": "The integrated second shotgun magazine of the Kel-Tec KSG which holds 7 shots. It's irremovable.", - "weight": 1550, + "weight": "1550 g", "volume": "1750 ml", "price": 0, "material": [ "steel" ], @@ -139,7 +139,7 @@ "type": "GUNMOD", "name": "underbarrel laser sight", "description": "A visible-light laser that mounts under a firearm's barrel to enhance ease and speed of target acquisition. Aside from increased weight, there are no drawbacks.", - "weight": 120, + "weight": "120 g", "volume": "250 ml", "integral_volume": 0, "price": 10000, @@ -157,25 +157,25 @@ "id": "lemat_revolver_shotgun", "type": "GUNMOD", "name": "LeMat revolver shotgun", - "description": "The integrated underbarrel shotgun of a modified LeMat revolver which holds a single shot. It's irremovable.", - "weight": 500, - "volume": 0, - "price": 95000, + "description": "The Lemat revolver is unique in that its cylinder axis pin is also a fully functional 20ga percussion-primed smoothbore barrel. It's irremovable.", + "volume": "250 ml", + "integral_volume": 0, "material": [ "steel" ], "symbol": ":", "color": "light_red", "location": "underbarrel", "mod_targets": [ "pistol" ], "gun_data": { - "ammo": "shot", + "ammo": "shotpaper", "skill": "shotgun", "range": -2, - "ranged_damage": 2, + "ranged_damage": -12, "dispersion": 600, "durability": 10, + "reload": 150, "clip_size": 1 }, - "flags": [ "RELOAD_ONE", "IRREMOVABLE" ] + "flags": [ "RELOAD_ONE", "NO_UNLOAD", "IRREMOVABLE" ] }, { "id": "m203", @@ -183,7 +183,7 @@ "name": "M203", "name_plural": "M203", "description": "The M203 was originally designed for use with M16 variants but today can be attached to almost any rifle. It allows a single 40mm grenade to be loaded and fired.", - "weight": 1360, + "weight": "1360 g", "volume": "500 ml", "price": 65000, "material": [ "steel", "plastic" ], @@ -202,7 +202,7 @@ "name": "M320 GLM", "name_plural": "M320 GLM", "description": "The M320 Grenade Launcher Module offers the functionality of larger launchers in a very small package at the cost of decreased accuracy. It can be either attached to a rifle or combined with a buttstock for stand alone use.", - "weight": 1500, + "weight": "1500 g", "volume": "500 ml", "price": 84000, "material": "steel", @@ -235,7 +235,7 @@ "type": "GUNMOD", "name": "masterkey shotgun", "description": "A minimalist pump action shotgun, which can be mounted under the barrel of many rifles. It allows a total of four shotgun shells to be loaded and fired.", - "weight": 2600, + "weight": "2600 g", "volume": "500 ml", "price": 95000, "material": [ "steel" ], @@ -253,7 +253,7 @@ "type": "GUNMOD", "name": "40mm pipe launcher", "description": "This is a home built launcher tube that can be attached to almost any rifle. It allows a single 40mm grenade to be loaded and fired.", - "weight": 2080, + "weight": "2080 g", "volume": "750 ml", "price": 25000, "material": [ "steel", "plastic" ], @@ -270,7 +270,7 @@ "type": "GUNMOD", "name": "pistol bayonet", "description": "A pistol bayonet is a stabbing weapon that can be attached to the front of a handgun, allowing a melee attack to deal piercing damage.", - "weight": 122, + "weight": "122 g", "volume": "250 ml", "price": 4000, "to_hit": -4, @@ -290,7 +290,7 @@ "type": "GUNMOD", "name": "RM121 aux shotgun", "description": "The Rivtech RM121 auxiliary weapon system is a magazine-fed semi-automatic caseless shotgun, which can be mounted under the barrel of many rifles. Accepts RMSA10 box magazines.", - "weight": 1140, + "weight": "1140 g", "volume": "750 ml", "price": 120000, "material": [ "superalloy", "ceramic" ], @@ -310,7 +310,7 @@ "type": "GUNMOD", "name": "underslung shotgun", "description": "A short shotgun with 2 barrels, which can be mounted under the barrel of many rifles. It allows two shotgun shells to be loaded and fired.", - "weight": 1500, + "weight": "1500 g", "volume": "750 ml", "price": 65000, "material": [ "steel" ], @@ -329,7 +329,7 @@ "type": "GUNMOD", "name": "LW underbarrel laser sight", "description": "A Leadworks built in visible-light laser that mounts under a firearm's barrel to enhance ease and speed of target acquisition.", - "weight": 0, + "weight": "0 g", "volume": 0, "price": 0, "flags": [ "PUMP_RAIL_COMPATIBLE", "IRREMOVABLE" ] @@ -340,7 +340,7 @@ "type": "GUNMOD", "name": "LW forward grip", "description": "A Leadworks built in grip placed forward on the barrel allows for greater control.", - "weight": 0, + "weight": "0 g", "volume": 0, "price": 0, "flags": [ "PUMP_RAIL_COMPATIBLE", "IRREMOVABLE" ] @@ -351,7 +351,7 @@ "type": "GUNMOD", "name": "LW bipod", "description": "Leadworks built in bipod designed to provide a forward rest and reduce motion. Although it greatly improve handling of recoil it is usable only on certain surfaces and are slow to equip.", - "weight": 0, + "weight": "0 g", "volume": 0, "price": 0, "flags": [ "BIPOD", "SLOW_WIELD", "IRREMOVABLE" ] @@ -362,7 +362,7 @@ "type": "GUNMOD", "name": "LW underslung shotgun", "description": "Leadworks built in minimalist pump action shotgun module. It allows 4 shotgun shells to be loaded and fired.", - "weight": 0, + "weight": "0 g", "volume": 0, "price": 0, "dispersion_modifier": 0, @@ -375,7 +375,7 @@ "name": "LW GLM", "name_plural": "LW GLM", "description": "The Leadworks built in Grenade Launcher Module offers the functionality of larger launchers in a very small package.", - "weight": 0, + "weight": "0 g", "volume": 0, "price": 0, "dispersion_modifier": 0, diff --git a/data/json/items/handloaded_bullets.json b/data/json/items/handloaded_bullets.json index 5d337830cda3b..c03ba7b536d38 100644 --- a/data/json/items/handloaded_bullets.json +++ b/data/json/items/handloaded_bullets.json @@ -9,7 +9,7 @@ "description": "A prepared blunderbuss shot of a large hunk of metal. Better for distance.", "material": [ "paper", "powder" ], "volume": "100 ml", - "weight": 3, + "weight": "3 g", "bashing": 1, "ammo_type": "blunderbuss", "damage": 60, @@ -29,7 +29,7 @@ "description": "A prepared blunderbuss shot of a marbles, pebbles, bearings, basically whatever is at hand. The homemade pellet spread and number makes up for the shoddy quality.", "material": [ "paper", "powder" ], "volume": "100 ml", - "weight": 2, + "weight": "2 g", "bashing": 1, "ammo_type": "blunderbuss", "damage": 60, @@ -47,7 +47,7 @@ "description": "A prepared blunderbuss shot of homemade flechette made out of nails. Shreds armor.", "material": [ "plastic", "powder" ], "volume": "100 ml", - "weight": 3, + "weight": "3 g", "bashing": 1, "ammo_type": "blunderbuss", "damage": 53, diff --git a/data/json/items/magazine/12mm.json b/data/json/items/magazine/12mm.json index 9bf36d9d26e7a..a6008f2bb3aa8 100644 --- a/data/json/items/magazine/12mm.json +++ b/data/json/items/magazine/12mm.json @@ -4,7 +4,7 @@ "type": "MAGAZINE", "name": "H&K G80 magazine", "description": "A magazine for H&K G80 Railgun which can hold up to 20 ferromagnetic projectiles.", - "weight": 168, + "weight": "168 g", "volume": "250 ml", "price": 8000, "material": "steel", diff --git a/data/json/items/magazine/20x60mm.json b/data/json/items/magazine/20x60mm.json index 1c0a99d359b2c..b5501a4fa5f92 100644 --- a/data/json/items/magazine/20x60mm.json +++ b/data/json/items/magazine/20x60mm.json @@ -4,7 +4,7 @@ "type": "MAGAZINE", "name": "RMSA10 20x66mm compact magazine", "description": "A 10 round box magazine for use with the RM228 PDW and RM121 auxiliary shotgun.", - "weight": 210, + "weight": "210 g", "volume": "250 ml", "price": 40000, "material": [ "superalloy", "plastic" ], @@ -21,7 +21,7 @@ "type": "MAGAZINE", "name": "RMSB20 20x66mm magazine", "description": "A 20 round box magazine for use with the RM20 caseless shotgun.", - "weight": 280, + "weight": "280 g", "volume": "500 ml", "price": 40000, "material": [ "superalloy", "plastic" ], @@ -38,7 +38,7 @@ "type": "MAGAZINE", "name": "RMSB40 20x66mm extended magazine", "description": "A 40 round box magazine for use with the RM20 caseless shotgun.", - "weight": 280, + "weight": "280 g", "volume": "750 ml", "price": 60000, "material": [ "superalloy", "plastic" ], diff --git a/data/json/items/magazine/22.json b/data/json/items/magazine/22.json index f0ed5211cc042..d6e5635fa15a3 100644 --- a/data/json/items/magazine/22.json +++ b/data/json/items/magazine/22.json @@ -4,7 +4,7 @@ "type": "MAGAZINE", "name": ".22 8-round speedloader", "description": "This speedloader can hold 8 rounds of .22 and quickly reload a compatible revolver.", - "weight": 64, + "weight": "64 g", "volume": "250 ml", "price": 600, "material": "steel", @@ -19,7 +19,7 @@ "type": "MAGAZINE", "name": "RMRB200 .22 magazine", "description": "A 200 round box magazine for use with the RM360 rotary carbine.", - "weight": 360, + "weight": "360 g", "volume": "500 ml", "price": 20000, "material": [ "superalloy", "plastic" ], @@ -36,7 +36,7 @@ "type": "MAGAZINE", "name": "RMRD400 .22 drum magazine", "description": "A 400 round drum magazine for use with the RM360 rotary carbine.", - "weight": 440, + "weight": "440 g", "volume": "750 ml", "price": 30000, "material": [ "superalloy", "plastic" ], @@ -53,7 +53,7 @@ "type": "MAGAZINE", "name": "A-180 magazine", "description": "An unusually shaped pan magazine for the American-180.", - "weight": 760, + "weight": "760 g", "volume": "500 ml", "price": 7300, "material": "steel", @@ -70,7 +70,7 @@ "type": "MAGAZINE", "name": ".22 19-round tube loader", "description": "This is a tube which holds 19 rounds of .22, designed for quick reloading of a compatible rifle with tubular magazine.", - "weight": 180, + "weight": "180 g", "volume": "250 ml", "price": 1200, "material": "steel", @@ -85,7 +85,7 @@ "type": "MAGAZINE", "name": "SIG Mosquito magazine", "description": "A factory specification 10-round magazine for the SIG Mosquito.", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "price": 1700, "material": "steel", @@ -101,7 +101,7 @@ "type": "MAGAZINE", "name": "Ruger BX-25 magazine", "description": "Extended 25-round stick magazine for the Ruger 10/22.", - "weight": 180, + "weight": "180 g", "volume": "500 ml", "price": 7900, "material": "steel", @@ -117,7 +117,7 @@ "type": "MAGAZINE", "name": "Ruger 10/22 rotary magazine", "description": "Removable 10-round rotary magazine for the Ruger 10/22 which allows the magazine to fit flush with the bottom of the stock.", - "weight": 80, + "weight": "80 g", "volume": "250 ml", "price": 1400, "material": "steel", @@ -134,7 +134,7 @@ "type": "MAGAZINE", "name": "S&W 22A magazine", "description": "A standard capacity magazine for the popular S&W 22A pistol.", - "weight": 70, + "weight": "70 g", "volume": "250 ml", "price": 2100, "material": "steel", @@ -150,7 +150,7 @@ "type": "MAGAZINE", "name": "Jennings J-22 magazine", "description": "A cheap 6-round steel box magazine for the Jennings J-22.", - "weight": 55, + "weight": "55 g", "volume": "27ml", "price": 2800, "material": "steel", @@ -166,7 +166,7 @@ "type": "MAGAZINE", "name": "Walther P22 magazine", "description": "A 10-round box magazine for the Walther P22.", - "weight": 25, + "weight": "25 g", "volume": "126 ml", "price": 3250, "material": "steel", diff --git a/data/json/items/magazine/223.json b/data/json/items/magazine/223.json index 2e89fa9df023c..0258d548e8d0e 100644 --- a/data/json/items/magazine/223.json +++ b/data/json/items/magazine/223.json @@ -4,7 +4,7 @@ "type": "MAGAZINE", "name": "LW-5 speedloader", "description": "This speedloader, made by Leadworks for use with L2037 Backup revolver, can hold 5 rounds of .223 and quickly reload a compatible revolver.", - "weight": 116, + "weight": "116 g", "volume": "250 ml", "price": 3200, "material": "plastic", @@ -30,7 +30,7 @@ "type": "MAGAZINE", "name": "LW-56 magazine", "description": "A 56-round polymer magazine for Leadworks LLC 223 firearms. It's compact design makes it surprisingly easy to store. Lightweight and reliable but somewhat more difficult to reload.", - "weight": 340, + "weight": "340 g", "volume": "750 ml", "price": 14200, "material": "plastic", @@ -47,7 +47,7 @@ "type": "MAGAZINE", "name": "LW-32 magazine", "description": "A 32-round polymer magazine for Leadworks LLC 223 firearms. Lightweight and reliable but somewhat more difficult to reload.", - "weight": 190, + "weight": "190 g", "volume": "500 ml", "price": 10200, "material": "plastic", @@ -64,7 +64,7 @@ "type": "MAGAZINE", "name": "Ruger .223 5-round magazine", "description": "A compact 5-round magazine used with the Ruger Mini-14 rifle.", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "price": 4000, "material": "steel", @@ -81,7 +81,7 @@ "type": "MAGAZINE", "name": "Ruger .223 10-round magazine", "description": "A compact 10-round magazine used with the Ruger Mini-14 rifle.", - "weight": 100, + "weight": "100 g", "volume": "250 ml", "price": 5000, "material": "steel", @@ -97,7 +97,7 @@ "type": "MAGAZINE", "name": "Ruger .223 high-capacity magazine", "description": "A high capacity magazine for use with the Ruger Mini-14 rifle.", - "weight": 360, + "weight": "360 g", "volume": "500 ml", "price": 8000, "material": "steel", @@ -113,7 +113,7 @@ "type": "MAGAZINE", "name": "STANAG magazine", "description": "A standard capacity magazine for use with STANAG compatible rifles.", - "weight": 360, + "weight": "360 g", "volume": "500 ml", "price": 8000, "material": "steel", @@ -129,7 +129,7 @@ "type": "MAGAZINE", "name": "STANAG drum magazine", "description": "A 50-round magazine with a bulky green drum for use with STANAG compatible rifles.", - "weight": 600, + "weight": "600 g", "volume": "1 L", "price": 9000, "to_hit": -2, @@ -148,7 +148,7 @@ "type": "MAGAZINE", "name": "makeshift .223 magazine", "description": "An improvised magazine consisting of little more than a bent sheet of rusted metal held together by duct tape and hope.", - "weight": 80, + "weight": "80 g", "volume": "250 ml", "price": 1200, "material": "steel", diff --git a/data/json/items/magazine/300.json b/data/json/items/magazine/300.json index 1ff0d42d69b65..13116feae1bc9 100644 --- a/data/json/items/magazine/300.json +++ b/data/json/items/magazine/300.json @@ -4,7 +4,7 @@ "type": "MAGAZINE", "name": "M2010 ESR magazine", "description": "A 5-round box magazine used by M2010 ESR sniper rifle.", - "weight": 78, + "weight": "78 g", "volume": "250 ml", "price": 3500, "material": "steel", diff --git a/data/json/items/magazine/3006.json b/data/json/items/magazine/3006.json index f105448e1fe40..946c1577acb29 100644 --- a/data/json/items/magazine/3006.json +++ b/data/json/items/magazine/3006.json @@ -5,7 +5,7 @@ "name": "rifle clip - .30-06", "//": "Provisional.", "description": "A tiny piece of grooved metal designed to allow a shooter to quickly load a bolt-action rifle.", - "weight": 40, + "weight": "40 g", "volume": "50ml", "price": 500, "material": "steel", @@ -20,7 +20,7 @@ "type": "MAGAZINE", "name": "Browning BLR magazine", "description": "A compact 4-round box magazine for the Browning BLR.", - "weight": 40, + "weight": "40 g", "volume": "250 ml", "price": 5600, "material": "steel", @@ -36,7 +36,7 @@ "type": "MAGAZINE", "name": "M1 Garand Clip", "description": "A light-weight en-bloc clip for use with the M1 Garand that will be ejected after the last round is fired.", - "weight": 30, + "weight": "30 g", "volume": "250 ml", "price": 600, "material": "steel", @@ -53,7 +53,7 @@ "type": "MAGAZINE", "name": "BAR extended magazine", "description": "An aftermarket magazine for use with the Browning Automatic Rifle, holds 30 rounds.", - "weight": 300, + "weight": "300 g", "volume": "750 ml", "price": 8500, "material": "steel", @@ -71,7 +71,7 @@ "name": "BAR magazine", "//": "Compatable magazines made for reproductions exist, and the standard-capacity mags are fairly cheap compared to variants.", "description": "A standard capacity magazine for use with the Browning Automatic Rifle, holds 20 rounds.", - "weight": 200, + "weight": "200 g", "volume": "500 ml", "price": 3600, "material": "steel", diff --git a/data/json/items/magazine/308.json b/data/json/items/magazine/308.json index c073105a68cf5..00f371e13def4 100644 --- a/data/json/items/magazine/308.json +++ b/data/json/items/magazine/308.json @@ -15,7 +15,7 @@ "type": "MAGAZINE", "name": "FN FAL extended magazine", "description": "An extended 30-round steel box magazine for the FN FAL rifle.", - "weight": 360, + "weight": "360 g", "volume": "750 ml", "price": 2100, "material": "steel", @@ -32,7 +32,7 @@ "type": "MAGAZINE", "name": "FN FAL magazine", "description": "A military issue 20-round steel box magazine for the FN FAL rifle.", - "weight": 240, + "weight": "240 g", "volume": "500 ml", "price": 1200, "material": "steel", @@ -49,7 +49,7 @@ "type": "MAGAZINE", "name": "H&K G3 drum magazine", "description": "An 50-round drum magazine for the H&K G3 rifle.", - "weight": 650, + "weight": "650 g", "volume": "1 L", "price": 7900, "material": "steel", @@ -67,7 +67,7 @@ "type": "MAGAZINE", "name": "H&K G3 magazine", "description": "A lightweight aluminum box magazine for the H&K G3 rifle.", - "weight": 120, + "weight": "120 g", "volume": "500 ml", "price": 1200, "material": "aluminum", @@ -84,7 +84,7 @@ "type": "MAGAZINE", "name": "M14 magazine", "description": "A military issue 20-round steel box magazine compatible with M14 pattern rifles.", - "weight": 280, + "weight": "280 g", "volume": "500 ml", "price": 1700, "material": "steel", @@ -101,7 +101,7 @@ "type": "MAGAZINE", "name": "M14 compact magazine", "description": "An compact aftermarket 5-round steel box magazine compatible with M14 pattern rifles. Although it has a low capacity it is easy to store and quick to reload.", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "price": 2900, "material": "steel", @@ -119,7 +119,7 @@ "type": "MAGAZINE", "name": "FN SCAR-H drum magazine", "description": "An 50-round drum magazine for the FN SCAR-H rifle.", - "weight": 400, + "weight": "400 g", "volume": "1 L", "price": 8900, "material": "steel", @@ -137,7 +137,7 @@ "type": "MAGAZINE", "name": "FN SCAR-H magazine", "description": "A military issue 20-round steel box magazine for the FN SCAR-H rifle.", - "weight": 300, + "weight": "300 g", "volume": "500 ml", "price": 5600, "material": "steel", @@ -154,7 +154,7 @@ "type": "MAGAZINE", "name": "HK417 magazine", "description": "A 20 round double stack box magazine for the HK417 rifle.", - "weight": 160, + "weight": "160 g", "volume": "500 ml", "price": 5600, "material": "steel", @@ -171,7 +171,7 @@ "type": "MAGAZINE", "name": "HK417 compact magazine", "description": "A 10 round double stack box magazine for the HK417 rifle.", - "weight": 110, + "weight": "110 g", "volume": "250 ml", "price": 5000, "material": "steel", @@ -188,7 +188,7 @@ "type": "MAGAZINE", "name": "AR-10 magazine", "description": "A 20 round double stack box magazine for the AR-10 rifle.", - "weight": 300, + "weight": "300 g", "volume": "500 ml", "price": 3000, "material": "steel", diff --git a/data/json/items/magazine/32.json b/data/json/items/magazine/32.json index 97ffa3ccb8381..1929717362c34 100644 --- a/data/json/items/magazine/32.json +++ b/data/json/items/magazine/32.json @@ -4,7 +4,7 @@ "type": "MAGAZINE", "name": "Walther PPK magazine", "description": "A standard 8-round steel box magazine for the Walther PPK.", - "weight": 80, + "weight": "80 g", "volume": "250 ml", "price": 2600, "material": "steel", @@ -20,7 +20,7 @@ "type": "MAGAZINE", "name": "SIG P230 magazine", "description": "A factory specification 8-round magazine for the SIG Sauer P230.", - "weight": 70, + "weight": "70 g", "volume": "250 ml", "price": 1900, "material": "steel", @@ -36,7 +36,7 @@ "type": "MAGAZINE", "name": "Skorpion Vz. 61 magazine", "description": "A standard 20-round magazine for the Skorpion Vz. 61, in .32 ACP.", - "weight": 120, + "weight": "120 g", "volume": "250 ml", "price": 2300, "material": "steel", @@ -52,7 +52,7 @@ "type": "MAGAZINE", "name": "Kel-Tec P32 magazine", "description": "A standard 7-round steel box magazine for the Kel-Tec P32.", - "weight": 65, + "weight": "65 g", "volume": "47ml", "price": 2600, "material": "steel", diff --git a/data/json/items/magazine/357sig.json b/data/json/items/magazine/357sig.json index 75886b20126bb..f6299b8b751d4 100644 --- a/data/json/items/magazine/357sig.json +++ b/data/json/items/magazine/357sig.json @@ -4,7 +4,7 @@ "type": "MAGAZINE", "name": "P226 magazine .357 SIG", "description": "A 15 round double stack box magazine for a SIG P226 chambered for .357 SIG rounds.", - "weight": 150, + "weight": "150 g", "volume": "250 ml", "price": 3000, "material": "steel", @@ -20,7 +20,7 @@ "type": "MAGAZINE", "name": "P320 magazine .357 SIG", "description": "A 14 round double stack box magazine for the SIG Sauer P320.", - "weight": 105, + "weight": "105 g", "volume": "250 ml", "price": 2900, "material": "plastic", diff --git a/data/json/items/magazine/38.json b/data/json/items/magazine/38.json index ca7ba0bd1281b..d69500f3231d6 100644 --- a/data/json/items/magazine/38.json +++ b/data/json/items/magazine/38.json @@ -4,7 +4,7 @@ "type": "MAGAZINE", "name": "Taurus .38 magazine", "description": "A compact steel box magazine for use with the Taurus Pro .38 pistol.", - "weight": 80, + "weight": "80 g", "volume": "250 ml", "price": 3400, "material": "steel", @@ -20,7 +20,7 @@ "type": "MAGAZINE", "name": ".38/.357 7-round speedloader", "description": "This speedloader can hold 7 rounds of .357 Magnum or .38 Special and quickly reload a compatible revolver.", - "weight": 80, + "weight": "80 g", "volume": "250 ml", "price": 1000, "material": "steel", @@ -35,7 +35,7 @@ "type": "MAGAZINE", "name": ".38/.357 5-round speedloader", "description": "This speedloader can hold 5 rounds of .357 Magnum or .38 Special and quickly reload a compatible revolver.", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "price": 800, "material": "steel", diff --git a/data/json/items/magazine/380.json b/data/json/items/magazine/380.json index c014a016840e7..7fa647be06f2e 100644 --- a/data/json/items/magazine/380.json +++ b/data/json/items/magazine/380.json @@ -4,7 +4,7 @@ "type": "MAGAZINE", "name": "Kel-Tec P3AT magazine", "description": "A standard 6-round steel box magazine for the Kel-Tec P3AT.", - "weight": 60, + "weight": "60 g", "volume": "50ml", "price": 1900, "material": "steel", @@ -20,7 +20,7 @@ "type": "MAGAZINE", "name": "FN 1910 magazine", "description": "A standard 6-round steel box magazine for the FN 1910. It looks a bit old.", - "weight": 80, + "weight": "80 g", "volume": "60ml", "price": 3500, "material": "steel", @@ -36,7 +36,7 @@ "type": "MAGAZINE", "name": "Ruger LCP magazine", "description": "A standard 6-round capacity magazine for the Ruger LCP pistol.", - "weight": 65, + "weight": "65 g", "volume": "60ml", "price": 2200, "material": "steel", @@ -52,7 +52,7 @@ "type": "MAGAZINE", "name": "MAC-11 magazine", "description": "A cheap 32-round steel box magazine for use with the MAC-11 SMG.", - "weight": 200, + "weight": "200 g", "volume": "737ml", "price": 4500, "material": "steel", @@ -68,7 +68,7 @@ "type": "MAGAZINE", "name": "CF-380 magazine", "description": "An 8-round steel box magazine for use with the Hi-Point CF-380.", - "weight": 110, + "weight": "110 g", "volume": "236 ml", "price": 2500, "material": "steel", @@ -84,7 +84,7 @@ "type": "MAGAZINE", "name": "CF-380 magazine", "description": "A 10-round steel box magazine for use with the Hi-Point CF-380.", - "weight": 110, + "weight": "110 g", "volume": "236 ml", "price": 2500, "material": "steel", diff --git a/data/json/items/magazine/38super.json b/data/json/items/magazine/38super.json index 4aad6b8e82435..2de2d7f4bd04d 100644 --- a/data/json/items/magazine/38super.json +++ b/data/json/items/magazine/38super.json @@ -4,7 +4,7 @@ "type": "MAGAZINE", "name": "M1911 .38 Super magazine", "description": "A compact single stack box magazine for the M1911.", - "weight": 80, + "weight": "80 g", "volume": "250 ml", "price": 3400, "material": "steel", diff --git a/data/json/items/magazine/40.json b/data/json/items/magazine/40.json index 881a07b656008..4f3637ffc5670 100644 --- a/data/json/items/magazine/40.json +++ b/data/json/items/magazine/40.json @@ -4,7 +4,7 @@ "type": "MAGAZINE", "name": ".40 6-round speedloader", "description": "This speedloader can hold 6 rounds of .40 S&W or 10mm Auto and quickly reload a compatible revolver.", - "weight": 92, + "weight": "92 g", "volume": "250 ml", "price": 1500, "material": "steel", @@ -19,7 +19,7 @@ "type": "MAGAZINE", "name": "Glock 22 extended magazine", "description": "An extended 22-round magazine for use with Glock pistols chambered for .40 S&W or .357 SIG.", - "weight": 200, + "weight": "200 g", "volume": "500 ml", "price": 5900, "material": "plastic", @@ -36,7 +36,7 @@ "type": "MAGAZINE", "name": "Glock 22 magazine", "description": "A compact light-weight polymer magazine for use with Glock pistols chambered for .40 S&W or .357 SIG.", - "weight": 125, + "weight": "125 g", "volume": "250 ml", "price": 3200, "material": "plastic", @@ -52,7 +52,7 @@ "type": "MAGAZINE", "name": "SIG Pro .40 magazine", "description": "A compact and reliable magazine for use with the SIG Pro .40 pistol.", - "weight": 90, + "weight": "90 g", "volume": "250 ml", "price": 3900, "material": "plastic", @@ -68,7 +68,7 @@ "type": "MAGAZINE", "name": "makeshift .40 20-round magazine", "description": "An improvised magazine that is mostly compatible with a homemade 'Luty' submachinegun, with a simplified feed system. It looks like it might feed 20 rounds of .40S&W.", - "weight": 300, + "weight": "300 g", "volume": "750 ml", "price": 4000, "material": "steel", @@ -85,7 +85,7 @@ "type": "MAGAZINE", "name": "Hi-Power magazine .40 S&W", "description": "A 10 round steel box magazine for the Browning Hi-Power .40 S&W.", - "weight": 120, + "weight": "120 g", "volume": "185 ml", "price": 4000, "material": "steel", @@ -101,7 +101,7 @@ "type": "MAGAZINE", "name": "PPQ magazine .40 S&W", "description": "A 10 round steel box magazine for the Walther PPQ .40 S&W.", - "weight": 80, + "weight": "80 g", "volume": "200 ml", "price": 4000, "material": "steel", @@ -117,7 +117,7 @@ "type": "MAGAZINE", "name": "PPQ magazine .40 S&W", "description": "A 12 round steel box magazine for the Walther PPQ .40 S&W.", - "weight": 80, + "weight": "80 g", "volume": "200 ml", "price": 4400, "material": "steel", @@ -133,7 +133,7 @@ "type": "MAGAZINE", "name": "PPQ magazine .40 S&W", "description": "A 14 round steel box magazine for the Walther PPQ .40 S&W.", - "weight": 80, + "weight": "80 g", "volume": "200 ml", "price": 4800, "material": "steel", @@ -149,7 +149,7 @@ "type": "MAGAZINE", "name": "Model JCP magazine", "description": "A 10-round steel box magazine for use with the Hi-Point Model JCP.", - "weight": 110, + "weight": "110 g", "volume": "312 ml", "price": 2500, "material": "steel", diff --git a/data/json/items/magazine/410shot.json b/data/json/items/magazine/410shot.json index 4afbc5f23d8a4..a2330598a08c3 100644 --- a/data/json/items/magazine/410shot.json +++ b/data/json/items/magazine/410shot.json @@ -4,7 +4,7 @@ "type": "MAGAZINE", "name": "Saiga-410 box magazine", "description": "A removable plastic box magazine for the Saiga-410 shotgun. Holds 10 shells.", - "weight": 210, + "weight": "210 g", "volume": "500 ml", "price": 4500, "material": "plastic", @@ -20,7 +20,7 @@ "type": "MAGAZINE", "name": "Saiga-410 drum magazine", "description": "A removable plastic drum magazine for the Saiga-410 shotgun. Holds 30 shells.", - "weight": 460, + "weight": "460 g", "volume": "1 L", "price": 11000, "material": "plastic", diff --git a/data/json/items/magazine/44.json b/data/json/items/magazine/44.json index 759355137d005..b71620238a90d 100644 --- a/data/json/items/magazine/44.json +++ b/data/json/items/magazine/44.json @@ -4,7 +4,7 @@ "type": "MAGAZINE", "name": ".44 6-round speedloader", "description": "This speedloader can hold 6 rounds of .44 and quickly reload a compatible revolver.", - "weight": 98, + "weight": "98 g", "volume": "250 ml", "price": 1600, "material": "steel", @@ -19,7 +19,7 @@ "type": "MAGAZINE", "name": "Desert Eagle magazine", "description": "A standard 7-round steel box magazine for use with the IMI Desert Eagle.", - "weight": 90, + "weight": "90 g", "volume": "250 ml", "price": 6750, "material": "steel", diff --git a/data/json/items/magazine/45.json b/data/json/items/magazine/45.json index 80499629d9bb3..a1f5921704334 100644 --- a/data/json/items/magazine/45.json +++ b/data/json/items/magazine/45.json @@ -4,7 +4,7 @@ "type": "MAGAZINE", "name": "M1911 extended magazine", "description": "An extended 10-round magazine for use with the M1911 handgun.", - "weight": 100, + "weight": "100 g", "volume": "500 ml", "price": 3720, "material": "steel", @@ -20,7 +20,7 @@ "type": "MAGAZINE", "name": "M1911 magazine", "description": "A military issue 7-round magazine for use with the M1911 handgun.", - "weight": 70, + "weight": "70 g", "volume": "250 ml", "price": 2980, "material": "steel", @@ -36,7 +36,7 @@ "type": "MAGAZINE", "name": "MAC-10 magazine", "description": "A cheap 30-round steel box magazine for use with the MAC-10 SMG.", - "weight": 210, + "weight": "210 g", "volume": "500 ml", "price": 1800, "material": "steel", @@ -52,7 +52,7 @@ "type": "MAGAZINE", "name": "makeshift .45 20-round magazine", "description": "An improvised magazine that is mostly compatible with a homemade 'Luty' submachinegun, with a simplified feed system. It looks like it might feed 20 rounds of .45 ACP.", - "weight": 300, + "weight": "300 g", "volume": "750 ml", "price": 4000, "material": "steel", @@ -69,7 +69,7 @@ "type": "MAGAZINE", "name": "TDI Vector magazine", "description": "A 30-round steel box magazine for use with the TDI Vector", - "weight": 210, + "weight": "210 g", "volume": "500 ml", "price": 1800, "material": "steel", @@ -85,7 +85,7 @@ "type": "MAGAZINE", "name": "Thompson extended magazine", "description": "An extended 30-round magazine for the Thompson submachine gun.", - "weight": 255, + "weight": "255 g", "volume": "750 ml", "price": 4000, "material": "steel", @@ -102,7 +102,7 @@ "type": "MAGAZINE", "name": "Thompson drum magazine", "description": "A 50-round drum magazine for the Thompson submachine gun. Made famous by gangsters, but the military preferred standard 20 and 30-round magazines due to greater reliability.", - "weight": 500, + "weight": "500 g", "volume": "1 L", "price": 8000, "material": "steel", @@ -119,7 +119,7 @@ "type": "MAGAZINE", "name": "Thompson magazine", "description": "A standard 20-round magazine for the Thompson submachine gun.", - "weight": 170, + "weight": "170 g", "volume": "500 ml", "price": 3000, "material": "steel", @@ -135,7 +135,7 @@ "type": "MAGAZINE", "name": "UMP45 magazine", "description": "A standard 25-round box magazine for use with the H&K UMP45 SMG.", - "weight": 200, + "weight": "200 g", "volume": "500 ml", "price": 4950, "material": "steel", @@ -151,7 +151,7 @@ "type": "MAGAZINE", "name": "USP .45 magazine", "description": "A standard capacity magazine for use with the H&K USP handgun.", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "price": 5900, "material": "plastic", @@ -167,7 +167,7 @@ "type": "MAGAZINE", "name": "PPQ magazine .45 ACP", "description": "A 12 round steel box magazine for the Walther PPQ .45 ACP.", - "weight": 80, + "weight": "80 g", "volume": "240 ml", "price": 5000, "material": "steel", @@ -183,7 +183,7 @@ "type": "MAGAZINE", "name": "Model JHP magazine", "description": "A 9-round steel box magazine for use with the Hi-Point Model JHP.", - "weight": 110, + "weight": "110 g", "volume": "353 ml", "price": 2500, "material": "steel", diff --git a/data/json/items/magazine/454.json b/data/json/items/magazine/454.json index f8b66dd9fcb67..6464ba7dae9ce 100644 --- a/data/json/items/magazine/454.json +++ b/data/json/items/magazine/454.json @@ -3,14 +3,14 @@ "id": "454_speedloader5", "type": "MAGAZINE", "name": ".454 5-round speedloader", - "description": "This speedloader can hold 5 rounds of .454 and quickly reload a compatible revolver.", - "weight": 108, + "description": "This speedloader can hold 5 rounds of .454 or .45 Colt and quickly reload a compatible revolver.", + "weight": "108 g", "volume": "250 ml", "price": 2200, "material": "steel", "symbol": "#", "color": "light_gray", - "ammo_type": "454", + "ammo_type": [ "454", "45colt" ], "capacity": 5, "flags": [ "SPEEDLOADER" ] } diff --git a/data/json/items/magazine/46.json b/data/json/items/magazine/46.json index e14a3b53c1be4..44b6672d242d1 100644 --- a/data/json/items/magazine/46.json +++ b/data/json/items/magazine/46.json @@ -4,7 +4,7 @@ "type": "MAGAZINE", "name": "H&K 4.6mm extended magazine", "description": "An extended 40-round magazine for use with H&K's proprietary 4.6x30mm round.", - "weight": 240, + "weight": "240 g", "volume": "500 ml", "price": 6300, "material": "steel", @@ -20,7 +20,7 @@ "type": "MAGAZINE", "name": "H&K 4.6mm magazine", "description": "A standard capacity 20-round magazine for use with H&K's proprietary 4.6x30mm round.", - "weight": 120, + "weight": "120 g", "volume": "250 ml", "price": 4700, "material": "steel", diff --git a/data/json/items/magazine/460.json b/data/json/items/magazine/460.json index 46f5ae4042201..395790879fc6e 100644 --- a/data/json/items/magazine/460.json +++ b/data/json/items/magazine/460.json @@ -4,7 +4,7 @@ "type": "MAGAZINE", "name": ".460 6-round speedloader", "description": "This speedloader, made by Leadworks for use with L2031 Enforcer revolver, can hold 6 rounds of .460 or .45 and quickly reload a compatible revolver.", - "weight": 86, + "weight": "86 g", "volume": "250 ml", "price": 3200, "material": "plastic", @@ -19,7 +19,7 @@ "type": "MAGAZINE", "name": "LW-12 magazine", "description": "A 12-round polymer magazine for use with the Leadworks LLC L39-460 and L39B-45 pistols.", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "price": 5800, "material": "plastic", diff --git a/data/json/items/magazine/50.json b/data/json/items/magazine/50.json index 1bd014219e628..98611b7a66163 100644 --- a/data/json/items/magazine/50.json +++ b/data/json/items/magazine/50.json @@ -15,7 +15,7 @@ "name": "Barrett magazine", "//": "Fully loaded 10 magazine, presumably loaded with the 114.7 gram M33 Ball cartridge, weighs 1868.801 grams. Source inetres.com", "description": "Standard 10-round box magazine for a Barrett M107A1 anti-materiel rifle.", - "weight": 727, + "weight": "727 g", "volume": "500 ml", "price": 10000, "material": "steel", diff --git a/data/json/items/magazine/500.json b/data/json/items/magazine/500.json index 6bdfadd733679..9d934b0284808 100644 --- a/data/json/items/magazine/500.json +++ b/data/json/items/magazine/500.json @@ -4,7 +4,7 @@ "type": "MAGAZINE", "name": ".500 5-round speedloader", "description": "This speedloader can hold 5 rounds of .500 and quickly reload a compatible revolver.", - "weight": 118, + "weight": "118 g", "volume": "250 ml", "price": 2500, "material": "steel", diff --git a/data/json/items/magazine/545x39.json b/data/json/items/magazine/545x39.json index 7cf39bdac93eb..55d4f5485b2c7 100644 --- a/data/json/items/magazine/545x39.json +++ b/data/json/items/magazine/545x39.json @@ -4,7 +4,7 @@ "type": "MAGAZINE", "name": "AK-74M magazine", "description": "A standard magazine made for the AK-74M rifle, made of steel-reinforced polymer. Holds 30 rounds.", - "weight": 230, + "weight": "230 g", "volume": "500 ml", "price": 1500, "material": [ "steel", "plastic" ], @@ -21,7 +21,7 @@ "name": "AK-74M extended magazine", "//": "Technically it's meant for the RPK-74, but can always rename if we add an RPK.", "description": "A 45-round magazine compatible with the AK-74M rifle, though originally designed for the RPK-74 light machine gun.", - "weight": 300, + "weight": "300 g", "volume": "750 ml", "price": 8500, "material": "plastic", diff --git a/data/json/items/magazine/57.json b/data/json/items/magazine/57.json index bce5b54482051..acf1c26553dc7 100644 --- a/data/json/items/magazine/57.json +++ b/data/json/items/magazine/57.json @@ -4,7 +4,7 @@ "type": "MAGAZINE", "name": "FN-57 magazine", "description": "A standard capacity magazine for use with the FN Five-Seven.", - "weight": 120, + "weight": "120 g", "volume": "250 ml", "price": 3700, "material": "steel", @@ -20,7 +20,7 @@ "type": "MAGAZINE", "name": "FN-P90 magazine", "description": "A factory issue translucent polymer box magazine that fits with the frame of the FN P90.", - "weight": 300, + "weight": "300 g", "volume": "500 ml", "price": 5400, "material": "plastic", diff --git a/data/json/items/magazine/5x50.json b/data/json/items/magazine/5x50.json index beabff82a2adb..a7ad5abbe781d 100644 --- a/data/json/items/magazine/5x50.json +++ b/data/json/items/magazine/5x50.json @@ -4,7 +4,7 @@ "type": "MAGAZINE", "name": "RMFB100 5x50mm extended magazine", "description": "A 100 round box magazine for use with 5x50mm flechette firearms.", - "weight": 360, + "weight": "360 g", "volume": "630ml", "price": 15000, "material": [ "superalloy", "plastic" ], @@ -21,7 +21,7 @@ "type": "MAGAZINE", "name": "RMFB50 5x50mm magazine", "description": "A 50 round box magazine for use with 5x50mm flechette firearms.", - "weight": 240, + "weight": "240 g", "volume": "315ml", "price": 12500, "material": [ "superalloy", "plastic" ], diff --git a/data/json/items/magazine/66mm.json b/data/json/items/magazine/66mm.json new file mode 100644 index 0000000000000..9ca257fe9c2df --- /dev/null +++ b/data/json/items/magazine/66mm.json @@ -0,0 +1,16 @@ +[ + { + "id": "m74_clip", + "type": "MAGAZINE", + "name": "M74 rocket clip", + "description": "This is a clip for the M202A1 FLASH that can hold 4 M74 incendiary rockets.", + "weight": "200 g", + "volume": "500 ml", + "price": 1000, + "material": "steel", + "symbol": "#", + "color": "light_gray", + "ammo_type": [ "m235" ], + "capacity": 4 + } +] diff --git a/data/json/items/magazine/762.json b/data/json/items/magazine/762.json index 61bbb04f395f8..3329572b30d7e 100644 --- a/data/json/items/magazine/762.json +++ b/data/json/items/magazine/762.json @@ -5,7 +5,7 @@ "name": "rifle clip - 7.62x39mm", "//": "Provisional.", "description": "A tiny piece of grooved metal designed to allow a shooter to quickly load a bolt-action rifle.", - "weight": 40, + "weight": "40 g", "volume": "100ml", "price": 1000, "material": "steel", @@ -20,7 +20,7 @@ "type": "MAGAZINE", "name": "AKM extended magazine", "description": "A 40-round, 7.62x39mm magazine initially designed for the RPK but compatible with the AKM rifle.", - "weight": 570, + "weight": "570 g", "volume": "750 ml", "price": 8300, "material": "steel", @@ -37,7 +37,7 @@ "type": "MAGAZINE", "name": "AKM magazine", "description": "A standard 30-round magazine made for the AKM rifle, made of stamped sheet metal.", - "weight": 430, + "weight": "430 g", "volume": "500 ml", "price": 2800, "material": "steel", diff --git a/data/json/items/magazine/762R.json b/data/json/items/magazine/762R.json index e0b3ef6080552..9e7806069c043 100644 --- a/data/json/items/magazine/762R.json +++ b/data/json/items/magazine/762R.json @@ -5,7 +5,7 @@ "name": "rifle clip - 7.62x54mmR", "//": "Provisional.", "description": "A tiny piece of grooved metal designed to allow a shooter to quickly load a bolt-action rifle.", - "weight": 40, + "weight": "40 g", "volume": "50ml", "price": 1000, "material": "steel", diff --git a/data/json/items/magazine/762x25.json b/data/json/items/magazine/762x25.json index 2da622a07b131..4642a443ffc8f 100644 --- a/data/json/items/magazine/762x25.json +++ b/data/json/items/magazine/762x25.json @@ -5,7 +5,7 @@ "name": "PPSh 71-round drum magazine", "//": "Provisional.", "description": "A high-capacity drum magazine for the PPSh-41.", - "weight": 1387, + "weight": "1387 g", "volume": "750 ml", "price": 7000, "material": "steel", @@ -22,7 +22,7 @@ "type": "MAGAZINE", "name": "PPSh 35-round magazine", "description": "A 35-round box magazine for the PPSh-41.", - "weight": 470, + "weight": "470 g", "volume": "500 ml", "price": 2200, "material": "steel", @@ -38,7 +38,7 @@ "type": "MAGAZINE", "name": "Tokarev TT-33 magazine", "description": "Standard 8-round magazine for Tokarev TT-33.", - "weight": 56, + "weight": "56 g", "volume": "250 ml", "price": 1300, "material": "steel", diff --git a/data/json/items/magazine/8x40mm.json b/data/json/items/magazine/8x40mm.json index 177d49e954d2c..10228b4eb79dd 100644 --- a/data/json/items/magazine/8x40mm.json +++ b/data/json/items/magazine/8x40mm.json @@ -4,7 +4,7 @@ "type": "MAGAZINE", "name": "RMGB100 8x40mm magazine", "description": "A 100 round box magazine for use with Rivtech 8x40mm caseless firearms.", - "weight": 150, + "weight": "150 g", "volume": "750 ml", "price": 40000, "material": [ "superalloy", "plastic" ], @@ -21,7 +21,7 @@ "type": "MAGAZINE", "name": "RMGP10 8x40mm stick magazine", "description": "A 10 round stick magazine for use with Rivtech 8x40mm caseless firearms.", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "price": 9000, "material": [ "superalloy", "plastic" ], @@ -38,7 +38,7 @@ "type": "MAGAZINE", "name": "RMGD250 8x40mm drum magazine", "description": "A 250 round drum magazine for use with Rivtech 8x40mm caseless firearms.", - "weight": 340, + "weight": "340 g", "volume": "2 L", "price": 70000, "material": [ "superalloy", "plastic" ], @@ -54,7 +54,7 @@ "type": "MAGAZINE", "name": "RMGP25 8x40mm stick magazine", "description": "A 25 round stick magazine for use with Rivtech 8x40mm caseless firearms.", - "weight": 90, + "weight": "90 g", "volume": "500 ml", "price": 12500, "material": [ "superalloy", "plastic" ], @@ -71,7 +71,7 @@ "type": "MAGAZINE", "name": "RMGB500 8x40mm drum magazine", "description": "A 500 round drum magazine for use with Rivtech 8x40mm caseless firearms.", - "weight": 1400, + "weight": "1400 g", "volume": "4 L", "price": 100000, "material": [ "superalloy", "plastic" ], @@ -86,7 +86,7 @@ "type": "MAGAZINE", "name": "RMGB50 8x40mm magazine", "description": "A 50 round box magazine for use with Rivtech 8x40mm caseless firearms.", - "weight": 110, + "weight": "110 g", "volume": "500 ml", "price": 25000, "material": [ "superalloy", "plastic" ], @@ -103,7 +103,7 @@ "type": "MAGAZINE", "name": "RMGS5 8x40mm speedloader", "description": "This speedloader, made by Rivtech for use with RM99 revolver, can hold 5 rounds of 8x40mm caseless rounds and quickly reload a compatible revolver.", - "weight": 92, + "weight": "92 g", "volume": "250 ml", "price": 8000, "material": [ "superalloy", "plastic" ], diff --git a/data/json/items/magazine/9mm.json b/data/json/items/magazine/9mm.json index 140e5c8ba6953..3c4766da409e5 100644 --- a/data/json/items/magazine/9mm.json +++ b/data/json/items/magazine/9mm.json @@ -4,7 +4,7 @@ "type": "MAGAZINE", "name": "LW-7 speedloader", "description": "This speedloader, made by Leadworks for use with L2032 Lookout revolver, can hold 7 rounds of 9x19mm and quickly reload a compatible revolver.", - "weight": 72, + "weight": "72 g", "volume": "250 ml", "price": 2800, "material": "plastic", @@ -19,7 +19,7 @@ "type": "MAGAZINE", "name": "Calico magazine", "description": "A surprisingly compact 50-round helical magazine for use with the Calico M960 SMG.", - "weight": 490, + "weight": "490 g", "volume": "500 ml", "price": 9920, "material": "steel", @@ -36,7 +36,7 @@ "type": "MAGAZINE", "name": "Glock extended magazine", "description": "An extended 30-round polymer magazine for use with Glock compatible firearms.", - "weight": 210, + "weight": "210 g", "volume": "500 ml", "price": 4700, "material": "plastic", @@ -53,7 +53,7 @@ "type": "MAGAZINE", "name": "Glock magazine", "description": "A compact light-weight polymer magazine for use with Glock compatible firearms.", - "weight": 105, + "weight": "105 g", "volume": "250 ml", "price": 2900, "material": "plastic", @@ -69,7 +69,7 @@ "type": "MAGAZINE", "name": "Glock 17 magazine - 17 rd", "description": "Made for the Glock 17, this magazine holds 17 rounds.", - "weight": 105, + "weight": "105 g", "volume": "250 ml", "price": 2900, "material": "plastic", @@ -86,7 +86,7 @@ "type": "MAGAZINE", "name": "Glock 17 magazine - 22 rd", "description": "Made for the Glock 17, this magazine holds 22 rounds.", - "weight": 105, + "weight": "105 g", "volume": "500 ml", "price": 3500, "material": "plastic", @@ -94,14 +94,15 @@ "color": "light_gray", "ammo_type": "9mm", "capacity": 22, - "reliability": 8 + "reliability": 8, + "flags": [ "MAG_COMPACT" ] }, { "id": "glock_drum_50rd", "type": "MAGAZINE", "name": "Glock Drum magazine - 50 rd", "description": "Made to fit most Glock pistols. This drum magazine holds 50 rounds.", - "weight": 100, + "weight": "100 g", "volume": "500 ml", "price": 2000, "material": "plastic", @@ -117,7 +118,7 @@ "type": "MAGAZINE", "name": "Glock Drum magazine - 100 rd", "description": "Made to fit most Glock pistols. This drum magazine holds 100 rounds.", - "weight": 100, + "weight": "100 g", "volume": "1 L", "price": 3100, "material": "plastic", @@ -133,7 +134,7 @@ "type": "MAGAZINE", "name": "LW-21 magazine", "description": "A 21-round polymer magazine for Leadworks LLC 9x19mm firearms. Lightweight and reliable but somewhat more difficult to reload.", - "weight": 105, + "weight": "105 g", "volume": "500 ml", "price": 7600, "material": "plastic", @@ -150,7 +151,7 @@ "type": "MAGAZINE", "name": "M9 extended magazine", "description": "A 30-round extended magazine compatible with both the M9 handgun as well as some modern carbines.", - "weight": 270, + "weight": "270 g", "volume": "500 ml", "price": 3500, "material": "steel", @@ -167,7 +168,7 @@ "type": "MAGAZINE", "name": "M9 magazine", "description": "A military issue 15-round box magazine originally intended for use with the Beretta M9 handgun.", - "weight": 135, + "weight": "135 g", "volume": "250 ml", "price": 2300, "material": "steel", @@ -183,7 +184,7 @@ "type": "MAGAZINE", "name": "MP5 extended magazine", "description": "An drum magazine for use with the H&K MP5 SMG. Much greater capacity but less reliable the factory specification magazine.", - "weight": 350, + "weight": "350 g", "volume": "750 ml", "price": 6920, "material": "steel", @@ -200,7 +201,7 @@ "type": "MAGAZINE", "name": "MP5 magazine", "description": "A standard capacity curved magazine for use with the H&K MP5 SMG.", - "weight": 210, + "weight": "210 g", "volume": "500 ml", "price": 4100, "material": "steel", @@ -216,7 +217,7 @@ "type": "MAGAZINE", "name": "STEN magazine", "description": "A double-column, single-feed 9x19mm magazine used by the STEN submachine gun, based off the magazines for the German MP-28 and later MP-40.", - "weight": 255, + "weight": "255 g", "volume": "500 ml", "price": 4000, "material": "steel", @@ -232,7 +233,7 @@ "type": "MAGAZINE", "name": "makeshift STEN magazine", "description": "An improvised magazine that is mostly compatible with the STEN submachine gun, with a simplified feed system.", - "weight": 300, + "weight": "300 g", "volume": "500 ml", "price": 4000, "material": "steel", @@ -249,7 +250,7 @@ "type": "MAGAZINE", "name": "TEC-9 magazine", "description": "A cheap and somewhat unreliable 32-round steel box magazine for use with the TEC-9 SMG.", - "weight": 220, + "weight": "220 g", "volume": "500 ml", "price": 3100, "material": "steel", @@ -265,7 +266,7 @@ "type": "MAGAZINE", "name": "USP 9mm magazine", "description": "A factory specification 15-round box magazine for use with the dependable H&K USP 9x19mm pistol.", - "weight": 75, + "weight": "75 g", "volume": "250 ml", "price": 3850, "material": "steel", @@ -281,7 +282,7 @@ "type": "MAGAZINE", "name": "UZI magazine", "description": "A standard 32-round steel box magazine for use with the UZI SMG.", - "weight": 220, + "weight": "220 g", "volume": "500 ml", "price": 4100, "material": "steel", @@ -297,7 +298,7 @@ "type": "MAGAZINE", "name": "Kel-Tec PF-9 magazine", "description": "A standard 7-round steel box magazine for the Kel-Tec PF-9.", - "weight": 60, + "weight": "60 g", "volume": "60ml", "price": 1900, "material": "steel", @@ -313,7 +314,7 @@ "type": "MAGAZINE", "name": "P320 magazine 9x19mm", "description": "A 17 round double stack box magazine for the SIG Sauer P320.", - "weight": 105, + "weight": "105 g", "volume": "250 ml", "price": 2900, "material": "plastic", @@ -330,7 +331,7 @@ "type": "MAGAZINE", "name": "Hi-Power magazine 9x19mm", "description": "A 13 round steel box magazine for the Browning Hi-Power 9x19mm.", - "weight": 100, + "weight": "100 g", "volume": "191 ml", "price": 2400, "material": "steel", @@ -346,7 +347,7 @@ "type": "MAGAZINE", "name": "Hi-Power magazine 9x19mm", "description": "A 15 round steel box magazine for the Browning Hi-Power 9x19mm.", - "weight": 100, + "weight": "100 g", "volume": "191 ml", "price": 2700, "material": "steel", @@ -362,7 +363,7 @@ "type": "MAGAZINE", "name": "P38 magazine", "description": "An 8 round steel box magazine for the Walther P38.", - "weight": 70, + "weight": "70 g", "volume": "228 ml", "price": 1500, "material": "steel", @@ -378,7 +379,7 @@ "type": "MAGAZINE", "name": "PPQ magazine 9x19mm", "description": "A 10 round steel box magazine for the Walther PPQ 9mm.", - "weight": 80, + "weight": "80 g", "volume": "207 ml", "price": 2200, "material": "steel", @@ -394,7 +395,7 @@ "type": "MAGAZINE", "name": "PPQ magazine 9x19mm", "description": "A 15 round steel box magazine for the Walther PPQ 9mm.", - "weight": 80, + "weight": "80 g", "volume": "207 ml", "price": 2800, "material": "steel", @@ -410,7 +411,7 @@ "type": "MAGAZINE", "name": "PPQ magazine 9x19mm", "description": "A 17 round steel box magazine for the Walther PPQ 9mm.", - "weight": 80, + "weight": "80 g", "volume": "207 ml", "price": 3200, "material": "steel", @@ -426,7 +427,7 @@ "type": "MAGAZINE", "name": "C-9 magazine", "description": "An 8-round steel box magazine for use with the Hi-Point C-9.", - "weight": 110, + "weight": "110 g", "volume": "284 ml", "price": 2500, "material": "steel", @@ -442,7 +443,7 @@ "type": "MAGAZINE", "name": "C-9 magazine", "description": "A 10-round steel box magazine for use with the Hi-Point C-9.", - "weight": 110, + "weight": "110 g", "volume": "284 ml", "price": 2500, "material": "steel", @@ -458,7 +459,7 @@ "type": "MAGAZINE", "name": "C-9 magazine", "description": "A 15-round steel box magazine for use with the Hi-Point C-9.", - "weight": 110, + "weight": "110 g", "volume": "284 ml", "price": 2500, "material": "steel", @@ -474,7 +475,7 @@ "type": "MAGAZINE", "name": "CZ 75 magazine", "description": "A 12-round steel box magazine for use with the CZ 75.", - "weight": 100, + "weight": "100 g", "volume": "230 ml", "price": 7500, "material": "steel", @@ -490,7 +491,7 @@ "type": "MAGAZINE", "name": "CZ 75 magazine", "description": "A 20-round steel box magazine for use with the CZ 75.", - "weight": 100, + "weight": "100 g", "volume": "230 ml", "price": 7500, "material": "steel", @@ -506,7 +507,7 @@ "type": "MAGAZINE", "name": "CZ 75 magazine", "description": "A 26-round steel box magazine for use with the CZ 75.", - "weight": 100, + "weight": "100 g", "volume": "230 ml", "price": 7500, "material": "steel", @@ -522,7 +523,7 @@ "type": "MAGAZINE", "name": "CCP magazine", "description": "An 8-round steel box magazine for use with the Walther CCP.", - "weight": 75, + "weight": "75 g", "volume": "176 ml", "price": 7500, "material": "steel", diff --git a/data/json/items/magazine/9x18.json b/data/json/items/magazine/9x18.json index 4376872de7a54..e4897bbee4aa9 100644 --- a/data/json/items/magazine/9x18.json +++ b/data/json/items/magazine/9x18.json @@ -4,7 +4,7 @@ "type": "MAGAZINE", "name": "Makarov PM magazine", "description": "The standard magazine for the Pistolet Makarova, holds 8 rounds.", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "price": 2300, "material": "steel", @@ -20,7 +20,7 @@ "type": "MAGAZINE", "name": "Skorpion Vz. 82 magazine", "description": "A standard 20-round magazine for the Skorpion Vz. 82, in 9x18mm Makarov.", - "weight": 170, + "weight": "170 g", "volume": "500 ml", "price": 2300, "material": "steel", diff --git a/data/json/items/magazine/chemical_spray.json b/data/json/items/magazine/chemical_spray.json index 8c59f974d0b08..91a017c071ea8 100644 --- a/data/json/items/magazine/chemical_spray.json +++ b/data/json/items/magazine/chemical_spray.json @@ -4,7 +4,7 @@ "type": "MAGAZINE", "name": "pressurized chemical tank", "description": "A makeshift pressurized 2L canister designed to feed a makeshift chemical thrower.", - "weight": 800, + "weight": "800 g", "volume": "2 L", "price": 5000, "material": "steel", diff --git a/data/json/items/magazine/liquid.json b/data/json/items/magazine/liquid.json index b3f6e3590e510..46737e7ddd511 100644 --- a/data/json/items/magazine/liquid.json +++ b/data/json/items/magazine/liquid.json @@ -4,7 +4,7 @@ "type": "MAGAZINE", "name": "pressurized fuel tank", "description": "A pressurized 3L canister designed to feed a flamethrower.", - "weight": 600, + "weight": "600 g", "volume": "3 L", "price": 5000, "material": "steel", @@ -20,7 +20,7 @@ "type": "MAGAZINE", "name": "small pressurized fuel tank", "description": "A pressurized 0.5L canister built for use with a small auxiliary flamethrower.", - "weight": 100, + "weight": "100 g", "volume": "500 ml", "price": 3000, "material": "steel", @@ -36,7 +36,7 @@ "type": "MAGAZINE", "name": "RM450-2 fuel canister", "description": "A 2L pressurized steel canister with a valve designed for the RM451's feed system.", - "weight": 400, + "weight": "400 g", "volume": "2 L", "price": 15000, "material": "steel", @@ -52,7 +52,7 @@ "type": "MAGAZINE", "name": "RM450-4 fuel canister", "description": "A 4L pressurized steel canister with a valve designed for the RM451's feed system.", - "weight": 800, + "weight": "800 g", "volume": "4 L", "price": 20000, "material": "steel", diff --git a/data/json/items/magazine/nail.json b/data/json/items/magazine/nail.json index 375a57de73dee..309ef54a1f302 100644 --- a/data/json/items/magazine/nail.json +++ b/data/json/items/magazine/nail.json @@ -4,7 +4,7 @@ "type": "MAGAZINE", "name": "nail rifle magazine", "description": "An improvised magazine for use with a nail rifle. Little more than a tin can, spring and some duct tape it is awkward to reload and not especially reliable.", - "weight": 60, + "weight": "60 g", "volume": "250 ml", "price": 1920, "material": "steel", diff --git a/data/json/items/magazine/shot.json b/data/json/items/magazine/shot.json index d0acd36bcac16..ff8c065cefabe 100644 --- a/data/json/items/magazine/shot.json +++ b/data/json/items/magazine/shot.json @@ -4,7 +4,7 @@ "type": "MAGAZINE", "name": "Saiga-12 box magazine", "description": "A removable plastic magazine for the Saiga-12 shotgun. Holds 10 rounds.", - "weight": 210, + "weight": "210 g", "volume": "500 ml", "price": 4500, "material": "plastic", @@ -20,7 +20,7 @@ "type": "MAGAZINE", "name": "Saiga-12 drum magazine", "description": "A removable plastic magazine for the Saiga-12 shotgun. Holds 30 rounds.", - "weight": 460, + "weight": "460 g", "volume": "1 L", "price": 11000, "material": "plastic", @@ -37,7 +37,7 @@ "type": "MAGAZINE", "name": "shotshell belt", "description": "A non-disintegrating cloth ammo belt which can hold up to 20 shotgun shells. Notably less reliable than metal ammo belts.", - "weight": 200, + "weight": "200 g", "volume": "500 ml", "price": 1000, "material": "cotton", @@ -54,7 +54,7 @@ "type": "MAGAZINE", "name": "shotgun 6-round speedloader", "description": "A steel tube with attached handle that when inserted into a 6 round shotgun can be used to quickly load the full tube in a much shorter period of time than by hand.", - "weight": 480, + "weight": "480 g", "volume": "1750 ml", "price": 3200, "material": "steel", @@ -69,7 +69,7 @@ "type": "MAGAZINE", "name": "shotgun 8-round speedloader", "description": "A steel tube with attached handle that when inserted into an 8 round shotgun can be used to quickly load the full tube in a much shorter period of time than by hand.", - "weight": 510, + "weight": "510 g", "volume": "2 L", "price": 3250, "material": "steel", diff --git a/data/json/items/magazine/weldgas.json b/data/json/items/magazine/weldgas.json index 5add892174a91..1d5aa9908e142 100644 --- a/data/json/items/magazine/weldgas.json +++ b/data/json/items/magazine/weldgas.json @@ -4,7 +4,7 @@ "type": "MAGAZINE", "name": "small welding tank", "description": "A compact steel cylinder designed for holding pressurized welding gases. It is marked with several faded and now unreadable symbols.", - "weight": 1500, + "weight": "1500 g", "volume": "1 L", "price": 5600, "material": "steel", @@ -21,7 +21,7 @@ "type": "MAGAZINE", "name": "welding tank", "description": "A large steel cylinder designed for holding pressurized welding gases. It is marked with several faded and now unreadable symbols.", - "weight": 6000, + "weight": "6000 g", "volume": "3 L", "price": 5600, "material": "steel", @@ -38,7 +38,7 @@ "type": "MAGAZINE", "name": "oxygen cylinder", "description": "A large steel cylinder used for storing pressurized gas. It is marked with a faded, but legible O2 symbol.", - "weight": 12888, + "weight": "12888 g", "volume": "2500 ml", "price": 13400, "material": "steel", diff --git a/data/json/items/melee.json b/data/json/items/melee.json index ebd1f58be2275..053a89fae488c 100644 --- a/data/json/items/melee.json +++ b/data/json/items/melee.json @@ -5,7 +5,7 @@ "category": "weapons", "name": "throwing stick", "description": "A stick carved into a shape suitable for throwing at a target. Not a boomerang, so don't expect it to return to your hand.", - "weight": 574, + "weight": "574 g", "volume": "500 ml", "price": 200, "bashing": 5, @@ -22,7 +22,7 @@ "name": "bolas", "name_plural": "bolases", "description": "Some ropes with weights, designed to tangle the legs of a target when thrown, usually at an animal. Used by the Gauchos of Argentina.", - "weight": 400, + "weight": "400 g", "volume": "750 ml", "price": 600, "material": [ "cotton", "stone" ], @@ -38,7 +38,7 @@ "category": "weapons", "name": "net", "description": "A mesh of string and weights, traditionally used to catch fish, and to entangle oponents in combat.", - "weight": 1100, + "weight": "1100 g", "volume": "1500 ml", "price": 650, "material": [ "cotton", "stone" ], @@ -59,7 +59,7 @@ "price_postapoc": 5000, "material": [ "steel", "wood" ], "techniques": [ "WBLOCK_1" ], - "weight": 907, + "weight": "907 g", "volume": "1 L", "bashing": 13, "cutting": 7, @@ -78,7 +78,7 @@ "category": "spare_parts", "material": "stone", "flags": "TRADER_AVOID", - "weight": 657, + "weight": "657 g", "volume": "250 ml", "bashing": 7, "to_hit": -2, @@ -92,7 +92,7 @@ "name": "sharp rock", "description": "A rock with sharp edges, that can be used as a butchering tool, if nothing else is available. Makes a passable melee weapon.", "material": "stone", - "weight": 500, + "weight": "500 g", "volume": "250 ml", "bashing": 5, "cutting": 3, @@ -108,7 +108,7 @@ "description": "A broken ceramic shard. It is heavy and has a somewhat sharp edge, but it's too irregular to cut properly.", "material": "ceramic", "flags": "TRADER_AVOID", - "weight": 750, + "weight": "750 g", "volume": "250 ml", "bashing": 5, "cutting": 2, @@ -120,7 +120,7 @@ "id": "broom", "name": "broom", "description": "A long-handled broom. Makes a terrible weapon unless you're chasing cats.", - "weight": 929, + "weight": "929 g", "to_hit": 1, "color": "yellow", "symbol": "/", @@ -136,7 +136,7 @@ "id": "nailboard", "name": "nailboard", "description": "A long piece of wood with several nails through one end; essentially a simple mace. Makes an acceptable melee weapon.", - "weight": 1424, + "weight": "1424 g", "to_hit": 1, "color": "brown", "symbol": "/", @@ -154,7 +154,7 @@ "id": "nailbat", "name": "nail bat", "description": "A baseball bat with several nails driven through it, an excellent melee weapon.", - "weight": 1159, + "weight": "1159 g", "to_hit": 3, "color": "brown", "symbol": "/", @@ -171,7 +171,7 @@ "id": "bwirebat", "name": "barbed wire bat", "description": "A baseball bat wrapped with barbed wire. A brutal melee weapon.", - "weight": 1420, + "weight": "1420 g", "to_hit": 3, "color": "brown", "symbol": "/", @@ -189,7 +189,7 @@ "name": "The 7-10 Split", "name_plural": "7-10 Splits", "description": "An improvised weapon, made from two spikes attached to a bowling pin in the shape of a 'T'.", - "weight": 2433, + "weight": "2433 g", "to_hit": -1, "color": "brown", "symbol": "/", @@ -212,7 +212,7 @@ "description": "A pair of knuckles consisting of two small squares of wood with several nails coming through them. Useful in nasty street fights.", "material": "wood", "volume": "250 ml", - "weight": 430, + "weight": "430 g", "bashing": 4, "cutting": 6, "flags": [ "UNARMED_WEAPON" ] @@ -222,7 +222,7 @@ "id": "bowling_pin", "name": "bowling pin", "description": "A blunt bowling pin. Makes a decent melee weapon, if somewhat short.", - "weight": 1530, + "weight": "1530 g", "to_hit": -1, "color": "brown", "symbol": "/", @@ -238,7 +238,7 @@ "id": "battletorch_done", "name": "burnt out Louisville Slaughterer", "description": "A sturdy wood bat, wrapped in flame-resistant Nomex fabric. Makes a good melee weapon but better be disassembled to recycle the baseball bat and some Nomex patches.", - "weight": 1343, + "weight": "1343 g", "to_hit": 3, "color": "brown", "symbol": "/", @@ -254,7 +254,7 @@ "id": "bee_sting", "name": "bee sting", "description": "A six-inch stinger from a giant bee. Makes a mediocre melee weapon.", - "weight": 540, + "weight": "540 g", "to_hit": -1, "color": "white", "symbol": ",", @@ -269,7 +269,7 @@ "id": "fighter_sting", "name": "fungal fighter sting", "description": "A short dart from a fungal fighter. Makes an poor melee weapon.", - "weight": 270, + "weight": "270 g", "to_hit": -1, "color": "green", "symbol": ",", @@ -284,7 +284,7 @@ "id": "wasp_sting", "name": "wasp sting", "description": "A six-inch stinger from a giant wasp. Makes a poor melee weapon.", - "weight": 540, + "weight": "540 g", "to_hit": -1, "color": "dark_gray", "symbol": ",", @@ -299,7 +299,7 @@ "id": "cane", "name": "walking cane", "description": "Handicapped or not, you always walk in style. Consisting of a metal headpiece and a wooden body, this makes a great bashing weapon in a pinch.", - "weight": 453, + "weight": "453 g", "to_hit": 2, "color": "dark_gray", "symbol": "/", @@ -316,7 +316,7 @@ "id": "pool_cue", "name": "pool cue", "description": "A hard-wood stick designed for hitting colorful balls around a felt table. Truly, the coolest of sports.", - "weight": 520, + "weight": "520 g", "to_hit": 3, "color": "brown", "symbol": "/", @@ -348,7 +348,7 @@ "id": "bio_blade_weapon", "name": "monomolecular blade", "description": "A foot-long blade made from high-tech alloy and edged with bonded nanocrystals.", - "weight": 100, + "weight": "100 g", "to_hit": 3, "color": "dark_gray", "symbol": "{", @@ -364,7 +364,7 @@ "id": "punch_dagger", "name": "punch dagger", "description": "A short and sharp double edged dagger made to be gripped in the palm, with the blade protruding between the fingers.", - "weight": 168, + "weight": "168 g", "to_hit": 2, "color": "dark_gray", "symbol": "{", @@ -382,7 +382,7 @@ "name": "tiger claws", "name_plural": "tiger claws", "description": "Also called bagh nakha or iron paw, this is a small claw-like bladed weapon from India designed to be concealed under and against the palm.", - "weight": 92, + "weight": "92 g", "to_hit": 3, "color": "dark_gray", "symbol": "{", @@ -403,7 +403,7 @@ "description": "A mass of scrap metal crudely beat into shape, with folded rags underneath to protect the wearers knuckles. A good, quick weapon - but you have to get within punching range to use it.", "material": "steel", "volume": "250 ml", - "weight": 430, + "weight": "430 g", "bashing": 8, "qualities": [ [ "HAMMER", 1 ] ], "flags": [ "UNARMED_WEAPON" ] @@ -417,7 +417,7 @@ "description": "Five pieces of rebar sharpened to cruel points and strapped to a brace fastened at wrist and forearm on both arms. The next bub better watch out.", "material": "steel", "volume": "500 ml", - "weight": 1150, + "weight": "1150 g", "cutting": 16, "to_hit": 2, "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 8 ] ], @@ -434,7 +434,7 @@ "description": "A heavy metal guard that covers the fist and increases striking power, with stout padding underneath to protect the wearers hand.", "material": [ "steel", "leather" ], "volume": "500 ml", - "weight": 970, + "weight": "970 g", "bashing": 12, "qualities": [ [ "HAMMER", 1 ] ], "flags": [ "UNARMED_WEAPON", "DURABLE_MELEE", "NONCONDUCTIVE" ] @@ -449,7 +449,7 @@ "category": "weapons", "description": "A metal weapon made of brass, designed to be gripped in the palm and cause punches to do extra damage. A good, quick weapon - but you have to get within punching range to use it.", "material": "brass", - "weight": 320, + "weight": "320 g", "bashing": 6, "flags": [ "UNARMED_WEAPON", "DURABLE_MELEE" ] }, @@ -464,7 +464,7 @@ "price_postapoc": 2000, "material": [ "wood", "plastic" ], "techniques": [ "WBLOCK_1" ], - "weight": 420, + "weight": "420 g", "volume": "1750 ml", "bashing": 14, "cutting": 1, @@ -480,7 +480,7 @@ "price": 13000, "price_postapoc": 2200, "material": "aluminum", - "weight": 300, + "weight": "300 g", "volume": "1 L", "bashing": 14, "to_hit": 1, @@ -497,7 +497,7 @@ "price": 1000, "price_postapoc": 300, "material": [ "cotton", "stone" ], - "weight": 1007, + "weight": "1007 g", "volume": "500 ml", "bashing": 8, "to_hit": 1, @@ -511,7 +511,7 @@ "name": "glass shiv", "description": "A glass shard with wrapping at one end so it can be safely wielded.", "material": [ "glass", "cotton" ], - "weight": 115, + "weight": "115 g", "volume": "30 ml", "cutting": 6, "flags": [ "SHEATH_KNIFE", "CONDUCTIVE", "FRAGILE_MELEE" ], @@ -528,7 +528,7 @@ "category": "weapons", "price": 400, "material": [ "plastic" ], - "weight": 49, + "weight": "49 g", "volume": "250 ml", "bashing": 2, "cutting": 1, @@ -544,7 +544,7 @@ "description": "A collapsible buttstock designed for the M320 grenade launcher. When combined with this stock, the M320 can be used as a stand alone weapon", "price": 10000, "material": [ "plastic", "steel" ], - "weight": 600, + "weight": "600 g", "volume": "250 ml", "to_hit": 1 }, @@ -560,7 +560,7 @@ "material": [ "aluminum", "wood" ], "flags": "NONCONDUCTIVE", "techniques": [ "WBLOCK_1", "WIDE", "BRUTAL", "SWEEP" ], - "weight": 2068, + "weight": "2068 g", "volume": "3250 ml", "bashing": 16, "cutting": 2, @@ -576,7 +576,7 @@ "description": "This is a huge axe designed for warfare. You notice that the axe heads aren't seated properly at all.", "price": 40000, "material": [ "budget_steel", "wood" ], - "weight": 2002, + "weight": "2002 g", "volume": "2500 ml", "bashing": 16, "cutting": 24, @@ -592,7 +592,7 @@ "name": "pitchfork", "category": "tools", "description": "An agricultural tool with long wooden shaft and four spikes. Is used to lift hay.", - "weight": 1000, + "weight": "1000 g", "to_hit": 1, "color": "brown", "symbol": "/", @@ -612,7 +612,7 @@ "color": "brown", "name": "bullwhip", "description": "A long strip of braided leather with a handle on one end. Originally developed to settle disagreements with cattle, it's better used now for flaying the rotten flesh off of walking corpses. Great for when a problem comes along.", - "weight": 3460, + "weight": "3460 g", "volume": "2 L", "price": 3500, "material": [ "leather" ], @@ -625,7 +625,7 @@ "type": "TOOL", "name": "lobotomizer", "description": "This is a hand-forged collapsible tool that has two axe heads and sharp shovel-like tip on one end. It can be used as a shovel, or you could chop some zombies with it instead.", - "weight": 2722, + "weight": "2722 g", "volume": "1750 ml", "price": 25000, "to_hit": -3, @@ -644,7 +644,7 @@ "category": "weapons", "name": "tazer", "description": "This is a high-powered stun gun. Use this item to attempt to electrocute an adjacent enemy, damaging and temporarily paralyzing them. Because the shock can actually jump through the air, it is difficult to miss.", - "weight": 151, + "weight": "151 g", "volume": "250 ml", "price": 14000, "to_hit": -1, @@ -670,7 +670,7 @@ "category": "weapons", "name": "battle axe", "description": "This is a huge axe designed for warfare. Though intended for use as a weapon, it can also be pressed into service as a rather clumsy woodcutting tool.", - "weight": 2002, + "weight": "2002 g", "volume": "2500 ml", "price": 40000, "to_hit": 1, @@ -688,7 +688,7 @@ "type": "TOOL", "name": "wood axe", "description": "This is a large, two-handed wood axe. It makes a good melee weapon, but is a bit slow to recover between swings.", - "weight": 2267, + "weight": "2267 g", "volume": "2500 ml", "price": 10500, "to_hit": 1, diff --git a/data/json/items/melee/bludgeons.json b/data/json/items/melee/bludgeons.json index c5e551169f755..8eca974ee0b55 100644 --- a/data/json/items/melee/bludgeons.json +++ b/data/json/items/melee/bludgeons.json @@ -4,7 +4,7 @@ "id": "hammer_sledge", "name": "sledge hammer", "description": "A large, heavy hammer. Makes an acceptable melee weapon for the very strong, but is nearly useless in the hands of the weak.", - "weight": 4500, + "weight": "4500 g", "color": "brown", "symbol": "/", "material": [ "wood", "steel" ], @@ -20,7 +20,7 @@ "id": "warhammer", "name": "war hammer", "description": "A medieval hammer made for battle. Its odd shape and balance make it an excellent weapon, but an ineffective tool.", - "weight": 1337, + "weight": "1337 g", "to_hit": 1, "color": "brown", "symbol": "/", @@ -39,7 +39,7 @@ "id": "homewrecker", "name": "homewrecker", "description": "A long piece of wood with several chunks of steel firmly tied to it. The resulting weapon is unwieldy and slow but very heavy hitting.", - "weight": 3024, + "weight": "3024 g", "to_hit": -3, "color": "brown", "symbol": "/", @@ -57,7 +57,7 @@ "id": "bat", "name": "baseball bat", "description": "A sturdy wood bat. Makes a great melee weapon.", - "weight": 1133, + "weight": "1133 g", "to_hit": 3, "color": "brown", "symbol": "/", @@ -73,7 +73,7 @@ "id": "bat_metal", "name": "aluminum bat", "description": "An aluminum baseball bat, lighter than a wooden bat and a little easier to swing as a result.", - "weight": 765, + "weight": "765 g", "to_hit": 3, "color": "light_gray", "symbol": "/", @@ -91,7 +91,7 @@ "category": "weapons", "name": "expandable baton", "description": "A telescoping baton that collapses for easy storage. Makes an excellent melee weapon. Activate to expand.", - "weight": 725, + "weight": "725 g", "to_hit": 2, "color": "dark_gray", "symbol": "/", @@ -109,7 +109,7 @@ "name": "expandable baton (extended)", "name_plural": "expandable batons (extended)", "description": "A telescoping baton that collapses for easy storage. Makes an excellent melee weapon. Activate to collapse.", - "weight": 725, + "weight": "725 g", "to_hit": 2, "color": "dark_gray", "symbol": "/", @@ -133,7 +133,7 @@ "material": "wood", "techniques": [ "WBLOCK_2", "RAPID", "SWEEP" ], "flags": [ "DURABLE_MELEE", "SHEATH_SPEAR", "ALWAYS_TWOHAND" ], - "weight": 1400, + "weight": "1400 g", "volume": "3 L", "bashing": 19, "category": "weapons", @@ -151,7 +151,7 @@ "material": [ "wood", "iron" ], "techniques": [ "WBLOCK_2", "RAPID", "SWEEP" ], "flags": [ "DURABLE_MELEE", "NONCONDUCTIVE", "SHEATH_SPEAR", "ALWAYS_TWOHAND" ], - "weight": 2200, + "weight": "2200 g", "volume": "3 L", "bashing": 25, "category": "weapons", @@ -165,7 +165,7 @@ "name": "powered quarterstaff", "name_plural": "powered quarterstaves", "description": "This is an ironshod quarterstaff that has a high-voltage stun gun built into the handle. The stun gun is wired to the metal caps at either end of the staff, allowing you to zap a dangerous opponent should beating them senseless with it prove too hazardous.", - "weight": 2351, + "weight": "2351 g", "volume": "3250 ml", "price": 8000, "to_hit": 3, @@ -194,7 +194,7 @@ "name": "tactical tonfa (off)", "name_plural": "tactical tonfas (off)", "description": "This is a reinforced plastic tonfa; the core is hollowed out and is filled with capacitors and a high-yield rechargeable storage battery. When a switch on the handle is pressed, a high-voltage current is transmitted to the two electrodes mounted in the end of the tonfa, and by extension to anyone unfortunate enough to be in contact with them. It also has a nifty flashlight, which is off at the moment.", - "weight": 726, + "weight": "726 g", "volume": "2250 ml", "price": 17000, "to_hit": 2, @@ -233,7 +233,7 @@ "id": "mace", "name": "mace", "description": "A medieval weapon consisting of a wood handle with a heavy iron end. It is heavy and slow, but its crushing damage is devastating.", - "weight": 1500, + "weight": "1500 g", "to_hit": 1, "color": "dark_gray", "symbol": "/", @@ -251,7 +251,7 @@ "id": "morningstar", "name": "morningstar", "description": "A medieval weapon consisting of a wood handle with a heavy, spiked iron ball on the end. It deals devastating crushing damage, with a small amount of piercing to boot.", - "weight": 1400, + "weight": "1400 g", "to_hit": 1, "color": "dark_gray", "symbol": "/", @@ -269,7 +269,7 @@ "id": "mace_fake", "name": "mace", "description": "A light, cheaply made replica of a medieval weapon that would normally consist of a wood handle with a heavy iron end.", - "weight": 750, + "weight": "750 g", "to_hit": 1, "color": "dark_gray", "symbol": "/", @@ -286,7 +286,7 @@ "id": "mace_inferior", "name": "mace", "description": "A medieval weapon consisting of a wood handle with a heavy iron end. That iron end feels a bit loose.", - "weight": 1000, + "weight": "1000 g", "to_hit": 1, "color": "dark_gray", "symbol": "/", @@ -304,7 +304,7 @@ "id": "morningstar_fake", "name": "morningstar", "description": "A light, cheaply made replica of a medieval weapon that would normally consist of a wood handle with a heavy, spiked iron ball on the end.", - "weight": 700, + "weight": "700 g", "to_hit": 1, "color": "dark_gray", "symbol": "/", @@ -322,7 +322,7 @@ "id": "morningstar_inferior", "name": "morningstar", "description": "A medieval weapon consisting of a wood handle with a heavy, spiked iron ball on the end. That end feels lighter than it should.", - "weight": 1000, + "weight": "1000 g", "to_hit": 1, "color": "dark_gray", "symbol": "/", @@ -342,7 +342,7 @@ "category": "weapons", "name": "war flail", "description": "This is a stout pole with a large steel flanged mace head on a short chain attached to it, based on the peasant flail agricultural tool except now with a metal head and made to thresh people in metal armor rather than grain.", - "weight": 4550, + "weight": "4550 g", "volume": "3750 ml", "price": 25000, "bashing": 40, @@ -358,7 +358,7 @@ "category": "weapons", "name": "peasant flail", "description": "This is a stout pole with a wooden club on a leather cord attached to it, this is a tool used to thresh wheat and occasionally people when the peasants got angry at their feudal lords.", - "weight": 1700, + "weight": "1700 g", "volume": "3750 ml", "price": 4000, "bashing": 19, @@ -374,7 +374,7 @@ "id": "glass_macuahuitl", "name": "makeshift macuahuitl", "description": "A flat wooden club with sharpened pieces of stone sticking to both of its sides.", - "weight": 955, + "weight": "955 g", "to_hit": 1, "color": "dark_gray", "symbol": "/", @@ -391,7 +391,7 @@ "id": "tonfa", "name": "tonfa", "description": "A hard plastic truncheon commonly employed by police. Originally an Okinawan weapon, it consists of a stick with a perpendicular handle attached a third of the way down its length.", - "weight": 575, + "weight": "575 g", "to_hit": 2, "color": "dark_gray", "symbol": "/", @@ -407,7 +407,7 @@ "id": "tonfa_wood", "name": "wooden tonfa", "description": "A stout wooden truncheon of the sort commonly employed by police. Originally an Okinawan weapon, it consists of a stick with a perpendicular handle attached a third of the way down its length.", - "weight": 921, + "weight": "921 g", "to_hit": 2, "color": "brown", "symbol": "/", @@ -425,7 +425,7 @@ "name": "PR-24 baton (retracted)", "name_plural": "PR-24 batons (retracted)", "description": "The Monadnock PR-24 baton is a collapsible, lightweight, side-handle baton used by law enforcement all over the world. The PR designation is rumored to mean Public Relations. Activate to extend.", - "weight": 680, + "weight": "680 g", "to_hit": 1, "color": "dark_gray", "symbol": "/", @@ -444,7 +444,7 @@ "name": "PR-24 baton (extended)", "name_plural": "PR-24 batons (extended)", "description": "The Monadnock PR-24 baton is a collapsible, lightweight, side-handle baton used by law enforcement all over the world. The PR designation is rumored to mean Public Relations. Activate to retract.", - "weight": 680, + "weight": "680 g", "to_hit": 2, "color": "dark_gray", "symbol": "/", @@ -467,7 +467,7 @@ "material": "wood", "techniques": [ "RAPID", "WBLOCK_2", "SWEEP" ], "flags": [ "DURABLE_MELEE", "SHEATH_SWORD" ], - "weight": 1133, + "weight": "1133 g", "volume": "2 L", "//": "MA reference I used held that a bokken crushes rather than cuts (or impales) but is otherwise just as damaging as a katana. Nerfed by popular demand.", "bashing": 25, @@ -487,7 +487,7 @@ "material": "wood", "techniques": [ "RAPID", "WBLOCK_2", "SWEEP" ], "flags": [ "SHEATH_SWORD" ], - "weight": 680, + "weight": "680 g", "volume": "2 L", "bashing": 10, "cutting": 1, @@ -506,7 +506,7 @@ "material": "wood", "techniques": [ "RAPID", "WBLOCK_2", "SWEEP" ], "flags": [ "SHEATH_SWORD" ], - "weight": 1133, + "weight": "1133 g", "volume": "2 L", "bashing": 18, "cutting": 1, @@ -520,7 +520,7 @@ "name": "L-stick (off)", "name_plural": "L-sticks (off)", "description": "Produced by the Light corporation, this stylish staff not only functions as a light source, but doubles as a light-weight weapon, due to the superalloy materials it is made of. Due to proprietary efficiency improvements over standard light sources, the L-stick or light stick as it is commonly called, batteries last longer than other light sources.", - "weight": 1000, + "weight": "1000 g", "volume": "3 L", "price": 5000, "to_hit": 3, @@ -566,7 +566,7 @@ "id": "cudgel", "name": "cudgel", "description": "A slender long rod of wood, while traditionally intended as a training tool for many dueling moves, it still makes a good melee weapon in a pinch.", - "weight": 875, + "weight": "875 g", "to_hit": 2, "color": "brown", "symbol": "/", @@ -583,7 +583,7 @@ "category": "weapons", "name": "Louisville Slaughterer", "description": "This is sturdy wood bat, wrapped in gasoline-soaked rags and flame-resistant Nomex fabric. Light it, and the ball game will REALLY heat up. You'll need a lighter or matches to light it.", - "weight": 1485, + "weight": "1485 g", "volume": "2 L", "price": 16000, "to_hit": 3, @@ -612,7 +612,7 @@ "name": "Louisville Slaughterer", "name_plural": "Louisville Slaughterers", "description": "This is a sturdy wood bat, wrapped in gasoline-soaked rags and flame-resistant Nomex fabric. It is burning brightly, and makes it much easier to see the baselines at night games (It also makes the umpire FAR more likely to call a ball instead of a strike).", - "weight": 1485, + "weight": "1485 g", "volume": "2 L", "price": 16000, "to_hit": 3, @@ -642,7 +642,7 @@ "id": "mjolnir", "name": "Mjölnir", "description": "A large hammer, forged from the heart of a dying star. It bears the inscription:\n \nWhosoever holds this hammer,\nIf he be worthy,\nShall possess the power to...\nCRUSH!'", - "weight": 5443, + "weight": "5443 g", "color": "light_gray", "symbol": "/", "material": [ "wood", "steel" ], @@ -664,7 +664,7 @@ "material": [ "wood", "steel" ], "flags": [ "DURABLE_MELEE", "REACH_ATTACK", "NONCONDUCTIVE", "SHEATH_SPEAR", "SPEAR", "ALWAYS_TWOHAND" ], "techniques": [ "WBLOCK_1", "WIDE", "SWEEP" ], - "weight": 3200, + "weight": "3200 g", "volume": "3750 ml", "bashing": 30, "cutting": 22, @@ -683,7 +683,7 @@ "material": [ "wood", "aluminum" ], "flags": [ "REACH_ATTACK", "NONCONDUCTIVE", "SHEATH_SPEAR", "SPEAR", "ALWAYS_TWOHAND" ], "techniques": [ "WBLOCK_1", "SWEEP" ], - "weight": 2700, + "weight": "2700 g", "volume": "3750 ml", "bashing": 14, "cutting": 3, @@ -701,7 +701,7 @@ "material": "wood", "techniques": [ "WBLOCK_1", "SWEEP" ], "flags": [ "DURABLE_MELEE" ], - "weight": 910, + "weight": "910 g", "volume": "1500 ml", "bashing": 22, "to_hit": 2, @@ -718,7 +718,7 @@ "material": [ "lead", "wood" ], "techniques": [ "WBLOCK_1", "SWEEP" ], "flags": [ "DURABLE_MELEE", "NONCONDUCTIVE" ], - "weight": 1135, + "weight": "1135 g", "volume": "1500 ml", "bashing": 27, "to_hit": 2, @@ -734,7 +734,7 @@ "price": 2500, "material": "wood", "techniques": [ "WBLOCK_1", "SWEEP" ], - "weight": 850, + "weight": "850 g", "volume": "1500 ml", "bashing": 10, "to_hit": 2, @@ -751,7 +751,7 @@ "material": [ "leather", "lead" ], "techniques": [ "PRECISE", "RAPID" ], "flags": [ "BELT_CLIP", "NONCONDUCTIVE" ], - "weight": 450, + "weight": "450 g", "volume": "350 ml", "bashing": 13, "to_hit": 1, @@ -768,7 +768,7 @@ "material": [ "leather", "steel" ], "techniques": [ "PRECISE", "RAPID" ], "flags": [ "BELT_CLIP", "NONCONDUCTIVE" ], - "weight": 400, + "weight": "400 g", "volume": "350 ml", "bashing": 9, "to_hit": 1, diff --git a/data/json/items/melee/knives_kitchen.json b/data/json/items/melee/knives_kitchen.json index ef0cc16f0dca9..08bf943232987 100644 --- a/data/json/items/melee/knives_kitchen.json +++ b/data/json/items/melee/knives_kitchen.json @@ -16,7 +16,7 @@ "category": "weapons", "description": "This is a sharp, heavy knife. It makes a good melee weapon, and is an ideal item for butchering corpses.", "copy-from": "base_kitchen_knife", - "weight": 380, + "weight": "380 g", "volume": "300 ml", "price": 3000, "bashing": 2, @@ -32,7 +32,7 @@ "category": "weapons", "description": "This is a sharp knife, designed for cutting meat. It makes a poor melee weapon, but is decent at butchering corpses.", "copy-from": "base_kitchen_knife", - "weight": 112, + "weight": "112 g", "volume": "100 ml", "price": 250, "to_hit": -1, @@ -50,7 +50,7 @@ "description": "This is a short-bladed knife with a sharp blade, made for fine controlled cuts to vegetables without using a cutting board.", "copy-from": "base_kitchen_knife", "looks_like": "knife_steak", - "weight": 100, + "weight": "100 g", "volume": "250 ml", "price": 250, "to_hit": -1, @@ -68,7 +68,7 @@ "description": "This is a long-bladed kitchen knife. The blade is wider than the handle, giving room for the wielder's knuckles, and it has a characteristic curve for a fast rocking action for chopping vegetables. It makes a good melee weapon, but the wide blade is unwieldy for butchering.", "copy-from": "base_kitchen_knife", "looks_like": "knife_butcher", - "weight": 280, + "weight": "280 g", "volume": "200 ml", "price": 1500, "bashing": 1, @@ -85,7 +85,7 @@ "description": "This is a long-bladed kitchen knife with a thin, slightly curved blade for deftly slicing meat either in flat sheets or around the bone. It would be a decent melee weapon, and excellent for butchery.", "copy-from": "base_kitchen_knife", "looks_like": "knife_butcher", - "weight": 280, + "weight": "280 g", "volume": "200 ml", "price": 1500, "bashing": 1, @@ -102,7 +102,7 @@ "description": "This knife has quite a long blade with a scalloped edge for cutting bread. It's not that sharp, but its length and heft mean it could do a bit of damage and cause some nasty tearing.", "copy-from": "base_kitchen_knife", "looks_like": "knife_butcher", - "weight": 280, + "weight": "280 g", "volume": "200 ml", "price": 500, "bashing": 4, @@ -118,7 +118,7 @@ "description": "This is a menacing looking knife with a broad, square shaped blade, curved for fast vegetable chopping. Its heft and sharpness would make it a decent weapon as well, although not as good as a meat cleaver.", "copy-from": "base_kitchen_knife", "looks_like": "knife_butcher", - "weight": 250, + "weight": "250 g", "volume": "250 ml", "price": 2500, "bashing": 2, @@ -134,7 +134,7 @@ "description": "This is a menacing looking knife with a broad, square shaped blade. Its heft and sharpness would make it a very effective melee weapon, and an excellent butchering tool.", "copy-from": "base_kitchen_knife", "looks_like": "knife_butcher", - "weight": 350, + "weight": "350 g", "volume": "300 ml", "price": 3500, "bashing": 2, diff --git a/data/json/items/melee/spears_and_polearms.json b/data/json/items/melee/spears_and_polearms.json index 794c1e8e2048e..aabc9260b3f6c 100644 --- a/data/json/items/melee/spears_and_polearms.json +++ b/data/json/items/melee/spears_and_polearms.json @@ -8,7 +8,7 @@ "description": "A simple wood pole with one end sharpened.", "material": "wood", "volume": "1250 ml", - "weight": 900, + "weight": "900 g", "bashing": 4, "cutting": 8, "to_hit": 1, @@ -21,7 +21,7 @@ "id": "spear_wood", "name": "wooden spear", "description": "A stout pole with an improvised grip and a fire-hardened point.", - "weight": 898, + "weight": "898 g", "to_hit": 1, "color": "brown", "symbol": "/", @@ -40,7 +40,7 @@ "category": "weapons", "name": "makeshift war scythe", "description": "This farming tool has been modified into an improvised weapon by rotating its blade 90 degrees, transforming it into a deadly giant blade on the end of a stick. However it's quite fragile.", - "weight": 3013, + "weight": "3013 g", "volume": "3250 ml", "price": 16000, "bashing": 2, @@ -58,7 +58,7 @@ "category": "weapons", "name": "spike on a stick", "description": "A flimsy pole made of wood with a basic metal spike tied to it. It's barely sharp, and crudely constructed, but it will keep the zombies out of arm's reach until you can find something better.", - "weight": 1487, + "weight": "1487 g", "volume": "1250 ml", "price": 400, "to_hit": 1, @@ -77,7 +77,7 @@ "category": "weapons", "name": "simple knife spear", "description": "A flimsy pole made of wood with a knife bound to the end. It's long enough to slice from a distance, but the knife isn't that well attached. You could take a bit more time to carefully split the shaft and attach the knife blade more permanently.", - "weight": 1487, + "weight": "1487 g", "volume": "1250 ml", "price": 700, "to_hit": 1, @@ -96,7 +96,7 @@ "category": "weapons", "name": "knife spear", "description": "A sturdy wooden pole that has been carefully split and reinforced. At the split point, a sharp blade has been bolted into place and reinforced with layers of sturdy wrapped bindings.", - "weight": 1487, + "weight": "1487 g", "volume": "1250 ml", "price": 12000, "to_hit": 1, @@ -115,7 +115,7 @@ "category": "weapons", "name": "homemade halfpike", "description": "A short do-it-yourself spear made out of a smooth wooden shaft with a metal spike seated and bound into place at its tip. Its functional grip and decent construction makes it a usable, if not effective, weapon.", - "weight": 1814, + "weight": "1814 g", "volume": "1500 ml", "price": 1400, "to_hit": 1, @@ -132,14 +132,13 @@ "id": "spear_forked", "name": "forked spear", "description": "A wooden pole with three spikes tied to it and decent grip. It's specialized for catching weapons, and not intended for extended use in combat.", - "weight": 1650, - "//": "That's strictly the weight of three spikes. Shaft is free, be happy.", + "weight": "1650 g", + "//": "Block 2 until we re-implement defensive-disarm, I'm afraid.", "to_hit": 1, "color": "brown", "symbol": "/", "material": [ "wood", "steel" ], "techniques": [ "WBLOCK_2", "DEF_DISARM" ], - "//": "Block 2 until we re-implement defensive-disarm, I'm afraid.", "volume": "1500 ml", "bashing": 6, "cutting": 17, @@ -152,7 +151,7 @@ "id": "spear_copper", "name": "copper spear", "description": "A stout wooden pole with a spearhead worked from copper.", - "weight": 1450, + "weight": "1450 g", "to_hit": 1, "color": "light_red", "symbol": "/", @@ -170,7 +169,7 @@ "id": "spear_steel", "name": "steel spear", "description": "A stout wooden pole with a hand-forged steel spearhead.", - "weight": 1498, + "weight": "1498 g", "to_hit": 2, "color": "light_gray", "symbol": "/", @@ -189,7 +188,7 @@ "//": "stats of original steel spear, after it was made into a less makeshift version", "name": "pipe spear", "description": "A stout metal pole with a sharp point.", - "weight": 1398, + "weight": "1398 g", "to_hit": 1, "color": "light_gray", "symbol": "/", @@ -212,7 +211,7 @@ "price": 500, "price_postapoc": 2000, "material": "iron", - "weight": 908, + "weight": "908 g", "volume": "1500 ml", "bashing": 14, "techniques": [ "WBLOCK_1" ], @@ -225,7 +224,7 @@ "id": "qiang", "name": "qiang", "description": "An ancient Chinese spear, typically with a tassel just below the spearhead. One of the four major weapons in folklore, alongside the dao sabre, jian sword, and gun staff.", - "weight": 1398, + "weight": "1398 g", "to_hit": 2, "color": "light_gray", "symbol": "/", @@ -249,7 +248,7 @@ "material": [ "wood", "steel" ], "flags": [ "DURABLE_MELEE", "REACH_ATTACK", "NONCONDUCTIVE", "SHEATH_SPEAR", "ALWAYS_TWOHAND" ], "techniques": [ "WBLOCK_1", "WIDE", "SWEEP" ], - "weight": 3175, + "weight": "3175 g", "volume": "3750 ml", "bashing": 16, "cutting": 36, @@ -267,7 +266,7 @@ "material": [ "wood", "aluminum" ], "flags": [ "REACH_ATTACK", "NONCONDUCTIVE", "SHEATH_SPEAR", "ALWAYS_TWOHAND" ], "techniques": [ "WBLOCK_1", "SWEEP" ], - "weight": 1644, + "weight": "1644 g", "volume": "3750 ml", "bashing": 15, "cutting": 2, @@ -286,7 +285,7 @@ "qualities": [ [ "CUT", 1 ], [ "BUTCHER", -28 ] ], "flags": [ "DURABLE_MELEE", "REACH_ATTACK", "NONCONDUCTIVE", "SHEATH_SPEAR", "ALWAYS_TWOHAND" ], "techniques": [ "WIDE", "WBLOCK_1" ], - "weight": 2100, + "weight": "2100 g", "volume": "2500 ml", "bashing": 8, "cutting": 30, @@ -298,7 +297,7 @@ "name": "naginata", "name_plural": "naginata", "description": "A sturdy polearm with a curved blade, made in the same manner as the katana and other Japanese blades. Occasionally used by samurai in early periods, or by their wives in defense of the household.", - "weight": 1700, + "weight": "1700 g", "to_hit": 2, "color": "light_gray", "symbol": "/", @@ -317,7 +316,7 @@ "name": "naginata", "name_plural": "naginata", "description": "A sturdy polearm with a curved blade, made in the same manner as the katana and other Japanese blades. This one has a bit of wiggle to its blade and feels a bit shoddily made.", - "weight": 1700, + "weight": "1700 g", "color": "light_gray", "symbol": "/", "material": [ "budget_steel", "wood" ], @@ -336,7 +335,7 @@ "name": "naginata", "name_plural": "naginata", "description": "This is a dull, slightly floppy replica of a Japanese polearm with a curved blade. With a little difficulty, you could use it administer a solid slap from a distance.", - "weight": 1400, + "weight": "1400 g", "color": "light_gray", "symbol": "/", "material": [ "aluminum", "wood" ], @@ -354,7 +353,7 @@ "name": "survivor naginata", "name_plural": "survivor naginata", "description": "This sturdy steel shaft with a sword blade at the end is good for both slashing and stabbing.", - "weight": 1700, + "weight": "1700 g", "to_hit": 2, "color": "light_gray", "symbol": "/", @@ -373,7 +372,7 @@ "id": "javelin", "name": "wooden javelin", "description": "A fire-hardened wooden spear honed to a sharper point. The grip area has been carved and covered for better grip.", - "weight": 600, + "weight": "600 g", "to_hit": 2, "color": "brown", "symbol": "/", @@ -392,7 +391,7 @@ "id": "javelin_iron", "name": "iron javelin", "description": "An iron-tipped wooden throwing spear. The grip area has been carved and covered for better grip.", - "weight": 960, + "weight": "960 g", "to_hit": 2, "color": "light_gray", "symbol": "/", @@ -412,7 +411,7 @@ "category": "weapons", "name": "pike", "description": "This is a medieval weapon consisting of a wood shaft tipped with an iron spearhead.", - "weight": 2500, + "weight": "2500 g", "volume": "3500 ml", "price": 40000, "to_hit": -2, @@ -431,7 +430,7 @@ "category": "weapons", "name": "pike", "description": "This is a dull, cheaply made replica of a medieval weapon consisting of a wood shaft tipped with an iron spearhead.", - "weight": 2000, + "weight": "2000 g", "volume": "3500 ml", "price": 4000, "to_hit": -2, @@ -451,7 +450,7 @@ "category": "weapons", "name": "pike", "description": "This is a medieval weapon consisting of a wood shaft tipped with an iron spearhead. The head seems to be pretty dull, and the whole thing feels poorly made.", - "weight": 2500, + "weight": "2500 g", "volume": "3500 ml", "price": 40000, "to_hit": -2, @@ -470,7 +469,7 @@ "id": "scythe_war", "name": "war scythe", "description": "A pole weapon with a curving single-edged blade. Its blade bears some superficial resemblance to that of an agricultural scythe from which it likely evolved.", - "weight": 3013, + "weight": "3013 g", "volume": "3250 ml", "price": 16000, "to_hit": 1, @@ -489,7 +488,7 @@ "name": "dory", "name_plural": "dories", "description": "A well-made spear with a bronze head, Greek in origin.", - "weight": 1598, + "weight": "1598 g", "volume": "3500 ml", "price": 10000, "to_hit": 2, @@ -509,7 +508,7 @@ "name_plural": "ji", "//": "Couldn't find a good way to pluralize the transliteration.", "description": "This is a bronze polearm that originated in the Shang dynasty of China, if not earlier. It combines a spear head with the perpendicular blade of the earlier ge or dagger-axe.", - "weight": 3175, + "weight": "3175 g", "volume": "3750 ml", "price": 50000, "to_hit": 2, @@ -526,7 +525,7 @@ "type": "GENERIC", "name": "stone spear", "description": "A stout wooden pole with a sharp stone spearhead.", - "weight": 1098, + "weight": "1098 g", "volume": "1250 ml", "price": 1300, "to_hit": 1, diff --git a/data/json/items/melee/swords_and_blades.json b/data/json/items/melee/swords_and_blades.json index 47b6c82c76e90..259d620d2e016 100644 --- a/data/json/items/melee/swords_and_blades.json +++ b/data/json/items/melee/swords_and_blades.json @@ -8,7 +8,7 @@ "description": "A two by four with a cross guard and whittled down point; not much for slashing, but much better than your bare hands.", "material": "wood", "volume": "1250 ml", - "weight": 600, + "weight": "600 g", "bashing": 12, "cutting": 1, "to_hit": 1, @@ -24,7 +24,7 @@ "description": "The nail sword, or nord for short. This wooden sword has a dozen nails sticking at jagged angles from edge of the blade, making it much better at chopping than slashing.", "material": "wood", "volume": "1750 ml", - "weight": 648, + "weight": "648 g", "bashing": 12, "cutting": 4, "techniques": [ "WBLOCK_1" ] @@ -38,7 +38,7 @@ "description": "Several bits of thin scrap metal crudely beat into the semblance of an edge over a wooden sword. The added weight is unbalanced, but the jagged edge offers a good bit of slashing power.", "material": "wood", "volume": "2 L", - "weight": 1100, + "weight": "1100 g", "bashing": 6, "cutting": 14, "to_hit": -1, @@ -52,7 +52,7 @@ "category": "weapons", "name": "switchblade", "description": "This is a long and thin knife with a spring-loaded blade that rests inside the handle while not in use.", - "weight": 464, + "weight": "464 g", "volume": 0, "price": 2000, "to_hit": -2, @@ -70,7 +70,7 @@ "name": "folding knife", "name_plural": "folding knives", "description": "This is a small folding knife, with a locking blade and a pocket clip. Not as good a weapon as a solid fixed-blade knife, but better than a penknife.", - "weight": 256, + "weight": "256 g", "volume": "250 ml", "price": 1500, "bashing": 1, @@ -88,7 +88,7 @@ "name": "combat knife", "name_plural": "combat knives", "description": "This is a military combat knife. It is light and extremely sharp, and could be deadly in either the right hands or when attached as a bayonet.", - "weight": 558, + "weight": "558 g", "volume": "500 ml", "price": 10000, "to_hit": 1, @@ -116,7 +116,7 @@ "name_plural": "hunting knives", "//": "Highest non-powertool butchering quality. It's made for skinning and butchering game, which is what you're generally doing.", "description": "Commonly used by hunters, this single-edge sheath knife is designed for cutting and skinning game rather than combat.", - "weight": 390, + "weight": "390 g", "volume": "250 ml", "price": 4000, "cutting": 16, @@ -134,7 +134,7 @@ "name_plural": "survival knives", "//": "This isn't really supposed to be a very good knife, or a very good saw. It's more for looking scary.", "description": "This massive knife features a hollow handle with a compass built into the pommel and a row of fearsome looking saw teeth along the back of its blade.", - "weight": 612, + "weight": "612 g", "volume": "1 L", "price": 2000, "bashing": 4, @@ -153,7 +153,7 @@ "name": "RM42 fighting knife", "name_plural": "RM42 fighting knives", "description": "This sturdy matte black Rivtech combat dagger features a long and slim double-edged blade with a spear-point and a distinctive slip-resistant grip which can also be used to affix it to a suitable firearm. Originally manufactured for the military, it was very popular in films and among collectors due to its fearsome appearance.", - "weight": 188, + "weight": "188 g", "volume": "750 ml", "price": 45000, "to_hit": 2, @@ -180,7 +180,7 @@ "name_plural": "Swiss Army knives", "//": "The swiss army knife is a bit more of a knife than a toolkit.", "description": "An iconic pocket knife imported from Europe. Its red plastic handle conceals many small tools.", - "weight": 246, + "weight": "246 g", "volume": 0, "price": 3000, "to_hit": -2, @@ -198,7 +198,7 @@ "name": "trench knife", "name_plural": "trench knives", "description": "This stout combat knife features a steel guard to protect the user's knuckles. The guard can also be used for striking or blocking, and the knife can also be used to butcher corpses.", - "weight": 608, + "weight": "608 g", "volume": "500 ml", "price": 11000, "to_hit": 1, @@ -217,7 +217,7 @@ "name": "makeshift knife", "name_plural": "makeshift knives", "description": "A knife consisting of a long, somewhat sharpened, spike and a tightly wrapped rag as a handle. It makes a good melee weapon.", - "weight": 550, + "weight": "550 g", "volume": "500 ml", "price": 0, "to_hit": -1, @@ -235,7 +235,7 @@ "category": "weapons", "name": "makeshift machete", "description": "This is a large blade that has had a portion of the handle wrapped in duct tape, making it easier to wield as a rough machete.", - "weight": 581, + "weight": "581 g", "volume": "2 L", "price": 1000, "to_hit": 1, @@ -254,7 +254,7 @@ "category": "weapons", "name": "machete", "description": "This huge steel knife makes an excellent tool for cutting down large vegetation or other 'obstacles.'", - "weight": 538, + "weight": "538 g", "volume": "1 L", "price": 2800, "to_hit": 2, @@ -274,7 +274,7 @@ "name": "No. 9", "name_plural": "No. 9's", "description": "This huge steel knife has been modified with a fuel tank, insulated handguard, and ignition system. When filled with gasoline, a system of torches heats the blade, burning your target.", - "weight": 1814, + "weight": "1814 g", "volume": "1500 ml", "price": 28000, "to_hit": 1, @@ -306,7 +306,7 @@ "name": "No. 9", "name_plural": "No. 9's", "description": "This huge steel knife has been modified with a fuel tank, insulated handguard, and ignition system. The blade is glowing with heat, making it a great plant scorcher and nightlight.", - "weight": 1814, + "weight": "1814 g", "volume": "1500 ml", "price": 28000, "to_hit": 1, @@ -343,7 +343,7 @@ "category": "weapons", "name": "cavalry saber", "description": "This is a curved sword associated with cavalry from the Early Modern period onwards. Lightweight but a deadly slashing weapon.", - "weight": 910, + "weight": "910 g", "volume": "1250 ml", "price": 97000, "to_hit": 2, @@ -363,7 +363,7 @@ "name": "kris", "name_plural": "krises", "description": "This wavy bladed dagger comes from Southeast Asia. The design of the blade causes it to make broad, painful wounds.", - "weight": 558, + "weight": "558 g", "volume": "750 ml", "price": 9000, "to_hit": 1, @@ -382,7 +382,7 @@ "category": "weapons", "name": "kukri", "description": "This versatile implement is a modern take on a traditional weapon that originated in Nepal. Featuring a heavy blade with an inwardly curved edge, it is used as both a tool and as a weapon.", - "weight": 450, + "weight": "450 g", "volume": "750 ml", "price": 8000, "to_hit": 1, @@ -407,7 +407,7 @@ "material": "steel", "flags": [ "DURABLE_MELEE", "SHEATH_SWORD" ], "techniques": [ "WBLOCK_2" ], - "weight": 800, + "weight": "800 g", "volume": "2 L", "bashing": 8, "cutting": 30, @@ -427,7 +427,7 @@ "material": "budget_steel", "flags": [ "SHEATH_SWORD" ], "techniques": [ "WBLOCK_2" ], - "weight": 800, + "weight": "800 g", "volume": "2 L", "bashing": 7, "cutting": 24, @@ -448,7 +448,7 @@ "material": "aluminum", "flags": "SHEATH_SWORD", "techniques": [ "WBLOCK_2" ], - "weight": 414, + "weight": "414 g", "volume": "2 L", "bashing": 8, "cutting": 2, @@ -466,7 +466,7 @@ "material": "iron", "techniques": [ "WBLOCK_2" ], "flags": [ "DURABLE_MELEE", "SHEATH_SWORD" ], - "weight": 1133, + "weight": "1133 g", "volume": "2 L", "bashing": 6, "cutting": 30, @@ -485,7 +485,7 @@ "material": "budget_steel", "techniques": [ "WBLOCK_2" ], "flags": [ "SHEATH_SWORD" ], - "weight": 1133, + "weight": "1133 g", "volume": "2 L", "bashing": 5, "cutting": 24, @@ -505,7 +505,7 @@ "material": "aluminum", "techniques": [ "WBLOCK_2" ], "flags": "SHEATH_SWORD", - "weight": 586, + "weight": "586 g", "volume": "2 L", "bashing": 6, "cutting": 2, @@ -523,7 +523,7 @@ "material": "steel", "techniques": [ "WBLOCK_2", "PRECISE" ], "flags": [ "STAB", "DURABLE_MELEE", "SHEATH_SWORD" ], - "weight": 1814, + "weight": "1814 g", "volume": "2750 ml", "bashing": 4, "cutting": 38, @@ -543,7 +543,7 @@ "material": "budget_steel", "techniques": [ "WBLOCK_2", "PRECISE" ], "flags": "SHEATH_SWORD", - "weight": 1814, + "weight": "1814 g", "volume": "2750 ml", "bashing": 4, "cutting": 30, @@ -562,7 +562,7 @@ "material": "aluminum", "techniques": [ "WBLOCK_2", "PRECISE" ], "flags": "SHEATH_SWORD", - "weight": 939, + "weight": "939 g", "volume": "2750 ml", "bashing": 4, "cutting": 2, @@ -580,7 +580,7 @@ "material": "steel", "flags": [ "DURABLE_MELEE", "SHEATH_SWORD" ], "techniques": [ "WBLOCK_2" ], - "weight": 1814, + "weight": "1814 g", "volume": "2750 ml", "bashing": 10, "cutting": 38, @@ -599,7 +599,7 @@ "material": "budget_steel", "flags": [ "SHEATH_SWORD" ], "techniques": [ "WBLOCK_2" ], - "weight": 1814, + "weight": "1814 g", "volume": "2750 ml", "bashing": 10, "cutting": 30, @@ -619,7 +619,7 @@ "material": "aluminum", "flags": "SHEATH_SWORD", "techniques": [ "WBLOCK_2" ], - "weight": 939, + "weight": "939 g", "volume": "2750 ml", "bashing": 10, "cutting": 2, @@ -637,7 +637,7 @@ "material": "steel", "flags": [ "DURABLE_MELEE", "SHEATH_SWORD" ], "techniques": [ "WBLOCK_2" ], - "weight": 1360, + "weight": "1360 g", "volume": "2 L", "bashing": 14, "cutting": 31, @@ -657,7 +657,7 @@ "material": "aluminum", "flags": "SHEATH_SWORD", "techniques": [ "WBLOCK_2" ], - "weight": 704, + "weight": "704 g", "volume": "2 L", "bashing": 14, "cutting": 2, @@ -675,7 +675,7 @@ "material": "budget_steel", "flags": [ "SHEATH_SWORD" ], "techniques": [ "WBLOCK_2" ], - "weight": 2721, + "weight": "2721 g", "volume": "2 L", "bashing": 12, "cutting": 25, @@ -690,7 +690,7 @@ "name": "xiphos", "name_plural": "xiphoses", "description": "A bronze sword of ancient Greek origin, wielded as a sidearm to the dory spear.", - "weight": 800, + "weight": "800 g", "volume": "2 L", "price": 12000, "to_hit": 2, @@ -710,7 +710,7 @@ "name": "khopesh", "name_plural": "khopeshes", "description": "This ancient bronze weapon features a curved, sickle-like blade sharpened on the outside edge. Associated with the New Kingdom period of ancient Egypt, it was designed mainly to hack through the light armor common to the region.", - "weight": 750, + "weight": "750 g", "volume": "1750 ml", "price": 12000, "to_hit": 1, @@ -730,7 +730,7 @@ "name": "dao", "name_plural": "dao", "description": "An ancient Chinese sword consisting of a curved blade and a guard with a cupped design. Existing since the Shang dynasty, this one is made of bronze. One of the four major weapons in folklore, alongside the jian sword, qiang spear, and gun staff.", - "weight": 850, + "weight": "850 g", "volume": "1750 ml", "price": 12500, "to_hit": 2, @@ -749,7 +749,7 @@ "category": "weapons", "name": "survivor machete", "description": "This common gardening tool has been customized and rebalanced to improve its performance as a weapon.", - "weight": 565, + "weight": "565 g", "volume": "1 L", "price": 2800, "to_hit": 2, @@ -768,7 +768,7 @@ "category": "weapons", "name": "sword bayonet", "description": "A sword bayonet is a large slashing weapon that can be attached to the front of a firearm or crossbow converting it into a pike.", - "weight": 923, + "weight": "923 g", "volume": "1750 ml", "price": 25000, "to_hit": 1, @@ -794,7 +794,7 @@ "category": "weapons", "name": "tanto", "description": "Long Japanese knives like this more-modern remake were the samurai's backup weapon, before the advent of the larger wakizashi. It's still a deadly blade, even if it's smaller than its more famous relatives.", - "weight": 558, + "weight": "558 g", "volume": "500 ml", "price": 18000, "to_hit": 2, @@ -814,7 +814,7 @@ "name": "wakizashi", "name_plural": "wakizashi", "description": "This is a comparatively-common Japanese short sword. Smaller and lighter than a katana, but still effective in combat.", - "weight": 835, + "weight": "835 g", "volume": "1500 ml", "price": 17800, "to_hit": 1, @@ -835,7 +835,7 @@ "name_plural": "flammenschwerter (aus)", "//": "All of this is SUPPOSED to be in German.", "description": "Ein großes zweihändiges Schwert aus Deutschland, an dessen Klinge sich, unter Zuführung von Benzin, eine anhaltende Flamme erzeugen lässt. Es ist eine sehr mächtige Waffe.", - "weight": 3400, + "weight": "3400 g", "volume": "3750 ml", "price": 160000, "bashing": 17, @@ -865,7 +865,7 @@ "name_plural": "flammenschwerter", "//": "All of this is SUPPOSED to be in German.", "description": "Ein großes zweihändiges Schwert aus Deutschland, an dessen Klinge sich, unter Zuführung von Benzin, eine anhaltende Flamme erzeugen lässt. Es ist eine sehr mächtige Waffe.", - "weight": 3400, + "weight": "3400 g", "volume": "3750 ml", "price": 160000, "bashing": 17, @@ -897,7 +897,7 @@ "category": "weapons", "name": "zweihänder", "description": "This is a huge two-handed sword from Germany. It packs a real wallop.", - "weight": 3176, + "weight": "3176 g", "volume": "3250 ml", "price": 160000, "to_hit": 1, @@ -916,7 +916,7 @@ "name": "kirpan", "description": "A ceremonial dagger carried by Sikh men. This one is sharp and could be an effective weapon.", "looks_like": "kukri", - "weight": 374, + "weight": "374 g", "volume": "500 ml", "price": 1800, "to_hit": 1, @@ -935,7 +935,7 @@ "name": "kirpan", "description": "A ceremonial dagger carried by Sikh men. This one is not particularly well made.", "looks_like": "kirpan", - "weight": 374, + "weight": "374 g", "volume": "500 ml", "price": 900, "bashing": 1, @@ -953,7 +953,7 @@ "category": "weapons", "name": "tanto", "description": "This is a dull, cheaply made replica of a long Japanese knife, typically used as a samurai's backup weapon.", - "weight": 374, + "weight": "374 g", "volume": "500 ml", "price": 1800, "to_hit": 1, @@ -973,7 +973,7 @@ "category": "weapons", "name": "tanto", "description": "Long Japanese knives like this more-modern remake were the samurai's backup weapon, before the advent of the larger wakizashi. This one doesn't feel well-balanced", - "weight": 3, + "weight": "3 g", "volume": "500 ml", "price": 18000, "to_hit": 2, @@ -994,7 +994,7 @@ "name": "nodachi", "name_plural": "nodachi", "description": "This is a huge, curved, two-handed sword from Japan. It is surprisingly light for its size.", - "weight": 2822, + "weight": "2822 g", "volume": "3250 ml", "price": 150000, "to_hit": 1, @@ -1020,7 +1020,7 @@ "material": "aluminum", "flags": [ "SHEATH_SWORD", "ALWAYS_TWOHAND" ], "techniques": [ "WBLOCK_1", "RAPID", "WIDE" ], - "weight": 1882, + "weight": "1882 g", "volume": "3250 ml", "bashing": 2, "cutting": 8, @@ -1040,7 +1040,7 @@ "material": "budget_steel", "flags": [ "SHEATH_SWORD", "ALWAYS_TWOHAND" ], "techniques": [ "WBLOCK_1", "RAPID", "WIDE" ], - "weight": 1882, + "weight": "1882 g", "volume": "3250 ml", "bashing": 5, "cutting": 15, @@ -1057,7 +1057,7 @@ "price": 2000, "price_postapoc": 0, "material": "steel", - "weight": 450, + "weight": "450 g", "volume": "1250 ml", "bashing": 1, "cutting": 2, @@ -1075,7 +1075,7 @@ "price": 2000, "price_postapoc": 1000, "material": "steel", - "weight": 650, + "weight": "650 g", "volume": "1250 ml", "bashing": 3, "cutting": 7, @@ -1093,7 +1093,7 @@ "price": 2000, "price_postapoc": 0, "material": "steel", - "weight": 400, + "weight": "400 g", "volume": "1250 ml", "bashing": 1, "cutting": 6, @@ -1111,7 +1111,7 @@ "price": 2000, "price_postapoc": 1000, "material": [ "wood" ], - "weight": 200, + "weight": "200 g", "volume": "1531 ml", "bashing": 3, "to_hit": 2, @@ -1136,7 +1136,7 @@ "price": 2000, "price_postapoc": 1000, "material": [ "steel" ], - "weight": 650, + "weight": "650 g", "volume": "1200 ml", "bashing": 2, "cutting": 25, @@ -1150,7 +1150,7 @@ "category": "weapons", "name": "broadsword", "description": "This is an early modern sword seeing use in the 16th, 17th, and 18th centuries. Called 'broad' to contrast with the slimmer rapiers.", - "weight": 1133, + "weight": "1133 g", "volume": "1750 ml", "price": 120000, "to_hit": 2, @@ -1174,7 +1174,7 @@ "material": "budget_steel", "flags": [ "SHEATH_SWORD" ], "techniques": "WBLOCK_2", - "weight": 1133, + "weight": "1133 g", "volume": "1750 ml", "bashing": 7, "cutting": 29, @@ -1189,7 +1189,7 @@ "name": "firebrand (off)", "name_plural": "firebrands (off)", "description": "This is a combination of two Dark Age conflict-resolution classics, the broadsword and the torch. Use to light it up and show those heathen zombies who's Lord around here.", - "weight": 1474, + "weight": "1474 g", "volume": "2250 ml", "price": 120000, "to_hit": 1, @@ -1247,7 +1247,7 @@ "material": "aluminum", "techniques": "WBLOCK_2", "flags": "SHEATH_SWORD", - "weight": 634, + "weight": "634 g", "volume": "1750 ml", "bashing": 8, "cutting": 2, @@ -1265,7 +1265,7 @@ "price": 96000, "material": "budget_steel", "techniques": "WBLOCK_2", - "weight": 955, + "weight": "955 g", "volume": "1250 ml", "bashing": 6, "cutting": 25, @@ -1280,7 +1280,7 @@ "category": "weapons", "name": "rapier", "description": "This is a thin sword with an ornate hand guard. It looks like the preferred weapon of gentlemen and swashbucklers. Light and quick, it makes any battle a stylish battle.", - "weight": 1000, + "weight": "1000 g", "volume": "1500 ml", "price": 98000, "to_hit": 2, @@ -1299,7 +1299,7 @@ "category": "weapons", "name": "katana", "description": "This is a rare sword from Japan. Deadly against unarmored targets, and still very effective against armor.", - "weight": 1133, + "weight": "1133 g", "volume": "2 L", "price": 98000, "to_hit": 1, @@ -1324,7 +1324,7 @@ "material": "aluminum", "techniques": [ "RAPID", "WBLOCK_2" ], "flags": "SHEATH_SWORD", - "weight": 753, + "weight": "753 g", "volume": "2 L", "bashing": 10, "cutting": 3, @@ -1342,7 +1342,7 @@ "material": "budget_steel", "techniques": [ "RAPID", "WBLOCK_2" ], "flags": [ "SHEATH_SWORD" ], - "weight": 1133, + "weight": "1133 g", "volume": "2 L", "bashing": 4, "cutting": 24, @@ -1357,7 +1357,7 @@ "name": "Rising Sun", "name_plural": "Rising Suns", "description": "This is a katana with a nozzle just behind the cutting edge of the blade. People love fire, and people love katanas, so why not put them together? The gas burners attached to this blade can really turn up the heat on your foes. Use to ignite.", - "weight": 1400, + "weight": "1400 g", "volume": "2250 ml", "price": 98000, "bashing": 4, @@ -1386,7 +1386,7 @@ "name": "Rising Sun", "name_plural": "Rising Suns", "description": "This is a katana that glows with the fury and heat of the SUN! Well, okay it's not THAT hot, but getting hit with it still stings like the dickens. Use to shut off the gas.", - "weight": 1400, + "weight": "1400 g", "volume": "2250 ml", "price": 98000, "bashing": 4, @@ -1425,7 +1425,7 @@ "material": "aluminum", "flags": [ "SHEATH_SWORD", "ALWAYS_TWOHAND" ], "techniques": [ "WBLOCK_1", "WIDE", "BRUTAL", "SWEEP" ], - "weight": 3176, + "weight": "3176 g", "volume": "3250 ml", "bashing": 15, "cutting": 2, @@ -1443,7 +1443,7 @@ "material": "budget_steel", "flags": [ "SHEATH_SWORD", "ALWAYS_TWOHAND" ], "techniques": [ "WBLOCK_1", "WIDE", "BRUTAL", "SWEEP" ], - "weight": 3176, + "weight": "3176 g", "volume": "3250 ml", "bashing": 13, "cutting": 35, @@ -1463,7 +1463,7 @@ "material": "aluminum", "flags": "SHEATH_SWORD", "techniques": "WBLOCK_2", - "weight": 753, + "weight": "753 g", "volume": "1750 ml", "bashing": 10, "cutting": 2, @@ -1476,7 +1476,7 @@ "category": "weapons", "name": "cavalry saber", "description": "This is a dull, cheap replica of a curved sword associated with cavalry, from the Early Modern period onwards.", - "weight": 600, + "weight": "600 g", "volume": "1250 ml", "price": 9700, "price_postapoc": 0, @@ -1501,7 +1501,7 @@ "material": "aluminum", "techniques": [ "RAPID", "WBLOCK_2", "PRECISE" ], "flags": "SHEATH_SWORD", - "weight": 660, + "weight": "660 g", "volume": "1500 ml", "bashing": 4, "cutting": 2, @@ -1520,7 +1520,7 @@ "material": "aluminum", "techniques": [ "RAPID", "WBLOCK_2" ], "flags": "SHEATH_SWORD", - "weight": 557, + "weight": "557 g", "volume": "1500 ml", "bashing": 7, "cutting": 2, @@ -1539,7 +1539,7 @@ "material": "budget_steel", "techniques": [ "RAPID", "WBLOCK_2" ], "flags": [ "SHEATH_SWORD" ], - "weight": 835, + "weight": "835 g", "volume": "1500 ml", "bashing": 3, "cutting": 20, @@ -1559,7 +1559,7 @@ "price_postapoc": 0, "material": "aluminum", "techniques": [ "WBLOCK_1", "RAPID" ], - "weight": 558, + "weight": "558 g", "volume": "750 ml", "bashing": 2, "cutting": 2, @@ -1581,7 +1581,7 @@ "material": "steel", "flags": [ "DURABLE_MELEE", "SHEATH_SWORD", "ALWAYS_TWOHAND" ], "techniques": [ "WBLOCK_2" ], - "weight": 1766, + "weight": "1766 g", "volume": "1500 ml", "to_hit": 2, "bashing": 6, @@ -1596,7 +1596,7 @@ "name": "chainsaw lajatang (off)", "name_plural": "chainsaw lajatangs (off)", "description": "A long wooden pole with chainsaws impractically attached to both ends. The product of either genius or insanity, but not both; the weight ensures that only someone both strong and very skilled could possibly hope to use it.", - "weight": 14254, + "weight": "14254 g", "volume": "7500 ml", "price": 40000, "to_hit": -5, @@ -1632,7 +1632,7 @@ "name": "electric chainsaw lajatang (off)", "name_plural": "electric chainsaw lajatangs (off)", "description": "A long wooden pole with electric chainsaws impractically attached to both ends. The product of either genius or insanity, but not both; the weight ensures that only someone both strong and very skilled could possibly hope to use it.", - "weight": 14254, + "weight": "14254 g", "volume": "7500 ml", "price": 40000, "to_hit": -5, @@ -1672,7 +1672,7 @@ "name": "cutlass", "name_plural": "cutlasses", "description": "This is a broad saber known for its use by sailors and pirates, as its short blade is easy to handle in close quarters.", - "weight": 955, + "weight": "955 g", "volume": "1250 ml", "price": 96000, "to_hit": 2, @@ -1696,7 +1696,7 @@ "material": [ "wood", "iron" ], "techniques": [ "WBLOCK_1", "SPIN" ], "flags": [ "DURABLE_MELEE", "NONCONDUCTIVE", "ALWAYS_TWOHAND" ], - "weight": 2500, + "weight": "2500 g", "volume": "6500 ml", "bashing": 4, "cutting": 26, @@ -1710,7 +1710,7 @@ "name": "combat chainsaw (off)", "name_plural": "combat chainsaws (off)", "description": "This is a chainsaw that has been lightened, tuned, and extensively modified to be a more effective weapon. Unfortunately these modifications have rendered it much less effective as a woodcutting tool.", - "weight": 5122, + "weight": "5122 g", "volume": "2250 ml", "price": 25000, "to_hit": -3, @@ -1719,7 +1719,7 @@ "symbol": "/", "color": "light_gray", "ammo": "gasoline", - "max_charges": 1000, + "max_charges": 450, "use_action": "COMBATSAW_OFF", "techniques": [ "WBLOCK_1", "SWEEP" ], "flags": [ "ALWAYS_TWOHAND" ] @@ -1733,7 +1733,7 @@ "description": "This combat chainsaw is on, and is continuously draining gasoline. Use it to turn it off.", "to_hit": -4, "cutting": 82, - "turns_per_charge": 1, + "turns_per_charge": 4, "revert_to": "combatsaw_off", "qualities": [ [ "AXE", 3 ], [ "BUTCHER", -120 ] ], "use_action": "COMBATSAW_ON", @@ -1746,7 +1746,7 @@ "name": "electric combat chainsaw (off)", "name_plural": "electric combat chainsaws (off)", "description": "This is an electric chainsaw that has been lightened, tuned, and extensively modified to be a more effective weapon. Unfortunately these modifications have rendered it much less effective as a woodcutting tool.", - "weight": 5122, + "weight": "5122 g", "volume": "2250 ml", "price": 25000, "to_hit": -3, diff --git a/data/json/items/migration.json b/data/json/items/migration.json index 26c5316dbea45..5391d3162a283 100644 --- a/data/json/items/migration.json +++ b/data/json/items/migration.json @@ -634,6 +634,56 @@ "type": "MIGRATION", "replace": "reloaded_270win_jsp" }, + { + "id": "afs_rolling_pin", + "type": "MIGRATION", + "replace": "rolling_pin" + }, + { + "id": "afs_welding_mask", + "type": "MIGRATION", + "replace": "welding_mask" + }, + { + "id": "afs_atomic_reading_light", + "type": "MIGRATION", + "replace": "atomic_light_off" + }, + { + "id": "afs_atomic_reading_light_on", + "type": "MIGRATION", + "replace": "atomic_light" + }, + { + "id": "afs_large_storage_battery", + "type": "MIGRATION", + "replace": "large_storage_battery" + }, + { + "id": "afs_daypack", + "type": "MIGRATION", + "replace": "daypack" + }, + { + "id": "afs_ski_jacket", + "type": "MIGRATION", + "replace": "ski_jacket" + }, + { + "id": "afs_cake", + "type": "MIGRATION", + "replace": "cake2" + }, + { + "id": "afs_fried_donut_holes", + "type": "MIGRATION", + "replace": "donut_holes" + }, + { + "id": "afs_welding_mask_makeshift", + "type": "MIGRATION", + "replace": "welding_mask_crude" + }, { "id": "smg_38", "type": "MIGRATION", @@ -653,5 +703,10 @@ "id": "smg_22_mag", "type": "MIGRATION", "replace": "survivor9mm_mag" + }, + { + "id": "magbandolier", + "type": "MIGRATION", + "replace": "chestrig" } ] diff --git a/data/json/items/newspaper.json b/data/json/items/newspaper.json index 18989127cd68c..75cb276de6c1f 100644 --- a/data/json/items/newspaper.json +++ b/data/json/items/newspaper.json @@ -11,7 +11,7 @@ "description": "A scrap of paper.", "price": 0, "material": "paper", - "weight": 3, + "weight": "3 g", "volume": 0 }, { @@ -27,7 +27,7 @@ "price": 0, "material": "paper", "flags": "TRADER_AVOID", - "weight": 3, + "weight": "3 g", "volume": 0 }, { @@ -43,7 +43,7 @@ "price": 0, "material": "paper", "flags": "TRADER_AVOID", - "weight": 3, + "weight": "3 g", "volume": 0 }, { @@ -59,7 +59,7 @@ "price": 0, "material": "paper", "flags": "TRADER_AVOID", - "weight": 3, + "weight": "3 g", "volume": 0 }, { @@ -74,7 +74,7 @@ "description": "A single sheet of newspaper broadsheet. It is possibly one of the last issues printed before New England was overwhelmed. Most of the information on there is terribly trivial, or out of date, but one thing catches your eye briefly.", "price": 0, "material": "paper", - "weight": 3, + "weight": "3 g", "volume": 0 }, { @@ -89,7 +89,7 @@ "description": "A single sheet of newspaper broadsheet. It seems to date from several years ago, and you've NO idea how it lasted this long. Most of the information on there is terribly trivial, or out of date, but one thing catches your eye briefly.", "price": 0, "material": "paper", - "weight": 3, + "weight": "3 g", "volume": 0 }, { @@ -104,7 +104,7 @@ "description": "A single sheet of newspaper broadsheet. It seems to date from a few years ago--amazing it has lasted this long. Most of the information on there is terribly trivial, or out of date, but one thing catches your eye briefly.", "price": 0, "material": "paper", - "weight": 3, + "weight": "3 g", "volume": 0 }, { @@ -119,7 +119,7 @@ "description": "A single sheet of newspaper broadsheet. It was printed more than a year ago. Most of the information on there is terribly trivial, or out of date, but one thing catches your eye briefly.", "price": 0, "material": "paper", - "weight": 3, + "weight": "3 g", "volume": 0 }, { @@ -134,7 +134,7 @@ "description": "A single sheet of newspaper broadsheet. It was printed in the months leading up to the Cataclysm. Most of the information on there is terribly trivial, or out of date, but one thing catches your eye briefly.", "price": 0, "material": "paper", - "weight": 3, + "weight": "3 g", "volume": 0 }, { @@ -149,7 +149,7 @@ "description": "A single sheet of newspaper broadsheet. It was printed in the weeks leading up to the Cataclysm. Most of the information on there is terribly trivial, or out of date, but one thing catches your eye briefly.", "price": 0, "material": "paper", - "weight": 3, + "weight": "3 g", "volume": 0 }, { @@ -164,7 +164,23 @@ "description": "A folded glossy handout that appears to be an introduction to living in a massive underground complex.", "price": 0, "material": "paper", - "weight": 1, + "weight": "1 g", + "volume": 0 + }, + { + "type": "GENERIC", + "id": "death_note", + "category": "books", + "symbol": ",", + "color": "white", + "name": "note", + "snippet_category": "death_note", + "description": "A scrap of paper. Something's written on it, scrawled in bad handwriting.", + "price": 0, + "looks_like": "survnote", + "material": "paper", + "flags": "TRADER_AVOID", + "weight": "3 g", "volume": 0 } ] diff --git a/data/json/items/obsolete.json b/data/json/items/obsolete.json index 189ff12890ff6..1112543287171 100644 --- a/data/json/items/obsolete.json +++ b/data/json/items/obsolete.json @@ -5,7 +5,7 @@ "name": "anesthetic kit", "category": "chems", "description": "A kit for inducing anesthesia for surgery, containing specialized canisters with a variety of powerful hypnotic, analgetic, and stimulative drugs. It's intended for use in specialized medical equipment, and can't be administered manually.", - "weight": 100, + "weight": "100 g", "volume": "250 ml", "price": 50000, "ammo_type": "components", @@ -21,7 +21,7 @@ "type": "GUNMOD", "name": "barrel extension", "description": "A longer barrel increases the muzzle velocity of a firearm, contributing to both accuracy and damage but reduces portability and slows aiming.", - "weight": 426, + "weight": "426 g", "volume": "1 L", "price": 20000, "to_hit": 2, @@ -53,7 +53,7 @@ "type": "GUNMOD", "name": "rifled barrel", "description": "Rifling a shotgun barrel is mainly done in order to improve its accuracy when firing slugs. The rifling makes the gun less suitable for shot, however.", - "weight": 226, + "weight": "226 g", "volume": "500 ml", "integral_volume": 0, "price": 22000, @@ -73,7 +73,7 @@ "type": "GUNMOD", "name": "rapid blowback", "description": "An improved blowback mechanism makes your firearm's automatic fire faster, at the cost of reduced accuracy and increased noise.", - "weight": 114, + "weight": "114 g", "volume": "250 ml", "integral_volume": 0, "price": 70000, @@ -93,7 +93,7 @@ "type": "GUNMOD", "name": "auto-fire mechanism", "description": "A simple mechanism that converts a pistol to a selective fire weapon with a burst size of three rounds. However it reduces accuracy and increases noise.", - "weight": 113, + "weight": "113 g", "volume": "250 ml", "integral_volume": 0, "price": 65000, @@ -115,7 +115,7 @@ "id": "autofire_654", "name": "handmade auto-fire mechanism", "location": "mechanism", - "weight": 250, + "weight": "250 g", "color": "red", "mode_modifier": [ [ "AUTO", "auto", 8 ] ], "loudness_modifier": 1, @@ -135,7 +135,7 @@ "type": "GUNMOD", "name": ".22 caliber conversion kit", "description": "Replacing several key parts of a 9x19mm, .38, .40, 5.7mm, 4.6mm, 7.62x39mm or .223 firearm converts it to a .22 firearm. The conversion results in a slight reduction to accuracy.", - "weight": 114, + "weight": "114 g", "volume": "250 ml", "integral_volume": 0, "price": 32000, @@ -156,7 +156,7 @@ "type": "GUNMOD", "name": ".223 caliber conversion kit", "description": "This kit is used to convert a shotgun, 5.45x39mm, 7.62x39mm, .30-06, or .308 rifle to the popular, accurate, and lighter .223 caliber. The conversion results in slight reductions to both accuracy and ammo capacity.", - "weight": 114, + "weight": "114 g", "volume": "500 ml", "integral_volume": 0, "price": 50000, @@ -177,7 +177,7 @@ "type": "GUNMOD", "name": ".308 caliber conversion kit", "description": "This kit is used to convert a shotgun or 7.62x39mm, .223 or .30-06 rifle to the popular and powerful .308 caliber. The conversion results in reduced ammo capacity and a slight reduction to accuracy.", - "weight": 114, + "weight": "114 g", "volume": "500 ml", "integral_volume": 0, "price": 52000, @@ -198,7 +198,7 @@ "type": "GUNMOD", "name": ".45 caliber conversion kit", "description": "Replacing several key parts of a 9x19mm, .38, .40 or .44 firearm converts it to a .45 firearm. The conversion results in a slight reduction to accuracy.", - "weight": 226, + "weight": "226 g", "volume": "250 ml", "integral_volume": 0, "price": 48000, @@ -219,7 +219,7 @@ "type": "GUNMOD", "name": "4.6mm caliber conversion kit", "description": "A conversion kit produced by Heckler and Koch, used to convert .22, 9x19mm, or .38 firearms to their proprietary 4.6x30mm, a round designed for accuracy and armor penetration.", - "weight": 114, + "weight": "114 g", "volume": "250 ml", "integral_volume": 0, "price": 46000, @@ -240,7 +240,7 @@ "type": "GUNMOD", "name": "5.7mm caliber conversion kit", "description": "A conversion kit produced by FN Herstal, used to convert .22, 9x19mm, or .38 firearms to their proprietary 5.7x28mm, a round designed for accuracy and armor penetration.", - "weight": 114, + "weight": "114 g", "volume": "250 ml", "integral_volume": 0, "price": 46000, @@ -261,7 +261,7 @@ "type": "GUNMOD", "name": "9x19mm caliber conversion kit", "description": "Replacing several key parts of a 9x18mm, .38, .40, .44 or .45 firearm converts it to a 9x19mm firearm. The conversion results in a slight reduction to accuracy.", - "weight": 114, + "weight": "114 g", "volume": "250 ml", "integral_volume": 0, "price": 42000, @@ -291,7 +291,7 @@ "type": "GUNMOD", "name": "belt feed adapter", "description": "A kit providing the necessary parts for permanently converting a firearm from magazine to belt-feed. Guaranteed to void your warranty.", - "weight": 950, + "weight": "950 g", "volume": "750 ml", "integral_volume": "250 ml", "price": 32000, @@ -324,7 +324,7 @@ "type": "GUNMOD", "name": "tuned mechanism", "description": "A set of finely tuned internal components which increase the precision and reliably of a firearm.", - "weight": 120, + "weight": "120 g", "volume": "250 ml", "integral_volume": 0, "price": 2500, @@ -345,7 +345,7 @@ "type": "GUN", "name": "spraycan flamethrower", "description": "A favorite of hooligans around the world, this lighter duct-taped to a spray can is probably as dangerous to the user as anyone else. The nozzle has been crudely modified to disperse gasoline, and a small pump attached to the side allows for repressurization, though this process takes a few minutes.", - "weight": 451, + "weight": "451 g", "volume": "500 ml", "price": 16000, "material": "steel", @@ -380,7 +380,7 @@ "type": "GUN", "name": "simple flamethrower", "description": "A simple, home-made flamethrower. While its capacity is not superb, it is more than capable of igniting terrain and monsters alike.", - "weight": 907, + "weight": "907 g", "volume": "5 L", "price": 20000, "to_hit": -1, @@ -408,7 +408,7 @@ "name": "Plutonium Filter CBM", "description": "A system of tanks and filters that are connected to a microreactor to extract plutonium from radioactive slurry.", "price": 60000, - "weight": 1000, + "weight": "1000 g", "difficulty": 6 }, { @@ -430,5 +430,41 @@ "price": 250000, "difficulty": 11, "is_upgrade": true + }, + { + "id": "v29_cheap", + "type": "GUN", + "reload_noise_volume": 10, + "name": "homemade laser pistol", + "description": "This laser pistol was based on the V29 laser pistol designed in the mid-21st century. While little more than duct tape and electronics, it runs on a standard UPS.", + "weight": 540, + "volume": "2 L", + "price": 500000, + "to_hit": -2, + "bashing": 5, + "material": [ "steel", "plastic" ], + "symbol": "(", + "color": "magenta", + "skill": "pistol", + "range": 30, + "ranged_damage": 10, + "pierce": 6, + "dispersion": 180, + "durability": 4, + "loudness": 7, + "ups_charges": 20, + "reload": 300, + "valid_mod_locations": [ + [ "accessories", 2 ], + [ "emitter", 1 ], + [ "grip", 1 ], + [ "lens", 1 ], + [ "rail", 1 ], + [ "sights", 1 ], + [ "stock", 1 ], + [ "underbarrel mount", 1 ] + ], + "ammo_effects": [ "LASER", "INCENDIARY" ], + "flags": [ "NO_UNLOAD" ] } ] diff --git a/data/json/items/ranged.json b/data/json/items/ranged.json index 63077faac4cd0..cf1b9c665e887 100644 --- a/data/json/items/ranged.json +++ b/data/json/items/ranged.json @@ -13,7 +13,7 @@ "flags": "NEVER_JAMS", "skill": "rifle", "ammo": "BB", - "weight": 1723, + "weight": "1723 g", "volume": "1500 ml", "bashing": 9, "to_hit": -1, @@ -46,7 +46,7 @@ "flags": [ "RELOAD_AND_SHOOT", "NEVER_JAMS", "PRIMITIVE_RANGED_WEAPON", "BELT_CLIP" ], "skill": "throw", "ammo": "pebble", - "weight": 96, + "weight": "96 g", "volume": "250 ml", "to_hit": -2, "ranged_damage": 6, @@ -67,7 +67,7 @@ "flags": [ "RELOAD_AND_SHOOT", "NEVER_JAMS", "PRIMITIVE_RANGED_WEAPON", "BELT_CLIP" ], "skill": "archery", "ammo": "pebble", - "weight": 254, + "weight": "254 g", "volume": "250 ml", "to_hit": -2, "ranged_damage": 3, @@ -89,7 +89,7 @@ "flags": [ "RELOAD_AND_SHOOT", "NEVER_JAMS", "PRIMITIVE_RANGED_WEAPON", "BELT_CLIP" ], "skill": "archery", "ammo": "pebble", - "weight": 322, + "weight": "322 g", "volume": "500 ml", "to_hit": -2, "ranged_damage": 5, @@ -112,7 +112,7 @@ "flags": [ "STR_RELOAD", "PRIMITIVE_RANGED_WEAPON" ], "skill": "rifle", "ammo": "pebble", - "weight": 1906, + "weight": "1906 g", "volume": "1250 ml", "bashing": 9, "ranged_damage": 10, @@ -147,7 +147,7 @@ "flags": [ "NO_UNLOAD", "BACKBLAST", "NEVER_JAMS", "TRADER_AVOID" ], "skill": "launcher", "ammo": "66mm", - "weight": 700, + "weight": "700 g", "volume": "2500 ml", "bashing": 6, "to_hit": -3, @@ -176,7 +176,7 @@ "material": "steel", "skill": "launcher", "ammo": "120mm", - "weight": 2500, + "weight": "2500 g", "volume": "2500 ml", "bashing": 6, "to_hit": -3, @@ -200,7 +200,7 @@ "ammo_effects": [ "PLASMA", "EXPLOSIVE_SMALL", "FLAME" ], "skill": "rifle", "ammo": "plasma", - "weight": 4535, + "weight": "4535 g", "volume": "3750 ml", "bashing": 12, "to_hit": -1, @@ -237,7 +237,7 @@ "ups_charges": 100, "skill": "rifle", "ammo": "plasma", - "weight": 10500, + "weight": "10500 g", "volume": "4L", "bashing": 12, "to_hit": -2, @@ -268,13 +268,12 @@ "name": "pipe combination gun", "description": "A home-made triple-barreled firearm, one barrel chambered in .30-06 and two other for shotgun shells. It is made from pipes and parts cannibalized from a double barrel shotgun.", "price": 40000, - "//": "Part of price shifted to integral mod.", + "//": "Attached mod will now have weight.", "material": [ "steel", "wood" ], "flags": [ "NEVER_JAMS", "RELOAD_EJECT" ], "skill": "shotgun", "ammo": "3006", - "weight": 2267, - "//": "Attached mod will now have weight.", + "weight": "2267 g", "volume": "2 L", "bashing": 12, "to_hit": -1, @@ -307,7 +306,7 @@ "flags": [ "STR_RELOAD", "RELOAD_ONE" ], "skill": "rifle", "ammo": "pebble", - "weight": 4211, + "weight": "4211 g", "volume": "2750 ml", "bashing": 8, "to_hit": -1, @@ -343,7 +342,7 @@ "flags": [ "RELOAD_ONE", "STR_RELOAD" ], "skill": "rifle", "ammo": "bolt", - "weight": 3110, + "weight": "3110 g", "volume": "3 L", "bashing": 12, "to_hit": -1, @@ -379,7 +378,7 @@ "flags": [ "RELOAD_ONE", "STR_RELOAD" ], "skill": "shotgun", "ammo": "shotcanister", - "weight": 3410, + "weight": "3410 g", "volume": "2500 ml", "bashing": 8, "to_hit": -1, @@ -415,7 +414,7 @@ "flags": [ "STR_RELOAD", "NEVER_JAMS" ], "skill": "launcher", "ammo": "mininuke_mod", - "weight": 11260, + "weight": "11260 g", "volume": "2750 ml", "bashing": 12, "to_hit": -1, @@ -426,40 +425,6 @@ "reload": 800, "valid_mod_locations": [ [ "sling", 1 ], [ "grip mount", 1 ], [ "rail mount", 1 ], [ "sights mount", 1 ], [ "underbarrel mount", 1 ] ] }, - { - "id": "m202_flash", - "type": "GUN", - "reload_noise_volume": 10, - "symbol": "(", - "color": "dark_gray", - "name": "M202 FLASH", - "name_plural": "M202 FLASH", - "description": "A massive and deadly four shot 66 millimeter man-portable, reusable, thermobaric rocket launcher.", - "price": 2900000, - "material": "steel", - "flags": [ "MODE_BURST", "BACKBLAST", "NEVER_JAMS" ], - "skill": "launcher", - "ammo": "m235", - "weight": 5220, - "volume": "6 L", - "bashing": 12, - "to_hit": -3, - "dispersion": 300, - "durability": 7, - "burst": 4, - "clip_size": 4, - "reload": 600, - "loudness": 200, - "valid_mod_locations": [ - [ "accessories", 4 ], - [ "grip", 1 ], - [ "mechanism", 4 ], - [ "sights", 1 ], - [ "sling", 1 ], - [ "rail mount", 1 ], - [ "underbarrel mount", 1 ] - ] - }, { "id": "RPG", "type": "GUN", @@ -475,7 +440,7 @@ "flags": [ "BACKBLAST", "NEVER_JAMS" ], "skill": "launcher", "ammo": "RPG-7", - "weight": 7000, + "weight": "7000 g", "volume": "4500 ml", "bashing": 10, "to_hit": -3, @@ -506,7 +471,7 @@ "flags": [ "STR_RELOAD", "WATERPROOF_GUN", "UNDERWATER_GUN", "NEVER_JAMS" ], "skill": "rifle", "ammo": "fishspear", - "weight": 2100, + "weight": "2100 g", "volume": "1750 ml", "bashing": 7, "to_hit": -2, @@ -539,7 +504,7 @@ "flags": [ "STR_RELOAD", "WATERPROOF_GUN", "UNDERWATER_GUN", "NEVER_JAMS" ], "skill": "pistol", "ammo": "fishspear", - "weight": 840, + "weight": "840 g", "volume": "1 L", "bashing": 7, "to_hit": -2, @@ -569,7 +534,7 @@ "flags": [ "RELOAD_ONE", "STR_RELOAD", "WATERPROOF_GUN", "UNDERWATER_GUN", "NEVER_JAMS" ], "skill": "rifle", "ammo": "fishspear", - "weight": 3060, + "weight": "3060 g", "volume": "2 L", "bashing": 8, "to_hit": -2, @@ -602,7 +567,7 @@ "flags": [ "RELOAD_ONE", "STR_RELOAD", "WATERPROOF_GUN", "UNDERWATER_GUN" ], "skill": "rifle", "ammo": "fishspear", - "weight": 3460, + "weight": "3460 g", "volume": "2 L", "bashing": 8, "to_hit": -2, @@ -636,7 +601,7 @@ "flags": [ "NEVER_JAMS", "RELOAD_EJECT" ], "skill": "rifle", "ammo": "3006", - "weight": 4200, + "weight": "4200 g", "volume": "3 L", "bashing": 12, "to_hit": -1, @@ -672,7 +637,7 @@ "flags": [ "MODE_BURST" ], "skill": "launcher", "ammo": "homebrew_rocket", - "weight": 7430, + "weight": "7430 g", "volume": "5 L", "bashing": 10, "to_hit": -3, @@ -697,7 +662,7 @@ "ammo_effects": [ "JET", "BEANBAG", "NEVER_MISFIRES", "RECOVER_10" ], "skill": "launcher", "ammo": "water", - "weight": 24500, + "weight": "24500 g", "volume": "12500 ml", "bashing": 10, "to_hit": -5, diff --git a/data/json/items/resources/alien.json b/data/json/items/resources/alien.json index 23c75bfaa42b0..68884634fddbc 100644 --- a/data/json/items/resources/alien.json +++ b/data/json/items/resources/alien.json @@ -5,7 +5,7 @@ "category": "spare_parts", "name": "alien resin chunk", "description": "This is a shattered fragment of alien resin. It looks a bit like a large piece of sea glass, frosted and gritty with the edges rounded off. It is somewhat warm to the touch.", - "weight": 70, + "weight": "70 g", "volume": "250 ml", "price": 0, "material": "alien_resin", @@ -19,7 +19,7 @@ "category": "spare_parts", "name": "alien resin pod", "description": "This is a large pod, the size of a keg, filled with gooey alien resin. Squeezing it firmly causes resin to squirt from the broken stalk at the end, hardening within a few seconds of being exposed to the air.", - "weight": 70000, + "weight": "70000 g", "volume": "22000 ml", "price": 10000, "material": "alien_resin", diff --git a/data/json/items/resources/glass.json b/data/json/items/resources/glass.json index f3e9a0e31f4ba..141cc6fdf9d40 100644 --- a/data/json/items/resources/glass.json +++ b/data/json/items/resources/glass.json @@ -8,7 +8,7 @@ "category": "other", "description": "A broken shard of glass covered in sharp edges. You could use it as a weapon, but you might want to wear gloves.", "material": "glass", - "weight": 75, + "weight": "75 g", "volume": "30 ml", "cutting": 6, "use_action": { @@ -32,7 +32,7 @@ "category": "spare_parts", "price": 5000, "material": "glass", - "weight": 24176, + "weight": "24176 g", "volume": "12500 ml", "bashing": 4, "to_hit": -5, @@ -55,7 +55,7 @@ "category": "spare_parts", "price": 10000, "material": [ "glass", "steel" ], - "weight": 40123, + "weight": "40123 g", "volume": "12500 ml", "bashing": 6, "to_hit": -6 @@ -71,7 +71,7 @@ "category": "spare_parts", "price": 5000, "material": [ "glass", "steel" ], - "weight": 10040, + "weight": "10040 g", "volume": "3 L", "bashing": 4, "to_hit": -2 diff --git a/data/json/items/resources/home_improvement.json b/data/json/items/resources/home_improvement.json index 4727c0087044e..fa83df19b998a 100644 --- a/data/json/items/resources/home_improvement.json +++ b/data/json/items/resources/home_improvement.json @@ -11,7 +11,7 @@ "description": "A can of red paint.", "material": "steel", "volume": "1250 ml", - "weight": 10, + "weight": "10 g", "ammo_type": "NULL", "count": 100 }, @@ -27,7 +27,7 @@ "description": "A can of blue paint.", "material": "steel", "volume": "1250 ml", - "weight": 10, + "weight": "10 g", "ammo_type": "NULL", "count": 100 }, @@ -43,7 +43,7 @@ "description": "A can of white paint.", "material": "steel", "volume": "1250 ml", - "weight": 10, + "weight": "10 g", "ammo_type": "NULL", "count": 100 }, @@ -59,7 +59,7 @@ "description": "A can of green paint.", "material": "steel", "volume": "1250 ml", - "weight": 10, + "weight": "10 g", "ammo_type": "NULL", "count": 100 }, @@ -75,7 +75,7 @@ "description": "A can of purple paint.", "material": "steel", "volume": "1250 ml", - "weight": 10, + "weight": "10 g", "ammo_type": "NULL", "count": 100 }, @@ -91,7 +91,7 @@ "description": "A can of yellow paint.", "material": "steel", "volume": "1250 ml", - "weight": 10, + "weight": "10 g", "ammo_type": "NULL", "count": 100 }, @@ -106,7 +106,7 @@ "description": "A roll of red carpet.", "material": "cotton", "volume": "1750 ml", - "weight": 45, + "weight": "45 g", "ammo_type": "NULL", "count": 5 }, @@ -121,7 +121,7 @@ "description": "A roll of green carpet.", "material": "cotton", "volume": "1750 ml", - "weight": 45, + "weight": "45 g", "ammo_type": "NULL", "count": 5 }, @@ -136,7 +136,7 @@ "description": "A roll of yellow carpet.", "material": "cotton", "volume": "1750 ml", - "weight": 45, + "weight": "45 g", "ammo_type": "NULL", "count": 5 }, @@ -151,7 +151,7 @@ "description": "A roll of purple carpet.", "material": "cotton", "volume": "1750 ml", - "weight": 45, + "weight": "45 g", "ammo_type": "NULL", "count": 5 }, @@ -165,7 +165,7 @@ "description": "A metal cylinder with a small lens inside intended to be installed on a door.", "price": 12000, "material": [ "aluminum", "glass" ], - "weight": 5, + "weight": "5 g", "volume": "250 ml", "to_hit": -3 } diff --git a/data/json/items/resources/metal.json b/data/json/items/resources/metal.json index 748541181be65..8af51e1262ec1 100644 --- a/data/json/items/resources/metal.json +++ b/data/json/items/resources/metal.json @@ -5,7 +5,7 @@ "name": "pipe", "description": "A steel pipe, makes a good melee weapon. Useful in a few crafting recipes.", "category": "spare_parts", - "weight": 1250, + "weight": "1250 g", "to_hit": 1, "color": "dark_gray", "symbol": "/", @@ -23,7 +23,7 @@ "category": "spare_parts", "name": "scrap metal", "description": "A bulky assortment of small bits of scrap steel useful in all kinds of crafting.", - "weight": 50, + "weight": "50 g", "volume": "250 ml", "price": 500, "count": 2, @@ -40,7 +40,7 @@ "name": "spike", "description": "A large and slightly misshapen spike, could do some damage mounted on a vehicle.", "category": "spare_parts", - "weight": 550, + "weight": "550 g", "to_hit": -2, "color": "light_gray", "symbol": ";", @@ -58,7 +58,7 @@ "name": "copper tubing", "description": "A copper tube, too thin to be much use as a melee weapon, but will do if nothing else is available. Useful in a few crafting recipes.", "category": "spare_parts", - "weight": 345, + "weight": "345 g", "to_hit": -1, "color": "light_red", "symbol": "/", @@ -75,7 +75,7 @@ "category": "spare_parts", "name": "aluminum ingot", "description": "A small aluminum ingot, standardized for further processing. Light but durable, this could be cast into various shapes for construction or ground down to a powder, for more... high-profile applications.", - "weight": 675, + "weight": "675 g", "//": "Density 2.70g/cm³ = 675g/250ml", "volume": "250 ml", "price": 500, @@ -92,7 +92,7 @@ "name": "bismuth", "name_plural": "bismuth", "description": "A dense but brittle metal often used as an alternative to lead.", - "weight": 2, + "weight": "2 g", "//": "Density 9.78g/cm³ ~ 2.4kg/250ml @ stack 1000 = 2g/unit", "volume": "50ml", "price": 6500, @@ -110,7 +110,7 @@ "name": "gold", "name_plural": "gold", "description": "A soft shiny metal. Before the apocalypse this would've been worth a small fortune but now its value is greatly diminished.", - "weight": 5, + "weight": "5 g", "//": "Density 19.32g/cm³ ~ 4.8kg/250ml @ stack 1000 = 5g/unit", "volume": "50ml", "price": 100000, @@ -129,7 +129,7 @@ "name": "platinum", "name_plural": "platinum", "description": "A soft shiny metal. Before the apocalypse this would've been worth a small fortune but now its value is greatly diminished.", - "weight": 5, + "weight": "5 g", "//": "Density 21.45g/cm³ ~ 5.4kg/250ml @ stack 1000 = 5g/unit", "volume": "50ml", "price": 100000, @@ -141,6 +141,24 @@ "color": "light_gray", "ammo_type": "components" }, + { + "id": "zinc_metal", + "type": "AMMO", + "category": "spare_parts", + "name": "zinc", + "name_plural": "zinc", + "description": "A slightly brittle metal. Apart from being an essential mineral that the body needs, it reacts readily with acids, alkalis and other non-metals. It can be crushed to make zinc powder, used in the production of batteries, among other things.", + "weight": 7, + "volume": "50ml", + "price": 3000, + "price_postapoc": 75, + "count": 100, + "stack_size": 200, + "material": [ "zinc" ], + "symbol": "/", + "color": "blue", + "ammo_type": "components" + }, { "id": "lead", "type": "AMMO", @@ -148,7 +166,7 @@ "name": "lead", "name_plural": "lead", "description": "A soft dull metal known since ancient times. Due to its malleability it has a wide variety of uses including the manufacture of ammunition.", - "weight": 3, + "weight": "3 g", "//": "Density 11.34g/cm³ ~ 2.8kg/250ml @ stack 1000 = 3g/unit", "volume": "50ml", "price": 5000, @@ -166,8 +184,8 @@ "name": "magnesium powder", "name_plural": "magnesium powder", "description": "A gray powder composed of the highly flammable alkaline earth metal magnesium. Useful for constructing flares and similar items.", - "weight": 1.1, - "//": "Weight should be 1.1g because: density 1.74g/cm³ ~ 0.44kg/250ml and density of aluminium 2.70g/cm³ = 675g/250ml => magnesium is 64% the weight of aluminium and at 250ml aluminium powder has a weight of ~0.176kg at 250ml, assuming same particle size => magnesium powder has a weight of ~0.112kg at 250ml => 1.1g per magnesium powder unit", + "weight": "1120 mg", + "//": "Weight should be 1.1g because: density 1.74g/cm³ ~ 0.44kg/250ml and density of aluminium 2.70g/cm³ = 675g/250ml => magnesium is 64% the weight of aluminium and at 250ml aluminium powder has a weight of ~0.176kg at 250ml, assuming same particle size => magnesium powder has a weight of ~0.112kg at 250ml => 1.12g per magnesium powder unit", "volume": "250 ml", "price": 5000, "count": 100, @@ -185,7 +203,7 @@ "name": "silver", "name_plural": "silver", "description": "A soft shiny metal. Before the cataclysm it was worth quite a bit but its value is now greatly diminished.", - "weight": 3, + "weight": "3 g", "//": "Density 10.40g/cm³ ~ 2.6kg/250ml @ stack 1000 = 3g/unit", "volume": "50ml", "price": 100000, @@ -203,7 +221,7 @@ "category": "spare_parts", "name": "small metal sheet", "description": "A small sheet of metal.", - "weight": 250, + "weight": "250 g", "volume": "250 ml", "price": 2000, "bashing": 5, @@ -221,7 +239,7 @@ "category": "spare_parts", "name": "chunk of steel", "description": "A misshapen chunk of steel. Makes a decent weapon in a pinch, and is also useful for some crafting recipes.", - "weight": 250, + "weight": "250 g", "volume": "250 ml", "price": 1000, "bashing": 8, @@ -240,7 +258,7 @@ "category": "spare_parts", "name": "lump of steel", "description": "A heavy formed piece of steel. Useful for some crafting recipes.", - "weight": 1000, + "weight": "1000 g", "volume": "250 ml", "price": 2000, "bashing": 12, @@ -259,7 +277,7 @@ "category": "spare_parts", "name": "door hinge", "description": "A small metal hinge with two metal plates with screw holes. Useful for making doors.", - "weight": 300, + "weight": "300 g", "volume": "250 ml", "price": 3000, "bashing": 5, @@ -298,7 +316,7 @@ "description": "A small chunk of copper, usable for crafting or repairs.", "price": 1000, "material": "copper", - "weight": 200, + "weight": "200 g", "volume": "250 ml", "bashing": 1, "to_hit": -2 @@ -314,7 +332,7 @@ "description": "A fine gray powder composed of tin, usable for making solder and lining containers to prevent corrosion.", "material": "tin", "volume": "50ml", - "weight": 2, + "weight": "2 g", "//": "Density 7.28g/cm³ ~ 1820kg/250ml @ stack 1000 = 2g/unit", "ammo_type": "components", "count": 100, @@ -331,7 +349,7 @@ "description": "A small spool of solder, able to be used in ammunition and electronics.", "material": "steel", "volume": "50ml", - "weight": 2, + "weight": "2 g", "//": "Density ~ 8g/cm³ ~ 2000kg/250ml @ stack 1000 = 2g/unit", "ammo_type": "components", "count": 200 diff --git a/data/json/items/resources/misc.json b/data/json/items/resources/misc.json index f0a76f7c19c1f..f1cced464589e 100644 --- a/data/json/items/resources/misc.json +++ b/data/json/items/resources/misc.json @@ -6,7 +6,7 @@ "name": "incendiary", "name_plural": "incendiaries", "description": "Material from an incendiary round, useful in constructing incendiary ammunition.", - "weight": 2, + "weight": "2 g", "volume": "500 ml", "price": 10000, "container": "bag_plastic", @@ -24,7 +24,7 @@ "name": "mattress", "name_plural": "mattresses", "description": "This is a single, or twin, sized mattress.", - "weight": 20000, + "weight": "20000 g", "volume": "300000 ml", "price": 1000, "material": [ "cotton", "steel" ], diff --git a/data/json/items/resources/plastic.json b/data/json/items/resources/plastic.json index 867e80025cc11..baea60252b7ab 100644 --- a/data/json/items/resources/plastic.json +++ b/data/json/items/resources/plastic.json @@ -5,7 +5,7 @@ "category": "spare_parts", "name": "plastic chunk", "description": "This is a piece of plastic. It could be used to fabricate, repair, or reinforce plastic items.", - "weight": 70, + "weight": "70 g", "volume": "250 ml", "price": 0, "material": "plastic", @@ -19,7 +19,7 @@ "category": "spare_parts", "name": "plastic sheet", "description": "This is a large sheet of heavy flexible plastic, the sort that might have been used for commercial wrapping or for weather-sealing a home.", - "weight": 1000, + "weight": "1000 g", "volume": "2 L", "price": 0, "material": "plastic", diff --git a/data/json/items/resources/wood.json b/data/json/items/resources/wood.json index 5d3cde15568f2..a787914ec3e2a 100644 --- a/data/json/items/resources/wood.json +++ b/data/json/items/resources/wood.json @@ -10,7 +10,7 @@ "price": 10000, "price_postapoc": 100, "material": "wood", - "weight": 9071, + "weight": "9071 g", "volume": "10 L", "bashing": 10, "to_hit": -10, @@ -25,7 +25,7 @@ "description": "A splintered piece of wood, could be used as a skewer or for kindling.", "category": "other", "material": "wood", - "weight": 453, + "weight": "453 g", "volume": "250 ml", "bashing": 4, "to_hit": 1, @@ -42,7 +42,7 @@ "material": "wood", "techniques": [ "WBLOCK_1" ], "flags": [ "TRADER_AVOID", "FIREWOOD" ], - "weight": 1700, + "weight": "1700 g", "volume": "1250 ml", "bashing": 14, "to_hit": -2, @@ -58,7 +58,7 @@ "material": "wood", "techniques": [ "WBLOCK_1" ], "flags": [ "TRADER_AVOID", "FIREWOOD" ], - "weight": 3400, + "weight": "3400 g", "volume": "2500 ml", "bashing": 18, "to_hit": -1, @@ -76,7 +76,7 @@ "symbol": "/", "material": [ "wood" ], "techniques": "WBLOCK_1", - "weight": 2250, + "weight": "2250 g", "volume": "3750 ml", "bashing": 25, "flags": [ "SPEAR", "REACH_ATTACK", "NONCONDUCTIVE" ], @@ -90,7 +90,7 @@ "name": "plank", "description": "A narrow, thick plank of wood, like a 2 by 4 or similar piece of dimensional lumber. Makes a decent melee weapon, and can be used for all kinds construction.", "category": "spare_parts", - "weight": 1391, + "weight": "1391 g", "to_hit": 1, "color": "brown", "symbol": "/", @@ -108,7 +108,7 @@ "name": "heavy wooden beam", "description": "An enormous beam of solid wood, very heavy and hard to lug around, but also very sturdy for construction. You could saw or chop it into smaller pieces, like planks or panels.", "category": "spare_parts", - "weight": 36000, + "weight": "36000 g", "volume": "60000 ml", "//": "weight for a roughly 6x6x8 wooden beam. Probably a bit small tbh.", "to_hit": -2, @@ -127,7 +127,7 @@ "description": "A wide, thin wooden board - plywood, OSB, MDF, tongue-in-groove boards, or similar, already cut to shape. These large flat boards are good for all kinds of construction, but for really big projects you'd need a proper sheet of uncut plywood or the like.", "//": "Weight and volume assumes 18 square feet of 1/2 inch plywood. The actual size of the panel likely varies wildly and the item entry may represent several smaller pieces.", "category": "spare_parts", - "weight": 15000, + "weight": "15000 g", "to_hit": 1, "color": "brown", "symbol": "H", @@ -146,7 +146,7 @@ "description": "A standard 4x8 sheet of flat wood - usually plywood, OSB, or MDF. Heavy and bulky, this is extremely useful for all manner of construction, but you might have to cut it to size before doing smaller projects.", "//": "Weight and volume assumes 32 square feet of 1/2 inch plywood. Due to its enormously bulky shape, volume is higher than actual displacement volume", "category": "spare_parts", - "weight": 20000, + "weight": "20000 g", "to_hit": 1, "color": "brown", "symbol": "H", diff --git a/data/json/items/robot_parts.json b/data/json/items/robot_parts.json index 3af2fd8bac002..3a2c2fea147e3 100644 --- a/data/json/items/robot_parts.json +++ b/data/json/items/robot_parts.json @@ -7,7 +7,7 @@ "symbol": "%", "color": "cyan", "material": [ "plastic", "steel" ], - "weight": 250, + "weight": "250 g", "volume": "500 ml", "price": 32000, "category": "spare_parts" @@ -66,7 +66,7 @@ "id": "ai_module_basic", "name": "basic AI core", "description": "A very basic AI core with minimal cognitive abilities.", - "weight": 125, + "weight": "125 g", "copy-from": "ai_module" }, { @@ -91,7 +91,7 @@ "description": "A set of big pointy legs, like the ones found under a tripod.", "symbol": "W", "color": "light_gray", - "weight": 40000, + "weight": "40000 g", "volume": "20 L", "price": 200000, "material": "steel", @@ -105,7 +105,7 @@ "description": "A set of tiny pointy legs, like the ones found under a skitterbot.", "symbol": "w", "color": "light_gray", - "weight": 200, + "weight": "200 g", "volume": "500 ml", "price": 50000, "material": "steel", @@ -119,7 +119,7 @@ "description": "A set of reverse-jointed legs, like the ones found under a chicken walker.", "symbol": "k", "color": "light_gray", - "weight": 60000, + "weight": "60000 g", "volume": "20 L", "price": 500000, "material": "steel", @@ -133,7 +133,7 @@ "description": "A set of omni wheels, like the ones found under a police bot.", "symbol": "o", "color": "light_gray", - "weight": 10000, + "weight": "10000 g", "volume": "10 L", "price": 100000, "material": "steel", @@ -147,7 +147,7 @@ "description": "A set of rotors able to lift a small drone.", "symbol": "#", "color": "light_gray", - "weight": 130, + "weight": "130 g", "volume": "500 ml", "price": 40000, "material": [ "steel", "plastic" ], @@ -161,7 +161,7 @@ "description": "A set of human-like legs.", "symbol": "M", "color": "light_gray", - "weight": 10000, + "weight": "10000 g", "volume": "10 L", "price": 100000, "material": [ "steel", "plastic" ], @@ -175,7 +175,7 @@ "description": "A set of human-like arms.", "symbol": "m", "color": "light_gray", - "weight": 5000, + "weight": "5000 g", "volume": "5 L", "price": 100000, "material": [ "steel", "plastic" ], @@ -189,7 +189,7 @@ "description": "A set of small tank tread, like the one used by the \"Beagle\" mini-tank.", "symbol": "=", "color": "light_gray", - "weight": 60000, + "weight": "60000 g", "volume": "30 L", "price": 600000, "material": [ "steel", "plastic" ], @@ -203,7 +203,7 @@ "description": "What's left when you remove all moving parts and electronics. It's the skeleton and armor of a turret.", "symbol": "c", "color": "light_gray", - "weight": 10000, + "weight": "10000 g", "volume": "10 L", "price": 100000, "material": [ "steel", "plastic" ], @@ -217,7 +217,7 @@ "description": "What's left when you remove all moving parts and electronics. It's the skeleton and armor of the tripod.", "symbol": "c", "color": "light_gray", - "weight": 40000, + "weight": "40000 g", "volume": "70000 ml", "price": 200000, "material": [ "steel" ], @@ -231,7 +231,7 @@ "description": "What's left when you remove all moving parts and electronics. It's the skeleton and armor of the chicken walker.", "symbol": "c", "color": "light_gray", - "weight": 60000, + "weight": "60000 g", "volume": "80000 ml", "price": 300000, "material": [ "steel" ], @@ -245,7 +245,7 @@ "description": "What's left when you remove all moving parts and electronics. It's the skeleton and armor of the police bot.", "symbol": "c", "color": "light_gray", - "weight": 20000, + "weight": "20000 g", "volume": "40000 ml", "price": 100000, "material": [ "steel" ], @@ -258,7 +258,7 @@ "description": "What's left when you strip an android body from its components.", "symbol": "c", "color": "light_gray", - "weight": 20000, + "weight": "20000 g", "volume": "40000 ml", "price": 100000, "material": [ "steel", "plastic" ], @@ -272,7 +272,7 @@ "description": "What's left when you remove all moving parts and electronics. It's the skeleton and armor of the Beagle tank.", "symbol": "c", "color": "light_gray", - "weight": 150000, + "weight": "150000 g", "volume": "575000 ml", "price": 1000000, "material": [ "steel" ], diff --git a/data/json/items/software.json b/data/json/items/software.json index e6c99b46c3322..7a5a97ebd0d66 100644 --- a/data/json/items/software.json +++ b/data/json/items/software.json @@ -80,5 +80,14 @@ "container": "data_card", "description": "Data stolen from a dead scientist memory banks. Is the owner of these thoughts still hidden here, amidst the unreadable data; or are these just a collection of the precious moments of someone's life?\n\nWhatever the case, the idea of perpetually keeping a part of you within a metallic pill makes you feel uncomfortable.", "flags": [ "NO_DROP" ] + }, + { + "id": "software_electronics_reference", + "copy-from": "software", + "type": "GENERIC", + "name": "integrated circuit datasheet archives", + "name_plural": "misc software", + "description": "Huge archives of numerous IC circuit datasheets from several major manufacturers. Probably valuable to the right person, as it would be hard to salvage and reuse these components without them.", + "price": 40000 } ] diff --git a/data/json/items/tool/container.json b/data/json/items/tool/container.json index 17b0ea5e9d004..f1e16010db225 100644 --- a/data/json/items/tool/container.json +++ b/data/json/items/tool/container.json @@ -5,7 +5,7 @@ "category": "other", "name": "steel bottle", "description": "A stainless steel water bottle, holds 750ml of liquid.", - "weight": 200, + "weight": "200 g", "volume": "750 ml", "price": 0, "to_hit": 1, @@ -24,7 +24,7 @@ "category": "other", "name": "foldable plastic bottle", "description": "A non-rigid plastic bottle for easy storage, holds 500 ml of liquid.", - "weight": 13, + "weight": "13 g", "volume": 0, "price": 0, "to_hit": 1, diff --git a/data/json/items/tool/cooking.json b/data/json/items/tool/cooking.json index 645ed03760621..94f6fcefb2d0c 100644 --- a/data/json/items/tool/cooking.json +++ b/data/json/items/tool/cooking.json @@ -4,7 +4,7 @@ "type": "TOOL", "name": "hexamine stove", "description": "Known as an Esbit stove, this is a lightweight, folding stove designed to use small hexamine tablets for cooking.", - "weight": 180, + "weight": "180 g", "volume": "750 ml", "price": 2000, "to_hit": -1, @@ -25,7 +25,7 @@ "category": "tools", "name": "mess tin", "description": "A compact military-style pan and tray, designed for heating food over a fire or portable stove. It is shallower than a proper pot or pan, and lacks the integrated heating elements modern mess kits have.", - "weight": 450, + "weight": "450 g", "volume": "750 ml", "price": 2000, "to_hit": 2, diff --git a/data/json/items/tool/deployable.json b/data/json/items/tool/deployable.json index 0415a75894d8b..1ca2ac8a313e1 100644 --- a/data/json/items/tool/deployable.json +++ b/data/json/items/tool/deployable.json @@ -4,7 +4,7 @@ "type": "TOOL", "name": "brazier", "description": "A large metal stand used to contain a fire. Fires set in a brazier will not spread to surrounding flammable objects.", - "weight": 5000, + "weight": "5000 g", "volume": "2500 ml", "price": 5000, "to_hit": -4, @@ -21,7 +21,7 @@ "name": "fire barrel (200L)", "name_plural": "fire barrels (200L)", "description": "A large metal barrel used to contain a fire. It has multiple holes punched in its walls for air supply. Fires set in a fire barrel will not spread to surrounding flammable objects.", - "weight": 20000, + "weight": "20000 g", "volume": "200 L", "price": 10000, "to_hit": -5, @@ -38,7 +38,7 @@ "name": "fire barrel (100L)", "name_plural": "fire barrels (100L)", "description": "A large metal barrel used to contain a fire. It has multiple holes punched in its walls for air supply. Fires set in a fire barrel will not spread to surrounding flammable objects.", - "weight": 12000, + "weight": "12000 g", "volume": "100 L", "price": 5000, "to_hit": -4, @@ -54,7 +54,7 @@ "type": "TOOL", "name": "camp chair", "description": "Folded camp chair, deploy to sit down.", - "weight": 1000, + "weight": "1000 g", "volume": "2500 ml", "price": 5000, "to_hit": -4, @@ -70,7 +70,7 @@ "type": "TOOL", "name": "metal butchering rack", "description": "Metal butchering rack designed to hang a carcass in the air. It is folded for easy transportation.", - "weight": 5000, + "weight": "5000 g", "volume": "10 L", "price": 5000, "to_hit": -4, @@ -89,7 +89,7 @@ "description": "This rubber rowboat (oars included) is deflated for storage. Activate it (having an air pump in inventory) to inflate and launch.", "price": 350000, "material": "plastic", - "weight": 9071, + "weight": "9071 g", "volume": "21500 ml", "bashing": 10, "to_hit": -5, @@ -106,7 +106,7 @@ "type": "TOOL", "name": "metal smoking rack", "description": "A metal rack designed to smoke food for better preservation and taste. It is folded for easy transportation.", - "weight": 5000, + "weight": "5000 g", "volume": "25 L", "price": 5000, "to_hit": -4, @@ -121,7 +121,7 @@ "type": "TOOL", "name": "tourist table", "description": "Metal tourist table for off-road trips. It is folded for easy transportation.", - "weight": 6000, + "weight": "6000 g", "volume": "25 L", "price": 5000, "to_hit": -3, @@ -136,7 +136,7 @@ "type": "TOOL", "name": "leather tarp", "description": "A large sheet of sewn leather that can be deployed instead of a picnic blanket, but it's more valuable as a butchery appliance as it does not soak in blood. It's rolled and ready for carrying.", - "weight": 2000, + "weight": "2000 g", "volume": "2500 ml", "price": 5000, "to_hit": -3, @@ -151,7 +151,7 @@ "type": "TOOL", "name": "fiber mat", "description": "A large mat woven from fibrous material that can be used instead of a picnic blanket, but it's more valuable as a butchery appliance. Too thin to be used as a comfortable sleeping place. It's rolled and ready for carrying.", - "weight": 1000, + "weight": "1000 g", "volume": "2500 ml", "price": 1000, "to_hit": -3, diff --git a/data/json/items/tool/fire.json b/data/json/items/tool/fire.json index f254c1b9340f8..2a5a6689c45de 100644 --- a/data/json/items/tool/fire.json +++ b/data/json/items/tool/fire.json @@ -5,7 +5,7 @@ "name": "flint and steel", "name_plural": "sets of flint and steel", "description": "This is a magnesium bar and a carbon steel striker. Use it to spark a flame.", - "weight": 400, + "weight": "400 g", "volume": "250 ml", "price": 300, "to_hit": -1, diff --git a/data/json/items/tool/handloading.json b/data/json/items/tool/handloading.json new file mode 100644 index 0000000000000..0ddb9a3d90fc5 --- /dev/null +++ b/data/json/items/tool/handloading.json @@ -0,0 +1,45 @@ +[ + { + "id": "press", + "type": "TOOL", + "name": "hand press", + "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, + "volume": "500 ml", + "price": 10000, + "to_hit": -2, + "bashing": 6, + "material": [ "steel", "plastic" ], + "symbol": ";", + "color": "dark_gray" + }, + { + "id": "press_dowel", + "type": "TOOL", + "name": "makeshift shotshell 'press'", + "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, + "volume": "250 ml", + "price": 600, + "to_hit": -2, + "bashing": 2, + "material": [ "wood", "plastic", "brass" ], + "symbol": ";", + "color": "dark_gray", + "flags": [ "TRADER_AVOID" ] + }, + { + "id": "puller", + "type": "TOOL", + "name": "kinetic bullet puller", + "description": "This is a tool used for properly disassembling firearm ammunition.", + "weight": 489, + "volume": "250 ml", + "price": 1000, + "bashing": 5, + "material": "plastic", + "symbol": ";", + "color": "green", + "qualities": [ [ "PULL", 2 ] ] + } +] diff --git a/data/json/items/tool/lighting.json b/data/json/items/tool/lighting.json index 52baa5297144f..5f7b8aeab9df2 100644 --- a/data/json/items/tool/lighting.json +++ b/data/json/items/tool/lighting.json @@ -5,7 +5,7 @@ "name": "electric lantern (off)", "name_plural": "electric lanterns (off)", "description": "This is a battery-powered lamp. It does not provide much light, but it lasts a long time. Use it to turn it on.", - "weight": 980, + "weight": "980 g", "volume": "1 L", "price": 1000, "bashing": 1, @@ -52,7 +52,7 @@ "material": [ "plastic", "aluminum" ], "symbol": ";", "color": "blue", - "weight": 400, + "weight": "400 g", "volume": "500 ml", "price": 500, "charges_per_use": 1, @@ -69,13 +69,13 @@ [ "battery", [ + "light_disposable_cell", + "light_minus_disposable_cell", "light_battery_cell", "light_plus_battery_cell", "light_minus_battery_cell", "light_atomic_battery_cell", - "light_minus_atomic_battery_cell", - "light_minus_disposable_cell", - "light_disposable_cell" + "light_minus_atomic_battery_cell" ] ] ], @@ -100,7 +100,7 @@ "material": [ "plastic", "powder" ], "symbol": ";", "color": "light_red", - "weight": 128, + "weight": "128 g", "volume": "250 ml", "price": 400, "max_charges": 300, @@ -120,7 +120,7 @@ "name": "active flare", "description": "This burning magnesium flare is producing light. It will last for about a half hour before burning out.", "color": "white", - "turns_per_charge": 1, + "turns_per_charge": 6, "revert_to": "handflare_dead", "revert_msg": "The flare sputters out", "use_action": { "type": "firestarter", "moves": 50 }, @@ -132,7 +132,7 @@ "name": "heavy duty flashlight (off)", "name_plural": "heavy duty flashlights (off)", "description": "This is a heavy duty tubular aluminum LED flashlight as often used by security guards. Makes for a passable melee weapon. Using this flashlight will turn it on and provide light, assuming it is charged with batteries.", - "weight": 650, + "weight": "650 g", "volume": "750 ml", "price": 950, "bashing": 8, @@ -154,13 +154,13 @@ [ "battery", [ + "light_disposable_cell", + "light_minus_disposable_cell", "light_plus_battery_cell", "light_battery_cell", "light_minus_battery_cell", "light_atomic_battery_cell", - "light_minus_atomic_battery_cell", - "light_minus_disposable_cell", - "light_disposable_cell" + "light_minus_atomic_battery_cell" ] ] ], @@ -188,7 +188,7 @@ "name": "acetylene lamp (off)", "name_plural": "acetylene lamps (off)", "description": "An antique brass lamp designed to run from a pressurized cylinder of acetylene. It is an efficient, if not somewhat dangerous light source.", - "weight": 800, + "weight": "800 g", "volume": "500 ml", "price": 6500, "symbol": ";", diff --git a/data/json/items/tool/med.json b/data/json/items/tool/med.json index 06231913eaaca..8d6333bafb099 100644 --- a/data/json/items/tool/med.json +++ b/data/json/items/tool/med.json @@ -5,7 +5,7 @@ "category": "drugs", "name": "inhaler", "description": "Albuterol inhaler. Used in the treatment of bronchospasm, it is a lifeline for people with asthma. A mild stimulant, it may cause nervousness or tremors.", - "weight": 85, + "weight": "85 g", "volume": "250 ml", "price": 5000, "material": "plastic", diff --git a/data/json/items/tool/radio_tools.json b/data/json/items/tool/radio_tools.json index d8d26ecdcf0a5..e55094ce8b951 100644 --- a/data/json/items/tool/radio_tools.json +++ b/data/json/items/tool/radio_tools.json @@ -6,7 +6,7 @@ "name": "radio car box", "name_plural": "radio car boxes", "description": "A RC car, with radio-control and batteries included! Disassemble to unpack and enjoy.", - "weight": 3200, + "weight": "3200 g", "volume": "2 L", "price": 30000, "to_hit": -1, @@ -30,13 +30,13 @@ [ "battery", [ + "light_disposable_cell", + "light_minus_disposable_cell", "light_battery_cell", "light_plus_battery_cell", "light_minus_battery_cell", "light_atomic_battery_cell", - "light_minus_atomic_battery_cell", - "light_minus_disposable_cell", - "light_disposable_cell" + "light_minus_atomic_battery_cell" ] ] ], @@ -54,7 +54,7 @@ "proportional": { "weight": 0.73, "volume": 0.75, "price": 0.8 }, "use_action": "RADIOCAR", "flags": [ "RADIO_CONTAINER" ], - "magazines": [ [ "battery", [ "light_minus_battery_cell", "light_minus_atomic_battery_cell", "light_minus_disposable_cell" ] ] ], + "magazines": [ [ "battery", [ "light_minus_disposable_cell", "light_minus_battery_cell", "light_minus_atomic_battery_cell" ] ] ], "magazine_well": 0 }, { @@ -74,7 +74,7 @@ "category": "spare_parts", "name": "radio activation mod", "description": "This small piece of electronics can be attached to certain items and activate them after receiving a radio signal.", - "weight": 142, + "weight": "142 g", "volume": "250 ml", "price": 5000, "to_hit": -2, @@ -89,7 +89,7 @@ "name": "radio (off)", "name_plural": "radios (off)", "description": "This is a portable radio. Using this radio turns it on. It will pick up any nearby signals being broadcast and play them audibly.", - "weight": 295, + "weight": "295 g", "volume": "1 L", "price": 1000, "to_hit": -1, @@ -103,13 +103,13 @@ [ "battery", [ + "light_disposable_cell", + "light_minus_disposable_cell", "light_battery_cell", "light_plus_battery_cell", "light_minus_battery_cell", "light_atomic_battery_cell", - "light_minus_atomic_battery_cell", - "light_minus_disposable_cell", - "light_disposable_cell" + "light_minus_atomic_battery_cell" ] ] ], @@ -133,7 +133,7 @@ "type": "TOOL", "name": "two-way radio", "description": "This is a radio with a transmitting unit. You could use it to contact someone who also has one. Unfortunately no one seems to use those nowadays...", - "weight": 431, + "weight": "431 g", "volume": "500 ml", "price": 2000, "bashing": 6, @@ -146,13 +146,13 @@ [ "battery", [ + "light_disposable_cell", + "light_minus_disposable_cell", "light_battery_cell", "light_plus_battery_cell", "light_minus_battery_cell", "light_atomic_battery_cell", - "light_minus_atomic_battery_cell", - "light_minus_disposable_cell", - "light_disposable_cell" + "light_minus_atomic_battery_cell" ] ] ], @@ -163,7 +163,7 @@ "type": "TOOL", "name": "remote vehicle controller", "description": "A remote controller for real cars. Can turn onboard devices on and off. Some cars can be driven remotely.", - "weight": 907, + "weight": "907 g", "volume": "1 L", "price": 2000, "to_hit": -1, diff --git a/data/json/items/tool/science.json b/data/json/items/tool/science.json index be9c52c58ec3b..14d107da55f11 100644 --- a/data/json/items/tool/science.json +++ b/data/json/items/tool/science.json @@ -4,7 +4,7 @@ "type": "TOOL", "name": "chemistry set", "description": "This is a chemistry set stored in a box. The contents include glass containers, hoses, metal wire, a hotplate, and safety glasses. It might be used to craft some chemistry projects if you're so inclined.", - "weight": 5200, + "weight": "5200 g", "volume": "4500 ml", "price": 20000, "to_hit": -5, @@ -30,7 +30,7 @@ "category": "tools", "name": "basic chemistry set", "description": "This is a basic chemistry set which includes glass containers, hoses and safety glasses. It might be used to craft some chemistry projects if you're so inclined, but you'll need a source of heat.", - "weight": 1884, + "weight": "1884 g", "volume": "2750 ml", "price": 3200, "to_hit": -5, @@ -45,7 +45,7 @@ "category": "tools", "name": "basic laboratory analysis kit", "description": "This hefty kit contains some basic things you should probably not try to do precise chemistry without: namely, a small balance scale, a spectrophotometer, a melting point apparatus, a pH meter, and a set of paper for thin layer chromatography. This makes it a lot easier to feel confident that the chemical you've made is what you think you've made.", - "weight": 12500, + "weight": "12500 g", "volume": "5 L", "price": 25000, "ammo": "battery", @@ -68,7 +68,7 @@ "category": "tools", "name": "small weight scale", "description": "This is a simple scale that uses a set of steel weights on sliding bars to measure a sample's mass quite accurately.", - "weight": 1000, + "weight": "1000 g", "volume": "2 L", "price": 1600, "to_hit": -5, @@ -82,7 +82,7 @@ "category": "tools", "name": "spectrophotometer", "description": "This ubiquitous analytical chemistry tool measures the light absorption of a liquid sample in a special tube called a cuvette.", - "weight": 5000, + "weight": "5000 g", "volume": "2 L", "price": 8000, "ammo": "battery", @@ -100,7 +100,7 @@ "name": "set of spectrometry cuvettes", "name_plural": "sets of spectrometry cuvettes", "description": "This is a small box filled with precisely calibrated square plastic tubes for laboratory spectrometer use.", - "weight": 500, + "weight": "500 g", "volume": "250 ml", "price": 1200, "to_hit": -5, @@ -114,7 +114,7 @@ "category": "tools", "name": "pH meter", "description": "This is basically a pair of glass probes on a voltmeter. By putting one probe into a calibration solution (conveniently included) and the other in a substance, you can calculate the acidity.", - "weight": 3000, + "weight": "3000 g", "volume": "1500 ml", "price": 6000, "ammo": "battery", @@ -144,7 +144,7 @@ "category": "tools", "name": "voltmeter", "description": "This device has two probes that let you measure the electrical potential between two points.", - "weight": 3000, + "weight": "3000 g", "volume": "1500 ml", "price": 6000, "ammo": "battery", @@ -175,7 +175,7 @@ "name": "melting point apparatus", "name_plural": "units of melting point apparatus", "description": "This is basically a hot plate, with a metal housing attached. The metal housing has a magnification viewport and a slot into which a capillary tube containing a crystallized sample is inserted. The device lets you precisely measure the melting point of a crystal, a property very useful in identifying what it is and how pure it is.", - "weight": 5000, + "weight": "5000 g", "volume": "1500 ml", "price": 6000, "ammo": "battery", @@ -205,7 +205,7 @@ "category": "tools", "name": "vortex device", "description": "This is a small, hefty, boring looking machine. Its weighted trapezoidal frame has a single on-off switch and a speed dial, and on top of it sits a rubber receptacle. Pressing a test tube into the receptacle would, with power, rapidly shake and mix the contents of the test tube. It's surprisingly fun to use.", - "weight": 3500, + "weight": "3500 g", "volume": "750 ml", "price": 1000, "to_hit": -5, @@ -219,7 +219,7 @@ "category": "spare_parts", "name": "light detector", "description": "This is a photodiode on a chip, designed to convert incoming light to electrical energy for quantification.", - "weight": 50, + "weight": "50 g", "volume": "250 ml", "price": 400, "to_hit": -5, @@ -234,7 +234,7 @@ "category": "spare_parts", "name": "glass prism", "description": "This is a high quality crystal glass prism for separating and redirecting light.", - "weight": 50, + "weight": "50 g", "volume": "250 ml", "price": 50, "to_hit": -5, @@ -248,7 +248,7 @@ "category": "spare_parts", "name": "small glass tube", "description": "This is a small glass tube. What more could you possibly want to know about it?", - "weight": 1, + "weight": "1 g", "volume": 0.1, "price": 10, "to_hit": -5, @@ -262,7 +262,7 @@ "category": "tools", "name": "microscope", "description": "A classic tool for the ages! This hefty, durable piece of lab equipment makes small things look bigger. Without electricity the light doesn't work, but the rest of it is surprisingly functional. Unfortunately it's not useful for very much at the moment.", - "weight": 2000, + "weight": "2000 g", "volume": "3800ml", "price": 3000, "to_hit": -5, @@ -276,7 +276,7 @@ "category": "tools", "name": "dissecting microscope", "description": "This microscope has less magnification than a standard one. It's also stereoscopic and produces a neat 3d image of the surface. It was typically used for doing dissections and other fine detail work on small creatures. It still works pretty well with an added light source, but what would you do with it?", - "weight": 2200, + "weight": "2200 g", "volume": "4000ml", "price": 3000, "to_hit": -5, @@ -290,7 +290,7 @@ "category": "tools", "name": "separation funnel", "description": "This thing doesn't look much like a funnel. It's a teardrop shaped piece of glass with a stopper at the wide end and a valve at the other. It can be used to wash one liquid with another, like water and an oil, and then draw off whichever of the two liquids contains a higher amount of whatever compound you're trying to isolate. With a high level of skill it can also be used to make juvenile farting noises.", - "weight": 200, + "weight": "200 g", "volume": "700ml", "price": 100, "to_hit": -5, @@ -306,7 +306,7 @@ "category": "tools", "name": "burette", "description": "A tall glass column with a stopcock at the end. If you're serious about chemistry, you probably have a tattoo of one of these somewhere.", - "weight": 300, + "weight": "300 g", "volume": "1000ml", "price": 1000, "to_hit": -4, @@ -321,7 +321,7 @@ "category": "tools", "name": "rotary evapourator", "description": "Just looking at this thing makes you feel like a proper mad scientist. It's a series of glass tubes and round flasks, connected to a central motor and a heating element. The heating element warms one flask, kept rotating by the motor, evapourating the contents. The vapour is then condensed in the tubes and collected in another flask, in case you wanted to save it for later.", - "weight": 18000, + "weight": "18000 g", "volume": "60000ml", "price": 8000, "to_hit": -5, @@ -337,7 +337,7 @@ "name": "fractional distillation apparatus", "name_plural": "fractional distillation apparati", "description": "One of the classic pieces of mad science glassware, this is basically a small volume still that passes the vapour through a fractional distillation column and then condenses the distillate in a cooled collection column. A grad student or a robot (is there really any difference?) collects the distillate in fractions so that specific contents can be analyzed. Going a few milliliters at a time, it would not be very effective to try to distill whiskey in this thing.", - "weight": 1000, + "weight": "1000 g", "volume": "5000ml", "price": 2000, "to_hit": -5, @@ -353,7 +353,7 @@ "category": "tools", "name": "electrophoresis tray", "description": "This is a set of plastic trays, electrodes, and a power supply designed to create an electric voltage gradient through a liquid solution containing a solid gel. Stuff like proteins and DNA would then get separated on the gel according to electrical charge and size. Pretty useless now, for anything but salvage.", - "weight": 1000, + "weight": "1000 g", "volume": "5000ml", "price": 500, "to_hit": -5, @@ -368,7 +368,7 @@ "category": "tools", "name": "microcentrifuge", "description": "This is a smaller, benchtop version of the larger furniture-sized centrifuge. Don't be fooled by its portable scale; it's still a very powerful piece of equipment that can spin stuff really quickly. It's not a toy!", - "weight": 2000, + "weight": "2000 g", "volume": "1500ml", "price": 1000, "to_hit": -5, @@ -400,7 +400,7 @@ "category": "spare_parts", "name": "plastic stopcock", "description": "Stop giggling. This is a tiny plastic valve, get your mind out of the gutter.", - "weight": 5, + "weight": "5 g", "volume": "1ml", "price": 5, "to_hit": -5, @@ -415,7 +415,7 @@ "category": "spare_parts", "name": "test tube rack", "description": "A plastic box with holes in it. Not that exciting, unless you're desperate for a place to store a test tube. Then it's great.", - "weight": 90, + "weight": "90 g", "volume": "250ml", "price": 25, "to_hit": -1, @@ -430,7 +430,7 @@ "category": "spare_parts", "name": "microcentrifuge tube tray", "description": "A plastic tray riddled with small holes, for storing microcentrifuge tubes.", - "weight": 70, + "weight": "70 g", "volume": "150ml", "price": 25, "to_hit": -1, @@ -445,7 +445,7 @@ "category": "spare_parts", "name": "ring stand", "description": "This is a heavy metal plate and a sturdy rod, for clamping lab stuff to.", - "weight": 900, + "weight": "900 g", "volume": "550ml", "price": 75, "to_hit": -1, @@ -461,7 +461,7 @@ "name": "set of ring stand clamps", "name_plural": "sets of ring stand clamps", "description": "This is a small box with a jumbled assortment of clamps for mounting on ring stands. There seems to be some sort of rule that all of them are missing at least one wing nut for tightening them; it looks like judicious use of twist ties, duct tape, and other random stuff has been used to compensate.", - "weight": 300, + "weight": "300 g", "volume": "450ml", "price": 75, "to_hit": -1, diff --git a/data/json/items/tool/workshop.json b/data/json/items/tool/workshop.json index cec9ba4407aee..0a057518f3f48 100644 --- a/data/json/items/tool/workshop.json +++ b/data/json/items/tool/workshop.json @@ -7,7 +7,7 @@ "material": "steel", "symbol": ";", "color": "light_gray", - "weight": 7000, + "weight": "7000 g", "volume": "1500 ml", "price": 18000, "bashing": 8, @@ -22,7 +22,7 @@ "material": "steel", "symbol": ";", "color": "light_gray", - "weight": 1800, + "weight": "1800 g", "volume": "1 L", "price": 800, "bashing": 4, @@ -37,7 +37,7 @@ "material": "steel", "symbol": ";", "color": "light_gray", - "weight": 3000, + "weight": "3000 g", "volume": "750 ml", "price": 5000, "bashing": 4, @@ -50,7 +50,7 @@ "name": "acetylene torch", "name_plural": "acetylene torches", "description": "A compact tool kit intended for welding and cutting metal, this portable oxyacetylene torch includes a torch handle and cutting attachment in an easy-to-carry tote. It requires connecting to pressurized cylinders of an appropriate welding gas before use. In addition to its metalworking uses, you can activate it in order to destroy metal barriers.", - "weight": 1600, + "weight": "1600 g", "volume": "1 L", "price": 20000, "material": [ "steel", "plastic" ], diff --git a/data/json/items/tool_armor.json b/data/json/items/tool_armor.json index 40358da333c4e..e41dba12f74fd 100644 --- a/data/json/items/tool_armor.json +++ b/data/json/items/tool_armor.json @@ -10,7 +10,7 @@ "flags": [ "WATERPROOF" ], "price": 12500, "material": [ "plastic" ], - "weight": 1196, + "weight": "1196 g", "volume": "3 L", "bashing": 6, "charges_per_use": 1, @@ -60,6 +60,80 @@ "techniques": [ "WBLOCK_1" ], "magazine_well": 1 }, + { + "id": "welding_mask", + "type": "ARMOR", + "name": "welding mask", + "description": "A plastic mask with a very dark visor, meant to protect the entire face while welding. It also serves as somewhat good armor, but makes it hard to see. Activate it to push it up your head.", + "weight": 4000, + "volume": "4 L", + "price": 1400, + "to_hit": -3, + "use_action": { "type": "transform", "msg": "You push your %s up your head.", "target": "welding_mask_raised", "menu_text": "Raise" }, + "material": [ "plastic" ], + "symbol": "[", + "color": "dark_gray", + "covers": [ "HEAD", "MOUTH", "EYES" ], + "coverage": 90, + "warmth": 5, + "encumbrance": 60, + "material_thickness": 3, + "qualities": [ [ "GLARE", 3 ] ], + "flags": [ "SUN_GLASSES", "FLASH_PROTECTION", "BLIND" ] + }, + { + "id": "welding_mask_crude", + "copy-from": "welding_mask", + "type": "ARMOR", + "name": "crude welding mask", + "description": "A crude welding mask made from shaped steel. It's less dark than a proper welding mask, and therefore less difficult to see in, but also less protective when welding. Activate it to push it up your head.", + "price": 1000, + "use_action": { + "type": "transform", + "msg": "You push your %s up your head.", + "target": "welding_mask_crude_raised", + "menu_text": "Raise" + }, + "material": [ "steel" ], + "material_thickness": 2, + "delete": { "qualities": [ [ "GLARE", 3 ] ], "flags": [ "BLIND" ] }, + "extend": { "qualities": [ [ "GLARE", 2 ] ] } + }, + { + "id": "welding_mask_crude_raised", + "copy-from": "welding_mask_crude", + "type": "ARMOR", + "name": "crude welding mask (raised)", + "name_plural": "crude welding masks (raised)", + "description": "A crude welding mask made from shaped steel. It's less dark than a proper welding mask, and therefore less difficult to see in, but also less protective when welding. Activate it to lower it over your face.", + "price": 1000, + "use_action": { + "type": "transform", + "msg": "You lower your crude welding mask over your face.", + "target": "welding_mask_crude", + "menu_text": "Lower" + }, + "covers": [ "HEAD" ], + "delete": { "flags": [ "SUN_GLASSES", "FLASH_PROTECTION" ] }, + "coverage": 30 + }, + { + "id": "welding_mask_raised", + "copy-from": "welding_mask", + "type": "ARMOR", + "name": "welding mask (raised)", + "name_plural": "welding masks (raised)", + "description": "A plastic mask with a very dark visor, meant to protect the entire face while welding. It also serves as somewhat good armor, but makes it hard to see. Activate it to lower it over your face.", + "use_action": { + "type": "transform", + "msg": "You lower your welding mask over your face.", + "target": "welding_mask", + "menu_text": "Lower" + }, + "covers": [ "HEAD" ], + "delete": { "flags": [ "SUN_GLASSES", "FLASH_PROTECTION", "BLIND" ] }, + "coverage": 30 + }, { "type": "TOOL_ARMOR", "id": "game_watch", @@ -68,7 +142,7 @@ "category": "clothing", "volume": "250 ml", "description": "A waterproof digital watch with a built-in electronic game system, powered by standard batteries. Activate to play.", - "weight": 112, + "weight": "112 g", "to_hit": -1, "color": "light_gray", "covers": [ "HAND_EITHER" ], @@ -79,14 +153,14 @@ "symbol": "[", "ammo": "battery", "use_action": "PORTABLE_GAME", - "magazines": [ [ "battery", [ "light_minus_battery_cell", "light_minus_atomic_battery_cell", "light_minus_disposable_cell" ] ] ] + "magazines": [ [ "battery", [ "light_minus_battery_cell", "light_minus_atomic_battery_cell" ] ] ] }, { "id": "holo_cloak", "type": "TOOL_ARMOR", "name": "hologram cloak", "description": "A cloak woven with metallic fibers and covered with hexagonal sheets of reflective carbide. When activated, it will create an holographic decoy of its wearer.", - "weight": 1552, + "weight": "1552 g", "volume": "3500 ml", "price": 5500000, "to_hit": -1, @@ -111,7 +185,7 @@ "category": "clothing", "id": "fedora", "name": "fedora", - "weight": 350, + "weight": "350 g", "color": "brown", "covers": [ "HEAD" ], "use_action": { "menu_text": "Tip", "type": "transform", "target": "fedora", "msg": "You tip your %s." }, @@ -139,7 +213,7 @@ "flags": [ "VARSIZE", "SKINTIGHT" ], "price": 5000, "material": [ "cotton" ], - "weight": 182, + "weight": "182 g", "volume": "750 ml", "charges_per_use": 1, "ammo": "battery", @@ -196,7 +270,7 @@ "flags": [ "VARSIZE", "SKINTIGHT" ], "price": 15000, "material": [ "cotton" ], - "weight": 864, + "weight": "864 g", "volume": "2 L", "charges_per_use": 1, "ammo": "battery", @@ -254,7 +328,7 @@ "flags": [ "VARSIZE", "SKINTIGHT" ], "price": 5000, "material": [ "cotton" ], - "weight": 210, + "weight": "210 g", "volume": "750 ml", "charges_per_use": 1, "ammo": "battery", @@ -311,7 +385,7 @@ "flags": [ "VARSIZE", "SKINTIGHT" ], "price": 5000, "material": [ "cotton" ], - "weight": 196, + "weight": "196 g", "volume": "1 L", "charges_per_use": 1, "ammo": "battery", @@ -369,7 +443,7 @@ "price": 30000, "material": [ "plastic", "glass" ], "flags": [ "ZOOM", "OVERSIZE", "BELTED", "ALLOWS_NATURAL_ATTACKS", "FIRESTARTER" ], - "weight": 708, + "weight": "708 g", "volume": "500 ml", "bashing": 4, "to_hit": -1, @@ -390,7 +464,7 @@ "price": 4000, "material": [ "plastic", "aluminum" ], "flags": [ "OVERSIZE", "BELTED", "ALLOWS_NATURAL_ATTACKS" ], - "weight": 520, + "weight": "520 g", "volume": "500 ml", "bashing": 1, "charges_per_use": 1, @@ -447,7 +521,7 @@ "price": 6500, "material": [ "plastic", "aluminum" ], "flags": [ "OVERSIZE", "BELTED", "ALLOWS_NATURAL_ATTACKS" ], - "weight": 620, + "weight": "620 g", "volume": "500 ml", "bashing": 1, "charges_per_use": 1, @@ -504,7 +578,7 @@ "flags": [ "VARSIZE", "STURDY", "WATERPROOF", "RAINPROOF", "WATCH", "ALARMCLOCK", "SWIM_GOGGLES", "SUN_GLASSES", "RAD_RESIST" ], "price": 50000000, "material": [ "ceramic", "kevlar" ], - "weight": 6820, + "weight": "6820 g", "volume": "9 L", "to_hit": -3, "max_charges": 5000, @@ -540,7 +614,7 @@ "TRADER_AVOID", "CLIMATE_CONTROL" ], - "turns_per_charge": 3, + "turns_per_charge": 18, "revert_to": "rm13_armor", "use_action": "RM13ARMOR_ON", "environmental_protection": 40, @@ -559,7 +633,7 @@ "flags": [ "WATER_FRIENDLY" ], "price": 25000, "material": [ "plastic", "aluminum" ], - "weight": 720, + "weight": "720 g", "volume": "500 ml", "to_hit": -3, "max_charges": 60, @@ -589,7 +663,7 @@ "name_plural": "rebreather masks (on)", "description": "A mask worn over your mouth which, when loaded with the proper filters, recycles your exhaled breath for rebreathing while underwater. It is turned on, and continually consuming its filter. Use it to turn it off.", "flags": [ "WATER_FRIENDLY", "REBREATHER", "TRADER_AVOID" ], - "turns_per_charge": 10, + "turns_per_charge": 30, "revert_to": "rebreather", "use_action": { "type": "transform", "menu_text": "Turn off", "msg": "Your %s deactivates.", "target": "rebreather" }, "environmental_protection": 15, @@ -606,7 +680,7 @@ "flags": [ "WATER_FRIENDLY", "OVERSIZE" ], "price": 25000, "material": [ "plastic", "aluminum" ], - "weight": 960, + "weight": "960 g", "volume": "1250 ml", "to_hit": -3, "max_charges": 60, @@ -636,7 +710,7 @@ "name_plural": "XL rebreather masks (on)", "description": "A mask worn over your mouth which, when loaded with the proper filters, recycles your exhaled breath for rebreathing while underwater. This model has been expanded substantially and can accommodate exotic anatomy. It is turned on, and continually consuming its filter. Use it to turn it off.", "flags": [ "WATER_FRIENDLY", "REBREATHER", "OVERSIZE", "TRADER_AVOID" ], - "turns_per_charge": 10, + "turns_per_charge": 30, "revert_to": "rebreather_xl", "use_action": { "type": "transform", "menu_text": "Turn off", "msg": "Your %s deactivates.", "target": "rebreather_xl" }, "covers": [ "MOUTH" ], @@ -648,7 +722,7 @@ "type": "TOOL_ARMOR", "name": "filter mask", "description": "A mask that straps over your mouth and nose and filters air. Protects from smoke, dust, and other contaminants quite well. It must be prepared before use.", - "weight": 260, + "weight": "260 g", "volume": "500 ml", "price": 3500, "to_hit": 1, @@ -673,7 +747,7 @@ "name": "gas mask", "category": "clothing", "description": "A full gas mask that covers the face and eyes. Provides excellent protection from smoke, teargas, and other contaminants. It must be prepared before use.", - "weight": 897, + "weight": "897 g", "volume": "1 L", "price": 4900, "to_hit": -3, @@ -698,7 +772,7 @@ "name": "XL gas mask", "category": "clothing", "description": "A rather roomy mask with filters attached, designed to accommodate exotic anatomy. Provides excellent protection from smoke, teargas, and other contaminants. It must be prepared before use.", - "weight": 1397, + "weight": "1397 g", "volume": "1500 ml", "price": 25000, "to_hit": -3, @@ -724,7 +798,7 @@ "category": "armor", "name": "survivor firemask", "description": "A custom-built, Nomex-insulated gas mask that covers the face and eyes. It provides excellent protection from heat, smoke, teargas, and shrapnel. It must be prepared before use.", - "weight": 708, + "weight": "708 g", "volume": "1250 ml", "price": 24000, "to_hit": -3, @@ -751,7 +825,7 @@ "category": "armor", "name": "XL survivor firemask", "description": "A custom-built, Nomex-insulated gas mask that covers the face and eyes regardless of your state of mutation. It provides excellent protection from heat, smoke, teargas, and shrapnel. It must be prepared before use.", - "weight": 1108, + "weight": "1108 g", "volume": "1250 ml", "price": 24000, "to_hit": -3, @@ -783,7 +857,7 @@ "flags": [ "VARSIZE", "WATERPROOF", "STURDY", "SUN_GLASSES" ], "price": 100000, "material": [ "plastic", "nomex" ], - "weight": 1260, + "weight": "1260 g", "volume": "1500 ml", "to_hit": -3, "max_charges": 100, @@ -805,7 +879,7 @@ "category": "armor", "name": "heavy survivor mask", "description": "A custom-built, steel reinforced gas mask that covers the face and eyes. Provides excellent protection from smoke, teargas, and shrapnel. It must be prepared before use.", - "weight": 858, + "weight": "858 g", "volume": "1250 ml", "price": 24000, "to_hit": -3, @@ -832,7 +906,7 @@ "category": "armor", "name": "light survivor mask", "description": "A custom-built, reinforced gas mask that covers the face and eyes. Provides excellent protection from smoke, teargas, and shrapnel. It must be prepared before use.", - "weight": 466, + "weight": "466 g", "volume": "1250 ml", "price": 24000, "to_hit": -3, @@ -860,7 +934,7 @@ "category": "armor", "name": "survivor mask", "description": "A custom-built, leather reinforced gas mask that covers the face and eyes. Provides excellent protection from smoke, teargas, and shrapnel. It must be prepared before use.", - "weight": 682, + "weight": "682 g", "volume": "1250 ml", "price": 24000, "to_hit": -3, @@ -887,7 +961,7 @@ "category": "armor", "name": "XL survivor mask", "description": "A custom-built, reinforced gas mask that covers the face and eyes regardless of your state of mutation. Provides excellent protection from smoke, teargas, and shrapnel. It must be prepared before use.", - "weight": 982, + "weight": "982 g", "volume": "1250 ml", "price": 24000, "to_hit": -3, @@ -914,7 +988,7 @@ "category": "armor", "name": "winter survivor mask", "description": "A custom-built, fur-trimmed gas mask that covers the face and eyes. Quite warm, it still provides excellent protection from smoke, teargas, and shrapnel. It must be prepared before use.", - "weight": 682, + "weight": "682 g", "volume": "1250 ml", "price": 24000, "to_hit": -3, @@ -941,7 +1015,7 @@ "category": "armor", "name": "XL winter survivor mask", "description": "A custom-built, fur-trimmed gas mask that covers the face and eyes regardless of your state of mutation. Quite warm, it still provides excellent protection from smoke, teargas, and shrapnel. It must be prepared before use.", - "weight": 1062, + "weight": "1062 g", "volume": "1250 ml", "price": 24000, "to_hit": -3, @@ -974,7 +1048,7 @@ "flags": [ "FRAGILE" ], "price": 92000, "material": [ "plastic", "steel" ], - "weight": 1020, + "weight": "1020 g", "volume": "1 L", "to_hit": -3, "charges_per_use": 1, @@ -1037,7 +1111,7 @@ "flags": [ "FRAGILE" ], "price": 92000, "material": [ "plastic", "steel" ], - "weight": 1240, + "weight": "1240 g", "volume": "1 L", "to_hit": -3, "charges_per_use": 1, @@ -1099,7 +1173,7 @@ "price": 40000, "material": [ "ceramic", "superalloy" ], "flags": [ "OVERSIZE" ], - "weight": 364, + "weight": "364 g", "volume": "750 ml", "max_charges": 2, "charges_per_use": 1, @@ -1119,7 +1193,7 @@ "price": 40000, "material": [ "superalloy", "kevlar" ], "flags": [ "OVERSIZE" ], - "weight": 212, + "weight": "212 g", "volume": "750 ml", "max_charges": 5, "initial_charges": 5, @@ -1139,7 +1213,7 @@ "flags": [ "VARSIZE", "STURDY", "WATER_FRIENDLY", "SWIM_GOGGLES" ], "price": 40000, "material": [ "kevlar", "plastic" ], - "weight": 982, + "weight": "982 g", "volume": "1500 ml", "to_hit": -3, "max_charges": 120, @@ -1168,7 +1242,7 @@ "name_plural": "survivor divemasks (on)", "description": "A custom-built, armored rebreather mask that covers the face and eyes. It provides excellent protection from harm as well providing breathing gas while underwater. It is turned on, and continually consuming its filter. Use it to turn it off.", "flags": [ "VARSIZE", "STURDY", "WATER_FRIENDLY", "REBREATHER", "SWIM_GOGGLES" ], - "turns_per_charge": 10, + "turns_per_charge": 30, "revert_to": "mask_h20survivor", "use_action": { "type": "transform", "menu_text": "Turn off", "msg": "Your %s deactivates.", "target": "mask_h20survivor" }, "covers": [ "MOUTH", "EYES" ], @@ -1185,7 +1259,7 @@ "flags": [ "VARSIZE", "STURDY", "WATER_FRIENDLY", "SWIM_GOGGLES", "OVERSIZE" ], "price": 40000, "material": [ "kevlar", "plastic" ], - "weight": 1302, + "weight": "1302 g", "volume": "2 L", "to_hit": -3, "max_charges": 120, @@ -1214,7 +1288,7 @@ "name_plural": "XL survivor divemasks (on)", "description": "A custom-built, armored rebreather mask that covers the face and eyes regardless of your state of mutation. It provides excellent protection from harm as well providing breathing gas while underwater. It is turned on, and continually consuming its filter. Use it to turn it off.", "flags": [ "VARSIZE", "STURDY", "WATER_FRIENDLY", "REBREATHER", "SWIM_GOGGLES", "OVERSIZE", "TRADER_AVOID" ], - "turns_per_charge": 10, + "turns_per_charge": 30, "revert_to": "mask_h20survivorxl", "use_action": { "type": "transform", "menu_text": "Turn off", "msg": "Your %s deactivates.", "target": "mask_h20survivorxl" }, "covers": [ "MOUTH", "EYES" ], @@ -1229,7 +1303,7 @@ "description": "A folded lightweight plastic rain poncho with a hood. Use it to unfold for use.", "price": 5000, "material": "plastic", - "weight": 280, + "weight": "280 g", "volume": "250 ml", "use_action": "UNPACK_ITEM" }, @@ -1243,7 +1317,7 @@ "description": "A lightweight plastic rain poncho with a hood. Use it to fold for storage.", "price": 5000, "material": "plastic", - "weight": 280, + "weight": "280 g", "volume": "1500 ml", "to_hit": -3, "revert_to": "folding_poncho", @@ -1263,7 +1337,7 @@ "description": "A folded blanket made of space-age materials that covers your most important body parts. Use it to unfold for use.", "price": 425, "material": "plastic", - "weight": 622, + "weight": "622 g", "volume": "500 ml", "use_action": "UNPACK_ITEM" }, @@ -1277,7 +1351,7 @@ "description": "A blanket made of space-age material that covers your most important body parts. Use it to fold for storage.", "price": 425, "material": "plastic", - "weight": 622, + "weight": "622 g", "volume": "2500 ml", "to_hit": -3, "revert_to": "emer_blanket", @@ -1300,7 +1374,7 @@ "description": "A small battery-powered biometric safety device worn on the wrist. Activate to check your current level of radiation exposure.", "price": 60000, "material": [ "plastic", "aluminum" ], - "weight": 68, + "weight": "68 g", "volume": "250 ml", "to_hit": -1, "charges_per_use": 1, @@ -1310,13 +1384,13 @@ "coverage": 5, "material_thickness": 1, "flags": [ "BELTED", "FRAGILE", "ALLOWS_NATURAL_ATTACKS", "WATER_FRIENDLY", "OVERSIZE" ], - "magazines": [ [ "battery", [ "light_minus_battery_cell", "light_minus_atomic_battery_cell", "light_minus_disposable_cell" ] ] ] + "magazines": [ [ "battery", [ "light_minus_battery_cell", "light_minus_atomic_battery_cell" ] ] ] }, { "type": "ARMOR", "id": "survivor_belt", "name": "survivor utility belt", - "weight": 3390, + "weight": "3390 g", "color": "brown", "covers": [ "TORSO" ], "storage": "500 ml", @@ -1365,7 +1439,7 @@ "description": "A plain hairpin to keep your hair in place.", "price": 50, "material": [ "iron" ], - "weight": 2, + "weight": "2 g", "use_action": { "type": "picklock", "pick_quality": 3 } }, { @@ -1378,7 +1452,7 @@ "description": "A pink hairpin with cute flower textures.", "price": 1000, "material": [ "plastic" ], - "weight": 4, + "weight": "4 g", "use_action": { "type": "picklock", "pick_quality": 1 }, "flags": [ "FANCY" ] }, @@ -1392,7 +1466,7 @@ "price": 4500, "material": "cotton", "covers": [ "TORSO", "LEGS" ], - "weight": 370, + "weight": "370 g", "volume": "500 ml", "to_hit": -1, "use_action": "TOWEL", @@ -1410,7 +1484,7 @@ "price": 2000, "material": "cotton", "covers": [ "TORSO", "LEGS" ], - "weight": 400, + "weight": "400 g", "volume": "500 ml", "to_hit": -1, "revert_to": "towel", @@ -1429,7 +1503,7 @@ "price": 2000, "material": "cotton", "covers": [ "TORSO", "LEGS" ], - "weight": 400, + "weight": "400 g", "volume": "500 ml", "to_hit": -1, "revert_to": "towel", @@ -1443,7 +1517,7 @@ "id": "straw_fedora", "category": "clothing", "name": "straw fedora", - "weight": 300, + "weight": "300 g", "color": "light_gray", "covers": [ "HEAD" ], "use_action": { "menu_text": "Tip", "type": "transform", "target": "straw_fedora", "msg": "You tip your %s." }, @@ -1470,7 +1544,7 @@ "description": "A simple and light cloth scarf, worn over the mouth for warmth. Use it to loosen it if you get too warm.", "price": 1000, "material": [ "cotton" ], - "weight": 60, + "weight": "60 g", "volume": "500 ml", "to_hit": -3, "use_action": { "type": "transform", "msg": "You loosen your %s.", "target": "patchwork_scarf_loose", "menu_text": "Loosen" }, @@ -1493,7 +1567,7 @@ "description": "A simple and light cloth scarf, worn over the mouth for warmth. Use it to wear it tighter if you get too cold.", "price": 1000, "material": [ "cotton" ], - "weight": 60, + "weight": "60 g", "volume": "500 ml", "to_hit": -3, "revert_to": "patchwork_scarf", @@ -1517,7 +1591,7 @@ "description": "A very long light cloth scarf, worn over the mouth for warmth. With the extra length, it's enough to handle nonstandard facial features and accommodate your hands too. Use it to loosen it if you get too warm.", "price": 1500, "material": [ "cotton" ], - "weight": 120, + "weight": "120 g", "volume": "1 L", "to_hit": -3, "use_action": { "type": "transform", "msg": "You loosen your %s.", "target": "long_patchwork_scarf_loose", "menu_text": "Loosen" }, @@ -1540,7 +1614,7 @@ "description": "A very long light cloth scarf, worn over the mouth for warmth. With the extra length, it's enough to handle nonstandard facial features and accommodate your hands too. Use it to wear it tighter if you get too cold.", "price": 1500, "material": [ "cotton" ], - "weight": 120, + "weight": "120 g", "volume": "1 L", "to_hit": -3, "use_action": { @@ -1569,7 +1643,7 @@ "description": "A long knitted cotton scarf, worn over the mouth for warmth. Use it to loosen it if you get too warm.", "price": 2000, "material": [ "cotton" ], - "weight": 96, + "weight": "96 g", "volume": "750 ml", "to_hit": -3, "use_action": { "type": "transform", "msg": "You loosen your %s.", "target": "knit_scarf_loose", "menu_text": "Loosen" }, @@ -1592,7 +1666,7 @@ "description": "A long knitted cotton scarf, worn over the mouth for warmth. Use it to wear it tighter if you get too cold.", "price": 2000, "material": [ "cotton" ], - "weight": 96, + "weight": "96 g", "volume": "750 ml", "to_hit": -3, "revert_to": "knit_scarf", @@ -1616,7 +1690,7 @@ "description": "A really long knitted cotton scarf, worn over the mouth for warmth. With the extra length, it's enough to handle nonstandard facial features and accommodate your hands too. Use it to loosen it if you get too warm.", "price": 3000, "material": [ "cotton" ], - "weight": 192, + "weight": "192 g", "volume": "1250 ml", "to_hit": -3, "use_action": { "type": "transform", "msg": "You loosen your %s.", "target": "long_knit_scarf_loose", "menu_text": "Loosen" }, @@ -1639,7 +1713,7 @@ "description": "A really long knitted cotton scarf, worn over the mouth for warmth. With the extra length, it's enough to handle nonstandard facial features and accommodate your hands too. Use it to wear it tighter if you get too cold.", "price": 3000, "material": [ "cotton" ], - "weight": 192, + "weight": "192 g", "volume": "1250 ml", "to_hit": -3, "use_action": { "type": "transform", "msg": "You wrap your scarf tighter.", "target": "long_knit_scarf", "menu_text": "Wrap tighter" }, @@ -1663,7 +1737,7 @@ "description": "A long wool scarf, worn over the mouth for warmth. Use it to loosen it if you get too warm.", "price": 3800, "material": [ "wool" ], - "weight": 80, + "weight": "80 g", "volume": "750 ml", "to_hit": -3, "use_action": { "type": "transform", "msg": "You loosen your %s.", "target": "scarf_loose", "menu_text": "Loosen" }, @@ -1686,7 +1760,7 @@ "description": "A long wool scarf, worn over the mouth for warmth. Use it to wear it tighter if you get too cold.", "price": 3800, "material": [ "wool" ], - "weight": 80, + "weight": "80 g", "volume": "750 ml", "to_hit": -3, "revert_to": "scarf", @@ -1710,7 +1784,7 @@ "description": "A really long wool scarf, worn over the mouth for warmth. With the extra length, it's enough to handle nonstandard facial features and accommodate your hands too. Use it to loosen it if you get too warm.", "price": 4500, "material": [ "wool" ], - "weight": 160, + "weight": "160 g", "volume": "1250 ml", "to_hit": -3, "use_action": { "type": "transform", "msg": "You loosen your %s.", "target": "scarf_long_loose", "menu_text": "Loosen" }, @@ -1733,7 +1807,7 @@ "description": "A really long wool scarf, worn over the mouth for warmth. With the extra length, it's enough to handle nonstandard facial features and accommodate your hands too. Use it to wear it tighter if you get too cold.", "price": 4500, "material": [ "wool" ], - "weight": 160, + "weight": "160 g", "volume": "1250 ml", "to_hit": -3, "use_action": { "type": "transform", "msg": "You wrap your scarf tighter.", "target": "scarf_long", "menu_text": "Wrap tighter" }, @@ -1757,7 +1831,7 @@ "description": "A long fur scarf, worn over the mouth for warmth. Use it to loosen it if you get too warm.", "price": 9000, "material": [ "fur" ], - "weight": 140, + "weight": "140 g", "volume": "1 L", "to_hit": -3, "use_action": { "type": "transform", "msg": "You loosen your %s.", "target": "scarf_fur_loose", "menu_text": "Loosen" }, @@ -1780,7 +1854,7 @@ "description": "A long fur scarf, worn over the mouth for warmth. Use it to wear it tighter if you get too cold.", "price": 9000, "material": [ "fur" ], - "weight": 140, + "weight": "140 g", "volume": "1 L", "to_hit": -3, "revert_to": "scarf_fur", @@ -1804,7 +1878,7 @@ "description": "A really long fur scarf, worn over the mouth for warmth. With the extra length, it's enough to handle nonstandard facial features and accommodate your hands too. Use it to loosen it if you get too warm.", "price": 17700, "material": [ "fur" ], - "weight": 280, + "weight": "280 g", "volume": "2 L", "to_hit": -3, "use_action": { "type": "transform", "msg": "You loosen your %s.", "target": "scarf_fur_long_loose", "menu_text": "Loosen" }, @@ -1827,7 +1901,7 @@ "description": "A really long fur scarf, worn over the mouth for warmth. With the extra length, it's enough to handle nonstandard facial features and accommodate your hands too. Use it to wear it tighter if you get too cold.", "price": 17700, "material": [ "fur" ], - "weight": 280, + "weight": "280 g", "volume": "2 L", "to_hit": -3, "use_action": { "type": "transform", "msg": "You wrap your scarf tighter.", "target": "scarf_fur_long", "menu_text": "Wrap tighter" }, @@ -1851,7 +1925,7 @@ "flags": [ "VARSIZE", "SKINTIGHT" ], "price": 30000, "material": [ "cotton" ], - "weight": 1452, + "weight": "1452 g", "volume": "4500 ml", "charges_per_use": 1, "ammo": "battery", @@ -1895,7 +1969,7 @@ "id": "mask_ski", "name": "ski mask", "category": "clothing", - "weight": 86, + "weight": "86 g", "color": "dark_gray", "covers": [ "HEAD", "MOUTH" ], "use_action": { @@ -1921,7 +1995,7 @@ "name": "ski mask (open)", "name_plural": "ski masks (open)", "category": "clothing", - "weight": 86, + "weight": "86 g", "color": "dark_gray", "covers": [ "HEAD", "MOUTH" ], "use_action": { @@ -1948,7 +2022,7 @@ "name": "whistle", "volume": "250 ml", "description": "A simple metal whistle, with a cord to wear it around your neck.", - "weight": 25, + "weight": "25 g", "to_hit": -1, "color": "light_gray", "price": 200, @@ -1974,7 +2048,7 @@ "name": "harmonica with a holder", "name_plural": "harmonicas with holders", "category": "tools", - "weight": 200, + "weight": "200 g", "color": "brown", "covers": [ "HEAD" ], "max_charges": 1, @@ -2003,7 +2077,7 @@ "name": "acoustic guitar", "name_plural": "acoustic guitars", "category": "tools", - "weight": 2500, + "weight": "2500 g", "color": "brown", "covers": [ "TORSO" ], "to_hit": 2, @@ -2040,7 +2114,7 @@ "id": "guitar_electric", "name": "electric guitar", "category": "tools", - "weight": 2250, + "weight": "2250 g", "color": "red", "covers": [ "TORSO" ], "to_hit": 2, @@ -2084,7 +2158,7 @@ "name": "bagpipes", "name_plural": "bagpipes", "category": "tools", - "weight": 2300, + "weight": "2300 g", "color": "green", "covers": [ "TORSO" ], "to_hit": -2, @@ -2125,7 +2199,7 @@ "name": "tuba", "name_plural": "tubas", "category": "tools", - "weight": 10000, + "weight": "10000 g", "color": "yellow", "covers": [ "TORSO" ], "flags": [ "BELTED" ], @@ -2159,7 +2233,7 @@ "name": "saxophone", "name_plural": "saxophones", "category": "tools", - "weight": 2000, + "weight": "2000 g", "color": "yellow", "covers": [ "TORSO" ], "flags": [ "BELTED" ], @@ -2206,7 +2280,7 @@ "flags": [ "OVERSIZE", "BELTED", "ALLOWS_NATURAL_ATTACKS" ], "price": 12500, "material": [ "plastic" ], - "weight": 179, + "weight": "179 g", "volume": "1 L", "charges_per_use": 1, "ammo": "battery", @@ -2251,7 +2325,7 @@ "flags": [ "OVERSIZE", "BELTED", "ALLOWS_NATURAL_ATTACKS", "PARTIAL_DEAF" ], "price": 12500, "material": [ "plastic" ], - "weight": 179, + "weight": "179 g", "volume": "1 L", "//": "3M Peltors claim to go 100 hours on 2 AAs", "power_draw": 60, @@ -2274,7 +2348,7 @@ "description": "This is a medical listening tool. Use it to listen to things. Closely.", "price": 4000, "material": [ "plastic", "aluminum" ], - "weight": 150, + "weight": "150 g", "volume": "250 ml", "covers": [ "TORSO" ], "encumbrance": 1, @@ -2287,7 +2361,7 @@ "name": "solar backpack (folded)", "name_plural": "solar backpacks (folded)", "description": "Personal portable charging system consisting of an array of solar panels neatly folded in a form of a large backpack. It can be worn as one, and has an integrated cable to plug it into a cable charger system.", - "weight": 7500, + "weight": "7500 g", "volume": "5 L", "price": 500000, "bashing": 10, @@ -2308,7 +2382,7 @@ "name": "solar backpack (unfolded)", "name_plural": "solar backpacks (unfolded)", "description": "Unfolded array of portable solar panels ready to push some power into an active cable charger system.", - "weight": 7500, + "weight": "7500 g", "volume": "15 L", "price": 500000, "bashing": 4, @@ -2329,7 +2403,7 @@ "name": "quantum solar backpack (folded)", "name_plural": "quantum solar backpacks (folded)", "description": "Personal portable charging system consisting of an array of quantum solar panels neatly folded in a form of a large backpack. It can be worn as one, and has an integrated cable to plug it into a cable charger system. Cutting edge technology.", - "weight": 7500, + "weight": "7500 g", "volume": "5 L", "price": 1500000, "bashing": 10, @@ -2350,7 +2424,7 @@ "name": "quantum solar backpack (unfolded)", "name_plural": "quantum solar backpacks (unfolded)", "description": "Unfolded array of portable quantum solar panels ready to push some power into an active cable charger system.", - "weight": 7500, + "weight": "7500 g", "volume": "15 L", "price": 1500000, "bashing": 4, @@ -2372,7 +2446,7 @@ "name": "riot helmet", "description": "A helmet with a plastic shield that covers your entire face. Activate to raise the face shield.", "use_action": { "type": "transform", "target": "helmet_riot_raised", "msg": "You raise your visor." }, - "weight": 2260, + "weight": "2260 g", "volume": "2250 ml", "price": 22000, "to_hit": -1, @@ -2397,7 +2471,7 @@ "name_plural": "riot helmets (raised visor)", "description": "A riot helmet with a plastic face shield which is raised up. Activate to lower the shield.", "use_action": { "type": "transform", "target": "helmet_riot", "msg": "You put down your visor." }, - "weight": 2260, + "weight": "2260 g", "volume": "2250 ml", "price": 22000, "to_hit": -1, @@ -2421,7 +2495,7 @@ "name": "scuba tank", "looks_like": "oxygen_tank", "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.", - "weight": 16000, + "weight": "16000 g", "volume": "12 L", "price": 6000, "to_hit": -4, @@ -2448,7 +2522,7 @@ "name": "scuba tank (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, + "weight": "16000 g", "volume": "12 L", "price": 6000, "to_hit": -4, @@ -2458,7 +2532,7 @@ "color": "light_gray", "max_charges": 60, "charges_per_use": 1, - "turns_per_charge": 10, + "turns_per_charge": 60, "ammo": "nitrox", "covers": [ "TORSO", "MOUTH" ], "flags": [ "WATER_FRIENDLY", "BELTED", "ONLY_ONE", "STURDY" ], @@ -2476,7 +2550,7 @@ "name": "small scuba tank", "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, + "weight": "7000 g", "volume": "4 L", "price": 4000, "to_hit": -3, @@ -2503,7 +2577,7 @@ "name": "small scuba tank (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, + "weight": "7000 g", "volume": "4 L", "price": 4000, "to_hit": -3, @@ -2513,7 +2587,7 @@ "color": "light_gray", "max_charges": 20, "charges_per_use": 1, - "turns_per_charge": 10, + "turns_per_charge": 60, "ammo": "nitrox", "covers": [ "TORSO", "MOUTH" ], "flags": [ "WATER_FRIENDLY", "BELTED", "ONLY_ONE", "STURDY" ], @@ -2529,7 +2603,7 @@ "type": "TOOL_ARMOR", "name": "electric blanket", "description": "A heated blanket made of polyester. The most comfortable thing on Earth. Its cost is usually negligible, but with the power out, it chews through batteries insanely quickly.", - "weight": 1123, + "weight": "1123 g", "volume": "2500 ml", "price": 5500, "to_hit": -1, @@ -2578,7 +2652,7 @@ "type": "TOOL_ARMOR", "name": "Foodperson mask", "description": "Foodperson, the mascot your stomach deserves!", - "weight": 1500, + "weight": "1500 g", "volume": "16L", "price": 1500, "to_hit": -3, diff --git a/data/json/items/toolmod.json b/data/json/items/toolmod.json index 0201913c5d9c3..4d6ddd988ef96 100644 --- a/data/json/items/toolmod.json +++ b/data/json/items/toolmod.json @@ -3,7 +3,7 @@ "abstract": "mod_battery", "type": "TOOLMOD", "name": "base toolmod", - "weight": 142, + "weight": "142 g", "volume": "250 ml", "material": [ "plastic", "ceramic" ], "symbol": ";", @@ -25,7 +25,7 @@ "category": "spare_parts", "name": "reactor core expansion device", "description": "This is an expansion device for use on plutonium-powered equipment. With enough electronics skill, you could attach this to an atomic tool to double the amount of plutonium it can hold. Note that this device is incompatible with the atomic battery mod.", - "weight": 694, + "weight": "694 g", "volume": "750 ml", "price": 10000, "material": [ "superalloy", "plastic" ], diff --git a/data/json/items/tools.json b/data/json/items/tools.json index 5c4c128424388..78a755a9972cb 100644 --- a/data/json/items/tools.json +++ b/data/json/items/tools.json @@ -5,7 +5,7 @@ "category": "weapons", "name": "EMP grenade", "description": "This is a grenade that generates a electromagnetic pulse with a low-inductance capacitor bank discharged into a single-loop antenna. Use this item to pull the pin and light the fuse, turning it into an active EMP grenade. You will then have three turns before it detonates, creating an EMP field that damages robots and drains bionic energy.", - "weight": 400, + "weight": "400 g", "volume": "250 ml", "price": 6000, "to_hit": -1, @@ -28,7 +28,7 @@ "type": "TOOL", "name": "riding saddle", "description": "A saddle that can be placed on a tamed animal that is capable of being ridden.", - "weight": 800, + "weight": "800 g", "volume": "2 L", "price": 0, "to_hit": -1, @@ -43,7 +43,7 @@ "category": "weapons", "name": "active EMP grenade", "description": "This EMP grenade is active, and will shortly detonate, creating a large EMP field that damages robots and drains bionic energy. You may not want to be holding it much longer.", - "weight": 400, + "weight": "400 g", "volume": "250 ml", "price": 0, "to_hit": -1, @@ -72,7 +72,7 @@ "name": "packed M72 LAW", "name_plural": "packed M72 LAWs", "description": "This is a M72 LAW, packed in its storage form. Use it to pop it out and make it ready to fire. Once it is activated, it cannot be repacked.", - "weight": 2500, + "weight": "2500 g", "volume": "1500 ml", "price": 200000, "bashing": 6, @@ -97,7 +97,7 @@ "description": "This pump is suitable for pumping air into inflatable objects.", "price": 400, "material": [ "aluminum", "plastic" ], - "weight": 113, + "weight": "113 g", "volume": "500 ml", "bashing": 4, "to_hit": -1, @@ -108,8 +108,8 @@ "type": "TOOL", "name": "UPS", "name_plural": "UPS's", - "description": "This is a unified power supply, or UPS. It is a device developed jointly by military and scientific interests for use in combat and the field. The UPS is designed to power armor and some guns, but drains batteries quickly.", - "weight": 680, + "description": "This is a unified power supply, or UPS. It is a device developed jointly by military and scientific interests for use in combat and the field. The UPS is designed to power bionics, armor and some guns, but drains batteries quickly.", + "weight": "680 g", "volume": "2500 ml", "price": 280000, "to_hit": -1, @@ -121,7 +121,8 @@ "magazines": [ [ "battery", [ "heavy_plus_battery_cell", "heavy_battery_cell", "heavy_atomic_battery_cell", "heavy_disposable_cell" ] ] ], - "magazine_well": 4 + "magazine_well": 4, + "flags": [ "IS_UPS" ] }, { "id": "acidbomb", @@ -129,7 +130,7 @@ "category": "weapons", "name": "acid bomb", "description": "This is a fragile container filled with acid. Throw it to spill out a pool of potent acid.", - "weight": 650, + "weight": "650 g", "volume": "500 ml", "price": 5000, "to_hit": -1, @@ -146,7 +147,7 @@ "name": "advanced UPS", "name_plural": "advanced UPS's", "description": "This is an advanced version of the unified power supply, or UPS. This device has been significantly redesigned to provide better efficiency as well as to consume plutonium fuel cells rather than batteries. Sadly, its plutonium reactor can't be charged in UPS charging station.", - "weight": 453, + "weight": "453 g", "volume": "2 L", "price": 560000, "to_hit": -1, @@ -155,7 +156,8 @@ "symbol": ";", "color": "light_green", "ammo": "plutonium", - "max_charges": 2500 + "max_charges": 2500, + "flags": [ "IS_UPS" ] }, { "id": "advanced_ecig", @@ -163,7 +165,7 @@ "name": "advanced electronic cigarette", "description": "An advanced version of the electronic cigarette. A less harmful way to get your nicotine fix than regular cigarettes, but still addictive. It needs batteries and nicotine liquid to function.", "category": "drugs", - "weight": 200, + "weight": "200 g", "volume": "250 ml", "price": 5000, "to_hit": -1, @@ -195,7 +197,7 @@ "type": "TOOL", "name": "compressed air horn", "description": "This is a small can of compressed air attached to a plastic horn. Pressing the button on top causes it to emit a loud honking sound.", - "weight": 467, + "weight": "467 g", "volume": "250 ml", "price": 500, "to_hit": -4, @@ -223,7 +225,7 @@ "type": "TOOL", "name": "alarm clock", "description": "A wind-up alarm clock. Though the noise it makes is unpleasant to wake up to, it's always good to get an early start to your day. Can also be disassembled into some useful parts.", - "weight": 562, + "weight": "562 g", "volume": "250 ml", "price": 5000, "price_postapoc": 100, @@ -239,7 +241,7 @@ "type": "TOOL", "name": "anvil", "description": "This is an enormously heavy block of oddly shaped steel with a chisel-like projection set into the corner. It's used in most metalworking fabrication recipes.", - "weight": 54000, + "weight": "54000 g", "volume": "4 L", "price": 100000, "to_hit": -5, @@ -255,7 +257,7 @@ "type": "TOOL", "name": "water mill", "description": "A small water-powered mill that can convert starchy products into flour. Can be placed via the construction menu.", - "weight": 120000, + "weight": "120000 g", "volume": "22500 ml", "price": 100000, "to_hit": -5, @@ -270,7 +272,7 @@ "type": "TOOL", "name": "wind mill", "description": "A small wind-powered mill that can convert starchy products into flour. Can be placed via the construction menu.", - "weight": 120000, + "weight": "120000 g", "volume": "22500 ml", "price": 100000, "to_hit": -5, @@ -286,7 +288,7 @@ "category": "tools", "name": "atomic coffee maker", "description": "This is a Curie-G coffeemaker, by CuppaTech. It famously uses a radioactive generator to heat water for coffee. Normally the water is heated using energy stored in a capacitor, and makes ordinary coffee. However, as a special feature, water from the RTG containment area can be used, giving the coffee a very special kick. The Curie-G is illegal in most countries.", - "weight": 6102, + "weight": "6102 g", "volume": "1000 ml", "price": 100000, "to_hit": -2, @@ -304,7 +306,7 @@ "category": "tools", "name": "atomic lamp", "description": "Powered by the magic of nuclear decay and low-energy LEDs, this very expensive lamp will emit a small amount of light for at least a decade. Before the Cataclysm, it was mostly an expensive way to show off your preparedness. Now, it's actually pretty cool. Use it to close the cover and hide the light.", - "weight": 1438, + "weight": "1438 g", "volume": "1 L", "price": 175000, "to_hit": -2, @@ -322,7 +324,7 @@ "name": "atomic lamp (covered)", "name_plural": "atomic lamps (covered)", "description": "Powered by the magic of nuclear decay and low-energy LEDs, this very expensive lamp will emit a small amount of light for at least a decade. Before the Cataclysm, it was mostly an expensive way to show off your preparedness. Now, it's actually pretty cool. The cover is closed. Use it to open the cover and show the light.", - "weight": 1438, + "weight": "1438 g", "volume": "1 L", "price": 175000, "to_hit": -2, @@ -339,7 +341,7 @@ "category": "tools", "name": "atomic reading light", "description": "Powered by the magic of nuclear decay and low-energy LEDs, this extremely expensive little light will provide just enough light to read by for at least a decade. It is also available with a cute cartoon bear cover to turn it into a nightlight for a very wealthy child with a fear of the dark. Use it to close the cover and hide the light.", - "weight": 214, + "weight": "214 g", "volume": "250 ml", "price": 125000, "to_hit": -2, @@ -362,7 +364,7 @@ "name": "atomic reading light (covered)", "name_plural": "atomic reading lights (covered)", "description": "Powered by the magic of nuclear decay and low-energy LEDs, this extremely expensive little light will provide just enough light to read by for at least a decade. It is also available with a cute cartoon bear cover to turn it into a nightlight for a very wealthy child with a fear of the dark. The cover is closed. Use it to open the cover and show the light.", - "weight": 214, + "weight": "214 g", "volume": "250 ml", "price": 125000, "to_hit": -2, @@ -384,7 +386,7 @@ "price": 12500, "use_action": "MIND_SPLICER", "volume": "1 L", - "weight": 600, + "weight": "600 g", "flags": [ "TRADER_AVOID" ] }, { @@ -394,7 +396,7 @@ "name": "banjo", "name_plural": "banjos", "description": "A standard factory-made banjo. Looks to be in working condition.", - "weight": 2000, + "weight": "2000 g", "volume": "3 L", "price": 7500, "to_hit": 2, @@ -425,7 +427,7 @@ "name": "barometer", "name_plural": "barometers", "description": "A plastic barometer that can read the atmospheric pressure.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 100, "to_hit": -3, @@ -440,7 +442,7 @@ "type": "TOOL", "name": "bear trap", "description": "This is a spring-loaded pair of steel jaws connected to a sensitive pressure plate. Use it to set it on the ground, creating a trap that will ensnare and damage anything that steps on it. If you are carrying a shovel, you will have the option of burying it.", - "weight": 11793, + "weight": "11793 g", "volume": "1500 ml", "price": 6000, "to_hit": -2, @@ -465,7 +467,7 @@ "type": "TOOL", "name": "blade trap", "description": "This is a machete attached laterally to a motor, with a tripwire controlling its throttle. When the tripwire is pulled, the blade is swung around with great force. The trap forms a 3x3 area of effect.", - "weight": 2381, + "weight": "2381 g", "volume": "4500 ml", "price": 5000, "to_hit": -4, @@ -488,7 +490,7 @@ "type": "TOOL", "name": "nailboard trap", "description": "These are several pieces of wood nailed together, with some nails sticking straight up. If an unsuspecting victim steps on it, they'll get nails through the foot.", - "weight": 2041, + "weight": "2041 g", "volume": "1500 ml", "price": 0, "to_hit": -3, @@ -512,7 +514,7 @@ "name": "pair of bolt cutters", "name_plural": "pairs of bolt cutters", "description": "This is a large pair of bolt cutters. You could use them to cut padlocks or heavy gauge wire.", - "weight": 1224, + "weight": "1224 g", "volume": "750 ml", "price": 3000, "to_hit": -1, @@ -531,7 +533,7 @@ "name": "bone flute", "name_plural": "bone flutes", "description": "A polished bone flute with five finger holes.", - "weight": 250, + "weight": "250 g", "volume": "500 ml", "price": 5000, "bashing": 2, @@ -560,7 +562,7 @@ "type": "TOOL", "name": "booby trap", "description": "This is a crude explosive device triggered by a piece of string. Use it to setup and watch some poor bastard trigger it.", - "weight": 586, + "weight": "586 g", "volume": "750 ml", "price": 5000, "to_hit": -4, @@ -580,7 +582,7 @@ "type": "TOOL", "name": "brick kiln", "description": "This is a portable charcoal-fired kiln. It is designed for firing bricks, but you could use it to fire anything made of clay.", - "weight": 9600, + "weight": "9600 g", "volume": "9 L", "price": 25000, "to_hit": -3, @@ -597,7 +599,7 @@ "type": "TOOL", "name": "electric kiln", "description": "This is a portable electric kiln, powered by batteries. It is designed for firing bricks, but you could use it to fire anything made of clay. With a little mechanical know-how, you could probably even convert it to run directly off a vehicle's power system.", - "weight": 12000, + "weight": "12000 g", "volume": "7500 ml", "price": 50000, "to_hit": -3, @@ -617,7 +619,7 @@ "type": "TOOL", "name": "bubble wrap", "description": "This is a sheet of plastic covered with air-filled bubbles. Use it to set it on the ground, creating a trap that will warn you with noise when something steps on it.", - "weight": 6, + "weight": "6 g", "volume": "250 ml", "price": 50, "material": "plastic", @@ -638,7 +640,7 @@ "category": "weapons", "name": "C-4 explosive", "description": "This is military grade RDX composition explosive. A label reads: \"Highly explosive, use with extreme caution!\" It comes with a small timer.", - "weight": 1570, + "weight": "1570 g", "volume": "1 L", "price": 9000, "to_hit": -4, @@ -654,7 +656,7 @@ "name": "C-4 explosive (armed)", "name_plural": "C-4 explosives (armed)", "description": "This is military grade RDX composition explosive. A label reads: \"Highly explosive, use with extreme caution!\" It comes with a small timer, which is currently ticking down.", - "weight": 1570, + "weight": "1570 g", "volume": "1 L", "price": 0, "to_hit": -4, @@ -679,7 +681,7 @@ "name": "loose caltrops", "name_plural": "loose caltrops", "description": "These are small metal objects covered with many sharp points. If an unsuspecting victim steps on one, they'll get a spine through the foot.", - "weight": 264, + "weight": "264 g", "volume": "250 ml", "price": 900, "to_hit": -4, @@ -702,7 +704,7 @@ "name": "loose glass caltrops", "name_plural": "loose glass caltrops", "description": "These are glass shards glued together to expose their sharp edges. If an unsuspecting victim steps on one, they'll get cut.", - "weight": 264, + "weight": "264 g", "volume": "500 ml", "price": 100, "to_hit": -4, @@ -723,7 +725,7 @@ "type": "TOOL", "name": "camera", "description": "A point-and-shoot digital camera, with digital viewfinder, a backup 'iron-sight', and flash. You can look at your photos on the digital screen, or transfer them with a memory card. Takes conventional batteries.", - "weight": 907, + "weight": "907 g", "volume": "250 ml", "price": 20000, "bashing": 1, @@ -755,7 +757,7 @@ "type": "TOOL", "name": "camera pro", "description": "A 35mm digital SLR (single-lens reflex) camera, with optical and digital viewfinders, zoom lens with auto-focus and stabilizer, and flash. You can view your photos on it or transfer them with a memory card; it runs on conventional batteries. Before the cataclysm, you could have taken professional-grade photos using this.", - "weight": 2268, + "weight": "2268 g", "volume": "1250 ml", "price": 800000, "bashing": 1, @@ -789,7 +791,7 @@ "category": "tools", "name": "can sealer", "description": "A hand crank powered cast steel machine designed to automatically seal tin cans.", - "weight": 9800, + "weight": "9800 g", "volume": "5 L", "price": 52500, "to_hit": -2, @@ -803,7 +805,7 @@ "type": "TOOL", "name": "candle", "description": "This is a thick candle. It doesn't provide very much light, but it can burn for quite a long time. You'll need a lighter or matches to light it.", - "weight": 100, + "weight": "100 g", "volume": "250 ml", "price": 100, "to_hit": -2, @@ -829,7 +831,7 @@ "name": "candle", "name_plural": "candles", "description": "This is a thick candle. It doesn't provide very much light, but it can burn for quite a long time. This candle is lit.", - "weight": 100, + "weight": "100 g", "volume": "250 ml", "price": 0, "to_hit": -2, @@ -839,7 +841,7 @@ "initial_charges": 100, "max_charges": 100, "charges_per_use": 1, - "turns_per_charge": 50, + "turns_per_charge": 1350, "use_action": { "target": "candle", "msg": "The candle winks out.", "menu_text": "Extinguish", "type": "transform" }, "flags": [ "LIGHT_8", "WATER_EXTINGUISH", "TRADER_AVOID", "WIND_EXTINGUISH" ] }, @@ -848,7 +850,7 @@ "type": "TOOL", "name": "goo canister", "description": "There is a label on this canister: \"Warning: contains highly toxic and corrosive materials. Contents may be sentient. Open at your own risk.\" You think you can feel something moving inside it.", - "weight": 1596, + "weight": "1596 g", "volume": "500 ml", "price": 35000, "to_hit": 1, @@ -882,7 +884,7 @@ "name": "carding paddles", "name_plural": "pairs of carding paddles", "description": "A pair of toothy wooden paddles used to clean fibers for use in textile production.", - "weight": 360, + "weight": "360 g", "volume": "500 ml", "price": 3000, "to_hit": 1, @@ -897,7 +899,7 @@ "name": "electric carver (off)", "name_plural": "electric carvers (off)", "description": "An electric meat carver powered by batteries. Two serrated blades that vibrate together to slice just about anything from turkey to ham... even zombies!", - "weight": 1106, + "weight": "1106 g", "volume": "1500 ml", "price": 2000, "bashing": 2, @@ -937,7 +939,7 @@ "name": "cat food", "name_plural": "cat food", "description": "This is food for cats. It smells strange, but cats seem to love it.", - "weight": 223, + "weight": "223 g", "volume": "250 ml", "price": 300, "to_hit": -5, @@ -952,7 +954,7 @@ "name": "cellphone", "name_plural": "cellphones", "description": "This is a cellphone, an older cousin of a smartphone but still popular in certain circles due to its reliability, sturdiness and the ability to run on common batteries. Using this cellphone will turn it on and provide light, assuming it is sufficiently charged. It also has a clock app that includes an alarm.", - "weight": 226, + "weight": "226 g", "volume": "100 ml", "price": 9000, "price_postapoc": 2000, @@ -978,9 +980,7 @@ "light_minus_battery_cell", "light_battery_cell", "light_atomic_battery_cell", - "light_minus_atomic_battery_cell", - "light_minus_disposable_cell", - "light_disposable_cell" + "light_minus_atomic_battery_cell" ] ] ], @@ -992,7 +992,7 @@ "type": "TOOL", "name": "cellphone - Flashlight", "name_plural": "cellphones - Flashlight", - "turns_per_charge": 30, + "power_draw": 500, "revert_to": "cell_phone", "use_action": { "target": "cell_phone", "msg": "You stop lighting up the screen.", "menu_text": "Turn off", "type": "transform" }, "flags": [ "LIGHT_15", "CHARGEDIM", "TRADER_AVOID" ] @@ -1003,7 +1003,7 @@ "name": "smartphone", "name_plural": "smartphones", "description": "A popular, fancy smartphone. Capable of making photos due to integrated camera and illuminating an area as per flashlight app, assuming it has enough charge. The smartphone also has a clock app that includes an alarm. Runs on a small, rechargeable power cell compatible with Unified Power Supply.", - "weight": 230, + "weight": "230 g", "volume": "100 ml", "price": 20000, "price_postapoc": 1900, @@ -1036,7 +1036,7 @@ "name": "smartphone - music", "name_plural": "smartphones - music", "description": "This phone is playing music, steadily raising your morale. You can't hear anything else while you're listening.", - "turns_per_charge": 150, + "power_draw": 300, "revert_to": "smart_phone", "use_action": "MP3_ON", "flags": [ "TRADER_AVOID" ], @@ -1048,8 +1048,7 @@ "type": "TOOL", "name": "smartphone - Flashlight", "name_plural": "smartphones - Flashlight", - "power_draw": 3000, - "turns_per_charge": 50, + "power_draw": 500, "revert_to": "smart_phone", "use_action": { "target": "smart_phone", @@ -1065,7 +1064,7 @@ "name": "chainsaw (off)", "name_plural": "chainsaws (off)", "description": "This is a lumbering tool moonlighting as weapon of opportunity. If loaded with gas, using this item will cause it to turn on, turning it into a very powerful but unwieldy melee weapon.", - "weight": 6577, + "weight": "6577 g", "volume": "2500 ml", "price": 8000, "to_hit": -4, @@ -1074,7 +1073,7 @@ "symbol": "/", "color": "red", "ammo": "gasoline", - "max_charges": 400, + "max_charges": 450, "techniques": "SWEEP", "use_action": "CHAINSAW_OFF", "flags": [ "NONCONDUCTIVE" ] @@ -1089,7 +1088,7 @@ "to_hit": -5, "bashing": 4, "cutting": 70, - "power_draw": 150000, + "turns_per_charge": 4, "revert_to": "chainsaw_off", "techniques": "SWEEP", "qualities": [ [ "AXE", 4 ], [ "BUTCHER", -100 ] ], @@ -1101,7 +1100,7 @@ "type": "TOOL", "name": "charcoal forge", "description": "This is a portable, charcoal fired, metalworking forge. If combined with the right tools, you could use this for metalworking.", - "weight": 8600, + "weight": "8600 g", "volume": "8 L", "price": 20000, "to_hit": -2, @@ -1120,7 +1119,7 @@ "category": "tools", "name": "charcoal kiln", "description": "A stout metal box used for producing charcoal via pyrolysis; the incomplete burning of organic materials in the absence of oxygen.", - "weight": 6400, + "weight": "6400 g", "volume": "7500 ml", "price": 16000, "to_hit": -2, @@ -1135,7 +1134,7 @@ "type": "TOOL", "name": "charcoal water purifier", "description": "Using this item on a container full of water will purify the water using layered charcoal. Once the charcoal has purified enough water, it will become unusable and can be disassembled and recycled. Water taken from uncertain sources like a river may be dirty.", - "weight": 1820, + "weight": "1820 g", "volume": "3750 ml", "price": 4000, "to_hit": -3, @@ -1154,7 +1153,7 @@ "type": "TOOL", "name": "charcoal smoker", "description": "This is a portable charcoal smoker. Good for weekend barbecuing and preserving meat with smoke.", - "weight": 2600, + "weight": "2600 g", "volume": "5 L", "price": 10000, "to_hit": -2, @@ -1171,7 +1170,7 @@ "type": "TOOL", "name": "charcoal cooker", "description": "This is a little metal tank for holding charcoal with a pilot light attached. You could use it for cooking food.", - "weight": 405, + "weight": "405 g", "volume": "1250 ml", "price": 5000, "to_hit": -1, @@ -1191,7 +1190,7 @@ "type": "TOOL", "name": "paint chipper", "description": "A tool similar to a chisel, designed to remove paint.", - "weight": 60, + "weight": "60 g", "volume": "500 ml", "price": 7000, "to_hit": 1, @@ -1206,7 +1205,7 @@ "type": "TOOL", "name": "metalworking chisel", "description": "This is a short, stout metalworking chisel. It's used in some metalworking fabrication recipes.", - "weight": 660, + "weight": "660 g", "volume": "250 ml", "price": 1600, "to_hit": 2, @@ -1224,7 +1223,7 @@ "name": "circular saw (off)", "name_plural": "circular saws (off)", "description": "A lightweight handheld cordless circular saw. Spins a circular blade fast enough to cut wood, zombies, or in an emergency, pizza. The blade, while effective in combat, is hard to hit with due to its small size.", - "weight": 2940, + "weight": "2940 g", "volume": "750 ml", "price": 5000, "to_hit": -3, @@ -1268,7 +1267,7 @@ "name": "clarinet", "name_plural": "clarinets", "description": "An ornate clarinet made from wood.", - "weight": 550, + "weight": "550 g", "volume": "1500 ml", "price": 5500, "to_hit": 1, @@ -1298,7 +1297,7 @@ "category": "tools", "name": "clay pot", "description": "A crude clay pot with lid used for cooking.", - "weight": 480, + "weight": "480 g", "volume": "2 L", "price": 2500, "bashing": 1, @@ -1316,7 +1315,7 @@ "category": "tools", "name": "clay quern", "description": "This is a simple hand-powered clay quern for grinding grain.", - "weight": 2264, + "weight": "2264 g", "volume": "1500 ml", "price": 3000, "material": "clay", @@ -1329,7 +1328,7 @@ "category": "tools", "name": "clay teapot", "description": "A clay teapot. Now all you need is tea and water.", - "weight": 429, + "weight": "429 g", "volume": "750 ml", "price": 2000, "to_hit": 1, @@ -1345,7 +1344,7 @@ "type": "TOOL", "name": "coffeemaker", "description": "This is a heating element with pot and frame for holding coffee or other powders. It's got a battery compartment for use when the power goes out. You can use it to make coffee, or other drinks if you so choose.", - "weight": 3100, + "weight": "3100 g", "volume": "750 ml", "price": 2000, "to_hit": -5, @@ -1370,7 +1369,7 @@ "type": "TOOL", "name": "concrete mixer", "description": "A portable concrete mixer. It is still large and heavy, but it can be operated solo, and runs on batteries. It also has a heater built in.", - "weight": 9071, + "weight": "9071 g", "volume": "5 L", "price": 50000, "to_hit": -6, @@ -1395,7 +1394,7 @@ "type": "TOOL", "name": "control laptop", "description": "A modified laptop, now capable of transmitting in the ultra high frequencies utilized by robots. Activate it to command robots from afar.", - "weight": 2721, + "weight": "2721 g", "volume": "1 L", "price": 10000, "material": [ "plastic", "aluminum" ], @@ -1404,12 +1403,7 @@ "ammo": "battery", "charges_per_use": 2, "use_action": "ROBOTCONTROL", - "magazines": [ - [ - "battery", - [ "medium_battery_cell", "medium_plus_battery_cell", "medium_atomic_battery_cell", "medium_disposable_cell" ] - ] - ], + "magazines": [ [ "battery", [ "medium_battery_cell", "medium_plus_battery_cell", "medium_atomic_battery_cell" ] ] ], "magazine_well": 2 }, { @@ -1417,7 +1411,7 @@ "type": "TOOL", "name": "copper axe", "description": "This is a decent-sized chunk of worked copper affixed to a wooden shaft, to make a crude yet effective axe.", - "weight": 3700, + "weight": "3700 g", "volume": "3500 ml", "price": 5500, "bashing": 18, @@ -1435,7 +1429,7 @@ "name": "copper knife", "name_plural": "copper knives", "description": "A knife consisting of crudely-worked copper, and a simple handle. Primitive, but a step above stone-age.", - "weight": 650, + "weight": "650 g", "volume": "250 ml", "price": 3000, "bashing": 2, @@ -1451,7 +1445,7 @@ "type": "TOOL", "name": "cordless drill", "description": "This is a cordless battery-powered drill with a selection of drill bits.", - "weight": 2721, + "weight": "2721 g", "volume": "750 ml", "price": 2000, "to_hit": -1, @@ -1475,7 +1469,7 @@ "type": "TOOL", "name": "cot", "description": "This is a military style fold up cot. While it may not be quite as comfortable as a bed, it's better than slumming it on the ground.", - "weight": 6164, + "weight": "6164 g", "volume": "2 L", "price": 7500, "to_hit": -1, @@ -1497,7 +1491,7 @@ "type": "TOOL", "name": "cow bell", "description": "A brass cow bell. Potentially useful in so many ways.", - "weight": 566, + "weight": "566 g", "volume": "1 L", "price": 700, "to_hit": 1, @@ -1512,7 +1506,7 @@ "type": "TOOL", "name": "crack pipe", "description": "This is a fine glass tube with a bulb with a bowl on one end. It's used to partake of certain illicit substances.", - "weight": 242, + "weight": "242 g", "volume": "250 ml", "price": 0, "to_hit": -10, @@ -1534,7 +1528,7 @@ "price_postapoc": 5000, "material": [ "steel" ], "techniques": [ "WBLOCK_1" ], - "weight": 907, + "weight": "907 g", "volume": "1 L", "bashing": 13, "cutting": 7, @@ -1547,7 +1541,7 @@ "type": "TOOL", "name": "crossbow trap", "description": "This is a simple tripwire, which is attached to the trigger of a loaded crossbow. When pulled, the crossbow fires. Only a single round can be used, after which the trap is disabled.", - "weight": 1772, + "weight": "1772 g", "volume": "1750 ml", "price": 6000, "to_hit": -2, @@ -1568,7 +1562,7 @@ "type": "TOOL", "name": "crowbar", "description": "This is a hefty prying tool. Use it to open locked doors without destroying them or to lift manhole covers. You could also wield it to bash some heads in.", - "weight": 500, + "weight": "500 g", "volume": "1 L", "price": 1300, "to_hit": 2, @@ -1587,7 +1581,7 @@ "type": "TOOL", "name": "crucible", "description": "This is a small metalworking crucible. It's used in some metalworking fabrication recipes.", - "weight": 14000, + "weight": "14000 g", "volume": "2 L", "price": 100000, "to_hit": -2, @@ -1602,7 +1596,7 @@ "type": "TOOL", "name": "clay crucible", "description": "This is a primitive metalworking crucible made of clay. You could use it for metalworking.", - "weight": 16422, + "weight": "16422 g", "volume": "2500 ml", "price": 60000, "to_hit": -2, @@ -1617,7 +1611,7 @@ "type": "TOOL", "name": "electric firestarter", "description": "This is a crudely made electric firestarter, which can function as an inefficient lighter.", - "weight": 14, + "weight": "14 g", "volume": "250 ml", "price": 100, "material": "steel", @@ -1648,7 +1642,7 @@ "type": "TOOL", "name": "improvised lockpick", "description": "This is an improvised set of picks and torsion wrenches made from scrap metal. You need MacGyver-like skills to open locks with these as they are brittle, but they lower the chances of alarms being set off.", - "weight": 23, + "weight": "23 g", "volume": 0, "price": 0, "material": "steel", @@ -1661,7 +1655,7 @@ "type": "TOOL", "name": "damaged shelter kit", "description": "This is a small shelter, made of sticks and skins. Use it to place. This shelter has been damaged, and needs repairs.", - "weight": 1360, + "weight": "1360 g", "volume": "7500 ml", "price": 2000, "to_hit": -3, @@ -1675,7 +1669,7 @@ "type": "TOOL", "name": "food dehydrator", "description": "This is a portable electric food dehydrator. It's powered by batteries, and could be invaluable in preserving food.", - "weight": 4200, + "weight": "4200 g", "volume": "4500 ml", "price": 6000, "to_hit": -2, @@ -1699,7 +1693,7 @@ "name": "digging stick", "category": "tools", "description": "This is a large stick, with the end carved into a broad blade for digging. It could be used to dig shallow pits, but not deep ones.", - "weight": 1133, + "weight": "1133 g", "volume": "1500 ml", "price": 0, "bashing": 8, @@ -1714,7 +1708,7 @@ "type": "TOOL", "name": "directional antenna", "description": "This is an antenna designed to pick up signals better when pointed at the source. You could use this with a radio to receive faint signals.", - "weight": 454, + "weight": "454 g", "volume": "500 ml", "price": 800, "to_hit": 1, @@ -1730,7 +1724,7 @@ "name": "distaff and spindle", "name_plural": "distaves and spindles", "description": "A pair of specialized wooden rods used to spin fibers into thread and yarn.", - "weight": 612, + "weight": "612 g", "volume": "1500 ml", "price": 7000, "to_hit": 1, @@ -1748,7 +1742,7 @@ "name_plural": "dive knives", "//": "Too small to be effectively used for butchering, still not bad at it due to serrated edge.", "description": "This is a short, sturdy knife with a serrated edge for cutting lines and straps, and a blunt tip for prying. Used primarily by divers, it is very light and takes up virtually no space in one's pockets.", - "weight": 226, + "weight": "226 g", "volume": 0, "price": 14000, "cutting": 12, @@ -1764,7 +1758,7 @@ "type": "TOOL", "name": "dog whistle", "description": "This is a small whistle. When used, it produces a high tone that causes nearby friendly dogs to either follow you closely and stop attacking, or start attacking enemies if they are currently docile.", - "weight": 22, + "weight": "22 g", "volume": 0, "price": 1000, "material": "aluminum", @@ -1778,7 +1772,7 @@ "category": "tools", "name": "whistle multitool", "description": "A cheap gadget combining a whistle, thermometer, magnifying glass, and compass.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 200, "to_hit": -3, @@ -1808,7 +1802,7 @@ "category": "weapons", "name": "dynamite", "description": "These are several sticks of explosives with a fuse attached. Use this item to light the fuse. You will, of course, need a lighter or matches in your inventory to do this. Shortly after lighting the fuse, this item will explode, so get away!", - "weight": 1133, + "weight": "1133 g", "volume": "750 ml", "price": 6000, "to_hit": -3, @@ -1836,7 +1830,7 @@ "name": "dynamite (lit)", "name_plural": "dynamites (lit)", "description": "The fuse on this dynamite is lit and hissing. It'll explode any moment now.", - "weight": 1133, + "weight": "1133 g", "volume": "750 ml", "price": 0, "to_hit": -3, @@ -1862,7 +1856,7 @@ "name": "electronic handcuffs", "name_plural": "electronic handcuffs", "description": "A pair of electronic handcuffs, used by police and riot bots to detain captives. Their continuous siren clearly identifies the wearer as an arrested criminal and alerts human police. Wait for their arrival, don't try to escape or to remove the cuffs - they will administer an electric shock.\nHowever, since the only police likely to respond are undead, you may have a long wait ahead, unless you get creative...", - "weight": 2000, + "weight": "2000 g", "volume": "250 ml", "price": 0, "to_hit": -8, @@ -1881,7 +1875,7 @@ "type": "TOOL", "name": "entrenching tool", "description": "This is a stout collapsible spade. It's commonly used by military forces and favored by hikers for digging.", - "weight": 628, + "weight": "628 g", "volume": "1 L", "price": 4000, "to_hit": 1, @@ -1899,7 +1893,7 @@ "category": "food", "name": "fermenting eggs jar", "description": "This jar contains a batch of eggs in a pickling solution. You can seal up the jar once the process is completed.", - "weight": 52, + "weight": "52 g", "volume": "250 ml", "price": 10, "bashing": 8, @@ -1920,7 +1914,7 @@ "type": "TOOL", "name": "e-ink tablet PC", "description": "A tablet PC using an efficient color e-ink display. Before the cataclysm, these were nifty gadgets; now, it's an almost priceless resource. Runs on conventional batteries.", - "weight": 250, + "weight": "250 g", "volume": "250 ml", "price": 20000, "to_hit": -1, @@ -1940,9 +1934,7 @@ "light_battery_cell", "light_minus_battery_cell", "light_atomic_battery_cell", - "light_minus_atomic_battery_cell", - "light_minus_disposable_cell", - "light_disposable_cell" + "light_minus_atomic_battery_cell" ] ] ], @@ -1954,7 +1946,7 @@ "name": "electric chainsaw (off)", "name_plural": "electric chainsaws (off)", "description": "This is a lumbering tool moonlighting as weapon of opportunity. If loaded with batteries, using this item will cause it to turn on, turning it into a very powerful but unwieldy melee weapon.", - "weight": 6577, + "weight": "6577 g", "volume": "2500 ml", "price": 8000, "to_hit": -4, @@ -1996,7 +1988,7 @@ "type": "TOOL", "name": "electric hair trimmer", "description": "This is a pocket-sized electric trimmer made for cutting hair. You can use it to cut your hair if it's supplied with batteries. It requires 10 batteries per use.", - "weight": 138, + "weight": "138 g", "volume": "250 ml", "price": 3000, "to_hit": -1, @@ -2015,7 +2007,7 @@ "type": "TOOL", "name": "electric jackhammer", "description": "This is a construction tool for drilling through hard rock or other surfaces. It runs on a cell compatible with UPS. Use it to blast a hole in adjacent solid terrain.", - "weight": 40000, + "weight": "40000 g", "volume": "5 L", "price": 40000, "to_hit": -8, @@ -2037,7 +2029,7 @@ "category": "tools", "name": "electrohack", "description": "This device has many ports attached, allowing it to connect to almost any control panel or other electronic machine (but not computers). With a little skill, it can be used to crack passwords and more. It requires 25 charges of battery power per use.", - "weight": 114, + "weight": "114 g", "volume": "500 ml", "price": 40000, "to_hit": 1, @@ -2067,7 +2059,7 @@ "type": "TOOL", "name": "etched human skull", "description": "This is a human skull with strange etchings covering it.", - "weight": 311, + "weight": "311 g", "volume": "750 ml", "price": 300000, "bashing": 6, @@ -2080,7 +2072,7 @@ "type": "TOOL", "name": "large fire extinguisher", "description": "This is an emergency fire extinguisher containing three gallons of fire retardant foam. It would be useful for putting out adjacent fires.", - "weight": 9071, + "weight": "9071 g", "volume": "11500 ml", "price": 5000, "to_hit": -4, @@ -2099,7 +2091,7 @@ "category": "weapons", "name": "fertilizer bomb", "description": "This is a volatile homemade explosive. Use this item to light the fuse. You will, of course, need a lighter or matches in your inventory to do this. Shortly after lighting the fuse, this item will explode, so get away!", - "weight": 1133, + "weight": "1133 g", "volume": "750 ml", "price": 0, "to_hit": -3, @@ -2126,7 +2118,7 @@ "name": "fertilizer bomb (lit)", "name_plural": "fertilizer bombs (lit)", "description": "The fuse on this fertilizer bomb is lit and hissing. It'll explode any moment now.", - "weight": 1133, + "weight": "1133 g", "volume": "750 ml", "price": 0, "to_hit": -3, @@ -2153,7 +2145,7 @@ "type": "TOOL", "name": "fire axe", "description": "This is a large, two-handed pickhead axe normally used by firefighters. It makes a powerful melee weapon, but is a bit slow to recover between swings.", - "weight": 2520, + "weight": "2520 g", "volume": "2 L", "price": 20000, "to_hit": 1, @@ -2172,7 +2164,7 @@ "type": "TOOL", "name": "fire drill", "description": "This fire drill is a simple item for starting fires; it is made from two pieces of wood and some string. Since it is constructed out of simple materials, it's slow and rather difficult to get a fire started using this tool.", - "weight": 240, + "weight": "240 g", "volume": "250 ml", "price": 0, "material": "wood", @@ -2189,7 +2181,7 @@ "type": "TOOL", "name": "camp fire drill", "description": "This stout fire drill is a simple item for starting fires; it is made from two pieces of wood and some string. Since it is constructed out of simple materials, it's slow and rather difficult to get a fire started using this tool.", - "weight": 1280, + "weight": "1280 g", "volume": "1250 ml", "price": 0, "material": [ "wood", "stone" ], @@ -2206,7 +2198,7 @@ "type": "TOOL", "name": "firecracker", "description": "A solitary firecracker with a short fuse. Use this item to light the fuse. Of course, you will need a lighter or some matches to do so. Shortly after you light the fuse it will explode, so throw it quickly!", - "weight": 3, + "weight": "3 g", "volume": 0, "price": 4, "to_hit": -3, @@ -2222,7 +2214,7 @@ "name": "firecracker (lit)", "name_plural": "firecrackers (lit)", "description": "A firecracker that has been lit; the fuse is hissing. Throw it quickly before it explodes.", - "weight": 3, + "weight": "3 g", "volume": 0, "price": 0, "to_hit": -3, @@ -2240,7 +2232,7 @@ "name": "pack of firecrackers", "name_plural": "packs of firecrackers", "description": "This is a pack of 25 firecrackers with a starter fuse. Use this item to light the fuse. Of course, you will need a lighter or some matches to do so. Shortly after you light the fuse they will begin to explode, so throw them quickly!", - "weight": 75, + "weight": "75 g", "volume": 0, "price": 100, "to_hit": -3, @@ -2259,7 +2251,7 @@ "name": "pack of firecrackers (lit)", "name_plural": "packs of firecrackers (lit)", "description": "A pack of 25 firecrackers that has been lit; the fuse is hissing. Throw them quickly before the start to explode.", - "weight": 75, + "weight": "75 g", "volume": 0, "price": 0, "to_hit": -3, @@ -2275,7 +2267,7 @@ "type": "TOOL", "name": "plastic fish trap", "description": "This is a makeshift fish trap made from plastic bottles. It's simple, even primitive, but easy to use. The principle of action: the fish swims inside for bait, but can't get out. Not humane, prohibited by law, but there are no cops left to care.", - "weight": 85, + "weight": "85 g", "volume": "2 L", "price": 500, "to_hit": -2, @@ -2292,7 +2284,7 @@ "type": "GENERIC", "name": "fishing hook", "description": "A simple fishing hook.", - "weight": 1, + "weight": "1 g", "volume": 0, "price": 25, "cutting": 3, @@ -2305,7 +2297,7 @@ "type": "GENERIC", "name": "improvised fishing hook", "description": "An improvised fishing hook carved from wood or bone.", - "weight": 1, + "weight": "1 g", "volume": 0, "price": 25, "cutting": 3, @@ -2318,7 +2310,7 @@ "type": "TOOL", "name": "basic fishing rod", "description": "'Fishing rod' might be a bit too charitable of a description. In truth, this is a stick with a piece of string and a hook.", - "weight": 1700, + "weight": "1700 g", "volume": "1250 ml", "price": 0, "to_hit": 1, @@ -2327,6 +2319,7 @@ "symbol": "/", "color": "brown", "use_action": "FISH_ROD", + "qualities": [ [ "FISHING", 1 ] ], "flags": [ "FISH_POOR" ] }, { @@ -2334,7 +2327,7 @@ "type": "TOOL", "name": "pro fishing rod", "description": "A professional fishing rod with a matching set of weights. With this you should be able to catch 'em all.", - "weight": 1000, + "weight": "1000 g", "volume": "1250 ml", "price": 20000, "to_hit": 1, @@ -2343,6 +2336,7 @@ "symbol": "/", "color": "brown", "use_action": "FISH_ROD", + "qualities": [ [ "FISHING", 1 ] ], "flags": [ "FISH_GOOD" ] }, { @@ -2351,7 +2345,7 @@ "category": "ammo", "name": "flammable arrow", "description": "This arrow has a rag soaked in a flammable liquid wrapped around the shaft near the head. You need to light it before shooting.", - "weight": 150, + "weight": "150 g", "volume": "250 ml", "price": 3500, "bashing": 2, @@ -2369,7 +2363,7 @@ "category": "weapons", "name": "flashbang", "description": "This is a military police style flashbang. Use this item to pull the pin and light the fuse. You will then have five turns before it detonates with intense light and sound, blinding, deafening and disorienting anyone nearby.", - "weight": 236, + "weight": "236 g", "volume": "250 ml", "price": 2000, "to_hit": -1, @@ -2393,7 +2387,7 @@ "category": "weapons", "name": "active flashbang", "description": "This flashbang is active, and will soon detonate with intense light and sound, blinding, deafening and disorienting anyone nearby. It may be a good idea to throw it!", - "weight": 236, + "weight": "236 g", "volume": "250 ml", "price": 0, "to_hit": -1, @@ -2460,7 +2454,7 @@ "category": "food", "name": "sealed yeast culture", "description": "A sealed flask holding sanitized yeast wort. You may harvest the yeast inside when it's done culturing.", - "weight": 52, + "weight": "52 g", "volume": "250 ml", "price": 10, "bashing": 8, @@ -2487,7 +2481,7 @@ "name": "flute", "name_plural": "flutes", "description": "A simple silver-plated flute.", - "weight": 250, + "weight": "250 g", "volume": "500 ml", "price": 5000, "bashing": 2, @@ -2515,7 +2509,7 @@ "type": "TOOL", "name": "folding bicycle", "description": "This is a bicycle folded into a relatively portable package.", - "weight": 9071, + "weight": "9071 g", "volume": "21500 ml", "price": 35000, "to_hit": -5, @@ -2535,7 +2529,7 @@ "type": "TOOL", "name": "electric forge", "description": "This is a portable electric metalworking forge, powered by batteries. Combined with the right tools, you could use this for metalworking. With a little mechanical know-how, you could probably even convert it to run directly off a vehicle's power system.", - "weight": 10000, + "weight": "10000 g", "volume": "6 L", "price": 40000, "to_hit": -2, @@ -2555,7 +2549,7 @@ "type": "TOOL", "name": "funnel", "description": "This is a funnel used to collect rainwater. Use it outside and place a container beneath it to collect water when it rains.", - "weight": 606, + "weight": "606 g", "volume": "500 ml", "price": 500, "to_hit": 1, @@ -2577,7 +2571,7 @@ "type": "TOOL", "name": "fur rollmat", "description": "This is a bedroll made of pelts which can be rolled up for transport. It insulates you from the floor, making it easier to sleep. Use it to unroll and place on the ground.", - "weight": 1800, + "weight": "1800 g", "volume": "3 L", "price": 4000, "to_hit": -1, @@ -2598,7 +2592,7 @@ "type": "TOOL", "name": "trowel", "description": "A small, sharp gardening shovel, perfect for digging up grubs and worms.", - "weight": 280, + "weight": "280 g", "volume": "500 ml", "price": 20, "to_hit": 1, @@ -2615,7 +2609,7 @@ "category": "weapons", "name": "makeshift gas canister", "description": "This is a crude gasbomb using household chemicals. Use this item to arm it. In three turns it will begin to expel a highly toxic gas for a short time. This gas poisons those exposed to it, in addition to obscuring vision and scent.", - "weight": 1264, + "weight": "1264 g", "volume": "250 ml", "price": 500, "to_hit": -1, @@ -2639,7 +2633,7 @@ "category": "weapons", "name": "active makeshift gas grenade", "description": "This homemade canister of poison gas has been unsealed, and is (or will shortly be) expelling highly toxic gas. You should consider getting rid of it soon.", - "weight": 1264, + "weight": "1264 g", "volume": "250 ml", "price": 0, "to_hit": -1, @@ -2668,7 +2662,7 @@ "type": "TOOL", "name": "gasoline cooker", "description": "This is a simple heater powered by gasoline. It is designed for cooking food.", - "weight": 1944, + "weight": "1944 g", "volume": "1250 ml", "price": 5000, "to_hit": -1, @@ -2689,7 +2683,7 @@ "name": "gasoline lantern (off)", "name_plural": "gasoline lanterns (off)", "description": "This is a small gasoline powered lantern. It does not provide much light, but it lasts a long time. Use it to turn it on.", - "weight": 1400, + "weight": "1400 g", "volume": "750 ml", "price": 3000, "to_hit": 2, @@ -2719,7 +2713,7 @@ "name": "gasoline lantern (on)", "name_plural": "gasoline lanterns (on)", "description": "This is a small gasoline powered lantern. It does not provide much light, but it lasts a long time. It is turned on. Use it to turn it off.", - "turns_per_charge": 20, + "turns_per_charge": 60, "revert_to": "gasoline_lantern", "use_action": { "target": "gasoline_lantern", "msg": "The lantern is extinguished.", "menu_text": "Turn off", "type": "transform" }, "flags": [ "LIGHT_15", "TRADER_AVOID", "ALLOWS_REMOTE_USE" ] @@ -2730,7 +2724,7 @@ "name": "geiger counter (off)", "name_plural": "geiger counters (off)", "description": "This is a tool for measuring radiation. Using it will prompt you to choose whether to scan yourself or the terrain, or to turn it on, which will provide continuous feedback on ambient radiation. It is currently off.", - "weight": 225, + "weight": "225 g", "volume": "500 ml", "price": 15000, "bashing": 2, @@ -2763,7 +2757,7 @@ "name": "geiger counter (on)", "name_plural": "geiger counters (on)", "description": "This is a tool for measuring radiation. It is in continuous scan mode, and will produce quiet clicking sounds in the presence of ambient radiation. Using it allows you to turn it off, or scan yourself or the ground. It is currently on.", - "turns_per_charge": 10, + "power_draw": 200, "revert_to": "geiger_off", "use_action": "GEIGER", "flags": [ "TRADER_AVOID" ], @@ -2785,7 +2779,7 @@ "type": "TOOL", "name": "glowstick", "description": "This is a small blue light glowstick. Use it to bend the plastic and break the glass cylinder inside to start the reaction. It will produce a small amount of light.", - "weight": 29, + "weight": "29 g", "volume": "250 ml", "price": 100, "to_hit": -1, @@ -2808,7 +2802,7 @@ "category": "other", "name": "dead glowstick", "description": "This is a spent glowstick. It is essentially trash.", - "weight": 29, + "weight": "29 g", "volume": "250 ml", "price": 0, "to_hit": -1, @@ -2823,7 +2817,7 @@ "type": "TOOL", "name": "active glowstick", "description": "This is an active glowstick and is producing light. It will last for a few hours before burning out.", - "weight": 29, + "weight": "29 g", "volume": "250 ml", "to_hit": -1, "material": "plastic", @@ -2831,7 +2825,7 @@ "color": "light_blue", "initial_charges": 1400, "max_charges": 1400, - "turns_per_charge": 2, + "turns_per_charge": 30, "revert_to": "glowstick_dead", "revert_msg": "The glowstick fades out.", "flags": [ "LIGHT_8", "TRADER_AVOID" ] @@ -2842,7 +2836,7 @@ "category": "tools", "name": "grappling hook", "description": "A folding grappling hook attached to a stout 30-foot long piece of lightweight cord. Useful for keeping yourself safe from falls. Can be used in place of a long rope for butchering, in a pinch.", - "weight": 760, + "weight": "760 g", "volume": "750 ml", "price": 25000, "to_hit": -2, @@ -2860,7 +2854,7 @@ "type": "TOOL", "name": "hacksaw", "description": "This is a sturdy saw, useful for cutting through metal objects.", - "weight": 952, + "weight": "952 g", "volume": "1 L", "price": 2500, "to_hit": -1, @@ -2877,7 +2871,7 @@ "type": "TOOL", "name": "Halligan bar", "description": "This is a heavy multiple-use tool commonly carried by firefighters, law enforcement, and military rescue units. Use it to open locked doors without destroying them or to lift manhole covers. You could also wield it to bash some heads in.", - "weight": 3600, + "weight": "3600 g", "volume": "1250 ml", "price": 7500, "to_hit": 2, @@ -2896,7 +2890,7 @@ "type": "TOOL", "name": "hammer", "description": "This is a demagnetized steel claw hammer with a wooden grip. With a hammer, nails, and two by fours in your inventory, you could board up adjacent doors and windows. It has myriad other uses as well.", - "weight": 566, + "weight": "566 g", "volume": "500 ml", "price": 700, "to_hit": 1, @@ -2913,7 +2907,7 @@ "type": "TOOL", "name": "claw bar", "description": "This is a small prying tool with a clawed bend at one end for pulling spikes. Use it to open locked doors without destroying them or to lift manhole covers. You could also wield it to bash some heads in.", - "weight": 340, + "weight": "340 g", "volume": "375 ml", "price": 1000, "to_hit": 1, @@ -2931,7 +2925,7 @@ "type": "TOOL", "name": "hand drill", "description": "A primitive manual drill with a single drill bit. It is slow and it will exhaust you quickly.", - "weight": 907, + "weight": "907 g", "volume": "250 ml", "price": 500, "to_hit": -1, @@ -2940,14 +2934,14 @@ "material": [ "wood", "steel" ], "symbol": ";", "color": "light_gray", - "qualities": [ [ "DRILL", 1 ] ] + "qualities": [ [ "DRILL", 2 ] ] }, { "id": "heatpack", "type": "TOOL", "name": "heat pack", "description": "This is a chemical heat pack. It's used to treat sports injuries and heat food. It is usable only once.", - "weight": 226, + "weight": "226 g", "volume": 0, "price": 100, "to_hit": 1, @@ -2964,7 +2958,7 @@ "category": "other", "name": "used heat pack", "description": "This is a chemical heat pack. It's used to treat sports injuries and heat food. This one has been used and is chemically inert, rendering it useless.", - "weight": 226, + "weight": "226 g", "volume": 0, "price": 0, "to_hit": 1, @@ -2979,7 +2973,7 @@ "type": "TOOL", "name": "hoe", "description": "This is a farming implement. You can use it to turn tillable land into a slow-to-cross pile of dirt, or dig a shallow pit.", - "weight": 1088, + "weight": "1088 g", "volume": "3500 ml", "price": 2000, "to_hit": 3, @@ -2997,7 +2991,7 @@ "type": "TOOL", "name": "honey scraper", "description": "A sharp, knife-like tool used in harvesting honey from beehives. Makes a passable melee weapon.", - "weight": 580, + "weight": "580 g", "volume": "250 ml", "price": 1000, "bashing": 1, @@ -3014,7 +3008,7 @@ "category": "veh_parts", "name": "bicycle horn", "description": "This is a simple bulb horn, found on many bicycles. Use to honk. Honk honk.", - "weight": 170, + "weight": "170 g", "volume": "500 ml", "price": 400, "to_hit": -1, @@ -3040,7 +3034,7 @@ "category": "veh_parts", "name": "truck horn", "description": "This is a very loud horn, usually found on large trucks like semis.", - "weight": 310, + "weight": "310 g", "volume": "1500 ml", "price": 12000, "to_hit": -1, @@ -3055,7 +3049,7 @@ "category": "veh_parts", "name": "car horn", "description": "This is a car horn meant to be attached to a car's electrical system.", - "weight": 270, + "weight": "270 g", "volume": "500 ml", "price": 9000, "to_hit": -1, @@ -3069,7 +3063,7 @@ "type": "TOOL", "name": "rubber hose", "description": "This is a flexible rubber hose. It could be used for crafting, or siphoning fuel from a vehicle.", - "weight": 544, + "weight": "544 g", "volume": "500 ml", "price": 200, "to_hit": 3, @@ -3084,7 +3078,7 @@ "type": "TOOL", "name": "hotplate", "description": "This is a small heating element on a stand, powered by batteries. It is indispensable for cooking and chemistry. Try not to burn yourself.", - "weight": 2835, + "weight": "2835 g", "volume": "1250 ml", "price": 2500, "to_hit": -1, @@ -3110,7 +3104,7 @@ "name": "hygrometer", "name_plural": "hygrometers", "description": "A plastic hygrometer that can read the relative humidity in the air.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 100, "to_hit": -3, @@ -3125,7 +3119,7 @@ "type": "TOOL", "name": "ice axe", "description": "This is an ice axe with hammer on its head, a multi-purpose hiking and climbing tool used by mountaineers. It is sturdy enough to pry open closed doors or lift manhole covers.", - "weight": 500, + "weight": "500 g", "volume": "750 ml", "price": 5000, "to_hit": 2, @@ -3144,7 +3138,7 @@ "type": "TOOL", "name": "jackhammer", "description": "This is a construction tool for drilling through hard rock or other surfaces. It runs on gasoline. Use it (if loaded) to blast a hole in adjacent solid terrain.", - "weight": 15875, + "weight": "15875 g", "volume": "5 L", "price": 40000, "to_hit": -8, @@ -3166,7 +3160,7 @@ "name": "sealed jar of pickles", "name_plural": "sealed jars of pickles", "description": "This is a sealed glass jar containing pickles. Use to open and eat to enjoy.", - "weight": 1750, + "weight": "1750 g", "volume": "500 ml", "price": 650, "bashing": 4, @@ -3189,7 +3183,7 @@ "name": "sealed jar of sauerkraut", "name_plural": "sealed jars of sauerkraut", "description": "This is a sealed glass jar containing sauerkraut. Use to open and eat to enjoy.", - "weight": 1750, + "weight": "1750 g", "volume": "500 ml", "price": 650, "bashing": 4, @@ -3212,7 +3206,7 @@ "name": "sealed jar of eggs", "name_plural": "sealed jars of eggs", "description": "This is a sealed glass jar containing pickled eggs. Use to open and eat to enjoy.", - "weight": 1750, + "weight": "1750 g", "volume": "500 ml", "price": 650, "bashing": 4, @@ -3234,7 +3228,7 @@ "category": "spare_parts", "name": "Kevlar plate", "description": "This is a plate of reinforced Kevlar. It could be used to repair items made of Kevlar.", - "weight": 360, + "weight": "360 g", "volume": "250 ml", "price": 1000, "material": "kevlar", @@ -3248,7 +3242,7 @@ "category": "tools", "name": "finished charcoal kiln", "description": "A charcoal kiln that has finished burning. Disassemble it to retrieve the charcoal and kiln.", - "weight": 8142, + "weight": "8142 g", "volume": "10 L", "price": 100, "to_hit": -2, @@ -3262,7 +3256,7 @@ "category": "tools", "name": "filled charcoal kiln", "description": "A kiln filled with wood which will become charcoal after a slow period of burning.", - "weight": 15142, + "weight": "15142 g", "volume": "10 L", "price": 100, "to_hit": -2, @@ -3285,7 +3279,7 @@ "category": "tools", "name": "lit charcoal kiln", "description": "A kiln full of wood that has been lit; better drop it!", - "weight": 15142, + "weight": "15142 g", "volume": "10 L", "price": 100, "to_hit": -2, @@ -3309,7 +3303,7 @@ "name": "knitting needles", "name_plural": "pairs of knitting needles", "description": "A pair of stout wooden needles with round ends used to turn thread and yarn into cloth.", - "weight": 56, + "weight": "56 g", "volume": 0, "price": 600, "cutting": 1, @@ -3324,7 +3318,7 @@ "type": "TOOL", "name": "land mine", "description": "This is an military anti-personnel mine that is triggered when stepped upon.", - "weight": 2360, + "weight": "2360 g", "volume": "500 ml", "price": 5000, "to_hit": -1, @@ -3347,7 +3341,7 @@ "type": "TOOL", "name": "gunsmith repair kit", "description": "This is a complete toolkit made to repair damaged firearms. Powered by standard batteries, it is a vital tool for long-term firearms maintenance. It requires 25 charges of battery power per use.", - "weight": 9860, + "weight": "9860 g", "volume": "2500 ml", "price": 5000, "to_hit": -2, @@ -3384,7 +3378,7 @@ "type": "TOOL", "name": "large tent", "description": "This is a family sized tent. It provides a large amount of space, but is very bulky.", - "weight": 2266, + "weight": "2266 g", "volume": "10 L", "price": 50000, "to_hit": -3, @@ -3408,7 +3402,7 @@ "type": "TOOL", "name": "leather funnel", "description": "This is a small, leather funnel used to collect rainwater. Use it outside and place a container beneath it to collect water when it rains.", - "weight": 4, + "weight": "4 g", "volume": "250 ml", "price": 0, "to_hit": 1, @@ -3429,7 +3423,7 @@ "type": "TOOL", "name": "birchbark funnel", "description": "This is a small birchbark funnel. Place it above an outdoor container to collect rainwater.", - "weight": 3, + "weight": "3 g", "volume": "250ml", "price": 0, "to_hit": 1, @@ -3450,7 +3444,7 @@ "type": "TOOL", "name": "lighter", "description": "This is a disposable plastic lighter. A lighter must be carried to use various drugs, like cigarettes, or to light things like Molotov cocktails. You can also use a lighter to light nearby items on fire.", - "weight": 14, + "weight": "14 g", "volume": "14 ml", "price": 100, "material": [ "plastic", "aluminum" ], @@ -3466,7 +3460,7 @@ "abstract": "lightstrip_base", "type": "TOOL", "name": "lightstrip_base", - "weight": 27, + "weight": "27 g", "volume": "250 ml", "price": 500, "to_hit": 2, @@ -3526,7 +3520,7 @@ "name": "magnifying glass", "name_plural": "magnifying glasses", "description": "This is a magnifying glass. May be useful for starting fires during sunny skies.", - "weight": 400, + "weight": "400 g", "volume": "250 ml", "price": 600, "to_hit": -1, @@ -3541,7 +3535,7 @@ "type": "TOOL", "name": "makeshift crowbar", "description": "This is a pipe whose ends have been bent and hammered flat to resemble a crowbar. Use it to open locked doors without destroying them, or to lift manhole covers. You could also wield it to fight with, in a pinch.", - "weight": 762, + "weight": "762 g", "volume": "1500 ml", "price": 0, "to_hit": 2, @@ -3560,7 +3554,7 @@ "type": "TOOL", "name": "makeshift funnel", "description": "This is a small, makeshift funnel used to collect rainwater. Use it outside and place a container beneath it to collect water when it rains.", - "weight": 4, + "weight": "4 g", "volume": "250 ml", "price": 0, "to_hit": 1, @@ -3582,7 +3576,7 @@ "name": "makeshift glaive", "//": "Name changed to glaive, but changing the id would break e.g. tilesets.", "description": "This is a large blade attached to a long stick. It could do a considerable amount of damage.", - "weight": 1800, + "weight": "1800 g", "volume": "3 L", "price": 5000, "to_hit": 2, @@ -3600,7 +3594,7 @@ "type": "TOOL", "name": "makeshift hammer", "description": "This is a crude hammer make from a piece of metal affixed to a stick. It functions adequately as a hammer, but really can't compare to a proper one.", - "weight": 1020, + "weight": "1020 g", "volume": "500 ml", "price": 0, "bashing": 9, @@ -3616,7 +3610,7 @@ "type": "TOOL", "name": "makeshift vacuum sealer", "description": "This is a homemade heat sealer unit with an air pump. It's used for vacuum packing food to preserve it.", - "weight": 3218, + "weight": "3218 g", "volume": "2 L", "price": 1000, "to_hit": -1, @@ -3639,7 +3633,7 @@ "category": "weapons", "name": "match head bomb", "description": "This is a homemade bomb consisting of a bottle filled with match heads and equipped with a fuse. Use this item to light the fuse; you will, of course, need a lighter in your inventory to do this.", - "weight": 412, + "weight": "412 g", "volume": "500 ml", "price": 0, "to_hit": 1, @@ -3666,7 +3660,7 @@ "name": "match head bomb (lit)", "name_plural": "match head bombs (lit)", "description": "This is a bottle filled with match heads and equipped with a fuse. This one has been lit, and its fuse is rapidly burning down. You may not want to hold onto it much longer.", - "weight": 412, + "weight": "412 g", "volume": "500 ml", "price": 0, "to_hit": 1, @@ -3693,7 +3687,7 @@ "type": "TOOL", "name": "matchbook", "description": "This is a small book of matches with a coarse strike surface on the outside flap. Matches must be carried to use various drugs like cigarettes, or to light things like Molotov cocktails. You can also use matches to light nearby items on fire.", - "weight": 10, + "weight": "10 g", "volume": 0, "price": 10, "material": "paper", @@ -3710,7 +3704,7 @@ "type": "TOOL", "name": "mess kit", "description": "A self-contained camping mess kit, containing everything you might need for wilderness cooking. This model relies on a battery-operated hotplate, rather than the more commonplace chemical-fueled Esbit stove.", - "weight": 1500, + "weight": "1500 g", "volume": "1 L", "price": 5000, "to_hit": -1, @@ -3736,7 +3730,7 @@ "type": "TOOL", "name": "metal funnel", "description": "This is a large metal funnel used to collect rainwater. Less portable than plastic funnels, but collects more water. Use it outside and place a container beneath it to collect water when it rains.", - "weight": 4017, + "weight": "4017 g", "volume": "4 L", "price": 1500, "to_hit": 1, @@ -3758,7 +3752,7 @@ "type": "TOOL", "name": "tarp raincatcher", "description": "Some sticks and string with a tarpaulin to set up an improvised raincatcher.", - "weight": 3980, + "weight": "3980 g", "volume": "4 L", "price": 6000, "material": [ "wood", "plastic" ], @@ -3778,7 +3772,7 @@ "type": "TOOL", "name": "metallic smoother", "description": "This metallic tool is most often used to smooth concrete, or mortar, in construction projects.", - "weight": 362, + "weight": "362 g", "volume": "500 ml", "price": 1000, "bashing": 4, @@ -3792,7 +3786,7 @@ "type": "TOOL", "name": "military mess kit", "description": "Military mess kit designed for long-range reconnaissance patrols deployed behind enemy lines. All parts are made from thin sheet of aluminum / superalloy composite and are insulated with ceramic coating. Relies on a battery-operated hotplate, rather than the smoke-producing chemical-fueled Esbit stove. Compact, durable and lightweight.", - "weight": 900, + "weight": "900 g", "volume": "1 L", "price": 6000, "to_hit": -1, @@ -3820,7 +3814,7 @@ "name": "mininuke", "//": "This is based on the Davy Crockett nuclear artillery shell, all other man-portable nuclear weapons have far too high a yield.", "description": "This is an extremely powerful weapon, a portable nuclear bomb. Use it to activate the timer. You guess that the explosion would be large enough to take out a small house.", - "weight": 23000, + "weight": "23000 g", "volume": "16 L", "price": 180000, "to_hit": -2, @@ -3839,7 +3833,7 @@ "name_plural": "mininukes", "//": "This is based on the Davy Crockett nuclear artillery shell, all other man-portable nuclear weapons have far too high a yield.", "description": "This miniature nuclear bomb has a light blinking on the side, showing that it will soon explode. You should probably get far, far away from it.", - "weight": 23000, + "weight": "23000 g", "volume": "16 L", "price": 0, "to_hit": -2, @@ -3866,7 +3860,7 @@ "type": "TOOL", "name": "basic repair kit", "description": "This is a portable toolkit. When supplied with duct tape, it serves as a vital tool for fixing items made of wood, paper, bone, or chitin. It requires 50 units of duct tape per use.", - "weight": 1040, + "weight": "1040 g", "volume": "1 L", "price": 1000, "to_hit": -1, @@ -3886,7 +3880,7 @@ "type": "TOOL", "name": "plastic mold", "description": "This is a plastic mold. It could be shaped and used to craft items made of plastic.", - "weight": 320, + "weight": "320 g", "volume": "2500 ml", "price": 1000, "to_hit": 1, @@ -3902,7 +3896,7 @@ "category": "weapons", "name": "Molotov cocktail", "description": "A bottle of flammable liquid with a rag inserted. Use this item to light the rag. You will, of course, need a lighter or matches in your inventory to do this. After lighting it, throw it to cause fires.", - "weight": 742, + "weight": "742 g", "volume": "750 ml", "price": 500, "to_hit": 1, @@ -3931,7 +3925,7 @@ "name": "Molotov cocktail", "name_plural": "Molotov cocktails", "description": "A bottle of flammable liquid with a flaming rag stoppered in its neck. Throwing it will shatter the bottle on impact and ignite a fireball. Dropping it will set you on fire, so don't do that unless you want to burn to death.", - "weight": 742, + "weight": "742 g", "volume": "750 ml", "price": 0, "to_hit": 1, @@ -3950,7 +3944,7 @@ "type": "TOOL", "name": "mop", "description": "This is an unwieldy mop. Good for cleaning up spills. Use to mop up any 'mess' you may have made.", - "weight": 929, + "weight": "929 g", "volume": "1750 ml", "price": 1000, "to_hit": -1, @@ -3966,7 +3960,7 @@ "type": "TOOL", "name": "scrub brush", "description": "This is a simple scrub brush.", - "weight": 70, + "weight": "70 g", "volume": "250 ml", "price": 200, "to_hit": -1, @@ -3981,7 +3975,7 @@ "name": "mortar and pestle", "name_plural": "sets of mortar and pestle", "description": "This is a simple combination of a small grindstone and a bowl-shaped stone. Used for grinding grain, but time-consuming compared to more complex methods.", - "weight": 1632, + "weight": "1632 g", "volume": "1 L", "price": 0, "to_hit": -4, @@ -3997,7 +3991,7 @@ "name": "mp3 player (off)", "name_plural": "mp3 players (off)", "description": "This battery-powered device is loaded up with someone's music collection. Fortunately, there's lots of songs you like, and listening to it will raise your morale slightly. Use it to turn it on.", - "weight": 140, + "weight": "140 g", "volume": "50 ml", "price": 3000, "material": [ "aluminum", "plastic" ], @@ -4014,9 +4008,7 @@ "light_plus_battery_cell", "light_minus_battery_cell", "light_atomic_battery_cell", - "light_minus_atomic_battery_cell", - "light_minus_disposable_cell", - "light_disposable_cell" + "light_minus_atomic_battery_cell" ] ] ], @@ -4040,7 +4032,7 @@ "type": "TOOL", "name": "multi cooker", "description": "A professional-grade multi-cooker, with a battery slot for camping trips or tailgating. Its multitude of settings and features promise to handle any sort of cooking, from parboiling potatoes to cooking curry to popping popcorn. There's no manual, but you're sure you can work it out.", - "weight": 11339, + "weight": "11339 g", "volume": "3750 ml", "price": 20000, "to_hit": -3, @@ -4066,7 +4058,7 @@ "name": "multi-tool", "//": "The multi-tool is a bit more of a toolkit than a knife.", "description": "A cleverly designed all-in-one tool which combines several smaller tools into the handles of a pair of pliers.", - "weight": 494, + "weight": "494 g", "volume": "250 ml", "price": 3000, "to_hit": -4, @@ -4083,7 +4075,7 @@ "type": "TOOL", "name": "bone needle", "description": "This is sharp needle made from a bone. It would be useful for making rough clothing and items. Its low quality makes it rather unsuitable for anything requiring speed or precision.", - "weight": 85, + "weight": "85 g", "volume": "250 ml", "price": 0, "material": "bone", @@ -4110,7 +4102,7 @@ "type": "TOOL", "name": "curved needle", "description": "A curved sharp needle made of steel. Its rounded shape allows it to make stitches that only pierce one side of the material. While unsuitable for most tailoring projects, it's a necessity for stitching neoprene.", - "weight": 85, + "weight": "85 g", "volume": "250 ml", "price": 0, "material": "steel", @@ -4137,7 +4129,7 @@ "type": "TOOL", "name": "wooden needle", "description": "This is a wooden needle whittled down to a sharp point. It has a narrow hole carved into the head for threading. Its low quality makes it rather unsuitable for anything requiring speed or precision.", - "weight": 85, + "weight": "85 g", "volume": "250 ml", "price": 0, "material": "wood", @@ -4165,7 +4157,7 @@ "name": "noise emitter (off)", "name_plural": "noise emitters (off)", "description": "This device was constructed by 'enhancing' a speaker ripped off from some electronic device with some amplifier circuits. It has now no other use beside emitting loud cracling static noise, that could distract zombies.", - "weight": 340, + "weight": "340 g", "volume": "1 L", "price": 0, "to_hit": -1, @@ -4199,7 +4191,7 @@ "name": "noise emitter (on)", "name_plural": "noise emitters (on)", "description": "This device has been turned on and is emitting horrible crackles, pops and other static sounds. Quick, get away from it before it draws zombies to you!", - "turns_per_charge": 5, + "power_draw": 10000, "revert_to": "noise_emitter", "use_action": "NOISE_EMITTER_ON", "flags": [ "RADIO_MODABLE", "TRADER_AVOID" ] @@ -4209,7 +4201,7 @@ "type": "TOOL", "name": "lamp oil cooker", "description": "This is a simple heater powered by lamp oil. It is designed for cooking food.", - "weight": 2264, + "weight": "2264 g", "volume": "1250 ml", "price": 5000, "to_hit": -1, @@ -4230,7 +4222,7 @@ "name": "oil lamp (off)", "name_plural": "oil lamps (off)", "description": "This is an oil fueled lamp. It does not provide much light, but it lasts a long time. Use it to turn it on.", - "weight": 1720, + "weight": "1720 g", "volume": "1 L", "price": 1000, "to_hit": 2, @@ -4239,8 +4231,8 @@ "symbol": ";", "color": "yellow", "ammo": "lamp_oil", - "initial_charges": 800, - "max_charges": 800, + "initial_charges": 750, + "max_charges": 750, "charges_per_use": 1, "use_action": { "target": "oil_lamp_on", @@ -4260,7 +4252,7 @@ "name": "oil lamp", "name_plural": "oil lamps", "description": "This is an oil fueled lamp. It does not provide much light, but it lasts a long time. It is turned on. Use it to turn it off.", - "turns_per_charge": 20, + "turns_per_charge": 240, "revert_to": "oil_lamp", "use_action": { "target": "oil_lamp", "msg": "The lantern is extinguished.", "menu_text": "Turn off", "type": "transform" }, "flags": [ "LIGHT_10", "TRADER_AVOID", "FIRE", "ALLOWS_REMOTE_USE", "WATER_EXTINGUISH" ] @@ -4270,7 +4262,7 @@ "type": "TOOL", "name": "oxygen tank", "description": "This is tank of compressed medical oxygen with a regulator and mask. Commonly used in emergency situations, it provides immediate relief for asthma attacks or smoke inhalation, and can provide a brief burst of energy.", - "weight": 2268, + "weight": "2268 g", "volume": "1500 ml", "price": 6000, "to_hit": -4, @@ -4288,7 +4280,7 @@ "type": "TOOL", "name": "nitrogen tank", "description": "This is a tank of compressed nitrogen gas. Nitrogen is useful for its lack of reactivity. Don't try to breathe it.", - "weight": 2268, + "weight": "2268 g", "volume": "1500 ml", "price": 1000, "to_hit": -4, @@ -4306,7 +4298,7 @@ "type": "TOOL", "name": "hydrogen tank", "description": "This is a tank of compressed hydrogen gas. If you need to make water from scratch, or lift a zeppelin, it could come in handy.", - "weight": 2268, + "weight": "2268 g", "volume": "1500 ml", "price": 1000, "to_hit": -4, @@ -4325,7 +4317,7 @@ "name": "paint brush", "name_plural": "paint brushes", "description": "A wide brush, suitable for painting walls.", - "weight": 60, + "weight": "60 g", "volume": "500 ml", "price": 7000, "to_hit": 1, @@ -4340,7 +4332,7 @@ "category": "tools", "name": "pasta extruder", "description": "A pasta extruder run by a hand-crank. Useful in making pasta. It comes with various heads to make various kinds of pasta.", - "weight": 2628, + "weight": "2628 g", "volume": "1 L", "price": 2000, "to_hit": 2, @@ -4354,7 +4346,7 @@ "type": "TOOL", "name": "permanent marker", "description": "This is a King Size(tm) industrial strength permanent marker, about halfway between a typical marker and a can of spray paint in size. Use it to write something down. However, writing \"Elbereth\" probably won't help you.", - "weight": 113, + "weight": "113 g", "volume": 0, "price": 500, "material": "plastic", @@ -4371,7 +4363,7 @@ "type": "TOOL", "name": "pet carrier", "description": "A plastic container meant to hold pets for transport. Use it on a suitable animal to capture, use it on an empty tile to release.", - "weight": 1000, + "weight": "1000 g", "volume": "5 L", "price": 1000, "bashing": 1, @@ -4389,7 +4381,7 @@ "type": "TOOL", "name": "wooden pet carrier", "description": "A wooden container meant to hold pets for transport. Use it on a suitable animal to capture, use it on an empty tile to release.", - "weight": 1500, + "weight": "1500 g", "volume": "6250 ml", "price": 800, "material": [ "wood" ], @@ -4402,7 +4394,7 @@ "type": "TOOL", "name": "chicken cage", "description": "A wire container made for transporting chickens, but you can use it to hold any tiny animal. Use it on a suitable animal to capture, use it on an empty tile to release.", - "weight": 250, + "weight": "250 g", "volume": "2500 ml", "price": 100, "bashing": 1, @@ -4419,7 +4411,7 @@ "type": "TOOL", "name": "zombie pheromone", "description": "This is a disgusting ball of rotting meat of zombie origin. Squeezing this gland causes a small cloud of pheromones to spray into the air. Apparently the foul secretion can change zombies' attitude towards you, and they may ignore you for a short period of time. Perhaps they briefly consider you as one of them.", - "weight": 238, + "weight": "238 g", "volume": "250 ml", "price": 4000, "to_hit": -1, @@ -4436,7 +4428,7 @@ "type": "TOOL", "name": "pickaxe", "description": "This is a large steel pickaxe, suitable for breaking up hard things or (with enough skill) hard targets. Strike the earth!", - "weight": 4535, + "weight": "4535 g", "volume": "3 L", "price": 16000, "to_hit": -3, @@ -4454,7 +4446,7 @@ "type": "TOOL", "name": "locksmith kit", "description": "This is a locksmith's set of sturdy steel lock picks and torsion wrenches. It is essential for silently and quickly opening locks, provided you have some mechanical skill.", - "weight": 544, + "weight": "544 g", "volume": 0, "price": 20000, "material": "steel", @@ -4468,7 +4460,7 @@ "category": "food", "name": "fermenting pickle jar", "description": "This jar contains a batch of pickles set to ferment. You can seal up the jar once the process is completed.", - "weight": 52, + "weight": "52 g", "volume": "250 ml", "price": 10, "bashing": 8, @@ -4490,7 +4482,7 @@ "type": "TOOL", "name": "glass pipe", "description": "This is a hand-blown glass pipe. It's of the type most commonly used to smoke recreational substances.", - "weight": 442, + "weight": "442 g", "volume": "250 ml", "price": 2000, "to_hit": -10, @@ -4505,7 +4497,7 @@ "type": "TOOL", "name": "tobacco pipe", "description": "This is a hand-carved wooden smoking pipe. It's designed to facilitate consumption of fire cured tobacco leaves.", - "weight": 372, + "weight": "372 g", "volume": "250 ml", "price": 3000, "to_hit": -10, @@ -4521,7 +4513,7 @@ "category": "weapons", "name": "pipe bomb", "description": "This is a section of a pipe filled with explosive materials. Use this item to light the fuse, which gives you five turns to get away from it before it detonates. You'll need a lighter or some matches to use it.", - "weight": 1298, + "weight": "1298 g", "volume": "500 ml", "price": 1500, "to_hit": 1, @@ -4546,7 +4538,7 @@ "category": "weapons", "name": "active pipe bomb", "description": "This pipe bomb's fuse is lit, and it will explode any second now. Throw it immediately!", - "weight": 1298, + "weight": "1298 g", "volume": "500 ml", "price": 0, "to_hit": 1, @@ -4572,7 +4564,7 @@ "name": "pliers", "name_plural": "pliers", "description": "This is a basic pair of slip-joint pliers, able to handle basic mechanical work. Anything too complex will require a wrench.", - "weight": 807, + "weight": "807 g", "volume": "250 ml", "price": 800, "bashing": 3, @@ -4588,7 +4580,7 @@ "name": "pocket watch", "name_plural": "pocket watches", "description": "An old fashioned pocket watch. This one tells you the time and looks good doing it. Can also be disassembled into some useful parts.", - "weight": 65, + "weight": "65 g", "volume": 0, "price": 25000, "price_postapoc": 1000, @@ -4604,7 +4596,7 @@ "name": "pocket knife", "name_plural": "pocket knives", "description": "This is a small pocket knife. It isn't great for combat, but it's better than nothing. It's sharp enough to butcher with.", - "weight": 141, + "weight": "141 g", "volume": 0, "price": 1000, "to_hit": -2, @@ -4620,7 +4612,7 @@ "type": "TOOL", "name": "electric polisher", "description": "An electric polisher which can be used to buff metal surfaces until they are reflective like a mirror.", - "weight": 1000, + "weight": "1000 g", "volume": "3500 ml", "price": 35000, "to_hit": -2, @@ -4653,7 +4645,7 @@ "name": "soda can stove kit", "//": "Should be 20 but currently recipes do not utilize this value", "description": "This is an ultra-light alcohol-burning stove with simmer ring, crafted by hand from a couple of aluminum soda cans. It comes with a 500 ml plastic bottle to hold concentrated alcohol fuel.", - "weight": 45, + "weight": "45 g", "volume": "750 ml", "price": 250, "bashing": 1, @@ -4672,7 +4664,7 @@ "type": "TOOL", "name": "handheld game system", "description": "This is a portable games console in working condition, with a backlit screen allowing you to play in the dark. You can use it to play it for a little while, but this requires batteries.", - "weight": 200, + "weight": "200 g", "volume": "500 ml", "price": 12000, "material": [ "plastic" ], @@ -4684,13 +4676,13 @@ [ "battery", [ + "light_disposable_cell", + "light_minus_disposable_cell", "light_battery_cell", "light_plus_battery_cell", "light_minus_battery_cell", "light_atomic_battery_cell", - "light_minus_atomic_battery_cell", - "light_minus_disposable_cell", - "light_disposable_cell" + "light_minus_atomic_battery_cell" ] ] ], @@ -4701,7 +4693,7 @@ "type": "TOOL", "name": "portal generator", "description": "This is a rare, bizarre, and arcane device of an otherworldly nature. It's giving you a headache just looking at it. It is covered in alien markings.", - "weight": 1133, + "weight": "1133 g", "volume": "500 ml", "price": 660000, "to_hit": -1, @@ -4714,26 +4706,12 @@ "charges_per_use": 5, "use_action": "PORTAL" }, - { - "id": "press", - "type": "TOOL", - "name": "hand press & die set", - "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, - "volume": "500 ml", - "price": 10000, - "to_hit": -2, - "bashing": 6, - "material": [ "steel", "plastic" ], - "symbol": ";", - "color": "dark_gray" - }, { "id": "primitive_adze", "type": "TOOL", "name": "stone adze", "description": "This is a stone adze, somewhat useful for cutting through wood objects.", - "weight": 1300, + "weight": "1300 g", "volume": "1 L", "price": 1000, "bashing": 8, @@ -4749,7 +4727,7 @@ "type": "TOOL", "name": "stone axe", "description": "This is a sharpened stone affixed to a stick. It works passably well as an axe but really can't compare to a proper axe.", - "weight": 3154, + "weight": "3154 g", "volume": "3500 ml", "price": 0, "bashing": 11, @@ -4765,7 +4743,7 @@ "type": "TOOL", "name": "stone hammer", "description": "This is a rock affixed to a stick, in the crude facsimile of a hammer. It functions adequately as a hammer, but really can't compare to a proper one.", - "weight": 1020, + "weight": "1020 g", "volume": "500 ml", "price": 0, "bashing": 9, @@ -4782,7 +4760,7 @@ "name": "stone knife", "name_plural": "stone knives", "description": "This is a sharpened stone set into a hollowed handle. Not nearly as usable as a proper knife, but it's better than nothing.", - "weight": 453, + "weight": "453 g", "volume": "250 ml", "price": 0, "to_hit": -1, @@ -4799,7 +4777,7 @@ "type": "TOOL", "name": "stone shovel", "description": "This is a flattened stone affixed to a stick. It works passably well as a shovel but really can't compare to a real shovel.", - "weight": 1581, + "weight": "1581 g", "volume": "4 L", "price": 0, "bashing": 15, @@ -4823,27 +4801,13 @@ "charges_per_use": 1, "use_action": { "type": "picklock", "pick_quality": 40 } }, - { - "id": "puller", - "type": "TOOL", - "name": "kinetic bullet puller", - "description": "This is a tool used for properly disassembling firearm ammunition.", - "weight": 489, - "volume": "250 ml", - "price": 1000, - "bashing": 5, - "material": "plastic", - "symbol": ";", - "color": "green", - "qualities": [ [ "PULL", 1 ] ] - }, { "id": "rag", "type": "TOOL", "category": "spare_parts", "name": "rag", "description": "This is a largish piece of cloth, useful in crafting and possibly for staunching bleeding.", - "weight": 80, + "weight": "80 g", "volume": "250 ml", "price": 0, "material": "cotton", @@ -4857,7 +4821,7 @@ "type": "TOOL", "name": "sponge", "description": "A sponge is a tool or cleaning aid made of soft, porous material. Typically used for cleaning impervious surfaces.", - "weight": 80, + "weight": "80 g", "volume": "250 ml", "price": 0, "material": "plastic", @@ -4871,7 +4835,7 @@ "type": "TOOL", "name": "washing kit", "description": "A combination kit of a washboard and a sponge. Everything you need to clean items after the apocalypse.", - "weight": 80, + "weight": "80 g", "volume": "250 ml", "price": 0, "material": "plastic", @@ -4886,7 +4850,7 @@ "name": "reading light", "name_plural": "reading lights", "description": "A little clip-on LED light, meant for reading books in the dark.", - "weight": 90, + "weight": "90 g", "volume": 0, "price": 100, "material": [ "plastic", "aluminum" ], @@ -4906,13 +4870,13 @@ [ "battery", [ + "light_disposable_cell", + "light_minus_disposable_cell", "light_battery_cell", "light_plus_battery_cell", "light_minus_battery_cell", "light_atomic_battery_cell", - "light_minus_atomic_battery_cell", - "light_minus_disposable_cell", - "light_disposable_cell" + "light_minus_atomic_battery_cell" ] ] ], @@ -4935,7 +4899,7 @@ "type": "TOOL", "name": "refillable lighter", "description": "This is a lighter featuring a flip top cover and refuelable tank. A lighter must be carried to use various drugs, like cigarettes, or to light things like Molotov cocktails. You can also use a lighter to light nearby items on fire.", - "weight": 20, + "weight": "20 g", "volume": "31 ml", "price": 3000, "material": "aluminum", @@ -4965,7 +4929,7 @@ "name": "refillable lighter", "name_plural": "refillable lighters", "description": "This is a lighter featuring a flip top cover and refuelable tank. It is lit.", - "weight": 20, + "weight": "20 g", "volume": "31 ml", "price": 3000, "material": "aluminum", @@ -4975,7 +4939,7 @@ "initial_charges": 25, "max_charges": 50, "charges_per_use": 1, - "turns_per_charge": 10, + "turns_per_charge": 20, "revert_to": "ref_lighter", "use_action": [ { "type": "firestarter", "moves": 40, "moves_slow": 500 }, @@ -4995,7 +4959,7 @@ "category": "tools", "name": "stone pot", "description": "A large stone, roughly hollowed out into a pot.", - "weight": 1500, + "weight": "1500 g", "volume": "2 L", "price": 0, "to_hit": -1, @@ -5013,7 +4977,7 @@ "type": "TOOL", "name": "quern", "description": "This is a simple hand-powered stone quern for grinding grain.", - "weight": 3264, + "weight": "3264 g", "volume": "2 L", "price": 0, "to_hit": -4, @@ -5027,7 +4991,7 @@ "type": "TOOL", "name": "rollmat", "description": "This is a sheet of foam which can be rolled tightly for storage. It insulates you from the floor, making it easier to sleep. Use it to unroll and place on the ground.", - "weight": 250, + "weight": "250 g", "volume": "1 L", "price": 4000, "to_hit": -1, @@ -5048,7 +5012,7 @@ "type": "TOOL", "name": "RX12 jet injector", "description": "The Rivtech RX12 jet injector is a small pistol-shaped device used to inject advanced fast-healing chemicals through the skin without using a needle. A label on the side warns against using more than two doses per hour.", - "weight": 316, + "weight": "316 g", "volume": "500 ml", "price": 100000, "material": [ "ceramic", "superalloy" ], @@ -5067,7 +5031,7 @@ "name": "safe deposit box", "name_plural": "safe deposit boxes", "description": "This is a secure combination lock box. Sadly, you don't know the combination. Breaking inside it would destroy anything of value.", - "weight": 2267, + "weight": "2267 g", "volume": "3750 ml", "price": 8000, "to_hit": -2, @@ -5083,7 +5047,7 @@ "type": "TOOL", "name": "sarcophagus access code", "description": "This printout is a string of numbers to access the elevator in the hazardous waste sarcophagus.", - "weight": 5, + "weight": "5 g", "volume": 0, "price": 0, "to_hit": -1, @@ -5098,7 +5062,7 @@ "category": "food", "name": "fermenting sauerkraut jar", "description": "This jar contains a batch of sauerkraut set to ferment. You can seal up the jar once the process is completed.", - "weight": 1750, + "weight": "1750 g", "volume": "500 ml", "price": 10, "bashing": 4, @@ -5120,7 +5084,7 @@ "type": "TOOL", "name": "wood saw", "description": "This is a thin saw, useful for cutting through wood objects.", - "weight": 283, + "weight": "283 g", "volume": "1 L", "price": 3000, "to_hit": -2, @@ -5136,7 +5100,7 @@ "type": "TOOL", "name": "scalpel", "description": "This is a very sharp knife designed for surgical cutting. Its small, sharp blade allows for precision strikes in the hands of the skilled.", - "weight": 23, + "weight": "23 g", "volume": "15 ml", "price": 1000, "to_hit": -3, @@ -5154,7 +5118,7 @@ "name": "pair of scissors", "name_plural": "pairs of scissors", "description": "These are a long pair of heavy duty scissors. Use scissors to cut items made from cotton (like clothing) into rags.", - "weight": 113, + "weight": "113 g", "volume": "250 ml", "price": 400, "to_hit": -1, @@ -5170,7 +5134,7 @@ "type": "TOOL", "name": "screwdriver", "description": "This is a Philips-head screwdriver. It is important for almost all electronics crafting, most mechanics crafting, and has many more uses.", - "weight": 170, + "weight": "170 g", "volume": "250 ml", "price": 450, "to_hit": -1, @@ -5187,7 +5151,7 @@ "type": "TOOL", "name": "screwdriver set", "description": "This is a set of screwdrivers in several sizes and blade types. Guaranteed to have the right tools for more precise work.", - "weight": 340, + "weight": "340 g", "volume": "500 ml", "price": 2000, "to_hit": -1, @@ -5204,7 +5168,7 @@ "type": "TOOL", "name": "scythe", "description": "This is an old-fashioned farming tool used to cut tall grass. While it may be a giant blade on the end of a stick, it is incredibly awkward to use for anything but its intended purpose.", - "weight": 3013, + "weight": "3013 g", "volume": "3250 ml", "price": 8000, "to_hit": -6, @@ -5222,7 +5186,7 @@ "type": "TOOL", "name": "sewing kit", "description": "This is a plastic kit with a variety of needles, some plastic spools for thread, and a few other useful textile tools. Use a sewing kit on an article of clothing to attempt to repair or reinforce that clothing. This uses your tailoring skill.", - "weight": 85, + "weight": "85 g", "volume": "250 ml", "price": 1000, "to_hit": -1, @@ -5250,7 +5214,7 @@ "type": "TOOL", "name": "anesthesia kit", "description": "A kit for inducing anesthesia for surgery, containing specialized canisters with a variety of powerful hypnotic, analgetic, and stimulative drugs. It's intended for use in specialized medical equipment, and can't be administered manually.", - "weight": 100, + "weight": "100 g", "volume": "3250 ml", "price": 1000, "to_hit": -1, @@ -5267,7 +5231,7 @@ "type": "TOOL", "name": "shaving kit", "description": "This is a compact and lightweight shaving kit made for travelers. You can use it to shave if it's supplied with soap. It requires 1 unit of soap per use.", - "weight": 90, + "weight": "90 g", "volume": "250 ml", "price": 1000, "to_hit": -1, @@ -5285,7 +5249,7 @@ "type": "TOOL", "name": "shelter kit", "description": "This is a small shelter, made of sticks and skins. Use it to place.", - "weight": 1360, + "weight": "1360 g", "volume": "7500 ml", "price": 6500, "to_hit": -3, @@ -5310,7 +5274,7 @@ "name": "shishkebab (off)", "name_plural": "shishkebabs (off)", "description": "This is a large blade with a fuel pipe on the side, and a small tank and igniter built into the insulated hilt. When filled with gasoline, the blade can be made scorching hot to singe enemies and light your way. Use to ignite.", - "weight": 1701, + "weight": "1701 g", "volume": "2500 ml", "price": 10000, "bashing": 4, @@ -5364,7 +5328,7 @@ "type": "TOOL", "name": "shotgun trap", "description": "This is a simple tripwire is attached to the trigger of a loaded double-barreled shotgun. When pulled, the shotgun fires. Two shells are loaded; the first time the trigger is pulled, one or both shells may be discharged.", - "weight": 2922, + "weight": "2922 g", "volume": "1750 ml", "price": 25000, "to_hit": -2, @@ -5385,7 +5349,7 @@ "type": "TOOL", "name": "shovel", "description": "This is a digging tool. Use it to dig pits adjacent to your location.", - "weight": 1315, + "weight": "1315 g", "volume": "3500 ml", "price": 2000, "to_hit": 3, @@ -5403,7 +5367,7 @@ "type": "TOOL", "name": "sickle", "description": "This is an old-fashioned farming tool used to cut tall grass. While it may be a massive curved blade on a handle, it is incredibly awkward to use for anything but its intended purpose.", - "weight": 1432, + "weight": "1432 g", "volume": "1250 ml", "price": 3800, "to_hit": -6, @@ -5421,7 +5385,7 @@ "type": "TOOL", "name": "small fire extinguisher", "description": "This is a hand held fire extinguisher containing a liter of highly compressed CO2 gas. It would be useful for putting out adjacent fires.", - "weight": 2267, + "weight": "2267 g", "volume": "1500 ml", "price": 4000, "to_hit": -1, @@ -5439,7 +5403,7 @@ "type": "TOOL", "name": "firearm repair kit", "description": "This is a portable toolkit made to repair damaged firearms. Powered by standard batteries, it is a vital tool for long-term firearms maintenance. It requires 100 charges of battery power per use.", - "weight": 2420, + "weight": "2420 g", "volume": "1500 ml", "price": 1500, "to_hit": -1, @@ -5478,7 +5442,7 @@ "name": "smart lamp (off)", "name_plural": "smart lamps (off)", "description": "This is a smart lamp, it can be activated remotely.", - "weight": 400, + "weight": "400 g", "volume": "500 ml", "price": 500, "to_hit": -1, @@ -5531,7 +5495,7 @@ "type": "TOOL", "name": "emergency oxygen pack", "description": "This is a small tank of compressed medical oxygen with a folding regulator and mask. Commonly used in emergency situations, it provides immediate relief for asthma attacks or smoke inhalation, and can provide a brief burst of energy.", - "weight": 1134, + "weight": "1134 g", "volume": "750 ml", "price": 4000, "to_hit": -3, @@ -5549,7 +5513,7 @@ "type": "TOOL", "name": "soldering iron", "description": "This is a device with a metal tip that can get very hot. It is necessary for advanced electronics crafting. You could also use it to cauterize wounds, if you had to.", - "weight": 181, + "weight": "181 g", "volume": "500 ml", "price": 1000, "bashing": 2, @@ -5563,7 +5527,7 @@ { "type": "repair_item", "item_action_type": "repair_metal", - "materials": [ "kevlar", "plastic", "iron", "steel", "hardsteel", "aluminum", "copper" ], + "materials": [ "plastic", "lead", "tin" ], "skill": "mechanics", "cost_scaling": 0.1, "move_cost": 1500 @@ -5592,7 +5556,7 @@ "type": "TOOL", "name": "spray can", "description": "This is a spray can, filled with paint. Use this tool to make graffiti on the floor.", - "weight": 340, + "weight": "340 g", "volume": "250 ml", "price": 500, "material": "aluminum", @@ -5609,7 +5573,7 @@ "type": "TOOL", "name": "stepladder", "description": "This is a wooden stepladder. Use it to set it down.", - "weight": 20000, + "weight": "20000 g", "volume": "50 L", "price": 2000, "to_hit": -3, @@ -5624,7 +5588,7 @@ "type": "TOOL", "name": "still", "description": "This is a still. It's useful for creating distillation of alcohol and other, more curious substances.", - "weight": 10000, + "weight": "10000 g", "volume": "10 L", "price": 30000, "to_hit": -6, @@ -5639,7 +5603,7 @@ "type": "TOOL", "name": "autoclave", "description": "This is an autoclave. It's useful for sterilizing things like CBMs. It requires a massive amount of power, so standard batteries will not power it sufficiently.", - "weight": 34500, + "weight": "34500 g", "volume": "76 L", "price": 162654, "to_hit": -6, @@ -5664,7 +5628,7 @@ "type": "TOOL", "name": "survival marker", "description": "This is a sharpened piece of charcoal that is almost guaranteed to make your hands all covered in charcoal. Use it to write something down.", - "weight": 113, + "weight": "113 g", "volume": 0, "price": 0, "material": "plastic", @@ -5681,7 +5645,7 @@ "type": "TOOL", "name": "makeshift haircut kit", "description": "This is a kit with tools for cutting hair.", - "weight": 642, + "weight": "642 g", "volume": "1 L", "price": 1000, "to_hit": -1, @@ -5696,7 +5660,7 @@ "type": "TOOL", "name": "survivor mess kit", "description": "A homemade mess kit, containing everything you might need for creating post-apocalyptic cuisine. Powered by a lamp oil burner, it is composed of simple yet durable tools and materials.", - "weight": 2160, + "weight": "2160 g", "volume": "2500 ml", "price": 2000, "to_hit": -1, @@ -5717,7 +5681,7 @@ "name": "survivor telescope", "name_plural": "survivor telescopes", "description": "A homemade collapsible telescope. Too large and inaccurate to use as a weapon scope, but carrying this item in your inventory will double the distance that is mapped around you during your travels.", - "weight": 500, + "weight": "500 g", "volume": "250 ml", "price": 600, "to_hit": -1, @@ -5732,7 +5696,7 @@ "type": "TOOL", "name": "makeshift shaving kit", "description": "This is a makeshift shaving kit. You can use it to shave if it's supplied with soap. It requires 1 unit of soap per use.", - "weight": 540, + "weight": "540 g", "volume": "750 ml", "price": 1000, "to_hit": -1, @@ -5750,7 +5714,7 @@ "type": "TOOL", "name": "swage and die set", "description": "These are a set of swages and dies for metalsmithing. These loops and metal blocks are used in some metalworking fabrication recipes.", - "weight": 2620, + "weight": "2620 g", "volume": "2 L", "price": 16000, "to_hit": 1, @@ -5765,7 +5729,7 @@ "type": "TOOL", "name": "syringe", "description": "A medical syringe. Used for administering intravenous drugs.", - "weight": 10, + "weight": "10 g", "volume": "10ml", "price": 2500, "material": "plastic", @@ -5777,7 +5741,7 @@ "type": "TOOL", "name": "tailor's kit", "description": "This is a high quality, plastic kit with a variety of needles, some plastic spools for thread, some small scissors, even a small heating element for melting and joining plastic. Use a tailor's kit to customize your clothing and armor. This uses your tailoring skill.", - "weight": 100, + "weight": "100 g", "volume": "500 ml", "price": 1000, "to_hit": -2, @@ -5815,7 +5779,7 @@ "category": "spare_parts", "name": "tanning leather hide", "description": "A treated animal hide which is undergoing the chemical processes required to become leather. You will be able to activate it to unroll and make use of it when it is done.", - "weight": 400, + "weight": "400 g", "volume": "1 L", "price": 0, "to_hit": -2, @@ -5839,7 +5803,7 @@ "category": "spare_parts", "name": "tanning fur pelt", "description": "A treated animal pelt which is undergoing the chemical processes required to become fur. You will be able to activate it to unroll and make use of it when it is done.", - "weight": 400, + "weight": "400 g", "volume": "1 L", "price": 0, "to_hit": -2, @@ -5863,7 +5827,7 @@ "category": "tools", "name": "teapot", "description": "A small metal teapot. Teatime wouldn't be complete without one.", - "weight": 229, + "weight": "229 g", "volume": "500 ml", "price": 1000, "to_hit": 2, @@ -5879,7 +5843,7 @@ "type": "TOOL", "name": "teleport pad", "description": "This is a kit for a teleporter trap consisting of a teleporter and a solar cell that is triggered when stepped upon.", - "weight": 2000, + "weight": "2000 g", "volume": "1 L", "price": 700000, "to_hit": -4, @@ -5895,7 +5859,7 @@ "type": "TOOL", "name": "teleporter", "description": "This is an experimental device that will teleport you a short distance when activated.", - "weight": 1360, + "weight": "1360 g", "volume": "2 L", "price": 600000, "to_hit": -1, @@ -5914,7 +5878,7 @@ "category": "tools", "name": "telescoping umbrella", "description": "A telescoping umbrella which collapses down for easy storage, useful for keeping dry when wielded.", - "weight": 118, + "weight": "118 g", "volume": "500 ml", "price": 12000, "to_hit": 1, @@ -5930,7 +5894,7 @@ "type": "TOOL", "name": "tent", "description": "This is a small personal tent, it's just big enough to fit you comfortably.", - "weight": 1133, + "weight": "1133 g", "volume": "2500 ml", "price": 15000, "to_hit": -3, @@ -5954,7 +5918,7 @@ "name": "Flaming Chunk of Steel +2", "name_plural": "Flaming Chunks of Steel +2", "description": "HOLY SHIT THIS THING IS ON FIRE", - "weight": 64, + "weight": "64 g", "volume": "250 ml", "price": 98000, "to_hit": 100, @@ -5973,7 +5937,7 @@ "name": "thermometer", "name_plural": "thermometers", "description": "A plastic thermometer that can read the air temperature.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 100, "to_hit": -3, @@ -5989,7 +5953,7 @@ "category": "tools", "name": "throwable fire extinguisher", "description": "This is a fire extinguisher in grenade form. While not as effective as a regular fire extinguisher, you can use it from a distance. It is activated by heat, so just throw it into the flames.", - "weight": 630, + "weight": "630 g", "volume": "250 ml", "price": 3000, "to_hit": -1, @@ -6006,7 +5970,7 @@ "name": "pair of metal tongs", "name_plural": "pairs of metal tongs", "description": "These are long, metal tongs. They are commonly used for cooking or in metalworking fabrication recipes.", - "weight": 540, + "weight": "540 g", "volume": "500 ml", "price": 1600, "to_hit": 1, @@ -6023,7 +5987,7 @@ "type": "TOOL", "name": "small space heater", "description": "A portable electric heater that steadily emits warm air. Raises temperature about 10 degrees C.", - "weight": 6000, + "weight": "6000 g", "volume": "3750 ml", "price": 5000, "to_hit": -3, @@ -6069,7 +6033,7 @@ "type": "TOOL", "name": "large space heater", "description": "A portable electric heater that steadily emits warm air. Raises temperature about 10 degrees C and fills a larger volume of air than the smaller version.", - "weight": 12000, + "weight": "12000 g", "volume": "7500 ml", "price": 20000, "to_hit": -3, @@ -6113,7 +6077,7 @@ "category": "weapons", "name": "ANFO charge", "description": "This is a large metal keg filled with ANFO pellets and equipped with a dynamite primer. Use this item to light the fuse. You will then have twenty turns before it explodes and creates a large fireball.", - "weight": 77800, + "weight": "77800 g", "volume": "50 L", "price": 75000, "to_hit": -5, @@ -6144,7 +6108,7 @@ "category": "weapons", "name": "active ANFO charge", "description": "This is a large metal keg filled with ANFO pellets and equipped with a dynamite primer. The fuse has been lit - better run like hell!", - "weight": 77800, + "weight": "77800 g", "volume": "50 L", "price": 0, "to_hit": -5, @@ -6177,7 +6141,7 @@ "name": "black gunpowder bomb", "description": "This is a tin can filled to the brim with black gunpowder and with a bit of fuse sticking out of it.", "//": "40g of tin can and 250ml/412g of gunpowder", - "weight": 452, + "weight": "452 g", "volume": "250 ml", "price": 2500, "to_hit": -2, @@ -6203,7 +6167,7 @@ "category": "weapons", "name": "active black gunpowder bomb", "description": "This is a tin can filled to the brim with black gunpowder and with a lit fuse stuck inside of it.", - "weight": 452, + "weight": "452 g", "volume": "500 ml", "price": 0, "to_hit": -2, @@ -6230,7 +6194,7 @@ "category": "weapons", "name": "black gunpowder charge", "description": "This is a home-made explosive device, consisting of a large plastic jug filled with black gunpowder and scrap metal, equipped with a long fuse. Use this item to light the fuse. Should explode in a few minutes...", - "weight": 5000, + "weight": "5000 g", "volume": "4 L", "price": 20000, "to_hit": -2, @@ -6255,7 +6219,7 @@ "category": "weapons", "name": "active black gunpowder charge", "description": "This is a home-made explosive device, consisting of a large plastic jug filled with black gunpowder and scrap metal, whose fuse has been lit, its final countdown starting.", - "weight": 5000, + "weight": "5000 g", "volume": "4 L", "price": 0, "to_hit": -2, @@ -6282,7 +6246,7 @@ "category": "weapons", "name": "RDX charge", "description": "This is an metal keg, filled with 50 liters worth of RDX and scrap metal. Contains a core of primary explosive to ensure that the charge detonates completely and delivers its entire destructive power to everything in sight.", - "weight": 106600, + "weight": "106600 g", "volume": "50 L", "price": 90000, "to_hit": -5, @@ -6312,7 +6276,7 @@ "category": "weapons", "name": "active RDX charge", "description": "This is an metal keg, filled with 50 liters worth of RDX and scrap metal. The fuse has been lit and once it ignites the primary explosive, the charge will detonate and rain fire and steel on everything in sight.", - "weight": 106600, + "weight": "106600 g", "volume": "50 L", "price": 0, "to_hit": -5, @@ -6344,7 +6308,7 @@ "category": "weapons", "name": "RDX sand bomb", "description": "This is a steel pipe, containing a mixture of RDX and sand, the former propelling the latter into a deadly mist of vicious shrapnel. Use this item to light the fuse.", - "weight": 2000, + "weight": "2000 g", "volume": "500 ml", "price": 1000, "to_hit": -2, @@ -6375,7 +6339,7 @@ "category": "weapons", "name": "active RDX sand bomb", "description": "This is a steel pipe, containing a mixture of RDX and sand, the former propelling the latter into a deadly mist of vicious shrapnel. The fuse has been lit, so why are you still holding it?", - "weight": 2000, + "weight": "2000 g", "volume": "500 ml", "price": 0, "to_hit": -2, @@ -6406,7 +6370,7 @@ "category": "weapons", "name": "rocket candy", "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, + "weight": "250 g", "volume": "250 ml", "price": 100, "to_hit": -2, @@ -6430,7 +6394,7 @@ "category": "weapons", "name": "burning rocket candy", "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, + "weight": "250 g", "volume": "250 ml", "price": 0, "to_hit": -2, @@ -6460,7 +6424,7 @@ "name": "toolbox", "name_plural": "toolboxes", "description": "This is a stout metal box containing a complete tool kit suitable for most household maintenance and construction activities.", - "weight": 3522, + "weight": "3522 g", "volume": "2500 ml", "price": 12999, "to_hit": -2, @@ -6495,7 +6459,7 @@ "description": "Your toolset, protruding from your hands. It can slice, dice, and make everything nice.", "symbol": "#", "color": "white", - "weight": 226, + "weight": "226 g", "bashing": 3, "cutting": 5, "flags": [ "NO_UNWIELD", "UNBREAKABLE_MELEE", "TRADER_AVOID", "USES_BIONIC_POWER" ], @@ -6539,7 +6503,7 @@ "name": "torch", "name_plural": "torches", "description": "This is a large stick, wrapped in rags that are soaked with a flammable material. When lit, produces a fair amount of light. You'll need a lighter or matches to light it.", - "weight": 831, + "weight": "831 g", "volume": "750 ml", "price": 0, "to_hit": 1, @@ -6566,7 +6530,7 @@ "name": "torch", "name_plural": "torches", "description": "This is a large stick, wrapped in rags that are soaked with a flammable material. It is burning, producing plenty of light.", - "weight": 831, + "weight": "831 g", "volume": "750 ml", "price": 0, "to_hit": 1, @@ -6576,7 +6540,7 @@ "color": "brown", "initial_charges": 75, "max_charges": 75, - "turns_per_charge": 20, + "turns_per_charge": 40, "revert_to": "torch_done", "use_action": [ { "type": "firestarter", "moves": 30 }, @@ -6597,7 +6561,7 @@ "name": "hedge trimmer (off)", "name_plural": "hedge trimmers (off)", "description": "A cordless, double-sided, gasoline-powered hedge trimmer. A long line of sharp-edged teeth extends from the engine; turning the trimmer on will make them rapidly vibrate. The poor man's chainsaw as far as the zombies are concerned.", - "weight": 4500, + "weight": "4500 g", "volume": "2500 ml", "price": 4000, "to_hit": -1, @@ -6630,7 +6594,7 @@ "type": "TOOL", "name": "tripwire trap", "description": "This is some thin strong cable with some affixing tools on either end. A tripwire trap must be placed across a doorway or other thin passage. Its purpose is to trip up bypassers, causing them to stumble and possibly hurt themselves slightly.", - "weight": 40, + "weight": "40 g", "volume": "250 ml", "price": 300, "to_hit": -1, @@ -6653,7 +6617,7 @@ "name": "trumpet", "name_plural": "trumpets", "description": "A brass trumpet with only a few dents here and there.", - "weight": 1500, + "weight": "1500 g", "volume": "2500 ml", "price": 7500, "to_hit": 1, @@ -6684,7 +6648,7 @@ "name": "ukulele", "name_plural": "ukuleles", "description": "A small factory made ukulele. Looks to be in working condition.", - "weight": 2000, + "weight": "2000 g", "volume": "2500 ml", "price": 7500, "to_hit": 2, @@ -6714,7 +6678,7 @@ "category": "tools", "name": "umbrella", "description": "An umbrella with a pointy end, useful for keeping dry when wielded.", - "weight": 141, + "weight": "141 g", "volume": "1500 ml", "price": 2400, "to_hit": 1, @@ -6731,7 +6695,7 @@ "type": "TOOL", "name": "vacuum sealer", "description": "This is a portable heat sealer unit with an air pump. It's used for vacuum packing food to preserve it.", - "weight": 2449, + "weight": "2449 g", "volume": "1250 ml", "price": 2500, "to_hit": -1, @@ -6755,7 +6719,7 @@ "category": "tools", "name": "blood draw kit", "description": "This is a kit for drawing blood, including a test tube for holding the sample. Use this tool to draw blood, either from yourself or from a corpse you are standing on.", - "weight": 13, + "weight": "13 g", "volume": "250 ml", "price": 3000, "to_hit": -3, @@ -6775,7 +6739,7 @@ "category": "tools", "name": "hand-crank charger", "description": "This is a hand-powered battery charger. It has an adjustable receptacle designed to accept a wide variety of rechargeable battery cells.", - "weight": 2000, + "weight": "2000 g", "volume": "500 ml", "price": 1000, "material": "plastic", @@ -6804,7 +6768,7 @@ "name": "vibrator", "name_plural": "vibrators", "description": "This battery-devouring device is just the thing to knead the tension out and help you relax. Use it to take a break and unwind.", - "weight": 453, + "weight": "453 g", "volume": "500 ml", "price": 5500, "material": [ "aluminum", "plastic" ], @@ -6836,7 +6800,7 @@ "name": "violin", "name_plural": "violins", "description": "A cheap, factory-made violin with a built-in holder for a bow. Still produces a nice sound.", - "weight": 1300, + "weight": "1300 g", "volume": "2500 ml", "price": 7500, "to_hit": 2, @@ -6867,7 +6831,7 @@ "name": "golden fiddle", "name_plural": "golden fiddles", "description": "A shiny golden fiddle, with a strange aura around it. You feel like it once belonged to the best there's ever been.", - "weight": 13000, + "weight": "13000 g", "volume": "2500 ml", "price": 1000000, "to_hit": 2, @@ -6896,7 +6860,7 @@ "type": "TOOL", "name": "vortex stone", "description": "This is a stone with spirals all over it, and holes around its perimeter. Though it is fairly large, it weighs next to nothing. Air seems to gather around it.", - "weight": 1, + "weight": "1 g", "volume": "250 ml", "price": 300000, "bashing": 6, @@ -6914,7 +6878,7 @@ "category": "tools", "name": "waffle iron", "description": "A waffle iron. For making waffles.", - "weight": 2628, + "weight": "2628 g", "volume": "1 L", "price": 2000, "to_hit": 2, @@ -6929,7 +6893,7 @@ "type": "TOOL", "name": "washboard", "description": "This is a wooden washboard. You can use it to wash filthy clothing if it's supplied with cleansing agent.", - "weight": 90, + "weight": "90 g", "volume": "250 ml", "price": 1000, "to_hit": -1, @@ -6944,7 +6908,7 @@ "type": "TOOL", "name": "water purifier", "description": "This is a battery-powered device designed to purify drinking water. Using this item on a container full of water will purify the contents. It could be useful for water taken from uncertain sources like a river, as it may be non-potable.", - "weight": 1360, + "weight": "1360 g", "volume": "3 L", "price": 10000, "to_hit": -3, @@ -6978,7 +6942,7 @@ "category": "tools", "name": "Doppler Radar Turbo 2000", "description": "A briefcase with built-in laptop that looks like it's from the 80s. Its vintage monochrome monitor displays a plethora of meteorological data. No sign of the FLDSMDFR, however.", - "weight": 10, + "weight": "10 g", "volume": "2500 ml", "price": 200, "to_hit": -1, @@ -6998,9 +6962,7 @@ "light_plus_battery_cell", "light_minus_battery_cell", "light_atomic_battery_cell", - "light_minus_atomic_battery_cell", - "light_minus_disposable_cell", - "light_disposable_cell" + "light_minus_atomic_battery_cell" ] ] ], @@ -7011,7 +6973,7 @@ "type": "TOOL", "name": "welder", "description": "This is a battery powered tool for welding metal pieces together. It is an indispensable tool for construction or repair.", - "weight": 4200, + "weight": "4200 g", "volume": "2500 ml", "price": 9000, "to_hit": -1, @@ -7048,7 +7010,7 @@ "type": "TOOL", "name": "makeshift welder", "description": "This crude welder has been fashioned from a bundle of copper wire, scrap metal, and complete disregard for personal safety. While it's not as efficient as a factory welder, it will serve in a pinch.", - "weight": 7250, + "weight": "7250 g", "volume": "3500 ml", "price": 5000, "to_hit": -2, @@ -7084,7 +7046,7 @@ "type": "TOOL", "name": "wooden smoother", "description": "This large makeshift tool is used in smoothing concrete or mortar in construction projects. You could also use it as an improvised head-basher.", - "weight": 2000, + "weight": "2000 g", "volume": "3500 ml", "price": 2000, "to_hit": -3, @@ -7100,7 +7062,7 @@ "category": "spare_parts", "name": "wool staple", "description": "The natural cluster of wool fibers. Could be processed to the felt patches or yarns.", - "weight": 200, + "weight": "200 g", "volume": "500 ml", "price": 0, "to_hit": -4, @@ -7114,7 +7076,7 @@ "type": "TOOL", "name": "wrapped radiation badge", "description": "This is a badge that detects radiation dosage sealed in a radiation-blocking bag. Use it to remove it from the bag.", - "weight": 20, + "weight": "20 g", "volume": 0, "price": 1000, "material": [ "plastic" ], @@ -7133,7 +7095,7 @@ "name": "wrench", "name_plural": "wrenches", "description": "This is an adjustable crescent wrench. It could be a decent melee weapon, and is used in many mechanics crafting recipes.", - "weight": 907, + "weight": "907 g", "volume": "500 ml", "price": 1200, "to_hit": 1, @@ -7150,7 +7112,7 @@ "name": "X-Acto knife", "name_plural": "X-Acto knives", "description": "This is a small, sharp knife, designed for making precise cuts for textiles or crafts. It could cause decent damage, but is difficult to hit things with it. Its small, sharp blade allows for precision strikes in the hands of the skilled. It is too small to butcher corpses with.", - "weight": 23, + "weight": "23 g", "volume": "250 ml", "price": 400, "to_hit": -3, @@ -7172,7 +7134,7 @@ "price": 600, "price_postapoc": 100, "material": "steel", - "weight": 10, + "weight": "10 g", "cutting": 1 }, { @@ -7181,7 +7143,7 @@ "category": "tools", "name": "food processor", "description": "This is a kitchen appliance capable of slicing, chopping, shredding, grinding, pureeing and mixing.", - "weight": 3000, + "weight": "3000 g", "volume": "2 L", "price": 50, "to_hit": -1, @@ -7205,7 +7167,7 @@ "category": "spare_parts", "name": "chainmail sheet", "description": "This is a sheet of riveted chainmail. With some skill, several of these sheets could be connected to make effective armor.", - "weight": 1000, + "weight": "1000 g", "volume": "500 ml", "price": 1000, "material": "iron", @@ -7218,7 +7180,7 @@ "type": "TOOL", "name": "electrolysis kit", "description": "A set of wiring and electrodes for applying a direct current, usually to a liquid. Useful for crafting. Load with a storage battery or 12V vehicle battery to use.", - "weight": 250, + "weight": "250 g", "volume": "250 ml", "price": 1000, "material": [ "steel", "copper", "plastic" ], @@ -7237,7 +7199,7 @@ "type": "TOOL", "name": "platinum grille", "description": "This is a metal grille with a layer of platinum plating, suitable for use as a catalyst for some chemical reactions.", - "weight": 660, + "weight": "660 g", "volume": "250 ml", "price": 3000, "to_hit": 1, @@ -7254,7 +7216,7 @@ "category": "tools", "name": "pressure cooker", "description": "Useful for boiling water when cooking spaghetti and more. This sealed pot is designed to cook food at higher pressures and temperatures. Can also be used for pressure sensitive chemical reactions.", - "weight": 2200, + "weight": "2200 g", "volume": "2500 ml", "price": 6500, "to_hit": 1, @@ -7273,7 +7235,7 @@ "type": "TOOL", "name": "hobo stove", "description": "This is a small improvised wood stove, made from a metal can or similar container of the right size. Useful for defrosting and reheating food, uses simple tinder.", - "weight": 500, + "weight": "500 g", "volume": "250 ml", "price": 0, "to_hit": -1, @@ -7302,7 +7264,7 @@ "name": "hobo stove (lit)", "name_plural": "hobo stoves (lit)", "description": "This is a small improvised wood stove, made from a metal can or similar container of the right size. Useful for defrosting and reheating food, uses simple tinder.", - "weight": 500, + "weight": "500 g", "volume": "250 ml", "price": 0, "to_hit": -1, @@ -7332,7 +7294,7 @@ "type": "TOOL", "name": "ember carrier", "description": "This is a small container for holding tinder, with holes punched in it to provide a controlled airflow. It can nurture a smoldering ember for a long time, to start fires without modern tools.", - "weight": 500, + "weight": "500 g", "volume": "500 ml", "price": 1000, "material": "steel", @@ -7355,7 +7317,7 @@ "name": "ember carrier (lit)", "name_plural": "ember carriers (lit)", "description": "This is a small container for holding tinder, with holes punched in it to provide a controlled airflow. An ember is smoldering inside it, and can be used to start a campfire.", - "weight": 500, + "weight": "500 g", "volume": "500 ml", "price": 1000, "material": "steel", @@ -7383,7 +7345,7 @@ "name": "pallet of wet adobe bricks", "name_plural": "pallets of wet adobe bricks", "description": "A pallet full of heavy mud bricks which need to dry slowly to be usable.", - "weight": 35000, + "weight": "35000 g", "volume": "12500 ml", "price": 100, "to_hit": -2, @@ -7409,7 +7371,7 @@ "name": "pallet of dry adobe bricks", "name_plural": "pallets of dry adobe bricks", "description": "A pallet of humble mud bricks that have dried for a week, while you were out risking your life. Disassemble it to retrieve your frame and building supplies.", - "weight": 30000, + "weight": "30000 g", "volume": "12500 ml", "price": 40000, "to_hit": -3, @@ -7424,7 +7386,7 @@ "type": "TOOL", "name": "bronze anvil", "description": "This is a block of oddly shaped bronze with a chisel-like projection set into the corner. It's used in most metalworking fabrication recipes.", - "weight": 2180, + "weight": "2180 g", "volume": "2500 ml", "price": 60000, "to_hit": -5, @@ -7440,7 +7402,7 @@ "type": "TOOL", "name": "stone hand axe", "description": "This is a broad piece of sharpened stone, with enough left untouched to hold safely. The Swiss Army knife of the lower paleolithic.", - "weight": 453, + "weight": "453 g", "volume": "500 ml", "price": 0, "to_hit": -1, @@ -7464,7 +7426,7 @@ "type": "TOOL", "name": "pin reamer", "description": "Handheld pin reamers of this kind are used to enlarge existing holes, or remove any burs and such from them.", - "weight": 76, + "weight": "76 g", "volume": "250 ml", "price": 300, "to_hit": -2, @@ -7480,7 +7442,7 @@ "type": "TOOL", "name": "metal fileset", "description": "These tools are commonly used to remove small amounts of materials from the surface of metal objects.", - "weight": 76, + "weight": "76 g", "volume": "250 ml", "price": 300, "to_hit": -2, @@ -7496,7 +7458,7 @@ "type": "TOOL", "name": "angular grinder", "description": "This widespread powertool is often used for removing excess material or polishing surfaces.", - "weight": 2780, + "weight": "2780 g", "volume": "1750 ml", "price": 5000, "to_hit": -3, @@ -7508,7 +7470,7 @@ "qualities": [ [ "GRIND", 2 ] ], "ammo": "battery", "charges_per_use": 1, - "turns_per_charge": 20, + "power_draw": 800000, "flags": [ "NONCONDUCTIVE" ], "magazines": [ [ @@ -7523,7 +7485,7 @@ "type": "TOOL", "name": "hand vice", "description": "This small handheld metal vice is useful for keeping things still.", - "weight": 320, + "weight": "320 g", "volume": "500 ml", "price": 500, "to_hit": -2, @@ -7540,7 +7502,7 @@ "id": "grip_hook", "name": "grip hook", "description": "A simple steel meathook with a circular steel handle. Makes a passable melee weapon.", - "weight": 900, + "weight": "900 g", "to_hit": 1, "color": "light_gray", "symbol": "?", @@ -7560,9 +7522,9 @@ "symbol": "■", "color": "light_gray", "description": "This is a small bathroom scale, meant to weigh a person while naked.", - "weight": 1200, + "weight": "1200 g", "volume": "1 L", - "price": "500", + "price": 500, "to_hit": -2, "bashing": 6, "material": "steel", @@ -7575,9 +7537,9 @@ "symbol": "&", "color": "light_gray", "description": "This bulky device takes water and calcium carbide and yields unpressurised acetylene.", - "weight": 8000, + "weight": "8000 g", "volume": "3 L", - "price": "3200", + "price": 3200, "to_hit": -4, "bashing": 12, "material": "steel" diff --git a/data/json/items/vehicle/alternator.json b/data/json/items/vehicle/alternator.json index 4157f801e7b0b..bca17a784e593 100644 --- a/data/json/items/vehicle/alternator.json +++ b/data/json/items/vehicle/alternator.json @@ -14,7 +14,7 @@ "type": "GENERIC", "name": "car alternator", "description": "A standard alternator used to power vehicle electrical systems.", - "weight": 4000, + "weight": "4000 g", "volume": "2500 ml", "price": 9000 }, @@ -24,7 +24,7 @@ "type": "GENERIC", "name": "motorbike alternator", "description": "A compact lightweight alternator used to power small vehicle electrical systems.", - "weight": 1100, + "weight": "1100 g", "volume": "1 L", "price": 8000 }, @@ -34,7 +34,7 @@ "type": "GENERIC", "name": "bicycle alternator", "description": "A very lightweight alternator used to power a bicycle's headlights.", - "weight": 1100, + "weight": "1100 g", "volume": "1 L", "price": 8000 }, @@ -44,7 +44,7 @@ "type": "GENERIC", "name": "truck alternator", "description": "A larger and more powerful alternator used to power vehicle electrical systems.", - "weight": 5800, + "weight": "5800 g", "volume": "3 L", "price": 12000 }, @@ -54,7 +54,7 @@ "type": "GENERIC", "name": "7.5kW generator", "description": "A bulky but efficient electrical generator designed to be attached to an engine.", - "weight": 48000, + "weight": "48000 g", "volume": "7500 ml", "price": 30000 } diff --git a/data/json/items/vehicle/armor.json b/data/json/items/vehicle/armor.json index 1dff7fcc6db37..ccb9b760c27b4 100644 --- a/data/json/items/vehicle/armor.json +++ b/data/json/items/vehicle/armor.json @@ -5,7 +5,7 @@ "category": "veh_parts", "name": "rebar grate", "description": "Interlocked sections of rebar that allows for light and effective reinforcement of vehicle sections.", - "weight": 2200, + "weight": "2200 g", "volume": "3 L", "price": 750, "to_hit": -1, @@ -20,7 +20,7 @@ "category": "veh_parts", "name": "shock absorber", "description": "This makeshift combination of springs and scrap, when attached to a vehicle section, protects that section from impacts. The springs can absorb a surprising amount of damage.", - "weight": 22540, + "weight": "22540 g", "volume": "3 L", "price": 1300, "to_hit": -1, diff --git a/data/json/items/vehicle/battery.json b/data/json/items/vehicle/battery.json index b0115e0758345..7d768c047c106 100644 --- a/data/json/items/vehicle/battery.json +++ b/data/json/items/vehicle/battery.json @@ -6,7 +6,7 @@ "name": "car battery", "name_plural": "car batteries", "description": "A 12v lead-acid battery used to power car electrical systems.", - "weight": 18000, + "weight": "18000 g", "volume": "6250 ml", "price": 4000, "material": [ "plastic" ], @@ -24,7 +24,7 @@ "name": "motorbike battery", "name_plural": "motorbike batteries", "description": "A 12v lead-acid battery used to power smaller vehicles' electrical systems.", - "weight": 4000, + "weight": "4000 g", "volume": "1250 ml", "price": 2000, "capacity": 500, @@ -37,12 +37,26 @@ "name": "small motorbike battery", "name_plural": "small motorbike batteries", "description": "A miniature 12v lead-acid battery used to power smaller vehicles' electrical systems.", - "weight": 1500, + "weight": "1500 g", "volume": "750 ml", "price": 20000, "capacity": 150, "//": "~2.4Ah @ 12VDC. Could supply ~140 watts 10 minutes or so" }, + { + "id": "large_storage_battery", + "copy-from": "storage_battery", + "type": "MAGAZINE", + "name": "large storage battery", + "name_plural": "large storage batteries", + "description": "A huge storage battery containing many lithium ion cells. Holds a tremendous amount of energy. Could be installed into a storage battery case for easy removal from a vehicle, or just welded straight in.", + "weight": 400000, + "volume": "50 L", + "price": 400000, + "price_postapoc": 50000, + "bashing": 40, + "capacity": 80000 + }, { "id": "medium_storage_battery", "copy-from": "storage_battery", @@ -50,7 +64,7 @@ "name": "medium storage battery", "name_plural": "medium storage batteries", "description": "A medium storage battery containing multiple lithium ion cells.", - "weight": 35000, + "weight": "35000 g", "volume": "6250 ml", "price": 50000, "price_postapoc": 8000, @@ -64,7 +78,7 @@ "name": "small storage battery", "name_plural": "small storage batteries", "description": "A small storage battery created with pre-Cataclysm lithium ion technology. Useful for crafting.", - "weight": 2500, + "weight": "2500 g", "volume": "500 ml", "price": 5000, "price_postapoc": 1000, @@ -78,7 +92,7 @@ "name": "storage battery", "name_plural": "storage batteries", "description": "A large storage battery containing many lithium ion cells. Could be installed into a storage battery case for easy removal from a vehicle, or just welded straight in.", - "weight": 200000, + "weight": "200000 g", "volume": "25 L", "price": 200000, "price_postapoc": 24000, diff --git a/data/json/items/vehicle/boat.json b/data/json/items/vehicle/boat.json index ce390f3cfda43..4b28c5ddeac49 100644 --- a/data/json/items/vehicle/boat.json +++ b/data/json/items/vehicle/boat.json @@ -9,7 +9,7 @@ "description": "A wooden board that keeps the boat afloat. Add boat hulls to a vehicle until it floats. Then attach oars or a motor to get the boat to move.", "price": 8000, "material": [ "wood" ], - "weight": 3000, + "weight": "3000 g", "volume": "12500 ml", "bashing": 8, "to_hit": -1, @@ -26,7 +26,7 @@ "price": 16000, "price_postapoc": 8000, "material": [ "plastic" ], - "weight": 1500, + "weight": "1500 g", "volume": "12500 ml", "bashing": 8, "to_hit": -1, @@ -43,7 +43,7 @@ "price": 40000, "price_postapoc": 8000, "material": [ "kevlar" ], - "weight": 500, + "weight": "500 g", "volume": "12500 ml", "bashing": 8, "to_hit": -1, @@ -55,7 +55,7 @@ "name": "oars", "name_plural": "oars", "description": "Oars for a boat.", - "weight": 816, + "weight": "816 g", "to_hit": -1, "color": "light_gray", "symbol": ":", @@ -71,7 +71,7 @@ "name": "sail", "name_plural": "sails", "description": "Sails for a boat.", - "weight": 945, + "weight": "945 g", "to_hit": -1, "color": "light_gray", "symbol": ":", @@ -91,7 +91,7 @@ "description": "An inflatable boat section.", "price": 8000, "material": [ "plastic" ], - "weight": 3000, + "weight": "3000 g", "volume": "12500 ml", "bashing": 8, "to_hit": -1, @@ -107,7 +107,7 @@ "description": "An inflatable airbag.", "price": 8000, "material": [ "plastic" ], - "weight": 3000, + "weight": "3000 g", "volume": "12500 ml", "bashing": 8, "to_hit": -1, diff --git a/data/json/items/vehicle/cables.json b/data/json/items/vehicle/cables.json index 258fb9cde7389..dfc1f6a836a33 100644 --- a/data/json/items/vehicle/cables.json +++ b/data/json/items/vehicle/cables.json @@ -3,13 +3,13 @@ "type": "TOOL", "id": "jumper_cable", "name": "jumper cable", - "description": "A jumper cable, like you've seen many times before: it's a short multi-stranded copper cable with power leads on either end, whose purpose is to share power between vehicles.", + "description": "A jumper cable, like you've seen many times before: it's a short multi-stranded copper cable with power leads on either end, whose main purpose is to share power between vehicles, but can also link other electrical systems.", "to_hit": 1, "color": "light_blue", "symbol": "&", "material": [ "steel", "plastic" ], "volume": "500 ml", - "weight": 75, + "weight": "75 g", "bashing": 2, "category": "tools", "price": 1, @@ -22,9 +22,9 @@ "type": "TOOL", "id": "jumper_cable_heavy", "name": "heavy-duty cable", - "description": "A long, thick, heavy-duty cable with power leads on either end. It looks like you could use it to hook up two vehicles to each other, though you expect the power loss would be noticeable.", + "description": "A long, thick, heavy-duty cable with power leads on either end. It looks like you could use it to hook up two vehicles to each other, though you expect the power loss would be noticeable. Can also link other electrical systems.", "volume": "1500 ml", - "weight": 750, + "weight": "750 g", "max_charges": 20, "initial_charges": 20, "copy-from": "jumper_cable" @@ -34,7 +34,7 @@ "id": "jumper_cable_debug", "name": "shiny cable", "description": "This is the cable of the gods: 50 meters long, no power loss, light as a feather and fits in a matchbook. You're sure this wasn't supposed to exist, and the way it shimmers makes you uneasy.", - "weight": 1, + "weight": "1 g", "volume": 0, "max_charges": 50, "initial_charges": 50, diff --git a/data/json/items/vehicle/cargo.json b/data/json/items/vehicle/cargo.json index 3f92e96b81104..a25af0aaac2a7 100644 --- a/data/json/items/vehicle/cargo.json +++ b/data/json/items/vehicle/cargo.json @@ -4,7 +4,7 @@ "id": "basket", "name": "wire basket", "description": "A large wire basket from a shopping cart.", - "weight": 6000, + "weight": "6000 g", "to_hit": -5, "color": "cyan", "symbol": "]", @@ -21,7 +21,7 @@ "id": "folding_basket", "name": "folding wire basket", "description": "A large wire basket from a shopping cart, modified to be foldable.", - "weight": 7000, + "weight": "7000 g", "copy-from": "basket" }, { @@ -29,7 +29,7 @@ "id": "bike_basket", "name": "bike basket", "description": "A simple bike basket. It is small and foldable.", - "weight": 1200, + "weight": "1200 g", "volume": "5 L", "price": 3500, "copy-from": "basket" @@ -39,7 +39,7 @@ "id": "cargo_rack", "name": "cargo carrier", "description": "A heavy frame outfitted with tie-downs and attachment points for carrying cargo.", - "weight": 80000, + "weight": "80000 g", "to_hit": -4, "color": "cyan", "symbol": "]", @@ -54,7 +54,7 @@ "type": "GENERIC", "name": "floor trunk", "description": "A section of flooring with a cargo-space beneath, and a hinged door for access.", - "weight": 18000, + "weight": "18000 g", "color": "cyan", "symbol": "]", "volume": "50 L", @@ -68,7 +68,7 @@ "type": "GENERIC", "name": "livestock carrier", "description": "A heavy frame outfitted with tie-downs and attachment points for carrying cargo, with additional railings to keep a large animal in place. It is meant to hold large animals for transport. Use it on a suitable animal to capture, use it on an empty tile to release.", - "weight": 96000, + "weight": "96000 g", "volume": "62500 ml", "price": 48000, "category": "veh_parts", @@ -86,7 +86,7 @@ "copy-from": "livestock_carrier", "name": "animal locker", "description": "A locker used to contain animals safely during transportation if installed properly. There is room for animal food and other animal care goods. It is meant to hold medium or smaller animals for transport. Use it on a suitable animal to capture, use it on an empty tile to release.", - "weight": 10000, + "weight": "10000 g", "volume": "31250 ml" } ] diff --git a/data/json/items/vehicle/controls.json b/data/json/items/vehicle/controls.json index f0a3c92845c2d..3dda828dde67f 100644 --- a/data/json/items/vehicle/controls.json +++ b/data/json/items/vehicle/controls.json @@ -5,7 +5,7 @@ "name": "vehicle controls", "name_plural": "sets of vehicle controls", "description": "A set of various vehicle controls. Useful for crafting.", - "weight": 6000, + "weight": "6000 g", "to_hit": -4, "color": "light_cyan", "symbol": "$", @@ -20,7 +20,7 @@ "id": "vehicle_dashboard", "name": "dashboard", "description": "A vehicle instrument panel with various gauges and switches. Useful for crafting.", - "weight": 2721, + "weight": "2721 g", "to_hit": -2, "color": "cyan", "symbol": "$", @@ -36,7 +36,7 @@ "copy-from": "vehicle_dashboard", "name": "electronics control unit", "description": "A vehicle instrument panel with various gauges and switches. Useful for crafting.", - "weight": 1311, + "weight": "1311 g", "to_hit": -4, "material": [ "plastic" ], "volume": "1500 ml", @@ -48,7 +48,7 @@ "name": "drive by wire controls", "name_plural": "sets of drive by wire controls", "description": "Fully electronic vehicle control system. You could control it remotely if you had proper tools.", - "weight": 3000, + "weight": "3000 g", "color": "red", "volume": "3750 ml", "bashing": 1, @@ -61,7 +61,7 @@ "name": "robot driving unit", "name_plural": "robot driving units", "description": "A set of servos, microcontrollers and other devices, together capable of driving an unmanned vehicle. Its AI is not functional, but it should still have some sort of maintenance mode.", - "weight": 2000, + "weight": "2000 g", "color": "white", "symbol": "&", "volume": "5 L", diff --git a/data/json/items/vehicle/engine.json b/data/json/items/vehicle/engine.json index 8832adf99109a..33b39e63d92d6 100644 --- a/data/json/items/vehicle/engine.json +++ b/data/json/items/vehicle/engine.json @@ -53,7 +53,7 @@ "type": "ENGINE", "name": "1-cylinder engine", "description": "A single-cylinder 4-stroke combustion engine.", - "weight": 20000, + "weight": "20000 g", "volume": "1500 ml", "price": 10000, "displacement": 40, @@ -65,7 +65,7 @@ "type": "ENGINE", "name": "large 1-cylinder engine", "description": "A powerful high-compression single-cylinder 4-stroke combustion engine.", - "weight": 40000, + "weight": "40000 g", "volume": "2 L", "price": 10000, "displacement": 55, @@ -77,7 +77,7 @@ "type": "ENGINE", "name": "small 1-cylinder engine", "description": "A small single-cylinder 2-stroke combustion engine.", - "weight": 10000, + "weight": "10000 g", "volume": "750 ml", "price": 6000, "displacement": 20, @@ -89,7 +89,7 @@ "type": "ENGINE", "name": "Inline-4 engine", "description": "A small, yet powerful 4-cylinder combustion engine.", - "weight": 130000, + "weight": "130000 g", "volume": "3500 ml", "price": 15000, "displacement": 160 @@ -100,7 +100,7 @@ "type": "ENGINE", "name": "I6 diesel engine", "description": "A powerful straight-6 diesel engine.", - "weight": 185000, + "weight": "185000 g", "volume": "7 L", "price": 27000, "displacement": 600 @@ -111,7 +111,7 @@ "type": "ENGINE", "name": "V-twin engine", "description": "A 2-cylinder 4-stroke combustion engine.", - "weight": 45000, + "weight": "45000 g", "volume": "2 L", "price": 10000, "displacement": 100 @@ -122,7 +122,7 @@ "type": "ENGINE", "name": "V6 engine", "description": "A powerful 6-cylinder combustion engine.", - "weight": 180000, + "weight": "180000 g", "volume": "4750 ml", "price": 18000, "displacement": 280 @@ -133,7 +133,7 @@ "type": "ENGINE", "name": "V6 diesel engine", "description": "A powerful 6-cylinder diesel engine.", - "weight": 190000, + "weight": "190000 g", "volume": "5 L", "price": 20000, "displacement": 280 @@ -144,7 +144,7 @@ "type": "ENGINE", "name": "V8 engine", "description": "A large and very powerful 8-cylinder combustion engine.", - "weight": 250000, + "weight": "250000 g", "volume": "7500 ml", "price": 25000, "displacement": 450 @@ -155,7 +155,7 @@ "type": "ENGINE", "name": "V8 diesel engine", "description": "A powerful 8-cylinder diesel engine.", - "weight": 255000, + "weight": "255000 g", "volume": "8 L", "price": 26500, "displacement": 450 @@ -166,7 +166,7 @@ "type": "ENGINE", "name": "V12 engine", "description": "A massive and extremely powerful V12 engine, usually built into high end sports cars.", - "weight": 300000, + "weight": "300000 g", "volume": "14500 ml", "price": 36000, "displacement": 700 @@ -177,7 +177,7 @@ "type": "ENGINE", "name": "V12 diesel engine", "description": "A massive and extremely powerful V12 engine, usually built into heavy trucks.", - "weight": 310000, + "weight": "310000 g", "volume": "15 L", "price": 32000, "displacement": 700 @@ -188,7 +188,7 @@ "type": "ENGINE", "name": "makeshift steam engine", "description": "A small, primitive, steam engine. An integrated boiler burns coal to heat water into steam, driving a reciprocating shaft. A condenser recaptures the water, making this a closed cycle system.", - "weight": 225000, + "weight": "225000 g", "volume": "62500 ml", "price": 225000, "price_postapoc": 300000 @@ -199,7 +199,7 @@ "type": "ENGINE", "name": "small steam engine", "description": "A small steam engine. An integrated boiler burns coal to heat water into steam, driving a reciprocating shaft. A condenser recaptures the water, making this a closed cycle system.", - "weight": 180000, + "weight": "180000 g", "volume": "37500 ml", "price": 555000, "price_postapoc": 1110000 @@ -210,7 +210,7 @@ "type": "ENGINE", "name": "medium steam engine", "description": "A medium sized steam engine. An integrated boiler burns coal to heat water into steam, driving a reciprocating shaft. A condenser recaptures the water, making this a closed cycle system.", - "weight": 280000, + "weight": "280000 g", "volume": "57500 ml", "price": 870000, "price_postapoc": 1740000 @@ -222,7 +222,7 @@ "name": "massive engine block", "description": "The beginnings of a massive gas or diesel engine. It's not good for much of anything on its own.", "material": "iron", - "weight": 280000, + "weight": "280000 g", "volume": "6250 ml", "price": 30000 }, @@ -233,7 +233,7 @@ "name": "large engine block", "description": "The beginnings of a large gas or diesel engine. It's not good for much of anything on its own.", "material": "iron", - "weight": 190000, + "weight": "190000 g", "volume": "5 L", "price": 20000 }, @@ -244,7 +244,7 @@ "name": "medium engine block", "description": "The beginnings of a medium gas or diesel engine. It's not good for much of anything on its own.", "material": "iron", - "weight": 90000, + "weight": "90000 g", "volume": "2500 ml", "price": 10000 }, @@ -255,7 +255,7 @@ "name": "small engine block", "description": "The beginnings of a small gas or diesel engine. It's not good for much of anything on its own.", "material": "iron", - "weight": 40000, + "weight": "40000 g", "volume": "1250 ml", "price": 5000 }, @@ -266,7 +266,7 @@ "name": "tiny engine block", "description": "The beginnings of a tiny gas or diesel engine. It's not good for much of anything on its own.", "material": "iron", - "weight": 8000, + "weight": "8000 g", "volume": "500 ml", "price": 3500 }, @@ -276,7 +276,7 @@ "type": "ENGINE", "name": "1350 hp gas turbine engine", "description": "A gas turbine engine, usually used for military vehicles. Known for its high rate of fuel consumption.", - "weight": 1130000, + "weight": "1130000 g", "volume": "45 L", "price": 96000, "displacement": 2700 @@ -287,7 +287,7 @@ "type": "ENGINE", "name": "1900 hp gas turbine engine", "description": "A large gas turbine engine, usually used for military helicopters. Known for its high rate of fuel consumption.", - "weight": 1582000, + "weight": "1582000 g", "volume": "63 L", "price": 192000, "displacement": 3800 @@ -298,7 +298,7 @@ "type": "ENGINE", "name": "6000 hp gas turbine engine", "description": "A massive gas turbine engine, used to power the V-22 Osprey. Known for its high rate of fuel consumption.", - "weight": 3164000, + "weight": "3164000 g", "volume": "95 L", "price": 960000, "displacement": 11995 diff --git a/data/json/items/vehicle/engineering.json b/data/json/items/vehicle/engineering.json index 3a37132d509c7..c2de120e0f29f 100644 --- a/data/json/items/vehicle/engineering.json +++ b/data/json/items/vehicle/engineering.json @@ -6,7 +6,7 @@ "name": "steel boom", "description": "A large rigid steel boom. If attached to a frame it could be used to lift up to 20 metric tonnes.", "price": 23400, - "weight": 31600, + "weight": "31600 g", "volume": "12500 ml", "material": "steel", "symbol": "&", @@ -19,7 +19,7 @@ "name": "telescopic cantilever", "description": "A small steel telescoping cantilever. If attached to a frame it could be used to lift up to 3.5 metric tonnes.", "price": 7900, - "weight": 12000, + "weight": "12000 g", "volume": "3 L", "material": "steel", "symbol": "&", @@ -32,7 +32,7 @@ "name": "pallet lifter", "description": "A makeshift pallet lifter. If attached to a frame it could be used to lift up to 0.5 metric tonnes.", "price": 7900, - "weight": 12000, + "weight": "12000 g", "volume": "3 L", "material": "steel", "symbol": "&", @@ -45,7 +45,7 @@ "name": "rockwheel", "color": "dark_gray", "description": "A large and heavy jagged metal disc to dig trenches.", - "weight": 62000, + "weight": "62000 g", "material": "steel", "category": "veh_parts", "price": 8500, @@ -58,7 +58,7 @@ "name": "airjack", "color": "dark_gray", "description": "An extendable metal pylon used to replace a portable jack. If mounted to a vehicle, it could be used to lift it up.", - "weight": 21000, + "weight": "21000 g", "material": "steel", "category": "veh_parts", "price": 8500, @@ -72,7 +72,7 @@ "name": "motorcycle kickstand", "color": "dark_gray", "description": "A kickstand to keep the bike from falling over. You could use this to lean it forward or backward to change a tire.", - "weight": 500, + "weight": "500 g", "material": "steel", "category": "veh_parts", "price": 500, diff --git a/data/json/items/vehicle/farming.json b/data/json/items/vehicle/farming.json index 37fe4425138b4..4a7f66cd3e4de 100644 --- a/data/json/items/vehicle/farming.json +++ b/data/json/items/vehicle/farming.json @@ -7,7 +7,7 @@ "color": "light_gray", "name_plural": "vehicle scoops", "description": "An assembly of motors and sheet metal that allows a vehicle to clean the road surface by removing debris and contaminants.", - "weight": 22666, + "weight": "22666 g", "bashing": 1, "material": "steel", "category": "veh_parts", @@ -41,7 +41,7 @@ "name": "advanced reaper", "name_plural": "advanced reapers", "description": "An advanced electronic device used to cut down, collect and store crops.", - "weight": 25000, + "weight": "25000 g", "material": [ "steel", "plastic" ], "price": 50000, "volume": "9 L", @@ -55,7 +55,7 @@ "name_plural": "advanced seed drills", "color": "dark_gray", "description": "An assembly of tubes, spikes, and wheels, that when dragged along the ground, allows a vehicle to plant seeds automatically in suitably tilled land. This one is equipped with an electronic control system and will avoid damaging itself when used on untilled land.", - "weight": 32666, + "weight": "32666 g", "material": [ "steel", "plastic" ], "price": 50000, "volume": "7250 ml", @@ -69,7 +69,7 @@ "name_plural": "plows", "color": "dark_gray", "description": "A heavy assembly of wheels and steel blades that turn up the ground.", - "weight": 32666, + "weight": "32666 g", "material": [ "steel", "plastic" ], "volume": "7250 ml", "copy-from": "v_scoop_item" diff --git a/data/json/items/vehicle/frames.json b/data/json/items/vehicle/frames.json index 3ac7fe0fe8d09..643845334f24b 100644 --- a/data/json/items/vehicle/frames.json +++ b/data/json/items/vehicle/frames.json @@ -4,7 +4,7 @@ "id": "foldframe", "name": "foldable-light frame", "description": "A small foldable lightweight frame made from pipework.", - "weight": 5000, + "weight": "5000 g", "to_hit": -3, "color": "light_gray", "symbol": "]", @@ -28,7 +28,7 @@ "id": "frame", "name": "steel frame", "description": "A large frame made of steel. Useful for crafting.", - "weight": 20000, + "weight": "20000 g", "to_hit": -5, "color": "cyan", "volume": "15 L", @@ -41,7 +41,7 @@ "id": "hdframe", "name": "heavy duty frame", "description": "A large, reinforced steel frame, used in military vehicle construction.", - "weight": 100000, + "weight": "100000 g", "to_hit": -6, "color": "green", "material": [ "hardsteel", "steel" ], @@ -56,7 +56,7 @@ "id": "frame_wood", "name": "wooden frame", "description": "A large frame made of wood. Useful for crafting.", - "weight": 8000, + "weight": "8000 g", "to_hit": -5, "color": "brown", "material": [ "wood" ], @@ -71,7 +71,7 @@ "id": "foldwoodframe", "name": "foldable wooden frame", "description": "A small foldable frame made from scrap wood.", - "weight": 4000, + "weight": "4000 g", "color": "brown", "material": [ "wood" ], "volume": "12500 ml", @@ -82,7 +82,7 @@ "id": "frame_wood_light", "name": "light wooden frame", "description": "A small frame made of few pieces of wood, held together by rope. Useful for crafting.", - "weight": 4000, + "weight": "4000 g", "to_hit": -5, "color": "brown", "material": [ "wood" ], diff --git a/data/json/items/vehicle/lights.json b/data/json/items/vehicle/lights.json index 6d53f39137f78..5ebd6fe306491 100644 --- a/data/json/items/vehicle/lights.json +++ b/data/json/items/vehicle/lights.json @@ -8,7 +8,7 @@ "color": "white", "material": "plastic", "category": "veh_parts", - "weight": 1000, + "weight": "1000 g", "volume": "1 L", "price": 3000 }, @@ -17,7 +17,7 @@ "type": "GENERIC", "name": "motorcycle headlight", "description": "A motorcycle headlight to light up the way.", - "weight": 500, + "weight": "500 g", "volume": "250 ml", "price": 5000, "copy-from": "car_headlight" @@ -28,7 +28,7 @@ "name": "wide-angle car headlight", "description": "A wide-angle vehicle headlight to light up the way.", "looks_like": "car_headlight", - "weight": 2000, + "weight": "2000 g", "volume": "1250 ml", "price": 4000, "copy-from": "car_headlight" @@ -38,7 +38,7 @@ "id": "headlight_reinforced", "name": "reinforced headlight", "description": "A vehicle headlight with a cage built around it to protect it from damage without reducing its effectiveness.", - "weight": 1200, + "weight": "1200 g", "to_hit": -2, "color": "light_cyan", "symbol": ",", @@ -52,7 +52,7 @@ "id": "wide_headlight_reinforced", "name": "reinforced wide-angle headlight", "description": "A wide-angle vehicle headlight with a cage built around it to protect it from damage without reducing its effectiveness.", - "weight": 1400, + "weight": "1400 g", "volume": "1250 ml", "copy-from": "headlight_reinforced" }, @@ -62,7 +62,7 @@ "name": "emergency vehicle light (red)", "name_plural": "emergency vehicle lights (red)", "description": "One of the red-colored lights from the top of an emergency services vehicle. When turned on, the lights rotate to shine in all directions.", - "weight": 500, + "weight": "500 g", "to_hit": 1, "color": "red", "material": [ "plastic", "steel" ], @@ -84,7 +84,7 @@ "id": "floodlight", "name": "floodlight", "description": "A large and heavy light designed to illuminate wide areas.", - "weight": 2500, + "weight": "2500 g", "to_hit": 1, "material": [ "plastic", "steel" ], "volume": "2 L", diff --git a/data/json/items/vehicle/manual.json b/data/json/items/vehicle/manual.json index 9a7ba0b2f9aeb..16e141603e83d 100644 --- a/data/json/items/vehicle/manual.json +++ b/data/json/items/vehicle/manual.json @@ -5,7 +5,7 @@ "name": "set of hand rims", "name_plural": "sets of hand rims", "description": "Hand rims for use on a wheelchair.", - "weight": 816, + "weight": "816 g", "to_hit": -1, "color": "light_gray", "symbol": ":", diff --git a/data/json/items/vehicle/mills.json b/data/json/items/vehicle/mills.json index 36aa42371f929..3ca035a0026ee 100644 --- a/data/json/items/vehicle/mills.json +++ b/data/json/items/vehicle/mills.json @@ -4,7 +4,7 @@ "id": "wind_turbine", "name": "wind turbine", "description": "A small turbine that can convert wind into electric power.", - "weight": 50000, + "weight": "50000 g", "to_hit": -4, "color": "yellow", "symbol": "T", @@ -19,7 +19,7 @@ "id": "xl_wind_turbine", "name": "large wind turbine", "description": "A large turbine that can convert wind into electric power.", - "weight": 150000, + "weight": "150000 g", "to_hit": -7, "symbol": "Y", "volume": "60 L", @@ -31,7 +31,7 @@ "id": "water_wheel", "name": "water wheel", "description": "A water wheel. Will slowly recharge the vehicle's electrical power when built over shallow moving water.", - "weight": 300000, + "weight": "300000 g", "to_hit": -5, "symbol": "*", "material": [ "wood" ], @@ -45,7 +45,7 @@ "id": "xl_water_wheel", "name": "large water wheel", "description": "A large water wheel with wooden supports. Will recharge the vehicle's electrical power when built over shallow moving water.", - "weight": 600000, + "weight": "600000 g", "symbol": "o", "volume": "60 L", "price": 200000, diff --git a/data/json/items/vehicle/motors.json b/data/json/items/vehicle/motors.json index 0c978c83b0928..1ab79453459a2 100644 --- a/data/json/items/vehicle/motors.json +++ b/data/json/items/vehicle/motors.json @@ -4,7 +4,7 @@ "id": "motor", "name": "electric motor", "description": "A powerful electric motor. Useful for crafting.", - "weight": 27200, + "weight": "27200 g", "color": "light_cyan", "symbol": ",", "material": [ "steel" ], @@ -18,7 +18,7 @@ "id": "motor_enhanced", "name": "enhanced electric motor", "description": "A very powerful and yet lightweight electric motor. Useful for crafting.", - "weight": 81600, + "weight": "81600 g", "material": [ "superalloy" ], "volume": "2650 ml", "price": 68000, @@ -29,7 +29,7 @@ "id": "motor_super", "name": "super electric motor", "description": "The most powerfull electric motor on the market. Useful for crafting.", - "weight": 133800, + "weight": "133800 g", "volume": "111 L", "price": 80000, "copy-from": "motor" @@ -39,7 +39,7 @@ "id": "motor_large", "name": "large electric motor", "description": "A large and very powerful electric motor. Useful for crafting.", - "weight": 68000, + "weight": "68000 g", "to_hit": -3, "symbol": ":", "volume": "1740 ml", @@ -52,7 +52,7 @@ "id": "motor_small", "name": "small electric motor", "description": "A small electric motor. Useful for crafting.", - "weight": 7500, + "weight": "7500 g", "volume": "5 L", "bashing": 1, "price": 2000, @@ -63,7 +63,7 @@ "id": "motor_tiny", "name": "tiny electric motor", "description": "A tiny electric motor. Useful for crafting.", - "weight": 5800, + "weight": "5800 g", "color": "light_cyan", "symbol": ",", "material": [ "steel", "plastic" ], diff --git a/data/json/items/vehicle/noise.json b/data/json/items/vehicle/noise.json index 561513eaed358..30a9cc08ecc54 100644 --- a/data/json/items/vehicle/noise.json +++ b/data/json/items/vehicle/noise.json @@ -4,7 +4,7 @@ "id": "muffler", "name": "muffler", "description": "A muffler from a car. Very unwieldy as a weapon. Useful in a few crafting recipes.", - "weight": 9525, + "weight": "9525 g", "to_hit": -10, "color": "light_gray", "symbol": "/", @@ -21,7 +21,7 @@ "id": "beeper", "name": "back-up beeper", "description": "This is a safety device intended to warn passersby of a vehicle moving in reverse, but the usage of it now seems terribly unwise.", - "weight": 360, + "weight": "360 g", "symbol": ";", "color": "light_gray", "material": [ "plastic", "aluminum" ], @@ -36,7 +36,7 @@ "id": "stereo", "name": "stereo system", "description": "A stereo system with speakers. It is capable of being hooked up to a vehicle.", - "weight": 800, + "weight": "800 g", "to_hit": -2, "color": "red", "symbol": "&", @@ -51,7 +51,7 @@ "name": "chime loudspeakers", "name_plural": "chime loudspeakers", "description": "A stereo system with loudspeakers and a built-in set of simple melodies that it will play. Commonly used by ice cream trucks to draw the attention of children in the days when children wanted ice cream more than brains.", - "weight": 2600, + "weight": "2600 g", "to_hit": -2, "color": "blue", "symbol": "&", diff --git a/data/json/items/vehicle/plating.json b/data/json/items/vehicle/plating.json index 38bfa93b1bda4..6c8c77a911e72 100644 --- a/data/json/items/vehicle/plating.json +++ b/data/json/items/vehicle/plating.json @@ -5,7 +5,7 @@ "name": "sheet metal", "description": "A thin sheet of metal.", "//": "Roughly in the 70cm×70cm×1.5mm to 1m×1m×0.75mm range. Has to be folded / rolled up when in inventory, so 75% density compared to solid block.", - "weight": 6000, + "weight": "6000 g", "to_hit": -2, "color": "light_cyan", "symbol": "]", @@ -21,7 +21,7 @@ "id": "sheet_metal_lit", "name": "wired sheet metal", "description": "Sheet metal that has had light housing wired into it.", - "weight": 6200, + "weight": "6200 g", "to_hit": -2, "color": "light_cyan", "symbol": "]", @@ -36,7 +36,7 @@ "id": "wood_plate", "name": "wooden armor kit", "description": "A bundle of two by fours prepared to be used as vehicle armor.", - "weight": 5600, + "weight": "5600 g", "to_hit": -8, "color": "brown", "symbol": "]", @@ -51,7 +51,7 @@ "id": "steel_plate", "name": "steel plating", "description": "A piece of armor plating made of steel.", - "weight": 12880, + "weight": "12880 g", "to_hit": -1, "color": "light_cyan", "symbol": "]", @@ -67,7 +67,7 @@ "id": "alloy_plate", "name": "superalloy plating", "description": "A piece of armor plating made of sturdy superalloy.", - "weight": 10800, + "weight": "10800 g", "to_hit": -1, "color": "light_cyan", "symbol": "]", @@ -83,7 +83,7 @@ "id": "alloy_sheet", "name": "superalloy sheet", "description": "A sheet of sturdy superalloy, incredibly hard, yet incredibly malleable.", - "weight": 900, + "weight": "900 g", "to_hit": -2, "color": "light_cyan", "symbol": ",", @@ -98,7 +98,7 @@ "id": "spiked_plate", "name": "spiked plating", "description": "A piece of armor plating made of steel. It is covered with menacing spikes.", - "weight": 12240, + "weight": "12240 g", "to_hit": -1, "color": "light_cyan", "symbol": "]", @@ -116,7 +116,7 @@ "id": "hard_plate", "name": "hard plating", "description": "A piece of very thick armor plating made of steel.", - "weight": 32640, + "weight": "32640 g", "to_hit": -1, "color": "light_cyan", "symbol": "]", @@ -132,7 +132,7 @@ "id": "mil_plate", "name": "military composite plating", "description": "A thick sheet of military grade armor, best bullet stopper you can stick on a vehicle.", - "weight": 16500, + "weight": "16500 g", "to_hit": -1, "color": "green", "symbol": "]", @@ -152,7 +152,7 @@ "description": "Light chitin plating made for a vehicle.", "price": 1200, "material": [ "chitin" ], - "weight": 2000, + "weight": "2000 g", "volume": "5500 ml", "bashing": 8, "to_hit": -4, @@ -176,7 +176,7 @@ "description": "Bone plating made for a vehicle.", "price": 1200, "material": [ "bone" ], - "weight": 4000, + "weight": "4000 g", "volume": "9500 ml", "bashing": 8, "to_hit": -4, diff --git a/data/json/items/vehicle/rams.json b/data/json/items/vehicle/rams.json index acf12533f6693..116d29fdf1581 100644 --- a/data/json/items/vehicle/rams.json +++ b/data/json/items/vehicle/rams.json @@ -5,7 +5,7 @@ "category": "veh_parts", "name": "shredder", "description": "This menacing looking attachment is meant to be powered by a vehicle's engine. Upon doing so, the circular blades of this device will rotate rapidly; anything in front of it is likely to be ripped to shreds. It is sturdy enough to withstand multiple impacts, and is designed to detach if it would take a hit that would break it.", - "weight": 29955, + "weight": "29955 g", "volume": "7500 ml", "price": 10500, "to_hit": -1, diff --git a/data/json/items/vehicle/rigs.json b/data/json/items/vehicle/rigs.json index e9bf974b7221b..eab7396b8b93d 100644 --- a/data/json/items/vehicle/rigs.json +++ b/data/json/items/vehicle/rigs.json @@ -4,7 +4,7 @@ "type": "GENERIC", "category": "veh_parts", "name": "vehicle crafting rig", - "weight": 40000, + "weight": "40000 g", "volume": "20 L", "price": 40000, "material": "steel", diff --git a/data/json/items/vehicle/seating.json b/data/json/items/vehicle/seating.json index c68e2771733a9..2f915d01ba93b 100644 --- a/data/json/items/vehicle/seating.json +++ b/data/json/items/vehicle/seating.json @@ -4,7 +4,7 @@ "id": "seat", "name": "seat", "description": "A soft car seat covered with leather.", - "weight": 9071, + "weight": "9071 g", "to_hit": -4, "color": "red", "symbol": "0", @@ -19,7 +19,7 @@ "id": "saddle", "name": "saddle", "description": "A leather-covered seat designed to be straddled.", - "weight": 300, + "weight": "300 g", "material": [ "plastic", "aluminum" ], "volume": "1250 ml", "bashing": 2, diff --git a/data/json/items/vehicle/solar.json b/data/json/items/vehicle/solar.json index a71101d319fb9..925119485e0e5 100644 --- a/data/json/items/vehicle/solar.json +++ b/data/json/items/vehicle/solar.json @@ -4,7 +4,7 @@ "id": "solar_panel", "name": "solar panel", "description": "Electronic device that can convert solar radiation into electric power. Useful for a vehicle.", - "weight": 14000, + "weight": "14000 g", "to_hit": -4, "color": "yellow", "symbol": "]", @@ -19,7 +19,7 @@ "id": "reinforced_solar_panel", "name": "reinforced solar panel", "description": "A solar panel that has been covered with a pane of reinforced glass to protect the delicate solar cells from zombies or errant baseballs. The glass causes this panel to produce slightly less power than a normal panel. Useful for a vehicle.", - "weight": 24153, + "weight": "24153 g", "color": "light_blue", "material": [ "glass", "steel" ], "volume": "6500 ml", @@ -31,7 +31,7 @@ "id": "solar_panel_v2", "name": "upgraded solar panel", "description": "Electronic device that can convert solar radiation into electric power. This panel has been upgraded to convert more sunlight into power. Useful for a vehicle.", - "weight": 18494, + "weight": "18494 g", "volume": "4500 ml", "price": 190000, "copy-from": "solar_panel" @@ -41,7 +41,7 @@ "id": "reinforced_solar_panel_v2", "name": "upgraded reinforced solar panel", "description": "An upgraded solar panel that has been covered with a pane of reinforced glass to protect the delicate solar cells from zombies or errant baseballs. The glass causes this panel to produce slightly less power than a normal upgraded panel. Useful for a vehicle.", - "weight": 29062, + "weight": "29062 g", "to_hit": -5, "volume": "7500 ml", "price": 240000, @@ -63,7 +63,7 @@ "id": "solar_cell", "name": "solar cell", "description": "A small electronic device that can convert solar radiation into electric power. Useful for crafting.", - "weight": 500, + "weight": "500 g", "symbol": ";", "volume": "250 ml", "category": "spare_parts", diff --git a/data/json/items/vehicle/tables.json b/data/json/items/vehicle/tables.json index 86409ed2ee387..97b028be904e5 100644 --- a/data/json/items/vehicle/tables.json +++ b/data/json/items/vehicle/tables.json @@ -4,7 +4,7 @@ "id": "v_table", "name": "fancy table", "description": "A very fancy table from a very fancy RV. If times were better it might be useful for something more than firewood.", - "weight": 9071, + "weight": "9071 g", "to_hit": -8, "color": "red", "symbol": "0", @@ -20,7 +20,7 @@ "id": "w_table", "name": "wooden table", "description": "A crude wooden table.", - "weight": 10071, + "weight": "10071 g", "copy-from": "v_table" }, { @@ -28,7 +28,7 @@ "id": "workbench", "name": "workbench", "description": "A sturdy workbench built out of metal. It is perfect for crafting large and heavy things.", - "weight": 23000, + "weight": "23000 g", "material": [ "steel" ], "bashing": 8, "price": 40000, diff --git a/data/json/items/vehicle/utilities.json b/data/json/items/vehicle/utilities.json index 3a40faf4ca632..a94d4656f20dd 100644 --- a/data/json/items/vehicle/utilities.json +++ b/data/json/items/vehicle/utilities.json @@ -4,7 +4,7 @@ "id": "washing_machine", "name": "washing machine", "description": "A very small washing machine designed for use in vehicles.", - "weight": 31752, + "weight": "31752 g", "to_hit": -8, "color": "light_blue", "symbol": "]", @@ -22,7 +22,7 @@ "price": 162654, "symbol": "A", "color": "yellow", - "weight": 34500, + "weight": "34500 g", "volume": "76 L", "copy-from": "washing_machine" }, diff --git a/data/json/items/vehicle/wheel.json b/data/json/items/vehicle/wheel.json index e221c6c398620..6120e11bb050d 100644 --- a/data/json/items/vehicle/wheel.json +++ b/data/json/items/vehicle/wheel.json @@ -1,11 +1,54 @@ [ + { + "id": "wheel_mount_light", + "type": "GENERIC", + "category": "veh_parts", + "name": "light wheel mount", + "description": "A piece of metal with holes suitable for a bike or motorbike wheel.", + "weight": 150, + "volume": "250 ml", + "price": 10, + "material": [ "steel" ], + "symbol": ";", + "color": "dark_gray" + }, + { + "id": "wheel_mount_medium", + "type": "GENERIC", + "category": "veh_parts", + "name": "medium hub assembly", + "description": "A metal assembly that allows bolting a wheel on a car. Fit for a car wheel.", + "weight": 5000, + "volume": "6 L", + "price": 3000, + "bashing": 14, + "to_hit": -2, + "material": [ "steel" ], + "symbol": ";", + "color": "dark_gray" + }, + { + "id": "wheel_mount_heavy", + "type": "GENERIC", + "category": "veh_parts", + "name": "heavy hub assembly", + "description": "A heavy metal assembly that allows bolting a wheel on a car. Fit for a large car wheel.", + "weight": 6000, + "volume": "7 L", + "price": 5000, + "bashing": 14, + "to_hit": -2, + "material": [ "steel" ], + "symbol": ";", + "color": "dark_gray" + }, { "id": "wheel", "type": "WHEEL", "category": "veh_parts", "name": "wheel", "description": "A car wheel.", - "weight": 8845, + "weight": "8845 g", "volume": "10 L", "price": 10000, "bashing": 12, @@ -22,7 +65,7 @@ "category": "veh_parts", "name": "racing wheel", "description": "A wide, smooth wheel intended for racing. The slick surface provides better speed on pavement but penalizes off-road speed.", - "weight": 12600, + "weight": "12600 g", "volume": "13750 ml", "price": 24000, "bashing": 14, @@ -39,7 +82,7 @@ "category": "veh_parts", "name": "armored wheel", "description": "A wide military grade wheel.", - "weight": 24500, + "weight": "24500 g", "volume": "17500 ml", "price": 34000, "bashing": 17, @@ -56,7 +99,7 @@ "category": "veh_parts", "name": "wheelbarrow wheel", "description": "A small wheel from a common garden wheelbarrow.", - "weight": 2722, + "weight": "2722 g", "volume": "2250 ml", "price": 2000, "bashing": 10, @@ -73,7 +116,7 @@ "category": "veh_parts", "name": "bicycle wheel", "description": "A bicycle wheel.", - "weight": 1500, + "weight": "1500 g", "volume": "7 L", "price": 4000, "bashing": 8, @@ -98,7 +141,7 @@ "name": "set of casters", "name_plural": "sets of casters", "description": "A set of casters, like on a shopping cart.", - "weight": 1500, + "weight": "1500 g", "volume": "1250 ml", "price": 14000, "bashing": 6, @@ -115,7 +158,7 @@ "type": "WHEEL", "name": "metal wheel", "description": "A simple metal wheel.", - "weight": 18239, + "weight": "18239 g", "volume": "8750 ml", "price": 1200, "bashing": 8, @@ -132,7 +175,7 @@ "type": "WHEEL", "name": "rail wheel", "description": "A strong rail wheel. A flange helps keep it on a rail, but makes it perform terribly when not on a rail.", - "weight": 18239, + "weight": "18239 g", "volume": "8750 ml", "price": 1200, "bashing": 8, @@ -149,7 +192,7 @@ "category": "veh_parts", "name": "motorbike wheel", "description": "A motorbike wheel.", - "weight": 5443, + "weight": "5443 g", "volume": "8250 ml", "price": 14000, "bashing": 10, @@ -174,7 +217,7 @@ "category": "veh_parts", "name": "large steel drum", "description": "A large cylinder fashioned out of thick plates of hardened steel, that is normally found on road rollers. Numerous massive spokes, attached to a central axis, reinforce its structure even further, making it an unstoppable force once it starts rolling.", - "weight": 750000, + "weight": "750000 g", "volume": "200 L", "price": 50000, "bashing": 60, @@ -191,7 +234,7 @@ "category": "veh_parts", "name": "small wheel", "description": "A pretty small wheel. Probably from one of those Segway things. It is not very menacing.", - "weight": 2722, + "weight": "2722 g", "volume": "2250 ml", "price": 14000, "bashing": 10, @@ -209,7 +252,7 @@ "name": "set of tricycle wheels", "name_plural": "sets of tricycle wheels", "description": "A set of hard plastic wheels with one larger than the other two. Proudly made in the USA by Double Dango Productions.", - "weight": 750, + "weight": "750 g", "volume": "750 ml", "price": 7000, "bashing": 3, @@ -227,7 +270,7 @@ "name": "pair of wheelchair wheels", "name_plural": "pairs of wheelchair wheels", "description": "A pair of wheels for a wheelchair.", - "weight": 3000, + "weight": "3000 g", "volume": "12500 ml", "price": 8000, "bashing": 8, @@ -244,7 +287,7 @@ "category": "veh_parts", "name": "wide wheel", "description": "A wide wheel. \\o/ This wide.", - "weight": 22600, + "weight": "22600 g", "volume": "17500 ml", "price": 34000, "bashing": 17, @@ -268,7 +311,7 @@ "category": "veh_parts", "name": "wooden cart wheel", "description": "A wooden cart wheel, hand made.", - "weight": 4500, + "weight": "4500 g", "volume": "8750 ml", "price": 1200, "bashing": 8, diff --git a/data/json/items/vehicle_parts.json b/data/json/items/vehicle_parts.json index ebebcafdacfe5..60fd123b72f37 100644 --- a/data/json/items/vehicle_parts.json +++ b/data/json/items/vehicle_parts.json @@ -5,7 +5,7 @@ "name": "storage battery case", "name_plural": "storage battery cases", "description": "An empty case that can hold a storage battery. Complete with charging controller chip and connecting wires.", - "weight": 1231, + "weight": "1231 g", "to_hit": -3, "color": "light_gray", "symbol": ":", @@ -22,7 +22,7 @@ "name": "military black box", "name_plural": "military black boxes", "description": "This is a black box, seemingly pulled from some sort of military vehicle wreckage. If you can find a system to analyze this you may find something of interest.", - "weight": 4535, + "weight": "4535 g", "volume": "2 L", "price": 0, "to_hit": -1, @@ -36,7 +36,7 @@ "id": "minireactor", "name": "minireactor", "description": "A small portable plutonium reactor. Handle with great care!", - "weight": 27215, + "weight": "27215 g", "to_hit": -4, "color": "light_cyan", "symbol": ":", @@ -53,7 +53,7 @@ "id": "water_faucet", "name": "water faucet", "description": "A metal faucet that can be attached to a water tank for easy access.", - "weight": 900, + "weight": "900 g", "to_hit": -1, "color": "light_gray", "symbol": ";", @@ -68,7 +68,7 @@ "id": "towel_hanger", "name": "towel hanger", "description": "A towel hanger with towels.", - "weight": 2000, + "weight": "2000 g", "to_hit": -1, "color": "brown", "symbol": "-", @@ -83,7 +83,7 @@ "id": "veh_tracker", "name": "vehicle tracking device", "description": "A vehicle tracking device. When installed on a vehicle it allows you track the vehicle.", - "weight": 400, + "weight": "400 g", "color": "red", "symbol": ";", "material": [ "plastic", "aluminum" ], @@ -98,7 +98,7 @@ "name": "yoke and harness", "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, + "weight": "1000 g", "volume": "3750 ml", "price": 48000, "bashing": 3, @@ -115,7 +115,7 @@ "type": "GENERIC", "name": "bike rack", "description": "A collection of pipes, cams, and straps, mounted on the edge of a vehicle and used to support another vehicle for transport. It must be mounted on a vehicle to be used.", - "weight": 4000, + "weight": "4000 g", "volume": "6250 ml", "price": 16000, "category": "veh_parts", @@ -130,7 +130,7 @@ "id": "recharge_station", "name": "recharging station", "description": "A universal recharging station designed to operate on vehicle power. While on it will steadily charge all rechargeable batteries (battery cells, lead-acid batteries, etc) placed directly within its storage space. The system can only be installed onto existing storage compartments, and is controlled from a dashboard or electronics control unit.", - "weight": 10000, + "weight": "10000 g", "to_hit": 1, "color": "light_blue", "symbol": "-", @@ -146,7 +146,7 @@ "name": "vehicle heater", "name_plural": "vehicle heaters", "description": "A vehicle-mounted area heater.", - "weight": 12500, + "weight": "12500 g", "to_hit": -4, "color": "red", "symbol": ";", @@ -162,7 +162,7 @@ "name": "vehicle cooler", "name_plural": "vehicle coolers", "description": "A vehicle-mounted area cooler.", - "weight": 12500, + "weight": "12500 g", "to_hit": -4, "color": "light_cyan", "symbol": "C", @@ -177,7 +177,7 @@ "id": "camera_control", "name": "camera display", "description": "A set of small monitors. Required to view cameras' output.", - "weight": 11234, + "weight": "11234 g", "to_hit": -3, "color": "light_blue", "symbol": "#", @@ -191,7 +191,7 @@ "id": "omnicamera", "name": "security camera", "description": "A security camera you could connect to a display. Image quality is quite low, but the field of vision is great.", - "weight": 1100, + "weight": "1100 g", "to_hit": -3, "color": "light_blue", "symbol": "+", @@ -209,7 +209,7 @@ "color": "dark_gray", "material": "steel", "category": "veh_parts", - "weight": 500, + "weight": "500 g", "volume": "250 ml", "price": 800 }, @@ -222,7 +222,7 @@ "symbol": "X", "material": "steel", "category": "veh_parts", - "weight": 10000, + "weight": "10000 g", "volume": "2500 ml", "price": 5500 }, @@ -236,7 +236,7 @@ "looks_like": "cargo_rack", "material": "steel", "category": "veh_parts", - "weight": 22000, + "weight": "22000 g", "volume": "55 L", "capacity": 2000, "reliability": 10, @@ -253,7 +253,7 @@ "color": "dark_gray", "material": "steel", "category": "veh_parts", - "weight": 27600, + "weight": "27600 g", "volume": "18750 ml", "price": 37500 } diff --git a/data/json/legacy_artifact_passive.json b/data/json/legacy_artifact_passive.json new file mode 100644 index 0000000000000..3cc9ab9ca6169 --- /dev/null +++ b/data/json/legacy_artifact_passive.json @@ -0,0 +1,47 @@ +[ + { + "type": "enchantment", + "id": "AEP_STR_UP", + "values": [ { "value": "STRENGTH", "add": 4 } ], + "has": "WIELD" + }, + { + "type": "enchantment", + "id": "AEP_DEX_UP", + "values": [ { "value": "DEXTERITY", "add": 4 } ], + "has": "WIELD" + }, + { + "type": "enchantment", + "id": "AEP_PER_UP", + "values": [ { "value": "PERCEPTION", "add": 4 } ], + "has": "WIELD" + }, + { + "type": "enchantment", + "id": "AEP_INT_UP", + "values": [ { "value": "INTELLIGENCE", "add": 4 } ], + "has": "WIELD" + }, + { + "type": "enchantment", + "id": "AEP_ALL_UP", + "values": [ + { "value": "STRENGTH", "add": 2 }, + { "value": "DEXTERITY", "add": 2 }, + { "value": "PERCEPTION", "add": 2 }, + { "value": "INTELLIGENCE", "add": 2 } + ], + "has": "WIELD" + }, + { + "type": "enchantment", + "id": "AEP_SPEED_UP", + "values": [ { "value": "SPEED", "add": 20 } ] + }, + { + "type": "enchantment", + "id": "AEP_SPEED_DOWN", + "values": [ { "value": "SPEED", "add": -20 } ] + } +] diff --git a/data/json/mapgen/abandoned01.json b/data/json/mapgen/abandoned01.json index eab9ad3554ec2..7437d3fef4641 100644 --- a/data/json/mapgen/abandoned01.json +++ b/data/json/mapgen/abandoned01.json @@ -37,7 +37,7 @@ "type": "item_group", "subtype": "distribution", "items": [ - [ "chestrig", 20 ], + [ "tacvest", 20 ], [ "jacket_light", 30 ], [ "jacket_leather", 30 ], [ "jacket_evac", 30 ], diff --git a/data/json/mapgen/basement/basement_lab_stairs.json b/data/json/mapgen/basement/basement_lab_stairs.json index 2d3c3fe499d48..6928cd23ff0cd 100644 --- a/data/json/mapgen/basement/basement_lab_stairs.json +++ b/data/json/mapgen/basement/basement_lab_stairs.json @@ -44,7 +44,7 @@ ">": "t_stairs_down" }, "mapping": { "c": { "items": { "item": "chem_lab", "chance": 30 } }, "d": { "items": { "item": "office", "chance": 30 } } }, - "monster": { "7": { "monster": "mon_turret" } }, + "monster": { "7": { "monster": "mon_turret_rifle" } }, "place_nested": [ { "chunks": [ "lab_spawn_7x7_crossdoors" ], "x": 3, "y": 1 }, { "chunks": [ "lab_spawn_7x7_crossdoors" ], "x": 14, "y": 1 } @@ -109,7 +109,7 @@ } }, "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 2, 23 ], "y": [ 6, 20 ], "chance": 2 } ], - "monster": { "7": { "monster": "mon_turret" } } + "monster": { "7": { "monster": "mon_turret_rifle" } } } } ] diff --git a/data/json/mapgen/bunker.json b/data/json/mapgen/bunker.json index e234efbf8e0d6..d5bef129b7673 100644 --- a/data/json/mapgen/bunker.json +++ b/data/json/mapgen/bunker.json @@ -338,8 +338,8 @@ "items": [ { "item": "m1911", "charges": 6, "ammo-item": "45_acp" }, { "item": "45_casing", "charges-min": 1, "charges-max": 1 }, - { "item": "corpse" }, - { "group": "underwear" } + { "group": "underwear" }, + { "item": "corpse" } ] }, { diff --git a/data/json/mapgen/farm_dairy.json b/data/json/mapgen/farm_dairy.json index 3685b4d5b37d0..5cd2f64210209 100644 --- a/data/json/mapgen/farm_dairy.json +++ b/data/json/mapgen/farm_dairy.json @@ -129,9 +129,9 @@ { "item": "bed", "x": 11, "y": 17, "chance": 90 }, { "item": "bed", "x": 13, "y": 16, "chance": 60 }, { "item": "drugs_heal_simple", "x": 7, "y": 16, "chance": 90 }, - { "item": "homebooks", "x": 8, "y": 10, "chance": 80 }, - { "item": "homebooks", "x": 10, "y": 15, "chance": 80 }, - { "item": "homebooks", "x": 11, "y": 16, "chance": 80 }, + { "item": "ranch_homebooks", "x": 8, "y": 10, "chance": 80 }, + { "item": "ranch_homebooks", "x": 10, "y": 15, "chance": 80 }, + { "item": "ranch_homebooks", "x": 11, "y": 16, "chance": 80 }, { "item": "clothing_outdoor_set", "x": 9, "y": 16, "chance": 90 }, { "item": "fridge", "x": 15, "y": 17, "chance": 90 }, { "item": "fridge", "x": 15, "y": 17, "chance": 90 }, diff --git a/data/json/mapgen/farm_horse.json b/data/json/mapgen/farm_horse.json index 36445eb5d969f..8e0f767864d3d 100644 --- a/data/json/mapgen/farm_horse.json +++ b/data/json/mapgen/farm_horse.json @@ -116,7 +116,7 @@ "k": { "item": "office", "chance": 30 }, "f": { "item": "fridge", "chance": 30 }, "o": { "item": "oven", "chance": 30 }, - "8": { "item": "homebooks", "chance": 30 }, + "8": { "item": "ranch_homebooks", "chance": 30 }, "r": { "item": "restaur_kitchen", "chance": 30 }, "c": { "item": "kitchen_counters", "chance": 30 }, "D": { "item": "trash", "chance": 20, "repeat": [ 2, 4 ] }, @@ -375,7 +375,7 @@ "D": { "item": "trash_cart", "chance": 50 }, "B": { "item": "shower", "chance": 40, "repeat": [ 2, 4 ] }, "d": { "item": "dresser", "chance": 70, "repeat": [ 2, 4 ] }, - "8": { "item": "homebooks", "chance": 70, "repeat": [ 2, 4 ] }, + "8": { "item": "ranch_homebooks", "chance": 70, "repeat": [ 2, 4 ] }, "k": { "item": "bedroom", "chance": 60, "repeat": [ 2, 4 ] }, "S": { "item": "softdrugs", "chance": 60, "repeat": [ 2, 4 ] } } diff --git a/data/json/mapgen/irradiator_1.json b/data/json/mapgen/irradiator_1.json index f006889b5781c..11c75244dbe7d 100644 --- a/data/json/mapgen/irradiator_1.json +++ b/data/json/mapgen/irradiator_1.json @@ -327,7 +327,7 @@ ], "liquids": { "T": { "liquid": "water_clean", "amount": [ 200, 600 ] } }, "fields": { "U": { "field": "fd_nuke_gas", "intensity": 3, "age": 990, "chance": 100 }, "/": { "field": "fd_shock_vent" } }, - "monster": { "(": { "monster": "mon_turret" }, "!": { "monster": "mon_hazmatbot", "chance": 5 } }, + "monster": { "(": { "monster": "mon_turret_rifle" }, "!": { "monster": "mon_hazmatbot", "chance": 5 } }, "monsters": { "h": { "monster": "GROUP_ZOMBIE", "chance": 50 }, "o": { "monster": "GROUP_ZOMBIE", "chance": 50 }, diff --git a/data/json/mapgen/isherwood_farms/dairy_farm_isherwood.json b/data/json/mapgen/isherwood_farms/dairy_farm_isherwood.json index 08f98010e2327..ce2725c706942 100644 --- a/data/json/mapgen/isherwood_farms/dairy_farm_isherwood.json +++ b/data/json/mapgen/isherwood_farms/dairy_farm_isherwood.json @@ -87,7 +87,7 @@ "items": { "Y": { "item": "coat_rack", "chance": 35, "repeat": [ 1, 4 ] }, "d": { "item": "office", "chance": 30 }, - "{": [ { "item": "homebooks", "chance": 30 }, { "item": "book_survival", "chance": 30 } ], + "{": [ { "item": "ranch_homebooks", "chance": 30 }, { "item": "book_survival", "chance": 30 } ], "^": { "item": "bed", "chance": 30 }, "o": { "item": "oven", "chance": 30, "repeat": [ 1, 2 ] }, "T": { "item": "everyday_gear", "chance": 30, "repeat": [ 1, 2 ] }, diff --git a/data/json/mapgen/isherwood_farms/farm_horse_isherwood.json b/data/json/mapgen/isherwood_farms/farm_horse_isherwood.json index 16ac29f20618c..52e46e0d7f033 100644 --- a/data/json/mapgen/isherwood_farms/farm_horse_isherwood.json +++ b/data/json/mapgen/isherwood_farms/farm_horse_isherwood.json @@ -149,7 +149,7 @@ "k": { "item": "office", "chance": 30 }, "f": { "item": "fridge", "chance": 30 }, "o": { "item": "oven", "chance": 30 }, - "8": { "item": "homebooks", "chance": 30 }, + "8": { "item": "ranch_homebooks", "chance": 30 }, "r": { "item": "restaur_kitchen", "chance": 30 }, "c": { "item": "kitchen_counters", "chance": 30 }, "D": { "item": "trash", "chance": 20, "repeat": [ 2, 4 ] }, diff --git a/data/json/mapgen/lab/lab_floorplan_cross.json b/data/json/mapgen/lab/lab_floorplan_cross.json index 42354228302f9..eb8c6b00d463c 100644 --- a/data/json/mapgen/lab/lab_floorplan_cross.json +++ b/data/json/mapgen/lab/lab_floorplan_cross.json @@ -659,7 +659,7 @@ " " ], "palettes": [ "lab_palette", "lab_loot_bionic_vault" ], - "place_monster": [ { "monster": "mon_turret", "x": [ 11, 12 ], "y": [ 2, 5 ], "chance": 25 } ] + "place_monster": [ { "monster": "mon_turret_rifle", "x": [ 11, 12 ], "y": [ 2, 5 ], "chance": 25 } ] } }, { @@ -695,7 +695,7 @@ " " ], "palettes": [ "lab_palette", "lab_loot_serum_vault" ], - "place_monster": [ { "monster": "mon_turret", "x": [ 11, 12 ], "y": [ 2, 5 ], "chance": 10 } ] + "place_monster": [ { "monster": "mon_turret_rifle", "x": [ 11, 12 ], "y": [ 2, 5 ], "chance": 10 } ] } }, { @@ -731,7 +731,7 @@ " " ], "palettes": [ "lab_palette", "lab_loot_bionic_vault" ], - "place_monster": [ { "monster": "mon_turret", "x": [ 2, 5 ], "y": [ 11, 12 ], "chance": 25 } ] + "place_monster": [ { "monster": "mon_turret_rifle", "x": [ 2, 5 ], "y": [ 11, 12 ], "chance": 25 } ] } }, { @@ -767,7 +767,7 @@ " " ], "palettes": [ "lab_palette", "lab_loot_serum_vault" ], - "place_monster": [ { "monster": "mon_turret", "x": [ 2, 5 ], "y": [ 11, 12 ], "chance": 10 } ] + "place_monster": [ { "monster": "mon_turret_rifle", "x": [ 2, 5 ], "y": [ 11, 12 ], "chance": 10 } ] } }, { @@ -803,7 +803,7 @@ "####################### " ], "palettes": [ "lab_palette", "lab_loot_bionic_vault" ], - "place_monster": [ { "monster": "mon_turret", "x": [ 11, 12 ], "y": [ 18, 21 ], "chance": 25 } ] + "place_monster": [ { "monster": "mon_turret_rifle", "x": [ 11, 12 ], "y": [ 18, 21 ], "chance": 25 } ] } }, { @@ -839,7 +839,7 @@ "####################### " ], "palettes": [ "lab_palette", "lab_loot_serum_vault" ], - "place_monster": [ { "monster": "mon_turret", "x": [ 11, 12 ], "y": [ 18, 21 ], "chance": 10 } ] + "place_monster": [ { "monster": "mon_turret_rifle", "x": [ 11, 12 ], "y": [ 18, 21 ], "chance": 10 } ] } }, { @@ -875,7 +875,7 @@ " " ], "palettes": [ "lab_palette", "lab_loot_bionic_vault" ], - "place_monster": [ { "monster": "mon_turret", "x": [ 18, 21 ], "y": [ 11, 12 ], "chance": 25 } ] + "place_monster": [ { "monster": "mon_turret_rifle", "x": [ 18, 21 ], "y": [ 11, 12 ], "chance": 25 } ] } }, { @@ -911,7 +911,7 @@ " " ], "palettes": [ "lab_palette", "lab_loot_serum_vault" ], - "place_monster": [ { "monster": "mon_turret", "x": [ 18, 21 ], "y": [ 11, 12 ], "chance": 10 } ] + "place_monster": [ { "monster": "mon_turret_rifle", "x": [ 18, 21 ], "y": [ 11, 12 ], "chance": 10 } ] } } ] diff --git a/data/json/mapgen/lab/lab_floorplans.json b/data/json/mapgen/lab/lab_floorplans.json index 4477f3c5202b1..df170ba3e4030 100644 --- a/data/json/mapgen/lab/lab_floorplans.json +++ b/data/json/mapgen/lab/lab_floorplans.json @@ -488,7 +488,7 @@ "r": { "items": [ { "item": "mine_equipment", "chance": 30 } ] }, "c": { "items": [ { "item": "chem_lab", "chance": 30 } ] } }, - "place_monster": [ { "monster": "mon_turret", "x": 11, "y": 9, "chance": 20 } ], + "place_monster": [ { "monster": "mon_turret_rifle", "x": 11, "y": 9, "chance": 20 } ], "place_nested": [ { "chunks": [ "lab_spawn_9x9_crossdoors" ], "x": 6, "y": 11 }, { "chunks": [ "lab_spawn_7x7_wall_nw" ], "x": 12, "y": 2 }, diff --git a/data/json/mapgen/lab/lab_floorplans_1side.json b/data/json/mapgen/lab/lab_floorplans_1side.json index 91dcc09561af6..361515eb3e588 100644 --- a/data/json/mapgen/lab/lab_floorplans_1side.json +++ b/data/json/mapgen/lab/lab_floorplans_1side.json @@ -210,7 +210,7 @@ "type": "mapgen", "method": "json", "nested_mapgen_id": "lab_barracks_turret", - "object": { "mapgensize": [ 24, 24 ], "place_monster": [ { "monster": "mon_turret", "x": [ 10, 13 ], "y": [ 15, 22 ] } ] } + "object": { "mapgensize": [ 24, 24 ], "place_monster": [ { "monster": "mon_turret_rifle", "x": [ 10, 13 ], "y": [ 15, 22 ] } ] } }, { "//": "prisoner containment", diff --git a/data/json/mapgen/lab/lab_floorplans_finale1level.json b/data/json/mapgen/lab/lab_floorplans_finale1level.json index 96c2653f16b6d..b6baa4f37dc2a 100644 --- a/data/json/mapgen/lab/lab_floorplans_finale1level.json +++ b/data/json/mapgen/lab/lab_floorplans_finale1level.json @@ -363,7 +363,7 @@ "-----------MM----------|" ], "palettes": [ "lab_palette" ], - "monster": { "7": { "monster": "mon_turret" } }, + "monster": { "7": { "monster": "mon_turret_rifle" } }, "place_monster": [ { "monster": "mon_secubot", "x": [ 1, 22 ], "y": [ 1, 22 ], "chance": 75, "repeat": 2 }, { "monster": "mon_mech_combat", "x": 2, "y": 2, "chance": 33 } diff --git a/data/json/mapgen/lab/lab_rooms.json b/data/json/mapgen/lab/lab_rooms.json index 6107d86a73b2c..796bcad8509fb 100644 --- a/data/json/mapgen/lab/lab_rooms.json +++ b/data/json/mapgen/lab/lab_rooms.json @@ -131,7 +131,7 @@ ], "palettes": [ "lab_palette", "lab_palette_map_computer" ], "terrain": { "c": [ "t_thconc_floor" ] }, - "place_monster": [ { "monster": "mon_turret", "x": [ 2, 3 ], "y": [ 3, 3 ] } ] + "place_monster": [ { "monster": "mon_turret_rifle", "x": [ 2, 3 ], "y": [ 3, 3 ] } ] } }, { @@ -154,7 +154,7 @@ ], "palettes": [ "lab_palette", "lab_palette_map_computer" ], "terrain": { "c": [ "t_thconc_floor" ] }, - "place_monster": [ { "monster": "mon_turret", "x": [ 4, 4 ], "y": [ 1, 4 ] } ] + "place_monster": [ { "monster": "mon_turret_rifle", "x": [ 4, 4 ], "y": [ 1, 4 ] } ] } }, { diff --git a/data/json/mapgen/lab/lab_rooms_wall.json b/data/json/mapgen/lab/lab_rooms_wall.json index c12ca20f92748..247602b4d2259 100644 --- a/data/json/mapgen/lab/lab_rooms_wall.json +++ b/data/json/mapgen/lab/lab_rooms_wall.json @@ -190,7 +190,7 @@ ], "palettes": [ "lab_palette", "lab_loot_bionic_vault" ], "terrain": { "M": "t_wall_metal" }, - "place_monster": [ { "monster": "mon_turret", "x": 5, "y": 3, "chance": 25 } ] + "place_monster": [ { "monster": "mon_turret_rifle", "x": 5, "y": 3, "chance": 25 } ] } }, { @@ -212,7 +212,7 @@ ], "palettes": [ "lab_palette", "lab_loot_serum_vault" ], "terrain": { "M": "t_wall_metal" }, - "place_monster": [ { "monster": "mon_turret", "x": 5, "y": 3, "chance": 10 } ] + "place_monster": [ { "monster": "mon_turret_rifle", "x": 5, "y": 3, "chance": 10 } ] } }, { @@ -443,7 +443,7 @@ "|x,,,x,,,x" ], "palettes": [ "lab_palette" ], - "monster": { "7": { "monster": "mon_turret" } }, + "monster": { "7": { "monster": "mon_turret_rifle" } }, "terrain": { "g": "t_wall_glass", "G": "t_door_glass_lab_c", "7": "t_thconc_floor" } } }, diff --git a/data/json/mapgen/mi-go/mi-go_nested.json b/data/json/mapgen/mi-go/mi-go_nested.json index 2107dce47805c..cc92dfa710bee 100644 --- a/data/json/mapgen/mi-go/mi-go_nested.json +++ b/data/json/mapgen/mi-go/mi-go_nested.json @@ -464,7 +464,6 @@ "2": { "class": "mi-go_prisoner", "chance": 20 }, "3": { "class": "mi-go_prisoner", "chance": 20 }, "4": { "class": "mi-go_prisoner", "chance": 20 }, - "5": { "class": "mi-go_prisoner", "chance": 20 }, "6": { "class": "mi-go_prisoner", "chance": 20 }, "7": { "class": "mi-go_prisoner", "chance": 20 } } diff --git a/data/json/mapgen/microlab/microlab_connector.json b/data/json/mapgen/microlab/microlab_connector.json new file mode 100644 index 0000000000000..816b7828222ce --- /dev/null +++ b/data/json/mapgen/microlab/microlab_connector.json @@ -0,0 +1,274 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "microlab_sub_connector" ], + "weight": 1000, + "object": { + "fill_ter": "t_concrete", + "rows": [ + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################" + ], + "palettes": [ "microlab" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "microlab_rock_border" ], + "weight": 1000, + "object": { + "fill_ter": "t_concrete", + "rows": [ + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################" + ], + "palettes": [ "microlab" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "microlab_sub_station" ], + "weight": 1000, + "object": { + "fill_ter": "t_concrete", + "rows": [ + "##| |##", + "##|^ |##", + "##|^ hhhh YY hhhh |##", + "##|^ |##", + "##|^ hhhh hhhh |##", + "##|^ |##", + "##|^ |^^^^^^|##", + "##||(((((| ||||||||##", + "###|l h ( YY |#########", + "###|l ( YY |#########", + "###|l ( |#########", + "###||2|||| |#########", + "###| | |#########", + "###| hd|G55||#########", + "###| ddd| ^|#########", + "###||5(((| ^|||||||###", + "###|B VV ^^|###", + "###|B YY ?|###", + "###|B dddd YY t ?|###", + "###|B d hd ?|###", + "###|B t? ^^|###", + "###|||||||| ||||||||###", + "##########|22|##########", + "##########| |##########" + ], + "palettes": [ "microlab" ], + "terrain": { "G": "t_card_science" }, + "items": { + "l": [ { "item": "guns_milspec", "chance": 10 }, { "item": "ammo_milspec", "chance": 70 } ], + "t": { "item": "magazines", "chance": 90 } + } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "microlab_generic_sub_entry" ], + "weight": 1000, + "object": { + "fill_ter": "t_concrete", + "rows": [ + "||||||||||| |||||||||||", + " cc c | |^BBB| ", + " cc c c| | h|r i ", + " c| | dd|r c ", + " FFFFccccc| | h|r c ", + "|||||||||||YY|[===|| ", + " FF c|^???^ v| c ", + " c|? V| c ", + " c|? tt | i ", + " c| | ", + "|5|||| dddd |==2|", + " Y2 d hd 2Y ", + " Y2 ^^^^ 2Y ", + "|2|||| |||| ^|((2|", + " r| ^| ", + "cc r|n^^^ ^|^ ", + "cc hc||||||YY|[====| h ", + " c|FFFF| | h ^B|6tt ", + "|||||||22||22|dd B|||||", + " | |h nB|FFF ", + " c6 6c | ||||||| ", + " cc cc | |6h ", + " cc cc 2 |c ccccc ", + " | | " + ], + "palettes": [ "microlab" ], + "terrain": { "G": "t_card_science" }, + "items": { + "l": [ { "item": "guns_milspec", "chance": 10 }, { "item": "ammo_milspec", "chance": 70 } ], + "t": { "item": "magazines", "chance": 90 } + } + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic_surface_connector" ] ], + "method": "json", + "object": { + "fill_ter": "t_concrete", + "rows": [ + " | | |cccc| ", + " |=[==| |||||| ", + " ((2| | 2 2 i ", + " ( | cci| 2 2 c ", + " (@@| | |||||| c ", + "|||||| cci| |rrrr| ", + " F|F ( | | 2 c ", + " F|F ( cci| |||||| c ", + " F|F 2 | |rrrr| i ", + " |F |rrrr| | 2 ", + "|5|||||||||22|||||||||||", + " 2 YY 5TYY ", + " 2 YY 5 YY ", + "|2||||^??? yyyyy|(((|", + " r|t y 5 dd|", + "cc r|V tt yyyyy| hl|", + "cc hc|t y |||||", + " c|^??? yyyyy|###|", + "||||||||||| ^|((22|||#|", + " rrcc| hd^= ^|eeeeee|#|", + " c| dd = ^|eeeeee|#|", + " c6 6|B = ^|EeeeeE|#|", + " cc r|B [ ^|eeeeee|#|", + " | |22|||||||||||" + ], + "palettes": [ "microlab" ], + "terrain": { "e": "t_elevator", "E": "t_elevator_control" }, + "items": { + "l": [ { "item": "guns_milspec", "chance": 10 }, { "item": "ammo_milspec", "chance": 70 } ], + "t": { "item": "magazines", "chance": 90 } + } + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic_surface" ] ], + "method": "json", + "object": { + "fill_ter": "t_concrete", + "rows": [ + " yyyyyyyyyyyyyyyyyyyyyy ", + " yyyyyyyyyyyyyyyyyyyyyy ", + " y____________________y ", + " y____________________y ", + " y____________________y ", + " ||||||||||22|yyyyyyyyy ", + " | SS|________y ", + " | SS|________y ", + " | SS|________y ", + " | SS|________y ", + " | |((((|22||555555|y ", + " | |........|yyyyyy|. ", + " | |..dddd..|......|. ", + " | |^.d.hd..5yyyyyy| ", + " | |||||||..5......| ", + " | (V.??....Gyyyyyy| ", + " | (t.......|......| ", + " | (^???....|yyyyyy| ", + " | ||||||..^|yyyyyy| ", + " | |.hd^=..^|eeeeee| ", + " | |.dd.=..^|eeeeee| ", + " | |B...=..^|EeeeeE| ", + " | |B...[..^|eeeeee| ", + " ||||||||||||||||||||| " + ], + "palettes": [ "microlab" ], + "terrain": { + "e": "t_elevator", + "E": "t_elevator_control", + " ": "t_grass", + "_": "t_pavement", + ".": "t_thconc_floor", + "G": "t_card_science" + } + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic_surface_roof" ] ], + "method": "json", + "object": { + "fill_ter": "t_concrete", + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ................. ", + " ................. ", + " ................. ", + " ................. ", + " ................. ", + " ................. ", + " ................. ", + " ................. ", + " ................. ", + " ................. ", + " ................. ", + " ................. ", + " ................. ", + " ................. " + ], + "terrain": { " ": "t_open_air", ".": "t_concrete" } + } + } +] diff --git a/data/json/mapgen/microlab/microlab_generic.json b/data/json/mapgen/microlab/microlab_generic.json new file mode 100644 index 0000000000000..cd651cb2b5868 --- /dev/null +++ b/data/json/mapgen/microlab/microlab_generic.json @@ -0,0 +1,497 @@ +[ + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + " cc | 2 |rrrr| ", + " cc ==[==| |||||| ", + " = | |i l|r i ", + " [ |22|i l|r c ", + " FFFF= | |i l|r c ", + "||||||||||| ||2|||| ", + " F|F |####| | c ", + " F|F |||||| | c ", + " F|F |???? | i ", + " | | Y", + "|5|||| dddddd |2|||", + " 2 Y dh^ d | ", + " 2 Y d ^hd | ", + "|2|||| dddddd |(((|", + " r| 2 ", + "cc r|???? |^ ", + "cc hc|||||| | h ", + " c|FFFF| | |6tt ", + "|||||||22|| ||((22|||||", + " | | |FF| ", + " c6 6c | |c | | ", + " cc cc | |6h ", + " cc cc | |c ccccc ", + " |22| " + ], + "palettes": [ "microlab" ], + "items": { "l": { "item": "cleaning", "chance": 50, "repeat": [ 1, 3 ] } } + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + " cc | | |FFFF|6 ", + " cc F| ||||||6 h ", + " F| 2 |^ ", + "c= dd ||||||||r |6h ", + "c= dh |;|;| ;|r |6 ", + "|||22||||2|2|2||r |||||2", + " F| |##| |F =FFFF ", + " F| |||||| |F = ", + " F| |ll|i |F 2 cc ", + " 2 |i |i |F = cc ", + "||| ||2||||||2||||22|||", + " 2 Y ", + " 2 Y ", + "||2||||2||||||2| |||", + " r|i |iiiY | |c ", + "cc r|ll| | =[==c ", + "cc hc|||| | = =c ", + " c|@@|2|2|2|| = [ ", + "||2||| |;|;| ;| =[==||", + " =[=|||||||| | c c ", + " c Y 6| | c c ", + " iccc 6| | i i ", + " c 6| |||2|| ", + " c c|c |22| | c c " + ], + "palettes": [ "microlab" ] + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + " cc | c| |c c| c ", + " cc | c| |||||| c ", + " | h 6| c| ", + " dd |==||||||| ?|6h ", + " hd |tt|^ = ?|6 ", + "|||=[|||| hth =Y ?||||||", + " c| |##| hth =Y V|h = ", + " c| |##| hth = c|dd = ", + " c|=[|##| hth = a| ] ", + " | |##|^ [ | = ", + "||| |||||||||| |=[=||", + " 2 ", + " 2 ", + "||2||||||======[[=| ||2", + " r|##|^ ^| |r ", + "cc r|##| htth hh| |r ", + "cc h6|||| htth tt| |r ", + " c| 2 tt| |r ", + "||||||;i|foee hh| |||", + " |||||||||||||| |c ", + " c 6| |c ", + " iccc 6| 2 ", + " c 6| ||||||||| ", + " c c|c |22|6hh6|cc " + ], + "palettes": [ "microlab" ] + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + " cc c|c | |r F| ", + " cc | |r F| c ", + " FF| 2 F| c ", + " dd |||22|||||| ", + " hd rrr| 2 2 ", + "|||22|||| |||||||||||", + " c| |l 2 2 2 d^= ", + " c| |||| | | d = ", + " c| 2 | cc | ] ", + " 2 2 | cc | = ", + "|||||||||||22|||||||||||", + " |FFccFF| c | ", + " |F F| T | ", + "||2|| || c | |||", + " | c | 2 ", + "cc cc cc| 6 | 2 ", + "cc cc cc| | | ", + " h | | | ", + "||||||6tcc|^ ^| |2|", + " ||||||22|||||| | ", + " c 2 | c", + " iccc 2 | c", + " c || ||||||||| ", + " c c|c | |6hh6|cFc " + ], + "palettes": [ "microlab" ] + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + " cc c|c | |c F|c ", + " cc | |c F|c c ", + " | | 2 c ", + " dd |||22|||||| ", + " hd FFF|hd c| ", + "|||5||||| d iccc|2===|", + " c| c| dh= ", + " c|cci cic iccc| d = ", + " c| c| ] ", + " |cci |FFF|66cccc| = ", + "2|||||||||||||||||||||||", + " ", + " ", + "||22((((((|||||22|||||||", + " |^hd rrr| ", + "cc cc cc| d r| ", + "cc cc cc| rrr| ", + " YY |W W| ", + "|| |6tcc||555||555||2|", + " |||||| | | ", + " c ccccc| X X|X X X| c", + " i c|XXXX|X X X| c", + " c c|||||||||||| ", + " c|c |^^|6hh6|cFc " + ], + "palettes": [ "microlab" ], + "furniture": { "X": "f_crate_c" }, + "terrain": { "W": "t_gates_mech_control_lab" }, + "items": { "X": { "item": "tools_science", "repeat": [ 2, 6 ] } } + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + " cc c|r r| | c|c ", + " |||||||||| | ccc|c c ", + " |Y ||||||c c ", + " | 2 2 ", + " | ||||||| ||||||| ", + "|| |l+ +l|2||||", + " | ||| ||||||| ||| ccc ", + " 2 |;+ i|i +;| ", + " | ||| i|i ||| ", + " | |;+ i|i +;|FFrr ", + "|| ||||||||||||||||||||", + " ", + " ", + "||||||||||||||||||||||||", + " |ll| ( c| ", + " 2 dh 2 tt c| ", + " 2 d cccc ( c| ", + " | ||||||||| ", + "|| cccc ccc |rrr|F F|2|", + "F| h h 2 |F F| ", + " |FFccc ccrr|rrr|F F| c", + " ||||||||||||||||||2|| c", + " cFFc|cccc|^^|cccc| ", + " 2 | 2 | " + ], + "palettes": [ "microlab" ] + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + " cc c|c c| | cc | ", + " |||||||||| | cc | c c ", + " |Y 2 | c c ", + " | |ccrr| c c ", + " | ||||||||||||||| ", + "|| |OO |2||||", + " | |O RRRRRRRR | ccc ", + " 2 ||| | ", + " | |th RRRRRRRR | ", + " | |tt |FFrr ", + "|| |((| RRRRRRRR ||||||", + " 2 2 Y 6|^ ", + " 2 2 Y 6|^ ", + "|| |((| RRRRRR66 R||2", + " | |O O|c ", + " 2 |O RRRRRRRR |||c ", + " 2 |O h6|c ", + " | |O RR6RRRRR 6|c ", + "|| ||||||||||||||||||||", + "F| |rcc|FF|ccr", + "c|Y | ", + "||2((|||||| | cci icc ", + " c|cccc| | ccc ccc ", + " c| | | " + ], + "palettes": [ "microlab" ] + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + " cc c| | | cc | ", + " ||||||22|| | cc | c c ", + " 2 | 2 c c ", + " ( |ccrr| c c ", + " | ||||||||||||||| ", + "|| 2 2 6||||||", + " | 2 2 tt6RRRt O| ccc ", + " 2 |(( O| ", + " | |th 6RRRttt R| ", + " | |tt 6|FFrr ", + "|| ||||(((((((((|||||||", + " 2 2 ", + " 2 2 ", + "||22|||||||||||||||||||2", + " | |???^ dd^dd6ddd6d|c ", + "c| | 6h d hd hd|c ", + "c| 2 dd 2 ", + " | 2 2 ", + "||22||||||||||||||22||||", + "F| |ccc| |ccr", + "c|Y | ", + "||2((|||||| | ccc ", + " |cccc| | ccc ccc ", + " | | | " + ], + "palettes": [ "microlab" ] + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + " cc c|cccc| | cc | ", + " |||||||||| | cc c c c ", + " F|UUUUUU| | cc c c c ", + " F| | | cc c c c ", + " F| cc | 2 ", + "|||| cc | | |2||||", + " cc | |c c| ccc ", + " cc | |t ht| ", + " | |ch c| ", + " |FFFFF|22|c66c|FFrr ", + "||22||||||| |||||||||||", + " 2 Y 2 ", + " 2 Y 2 ", + "||22||||||| a ?|||", + " ( |F U| tt ?|c ", + " ( |F U| a tt ?|c ", + " 2 |F U| ?|c ", + " | |F U| ^???tV??|c ", + "|| |||2((| |||||||||||", + " | |22|UUU|FF|ccr", + " | | | ", + " |2((|2(((| | cci icc ", + " c| ccc| | ccc ccc ", + " c| | | " + ], + "palettes": [ "microlab" ] + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + " | | | cc | ", + " | cc | | cc | c c ", + " cc | cc 2 2 | c c ", + " cc | cc | | h h| c c ", + " | | |6666| ", + "||22||||||| ||||||2||||", + "c| |htth | ccc ", + " | |htth | ", + " | | ", + "c| |FFrr ", + "|| dddd ||||||", + "2 Y d hd 2 ", + "2 Y d d 2 ", + "|| dddd ||||2|", + "F| |ccr ", + "F| B|c ", + "F| |htth htth B|c ", + "F| |htth htth B|cc ", + "||22||||||||||||||||||2|", + "F| |ccc YY( UUU|ccc ", + "c|Y |c 2 |c ", + " |c |22| |F cc ", + " |ccc | |2(((|F cc ", + " cc| | | | " + ], + "palettes": [ "microlab" ] + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + " | | | cc | ", + " cc | cc | | cc | c c ", + " c6 2 cc 2 2 | c c ", + " cc | | | h h| c c ", + " |FFFF| |6666| ", + "|||||||||||22|||||||2|||", + " t c|Y Y| |c ", + " t c| | Y|c ", + " || | Y|c ", + " i| | |c ", + "2|||| ddd ^|22||2||2", + " 2 d | 2 ", + " 2 6h | 2 ", + "2|||| ddd ^|22||||||", + " th6| |ccr ", + " t c| |c ", + " c| |c ", + " th6|Y Y|cc ", + "|||||||||||22|||||||||2|", + " |ccc | ( |ccc ", + " ccc |c | 2 Y |c ", + " c6c |ccc | ( |F cc ", + " ccc |c 2 |2(((|F cc ", + " |c | | | " + ], + "palettes": [ "microlab" ] + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + " | | | cc | ", + " cc | cc | |||||| c c ", + " c6 2 cc 2 2 | c c ", + " cc | YY | | h h| c c ", + " |FFFF| |6666| ", + "|||||||||||22||||||2||||", + " t c| c| |B 6d |c ", + " t c| cc 6| |B hd Y|c ", + " || cc 6| |B d Y|c ", + " i| cc r| |B 2 ", + "2|||| cc r| |||||||||||", + " 2 2 | 2 Y 5 T ", + " ( ( Y | 2 Y 5 ", + "2||||c c c| |((((G |||", + " th6|c c 6| |dddd| |cc", + " t c|c c c| |Mh | | ", + " c|c c| | |2|| 2 ", + " th6|FFFFF| | | l|^^| ", + "||||||||||| |2|||||||2|", + " |ccc | |#####| ", + " ccc |c | |#####| ", + " c6c |ccc |YY|||||||||c ", + " ccc |c 2 |FFcc|F cc ", + " |c | | | " + ], + "palettes": [ "microlab" ], + "monster": { "T": { "monster": "mon_turret_rifle" }, "M": { "monster": "mon_zombie_bio_op" } } + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + " | | | | ", + " 2 c| |cccc| cc ", + " c((2| cc| |||||| cc ", + " c( 2 6| |l l| ", + "cc( ( cc| |l l|FFc6 ", + "|||(2|||||| |||2||||||2", + " F| tttt( ^| ", + " c|r t( ^|c ", + " c|r t( |((((2((|c ", + " F| tttt( | Y 2 ", + "2|||2|||||| | RRR |||||", + " YY| | ", + " YY| RRR | ", + "||||||||||| |ORRRO| ||", + " |R66RRRR ( ||||||| |c", + " |R 2 |#| | ", + " || RRRR ( |#| | ", + "c|l ( |#| |||||c", + "||| RRRR ( |#| |FFF||", + " 2 2 |#| 2 ", + " |R66ROOOO( |#| | ccc ", + " |||||||||| |||22| ", + " cccc|cccc| | | ccc ", + " c|c 2 5 2 " + ], + "palettes": [ "microlab" ] + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + " |c c| | | ", + " cccc|c c| | | c c ", + " c|||||22|| ||22|| c c ", + " 6| |t | ", + "cc| |t | ccc ", + "||| |||||||||t ||||||", + "rr| | R c RRR|FF", + " 2 | R c 6| ", + " 2 | 6| ", + "FF| |yyy RRR66RRRRR|FF", + "||| | y R||||||", + " |6 y RRRRR R| ", + " | y O| ", + "|2||||yyy RRRRR O| |||", + " |l o| |c ", + " c|l |R ttttt R| |c ", + " c|l |R R| | ", + " c|l RRR66RRR| | ", + "|||||||22||||||||||22|2|", + " 66 |l l| 2 | ", + " 66 |l l| 2 | ", + " 66 ||22|| ||||||||| ", + " 66 | | |c66c|ccc ", + " | | | | " + ], + "palettes": [ "microlab" ] + } + } +] diff --git a/data/json/mapgen/microlab/microlab_generic_edge.json b/data/json/mapgen/microlab/microlab_generic_edge.json new file mode 100644 index 0000000000000..13cdfd99ece20 --- /dev/null +++ b/data/json/mapgen/microlab/microlab_generic_edge.json @@ -0,0 +1,512 @@ +[ + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "concrete_wall_ew", + "object": { + "mapgensize": [ 24, 24 ], + "set": [ { "line": "terrain", "id": "t_concrete_wall", "x": 0, "y": 0, "x2": 23, "y2": 0 } ] + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "concrete_wall_ns", + "object": { + "mapgensize": [ 24, 24 ], + "set": [ { "line": "terrain", "id": "t_concrete_wall", "x": 0, "y": 0, "x2": 0, "y2": 23 } ] + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic_edge" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + " | | | ", + " cc c 2 2 2 ", + " cc c c| | cc |r i ", + " c| | |r c ", + " FFFFccccc| |cccc|r c ", + "||||||||||| ||||||| ", + " FF c|h ^| ??? t| c ", + " c|dd | V| c ", + " c|h = V| i ", + " c| = ??? t| ", + "|5||||===[= |==2|", + " YY 2 ", + " YY 2 ", + "|2|||| |((2|", + " r| | ", + " c r| |^ ", + " c hc|||||| ||((22| h ", + " c|FFFF| | |6tt ", + "|||||||22||22||((22|||||", + " | | |FFF ", + " c6 6c | |c | ", + " cc cc | |6h ", + " cc cc 2 |c ccccc ", + " | | " + ], + "place_nested": [ + { "chunks": [ "concrete_wall_ew" ], "x": 0, "y": 0, "neighbors": { "north": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ns" ], "x": 23, "y": 0, "neighbors": { "east": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ew" ], "x": 0, "y": 23, "neighbors": { "south": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ns" ], "x": 0, "y": 0, "neighbors": { "west": "microlab_rock_border" } } + ], + "palettes": [ "microlab" ] + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic_edge" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + " | | | ", + " cc c 2 2 2 ", + " cc c c| | 66 |r i ", + " c| 2 2 c ", + " F Fccccc| |6666|r c ", + "||22||||||| ||||||| ", + " |yyyy( | c ", + " 2yyyy( 6 | c ", + " 2yyyy( 6h | i ", + " |yyyy( 6 | ", + "|5||||((((( |==2|", + " 2 YY 2 ", + " 2 YY 2 ", + "|2|||| 6h |((2|", + " r| 6 | ", + "cc r|^^^^ |^ ", + "cc hc|||||| ||((22| h ", + " c2 2 | |6tt ", + "|||||| | ||((22|||||", + " | | |FFF ", + " c6 6c |22|c | ", + " cc cc | |6h ", + " cc cc | |c ccccc ", + " | 5 " + ], + "place_nested": [ + { "chunks": [ "concrete_wall_ew" ], "x": 0, "y": 0, "neighbors": { "north": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ns" ], "x": 23, "y": 0, "neighbors": { "east": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ew" ], "x": 0, "y": 23, "neighbors": { "south": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ns" ], "x": 0, "y": 0, "neighbors": { "west": "microlab_rock_border" } } + ], + "palettes": [ "microlab" ] + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic_edge_edge" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + "||||||||||| | | ", + "|#########| 2 2 ", + "|##|||||||| |||||||| ", + "|##| hth VV |6 ", + "|##| ^ |dh ", + "|||| hth ^ hth |d ", + " FF| ^ hth || ", + " | hth hth |d ", + " ||=====| |====||dh ", + " |^?? ^ ^ ?? ^|6 ", + "|5|| |||2|", + " YY ", + " YY ", + "|2||||||||| |22||||((2|", + " r|D | | D| ", + " c r|@@ | | @@| ", + " c hc|D | | D| ", + " c|@@ | | @@| ", + "||2|||D |22| D|((2|", + " 6|@@ | | @@| ", + " 6|D 2 | D|c ", + " c|@@ 2 | @@|c ", + " c| ll| |ll |c ", + " |||||| ||||||| " + ], + "place_nested": [ + { "chunks": [ "concrete_wall_ew" ], "x": 0, "y": 0, "neighbors": { "north": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ns" ], "x": 23, "y": 0, "neighbors": { "east": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ew" ], "x": 0, "y": 23, "neighbors": { "south": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ns" ], "x": 0, "y": 0, "neighbors": { "west": "microlab_rock_border" } } + ], + "palettes": [ "microlab" ] + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic_edge" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + "||||||||||| | | ", + "|tRt yyyy| 2 2 ", + "| y y| |||||||| ", + "|tRt y y| |UUUUU|6 ", + "| y y| | |dh ", + "|RRR yyyy| | ccc ||| ", + "| 66 | 2 |UU ", + "|RRR | 2 |d ", + "| | |F6ccF|dh ", + "|OOOO | |||||||6 ", + "||||||||22| ^^^|||2|", + " ", + " ", + "|2||||||||| |||||||((2|", + " 6|hdh 2 2 hdh|U ", + " t t| dh = = hd |U ", + " t t|^ = = ^|cc ", + " t|||||| |||||||c ", + "||2|||^ 2 2 ^|((2|", + " 6|^hd = = d B|c ", + " c 6|^ dh= = hdhB|c ", + " c c|||||| |||||||c ", + " c c| 2 2 FF|UU ", + " | | | | " + ], + "place_nested": [ + { "chunks": [ "concrete_wall_ew" ], "x": 0, "y": 0, "neighbors": { "north": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ns" ], "x": 23, "y": 0, "neighbors": { "east": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ew" ], "x": 0, "y": 23, "neighbors": { "south": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ns" ], "x": 0, "y": 0, "neighbors": { "west": "microlab_rock_border" } } + ], + "palettes": [ "microlab" ] + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic_edge" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + "||||||||||| | | ", + "|OOOOOOOOO| 2 2 ", + "|O O| |||||||| ", + "|O RRR 5 |66666|6 ", + "|OOOOOOOOO| 2 |dh ", + "||||||||||| |(((((||| |", + " ttRRRttO| ^|6 ", + " hO| V|6 ", + " h | ^|6 ", + " tRRt | V|6 ", + "||||||||22| ^|||2|", + " ", + " ", + "|2||||||||| |||||||((2|", + " 6|hdh 2 2 hdh|c ", + " t t| dh = = hd |c ", + " t t|^ = = ^|cc ", + " t|||||| |||||||c ", + "||2|||^ 2 2 ^|((2|", + " 6|^hd = = d B|c ", + " c 6|^ dh= = hdhB|c ", + " c c|||||| |||||||c ", + " c c| 2 2 F|c ", + " | | | | " + ], + "place_nested": [ + { "chunks": [ "concrete_wall_ew" ], "x": 0, "y": 0, "neighbors": { "north": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ns" ], "x": 23, "y": 0, "neighbors": { "east": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ew" ], "x": 0, "y": 23, "neighbors": { "south": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ns" ], "x": 0, "y": 0, "neighbors": { "west": "microlab_rock_border" } } + ], + "palettes": [ "microlab" ] + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic_edge" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + " | | | | ", + " U|||||||| |tt 2 ", + " U|D@D@D@| |||||||||||", + " U| @ @ @| htth ^V |", + " U| | htth ^ |", + "|||| 2 |", + " FF| 2 htth ^ |", + " U| | htth ^ |", + " U| @ @ @| |", + " U|D@D@D@| htth ^ |", + "|5||||||||| htth ^ |", + " YY ", + " YY ", + "|2||||||||| |22(((|((2|", + " |D@D@D@| | ^| ", + " c | @ @ @| | hh|cc ", + " c | | | tt|cc ", + " | @ @ 2 | hh| ", + "||2| @ @ | | |((2|", + " | | |||2|||U ", + " U| @ @ @| | |U ", + " U|D@D@D@| |@ h|U ", + " U|||||||| |@D t|U ", + " | | ||||||| " + ], + "place_nested": [ + { "chunks": [ "concrete_wall_ew" ], "x": 0, "y": 0, "neighbors": { "north": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ns" ], "x": 23, "y": 0, "neighbors": { "east": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ew" ], "x": 0, "y": 23, "neighbors": { "south": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ns" ], "x": 0, "y": 0, "neighbors": { "west": "microlab_rock_border" } } + ], + "palettes": [ "microlab" ] + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic_edge" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + " | | | ", + " cccc U| |c hc|UUU ", + " cUUc U| |c c||||||", + " c c 2 |6h lll|", + " 2 |6h |", + "||||((((((( |||||||((2|", + " ( ( nn^^^^( |", + " 2 RR ( YY( |", + " 2 ( YY( |", + " ( 6666 ( ( |", + "|5||||||||| ||||((2|", + " ", + " ", + "||||| || |22(((|((2|", + " | | | ^| ", + " U | | | hh|cc ", + " U | | | tt|cc ", + " | | | hh| ", + "||2|||22||| | |((2|", + " Uc UU( |||2|||U ", + " c ( | |U ", + " ch h h( |@ h|U ", + " c UUUcc| |@D t|U ", + " |||||||| ||||||| " + ], + "place_nested": [ + { "chunks": [ "concrete_wall_ew" ], "x": 0, "y": 0, "neighbors": { "north": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ns" ], "x": 23, "y": 0, "neighbors": { "east": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ew" ], "x": 0, "y": 23, "neighbors": { "south": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ns" ], "x": 0, "y": 0, "neighbors": { "west": "microlab_rock_border" } } + ], + "palettes": [ "microlab" ] + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic_edge" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + " | | | ", + " U h U| |U U|U ", + " U ccc U| |U U|U |", + " ||||||||22|U |", + " 2 2 |6h UU |", + "||||((((((( |||||||((2|", + " ( cc ( nn^^^^( |", + " 2 2 YY( |", + " 2 2 YY( |", + " ( cc ( ( |", + "|5||((((((| ^^||||((2|", + " ", + " ", + "||||====[|| |22(((|((2|", + " |dddd B| | R| ", + " U | h B| | hR|hc ", + " U | B| |O 6|cc ", + " |^^ B| |O 6| ", + "||2|||22||| | hR|((2|", + " Uc UU( | R|U ", + " c 2 |yyyyy|U ", + " c ( | |U ", + " c |c cc c| | |U ", + " | | ||||||| " + ], + "place_nested": [ + { "chunks": [ "concrete_wall_ew" ], "x": 0, "y": 0, "neighbors": { "north": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ns" ], "x": 23, "y": 0, "neighbors": { "east": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ew" ], "x": 0, "y": 23, "neighbors": { "south": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ns" ], "x": 0, "y": 0, "neighbors": { "west": "microlab_rock_border" } } + ], + "palettes": [ "microlab" ] + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic_edge" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + " | cc | | | ", + " 6|||||||| |U U|c hc ", + " 6| iii 2 |U U|c hc ", + " 6| | |((((|h ", + " 66||+|+|+| | ", + "||||& |&|&| |UUUUUU ||", + " FF|||||||| |||||||22| ", + " c|^^^ | ", + " 6| | ", + " 6| | ", + "|5|| |||||||||||||| ||", + " YY ", + " YY ", + "|2|| ||||||||22(((|((2|", + " | | h 2 6| ", + " c | |ccc|U cc h6|cc ", + " c | |ccc|U cc 6|cc ", + " | | h 2 h6| ", + "||2| |||||||| 6|((2|", + " U | |22(((|U ", + " c | | cc6|U ", + " c |||||2|| | h |U ", + " 2 c|U U| |FFFFF|U ", + " | | ||||||| " + ], + "place_nested": [ + { "chunks": [ "concrete_wall_ew" ], "x": 0, "y": 0, "neighbors": { "north": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ns" ], "x": 23, "y": 0, "neighbors": { "east": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ew" ], "x": 0, "y": 23, "neighbors": { "south": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ns" ], "x": 0, "y": 0, "neighbors": { "west": "microlab_rock_border" } } + ], + "palettes": [ "microlab" ] + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic_edge" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + " | cc | | | ", + " 6|||||||| |U U|c hc ", + " 6| iii 2YY|U U|c hc ", + " 6| | |(22(|h ", + " 66||+|+|+| | YY ", + "||||& |&|&| |UUUUUU ||", + " FF||||||||22|||||||22| ", + " c|B^^ [ 2 F| | ", + " 6|B hd= |c F| | ", + " 6|B dd6= |ccc | | ", + "|5||=[===== |||(((| ||", + " 2YY YY 2YY ", + " 2YY YY 2YY ", + "|2|| ||||| |22(((|((2|", + " c| ( h 2 ( 6| ", + " c| (ccc( (ccYh6|cc ", + " c| (ccc( (ccY 6|cc ", + " c| ( h 2 ( h6| ", + "|2|| ||||| | 6|((2|", + " U| YY|22(((|U ", + " U| YY| cc6|U ", + " U|2|||2||22| h |U ", + " | c|U U| |FFFFF|U ", + " | | ||||||| " + ], + "place_nested": [ + { "chunks": [ "concrete_wall_ew" ], "x": 0, "y": 0, "neighbors": { "north": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ns" ], "x": 23, "y": 0, "neighbors": { "east": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ew" ], "x": 0, "y": 23, "neighbors": { "south": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ns" ], "x": 0, "y": 0, "neighbors": { "west": "microlab_rock_border" } } + ], + "palettes": [ "microlab" ] + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic_edge" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + " | cc | | | ", + " 6|||||||| |U U|c hc ", + " 6|U 2YY|U U|c hc ", + " 6|U ccci| |(22(|h ", + " 66|U | | YY ", + "||||U ccci| |UUUUUU ||", + " FF||2|||||22|||||||22| ", + " c| |U | 2 F| | ", + " 6| |U | |c F| | ", + " 6| |ch | |ccc | | ", + "|5|| |c | |||(((| ||", + " 2YY|ch | 2YY ", + " 2YY|cc | 2YY ", + "|2|| |||2| |22(((|((2|", + " c| ( h ( ( 6|h ", + " c| (cc ( (ccYh6|66 ", + " c| (cc ( (ccY 6|66 ", + " c| ( h ( ( h6|h ", + "|2|| |||2| | 6|((2|", + " U| YY|22(((|6 ", + " U| YY| 666|c ", + " U|2|||2||22| h |c ", + " | c|U U| |^BBB^|U ", + " | | ||||||| " + ], + "place_nested": [ + { "chunks": [ "concrete_wall_ew" ], "x": 0, "y": 0, "neighbors": { "north": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ns" ], "x": 23, "y": 0, "neighbors": { "east": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ew" ], "x": 0, "y": 23, "neighbors": { "south": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ns" ], "x": 0, "y": 0, "neighbors": { "west": "microlab_rock_border" } } + ], + "palettes": [ "microlab" ] + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic_edge" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + " | cc | | | ", + " 6|||||||| |U U|c hc ", + " 6|U 2YY|U U|c hc ", + " 6|U ccci| |(22(|h ", + " 66|U | | YY ", + "||||U ccci| |UUUUUU ||", + " FF||2|||||2||||||||||| ", + " c| 2 FUUU ", + " 6|^ hhh ^|c FU U ", + " 6|^ ttt ^|ccc ", + "|5|| hh h|||(((|||||", + " 2Y YY ", + " 2Y YY ", + "|2||=======[=|22(((|((2|", + " c|? t ? Y6| c ", + " c|? t ? Y^| cc ", + " c|? t ? ^| cc c ", + " c|^ ^| c ", + "|2||v ^| |((2|", + " U| Y^|22(((|6 ", + " U| ^^ Y^| 666|c ", + " U|2|||2||2|| h |c ", + " U |UU U| |^BBB^|U ", + " | | ||||||| " + ], + "place_nested": [ + { "chunks": [ "concrete_wall_ew" ], "x": 0, "y": 0, "neighbors": { "north": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ns" ], "x": 23, "y": 0, "neighbors": { "east": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ew" ], "x": 0, "y": 23, "neighbors": { "south": "microlab_rock_border" } }, + { "chunks": [ "concrete_wall_ns" ], "x": 0, "y": 0, "neighbors": { "west": "microlab_rock_border" } } + ], + "palettes": [ "microlab" ] + } + } +] diff --git a/data/json/mapgen/microlab/microlab_special_tiles.json b/data/json/mapgen/microlab/microlab_special_tiles.json new file mode 100644 index 0000000000000..3cb252a95d5eb --- /dev/null +++ b/data/json/mapgen/microlab/microlab_special_tiles.json @@ -0,0 +1,176 @@ +[ + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + " cc | c| |c c|r ", + " cc | c| |c c|r c ", + " | h 6| 2 2 c ", + " dd |==|||22||||||6h ", + " hd |tt|-- -----|6 ", + "|||22||||- -fYf-||||||", + " c| |##|-dd -f f-|hd^= ", + " c| ||||-h -f f-| d = ", + " c| c|-G55-f f-| ] ", + " 2 c|- --2--| = ", + "||| c|- -||||||", + " ?|-Y cc c-| ", + " ?|- cc c-| ", + "||2||||||-h c-| |||", + " r|-tt- c-| |r ", + "cc c r||((- Y-| |r ", + "cc c rr|-@;-5- h-| |r ", + " r|-@M5 -dd-| |r ", + "||||||rr|---------| |||", + " |||||||||||||| |c ", + " c 6| |c ", + " iccc 6| 2 ", + " c 6| ||22||||| ", + " c c|c |22| |cc " + ], + "palettes": [ "microlab" ], + "terrain": { "G": "t_card_science" }, + "items": { "f": { "item": "mutagens", "chance": 60, "repeat": [ 1, 4 ] } }, + "monster": { "M": { "monster": "mon_mutant_experimental" } }, + "place_monsters": [ { "monster": "GROUP_LAB", "chance": 2, "x": [ 2, 21 ], "y": [ 2, 21 ], "repeat": [ 1, 5 ] } ] + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + " | cc | | cc | ", + " 2 2 2 | c c ", + " F||||||| |||||||c c ", + " F|m 5 |22|0c7c0|c c ", + " F|((( ( | | ", + "|||||m 5 ( |((2((| ||", + " 66|((( ( c| ", + " |m 5 ( 6| c ", + " cc|||| |(((( c| c ", + " | 2 5 ( | ", + "2((||2||((| m( ||2||", + " 2 ((((( 2 ", + " 2 2 ", + "2((|| ||2||", + " c| d6d |c ", + " c c| d6d h d6d|c c ", + " c c| h h |c c ", + " c| |F ", + "||||| |||2|", + "c66c|FFFFFF |ccccc|cc ", + " c c|||||||22||||||| ", + " c cc(ccc | |FFFF| cc ", + " c 2 ||22|| cc ", + " ( | | | " + ], + "palettes": [ "microlab" ], + "terrain": { "0": "t_vat" }, + "monster": { "T": { "monster": "mon_mutant_experimental" } }, + "place_items": [ ], + "place_monsters": [ { "monster": "GROUP_LAB", "chance": 2, "x": [ 2, 21 ], "y": [ 2, 21 ], "repeat": [ 1, 5 ] } ] + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + " | cc 2 2 cc | ", + " | |^^| |cccc ", + " ||||||||||||||||||||c ", + " |------------------|6 ", + " |-F cccccc -lll -|r ", + "|||-F 2 c-||2", + " |--- cc cc - h6-| ", + " |-F cc cc - h c-|c ", + " |-F cc cc -cccc-|c ", + " |--- -((((-| ", + "2|G 2 7-|||", + " 5 T----22---- @@-| ", + " 5 T-h 5 7-| ", + "||-lll-66 5 -|||", + " |-----(((222---------|c", + " |-0 0 0 0 0 0 0 0 -| ", + " |-0 0 0 0 0 0 0 0 -| ", + "c|- -|c", + "||-0 0 0 0 0 0 0 0 0 -||", + "c|-0 0 0 0 0 0 0 0 0 -|F", + " |--------------------|F", + " |||||||||||||||||||||||", + " cccc|c |^^| | cc ", + " c|c 2 2 | " + ], + "palettes": [ "microlab" ], + "terrain": { "0": "t_vat", "G": "t_card_science" }, + "monster": { "T": { "monster": "mon_turret_rifle" } }, + "place_monsters": [ { "monster": "GROUP_LAB", "chance": 2, "x": [ 2, 21 ], "y": [ 2, 21 ], "repeat": [ 1, 5 ] } ] + } + }, + { + "type": "mapgen", + "om_terrain": [ [ "microlab_generic" ] ], + "method": "json", + "object": { + "fill_ter": "t_strconc_floor", + "rows": [ + "^|FFF|c c| |c c| ", + " |||||||||| |||||||||| ", + " |D D| |^^^^|ccc| ", + " |@@ @@| 2 2 ", + "^|D T D| | | ", + "||@@ @@| |2(((||||||", + "r| 2 | O| ", + "r|||||2|||| | RR O| ", + "r|l | | l| | RR O| ", + " |l | 2 l| | O| ", + "2||||||||||22| |-tt-|||", + " YY| |-((--|^", + " YY| |-@Ti-|^", + "|||||2||||||||5G|-@ ;-||", + " | |---5----2--| ", + " | cc cc |-p Y p-| ", + " | cc cc |-p 7 p-|t", + " | cc |-p / T p-|t", + "|| cc |- -||", + " |2||| |-(- -(- -| ", + " | |dh d|-T-6-T-ppp-| ", + " 2 |dddd|-----------| ", + " |||||||||||||||||||||| ", + " |ttt |^^| cc | " + ], + "palettes": [ "microlab" ], + "terrain": { "G": "t_card_science" }, + "furniture": { "7": "f_autodoc", "/": "f_autodoc_couch", "T": "f_counter", "p": "f_counter" }, + "items": { + "p": { "item": "bionics", "chance": 20 }, + "T": [ + { "item": "bionics_sci", "chance": 100, "repeat": [ 1, 2 ] }, + { "item": "bionics", "chance": 100, "repeat": [ 1, 3 ] } + ] + }, + "place_loot": [ { "item": "anesthetic_kit", "x": 20, "y": 15 } ], + "place_monsters": [ { "monster": "GROUP_LAB", "x": [ 2, 21 ], "y": [ 2, 21 ], "repeat": [ 1, 5 ] } ], + "monster": { "T": { "monster": "mon_prototype_cyborg" } }, + "computers": { + "6": { + "name": "Surgery room computer", + "security": 3, + "options": [ + { "name": "Open Storage Chambers", "security": 5, "action": "release_bionics" }, + { "name": "Manifest", "action": "list_bionics" } + ], + "failures": [ { "action": "manhacks" }, { "action": "secubots" } ] + } + } + } + } +] diff --git a/data/json/mapgen/missile_silo.json b/data/json/mapgen/missile_silo.json new file mode 100644 index 0000000000000..4496142a7ab8a --- /dev/null +++ b/data/json/mapgen/missile_silo.json @@ -0,0 +1,509 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "silo" ], + "weight": 400, + "object": { + "rows": [ + " .................... ", + " .................... ", + " .................... ", + " ....................s ", + " |-------------|-+-|--| ", + " | |...| | ", + " | v |-+-| | ", + " | ... | ", + " | ... | ", + " | ... | ", + " | ... | ", + " | ***** ... | ", + " | ******* ... | ", + " | ********* ... | ", + " | ********* ... | ", + " | ********* ... | ", + " | ********* ... | ", + " | ********* !x#!! | ", + " | ******* !,,^! | ", + " | ***** !,!$! | ", + " | !>!$! | ", + " | !!!!! | ", + " |--------------------| ", + " " + ], + "terrain": { + " ": [ + [ "t_grass", 20 ], + [ "t_grass_dead", 3 ], + [ "t_grass_tall", 5 ], + [ "t_grass_long", 3 ], + [ "t_dirt", 5 ], + [ "t_shrub", 2 ], + [ "t_tree", 1 ] + ], + ".": "t_pavement", + ",": "t_floor", + "^": "t_elevator_control_off", + "$": "t_elevator", + "-": "t_chainfence", + "|": "t_chainfence", + "+": "t_chaingate_c", + "*": "t_metal_floor", + "!": "t_wall_metal", + ">": "t_stairs_down", + "x": "t_card_military", + "#": "t_door_metal_locked", + "s": "t_pavement", + "v": "t_dirt" + }, + "furniture": { "s": "f_sign_warning", "v": "f_vent_pipe" }, + "signs": { "s": { "signage": "Restricted area! Violators will be shot!" } } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "silo_1" ], + "weight": 400, + "object": { + "fill_ter": "t_rock", + "rows": [ + " ", + " ", + " ......W tc...W ", + " .cTTc..X tc...s & 6", + " .cTTc..+... e....s r..", + " .cTTc.. . f...ba S.a", + " ....... . +X = ", + " CCCrxxa ............ ", + " a. 1 . ", + " ~~~~~~~~~ . . ", + " ~~|-----|~~ . . ", + " ~~|-`````-|~~ . . ", + " ~|-`*****`-|~ . X+ ", + " ~|`*******`|~ . B...a", + " ~|`*******`|~ . l...W", + " ~|`*******`|~?. B...l", + " ~|`*******`|~ . l...B", + " ~|`*******`|~ . B...l", + " ~|-`*****`-|~ . l...B", + " ~~|-`````-|~~ . ", + " ~~|-----|~~ . < ^ ", + " ~~~~~~~~~ ....?..$ ", + " > $ ", + " " + ], + "terrain": { + "*": "t_missile", + "`": "t_hole", + "|": "t_metal_railing", + "-": "t_metal_railing", + "~": "t_metal_floor", + ".": "t_floor", + "&": "t_floor", + "1": "t_floor", + "a": "t_floor", + "b": "t_floor", + "B": "t_floor", + "c": "t_floor", + "l": "t_floor", + "r": "t_floor", + "f": "t_floor", + "e": "t_floor", + "s": "t_floor", + "S": "t_floor", + "t": "t_floor", + "T": "t_floor", + "W": "t_water_dispenser", + "C": "t_floor", + "6": "t_floor", + "=": "t_door_locked", + "+": "t_door_metal_locked", + "?": "t_door_metal_c_peep", + "^": "t_elevator_control_off", + "$": "t_elevator", + ">": "t_stairs_down", + "<": "t_stairs_up", + "X": "t_card_military", + "x": "t_console_broken" + }, + "furniture": { + "d": "f_desk", + "c": "f_chair", + "a": "f_air_conditioner", + "r": "f_trashcan", + "C": "f_filing_cabinet", + "B": "f_bed", + "t": "f_table", + "T": "f_table", + "f": "f_fridge", + "e": "f_counter", + "l": "f_locker", + "s": "f_sofa", + "S": "f_sink", + "6": "f_shower", + "b": "f_bookcase", + "1": "f_speaker_cabinet" + }, + "items": { + "r": { "item": "trash_cart", "chance": 50, "repeat": 2 }, + "l": { "item": "lab_dorm", "chance": 70, "repeat": 2 }, + "B": { "item": "bed", "chance": 60 }, + "f": { "item": "fridge", "chance": 70, "repeat": 3 }, + "C": { "item": "office_supplies", "chance": 60 }, + "t": { "item": "dining", "chance": 45 }, + "b": { "item": "bunker_basement_books", "chance": 70, "repeat": 2 } + }, + "item": { "e": { "item": "microwave", "chance": 70 }, "T": { "item": "militarymap", "chance": 30 } }, + "toilets": { "&": { } } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "silo_2" ], + "weight": 400, + "object": { + "fill_ter": "t_rock", + "rows": [ + " b..t 1..cd b.....s ", + " b..s dc..d b..T9.s ", + " b..s d...1 a.....t ", + " . ...X +X ", + " C. 222 ...+.... &. ", + " C........3 . r.a", + " C.c....c. . S. ", + " a%%%rxxd1 .a = ", + " 000 ........ ", + " ~~~~~~~~~ .4 ", + " ~~|-----|~~ . ", + " ~~|-`````-|~~ . X555555", + " ~|-`*****`-|~ ..+.....a", + " ~|`*******`|~ . 666666", + " ~|`*******`|~ . ", + " ~|`*******`|~?. ", + " ~|`*******`|~ . 777777", + " ~|`*******`|~ ..+.....a", + " ~|-`*****`-|~ . X888888", + " ~~|-`````-|~~ . ", + " ~~|-----|~~ . < ^ ", + " ~~~~~~~~~ ...?..$ ", + " > $ ", + " " + ], + "terrain": { + "*": "t_missile", + "`": "t_hole", + "|": "t_metal_railing", + "-": "t_metal_railing", + "~": "t_metal_floor", + ".": "t_floor", + "&": "t_floor", + "1": "t_floor", + "2": "t_floor", + "3": "t_floor", + "4": "t_floor", + "5": "t_floor", + "6": "t_floor", + "7": "t_floor", + "8": "t_floor", + "9": "t_floor", + "a": "t_floor", + "b": "t_floor", + "c": "t_floor", + "d": "t_floor", + "r": "t_floor", + "s": "t_floor", + "S": "t_floor", + "t": "t_floor", + "T": "t_floor", + "W": "t_water_dispenser", + "C": "t_floor", + "0": "t_reinforced_glass_shutter", + "^": "t_elevator_control_off", + "$": "t_elevator", + "x": "t_console_broken", + "+": "t_door_metal_locked", + "?": "t_door_metal_c_peep", + "=": "t_door_locked", + ">": "t_stairs_down", + "<": "t_stairs_up", + "%": "t_machinery_electronic", + "X": "t_card_military" + }, + "furniture": { + "d": "f_desk", + "c": "f_chair", + "a": "f_air_conditioner", + "r": "f_trashcan", + "C": "f_filing_cabinet", + "s": "f_sofa", + "b": "f_bookcase", + "t": "f_table", + "T": "f_table", + "S": "f_sink", + "1": "f_shredder", + "2": "f_server", + "3": "f_rack_coat", + "4": "f_speaker_cabinet", + "5": "f_utility_shelf", + "6": "f_utility_shelf", + "7": "f_utility_shelf", + "8": "f_utility_shelf", + "9": "f_armchair" + }, + "items": { + "r": { "item": "trash_cart", "chance": 50 }, + "C": { "item": "office_supplies", "chance": 60 }, + "d": { "item": "office", "chance": 50 }, + "b": { "item": "lab_bookshelves", "chance": 60, "repeat": 2 }, + "5": { "item": "supplies_electronics", "chance": 60, "repeat": 2 }, + "6": { "item": "plumbing_bulk", "chance": 60, "repeat": 2 }, + "7": { "item": "bunker_basement_food", "chance": 60, "repeat": 2 } + }, + "item": { + "3": { "item": "coat_lab", "chance": 50, "repeat": 2 }, + "8": { "item": "water_clean", "chance": 70, "repeat": [ 1, 2 ] }, + "c": { "item": "coat_lab", "chance": 50 }, + "T": [ { "item": "glass" }, { "item": "whiskey" }, { "item": "death_note" } ] + }, + "place_loot": [ { "group": "bunker_basement_suicide", "x": 19, "y": 1 } ], + "place_fields": [ { "field": "fd_blood", "x": 18, "y": 1 }, { "field": "fd_blood", "x": 19, "y": 1 } ], + "toilets": { "&": { } } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "silo_3" ], + "weight": 400, + "object": { + "fill_ter": "t_rock", + "rows": [ + " x akk.i", + " ,,,,,,,,,,,X,,,,g", + " ,Y 4, .jj.h", + " + , ", + " %,,,a , ", + " %,,,% ,a a5555", + " %,,,% ,,,+,,,,,", + " %,,,% , x .6666", + " 000 , ", + " ~~~~~~~~~ , `", + " ~~|-----|~~ , ```", + " ~~|-`````-|~~ , `````` ", + " ~|-`*****`-|~````` ", + " ~|`*******`````` ", + " ~|`*******`|~ , ", + " ~|`*******`|~?, ", + " ~|`*******`|~ , ", + " ~|`*******`|~ , ", + " ~|-`*****`-|~ , ", + " ~~|-`````-|~~ , ", + " ~~|-----|~~ , < ^ ", + " ~~~~~~~~~ ,+....$ ", + " Y > $ ", + " " + ], + "terrain": { + "*": "t_missile", + "`": "t_hole", + "|": "t_metal_railing", + "-": "t_metal_railing", + "~": "t_metal_floor", + ".": "t_floor", + ",": "t_floor", + "4": "t_floor", + "5": "t_floor", + "6": "t_floor", + "a": "t_floor", + "g": "t_generator_broken", + "h": "t_switchgear_s", + "i": "t_station_disc", + "j": "t_current_trans", + "k": "t_potential_trans", + "0": "t_reinforced_glass_shutter_open", + "^": "t_elevator_control_off", + "$": "t_elevator", + "x": "t_console_broken", + "+": "t_door_metal_locked", + "?": "t_door_metal_c_peep", + "%": "t_machinery_electronic", + ">": "t_stairs_down", + "<": "t_stairs_up", + "X": "t_mdoor_frame", + "Y": "t_card_military" + }, + "furniture": { "a": "f_air_conditioner", "5": "f_utility_shelf", "6": "f_locker", "4": "f_speaker_cabinet" }, + "items": { "5": { "item": "radiation_meds", "chance": 60, "repeat": 2 }, "6": { "item": "radiation_equipment", "chance": 60 } }, + "place_graffiti": [ + { + "text": "Entrance is restricted to authorized environmental-protected personnel with clearance level 4 or above only!", + "x": 17, + "y": 20 + } + ], + "set": [ { "square": "radiation", "amount": [ 100, 120 ], "x": 0, "y": 0, "x2": 23, "y2": 23 } ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "silo_4" ], + "weight": 400, + "object": { + "fill_ter": "t_rock", + "rows": [ + " ~~~~~~~~~?a.BB.&& ", + " ~ %....&& ", + " ~ ? ", + " ~ alblblb . ", + " ~ ....... a.4 sta", + " ~ .......+.......=...", + " ~ ....... Y . @ S", + " ~ Wlblblb . ", + " ? . Y LLLL ", + " ~~~~~~~~~~ ...+....a", + " ~~|-----|~~ . rrrr ", + " ~~|-`````-|~~ . ", + " ~|-`*****`-|~ . ", + " ~|`*******`|~ . ", + " ~|`*******`|~ . ", + " ~|`*******`|~?. ", + " ~|`*******`|~ . ", + " ~|`*******`|~ . ", + " ~|-`*****`-|~ . ", + " ~~|-`````-|~~ . ", + " ~~|-----|~~ . < ^ ", + " ~~~~~~~~~ .+....$ ", + " Y > $ ", + " " + ], + "terrain": { + "*": "t_missile", + "`": "t_hole", + "|": "t_metal_railing", + "-": "t_metal_railing", + "~": "t_metal_floor", + ".": "t_floor", + "4": "t_floor", + "a": "t_floor", + "b": "t_floor", + "B": "t_floor", + "l": "t_floor", + "L": "t_floor", + "r": "t_floor", + "s": "t_floor", + "S": "t_floor", + "t": "t_floor", + "%": "t_floor", + "&": "t_floor", + "@": "t_floor", + "+": "t_door_metal_locked", + "?": "t_door_metal_c_peep", + "=": "t_door_locked", + ">": "t_stairs_down", + "<": "t_stairs_up", + "Y": "t_card_military", + "^": "t_elevator_control_off", + "$": "t_elevator", + "W": "t_water_dispenser" + }, + "furniture": { + "4": "f_speaker_cabinet", + "a": "f_air_conditioner", + "%": "f_floor_canvas", + "&": "f_tatami", + "b": "f_bed", + "B": "f_bench", + "l": "f_locker", + "L": "f_locker", + "r": "f_rack", + "s": "f_shower", + "S": "f_sink", + "t": "f_trashcan" + }, + "toilets": { "@": { } }, + "items": { + "b": { "item": "army_bed", "chance": 60 }, + "t": { "item": "trash_cart", "chance": 60 }, + "l": { "item": "bunker_basement_clothing", "chance": 50 }, + "L": [ + { "item": "guns_rifle_milspec", "chance": 40, "repeat": [ 1, 2 ] }, + { "item": "mags_milspec", "chance": 40, "repeat": [ 1, 2 ] }, + { "item": "ammo_milspec", "chance": 40, "repeat": [ 1, 2 ] } + ], + "r": [ + { "item": "grenades", "chance": 65, "repeat": [ 1, 2 ] }, + { "item": "mil_armor", "chance": 65, "repeat": [ 1, 2 ] }, + { "item": "gear_soldier_sidearm", "chance": 70, "repeat": [ 1, 2 ] } + ] + }, + "place_graffiti": [ { "text": "Warning! Automatic security measures engaged due to the lockdown order!", "x": 17, "y": 20 } ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "silo_finale" ], + "weight": 400, + "object": { + "fill_ter": "t_rock", + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ~~~~~~~~~ ", + " ~~~~~~~~~~~ Y 4 a ", + " ~~~~~~~~~~~~~+........ ", + " ~~~~~~~~~~~~~|. . ", + " ~~~~~~~~~~~~~|.|x..a . ", + " ~~~~~~~~~~~~~|.|x... . ", + " ~~~~~~~~~~~~~|.|6c..+. ", + " ~~~~~~~~~~~~~|.|%... Y ", + " ~~~~~~~~~~~~~|.|%... ", + " ~~~~~~~~~~~~~|. ", + " ~~~~~~~~~~~~~|. ", + " ~~~~~~~~~~~ . < ^ ", + " ~~~~~~~~~ .+....$ ", + " Y > $ ", + " " + ], + "terrain": { + "~": "t_metal_floor", + "|": "t_reinforced_glass_shutter_open", + ".": "t_rock_floor", + "1": "t_rock_floor", + "4": "t_rock_floor", + "a": "t_rock_floor", + "c": "t_rock_floor", + "?": "t_door_metal_c_peep", + "+": "t_door_metal_locked", + ">": "t_stairs_down", + "<": "t_stairs_up", + "Y": "t_card_military", + "^": "t_elevator_control_off", + "$": "t_elevator", + "x": "t_console_broken", + "%": "t_machinery_electronic" + }, + "furniture": { "1": "f_speaker_cabinet", "4": "f_speaker_cabinet", "a": "f_air_conditioner", "c": "f_chair" }, + "computers": { + "6": { + "name": "Missile Controls", + "security": 10, + "failures": [ { "action": "alarm" }, { "action": "damage" }, { "action": "secubots" } ], + "options": [ { "name": "Launch Missile", "action": "miss_launch" }, { "name": "Disarm Missile", "action": "miss_disarm" } ] + } + }, + "place_graffiti": [ { "text": "Warning! Automatic security measures engaged due to the lockdown order!", "x": 17, "y": 20 } ], + "place_monster": [ { "monster": "mon_zombie_hazmat", "x": 8, "y": 15 } ] + } + } +] diff --git a/data/json/mapgen/office_tower_2.json b/data/json/mapgen/office_tower_2.json index 4aa919c8d8f82..d06a6ad041629 100644 --- a/data/json/mapgen/office_tower_2.json +++ b/data/json/mapgen/office_tower_2.json @@ -229,7 +229,7 @@ ], "place_monsters": [ { "monster": "GROUP_OFFICE_TOWER_2", "x": [ 7, 21 ], "y": [ 13, 21 ], "chance": 2, "repeat": [ 1 ] } ], "place_monster": [ { "monster": "mon_zombie_scientist", "x": [ 7, 21 ], "y": [ 4, 10 ], "repeat": [ 1, 3 ] } ], - "monster": { "7": { "monster": "mon_turret" } } + "monster": { "7": { "monster": "mon_turret_rifle" } } } }, { diff --git a/data/json/mapgen/outpost.json b/data/json/mapgen/outpost.json index 4e945795d7679..ae17fbd1b4646 100644 --- a/data/json/mapgen/outpost.json +++ b/data/json/mapgen/outpost.json @@ -94,13 +94,13 @@ "place_fields": [ { "field": "fd_blood", "x": [ 2, 21 ], "y": [ 2, 21 ], "repeat": [ 1, 12 ] } ], "toilets": { "&": { } }, "place_monster": [ - { "monster": "mon_turret_rifle", "x": 10, "y": 1 }, + { "monster": "mon_crows_m240", "x": 10, "y": 1 }, { "monster": "mon_laserturret", "x": 13, "y": 1 }, - { "monster": "mon_turret_rifle", "x": 1, "y": 10 }, + { "monster": "mon_crows_m240", "x": 1, "y": 10 }, { "monster": "mon_laserturret", "x": 1, "y": 13 }, - { "monster": "mon_turret_rifle", "x": 22, "y": 10 }, + { "monster": "mon_crows_m240", "x": 22, "y": 10 }, { "monster": "mon_laserturret", "x": 22, "y": 13 }, - { "monster": "mon_turret_rifle", "x": 10, "y": 22 }, + { "monster": "mon_crows_m240", "x": 10, "y": 22 }, { "monster": "mon_laserturret", "x": 13, "y": 22 }, { "monster": "mon_turret_searchlight", "x": 1, "y": 1 }, { "monster": "mon_turret_searchlight", "x": 22, "y": 22 }, @@ -113,6 +113,7 @@ { "monster": "mon_zombie_bio_op", "chance": 1 }, { "monster": "mon_dispatch", "chance": 1 }, { "monster": "mon_dispatch_military", "chance": 1 }, + { "monster": "mon_talon_m202a1", "chance": 1 }, { "monster": "mon_zombie_flamer", "chance": 1 } ] } @@ -219,13 +220,13 @@ "place_fields": [ { "field": "fd_blood", "x": [ 2, 21 ], "y": [ 2, 21 ], "repeat": [ 1, 12 ] } ], "toilets": { "&": { } }, "place_monster": [ - { "monster": "mon_turret_rifle", "x": 10, "y": 1 }, + { "monster": "mon_crows_m240", "x": 10, "y": 1 }, { "monster": "mon_laserturret", "x": 13, "y": 1 }, - { "monster": "mon_turret_rifle", "x": 1, "y": 10 }, + { "monster": "mon_crows_m240", "x": 1, "y": 10 }, { "monster": "mon_laserturret", "x": 1, "y": 13 }, - { "monster": "mon_turret_rifle", "x": 22, "y": 10 }, + { "monster": "mon_crows_m240", "x": 22, "y": 10 }, { "monster": "mon_laserturret", "x": 22, "y": 13 }, - { "monster": "mon_turret_rifle", "x": 10, "y": 22 }, + { "monster": "mon_crows_m240", "x": 10, "y": 22 }, { "monster": "mon_laserturret", "x": 13, "y": 22 }, { "monster": "mon_turret_searchlight", "x": 1, "y": 1 }, { "monster": "mon_turret_searchlight", "x": 22, "y": 22 }, @@ -238,6 +239,7 @@ { "monster": "mon_zombie_bio_op", "chance": 1 }, { "monster": "mon_dispatch", "chance": 1 }, { "monster": "mon_dispatch_military", "chance": 1 }, + { "monster": "mon_talon_m202a1", "chance": 1 }, { "monster": "mon_zombie_flamer", "chance": 1 } ] } diff --git a/data/json/mapgen/prison_1.json b/data/json/mapgen/prison_1.json index 63fc011ffaab5..12ed915baa824 100644 --- a/data/json/mapgen/prison_1.json +++ b/data/json/mapgen/prison_1.json @@ -252,7 +252,11 @@ ] }, "place_monsters": [ { "monster": "GROUP_ZOMBIE_COP", "x": [ 35, 38 ], "y": [ 2, 7 ], "density": 0.2 } ], - "monster": { "7": { "monster": "mon_turret" }, "Z": { "monster": "mon_zombie_prisoner" }, "C": { "monster": "mon_broken_cyborg" } } + "monster": { + "7": { "monster": "mon_turret_rifle" }, + "Z": { "monster": "mon_zombie_prisoner" }, + "C": { "monster": "mon_broken_cyborg" } + } } }, { diff --git a/data/json/mapgen/refugee_center/refugee_center.json b/data/json/mapgen/refugee_center/refugee_center.json index 97e19f20d757a..29c3b74219080 100644 --- a/data/json/mapgen/refugee_center/refugee_center.json +++ b/data/json/mapgen/refugee_center/refugee_center.json @@ -166,10 +166,10 @@ ], "fill_ter": "t_floor", "rows": [ - "......_______,,________sss.........##### c# ###########+#+###########LL#c #####..........sss________,,_______......", - "......__________________sss.........##t+ 2 S# #2 2#bh#S 2 +t##..........sss__________________......", - "......_______,,__________ssssssss...#### c# # bTTb bTTb bTTb bTTb #hz#c ####...sssssssss__________,,_______......", - "......_______,,___________ssssssss..##t+ D S# # bTTb bTTb bTTb bTTb #zz#S D +t##..sssssssss___________,,_______......", + "......_______,,________sss.........##### c# ###########+#+########### #c #####..........sss________,,_______......", + "......__________________sss.........##t+ 2 S# #2 2#b #S 2 +t##..........sss__________________......", + "......_______,,__________ssssssss...#### c# # bTTb bTTb bTTb bTTb #b #c ####...sssssssss__________,,_______......", + "......_______,,___________ssssssss..##t+ D S# # bTTb bTTb bTTb bTTb # #S D +t##..sssssssss___________,,_______......", "......_______,,________________sss..######+## # bTTb bTTb bTTb bTTb # ##+######..sss_________________,,_______......", "......_________________,________ss..##~#~# r# # # #r #~#~##..ss_________,_________________......", "......_______,,________,________ss..## # # bTTb bTTb bTTb bTTb # # ##..ss_________,________,,_______......", diff --git a/data/json/mapgen/robofachq_static.json b/data/json/mapgen/robofachq_static.json index 0c2c655f7b192..5b7e602ba833a 100644 --- a/data/json/mapgen/robofachq_static.json +++ b/data/json/mapgen/robofachq_static.json @@ -44,30 +44,30 @@ "object": { "fill_ter": "t_thconc_floor", "rows": [ - ",,,,,,,,,,,,,,__________,ss,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,___________,,,,,,,,,,,,,,,,,,,,,,,,,,,,", - ",,,,,,,,,,,,,,__________|ss|((|,,,,,,,,,,,,,,,,,,,,,,,,,,___________,,,,,,,,,,,,,,,,,,,,,,,,,,,,", - ",,||||||||||||__________|ss(dh|||||||||||||||||||||||||||___________||||||||||||||||||||||||||,,", - ",,|,55555555555_________|s,(d 2s,,,,,,,,,,,_____________5555555555555U,,,,,,,,,,,,,,,,,,,,,,,|,,", - ",,|,,,,,,,,,,,__________|22||||s,,,,,,,,,,,,,,,,,,,,,,,,,___________,U,,,,,,,,,,,,,,,,,,,,,,,|,,", - ",,|,yyyyyyyyy___________sssssssssssssssssssssssssssssssss___________,U,,,,,,,,,,,,,,,,,,,,,,,|,,", - ",,|,y_y_y_y_y___________sssssssssssssssssssssssssssssssss___________,U,,,,,,,,,,,,,,,,,,,,,,,|,,", - ",,|,yyyyyyyyy___________ss,,,,,,,,ss,,,,,,,,,,,,,,,,,,,,,___________,U,,,,,,,,,,,,,,,,,,,,,,,|,,", + ",,,,yyyyyyyyyyyyyyyysssssssssss,,,,,,,,,,,,,,,,,,,,,,______yyyyyyyyy,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,,,________________ssss|ss|((|,,,,,,,,,,,,,,,,,,,,,,_______________,,,,,,,,,,,,,,,,,,,,,,,,,,,,", + ",,||___________555555555|ss(dh|||||||||||||||||||||||||||___________||||||||||||||||||||||||||,,", + ",,|,_________555555555__|s,(d 2s,,,,,,,,,,,_____________5555555555555U,,,,,,,,,,,,,,,,,,,,,,,|,,", + ",,|,____________________|22||||s,,,,,,,,,,,,,,,,,,,,,,,,,___________,U,,,,,,,,,,,,,,,,,,,,,,,|,,", + ",,|,____________________sssssssssssssssssssssssssssssssss___________,U,,,,,,,,,,,,,,,,,,,,,,,|,,", + ",,|,____________________sssssssssssssssssssssssssssssssss___________,U,,,,,,,,,,,,,,,,,,,,,,,|,,", + ",,|,____________________ss,,,,,,,,ss,,,,,,,,,,,,,,,,,,,,,___________,U,,,,,,,,,,,,,,,,,,,,,,,|,,", ",,|,____________________ss,|((((||22||||||||||||(((((||||___________|||,,,,,,,,,,,,,,,,,,,,,,|,,", ",,|,____________________ss,| |d h |;i| B||||___________|||,,,,,,,,,,,,,,,,,,,,,,|,,", ",,|,____________________ss,|? (dh | | dh B||||55555555555|||,,,,,,,,,,,,,,,,,,,,,,|,,", ",,|,____________________ss,|? t (dd66d ||2|hd | |,,,,,,,,,,,,,,,,,,,,,,|,,", - ",,|,yyyyyyyyy___________ss,|? t ||((((22| |(((([| |,,,,,,,,,,,,,,,,,,,,,,|,,", + ",,|,__________yyyyyyyyyyss,|? t ||((((22| |(((([| |,,,,,,,,,,,,,,,,,,,,,,|,,", ",,|,____________________ss,|? 2 YY 5 |,,,,,,,,,,,,,,,,,,,,,,|,,", ",,|,____________________ss,|^a a 2 5 |,,,,,,,,,,,,,,,,,,,,,,|,,", ",,|,____________________ss,|||||||||||||55GI||||55|||| |,,,,,,,,,,,,,,,,,,,,,,|,,", ",,|,____________________ss,|hhhhhhhhh| | | |; | |,,,,,,,,,,,,,,,,,,,,,,|,,", - ",,|,yyyyyyyyy___________ss,| 2 | | 2 i| |,,,,,,,,,,,,,,,,,,,,,,|,,", + ",,|,__________yyyyyyyyyyss,| 2 | | 2 i| |,,,,,,,,,,,,,,,,,,,,,,|,,", ",,|,____________________ss,| lllllll | ||||55|||| |,,,,,,,,,,,,,,,,,,,,,,|,,", ",,|,____________________ss,|2|||||||2|eeeeee(d d( |,,,,,,,,,,,,,,,,,,,,,,|,,", ",,|,____________________ss,| 2~|~2 |eeeeee(6h 66 h6( |,,,,,,,,,,,,,,,,,,,,,,|,,", ",,|,____________________ss,|i ||||| i|Eeeeee(d 66 d( |,,,,,,,,,,,,,,,,,,,,,,|,,", - ",,|,yyyyyyyyy___________ss,|i 2~|~2 i|eeeeee| | |,,,,,,,,,,,,,,,,,,,,,,|,,", - ",,|,,,,,,,,,,___________ss,||||||||||||||||||||||||||||||||||||||||||||,,,,,,,,,,,,,,,,,,,,,,|,,", + ",,|,__________yyyyyyyyyyss,|i 2~|~2 i|eeeeee| | |,,,,,,,,,,,,,,,,,,,,,,|,,", + ",,|,__________ssssssssssss,||||||||||||||||||||||||||||||||||||||||||||,,,,,,,,,,,,,,,,,,,,,,|,,", ",,|,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|,,", ",,|,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|,,", ",,|,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|,,", @@ -195,6 +195,48 @@ "npcs": { "G": { "class": "hub_security" }, "Q": { "class": "hub_security_head" } } } }, + { + "type": "mapgen", + "om_terrain": [ [ "robofachq_sub_a0", "robofachq_sub_a1", "robofachq_sub_a2", "robofachq_sub_a3" ] ], + "method": "json", + "object": { + "fill_ter": "t_thconc_floor", + "rows": [ + "#######################| |##############################", + "#######################| |##############################", + "#######################| bb bbb bb bb |##############################", + "#######################| |##############################", + "#######################|Y Y|##############################", + "#######################|||||||||||||||||||||||| |(((((|||||||##############################", + "##############################################||2222||ttttt|####################################", + "#####################################||||||||||^ ^| hY |####################################", + "#####################################|rrrrrrrr|^ ^| |####################################", + "#####################################|r r|| ||||2|||####################################", + "#####################################|r YY 2 (t G|####################################", + "#####################################|||||||||| YY (thY G|####################################", + "#####################################|bbbbbbbb| YY (t Y G|####################################", + "#####################################|Y Y2 ( G|####################################", + "#####################################| llllll ||2222||||2|||####################################", + "#####################################|2||||||2|^ Y^|####################################", + "#####################################| ~| |~ |^ Y^|####################################", + "#####################################| i| |i |^ Y^|####################################", + "#####################################||||||||||| ||||||||####################################", + "#####################################|eeeeee5 ^|##########################################", + "#####################################|eeeeee5 YY ^|##########################################", + "#####################################|Eeeeee5 YY ^|##########################################", + "#####################################|eeeeee5 ^|##########################################", + "#####################################|||||||||||||||||##########################################" + ], + "palettes": [ "robofachq" ], + "terrain": { "-": "t_wall_metal", "e": "t_elevator", "E": "t_elevator_control", "Y": "t_utility_light", "I": "t_intercom" }, + "items": { + "l": [ { "item": "NC_ROBOFAC_FIELD_RESEARCHER_worn", "chance": 50 }, { "item": "NC_ROBOFAC_SCIENTIST_worn", "chance": 50 } ], + "i": { "item": "cleaning", "chance": 50 }, + "B": [ { "item": "textbooks", "chance": 50 }, { "item": "manuals", "chance": 50 } ] + }, + "place_npcs": [ { "class": "robofac_intercom", "x": 46, "y": 17 } ] + } + }, { "type": "mapgen", "om_terrain": [ diff --git a/data/json/mapgen/robofaq_locs/robofac_hq_chunks.json b/data/json/mapgen/robofaq_locs/robofac_hq_chunks.json index a374616d96f6f..16ffd2dcfca51 100644 --- a/data/json/mapgen/robofaq_locs/robofac_hq_chunks.json +++ b/data/json/mapgen/robofaq_locs/robofac_hq_chunks.json @@ -1,49 +1,66 @@ -{ - "type": "mapgen", - "method": "json", - "nested_mapgen_id": "robofac_hq_surface_freemerchant_camp", - "object": { - "faction_owner": [ { "id": "free_merchants", "x": [ 0, 14 ], "y": [ 0, 14 ] } ], - "mapgensize": [ 15, 15 ], - "rows": [ - " ...... ", - " ###### ...... ", - " #x.rrrr.......", - " #t.rrrr.......", - " #x.rrrr...F...", - " #+++##..h.....", - " #c.t#v........", - " #####v........", - " #+# #+# ", - " #c# #c# ", - " ### ### ", - " ", - " ", - " ", - " " - ], - "terrain": { - ".": "t_dirt", - "r": "t_carpet_yellow", - "M": "t_pavement", - "#": "t_dirt", - "x": "t_dirt", - "c": "t_dirt", - "F": "t_pit_shallow" - }, - "furniture": { "#": "f_skin_wall", "+": "f_skin_door", "x": "f_crate_c", "t": "f_table", "h": "f_chair", "F": "f_firering" }, - "traps": { "c": "tr_fur_rollmat", "v": "tr_funnel" }, - "place_npcs": [ - { "class": "roabofac_free_merchant", "x": 5, "y": 3 }, - { "class": "guard", "x": 7, "y": 7 }, - { "class": "guard", "x": 10, "y": 4 } - ], - "items": { "c": { "item": "bed", "chance": 100 } }, - "item": { - "r": { "item": "pillow", "chance": 33 }, - "F": { "item": "pot", "chance": 100 }, - "v": { "item": "jug_plastic", "chance": 100 } - }, - "place_loot": [ { "group": "NC_ROBOFAC_INTERCOM_trade", "chance": 100, "x": 2, "y": [ 2, 4 ], "repeat": [ 9, 15 ] } ] +[ + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "robofac_hq_surface_freemerchant_camp", + "object": { + "faction_owner": [ { "id": "free_merchants", "x": [ 0, 14 ], "y": [ 0, 14 ] } ], + "mapgensize": [ 15, 15 ], + "rows": [ + " ...... ", + " ###### ...... ", + " #x.rrrr.......", + " #t.rrrr.......", + " #x.rrrr...F...", + " #+++##..h.....", + " #c.t#v........", + " #####v........", + " #+# #+# ", + " #c# #c# ", + " ### ### ", + " ", + " ", + " ", + " " + ], + "terrain": { + ".": "t_dirt", + "r": "t_carpet_yellow", + "M": "t_pavement", + "#": "t_dirt", + "x": "t_dirt", + "c": "t_dirt", + "F": "t_pit_shallow" + }, + "furniture": { "#": "f_skin_wall", "+": "f_skin_door", "x": "f_crate_c", "t": "f_table", "h": "f_chair", "F": "f_firering" }, + "traps": { "c": "tr_fur_rollmat", "v": "tr_funnel" }, + "place_npcs": [ + { "class": "roabofac_free_merchant", "x": 5, "y": 3 }, + { "class": "guard", "x": 7, "y": 7 }, + { "class": "guard", "x": 10, "y": 4 } + ], + "items": { "c": { "item": "bed", "chance": 100 } }, + "item": { + "r": { "item": "pillow", "chance": 33 }, + "F": { "item": "pot", "chance": 100 }, + "v": { "item": "jug_plastic", "chance": 100 } + }, + "place_loot": [ { "group": "NC_ROBOFAC_INTERCOM_trade", "chance": 100, "x": 2, "y": [ 2, 4 ], "repeat": [ 9, 15 ] } ] + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "robofac_hq_surface_merc_1", + "object": { + "faction_owner": [ { "id": "robofac_auxiliaries", "x": [ 0, 4 ], "y": [ 0, 4 ] } ], + "mapgensize": [ 2, 2 ], + "rows": [ + " ", + " ." + ], + "terrain": { ".": "t_thconc_floor" }, + "place_npcs": [ { "class": "robofac_merc_1", "x": 1, "y": 1 } ] + } } -} +] diff --git a/data/json/mapgen/sub_station.json b/data/json/mapgen/sub_station.json index e4bc37aa7ebec..5881e8d04d858 100644 --- a/data/json/mapgen/sub_station.json +++ b/data/json/mapgen/sub_station.json @@ -7,30 +7,30 @@ "object": { "fill_ter": "t_thconc_floor", "rows": [ - " SSSSSSSSSSSSSSSSSSSSSS ", - " SSSSSSSSSSSSSSSSSSSS ", - " * SSSSSSSSSSSSSSSSSS * ", - "*** SSSSSSSSSSSSSSSS ***", - "*** SSSSSSSSSSSSSSSS ***", - " * SS|--;;;;;;;;--|SS * ", - " SS||1..........1||SS ", - " SS||F............F||SS ", - "SS||D&............&D||SS", - "SS-1................1-SS", - "SS-..................-SS", - "SS;..................;SS", - "SS;........>>........;SS", - "SS;........>>........;SS", - "SS;..................;SS", - "SS-..................-SS", - "SS-1................1-SS", - "SS||D&............&D||SS", - " SS||F............F||SS ", - " SS||2bbbbbbbbbb2||SS ", - " * SS||||||||||||||SS * ", - "*** SSSSSSSSSSSS4SSS ***", - "*** SSSSSSSSSSSS ***", - " * * " + "SSSSSSSSSSSSSSSSSSSSSSSS", + "SSSSSSSSSSSSSSSSSSSSSSSS", + "SS||-;;-||-;;-||-;;-||SS", + "SS| | | |SS", + "SS| |SS", + "SS|b b|SS", + "SS|b b|SS", + "SS|b bb bb b|SS", + "SS|D bM Mb F|SS", + "SS|D bM Mb F|SS", + "SS|D bM Mb F|SS", + "SS|b bb bb b|SS", + "SS|b b|SS", + "SS|b b|SS", + "SS| |SS", + "SS| |SS", + "SS| |SS", + "SS| |SS", + "SS|| ||SS", + "SSS|| ||SSS", + "SSSS||>>> >>>||SSSS", + "SSSSS||||||||||||||SSSSS", + "SSSSSSSSSSSSSSSS4SSSSSSS", + "SSSSSSSSSSSSSSSSSSSSSSSS" ], "palettes": [ "subway" ], "vendingmachines": { "D": { "item_group": "vending_drink" }, "F": { "item_group": "vending_food" } } @@ -45,27 +45,27 @@ "rows": [ " ", " ", - " ", - " ", - " ", - " |2222222222223 ", - " ||............33 ", - " ||..............33 ", - " ||................33 ", + " |2222222222222222223 ", " |..................3 ", " |..................3 ", - " |.......oooo.......3 ", - " |.......oooo.......3 ", - " |.......oooo.......3 ", - " |.......oooo.......3 ", + " |.oooo........oooo.3 ", + " |.oooo........oooo.3 ", + " |.oooo........oooo.3 ", + " |.oooo........oooo.3 ", + " |.oooo........oooo.3 ", + " |.oooo........oooo.3 ", + " |.oooo........oooo.3 ", + " |.oooo........oooo.3 ", + " |.oooo........oooo.3 ", " |..................3 ", " |..................3 ", - " ||................33 ", + " |...oooooooooooo...3 ", + " |...oooooooooooo...3 ", + " ||..oooooooooooo..33 ", " ||..............33 ", " ||............33 ", " |----------5-3 ", " ", - " ", " " ], "palettes": [ "roof_palette" ] @@ -81,32 +81,32 @@ "rows": [ "########################", "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "##########BGGB##########", - "#########R____R#########", - "########R______R########", - "#######R________R#######", - "######B__________B######", - "######G____>>____G######", - "######G____<<____G######", - "######B__________B######", - "#######R________R#######", - "########R______R########", - "#########R____R#########", - "##########BGGB##########", - "########################", - "########################", - "########################", - "########################", - "########################", + "#####IIIIIIIIIIIIII#####", + "#####IbbCI>>>>IJbbI#####", + "IIIIII I#####", + "INNNNI I#####", + "IN I I#####", + "IN I I#####", + "IIII+I III###", + "##II II##", + "##I I+I~~I I##", + "##I ~ ~ I##", + "##IsZzzZsIQc IsZzzZsI##", + "##I ~QQQ + I##", + "##IM ~~~~~I MI##", + "##IT TI##", + "##IIAT TAII##", + "###III III###", + "#####I I#####", + "#####I I#####", + "#####I<<": "t_stairs_down", + "Y": "t_utility_light", + "#": "t_rock" + }, + "furniture": { + "&": "f_toilet", + "~": "f_shower", + "@": "f_bed", + "a": "f_armchair", + "k": "f_cupboard", + "D": "f_dresser", + "h": "f_chair", + "b": "f_bench", + "B": "f_bookcase", + "c": "f_counter", + "l": "f_locker", + "n": "f_trashcan", + "d": "f_desk", + "f": "f_fridge", + "F": "f_glass_fridge", + "o": "f_oven", + "O": "f_utility_shelf", + "U": "f_utility_shelf", + "i": "f_sink", + "r": "f_rack", + "?": "f_sofa", + "t": "f_table", + "R": "f_table", + "^": "f_indoor_plant", + "x": "f_safe_l" + }, + "toilets": { ";": { } }, + "items": { + "d": { "item": "office", "chance": 70, "repeat": [ 1, 3 ] }, + "B": [ { "item": "textbooks", "chance": 50 }, { "item": "manuals", "chance": 50 } ], + "F": [ + { "item": "supplies_reagents_lab", "chance": 70, "repeat": [ 2, 5 ] }, + { "item": "supplies_samples_lab", "chance": 40, "repeat": [ 1, 3 ] } + ], + "U": [ + { "item": "tools_science", "chance": 30, "repeat": [ 1, 3 ] }, + { "item": "supplies_reagents_lab", "chance": 70, "repeat": [ 1, 3 ] }, + { "item": "supplies_samples_lab", "chance": 10, "repeat": [ 1, 2 ] } + ], + "c": [ + { "item": "tools_science", "chance": 30, "repeat": [ 1, 3 ] }, + { "item": "supplies_reagents_lab", "chance": 70, "repeat": [ 1, 3 ] }, + { "item": "supplies_samples_lab", "chance": 10, "repeat": [ 1, 2 ] } + ], + "R": [ + { "item": "tools_robotics", "chance": 20, "repeat": [ 1, 3 ] }, + { "item": "robots", "chance": 40, "repeat": [ 1, 3 ] }, + { "item": "supplies_electronics", "chance": 40, "repeat": [ 1, 3 ] } + ], + "O": [ { "item": "tools_robotics", "chance": 40, "repeat": [ 1, 3 ] }, { "item": "schematics", "chance": 2 } ], + "i": { "item": "cleaning", "chance": 20 } + }, + "vendingmachines": { "V": { } } + } +] diff --git a/data/json/mapgen_palettes/subway.json b/data/json/mapgen_palettes/subway.json index a4af753887d58..baad4edf035d5 100644 --- a/data/json/mapgen_palettes/subway.json +++ b/data/json/mapgen_palettes/subway.json @@ -3,18 +3,18 @@ "type": "palette", "id": "subway", "terrain": { - " ": [ "t_dirt", "t_dirt", "t_grass" ], - "|": "t_wall_w", + ".": [ "t_dirt", "t_dirt", "t_grass" ], + "|": "t_brick_wall", "-": "t_wall_glass", ";": "t_door_glass_c", - ".": "t_thconc_floor", "S": "t_sidewalk", "*": "t_shrub", ">": "t_stairs_down", "<": "t_stairs_up", "4": "t_gutter_downspout" }, - "furniture": { "&": "f_trashcan", "b": "f_bench", "1": "f_indoor_plant", "2": "f_indoor_plant_y" } + "furniture": { "&": "f_trashcan", "b": "f_bench", "1": "f_indoor_plant", "2": "f_indoor_plant_y" }, + "signs": { "M": { "signage": "Subway Map: stop" } } }, { "type": "palette", @@ -43,8 +43,21 @@ "h": "t_railroad_track_h_on_tie", "v": "t_railroad_track_v_on_tie", "d": "t_railroad_track_d_on_tie", - "S": "t_buffer_stop" + "S": "t_buffer_stop", + "I": "t_brick_wall", + "+": "t_door_metal_c", + "~": "t_laminated_glass", + "z": "t_fence_metal", + "Z": "t_gate_metal_c", + "A": "t_atm", + "T": "t_ticket_vendor", + "s": "t_ticket_machine" }, - "furniture": { "&": "f_trashcan", "b": "f_bench" } + "furniture": { "&": "f_trashcan", "b": "f_bench", "Q": "f_desk", "c": "f_chair", "N": "f_rack" }, + "signs": { "M": { "signage": "Subway Map: stop" } }, + "items": { + "N": { "item": "tools_construction", "chance": 90, "repeat": 3 }, + "Q": { "item": "office_paper", "chance": 90, "repeat": 5 } + } } ] diff --git a/data/json/martialarts.json b/data/json/martialarts.json index bd9748a9bf36a..7a7f5350fbef6 100644 --- a/data/json/martialarts.json +++ b/data/json/martialarts.json @@ -547,6 +547,145 @@ ], "techniques": [ "tec_karate_rapid", "tec_karate_precise", "tec_karate_roundhouse", "tec_karate_counter" ] }, + { + "type": "martial_art", + "id": "style_krav_maga", + "name": "Krav Maga", + "description": "Originating in Israel, Krav Maga is based on taking down an enemy quickly and effectively. It focuses on applicable attacks rather than showy or complex moves. Popular among police and armed forces everywhere.", + "initiate": [ "You assume a practical combat stance.", "%s assumes a practical combat stance." ], + "learn_difficulty": 6, + "arm_block": 2, + "leg_block": 4, + "static_buffs": [ + { + "id": "buff_krav_maga_static1", + "name": "Krav Maga Stance", + "description": "Your training makes it easier to land hits and fight multiple opponents.\n\n+1 Accuracy, +1 Block attempts.", + "min_unarmed": 0, + "melee_allowed": true, + "unarmed_allowed": true, + "bonus_blocks": 1, + "flat_bonuses": [ [ "hit", 1.0 ] ] + } + ], + "techniques": [ + "tec_krav_maga_rapid", + "tec_krav_maga_crit", + "tec_krav_maga_takedown", + "tec_krav_maga_disarm", + "tec_krav_maga_break", + "tec_krav_maga_counter" + ], + "weapons": [ + "baton-extended", + "copper_knife", + "cudgel", + "diveknife", + "honey_scraper", + "knife_combat", + "knife_hunting", + "knife_rambo", + "knife_rm42", + "knife_trench", + "makeshift_knife", + "PR24-extended", + "shocktonfa_off", + "shocktonfa_on", + "switchblade", + "tonfa", + "tonfa_wood", + "fn1910", + "fn57", + "glock_17", + "glock_18c", + "glock_19", + "glock_22", + "glock_31", + "l_lookout_9mm", + "l_mp_9mm", + "l_sp_9mm", + "m17", + "m1911", + "m1911a1_38super", + "needlepistol", + "sw_22", + "p226_357sig", + "p320_357sig", + "sig_40", + "sig_p230", + "sig_mosquito", + "tokarev", + "usp_45", + "usp_9mm", + "walther_ppk", + "ar10", + "ar15", + "ar15_retool_300blk", + "fn_fal", + "scar_l", + "hk_g3", + "hk_g36", + "l_car_223", + "l_dsr_223", + "l_lmg_223", + "l_mbr_223", + "m14ebr", + "M24", + "m27iar", + "rm51_assault_rifle", + "rm88_battle_rifle", + "sig552", + "sks", + "steyr_aug" + ] + }, + { + "type": "martial_art", + "id": "style_leopard", + "name": "Leopard Kung Fu", + "description": "One of the five Shaolin animal styles. The Leopard focuses on rapid, strategically planned strikes. Perception improves your accuracy instead of Dexterity. Moving increases dodge skill and accuracy further. Attacking after moving increases damage.", + "initiate": [ "You prepare to pounce like a lepoard.", "%s assumes a leopard-like stance." ], + "static_buffs": [ + { + "id": "buff_leopard_static1", + "name": "Leopard's Strategy", + "description": "You fight by overwhelming your opponents with speedy strikes that are much harder to defend against.\nDexterity increases melee damage instead of Strength.\n\nBash damage increased by 75%% of Dexterity but decreased by 75%% of Strength.", + "min_unarmed": 0, + "unarmed_allowed": true, + "flat_bonuses": [ [ "damage", "bash", "dex", 0.75 ], [ "damage", "bash", "str", -0.75 ] ] + }, + { + "id": "buff_leopard_static2", + "name": "Leopard's Agility", + "description": "Just like a cat, you are quick, agile, and hard to pin down.\n\n+1.0 Dodge skill.", + "min_unarmed": 1, + "unarmed_allowed": true, + "flat_bonuses": [ [ "dodge", 1.0 ] ] + } + ], + "onmove_buffs": [ + { + "id": "buff_leopard_onmove1", + "name": "Leopard's Stalk", + "description": "You proudly stalk the shadows and preparing to pouce with unrelenting fury.\n\n+2 Accuracy.\nEnables \"Leopard's Pounce\" buff.\nLasts 1 turn.", + "min_unarmed": 1, + "unarmed_allowed": true, + "buff_duration": 1, + "flat_bonuses": [ [ "hit", 2.0 ] ] + }, + { + "id": "buff_leopard_onmove2", + "name": "Leopard's Pounce", + "description": "You are ready. Attack and claim your prey!\n\n+25% bonus to all damage.\nLasts 1 turn.", + "min_unarmed": 3, + "unarmed_allowed": true, + "req_buffs": [ "buff_leopard_onmove1" ], + "buff_duration": 1, + "flat_bonuses": [ [ "damage", "bash", 1.25 ], [ "damage", "cut", 1.25 ], [ "damage", "stab", 1.25 ] ] + } + ], + "techniques": [ "tec_leopard_rapid", "tec_leopard_feint", "tec_leopard_counter", "tec_leopard_precise" ] + }, { "type": "martial_art", "id": "style_tai_chi", @@ -570,43 +709,6 @@ ], "techniques": [ "tec_taichi_disarm", "tec_taichi_precise" ] }, - { - "type": "martial_art", - "id": "style_krav_maga", - "name": "Krav Maga", - "description": "Originating in Israel, Krav Maga is based on taking down an enemy quickly and effectively. It focuses on applicable attacks rather than showy or complex moves. Popular among police and armed forces everywhere.", - "initiate": [ "You prepare for simultaneous attack and defense.", "%s prepares for simultaneous attack and defense." ], - "learn_difficulty": 6, - "arm_block": 2, - "leg_block": 4, - "static_buffs": [ - { - "id": "krav_maga_static", - "name": "Krav Maga Hand-to-Hand", - "unarmed_allowed": true, - "min_unarmed": 0, - "flat_bonuses": [ [ "damage", "bash", "str", 0.2 ] ], - "description": "Increased unarmed power." - }, - { - "id": "krav_maga_static_edged", - "name": "Krav Maga Edged", - "melee_allowed": true, - "min_unarmed": 0, - "mult_bonuses": [ [ "damage", "stab", 1.2 ] ], - "description": "Increased stabbing damage." - } - ], - "techniques": [ - "tec_krav_maga_rapid", - "tec_krav_maga_feint", - "tec_krav_maga_precise", - "tec_krav_maga_disarm", - "tec_krav_maga_grab", - "tec_krav_maga_break" - ], - "weapons": [ "PR24-extended", "tonfa", "tonfa_wood", "shocktonfa_off", "shocktonfa_on" ] - }, { "type": "martial_art", "id": "style_muay_thai", @@ -944,37 +1046,6 @@ "nodachi_fake" ] }, - { - "type": "martial_art", - "id": "style_leopard", - "name": "Leopard Kung Fu", - "description": "One of the five Shaolin animal styles. The Leopard focuses on rapid, strategically planned strikes. Perception and Intelligence both boost dodging, and moving boosts your accuracy.", - "initiate": [ "You prepare to pounce like a lepoard.", "%s assumes a leopard-like stance." ], - "learn_difficulty": 10, - "arm_block": 99, - "leg_block": 99, - "static_buffs": [ - { - "id": "leopard_static", - "name": "Leopard Strategy", - "description": "Perception and intelligence provide a bonus to dodge.", - "unarmed_allowed": true, - "flat_bonuses": [ [ "dodge", "per", 0.15 ], [ "dodge", "int", 0.15 ] ] - } - ], - "onmove_buffs": [ - { - "id": "leopard_move_buff", - "name": "Leopard's Stalk", - "description": "+2 Accuracy", - "unarmed_allowed": true, - "min_unarmed": 2, - "buff_duration": 2, - "flat_bonuses": [ [ "hit", 2.0 ] ] - } - ], - "techniques": [ "tec_leopard_rapid", "tec_leopard_counter", "tec_leopard_precise" ] - }, { "type": "martial_art", "id": "style_tiger", diff --git a/data/json/monster_special_attacks/spells.json b/data/json/monster_special_attacks/spells.json index 5344c40daab26..2dc8e2e316ab8 100644 --- a/data/json/monster_special_attacks/spells.json +++ b/data/json/monster_special_attacks/spells.json @@ -29,6 +29,36 @@ "effect": "recover_energy", "effect_str": "STAMINA" }, + { + "id": "stamina_damage_mi-go_slaver_beam", + "type": "SPELL", + "name": "Tired", + "description": "decreases stamina. Designed for mi-go slaver beam", + "valid_targets": [ "hostile" ], + "flags": [ "SILENT" ], + "//": "Listed as a recover energy effect with a negative modifier that decreases with each level of the spell, which makes it cause damage instead.", + "min_damage": -500, + "max_damage": -5500, + "damage_increment": -500, + "max_level": 10, + "effect": "recover_energy", + "effect_str": "STAMINA" + }, + { + "id": "pain_damage_mi-go_slaver_beam", + "type": "SPELL", + "name": "Pain", + "description": "Increases pain. Designed for mi-go slaver beam", + "valid_targets": [ "hostile" ], + "flags": [ "SILENT" ], + "//": "Listed as a recover energy effect with a negative modifier that decreases with each level of the spell, which makes it cause damage instead.", + "min_damage": -8, + "max_damage": -148, + "damage_increment": -14, + "max_level": 10, + "effect": "recover_energy", + "effect_str": "PAIN" + }, { "id": "mi-go_slaver_beam", "type": "SPELL", @@ -37,15 +67,15 @@ "valid_targets": [ "hostile" ], "effect": "projectile_attack", "effect_str": "dazed", - "extra_effects": [ { "id": "pain_damage" }, { "id": "stamina_damage" } ], + "extra_effects": [ { "id": "pain_damage_mi-go_slaver_beam" }, { "id": "stamina_damage_mi-go_slaver_beam" } ], "base_casting_time": 100, "max_level": 5, "min_range": 1, "max_range": 25, "range_increment": 5, - "min_duration": 1000, - "max_duration": 10000, - "duration_increment": 2000 + "min_duration": 100, + "max_duration": 1000, + "duration_increment": 200 }, { "type": "SPELL", diff --git a/data/json/monsterdrops/monster_drops.json b/data/json/monsterdrops/monster_drops.json index 0d847af6f8471..7727230845da8 100644 --- a/data/json/monsterdrops/monster_drops.json +++ b/data/json/monsterdrops/monster_drops.json @@ -202,7 +202,7 @@ "subtype": "collection", "id": "mon_zombie_grenadier", "entries": [ - { "item": "chestrig", "damage": [ 1, 4 ] }, + { "item": "tacvest", "damage": [ 1, 4 ] }, { "item": "bot_grenade_hack", "count": [ 0, 3 ] }, { "item": "bot_flashbang_hack", "prob": 50 }, { "item": "bot_gasbomb_hack", "prob": 50 } @@ -213,7 +213,7 @@ "subtype": "collection", "id": "mon_zombie_grenadier_elite", "entries": [ - { "item": "chestrig", "damage": [ 1, 4 ] }, + { "item": "tacvest", "damage": [ 1, 4 ] }, { "item": "molle_pack", "damage": [ 1, 4 ] }, { "item": "bot_grenade_hack", "count": [ 0, 4 ] }, { "item": "bot_flashbang_hack", "count": [ 1, 2 ], "prob": 50 }, @@ -402,7 +402,7 @@ "id": "mon_zombie_flamer", "ammo": 50, "magazine": 100, - "entries": [ { "item": "flamethrower", "charges-min": 100, "charges-max": 1500 } ] + "entries": [ { "item": "flamethrower", "charges-min": 0, "charges-max": 500 } ] }, { "type": "item_group", diff --git a/data/json/monsterdrops/zombie_cop.json b/data/json/monsterdrops/zombie_cop.json index 65dd7d43343a0..19bd98445ce59 100644 --- a/data/json/monsterdrops/zombie_cop.json +++ b/data/json/monsterdrops/zombie_cop.json @@ -31,7 +31,7 @@ [ "armor_riot", 20 ], [ "airhorn", 5 ], [ "bandages", 20 ], - [ "chestrig", 5 ], + [ "tacvest", 5 ], [ "heavy_flashlight", 35 ], [ "holster", 25 ], [ "kevlar", 35 ], diff --git a/data/json/monstergroups/lab.json b/data/json/monstergroups/lab.json index 7f50e81061b6b..358db3ec75eed 100644 --- a/data/json/monstergroups/lab.json +++ b/data/json/monstergroups/lab.json @@ -74,8 +74,9 @@ { "monster": "mon_skitterbot", "freq": 85, "cost_multiplier": 0 }, { "monster": "mon_skitterbot", "freq": 85, "cost_multiplier": 0, "pack_size": [ 2, 3 ] }, { "monster": "mon_skitterbot", "freq": 1, "cost_multiplier": 0, "pack_size": [ 8, 12 ] }, - { "monster": "mon_turret", "freq": 85, "cost_multiplier": 0 }, + { "monster": "mon_turret_rifle", "freq": 85, "cost_multiplier": 0 }, { "monster": "mon_secubot", "freq": 1, "cost_multiplier": 10 }, + { "monster": "mon_talon_m202a1", "freq": 1, "cost_multiplier": 15 }, { "monster": "mon_zombie_bio_op", "freq": 50, "cost_multiplier": 5 }, { "monster": "mon_zombie_armored", "freq": 5, "cost_multiplier": 8 }, { "monster": "mon_zombie_electric", "freq": 50, "cost_multiplier": 3 }, @@ -107,5 +108,31 @@ "name": "GROUP_LAB_CYBORG", "default": "mon_broken_cyborg", "monsters": [ { "monster": "mon_prototype_cyborg", "freq": 400, "cost_multiplier": 0 } ] + }, + { + "type": "monstergroup", + "name": "GROUP_MICROLAB", + "default": "mon_zombie_scientist", + "monsters": [ + { "monster": "mon_blob_small", "freq": 40, "cost_multiplier": 0, "pack_size": [ 3, 6 ] }, + { "monster": "mon_zombie_scientist", "freq": 40, "cost_multiplier": 0, "pack_size": [ 1, 5 ] }, + { "monster": "mon_science_bot", "freq": 40, "cost_multiplier": 2 }, + { "monster": "mon_zombie_labsecurity", "freq": 40, "cost_multiplier": 0, "pack_size": [ 2, 3 ] }, + { "monster": "mon_zombie_hazmat", "freq": 40, "cost_multiplier": 1, "pack_size": [ 1, 3 ] }, + { "monster": "mon_manhack", "freq": 20, "cost_multiplier": 1, "pack_size": [ 3, 12 ] }, + { "monster": "mon_mutant_experimental", "freq": 10, "cost_multiplier": 0, "pack_size": [ 1, 3 ] }, + { "monster": "mon_skitterbot", "freq": 10, "cost_multiplier": 0, "pack_size": [ 2, 3 ] }, + { "monster": "mon_secubot", "freq": 2, "cost_multiplier": 5 }, + { "monster": "mon_zombie_bio_op", "freq": 10, "cost_multiplier": 3 }, + { "monster": "mon_zombie", "freq": 40, "cost_multiplier": 1, "pack_size": [ 2, 7 ] }, + { "monster": "mon_zombie_fat", "freq": 40, "cost_multiplier": 1, "pack_size": [ 2, 4 ] }, + { "monster": "mon_zombie_tough", "freq": 20, "cost_multiplier": 2, "pack_size": [ 2, 4 ] }, + { "monster": "mon_zombie_crawler", "freq": 10, "cost_multiplier": 1 }, + { "monster": "mon_zombie_technician", "freq": 10, "cost_multiplier": 2 }, + { "monster": "mon_zombie_armored", "freq": 1, "cost_multiplier": 5 }, + { "monster": "mon_zombie_electric", "freq": 10, "cost_multiplier": 3 }, + { "monster": "mon_zombie_necro", "freq": 1, "cost_multiplier": 15 }, + { "monster": "mon_zombie_brute_shocker", "freq": 1, "cost_multiplier": 5 } + ] } ] diff --git a/data/json/monstergroups/military.json b/data/json/monstergroups/military.json index 1975ea6932f8c..17f0c8858554b 100644 --- a/data/json/monstergroups/military.json +++ b/data/json/monstergroups/military.json @@ -21,10 +21,5 @@ { "monster": "mon_zombie_bio_op", "freq": 50, "cost_multiplier": 5 }, { "monster": "mon_zombie_armored", "freq": 10, "cost_multiplier": 5 } ] - }, - { - "name": "GROUP_TURRET_SMG", - "type": "monstergroup", - "default": "mon_turret" } ] diff --git a/data/json/monstergroups/monstergroups.json b/data/json/monstergroups/monstergroups.json index 284038c412131..db8e012897491 100644 --- a/data/json/monstergroups/monstergroups.json +++ b/data/json/monstergroups/monstergroups.json @@ -4254,6 +4254,7 @@ { "monster": "mon_skitterbot", "freq": 145, "cost_multiplier": 0, "pack_size": [ 2, 3 ] }, { "monster": "mon_skitterbot", "freq": 1, "cost_multiplier": 0, "pack_size": [ 8, 12 ] }, { "monster": "mon_secubot", "freq": 5, "cost_multiplier": 10 }, + { "monster": "mon_talon_m202a1", "freq": 3, "cost_multiplier": 10 }, { "monster": "mon_zombie_hazmat", "freq": 100, "cost_multiplier": 0 }, { "monster": "mon_zombie_bio_op", "freq": 50, "cost_multiplier": 5 }, { "monster": "mon_zombie_armored", "freq": 5, "cost_multiplier": 5 }, @@ -4357,6 +4358,7 @@ "monsters": [ { "monster": "mon_skitterbot", "freq": 220, "cost_multiplier": 0 }, { "monster": "mon_secubot", "freq": 150, "cost_multiplier": 0 }, + { "monster": "mon_talon_m202a1", "freq": 75, "cost_multiplier": 0 }, { "monster": "mon_copbot", "freq": 0, "cost_multiplier": 0 }, { "monster": "mon_molebot", "freq": 40, "cost_multiplier": 0 }, { "monster": "mon_tripod", "freq": 110, "cost_multiplier": 0 }, @@ -4367,11 +4369,8 @@ { "type": "monstergroup", "name": "GROUP_TURRET", - "default": "mon_turret", - "monsters": [ - { "monster": "mon_turret_rifle", "freq": 300, "cost_multiplier": 1 }, - { "monster": "mon_turret_bmg", "freq": 50, "cost_multiplier": 2 } - ] + "default": "mon_turret_rifle", + "monsters": [ { "monster": "mon_turret_bmg", "freq": 50, "cost_multiplier": 2 } ] }, { "type": "monstergroup", @@ -4502,6 +4501,7 @@ { "monster": "mon_zombie_soldier", "freq": 35, "cost_multiplier": 1 }, { "monster": "mon_dispatch", "freq": 10, "cost_multiplier": 50 }, { "monster": "mon_dispatch_military", "freq": 5, "cost_multiplier": 80 }, + { "monster": "mon_talon_m202a1", "freq": 15, "cost_multiplier": 50 }, { "monster": "mon_zombie_flamer", "freq": 10, "cost_multiplier": 50 }, { "monster": "mon_zombie_military_pilot", "freq": 0, "cost_multiplier": 1 } ] @@ -5295,5 +5295,36 @@ "type": "monstergroup", "default": "mon_hazmatbot", "monsters": [ { "monster": "mon_hazmatbot", "freq": 40, "cost_multiplier": 1 } ] + }, + { + "name": "GROUP_STRAY_DOGS", + "type": "monstergroup", + "default": "mon_dog", + "monsters": [ + { "monster": "mon_dog", "freq": 50, "cost_multiplier": 0 }, + { "monster": "mon_dog_pup", "freq": 5, "cost_multiplier": 0 }, + { "monster": "mon_dog_bull", "freq": 50, "cost_multiplier": 0 }, + { "monster": "mon_dog_bull_pup", "freq": 5, "cost_multiplier": 0 }, + { "monster": "mon_dog_pitbullmix", "freq": 50, "cost_multiplier": 0 }, + { "monster": "mon_dog_pitbullmix_pup", "freq": 5, "cost_multiplier": 0 }, + { "monster": "mon_dog_beagle", "freq": 50, "cost_multiplier": 0 }, + { "monster": "mon_dog_beagle_pup", "freq": 5, "cost_multiplier": 0 }, + { "monster": "mon_dog_bcollie", "freq": 50, "cost_multiplier": 0 }, + { "monster": "mon_dog_bcollie_pup", "freq": 5, "cost_multiplier": 0 }, + { "monster": "mon_dog_boxer", "freq": 50, "cost_multiplier": 0 }, + { "monster": "mon_dog_boxer_pup", "freq": 5, "cost_multiplier": 0 }, + { "monster": "mon_dog_chihuahua", "freq": 50, "cost_multiplier": 0 }, + { "monster": "mon_dog_chihuahua_pup", "freq": 5, "cost_multiplier": 0 }, + { "monster": "mon_dog_dachshund", "freq": 50, "cost_multiplier": 0 }, + { "monster": "mon_dog_dachshund_pup", "freq": 5, "cost_multiplier": 0 }, + { "monster": "mon_dog_gshepherd", "freq": 50, "cost_multiplier": 0 }, + { "monster": "mon_dog_gshepherd_pup", "freq": 5, "cost_multiplier": 0 }, + { "monster": "mon_dog_gpyrenees", "freq": 50, "cost_multiplier": 0 }, + { "monster": "mon_dog_gpyrenees_pup", "freq": 5, "cost_multiplier": 0 }, + { "monster": "mon_dog_rottweiler", "freq": 50, "cost_multiplier": 0 }, + { "monster": "mon_dog_rottweiler_pup", "freq": 5, "cost_multiplier": 0 }, + { "monster": "mon_dog_auscattle", "freq": 50, "cost_multiplier": 0 }, + { "monster": "mon_dog_auscattle_pup", "freq": 5, "cost_multiplier": 0 } + ] } ] diff --git a/data/json/monsters/defense_bot.json b/data/json/monsters/defense_bot.json index fb06540a1f133..4ca2d9755af12 100644 --- a/data/json/monsters/defense_bot.json +++ b/data/json/monsters/defense_bot.json @@ -2,15 +2,15 @@ { "id": "mon_secubot", "type": "MONSTER", - "name": "security bot", - "description": "The Northrop Watchman X-1 is a production series of heavily armored combat robots. Initially designed for military patrol and escort service, it rolls on a set of hydraulic treads and is armed with a 9x19mm SMG.", + "name": "M16A4 autonomous TALON UGV", + "description": "A TALON unmanned ground vehicle equipped with an M16A4. It is a small tracked UGV with an array of motors and sensors covering its weapon mount.", "default_faction": "defense_bot", "species": [ "ROBOT" ], "diff": 10, - "volume": "30000 ml", + "volume": "150000 ml", "weight": 40750, "hp": 80, - "speed": 70, + "speed": 40, "material": [ "steel" ], "symbol": "R", "color": "dark_gray", @@ -20,41 +20,76 @@ "armor_cut": 14, "vision_day": 50, "revert_to_itype": "bot_secubot", - "starting_ammo": { "9mm": 100 }, - "special_attacks": [ { "type": "gun", "cooldown": 2, "gun_type": "hk_mp5", "ranges": [ [ 0, 6, "AUTO" ], [ 7, 12, "DEFAULT" ] ] } ], + "starting_ammo": { "223": 30 }, + "special_attacks": [ + { + "type": "gun", + "cooldown": 1, + "move_cost": 150, + "gun_type": "m16a4", + "ammo_type": "556", + "fake_skills": [ [ "gun", 8 ], [ "rifle", 8 ] ], + "fake_dex": 12, + "ranges": [ [ 0, 30, "DEFAULT" ] ], + "require_targeting_npc": true, + "require_targeting_monster": true, + "laser_lock": false, + "targeting_cost": 200, + "targeting_timeout_extend": -10, + "targeting_sound": "\"Hostile detected.\"", + "targeting_volume": 50, + "no_ammo_sound": "a chk!" + } + ], "death_drops": { }, "death_function": [ "BROKEN" ], - "flags": [ "SEES", "HEARS", "BASHES", "ELECTRONIC", "NO_BREATHE", "PATH_AVOID_DANGER_1", "LOUDMOVES", "DROPS_AMMO" ] + "flags": [ "SEES", "HEARS", "ELECTRONIC", "NO_BREATHE", "PATH_AVOID_DANGER_1", "LOUDMOVES", "DROPS_AMMO" ] }, { - "id": "mon_turret", + "id": "mon_talon_m202a1", "type": "MONSTER", - "name": "turret", - "description": "The General Atomics TX-1 Guardian, a small, pill-shaped automated gun turret using state of the art ATR systems to dynamically reorient itself to new friends and enemies alike. The two SMG barrels can swivel a full 360 degrees.", + "name": "M202A1 autonomous TALON UGV", + "description": "A TALON unmanned ground vehicle equipped with an M202A1 FLASH. It is a small tracked UGV with an array of motors and sensors covering its weapon mount.", "default_faction": "defense_bot", "species": [ "ROBOT" ], "diff": 10, - "volume": "30000 ml", + "volume": "150000 ml", "weight": 40750, - "hp": 30, - "speed": 100, + "hp": 80, + "speed": 40, "material": [ "steel" ], - "symbol": "2", - "color": "light_gray", + "symbol": "R", + "color": "dark_gray", "aggression": 100, "morale": 100, "armor_bash": 14, - "armor_cut": 16, - "vision_night": 3, - "revert_to_itype": "bot_turret", - "starting_ammo": { "9mm": 100 }, + "armor_cut": 14, + "vision_day": 50, + "revert_to_itype": "bot_talon_m202a1", + "starting_ammo": { "m235tpa": 4 }, "special_attacks": [ - { "type": "gun", "cooldown": 1, "gun_type": "hk_mp5", "ranges": [ [ 0, 6, "AUTO" ], [ 7, 14, "DEFAULT" ] ] }, - [ "PARROT", 40 ] + { + "type": "gun", + "cooldown": 1, + "move_cost": 150, + "gun_type": "m202_flash", + "ammo_type": "m235tpa", + "fake_skills": [ [ "gun", 8 ], [ "launcher", 8 ] ], + "fake_dex": 12, + "ranges": [ [ 0, 20, "DEFAULT" ] ], + "require_targeting_npc": true, + "require_targeting_monster": true, + "laser_lock": false, + "targeting_cost": 200, + "targeting_timeout_extend": -10, + "targeting_sound": "\"Hostile detected.\"", + "targeting_volume": 50, + "no_ammo_sound": "a chk!" + } ], "death_drops": { }, "death_function": [ "BROKEN" ], - "flags": [ "SEES", "NOHEAD", "ELECTRONIC", "IMMOBILE", "NO_BREATHE", "DROPS_AMMO" ] + "flags": [ "SEES", "HEARS", "ELECTRONIC", "NO_BREATHE", "PATH_AVOID_DANGER_1", "LOUDMOVES", "DROPS_AMMO" ] }, { "id": "mon_skitterbot", diff --git a/data/json/monsters/mi-go.json b/data/json/monsters/mi-go.json index 92e91617674ce..cd51de980b57d 100644 --- a/data/json/monsters/mi-go.json +++ b/data/json/monsters/mi-go.json @@ -77,7 +77,7 @@ "special_attacks": [ [ "PARROT", 0 ], { "id": "scratch", "damage_max_instance": [ { "damage_type": "cut", "amount": 23, "armor_multiplier": 0.8 } ] }, - { "type": "spell", "spell_id": "mi-go_slaver_beam", "spell_level": 3, "cooldown": 10 } + { "type": "spell", "spell_id": "mi-go_slaver_beam", "spell_level": 3, "cooldown": 100 } ], "death_function": [ "NORMAL" ], "flags": [ @@ -175,7 +175,7 @@ [ "SHRIEK_STUN", 4 ], [ "TAZER", 5 ], { "id": "scratch", "damage_max_instance": [ { "damage_type": "cut", "amount": 35, "armor_multiplier": 0.7 } ] }, - { "type": "spell", "spell_id": "mi-go_slaver_beam", "spell_level": 1, "cooldown": 20 } + { "type": "spell", "spell_id": "mi-go_slaver_beam", "spell_level": 1, "cooldown": 100 } ], "death_function": [ "NORMAL" ], "flags": [ @@ -225,7 +225,7 @@ [ "LONGSWIPE", 12 ], [ "STRETCH_ATTACK", 20 ], { "id": "scratch", "damage_max_instance": [ { "damage_type": "cut", "amount": 30, "armor_multiplier": 0.7 } ] }, - { "type": "spell", "spell_id": "mi-go_slaver_beam", "spell_level": 2, "cooldown": 20 } + { "type": "spell", "spell_id": "mi-go_slaver_beam", "spell_level": 2, "cooldown": 100 } ], "death_function": [ "NORMAL" ], "flags": [ diff --git a/data/json/monsters/military.json b/data/json/monsters/military.json deleted file mode 100644 index a55dfa1bce70c..0000000000000 --- a/data/json/monsters/military.json +++ /dev/null @@ -1,121 +0,0 @@ -[ - { - "id": "mon_laserturret", - "type": "MONSTER", - "name": "laser turret", - "description": "The TX-5LR Cerberus is an upgrade to its predecessors. It features a state of the art revolving laser cannon system with three barrels that charge from solar cells embedded in its hull.", - "default_faction": "military", - "species": [ "ROBOT" ], - "diff": 20, - "volume": "30000 ml", - "weight": 40750, - "hp": 30, - "speed": 100, - "material": [ "steel" ], - "symbol": "2", - "color": "white", - "aggression": 100, - "morale": 100, - "armor_bash": 14, - "armor_cut": 16, - "revert_to_itype": "bot_laserturret", - "special_attacks": [ - { - "type": "gun", - "cooldown": 1, - "gun_type": "laser_cannon", - "fake_skills": [ [ "gun", 4 ], [ "rifle", 8 ] ], - "range": 18, - "ranges": [ [ 0, 30, "DEFAULT" ] ], - "require_sunlight": true - } - ], - "death_drops": { }, - "death_function": [ "BROKEN" ], - "flags": [ "SEES", "NOHEAD", "ELECTRONIC", "IMMOBILE", "NO_BREATHE" ] - }, - { - "id": "mon_turret_bmg", - "type": "MONSTER", - "name": "antimateriel turret", - "description": "Leadworks LLC's T-107A1 Interdictor, an automated .50BMG antimateriel rifle. Credited with forestalling countless car-bombing attempts, it has always been kept under extremely tight control, so as to itself maintain extremely tight control of its area. And then the Cataclysm struck.", - "default_faction": "military", - "species": [ "ROBOT" ], - "diff": 30, - "volume": "62500 ml", - "weight": 81500, - "hp": 40, - "speed": 100, - "material": [ "steel" ], - "symbol": "2", - "color": "green", - "aggression": 100, - "morale": 100, - "armor_bash": 14, - "armor_cut": 16, - "vision_night": 3, - "revert_to_itype": "bot_antimateriel", - "starting_ammo": { "50bmg": 100 }, - "special_attacks": [ - { - "type": "gun", - "cooldown": 1, - "move_cost": 150, - "gun_type": "m107a1", - "ammo_type": "50bmg", - "fake_skills": [ [ "gun", 8 ], [ "rifle", 8 ] ], - "fake_dex": 12, - "ranges": [ [ 0, 40, "DEFAULT" ] ], - "require_targeting_npc": true, - "require_targeting_monster": true, - "laser_lock": true, - "targeting_cost": 200, - "targeting_timeout_extend": -10, - "targeting_sound": "\"Hostile detected.\"", - "targeting_volume": 10, - "no_ammo_sound": "a chk!" - } - ], - "death_drops": { }, - "death_function": [ "BROKEN" ], - "flags": [ "SEES", "NOHEAD", "ELECTRONIC", "IMMOBILE", "NO_BREATHE", "DROPS_AMMO" ] - }, - { - "id": "mon_turret_rifle", - "type": "MONSTER", - "name": "milspec turret", - "description": "Leadworks LLC's T-4A1 Sentry. It features improved firmware over General Atomics' TX-1 9x19mm model and an automated 5.56mm carbine.", - "default_faction": "military", - "species": [ "ROBOT" ], - "diff": 20, - "volume": "30000 ml", - "weight": 40750, - "hp": 40, - "speed": 100, - "material": [ "steel" ], - "symbol": "2", - "color": "green", - "aggression": 100, - "morale": 100, - "armor_bash": 14, - "armor_cut": 16, - "vision_night": 3, - "revert_to_itype": "bot_rifleturret", - "starting_ammo": { "556": 100 }, - "special_attacks": [ - { - "type": "gun", - "cooldown": 1, - "gun_type": "m4a1", - "ammo_type": "556", - "fake_skills": [ [ "gun", 6 ], [ "rifle", 8 ] ], - "fake_dex": 10, - "range": 18, - "ranges": [ [ 0, 10, "AUTO" ], [ 11, 30, "DEFAULT" ] ] - } - ], - "death_drops": { }, - "death_function": [ "BROKEN" ], - "flags": [ "SEES", "NOHEAD", "ELECTRONIC", "IMMOBILE", "NO_BREATHE", "DROPS_AMMO" ] - } -] diff --git a/data/json/monsters/turrets.json b/data/json/monsters/turrets.json new file mode 100644 index 0000000000000..f07ffd7af98ac --- /dev/null +++ b/data/json/monsters/turrets.json @@ -0,0 +1,221 @@ +[ + { + "id": "mon_turret", + "type": "MONSTER", + "name": "improvised MP5 turret", + "description": "An MP5 attached to a motorized chassis with basic autonomous software control. There is no mechanism to reload the weapon when its magazine is empty and the fire control system is only designed for semi automatic fire.", + "default_faction": "defense_bot", + "species": [ "ROBOT" ], + "diff": 20, + "volume": "30000 ml", + "weight": 40750, + "hp": 30, + "speed": 100, + "material": [ "steel" ], + "symbol": "2", + "color": "light_gray", + "aggression": 100, + "morale": 100, + "armor_bash": 14, + "armor_cut": 16, + "vision_night": 3, + "revert_to_itype": "bot_turret", + "starting_ammo": { "9mm": 30 }, + "special_attacks": [ + { + "type": "gun", + "cooldown": 1, + "move_cost": 150, + "gun_type": "hk_mp5", + "ammo_type": "9mm", + "fake_skills": [ [ "gun", 5 ], [ "smg", 5 ] ], + "fake_dex": 12, + "ranges": [ [ 0, 14, "DEFAULT" ] ], + "require_targeting_npc": true, + "require_targeting_monster": true, + "laser_lock": false, + "targeting_cost": 400, + "targeting_timeout_extend": -10, + "targeting_sound": "\"Hostile detected.\"", + "targeting_volume": 20, + "no_ammo_sound": "a chk!" + } + ], + "death_drops": { }, + "death_function": [ "BROKEN" ], + "flags": [ "SEES", "NOHEAD", "ELECTRONIC", "IMMOBILE", "NO_BREATHE", "DROPS_AMMO" ] + }, + { + "id": "mon_laserturret", + "type": "MONSTER", + "name": "laser turret", + "description": "The TX-5LR Cerberus is an upgrade to its predecessors. It features a state of the art revolving laser cannon system with three barrels that charge from solar cells embedded in its hull.", + "default_faction": "military", + "species": [ "ROBOT" ], + "diff": 20, + "volume": "30000 ml", + "weight": 40750, + "hp": 30, + "speed": 100, + "material": [ "steel" ], + "symbol": "2", + "color": "white", + "aggression": 100, + "morale": 100, + "armor_bash": 14, + "armor_cut": 16, + "revert_to_itype": "bot_laserturret", + "special_attacks": [ + { + "type": "gun", + "cooldown": 1, + "gun_type": "laser_cannon", + "fake_skills": [ [ "gun", 4 ], [ "rifle", 8 ] ], + "range": 18, + "ranges": [ [ 0, 30, "DEFAULT" ] ], + "require_sunlight": true + } + ], + "death_drops": { }, + "death_function": [ "BROKEN" ], + "flags": [ "SEES", "NOHEAD", "ELECTRONIC", "IMMOBILE", "NO_BREATHE" ] + }, + { + "id": "mon_turret_bmg", + "type": "MONSTER", + "name": "M2HB autonomous CROWS II", + "description": "A remote weapon system derived from the M153 CROWS II and enhanced with autonomous operation software. Thousands of these were deployed by the US military before the cataclysm and they were valued for their use in engaging anything up to light vehicles at long range without exposing the operator. This one is fitted with a M2HB.", + "default_faction": "military", + "species": [ "ROBOT" ], + "diff": 40, + "volume": "62500 ml", + "weight": 172000, + "hp": 40, + "speed": 100, + "material": [ "steel" ], + "symbol": "2", + "color": "green", + "aggression": 100, + "morale": 100, + "armor_bash": 14, + "armor_cut": 16, + "vision_night": 3, + "revert_to_itype": "bot_antimateriel", + "starting_ammo": { "50bmg": 400 }, + "special_attacks": [ + { + "type": "gun", + "cooldown": 1, + "move_cost": 150, + "gun_type": "m2browning", + "ammo_type": "50bmg", + "fake_skills": [ [ "gun", 8 ], [ "rifle", 8 ] ], + "fake_dex": 12, + "ranges": [ [ 0, 10, "AUTO" ], [ 11, 40, "DEFAULT" ] ], + "require_targeting_npc": true, + "require_targeting_monster": true, + "laser_lock": false, + "targeting_cost": 200, + "targeting_timeout_extend": -10, + "targeting_sound": "\"Hostile detected.\"", + "targeting_volume": 50, + "no_ammo_sound": "a chk!" + } + ], + "death_drops": { }, + "death_function": [ "BROKEN" ], + "flags": [ "SEES", "NOHEAD", "ELECTRONIC", "IMMOBILE", "NO_BREATHE", "DROPS_AMMO" ] + }, + { + "id": "mon_turret_rifle", + "type": "MONSTER", + "name": "M249 autonomous CROWS II", + "description": "A remote weapon system derived from the M153 CROWS II and enhanced with autonomous operation software. Thousands of these were deployed by the US military before the cataclysm and they were valued for their use in engaging infantry without exposing the operator. This one is fitted with a M249.", + "default_faction": "military", + "species": [ "ROBOT" ], + "diff": 30, + "volume": "60000 ml", + "weight": 172000, + "hp": 40, + "speed": 100, + "material": [ "steel" ], + "symbol": "2", + "color": "green", + "aggression": 100, + "morale": 100, + "armor_bash": 14, + "armor_cut": 16, + "vision_night": 3, + "revert_to_itype": "bot_rifleturret", + "starting_ammo": { "556": 1600 }, + "special_attacks": [ + { + "type": "gun", + "cooldown": 1, + "move_cost": 150, + "gun_type": "m249", + "ammo_type": "556", + "fake_skills": [ [ "gun", 8 ], [ "rifle", 8 ] ], + "fake_dex": 12, + "ranges": [ [ 0, 30, "DEFAULT" ] ], + "require_targeting_npc": true, + "require_targeting_monster": true, + "laser_lock": false, + "targeting_cost": 200, + "targeting_timeout_extend": -10, + "targeting_sound": "\"Hostile detected.\"", + "targeting_volume": 50, + "no_ammo_sound": "a chk!" + } + ], + "death_drops": { }, + "death_function": [ "BROKEN" ], + "flags": [ "SEES", "NOHEAD", "ELECTRONIC", "IMMOBILE", "NO_BREATHE", "DROPS_AMMO" ] + }, + { + "id": "mon_crows_m240", + "type": "MONSTER", + "name": "M240 autonomous CROWS II", + "description": "A remote weapon system derived from the M153 CROWS II and enhanced with autonomous operation software. Thousands of these were deployed by the US military before the cataclysm and they were valued for their use in engaging infantry without exposing the operator. This one is fitted with a M240.", + "default_faction": "military", + "species": [ "ROBOT" ], + "diff": 35, + "volume": "60000 ml", + "weight": 172000, + "hp": 40, + "speed": 100, + "material": [ "steel" ], + "symbol": "2", + "color": "green", + "aggression": 100, + "morale": 100, + "armor_bash": 14, + "armor_cut": 16, + "vision_night": 3, + "revert_to_itype": "bot_crows_m240", + "starting_ammo": { "762_51": 1000 }, + "special_attacks": [ + { + "type": "gun", + "cooldown": 1, + "move_cost": 150, + "gun_type": "m240", + "ammo_type": "762_51", + "fake_skills": [ [ "gun", 8 ], [ "rifle", 8 ] ], + "fake_dex": 12, + "ranges": [ [ 0, 30, "DEFAULT" ] ], + "require_targeting_npc": true, + "require_targeting_monster": true, + "laser_lock": false, + "targeting_cost": 200, + "targeting_timeout_extend": -10, + "targeting_sound": "\"Hostile detected.\"", + "targeting_volume": 50, + "no_ammo_sound": "a chk!" + } + ], + "death_drops": { }, + "death_function": [ "BROKEN" ], + "flags": [ "SEES", "NOHEAD", "ELECTRONIC", "IMMOBILE", "NO_BREATHE", "DROPS_AMMO" ] + } +] diff --git a/data/json/monsters/zed_soldiers.json b/data/json/monsters/zed_soldiers.json index 762244449eba5..d71abfe89005a 100644 --- a/data/json/monsters/zed_soldiers.json +++ b/data/json/monsters/zed_soldiers.json @@ -192,7 +192,6 @@ "looks_like": "mon_zombie_brute", "default_faction": "zombie", "bodytype": "human", - "categories": [ "CLASSIC" ], "species": [ "ZOMBIE", "HUMAN" ], "volume": "72500 ml", "weight": 85500, @@ -244,7 +243,6 @@ "looks_like": "mon_zombie_hulk", "default_faction": "zombie", "bodytype": "human", - "categories": [ "CLASSIC" ], "species": [ "ZOMBIE", "HUMAN" ], "volume": "625000 ml", "weight": 200000, @@ -364,6 +362,7 @@ "vision_night": 3, "luminance": 8, "harvest": "zombie", + "starting_ammo": { "pressurized_tank": 1000 }, "death_drops": { "subtype": "collection", "groups": [ [ "mon_zombie_soldier_death_drops", 100 ], [ "mon_zombie_flamer", 100 ] ] }, "death_function": [ "FIREBALL" ], "burn_into": "mon_zombie_scorched", diff --git a/data/json/npcs/NC_BOUNTY_HUNTER.json b/data/json/npcs/NC_BOUNTY_HUNTER.json index 4494da0624a82..20668d9ec7244 100644 --- a/data/json/npcs/NC_BOUNTY_HUNTER.json +++ b/data/json/npcs/NC_BOUNTY_HUNTER.json @@ -25,7 +25,7 @@ { "type": "item_group", "id": "NC_BOUNTY_HUNTER_vest", - "items": [ [ "null", 20 ], [ "kevlar", 80 ], [ "chestrig", 40 ] ] + "items": [ [ "null", 20 ], [ "kevlar", 80 ], [ "tacvest", 40 ] ] }, { "type": "item_group", diff --git a/data/json/npcs/NC_JUNK_SHOPKEEP.json b/data/json/npcs/NC_JUNK_SHOPKEEP.json index a94745e0dbb6a..fc14afa5a7f06 100644 --- a/data/json/npcs/NC_JUNK_SHOPKEEP.json +++ b/data/json/npcs/NC_JUNK_SHOPKEEP.json @@ -67,7 +67,7 @@ [ "sunglasses", 15 ], [ "glasses_safety", 15 ], [ "goggles_ski", 5 ], - [ "chestrig", 20 ], + [ "tacvest", 20 ], [ "legrig", 15 ], [ "tool_belt", 15 ], [ "fanny", 5 ], diff --git a/data/json/npcs/NC_SOLDIER.json b/data/json/npcs/NC_SOLDIER.json index 0f05ac11b9f4f..c03d624bd841b 100644 --- a/data/json/npcs/NC_SOLDIER.json +++ b/data/json/npcs/NC_SOLDIER.json @@ -103,7 +103,7 @@ [ "optical_cloak", 1 ], [ "UPS_off", 5 ], [ "adv_UPS_off", 3 ], - [ "chestrig", 10 ], + [ "tacvest", 10 ], [ "backpack", 8 ], [ "dump_pouch", 20 ], [ "legrig", 10 ], diff --git a/data/json/npcs/TALK_ALLY_TUTORIAL.json b/data/json/npcs/TALK_ALLY_TUTORIAL.json index eea9b89e43350..4c3e35cc2a92d 100644 --- a/data/json/npcs/TALK_ALLY_TUTORIAL.json +++ b/data/json/npcs/TALK_ALLY_TUTORIAL.json @@ -2,7 +2,7 @@ { "id": "TALK_ALLY_TUTORIAL", "type": "talk_topic", - "dynamic_line": "I'm my own person, but I'm willing to follow your lead. I can do a lot of things for you: I can fight, I can train you or you can train me, I can carry stuff, I can bandage your wounds, I can build faction camps, I can go places, I can guard things, I can use some bionics, I can even chit-chat with you or give you tips or talk about my background. You can give me instructions in conversation or by radio or shout commands at me.\n What do you want to know more about?", + "dynamic_line": "I'm my own person, but I'm willing to follow your lead. I can do a lot of things for you: I can fight, I can train you or you can train me, I can carry stuff, I can bandage your wounds, I can build faction camps, I can do some other activites, I can ride horses, I can go places, I can guard things, I can use some bionics, I can even chit-chat with you or give you tips or talk about my background. You can give me instructions in conversation or by radio or shout commands at me.\n What do you want to know more about?", "responses": [ { "text": "Forget I asked.", "topic": "TALK_FRIEND" }, { "text": "Skip it, let's get going.", "topic": "TALK_DONE" }, @@ -14,6 +14,11 @@ { "text": "Tell me about you carrying stuff.", "topic": "TALK_ALLY_TUTORIAL_MULE" }, { "text": "You can perform first aid?", "topic": "TALK_ALLY_TUTORIAL_MEDIC" }, { "text": "Tell me about faction camps.", "topic": "TALK_CAMP_TUTORIAL_INTRO" }, + { + "text": "What's that about activities? Like what, you can farm for me?", + "topic": "TALK_ALLY_TUTORIAL_ACTIVITIES" + }, + { "text": "You can ride horses?", "topic": "TALK_ALLY_TUTORIAL_HORSES" }, { "text": "What do you mean, you can go places?", "topic": "TALK_ALLY_TUTORIAL_MOVEMENT" }, { "text": "What do you do as a guard?", "topic": "TALK_ALLY_TUTORIAL_GUARD" }, { "text": "You can use bionics? How does that work?", "topic": "TALK_ALLY_TUTORIAL_CBMS" }, @@ -92,16 +97,33 @@ }, "responses": [ { "text": "Tell me how I give you medical supplies.", "topic": "TALK_ALLY_TUTORIAL_MULE" } ] }, + { + "id": "TALK_ALLY_TUTORIAL_ACTIVITIES", + "type": "talk_topic", + "dynamic_line": "I can help with some tasks if you show me where to work.\n Use the zone manager (keybind 'Y') to set up sorting zones for your loot, or to draw blueprints for a building, or to define where you want to plant some crops, or where you'd like some trees cut down, or where you want a vehicle dismantled. Then tell me to sort stuff, or build stuff, or cut down trees, or dismantle a vehicle or do farmwork, and I'll go off and do my best to get what you want done. If I need tools, you should leave them pretty close to where you want me to work - axes for logging, shovels and seeds and fertilizer for farming, wrenches and hacksaws or a toolbox to take apart a vehicle. I can pretty much sort out our stuff without needing tools, but keep the piles of unsorted and sorted stuff kind of close together because I don't want to walk back and forth carrying junk too much.", + "responses": [ + { "text": "Good to know. Can you perform first aid?", "topic": "TALK_ALLY_TUTORIAL_MEDIC" }, + { "text": "What about carrying stuff in general?", "topic": "TALK_ALLY_TUTORIAL_MULE" }, + { "text": "What if I want you to build an organized camp?", "topic": "TALK_CAMP_TUTORIAL_INTRO" } + ] + }, { "id": "TALK_ALLY_TUTORIAL_MOVEMENT", "type": "talk_topic", - "dynamic_line": "If you call me by radio, you can tell me to come to you. If you've got some basecamps set up, you can tell me to go to one of them. I'll start walking, and when I get to where I'm going, I'll guard it.\n Now depending on where I am and where I'm going, it may take me a while to get there. I'll dodge any dangers on the way, don't worry about that, but if you're way the heck away from me and tell me to come, it may be a while until I get to you.", + "dynamic_line": "If you call me by radio, you can tell me to come to you. If you've got some basecamps set up, you can tell me to go to one of them. I'll start walking, and when I get to where I'm going, I'll guard it.\n Now depending on where I am and where I'm going, it may take me a while to get there. I'll dodge any dangers on the way, don't worry about that, but if you're way the heck away from me and tell me to come, it may be a while until I get to you.\n I'll move faster if I'm horseback.", "responses": [ { "text": "We can talk with radios?", "topic": "TALK_ALLY_TUTORIAL_RADIO" }, { "text": "What do you do as a guard?", "topic": "TALK_ALLY_TUTORIAL_GUARD" }, - { "text": "Tell me about faction camps.", "topic": "TALK_CAMP_TUTORIAL_INTRO" } + { "text": "Tell me about faction camps.", "topic": "TALK_CAMP_TUTORIAL_INTRO" }, + { "text": "You can ride a horse?", "topic": "TALK_ALLY_TUTORIAL_HORSES" } ] }, + { + "id": "TALK_ALLY_TUTORIAL_HORSES", + "type": "talk_topic", + "dynamic_line": "If there's a friendly horse with a saddle nearby, you tell me to mount up, I'll go over and get on it. You may need to feed a feral horse some cattlefodder to get it act tame and friendly, and e'x'amine it while you have a saddle in your inventory in order to put the saddle on. You can also ride yourself, if you know how how.\n You want me to get off a horse, you just tell me. You can get off a horse with the vehicle control key (keybind '^').\n While we're on horses, we'll just move normally, but a lot faster. It's a good way to get places more quickly than we could on our own two feet.", + "responses": [ { "text": "You said something about being to go places.", "topic": "TALK_ALLY_TUTORIAL_MOVEMENT" } ] + }, { "id": "TALK_ALLY_TUTORIAL_GUARD", "type": "talk_topic", @@ -142,8 +164,12 @@ { "id": "TALK_ALLY_TUTORIAL_CHANGES", "type": "talk_topic", - "dynamic_line": "Well, this conversation is pretty new! But there's been some other changes.\n I've been able to install CBMs on you, and have passive bionics installed in me, for a while. But now I can use some active bionics, and I can explain some details on how I use bionics.", - "responses": [ { "text": "You can use bionics? How does that work?", "topic": "TALK_ALLY_TUTORIAL_CBMS" } ] + "dynamic_line": "Well, this conversation is pretty new! But there's been some other changes.\n I've been able to install CBMs on you, and have passive bionics installed in me, for a while. But now I can use some active bionics, and I can explain some details on how I use bionics.\n I can also ride horses, and you can give me orders to do things like farmwork, cutting trees, or even building houses from a blueprint.", + "responses": [ + { "text": "You can use bionics? How does that work?", "topic": "TALK_ALLY_TUTORIAL_CBMS" }, + { "text": "You can ride horses? Can I ride horses?", "topic": "TALK_ALLY_TUTORIAL_HORSES" }, + { "text": "Tell me more about the activities you can do now.", "topic": "TALK_ALLY_TUTORIAL_ACTIVITIES" } + ] }, { "id": [ @@ -153,6 +179,8 @@ "TALK_ALLY_TUTORIAL_COMBAT", "TALK_ALLY_TUTORIAL_TRAINING", "TALK_ALLY_TUTORIAL_MULE", + "TALK_ALLY_TUTORIAL_ACTIVITIES", + "TALK_ALLY_TUTORIAL_HORSES", "TALK_ALLY_TUTORIAL_MEDIC", "TALK_ALLY_TUTORIAL_MOVEMENT", "TALK_ALLY_TUTORIAL_GUARD", diff --git a/data/json/npcs/TALK_COMMON_ALLY.json b/data/json/npcs/TALK_COMMON_ALLY.json index c30c304f43435..3f2865337ce71 100644 --- a/data/json/npcs/TALK_COMMON_ALLY.json +++ b/data/json/npcs/TALK_COMMON_ALLY.json @@ -35,7 +35,8 @@ "no": { "has_reason": { "use_reason": true }, "no": "What is it, friend?" } }, "responses": [ - { "text": "Combat commands...", "topic": "TALK_COMBAT_COMMANDS" }, + { "text": "I want to give you some commands for combat.", "topic": "TALK_COMBAT_COMMANDS" }, + { "text": "I want to set some miscellaneous rules.", "topic": "TALK_MISC_RULES" }, { "text": "Can I do anything for you?", "topic": "TALK_MISSION_LIST" }, { "text": "Can you teach me anything?", @@ -71,33 +72,48 @@ "switch": true, "default": true }, - { - "text": "Guard this position.", - "condition": { "not": "is_by_radio" }, - "topic": "TALK_FRIEND_GUARD", - "effect": "assign_guard" - }, - { "text": "I'd like to know a bit more about you...", "topic": "TALK_FRIEND", "effect": "reveal_stats" }, { "text": "I want you to use this item.", "condition": { "not": "is_by_radio" }, "topic": "TALK_FRIEND", "effect": "npc_gets_item_to_use" }, - { "text": "Let's talk about your current activity.", "topic": "TALK_ACTIVITIES" }, { "text": "Hold on to this item.", "condition": { "not": "is_by_radio" }, "topic": "TALK_FRIEND", "effect": "npc_gets_item" }, - { "text": "Miscellaneous rules...", "topic": "TALK_MISC_RULES" }, - { "text": "I'm going to go my own way for a while.", "topic": "TALK_LEAVE" }, - { "text": "Let's go.", "topic": "TALK_DONE" }, { - "text": "Let's just chitchat for a while...", - "topic": "TALK_FRIEND_CHAT", - "condition": { "not": { "npc_has_effect": "asked_to_socialize" } } + "text": "Guard this position.", + "condition": { "not": "is_by_radio" }, + "topic": "TALK_FRIEND_GUARD", + "effect": "assign_guard" + }, + { "text": "Let's talk about your current activity.", "topic": "TALK_ACTIVITIES" }, + { "text": "Let's talk about faction camps.", "topic": "TALK_CAMP_GENERAL" }, + { + "text": "Find a horse and mount up!", + "condition": { "not": "npc_is_riding" }, + "topic": "TALK_DONE", + "effect": "find_mount" + }, + { + "text": "Get off your mount, please.", + "condition": "npc_is_riding", + "topic": "TALK_DONE", + "effect": "dismount" + }, + { + "text": "Please go to this location.", + "topic": "TALK_GOTO_LOCATION", + "condition": { "or": [ "is_by_radio", "u_has_camp" ] }, + "effect": "goto_location" + }, + { + "text": "I'd like to know a bit more about your abilities.", + "topic": "TALK_FRIEND", + "effect": "reveal_stats" }, { "text": "Any hints about the world we now live in?", @@ -118,13 +134,36 @@ "failure": { "topic": "TALK_SHELTER_ADVICE", "effect": { "npc_add_effect": "asked_to_hint", "duration": 300 } } }, { - "text": "Please go to this location...", - "topic": "TALK_GOTO_LOCATION", - "condition": { "or": [ "is_by_radio", "u_has_camp" ] }, - "effect": "goto_location" + "text": "Mind if we just chat for a bit about your history?", + "topic": "TALK_FRIEND_CONVERSATION", + "condition": { + "and": [ "at_safe_space", { "or": [ { "npc_has_trait_flag": "BG_SURVIVAL_STORY" }, { "npc_has_trait": "NPC_STATIC_NPC" } ] } ] + }, + "//": "If the NPC already has a BG story, or started out as a static NPC (and so probably doesn't need a random bg story), then go on.", + "switch": true }, - { "text": "Tell me about giving you orders.", "topic": "TALK_ALLY_TUTORIAL" }, - { "text": "Let's talk about faction camps.", "topic": "TALK_CAMP_GENERAL" } + { + "text": "Mind if we just chat for a bit about your history?", + "topic": "TALK_FRIEND_CONVERSATION", + "condition": "at_safe_space", + "switch": true, + "effect": { "npc_add_trait": "BGSS_Confused_1" }, + "//": "If the NPC doesn't have a BG survival story flagged trait, and didn't start the game as a static NPC, give them a BG story.", + "//": "This is a stand-in for some kind of better system to add a random trait." + }, + { + "text": "Mind if we just chat for a bit about your history?", + "topic": "TALK_CONVERSATION_DANGER", + "condition": { "not": "at_safe_space" } + }, + { + "text": "Let's just chitchat for a while, I could use some relaxation.", + "topic": "TALK_FRIEND_CHAT", + "condition": { "not": { "npc_has_effect": "asked_to_socialize" } } + }, + { "text": "Tell me about giving you orders (NPC TUTORIAL).", "topic": "TALK_ALLY_TUTORIAL" }, + { "text": "I'm going to go my own way for a while.", "topic": "TALK_LEAVE" }, + { "text": "Let's go.", "topic": "TALK_DONE" } ] }, { @@ -141,9 +180,13 @@ "no": { "npc_engagement_rule": "ENGAGE_HIT", "no": { - "npc_engagement_rule": "ENGAGE_NO_MOVE", - "no": "*will engage all enemies.", - "yes": "*will engage enemies close enough to attack without moving." + "npc_engagement_rule": "ENGAGE_FREE_FIRE", + "no": { + "npc_engagement_rule": "ENGAGE_NO_MOVE", + "no": "*will engage all enemies.", + "yes": "*will engage enemies close enough to attack without moving." + }, + "yes": "*will engage distant enemies without moving." }, "yes": "*will engage enemies you attack." }, @@ -310,9 +353,13 @@ "no": { "npc_engagement_rule": "ENGAGE_HIT", "no": { - "npc_engagement_rule": "ENGAGE_NO_MOVE", - "no": "*will engage all enemies.", - "yes": "*will engage enemies close enough to attack without moving." + "npc_engagement_rule": "ENGAGE_FREE_FIRE", + "no": { + "npc_engagement_rule": "ENGAGE_NO_MOVE", + "no": "*will engage all enemies.", + "yes": "*will engage enemies close enough to attack without moving." + }, + "yes": "*will engage distant enemies without moving." }, "yes": "*will engage enemies you attack." }, @@ -356,6 +403,12 @@ "condition": { "not": { "npc_engagement_rule": "ENGAGE_NO_MOVE" } }, "effect": { "set_npc_engagement_rule": "ENGAGE_NO_MOVE" } }, + { + "text": "Attack any enemy within range of your ranged weapon, but don't move.", + "topic": "TALK_NONE", + "condition": { "not": { "npc_engagement_rule": "ENGAGE_FREE_FIRE" } }, + "effect": { "set_npc_engagement_rule": "ENGAGE_FREE_FIRE" } + }, { "text": "Attack anything you want.", "topic": "TALK_NONE", @@ -746,6 +799,36 @@ "condition": { "not": "npc_has_activity" }, "effect": "do_construction" }, + { + "text": "Please start deconstructing any vehicles in a deconstruction zone.", + "topic": "TALK_DONE", + "condition": { "not": "npc_has_activity" }, + "effect": "do_vehicle_deconstruct" + }, + { + "text": "Please chop logs into planks.", + "topic": "TALK_DONE", + "condition": { "not": "npc_has_activity" }, + "effect": "do_chop_plank" + }, + { + "text": "Please butcher any corpses that you can.", + "topic": "TALK_DONE", + "condition": { "not": "npc_has_activity" }, + "effect": "do_butcher" + }, + { + "text": "Please chop any trees in the designated areas.", + "topic": "TALK_DONE", + "condition": { "not": "npc_has_activity" }, + "effect": "do_chop_trees" + }, + { + "text": "Please go catch some fish.", + "topic": "TALK_DONE", + "condition": { "not": "npc_has_activity" }, + "effect": "do_fishing" + }, { "text": "Please do some farming work.", "topic": "TALK_DONE", diff --git a/data/json/npcs/TALK_COMMON_MISSION.json b/data/json/npcs/TALK_COMMON_MISSION.json index 158df14ec1635..2a62a819b14ef 100644 --- a/data/json/npcs/TALK_COMMON_MISSION.json +++ b/data/json/npcs/TALK_COMMON_MISSION.json @@ -273,6 +273,7 @@ { "text": "Glad to help. I need no payment.", "topic": "TALK_NONE", + "condition": "mission_has_generic_rewards", "effect": "clear_mission", "mission_opinion": { "trust": 4, "value": 3 }, "opinion": { "fear": -1, "anger": -1 } @@ -280,17 +281,34 @@ { "text": "How about some items as payment?", "topic": "TALK_MISSION_REWARD", - "condition": { "not": "npc_friend" }, + "condition": { "and": [ "mission_has_generic_rewards", { "not": "npc_friend" } ] }, "effect": "mission_reward" }, { "text": "Maybe you can teach me something as payment?", "topic": "TALK_TRAIN", - "condition": { "or": [ "npc_train_skills", "npc_train_styles" ] } + "condition": { "and": [ "mission_has_generic_rewards", { "or": [ "npc_train_skills", "npc_train_styles" ] } ] } }, { "text": "Glad to help. I need no payment. Bye!", "topic": "TALK_DONE", + "condition": "mission_has_generic_rewards", + "effect": "clear_mission", + "mission_opinion": { "trust": 4, "value": 3 }, + "opinion": { "fear": -1, "anger": -1 } + }, + { + "text": "Glad to help.", + "topic": "TALK_NONE", + "condition": { "not": "mission_has_generic_rewards" }, + "effect": "clear_mission", + "mission_opinion": { "trust": 4, "value": 3 }, + "opinion": { "fear": -1, "anger": -1 } + }, + { + "text": "Glad to help. Bye!", + "topic": "TALK_DONE", + "condition": { "not": "mission_has_generic_rewards" }, "effect": "clear_mission", "mission_opinion": { "trust": 4, "value": 3 }, "opinion": { "fear": -1, "anger": -1 } diff --git a/data/json/npcs/TALK_CYBORG_1.json b/data/json/npcs/TALK_CYBORG_1.json index a37bd4b39a156..1cdf5099dcab2 100644 --- a/data/json/npcs/TALK_CYBORG_1.json +++ b/data/json/npcs/TALK_CYBORG_1.json @@ -10,10 +10,7 @@ "no": "I... I'm free. *Zzzt* I'm actually free! *bzzz* Look, you're the first person I've seen in a long time.", "yes": "Hey again. *kzzz*" }, - "speaker_effect": { - "effect": { "npc_add_var": "cyborg_has_talked", "type": "dialogue", "context": "cyborg", "value": "yes" }, - "sentinel": "cyborg_has_talked" - }, + "speaker_effect": { "effect": { "npc_add_var": "cyborg_has_talked", "type": "dialogue", "context": "cyborg", "value": "yes" } }, "responses": [ { "switch": true, diff --git a/data/json/npcs/TALK_FRIEND_CONVERSATION.json b/data/json/npcs/TALK_FRIEND_CONVERSATION.json index d15345075457e..28e7aaf2694bc 100644 --- a/data/json/npcs/TALK_FRIEND_CONVERSATION.json +++ b/data/json/npcs/TALK_FRIEND_CONVERSATION.json @@ -1,33 +1,4 @@ [ - { - "id": "TALK_FRIEND", - "type": "talk_topic", - "responses": [ - { - "text": "Mind if we just chat for a bit?", - "topic": "TALK_FRIEND_CONVERSATION", - "condition": { - "and": [ "at_safe_space", { "or": [ { "npc_has_trait_flag": "BG_SURVIVAL_STORY" }, { "npc_has_trait": "NPC_STATIC_NPC" } ] } ] - }, - "//": "If the NPC already has a BG story, or started out as a static NPC (and so probably doesn't need a random bg story), then go on.", - "switch": true - }, - { - "text": "Mind if we just chat for a bit?", - "topic": "TALK_FRIEND_CONVERSATION", - "condition": "at_safe_space", - "switch": true, - "effect": { "npc_add_trait": "BGSS_Confused_1" }, - "//": "If the NPC doesn't have a BG survival story flagged trait, and didn't start the game as a static NPC, give them a BG story.", - "//": "This is a stand-in for some kind of better system to add a random trait." - }, - { - "text": "Mind if we just chat for a bit?", - "topic": "TALK_CONVERSATION_DANGER", - "condition": { "not": "at_safe_space" } - } - ] - }, { "id": "TALK_CONVERSATION_DANGER", "type": "talk_topic", diff --git a/data/json/npcs/TALK_TEST.json b/data/json/npcs/TALK_TEST.json index 48b46c280f819..7175dbe6bfaf8 100644 --- a/data/json/npcs/TALK_TEST.json +++ b/data/json/npcs/TALK_TEST.json @@ -601,6 +601,94 @@ } ] }, + { + "type": "talk_topic", + "id": "TALK_TEST_ADJUST_VARS", + "dynamic_line": "This is a test conversation that shouldn't appear in the game.", + "responses": [ + { "text": "This is a basic test response.", "topic": "TALK_DONE" }, + { + "text": "This is a u_adjust_var test response that increments by 1.", + "topic": "TALK_DONE", + "effect": { "u_adjust_var": "test", "type": "test", "context": "var_adjust_test", "adjustment": 1 } + }, + { + "text": "This is a u_adjust_var test response that decrements by 1.", + "topic": "TALK_DONE", + "effect": { "u_adjust_var": "test", "type": "test", "context": "var_adjust_test", "adjustment": -1 } + }, + { + "text": "This is a npc_adjust_var test response that increments by 1.", + "topic": "TALK_DONE", + "effect": { "npc_adjust_var": "test", "type": "test", "context": "var_adjust_test", "adjustment": 1 } + }, + { + "text": "This is a npc_adjust_var test response that decrements by 1.", + "topic": "TALK_DONE", + "effect": { "npc_adjust_var": "test", "type": "test", "context": "var_adjust_test", "adjustment": -1 } + }, + { + "text": "This is a u_compare_var test response for == 0.", + "topic": "TALK_DONE", + "condition": { "u_compare_var": "test", "type": "test", "context": "var_adjust_test", "op": "==", "value": 0 } + }, + { + "text": "This is a u_compare_var test response for != 0.", + "topic": "TALK_DONE", + "condition": { "u_compare_var": "test", "type": "test", "context": "var_adjust_test", "op": "!=", "value": 0 } + }, + { + "text": "This is a u_compare_var test response for <= 0.", + "topic": "TALK_DONE", + "condition": { "u_compare_var": "test", "type": "test", "context": "var_adjust_test", "op": "<=", "value": 0 } + }, + { + "text": "This is a u_compare_var test response for >= 0.", + "topic": "TALK_DONE", + "condition": { "u_compare_var": "test", "type": "test", "context": "var_adjust_test", "op": ">=", "value": 0 } + }, + { + "text": "This is a u_compare_var test response for < 0.", + "topic": "TALK_DONE", + "condition": { "u_compare_var": "test", "type": "test", "context": "var_adjust_test", "op": "<", "value": 0 } + }, + { + "text": "This is a u_compare_var test response for > 0.", + "topic": "TALK_DONE", + "condition": { "u_compare_var": "test", "type": "test", "context": "var_adjust_test", "op": ">", "value": 0 } + }, + { + "text": "This is a npc_compare_var test response for == 0.", + "topic": "TALK_DONE", + "condition": { "npc_compare_var": "test", "type": "test", "context": "var_adjust_test", "op": "==", "value": 0 } + }, + { + "text": "This is a npc_compare_var test response for != 0.", + "topic": "TALK_DONE", + "condition": { "npc_compare_var": "test", "type": "test", "context": "var_adjust_test", "op": "!=", "value": 0 } + }, + { + "text": "This is a npc_compare_var test response for <= 0.", + "topic": "TALK_DONE", + "condition": { "npc_compare_var": "test", "type": "test", "context": "var_adjust_test", "op": "<=", "value": 0 } + }, + { + "text": "This is a npc_compare_var test response for >= 0.", + "topic": "TALK_DONE", + "condition": { "npc_compare_var": "test", "type": "test", "context": "var_adjust_test", "op": ">=", "value": 0 } + }, + { + "text": "This is a npc_compare_var test response for < 0.", + "topic": "TALK_DONE", + "condition": { "npc_compare_var": "test", "type": "test", "context": "var_adjust_test", "op": "<", "value": 0 } + }, + { + "text": "This is a npc_compare_var test response for > 0.", + "topic": "TALK_DONE", + "condition": { "npc_compare_var": "test", "type": "test", "context": "var_adjust_test", "op": ">", "value": 0 } + } + ] + }, { "type": "talk_topic", "id": "TALK_TEST_BIONICS", diff --git a/data/json/npcs/factions.json b/data/json/npcs/factions.json index 8be7ad872f387..0284b0b4a65d0 100644 --- a/data/json/npcs/factions.json +++ b/data/json/npcs/factions.json @@ -50,6 +50,32 @@ }, "description": "The surviving staff of Hub 01, a pre-cataclysm research lab. They rarely leave their lab, if at all, and rely on their robots and advanced technology to survive." }, + { + "type": "faction", + "id": "robofac_auxiliaries", + "name": "Hub 01 Ancillia", + "likes_u": 15, + "respects_u": 15, + "known_by_u": false, + "size": 70, + "power": 100, + "food_supply": 115200, + "wealth": 75000, + "currency": "RobofacCoin", + "relations": { + "robofac": { + "kill on sight": false, + "watch your back": true, + "share my stuff": true, + "guard your stuff": true, + "lets you in": true, + "defends your space": true, + "knows your voice": true + }, + "marloss": { "kill on sight": true } + }, + "description": "A loose association of skilled wastelanders, traders, mercenaries and scouts. All working on behalf of Hub 01, for their own reasons." + }, { "type": "faction", "id": "old_guard", @@ -142,6 +168,15 @@ "defends your space": false, "knows your voice": true }, + "no_faction": { + "kill on sight": false, + "watch your back": false, + "share my stuff": false, + "guard your stuff": false, + "lets you in": false, + "defends your space": false, + "knows your voice": true + }, "hells_raiders": { "kill on sight": true } }, "description": "A conglomeration of entrepreneurs and businessmen that stand together to hammer-out an existence through trade and industry." @@ -185,6 +220,15 @@ "defends your space": false, "knows your voice": true }, + "no_faction": { + "kill on sight": false, + "watch your back": false, + "share my stuff": false, + "guard your stuff": false, + "lets you in": false, + "defends your space": false, + "knows your voice": true + }, "wasteland_scavengers": { "kill on sight": false, "watch your back": false, @@ -246,6 +290,26 @@ }, "description": "Diverse bands, congregations and organizations with the common goal of preaching human survival through symbiosis with fungaloids." }, + { + "type": "faction", + "id": "no_faction", + "name": "No Faction", + "likes_u": 0, + "respects_u": 0, + "known_by_u": false, + "size": 100, + "power": 100, + "food_supply": 172800, + "wealth": 2500000, + "relations": { + "lobby_beggars": { "knows your voice": true }, + "free_merchants": { "knows your voice": true }, + "old_guard": { "knows your voice": true }, + "wasteland_scavengers": { "knows your voice": true }, + "no_faction": { "knows your voice": true } + }, + "description": "A lone wolf, not aligned with any faction." + }, { "type": "faction", "id": "wasteland_scavengers", @@ -261,7 +325,8 @@ "lobby_beggars": { "knows your voice": true }, "free_merchants": { "knows your voice": true }, "old_guard": { "knows your voice": true }, - "wasteland_scavengers": { "share my stuff": true, "guard your stuff": true, "knows your voice": true } + "wasteland_scavengers": { "share my stuff": true, "guard your stuff": true, "knows your voice": true }, + "no_faction": { "knows your voice": true } }, "description": "Autonomous bands or individuals who make their living raiding the ruins of the old-world for gear and provisions." }, @@ -366,6 +431,15 @@ "lets you in": false, "defends your space": false }, + "no_faction": { + "kill on sight": false, + "watch your back": false, + "share my stuff": false, + "guard your stuff": false, + "lets you in": false, + "defends your space": false, + "knows your voice": true + }, "wasteland_scavengers": { "kill on sight": false, "watch your back": true, diff --git a/data/json/npcs/holdouts/rural.json b/data/json/npcs/holdouts/rural.json index 35d58d37d4ca1..577f95f24a9c4 100644 --- a/data/json/npcs/holdouts/rural.json +++ b/data/json/npcs/holdouts/rural.json @@ -8,6 +8,6 @@ "name_suffix": "Survivor", "mission": 7, "chat": "TALK_STRANGER_NEUTRAL", - "faction": "wasteland_scavengers" + "faction": "no_faction" } ] diff --git a/data/json/npcs/isherwood_farm/NPC_Barry_Isherwood.json b/data/json/npcs/isherwood_farm/NPC_Barry_Isherwood.json new file mode 100644 index 0000000000000..16dfc41b806ae --- /dev/null +++ b/data/json/npcs/isherwood_farm/NPC_Barry_Isherwood.json @@ -0,0 +1,104 @@ +[ + { + "type": "npc", + "id": "isherwood_barry", + "//": "A naked prisoner, from the isherwood faction trapped in a horrifing cage, watching horrible things happen.", + "class": "NC_ISHERWOOD_BARRY", + "name_unique": "Barry Isherwood", + "attitude": 0, + "mission": 7, + "chat": "TALK_ISHERWOOD_BARRY", + "mission_offered": "MISSION_ISHERWOOD_BARRY_1", + "faction": "isherwood_family" + }, + { + "type": "npc_class", + "id": "NC_ISHERWOOD_BARRY", + "name": "Barry Isherwood", + "job_description": "Missing member of the Isherwood family.", + "traits": [ { "group": "NPC_starting_traits" }, { "group": "Appearance_demographics" } ], + "common": false, + "bonus_per": { "one_in": 4 }, + "skills": [ + { + "skill": "ALL", + "level": { "mul": [ { "one_in": 3 }, { "sum": [ { "dice": [ 2, 2 ] }, { "constant": -2 }, { "one_in": 4 } ] } ] } + }, + { "skill": "melee", "bonus": { "rng": [ 3, 6 ] } }, + { "skill": "survival", "bonus": { "rng": [ 7, 10 ] } }, + { "skill": "gun", "bonus": { "rng": [ 4, 8 ] } }, + { "skill": "rifle", "bonus": { "rng": [ 7, 10 ] } }, + { "skill": "archery", "bonus": { "rng": [ 8, 10 ] } } + ], + "worn_override": "naked_prisoner", + "carry_override": "naked_prisoner", + "weapon_override": "naked_prisoner" + }, + { + "type": "talk_topic", + "id": "TALK_ISHERWOOD_BARRY", + "dynamic_line": { + "u_has_var": "u_saved_barry", + "type": "general", + "context": "meeting", + "value": "yes", + "no": "I can't believe my eyes. Please get my outta here...", + "yes": "Hey, ." + }, + "responses": [ + { + "text": "I've come to take you home, lets go.", + "condition": { "not": { "u_has_var": "u_saved_barry", "type": "general", "context": "meeting", "value": "yes" } }, + "topic": "TALK_MISSION_OFFER", + "effect": "follow", + "assign_mission": "MISSION_ISHERWOOD_BARRY_1" + }, + { + "text": "Hey buddy, feel like talking about what you saw in that tower?", + "topic": "TALK_ISHERWOOD_BARRY_TOWER", + "condition": { "u_has_var": "u_saved_barry", "type": "general", "context": "meeting", "value": "yes" } + }, + { "text": "I'd better get going.", "topic": "TALK_DONE" } + ] + }, + { + "type": "talk_topic", + "id": "TALK_ISHERWOOD_BARRY_TOWER", + "condition": { "u_has_var": "u_saved_barry", "type": "general", "context": "meeting", "value": "yes" }, + "dynamic_line": [ "Yeah, I think we need to talk about it, but I'm not ready yet. Let me reclaim my life for a while. " ], + "responses": [ { "text": "Sounds good, Barry.", "topic": "TALK_DONE" } ] + }, + { + "id": "MISSION_ISHERWOOD_BARRY_1", + "type": "mission_definition", + "name": "Return Barry to Eddie at the dairy.", + "goal": "MGOAL_GO_TO", + "difficulty": 3, + "value": 20000, + "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 } + }, + "end": { + "opinion": { "trust": 5, "value": 5 }, + "effect": [ + "leave", + { "u_add_var": "u_saved_barry", "type": "general", "context": "meeting", "value": "yes" }, + { "u_buy_item": "hsurvivor_suit", "count": 1 } + ] + }, + "origins": [ "ORIGIN_SECONDARY" ], + "dialogue": { + "describe": "I just want to go home.", + "offer": "I can't believe you are here, please take me back to the ranch.", + "accepted": "Thank you, I thought I was dead.", + "rejected": "Please god no!", + "advice": "We shouldn't stay here too long, more might show up.", + "inquire": "How much further?", + "success": "Thanks, we'll never be able to repay you, Here's a token of my gratitude, I made these suits for my family and always keep a few extra around.", + "success_lie": "I don't feel saved...", + "failure": "Tell my family that I love them..." + } + } +] diff --git a/data/json/npcs/isherwood_farm/NPC_Carlos_Isherwood.json b/data/json/npcs/isherwood_farm/NPC_Carlos_Isherwood.json index 3caed2926dce9..9b4553a146676 100644 --- a/data/json/npcs/isherwood_farm/NPC_Carlos_Isherwood.json +++ b/data/json/npcs/isherwood_farm/NPC_Carlos_Isherwood.json @@ -92,7 +92,7 @@ "responses": [ { "text": "What do you need?", "topic": "TALK_MISSION_LIST" }, { - "text": "I heard about Barry, can you tell me what killed him?", + "text": "I heard about Barry, can you tell me what captured him?", "topic": "TALK_CARLOS_BARRY", "condition": { "and": [ @@ -101,14 +101,24 @@ ] } }, - { "text": "Let's talk about something else.", "topic": "TALK_ISHERWOOD_carlos_TOPICS" }, + { "text": "Let's talk about something else.", "topic": "TALK_ISHERWOOD_CARLOS_TOPICS" }, { "text": "I'd better get going.", "topic": "TALK_DONE" } ] }, { "type": "talk_topic", "id": "TALK_CARLOS_BARRY", - "dynamic_line": "It was pink and really fast, it had lots of limbs, definitly not human. It easily kept up with us when we tried to escape, horrifying stuff. We burned the corpse to be safe.", + "dynamic_line": "It was pink and really fast, it had lots of limbs, definitly not human. It easily kept up with us when we tried to escape, horrifying stuff. Barry just dropped to the ground, and the thing swept him away.", + "responses": [ + { "text": "You all just gonna leave him out there to his fate?", "topic": "TALK_CARLOS_BARRY2" }, + { "text": "Let's talk about something else.", "topic": "TALK_ISHERWOOD_CARLOS_TOPICS" }, + { "text": "I'd better get going.", "topic": "TALK_DONE" } + ] + }, + { + "type": "talk_topic", + "id": "TALK_CARLOS_BARRY2", + "dynamic_line": "We tracked it for a while, but lost the trail. Right now we don't have the resources to try to rescue him. Chris has been trying to pick up the trail again and figure out a rescue plan.", "responses": [ { "text": "Let's talk about something else.", "topic": "TALK_ISHERWOOD_CARLOS_TOPICS" }, { "text": "I'd better get going.", "topic": "TALK_DONE" } @@ -143,6 +153,16 @@ "id": "TALK_ISHERWOOD_CARLOS_TOPICS", "dynamic_line": "Go on...", "responses": [ + { + "text": "I heard about Barry, can you tell me what captured him?", + "topic": "TALK_CARLOS_BARRY", + "condition": { + "and": [ + { "u_has_var": "u_learned_about_barry", "type": "general", "context": "meeting", "value": "yes" }, + { "not": { "u_is_wearing": "badge_marshal" } } + ] + } + }, { "text": "Is your forge operational?", "topic": "TALK_CARLOS_FORGE" }, { "text": "Where can I find Chris?", "topic": "TALK_CARLOS_CHRIS" }, { "text": "Can I do anything for you?", "topic": "TALK_MISSION_LIST" }, @@ -159,6 +179,7 @@ "item": "anvil", "count": 1, "origins": [ "ORIGIN_SECONDARY" ], + "has_generic_rewards": false, "followup": "MISSION_ISHERWOOD_CARLOS_2", "dialogue": { "describe": "I need an anvil to do advanced metal work.", @@ -167,16 +188,13 @@ "rejected": "Thanks anyway, we'll find the time to make it ourselves.", "advice": "If you can't find one, maybe you can make one for me.", "inquire": "Do you have the anvil?", - "success": "I appreciate it, this will really make a difference, here's some horse armor I've been working on, eventually I'll have the whole herd outfitted.", + "success": "I appreciate it, this will really make a difference, here's some horse armor I've been working on. Eventually I'll have the whole herd outfitted.", "success_lie": "What good does this do me?", "failure": "It was a lost cause anyways..." }, "end": { "opinion": { "trust": 1, "value": 1 }, - "effect": [ - { "u_buy_item": "chainmail_armor_horse", "count": 1 }, - { "u_add_var": "u_did_carlos_missions", "type": "general", "context": "recruit", "value": "yes" } - ], + "effect": [ { "u_buy_item": "leather_armor_horse", "count": 1 } ], "update_mapgen": [ { "om_terrain": "horse_farm_isherwood_4", @@ -197,15 +215,23 @@ "assign_mission_target": { "om_terrain": "cabin_isherwood", "reveal_radius": 1, "random": true, "search_range": 20, "min_distance": 8 }, "update_mapgen": { "place_npcs": [ { "class": "isherwood_chris", "x": 8, "y": 17, "target": true } ] } }, + "end": { + "opinion": { "trust": 1, "value": 1 }, + "effect": [ + { "u_buy_item": "chainmail_armor_horse", "count": 1 }, + { "u_add_var": "u_did_carlos_missions", "type": "general", "context": "recruit", "value": "yes" } + ] + }, "origins": [ "ORIGIN_SECONDARY" ], + "has_generic_rewards": false, "dialogue": { - "describe": "Our son still isn't back, I'm getting concerned.", + "describe": "Chris hasn't come back from his latest search for Barry, I'm getting concerned.", "offer": "Can you go find my son and tell him to check in with us.", "accepted": "Thank you.", "rejected": "Oh well. I hope he turns up soon.", - "advice": "He should be on the property somewhere, maybe by that old cabin near the entrance, sometimes he camps there.", + "advice": "He might be on the property somewhere, maybe by that old cabin near the entrance, sometimes he camps there.", "inquire": "How is the search going?", - "success": "Thanks, I was getting ready to go look myself.", + "success": "Thanks, I was getting ready to go look myself. Now that I have the anvil, I've been working on new armor for the horses, take this prototype I made.", "success_lie": "What good does this do us?", "failure": "I hope he didn't meet Barry's fate..." } diff --git a/data/json/npcs/isherwood_farm/NPC_Chris_Isherwood.json b/data/json/npcs/isherwood_farm/NPC_Chris_Isherwood.json index 5076381beda13..6de2d3f80616a 100644 --- a/data/json/npcs/isherwood_farm/NPC_Chris_Isherwood.json +++ b/data/json/npcs/isherwood_farm/NPC_Chris_Isherwood.json @@ -52,12 +52,12 @@ "condition": { "u_is_wearing": "badge_marshal" } }, { - "text": "Hi, Your dad asked me to come find you.", + "text": "Hi, Your dad asked me to come find you, said you've been looking for your Uncle.", "topic": "TALK_ISHERWOOD_CHRIS_TALK1", "effect": { "u_add_var": "u_met_chris_isherwood", "type": "general", "context": "meeting", "value": "yes" } }, { - "text": "I was talking to Luke earlier, said you had some interesting ideas about the world ending.", + "text": "I was talking to Luke earlier, said you had some interesting ideas about the world ending. Is it tied to Barry's abduction?", "topic": "TALK_CHRIS_THEORIES", "condition": { "and": [ @@ -106,7 +106,7 @@ { "type": "talk_topic", "id": "TALK_CHRIS_THEORIES", - "dynamic_line": "In one of my longer trips I saw something out in a field, I didn't get close but I swear unbelievable monsters were coming out of it. It kinda shimmered, almost like it wasn't quite there. I followed the monsters for a while...", + "dynamic_line": "In one of my longer trips looking for Barry, I saw something out in a field. I didn't get close but I swear unbelievable monsters were coming out of it. It kinda shimmered, almost like it wasn't quite there. I've been tracking those monsters for a while...", "responses": [ { "text": "What did you find?", "topic": "TALK_ISHERWOOD_CHRIS_MIGO_BASE" }, { "text": "Let's talk about something else.", "topic": "TALK_ISHERWOOD_CHRIS_TOPICS" }, @@ -116,19 +116,13 @@ { "type": "talk_topic", "id": "TALK_ISHERWOOD_CHRIS_MIGO_BASE", - "dynamic_line": "They made their way to this weird structure, I've never seen anything like it, it glistened in the sun like something organic...", - "responses": [ - { "text": "If you join up with me, we can go check it out.", "topic": "TALK_SUGGEST_GO_CHRIS" }, - { "text": "Let's talk about something else.", "topic": "TALK_ISHERWOOD_CHRIS_TOPICS" }, - { "text": "I'd better get going.", "topic": "TALK_DONE" } - ] - }, - { - "type": "talk_topic", - "id": "TALK_SUGGEST_GO_CHRIS", - "dynamic_line": "Yeah, I'll join with you, I hope we can come back and check on my family some occasionally. Getting some information is more important now though.", + "dynamic_line": "They made their way to this weird spire like structure, I've never seen anything like it, it glistened in the sun like something organic. I think they could be holding Barry there, I've seen them arrive and leave with other humans.", "responses": [ - { "text": "What is this place we are going to?", "topic": "TALK_MISSION_LIST" }, + { + "text": "If you join up with me, we can go check it out, I want to see what they are doing.", + "topic": "TALK_MISSION_OFFER", + "assign_mission": "MISSION_ISHERWOOD_CHRIS_1" + }, { "text": "Let's talk about something else.", "topic": "TALK_ISHERWOOD_CHRIS_TOPICS" }, { "text": "I'd better get going.", "topic": "TALK_DONE" } ] @@ -153,7 +147,10 @@ "id": "TALK_ISHERWOOD_CHRIS_TOPICS", "dynamic_line": "Go on...", "responses": [ - { "text": "Your dad asked me to come find you.", "topic": "TALK_ISHERWOOD_CHRIS_TALK1" }, + { + "text": "Your dad asked me to come find you, said you've been looking for your Uncle.", + "topic": "TALK_ISHERWOOD_CHRIS_TALK1" + }, { "text": "I was talking to Luke earlier, he said you had some interesting ideas about the world ending.", "topic": "TALK_CHRIS_THEORIES" @@ -165,24 +162,26 @@ { "id": "MISSION_ISHERWOOD_CHRIS_1", "type": "mission_definition", - "name": "Find mysterious structure", - "goal": "MGOAL_GO_TO_TYPE", + "name": "Free Barry from the mysterious structure", + "goal": "MGOAL_TALK_TO_NPC", "difficulty": 5, "value": 50000, "start": { "effect": "follow", - "assign_mission_target": { "om_terrain": "mi-go_camp2", "om_special": "Mi-Go Encampment", "reveal_radius": 3 } + "assign_mission_target": { "om_terrain": "mi-go_scout_tower_3", "om_special": "Mi-Go Scout Tower", "reveal_radius": 3 }, + "update_mapgen": { "place_npcs": [ { "class": "isherwood_barry", "x": 18, "y": 15, "target": true } ] } }, "origins": [ "ORIGIN_SECONDARY" ], - "destination": "mi-go_camp2", + "has_generic_rewards": false, + "destination": "mi-go_scout_tower_3", "dialogue": { - "describe": "We need to investigate the alien encampment.", - "offer": "I can take you to the structure those things were building.", + "describe": "We need to investigate the alien encampment and try to find out what happened to Barry.", + "offer": "I can take you to the structure, I tracked them to it.", "accepted": "Awesome, I want some answers!", - "rejected": "Thanks anyway, I'll keep my eye on it.", + "rejected": "Thanks anyway, I'll keep my eye on it, maybe I'll find a way one day.", "advice": "I feel like we are underprepared if they see us, I marked the location for you.", "inquire": "You ready?", - "success": "It's even bigger then I remember, we should explore some. I left a note for my family before we left. If we survive, the cabin should be fixed up and ready for you to move in if you want to stay.", + "success": "It's taller then I remember, we should look for prisoners. I left a note for my family before we left. If we survive, the cabin should be fixed up and ready for you to move in if you want to stay.", "success_lie": "Well it was here...", "failure": "It was a lost cause anyways..." }, diff --git a/data/json/npcs/isherwood_farm/NPC_Claire_Isherwood.json b/data/json/npcs/isherwood_farm/NPC_Claire_Isherwood.json index afffc773f8a80..d130fa040ebe5 100644 --- a/data/json/npcs/isherwood_farm/NPC_Claire_Isherwood.json +++ b/data/json/npcs/isherwood_farm/NPC_Claire_Isherwood.json @@ -188,10 +188,17 @@ "type": "talk_topic", "id": "TALK_BARRY", "dynamic_line": "Some of their cows were killed before we realized what was happening, Barry and Carlos went into the forest to find the predator but it was like nothing they'd ever seen. Carlos may be willing to tell you more.", - "effect": { "u_add_var": "u_learned_about_barry", "type": "general", "context": "meeting", "value": "yes" }, "responses": [ - { "text": "I'd like to ask you something else...", "topic": "TALK_ISHERWOOD_CLAIRE_TOPICS" }, - { "text": "I'd better get going.", "topic": "TALK_DONE" } + { + "text": "I'd like to ask you something else...", + "topic": "TALK_ISHERWOOD_CLAIRE_TOPICS", + "effect": { "u_add_var": "u_learned_about_barry", "type": "general", "context": "meeting", "value": "yes" } + }, + { + "text": "I'd better get going.", + "topic": "TALK_DONE", + "effect": { "u_add_var": "u_learned_about_barry", "type": "general", "context": "meeting", "value": "yes" } + } ] }, { @@ -261,6 +268,7 @@ "item": "raw_dandelion", "count": 50, "origins": [ "ORIGIN_SECONDARY" ], + "has_generic_rewards": false, "followup": "MISSION_ISHERWOOD_CLAIRE_2", "end": { "opinion": { "trust": 1, "value": 1 }, @@ -300,6 +308,7 @@ ] }, "origins": [ "ORIGIN_SECONDARY" ], + "has_generic_rewards": false, "dialogue": { "describe": "I could use some seeds from the forest.", "offer": "We could use some seeds for the next planting season. Can you bring me 20 bee balm seeds?", @@ -320,6 +329,7 @@ "difficulty": 4, "value": 100000, "origins": [ "ORIGIN_SECONDARY" ], + "has_generic_rewards": false, "start": { "assign_mission_target": { "om_terrain": "cabin_isherwood", "reveal_radius": 1, "random": true, "search_range": 20, "min_distance": 8 }, "update_mapgen": { "place_monster": [ { "monster": "mon_cat", "pack_size": [ 3, 6 ], "x": 20, "y": 22, "target": true } ] }, diff --git a/data/json/npcs/isherwood_farm/NPC_Eddie_Isherwood.json b/data/json/npcs/isherwood_farm/NPC_Eddie_Isherwood.json index 17547df614130..ea6ef6380bd04 100644 --- a/data/json/npcs/isherwood_farm/NPC_Eddie_Isherwood.json +++ b/data/json/npcs/isherwood_farm/NPC_Eddie_Isherwood.json @@ -126,7 +126,7 @@ { "type": "talk_topic", "id": "TALK_ISHERWOOD_EDDIE2", - "dynamic_line": "Barry and Carlos went to hunt down something that killed our livestock, they tracked it into the forest. It tore Barry apart, Carlos might be willing to tell you the story, he survived it.", + "dynamic_line": "Barry and Carlos went to hunt down something that killed our livestock, they tracked it into the forest. It grabbed Barry and ran off, Carlos might be willing to tell you the story, he managed to allude it.", "responses": [ { "text": "Let's talk about something else.", "topic": "TALK_ISHERWOOD_EDDIE_TOPICS" }, { "text": "I'd better get going.", "topic": "TALK_DONE" } @@ -200,6 +200,7 @@ "item": "rock", "count": 120, "origins": [ "ORIGIN_SECONDARY" ], + "has_generic_rewards": false, "followup": "MISSION_ISHERWOOD_EDDIE_2", "dialogue": { "describe": "We need to build some kilns.", @@ -247,6 +248,7 @@ "effect": [ { "u_buy_item": "butter", "count": 6 }, { "u_buy_item": "milk", "container": "jar_3l_glass_sealed", "count": 12 } ] }, "origins": [ "ORIGIN_SECONDARY" ], + "has_generic_rewards": false, "dialogue": { "describe": "I do have some resource gathering I could use help with.", "offer": "Now that the forge is set up, we could use 2000 units of sand to get production going.", @@ -278,6 +280,7 @@ ] }, "origins": [ "ORIGIN_SECONDARY" ], + "has_generic_rewards": false, "dialogue": { "describe": "I do have some resource gathering I could use help if you have time.", "offer": "Now that the clay kiln is set up, we could use 1000 units of clay to get production going.", diff --git a/data/json/npcs/isherwood_farm/NPC_Jack_Isherwood.json b/data/json/npcs/isherwood_farm/NPC_Jack_Isherwood.json index f415b0bd9ed21..eafa4216183c2 100644 --- a/data/json/npcs/isherwood_farm/NPC_Jack_Isherwood.json +++ b/data/json/npcs/isherwood_farm/NPC_Jack_Isherwood.json @@ -240,7 +240,7 @@ { "type": "talk_topic", "id": "TALK_JACK_BROTHER", - "dynamic_line": "Eddie's dairy is at the end of the road. It's just him and his son since Barry died to that thing in the woods, we tracked it down and burned the corpse.", + "dynamic_line": "Eddie's dairy is at the end of the road. It's just him and his son since Barry was taken by that thing in the woods.", "effect": { "u_add_var": "u_learned_about_eddie", "type": "general", "context": "meeting", "value": "yes" }, "responses": [ { "text": "Let's talk about something else.", "topic": "TALK_ISHERWOOD_JACK_TOPICS" }, @@ -312,6 +312,7 @@ "item": "jar_3l_glass", "count": 20, "origins": [ "ORIGIN_SECONDARY" ], + "has_generic_rewards": false, "followup": "MISSION_ISHERWOOD_JACK_2", "end": { "opinion": { "trust": 1, "value": 1 }, @@ -348,6 +349,7 @@ ] }, "origins": [ "ORIGIN_SECONDARY" ], + "has_generic_rewards": false, "dialogue": { "describe": "I do have some more scavenging for you.", "offer": "We could use some seeds for the next planting season. Can you bring me 100 wheat seeds? I'll give you some fresh produce.", diff --git a/data/json/npcs/isherwood_farm/NPC_Jesse_Isherwood.json b/data/json/npcs/isherwood_farm/NPC_Jesse_Isherwood.json index f0cb20d1a709e..a183501dd61da 100644 --- a/data/json/npcs/isherwood_farm/NPC_Jesse_Isherwood.json +++ b/data/json/npcs/isherwood_farm/NPC_Jesse_Isherwood.json @@ -130,7 +130,7 @@ "topic": "TALK_JESSE_CHRIS" }, { "text": "What needs killing?", "topic": "TALK_MISSION_LIST" }, - { "text": "Let's talk about something else.", "topic": "TALK_ISHERWOOD_Jesse_TOPICS" }, + { "text": "Let's talk about something else.", "topic": "TALK_ISHERWOOD_JESSE_TOPICS" }, { "text": "I'm not interested right now, I'd better get going.", "topic": "TALK_DONE" } ] }, @@ -193,7 +193,34 @@ "assign_mission_target": { "om_terrain": "forest_thick", "reveal_radius": 1, "random": true, "search_range": 20, "min_distance": 8 }, "update_mapgen": { "place_monster": [ { "monster": "mon_wolf", "pack_size": [ 4, 8 ], "x": 3, "y": 9, "target": true } ] } }, - "origins": [ "ORIGIN_ANY_NPC" ], + "origins": [ "ORIGIN_SECONDARY" ], + "has_generic_rewards": false, + "dialogue": { + "describe": "We could use some help killing some wolves.", + "offer": "There's been some wolves that keep scaring our chickens and horses, I'd be grateful if you can kill them.", + "accepted": "Wonderful, let me know when it is done.", + "rejected": "Thanks anyway, we will try some traps.", + "advice": "A gun will probably help.", + "inquire": "Did you kill it?", + "success": "I appreciate it, I've got this old saddle I want you to have. I'll be happy to put a horse under it if you want to do some more heroics.", + "success_lie": "Show me the bodies.", + "failure": "It was a lost cause anyways..." + }, + "end": { "opinion": { "trust": 1, "value": 1 }, "effect": [ { "u_buy_item": "riding_saddle", "count": 1 } ] } + }, + { + "id": "MISSION_ISHERWOOD_JESSE_2", + "type": "mission_definition", + "name": "Kill monster", + "goal": "MGOAL_KILL_MONSTER", + "difficulty": 8, + "value": 80000, + "start": { + "assign_mission_target": { "om_terrain": "forest_thick", "reveal_radius": 1, "random": true, "search_range": 20, "min_distance": 15 }, + "update_mapgen": { "place_monster": [ { "monster": "mon_flying_polyp", "pack_size": [ 3, 6 ], "x": 11, "y": 11, "target": true } ] } + }, + "origins": [ "ORIGIN_SECONDARY" ], + "has_generic_rewards": false, "dialogue": { "describe": "We could use some help killing some wolves.", "offer": "There's been some wolves that keep scaring our chickens and horses, I'd be grateful if you can kill them.", @@ -219,6 +246,7 @@ "update_mapgen": { "place_monster": [ { "monster": "mon_flying_polyp", "pack_size": [ 3, 6 ], "x": 11, "y": 11, "target": true } ] } }, "origins": [ "ORIGIN_SECONDARY" ], + "has_generic_rewards": false, "dialogue": { "describe": "We could use some help killing some monsters.", "offer": "We could use some help killing a pack of monsters. I don't know what they are, but they're very fast, I'm willing to outfit you with a horse if you succeed.", diff --git a/data/json/npcs/isherwood_farm/NPC_Luke_Isherwood.json b/data/json/npcs/isherwood_farm/NPC_Luke_Isherwood.json index 81318d3526e39..ca1ea92930f74 100644 --- a/data/json/npcs/isherwood_farm/NPC_Luke_Isherwood.json +++ b/data/json/npcs/isherwood_farm/NPC_Luke_Isherwood.json @@ -108,7 +108,7 @@ { "type": "talk_topic", "id": "TALK_LUKE_EDDIE", - "dynamic_line": "Things have been tough for my dad since the hunting incident. He works till he falls asleep most nights..", + "dynamic_line": "Things have been tough for my dad since Barry was captured. He works till he falls asleep most nights..", "condition": { "and": [ { "not": { "u_is_wearing": "badge_marshal" } }, @@ -184,7 +184,7 @@ { "id": "MISSION_ISHERWOOD_LUKE_2", "type": "mission_definition", - "name": "Find a cooy of DIY Compendium", + "name": "Find a copy of DIY Compendium", "goal": "MGOAL_FIND_ITEM", "difficulty": 3, "value": 20000, diff --git a/data/json/npcs/missiondef.json b/data/json/npcs/missiondef.json index ccd30f67a9885..299b6133f5435 100644 --- a/data/json/npcs/missiondef.json +++ b/data/json/npcs/missiondef.json @@ -698,7 +698,7 @@ "difficulty": 2, "value": 800, "item": "family_photo", - "origins": [ "ORIGIN_ANY_NPC" ], + "origins": [ "ORIGIN_SECONDARY" ], "dialogue": { "describe": "I need you to get my family photo from the armory safe.", "offer": "I left the only photo I have from my family in the armory. I don't have the code, can you get in?", @@ -787,6 +787,7 @@ }, "difficulty": 1, "value": 0, + "has_generic_rewards": false, "origins": [ "ORIGIN_OPENER_NPC", "ORIGIN_ANY_NPC" ], "start": { "effect": [ { "u_buy_item": "duffelbag" } ], diff --git a/data/json/npcs/npc.json b/data/json/npcs/npc.json index 219d3dc195796..8be2d3fd8fec7 100644 --- a/data/json/npcs/npc.json +++ b/data/json/npcs/npc.json @@ -53,7 +53,7 @@ "attitude": 8, "mission": 0, "chat": "TALK_DONE", - "faction": "wasteland_scavengers" + "faction": "no_faction" }, { "type": "npc", @@ -64,7 +64,7 @@ "attitude": 0, "mission": 7, "chat": "TALK_NC_SURVIVOR_CHEF", - "faction": "wasteland_scavengers" + "faction": "no_faction" }, { "type": "npc", @@ -76,7 +76,7 @@ "mission": 7, "chat": "TALK_TRUE_FOODPERSON", "mission_offered": "MISSION_PROVE_YOUR_WORTH", - "faction": "wasteland_scavengers" + "faction": "no_faction" }, { "type": "npc", @@ -87,7 +87,7 @@ "attitude": 1, "mission": 0, "chat": "TALK_CYBORG_1", - "faction": "wasteland_scavengers" + "faction": "no_faction" }, { "type": "npc", @@ -99,7 +99,7 @@ "mission": 7, "mission_offered": "MISSION_GET_CITY_COP_MOMENTO", "chat": "TALK_CITY_COP", - "faction": "wasteland_scavengers" + "faction": "no_faction" }, { "type": "npc", @@ -109,6 +109,7 @@ "attitude": 1, "mission": 3, "mission_offered": "MISSION_JOIN_TRACKER", - "chat": "TALK_STRANGER_FRIENDLY" + "chat": "TALK_STRANGER_FRIENDLY", + "faction": "no_faction" } ] diff --git a/data/json/npc_behavior.json b/data/json/npcs/npc_behavior.json similarity index 100% rename from data/json/npc_behavior.json rename to data/json/npcs/npc_behavior.json diff --git a/data/json/npcs/prisoners/mi-go_prisoners.json b/data/json/npcs/prisoners/mi-go_prisoners.json index 1f10124f9b9f8..0009c8f07ea95 100644 --- a/data/json/npcs/prisoners/mi-go_prisoners.json +++ b/data/json/npcs/prisoners/mi-go_prisoners.json @@ -8,12 +8,13 @@ "attitude": 0, "mission": 7, "chat": "TALK_MI-GO_PRISONER1", - "faction": "wasteland_scavengers" + "faction": "no_faction" }, { "type": "npc_class", "id": "NC_PRISONER", "name": "Prisoner", + "common": false, "job_description": "I'm just trying to survive.", "traits": [ { "group": "BG_survival_story_EVACUEE" }, { "group": "NPC_starting_traits" }, { "group": "Appearance_demographics" } ], "skills": [ { "skill": "ALL", "level": { "sum": [ { "dice": [ 3, 3 ] }, { "constant": -5 } ] } } ], diff --git a/data/json/npcs/refugee_center/beggars/BEGGAR_1_Reena_Sandhu.json b/data/json/npcs/refugee_center/beggars/BEGGAR_1_Reena_Sandhu.json index 73661b31ca868..1dab7ecbb330b 100644 --- a/data/json/npcs/refugee_center/beggars/BEGGAR_1_Reena_Sandhu.json +++ b/data/json/npcs/refugee_center/beggars/BEGGAR_1_Reena_Sandhu.json @@ -136,16 +136,8 @@ "id": "TALK_REFUGEE_BEGGAR_1_GIVE_FOOD", "dynamic_line": "Thank you so much.", "responses": [ - { - "text": "Can I ask you something else first?", - "topic": "TALK_NONE", - "opinion": { "trust": [ -1, 0 ], "value": [ -1, 0 ] } - }, - { - "text": "I'm sorry, I was wrong. I can't help you.", - "topic": "TALK_DONE", - "opinion": { "trust": [ -1, 0 ], "value": [ -1, 0 ] } - } + { "text": "Can I ask you something else first?", "topic": "TALK_NONE" }, + { "text": "I'm sorry, I was wrong. I can't help you.", "topic": "TALK_DONE" } ], "repeat_responses": [ { @@ -153,7 +145,7 @@ "response": { "text": "Here, you can have this .", "topic": "TALK_REFUGEE_BEGGAR_1_GAVE_FOOD", - "opinion": { "trust": [ 0, 2 ], "value": [ 0, 2 ], "fear": [ -1, 0 ], "anger": [ -1, 0 ], "owed": 1 } + "opinion": { "trust": 1, "value": 1, "fear": -1, "anger": -1, "owed": 1 } } } ] diff --git a/data/json/npcs/refugee_center/beggars/BEGGAR_3_Luo_Meizhen.json b/data/json/npcs/refugee_center/beggars/BEGGAR_3_Luo_Meizhen.json index 5846fb07aaccf..c31c0a42d5ba3 100644 --- a/data/json/npcs/refugee_center/beggars/BEGGAR_3_Luo_Meizhen.json +++ b/data/json/npcs/refugee_center/beggars/BEGGAR_3_Luo_Meizhen.json @@ -162,16 +162,8 @@ "id": "TALK_REFUGEE_BEGGAR_3_GIVE_FOOD", "dynamic_line": "Actually yeah, I'm always hungry these days. I don't like taking handouts, but I wouldn't say no.", "responses": [ - { - "text": "Actually can I ask you something else?", - "topic": "TALK_NONE", - "opinion": { "trust": [ -1, 0 ], "value": [ -1, 0 ] } - }, - { - "text": "I'm sorry, I was wrong. I can't help you.", - "topic": "TALK_DONE", - "opinion": { "trust": [ -1, 0 ], "value": [ -1, 0 ] } - } + { "text": "Actually can I ask you something else?", "topic": "TALK_NONE" }, + { "text": "I'm sorry, I was wrong. I can't help you.", "topic": "TALK_DONE" } ], "repeat_responses": [ { @@ -179,7 +171,7 @@ "response": { "text": "Here, you can have this .", "topic": "TALK_REFUGEE_BEGGAR_3_GAVE_FOOD", - "opinion": { "trust": [ 0, 1 ], "value": [ 0, 2 ], "fear": [ -1, 0 ], "anger": [ -1, 0 ], "owed": 1 } + "opinion": { "trust": 1, "value": 1, "fear": -1, "anger": -1, "owed": 1 } } } ] diff --git a/data/json/npcs/refugee_center/beggars/BEGGAR_4_Brandon_Garder.json b/data/json/npcs/refugee_center/beggars/BEGGAR_4_Brandon_Garder.json index 2a2d9c4013052..81e40213b77bc 100644 --- a/data/json/npcs/refugee_center/beggars/BEGGAR_4_Brandon_Garder.json +++ b/data/json/npcs/refugee_center/beggars/BEGGAR_4_Brandon_Garder.json @@ -131,7 +131,7 @@ "response": { "text": "Here, you can have this .", "topic": "TALK_REFUGEE_BEGGAR_4_GAVE_FOOD", - "opinion": { "trust": [ 0, 1 ], "value": [ 0, 2 ], "fear": [ -1, 0 ], "anger": [ -1, 0 ], "owed": 2 } + "opinion": { "trust": 1, "value": 1, "fear": -1, "anger": -1, "owed": 2 } } } ] diff --git a/data/json/npcs/refugee_center/surface_refugees/NPC_Alonso_Lautrec.json b/data/json/npcs/refugee_center/surface_refugees/NPC_Alonso_Lautrec.json index 9e208a04cbe61..5e5374585e1d9 100644 --- a/data/json/npcs/refugee_center/surface_refugees/NPC_Alonso_Lautrec.json +++ b/data/json/npcs/refugee_center/surface_refugees/NPC_Alonso_Lautrec.json @@ -184,6 +184,12 @@ { "text": "I'll leave you to it then.", "topic": "TALK_DONE" } ] }, + { + "type": "talk_topic", + "id": "TALK_REFUGEE_Alonso_CalledOut3", + "dynamic_line": "Fine. As a favor to you, I'll be a guy from Brooklyn.", + "responses": [ { "text": "Thanks. I'd better get going.", "topic": "TALK_DONE" } ] + }, { "type": "talk_topic", "id": "TALK_REFUGEE_Alonso_Background", diff --git a/data/json/npcs/refugee_center/surface_refugees/NPC_Mandeep_Singh.json b/data/json/npcs/refugee_center/surface_refugees/NPC_Mandeep_Singh.json index 072cfb78572e0..9a627e5bd66fc 100644 --- a/data/json/npcs/refugee_center/surface_refugees/NPC_Mandeep_Singh.json +++ b/data/json/npcs/refugee_center/surface_refugees/NPC_Mandeep_Singh.json @@ -114,7 +114,7 @@ "id": "TALK_REFUGEE_Mandeep_1_firstmeet", "dynamic_line": "It is nice to meet you as well. Can I help you with something?", "responses": [ - { "text": "I just had some questions.", "topic": "TALK_REFUGEE_Mandeep_2_stub" }, + { "text": "I just had some questions.", "topic": "TALK_REFUGEE_Mandeep_2" }, { "text": "Actually I'm just heading out.", "topic": "TALK_DONE" } ] }, 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 ff4fa0e4abf44..1d84a93b2f264 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 @@ -125,7 +125,7 @@ [ "sunglasses", 15 ], [ "glasses_safety", 15 ], [ "goggles_ski", 5 ], - [ "chestrig", 20 ], + [ "tacvest", 20 ], [ "legrig", 15 ], [ "tool_belt", 15 ], [ "fanny", 5 ], @@ -424,7 +424,12 @@ "effect": [ { "u_buy_item": "FMCNote", "count": 25 }, { "u_add_var": "FMShopkeep_Mission1", "type": "mission", "context": "flag", "value": "yes" } - ] + ], + "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 } ] + } }, "origins": [ "ORIGIN_SECONDARY" ], "followup": "MISSION_FREE_MERCHANTS_EVAC_2", @@ -549,7 +554,15 @@ "effect": [ { "u_buy_item": "FMCNote", "count": 50 }, { "u_add_var": "FMShopkeep_Mission3", "type": "mission", "context": "flag", "value": "yes" } - ] + ], + "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 } + ] + } }, "origins": [ "ORIGIN_SECONDARY" ], "followup": "MISSION_FREE_MERCHANTS_EVAC_4", @@ -560,7 +573,7 @@ "rejected": "Come back when you get a chance, we really need to start reclaiming the region.", "advice": "Just follow your map.", "inquire": "Do you have the prospectus?", - "success": "With this we'll be able to convince others to invest in the commune. Thank you, here's your money.", + "success": "With this we'll be able to convince others to invest in the commune. Thank you, here's your money. We also managed to get a manual crank hooked up to the garage in the back, so feel free to make use of that - you've been a great help to us.", "success_lie": "What good does this do us?", "failure": "It was a lost cause anyways..." } diff --git a/data/json/npcs/robofac/NC_ROBOFAC_FIELD_RESEARCHER.json b/data/json/npcs/robofac/NC_ROBOFAC_FIELD_RESEARCHER.json index 7ea0a69fbb363..a56a7ee4d40a3 100644 --- a/data/json/npcs/robofac/NC_ROBOFAC_FIELD_RESEARCHER.json +++ b/data/json/npcs/robofac/NC_ROBOFAC_FIELD_RESEARCHER.json @@ -9,7 +9,7 @@ { "item": "robofac_enviro_suit" }, { "item": "mask_gas" }, { "collection": [ { "group": "guns_pistol_milspec" }, { "item": "holster" } ], "prob": 50 }, - { "item": "chestrig" } + { "item": "tacvest" } ] } ] diff --git a/data/json/npcs/robofac/NPC_ROBOFAC_INTERCOM.json b/data/json/npcs/robofac/NPC_ROBOFAC_INTERCOM.json index 5895e05190356..f1a0f211bc322 100644 --- a/data/json/npcs/robofac/NPC_ROBOFAC_INTERCOM.json +++ b/data/json/npcs/robofac/NPC_ROBOFAC_INTERCOM.json @@ -90,6 +90,7 @@ ] }, "origins": [ "ORIGIN_SECONDARY" ], + "has_generic_rewards": false, "followup": "MISSION_ROBOFAC_INTERCOM_2", "dialogue": { "describe": "No, I said ... [*You hear a short, muffled conversation from across the intercom*]/nWell, it seems we do have a use for you. It's dangerous and you are likely to die, but if you complete it we will allow you limited access to our resources.", @@ -123,11 +124,17 @@ "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 } ] } ], "effect": [ { "u_buy_item": "RobofacCoin", "count": 2 } ] }, "origins": [ "ORIGIN_SECONDARY" ], + "has_generic_rewards": false, "followup": "MISSION_ROBOFAC_INTERCOM_3", "dialogue": { "describe": "...", @@ -163,6 +170,7 @@ }, "end": { "effect": [ { "u_buy_item": "RobofacCoin", "count": 4 } ] }, "origins": [ "ORIGIN_SECONDARY" ], + "has_generic_rewards": false, "dialogue": { "describe": "...", "offer": "Our facility once sourced advanced photonic circuitry from a nearby robotics manufacturer. Their building suffered major damage during the portal storms, and collapsed almost entirely. However, preliminary scouting reveals that the basement prototyping lab likely remains intact.\n\nthe intercom: We ask you to investigate the ruins, and if possible, retrieve a template for the fabrication of said photonic circuitry.", @@ -302,7 +310,7 @@ "dynamic_line": "Given the current context, we are willing to sell you a set of our protective gear: gas mask, suit and gear, at a considerable discount. We will sell it for two of our coins.\n\nthe intercom: Hmm wait, we might not have your size...", "responses": [ { - "text": "[ 2 Hub 01 Gold Coins ] Deal!", + "text": "[ 2 HGC ] Deal!", "condition": { "u_has_item": "RobofacCoin" }, "effect": [ { "u_sell_item": "RobofacCoin", "count": 2 }, diff --git a/data/json/npcs/robofac/NPC_ROBOFAC_MERC_1.json b/data/json/npcs/robofac/NPC_ROBOFAC_MERC_1.json new file mode 100644 index 0000000000000..ce9dfa840a4b7 --- /dev/null +++ b/data/json/npcs/robofac/NPC_ROBOFAC_MERC_1.json @@ -0,0 +1,224 @@ +[ + { + "type": "npc", + "id": "robofac_merc_1", + "//": "Appears in the the surface of Hub 01, an external mercenary.", + "name_suffix": "Hub Mercenary", + "class": "NC_ROBOFAC_MERC_1", + "attitude": 0, + "mission": 7, + "chat": "TALK_ROBOFAC_MERC_1", + "faction": "robofac_auxiliaries" + }, + { + "type": "npc_class", + "id": "NC_ROBOFAC_MERC_1", + "name": "Hub Mercenary", + "job_description": "Fighting for the all-mighty dollar.", + "common": false, + "traits": [ { "trait": "TOUGH" }, { "trait": "QUICK" }, { "group": "Appearance_demographics" } ], + "bonus_str": { "rng": [ 1, 3 ] }, + "bonus_dex": { "rng": [ -1, 2 ] }, + "bonus_int": { "rng": [ -1, 1 ] }, + "bonus_per": { "rng": [ 0, 1 ] }, + "worn_override": "NC_ROBOFAC_MERC_1_worn", + "carry_override": "NC_ROBOFAC_MERC_1_carry", + "weapon_override": "NC_ROBOFAC_MERC_1_wield", + "skills": [ + { "skill": "ALL", "level": { "mul": [ { "one_in": 3 }, { "sum": [ { "dice": [ 2, 2 ] }, { "rng": [ 0, -4 ] } ] } ] } }, + { "skill": "gun", "bonus": { "rng": [ 2, 5 ] } }, + { "skill": "melee", "bonus": { "rng": [ 2, 5 ] } }, + { "skill": "cutting", "bonus": { "rng": [ 2, 5 ] } }, + { "skill": "rifle", "bonus": { "rng": [ 3, 6 ] } } + ] + }, + { + "type": "item_group", + "id": "NC_ROBOFAC_MERC_1_worn", + "subtype": "collection", + "items": [ + { "item": "modularvestkevlar", "contents-group": "army_mags_m4" }, + { "item": "chestrig", "contents-group": "army_mags_m4" }, + { "item": "under_armor" }, + { "item": "under_armor_shorts" }, + { "item": "robofac_enviro_suit" }, + { "item": "slingpack" }, + { "item": "armguard_hard" }, + { "item": "legguard_hard" }, + { "item": "knife_combat", "container-item": "bootsheath" } + ] + }, + { + "type": "item_group", + "id": "NC_ROBOFAC_MERC_1_carry", + "subtype": "collection", + "items": [ + { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, + { "item": "stanag30", "ammo-item": "556", "charges": 30 }, + { "item": "EMPbomb" }, + { "item": "bot_grenade_hack", "count": 2 } + ] + }, + { + "type": "item_group", + "id": "NC_ROBOFAC_MERC_1_wield", + "subtype": "collection", + "items": [ + { "item": "acr", "ammo-item": "556", "charges": 30, "contents-item": [ "shoulder_strap", "holo_sight", "suppressor" ] } + ] + }, + { + "id": "TALK_ROBOFAC_MERC_1", + "type": "talk_topic", + "dynamic_line": [ "Something to say?", "I charge hourly, so be quick...", "Hey.", "...", "Yes?", "What's up?", "Good to see you." ], + "responses": [ + { + "text": "Who are you?", + "condition": { "not": { "u_has_var": "robofac_merc_1_stay", "type": "dialogue", "context": "robofac_merc_1", "value": "yes" } }, + "topic": "TALK_ROBOFAC_MERC_1_WHO" + }, + { + "text": "Good to see you around.", + "condition": { "u_has_var": "robofac_merc_1_stay", "type": "dialogue", "context": "robofac_merc_1", "value": "yes" }, + "topic": "TALK_ROBOFAC_MERC_1_MAIN" + }, + { + "text": "Want help with something else?", + "condition": { "u_has_var": "gold_mission_complete", "type": "general", "context": "robofac_merc_1", "value": "yes" }, + "topic": "TALK_MISSION_LIST" + }, + { "text": "Never mind, I was about to leave.", "topic": "TALK_DONE" } + ] + }, + { + "id": "TALK_ROBOFAC_MERC_1_WHO", + "type": "talk_topic", + "dynamic_line": "Same as you. Some nobody doing dirty work for scraps, I mean, no offense.", + "responses": [ + { "text": "I guess that makes two of us.", "topic": "TALK_ROBOFAC_MERC_1_TWO_OF_US" }, + { "text": "Well, never mind.", "topic": "TALK_DONE" } + ] + }, + { + "id": "TALK_ROBOFAC_MERC_1_TWO_OF_US", + "type": "talk_topic", + "dynamic_line": "Good. I could do with some company between jobs. Feel free to stay around, if you want.", + "speaker_effect": { + "effect": { "u_add_var": "robofac_merc_1_stay", "type": "dialogue", "context": "robofac_merc_1", "value": "yes" }, + "sentinel": "robofac_merc_1_stay" + }, + "responses": [ + { "text": "Alright.", "topic": "TALK_ROBOFAC_MERC_1_MAIN" }, + { "text": "Guess I could stay for a while", "topic": "TALK_ROBOFAC_MERC_1_MAIN" }, + { "text": "Actually, I have some places to be right now.", "topic": "TALK_DONE" } + ] + }, + { + "id": "TALK_ROBOFAC_MERC_1_MAIN", + "type": "talk_topic", + "dynamic_line": [ + "Rough out there isn't it?", + "Well?", + "Good to have some company, I guess.", + "Have something to say?", + "...", + "Didn't you want something?", + "..." + ], + "responses": [ + { "text": "Anything interesting going on?", "topic": "TALK_ROBOFAC_MERC_1_GOING_ON" }, + { + "text": "Anything on your mind?", + "condition": { + "and": [ + { "not": { "u_has_var": "gold_mission_complete", "type": "general", "context": "robofac_merc_1", "value": "yes" } }, + { "not": { "u_has_mission": "MISSION_ROBOFAC_MERC_1_GOLD" } } + ] + }, + "topic": "TALK_ROBOFAC_MERC_1_COINS" + }, + { + "text": "Anything on your mind?", + "condition": { "u_has_var": "gold_mission_complete", "type": "general", "context": "robofac_merc_1", "value": "yes" }, + "topic": "TALK_ROBOFAC_MERC_1_RANDOM_THOUGHTS" + }, + { "text": "What do you know about our employers?", "topic": "TALK_ROBOFAC_MERC_1_ASK_HUB" }, + { "text": "Well, I should get going.", "topic": "TALK_DONE" } + ] + }, + { + "id": "TALK_ROBOFAC_MERC_1_ASK_HUB", + "type": "talk_topic", + "dynamic_line": "Not much really. They made me track and destroy some government documents a while back, of course I gave them a read first but there wasn't much.\n\n As far as I know, this place held some experimental computer network before everything went to shit. What's going on now is anybody's guess.", + "responses": [ { "text": "Well, I was hoping for more.", "topic": "TALK_ROBOFAC_MERC_1_MAIN" } ] + }, + { + "id": "TALK_ROBOFAC_MERC_1_GOING_ON", + "type": "talk_topic", + "dynamic_line": [ "Just came back from a job. Trying to rest for a short while." ], + "responses": [ { "text": "...", "topic": "TALK_ROBOFAC_MERC_1_MAIN" } ] + }, + { + "id": "TALK_ROBOFAC_MERC_1_COINS", + "type": "talk_topic", + "dynamic_line": "Have you noticed they pay us in tiny little gold coins, it's bizarre I say. One would think they have a gold mine in there, but no, they don't, so they make me cross the damned world grabbing gold bars. ", + "responses": [ + { "text": "I guess I could help with that...", "topic": "TALK_ROBOFAC_MERC_1_GOLD_MISSION" }, + { "text": "Now that you mention it, it does seem rather strange.", "topic": "TALK_ROBOFAC_MERC_1_MAIN" } + ] + }, + { + "id": "TALK_ROBOFAC_MERC_1_RANDOM_THOUGHTS", + "type": "talk_topic", + "dynamic_line": [ + "Thinking I should go hunt something soon...", + "Wondering if things will get better someday...", + "Hmm? Nothing, I guess I just like resting in this place.", + "Have you ever noticed how... wait no, never mind.", + "I heard some strange dimensional resonance caused all this, do you think it has happened to other places?", + "You noticed this place has working WI-FI? Well not the rest of the net works anyways." + ], + "responses": [ { "text": "...", "topic": "TALK_ROBOFAC_MERC_1_MAIN" } ] + }, + { + "id": "TALK_ROBOFAC_MERC_1_GOLD_MISSION", + "type": "talk_topic", + "dynamic_line": "I can offer you the whole of my payment for every bar or equivalent you bring. But keep silent about this, it's supposed to be my job.", + "responses": [ + { "text": "We have a deal then.", "effect": { "add_mission": "MISSION_ROBOFAC_MERC_1_GOLD" }, "topic": "TALK_DONE" }, + { "text": "Actually, I don't think I have time for that, sorry.", "topic": "TALK_ROBOFAC_MERC_1_MAIN" } + ] + }, + { + "id": "MISSION_ROBOFAC_MERC_1_GOLD", + "type": "mission_definition", + "name": "Retrieve chunks of gold", + "description": "Find 200 units of gold.", + "goal": "MGOAL_FIND_ITEM", + "difficulty": 5, + "followup": "MISSION_ROBOFAC_MERC_1_GOLD", + "value": 50000, + "item": "gold_small", + "count": 200, + "origins": [ "ORIGIN_SECONDARY" ], + "has_generic_rewards": false, + "dialogue": { + "describe": "I could do with some help...", + "offer": "I'm still supposed to scavenge for gold, I can offer you the same deal as last time.", + "accepted": "Wonderful.", + "rejected": "Well I'll look for the gold myself.", + "advice": "Try searching banks and security vans.", + "inquire": "You got that gold yet?", + "success": "I appreciate it, here's your pay.", + "success_lie": "Yeah, sure.", + "failure": "Well I'll have to scavenge the gold myself, thanks for nothing." + }, + "end": { + "opinion": { "trust": 1, "value": 1 }, + "effect": [ + { "u_buy_item": "RobofacCoin", "count": 8 }, + { "u_add_var": "gold_mission_complete", "type": "general", "context": "robofac_merc_1", "value": "yes" } + ] + } + } +] diff --git a/data/json/npcs/robofac/NPC_Ulysses_Rourke.json b/data/json/npcs/robofac/NPC_Ulysses_Rourke.json index d5a1e6632fb3c..4025aaba8923a 100644 --- a/data/json/npcs/robofac/NPC_Ulysses_Rourke.json +++ b/data/json/npcs/robofac/NPC_Ulysses_Rourke.json @@ -62,7 +62,7 @@ { "item": "rm13_armor" }, { "item": "goggles_nv" }, { "item": "holster", "prob": 50 }, - { "item": "chestrig" } + { "item": "tacvest" } ] }, { @@ -71,11 +71,12 @@ "subtype": "collection", "entries": [ { "item": "EMPbomb" }, - { "item": "needlegun" }, + { "item": "needlegun", "charges": 100, "ammo-item": "5x50heavy" }, { "item": "goggles_nv" }, { "item": "flashbang", "count": 2 }, { "item": "plut_cell", "count": 5 }, - { "item": "5x50heavy", "count": 10 } + { "item": "5x50_100_mag", "count": 2, "charges": 100, "ammo-item": "5x50heavy" }, + { "item": "5x50heavy", "count": 8 } ] } ] diff --git a/data/json/npcs/robofac/NPC_robofac_generic_security.json b/data/json/npcs/robofac/NPC_robofac_generic_security.json index ea2eccde9383d..399d9c21176c3 100644 --- a/data/json/npcs/robofac/NPC_robofac_generic_security.json +++ b/data/json/npcs/robofac/NPC_robofac_generic_security.json @@ -43,7 +43,7 @@ { "item": "glasses_bal", "prob": 33 }, { "item": "boots_combat" }, { "item": "holster", "prob": 50 }, - { "item": "chestrig" } + { "item": "tacvest" } ] }, { @@ -55,7 +55,8 @@ { "item": "grenade", "prob": 2 }, { "item": "PR24-extended" }, { "item": "flashlight" }, - { "item": "l_mp_9mm" }, + { "item": "l_mp_9mm", "charges": 21, "ammo-item": "9mmP" }, + { "item": "lw21mag", "charges": 21, "ammo-item": "9mmP" }, { "item": "9mmP", "count": 6 } ] }, diff --git a/data/json/npcs/talk_tags.json b/data/json/npcs/talk_tags.json index ecb8ac3326ab3..2679d6b05eb9c 100644 --- a/data/json/npcs/talk_tags.json +++ b/data/json/npcs/talk_tags.json @@ -2,54 +2,65 @@ { "type": "snippet", "category": "", + "//": "Hallucinatory NPCs say these things to discourage the avatar from taking thorazine and ending the hallucination.", "text": [ "I hate thorazine!", "Arg thorazine, don't touch it!", "Thorazine is bad for you, you know.", "Thorazine is poison.", "You don't need thorazine, it's limiting you.", - "Thorazine... That's what 'they' use to keep you tame." + "Thorazine... That's what 'they' use to keep you tame.", + "Don't. This thorazine seriously clouds your mind. You need to stay sharp." ] }, { "type": "snippet", "category": "", + "//": "Hallucinatry NPCs say these things to encourage the avatar to extend the hallucination", "text": [ "Pink tablets! I love those!", "Hey there's some pink tablets, take some!", "Look, some LSD, let's play cataclysm: fun times ahead!", "Say yes to LSD, say yes to Fun!", "Perfect, those pink tablets will keep us going, take some!", - "You know what would make all this more bearable? Pink Tablets!" + "You know what would make all this more bearable? Pink Tablets!", + "An odd pink tablet from the ground? I don't see why not!", + "Finally, something to take the edge off." ] }, { "type": "snippet", "category": "", + "//": "Hallucinations can't trade, obviously.", "text": [ "No thanks, I'm good.", "I don't want to trade with you.", "I have the best stuff. And I'm keeping it!", "No trading, that's my rule.", "I'm not interested.", - "How about no?" + "How about no?", + "I'm sorry . I'm afraid I can't do that.", + "Wish I could, ." ] }, { "type": "snippet", "category": "", + "//": "Hallucinations can't build basecamps.", "text": [ "No thanks, I really don't feel like it.", "Well, I would, but I don't want to right now.", "I have better things to do.", "I'll pass, it's too much work.", "Who put you in charge of what I do?", - "Great idea! Call me when you find SOMEONE ELSE to do it." + "Great idea! Call me when you find SOMEONE ELSE to do it.", + "Not exactly the settlin' type." ] }, { "type": "snippet", "category": "", + "//": "generic negative/hostile pronouns", "text": [ " ", "asshat", @@ -98,12 +109,18 @@ "fuckwad", "jerk", "motherfucker", - "shithead" + "shithead", + "fuck-trumpet", + "pillock", + "bellend", + "-looking ", + "oxygen-wasting " ] }, { "type": "snippet", "category": "", + "//": "NPC complaint when thirsty", "text": [ " if I won't get some water soon.", "Can you get me some water, ?", @@ -120,21 +137,26 @@ "I need to get some water.", " if I don't drink something.", "Water... Is there an oasis nearby?", - "Did you know that lack of water kills faster than lack of rest?" + "Did you know that lack of water kills faster than lack of rest?", + "I'd kill for a sip of water right now." ] }, { "type": "snippet", "category": "", + "//": "Used when chit-chatting while the avatar has a beer", "text": [ "Yeah sure, can't help but notice you got beer with you! Let's crack a cold one and chat, , how goes it?", "Oh definitely, how about one of those beers I see on you? What's up anyway?", - "Yeah you share those beers I see you hoarding and then we chat all you like! Only joking, what's up ?" + "Yeah you share those beers I see you hoarding and then we chat all you like! Only joking, what's up ?", + "Hey , I bet a chat would be all the sweeter with a nice, cold beer in hand. How's it going?", + "While we chat, what say you we open a beer and just... pretend the world isn't ending, just for a while?" ] }, { "type": "snippet", "category": "", + "//": "General chit chat messages", "text": [ "Hey, sure thing, , I need a break anyway, how are you?", "Yeah OK, , how's it going?", @@ -146,12 +168,16 @@ "Alright, you got something to get off your chest?", "Always ready for a good chat! But why, you OK?", "OK , we should get to know each other, how are you coping?", - "Definitely, I'm game. How you holding up?" + "Definitely, I'm game. How you holding up?", + "Good idea . Let's forget the world for a while. How you doin'?", + "Ah, what the heck. How's life been treating you?", + "Sure. So, how about that weather ey?" ] }, { "type": "snippet", "category": "", + "//": "Swears and curses used to emphasize unpleasant events", "text": [ "darn", "fuck", @@ -166,17 +192,36 @@ " ", " ", "son of an ass", - "Oh sugar!" + "Oh sugar!", + "bloody hell", + "fuck's sake", + "bollocks", + "goodness" ] }, { "type": "snippet", "category": "", - "text": [ "sad", "bummed", "depressed", "pissed", "unhappy", " ", "dejected", "down", "glum" ] + "//": "Generic terms for being sad.", + "text": [ + "sad", + "bummed", + "depressed", + "unhappy", + " ", + "dejected", + "down", + "glum", + "blue", + "dismal", + "sorrowful", + "despondent" + ] }, { "type": "snippet", "category": "", + "//": "Friendly or neutral greetings.", "text": [ "Hey .", "Greetings .", @@ -187,12 +232,16 @@ "What's up, ?", "You okay, ?", "Hello, .", - "Hi " + "Hi ", + "Well met!", + "Howdy.", + "." ] }, { "type": "snippet", "category": "", + "//": "Generally emphatic negative responses to a request or command", "text": [ "never", "no", @@ -209,24 +258,31 @@ "no way in hell", "nuh uh", "nope", - "fat chance" + "fat chance", + "bananope", + "when hell freezes over" ] }, { "type": "snippet", "category": "", + "//": "The NPC says these things when leaving the avatar's faction, generally because the NPC no longer likes the avatar.", "text": [ "Goodbye, !", "I'm leaving.", "So long, !", "Hasta luego, !", "I'm outta here!", - "Bye bye, !" + "Bye bye, !", + "See you later, alligator.", + "Our paths must part, for now at least.", + "There's something I gotta do on my own. Sorry." ] }, { "type": "snippet", "category": "", + "//": "The NPC is announcing a target, and all the phrases are followed by an NPC or monsters' name.", "text": [ "consider yourself dead", "I'll destroy you", @@ -242,12 +298,21 @@ "you're a dead man", "you'll taste my ", "you're dead", - ", " + ", ", + "only one of us is leaving here alive,", + "prepare thyself for punishment,", + "make peace with your gods,", + "if you worship any gods, now is a good time to start praying", + "your life is now forfeit,", + "when I'm through with you, there won't be enough left to identify", + "I'm gonna beat you so bad, even the people who look like you will hurt", + "come closer, I can't beat the shit out of you from a distance" ] }, { "type": "snippet", "category": "", + "//": "A snippet use in the context of another complaint, like \"I'll die without your help\"", "text": [ "I'm not gonna last much longer", "I'll be dead soon", @@ -259,12 +324,17 @@ "I'm done for", "I won't last much longer", "my days are numbered", - ", I'm sorry" + ", I'm sorry", + "didn't think it would end like this.", + "so, this is how it ends, huh?", + "I don't wanna go", + "bury me somewhere nice, if I don't make it" ] }, { "type": "snippet", "category": "", + "//": "The NPC says these things when the player has moved out of sight and the NPCs wants to catch up.", "text": [ "Can you wait?", "Hey, where are you?", @@ -277,12 +347,14 @@ ", where are you?", "Hey Wait for me!", "Where are you?!", - "Hey, I'm over here!" + "Hey, I'm over here!", + "Hold up a second, will ya?" ] }, { "type": "snippet", "category": "", + "//": "These would be used if we had a way to ask NPCs what there faction was, and the NPC didn't have one.", "text": [ "I'm unaffiliated.", "I don't run with a crew.", @@ -293,36 +365,37 @@ "I'm a free agent, more money that way.", "I prefer to work uninhibited by that kind of connection.", "I haven't found one that's good enough for me.", - "I don't belong to a faction, ." + "I don't belong to a faction, .", + "I'm currently not under any contract. Why, you hiring?" ] }, { "type": "snippet", "category": "", + "//": "Friendly name pro-nouns and references", "text": [ "amigo", "comrade", - "fellow", + "my good fellow", "lad", "mate", - "nomad", + "my fellow nomad", "partner", - "stranger", - "survivor", + "fellow survivor", "friend", - "pilgrim", - "traveler", + "fellow traveler", "pal", "fella", - "you", - "dude", + "my dude", "buddy", - "man" + "chum", + "bruv" ] }, { "type": "snippet", "category": "", + "//": "Said when the NPC is leading and the player has lagged by more than 12 tiles for more than 10 turns.", "text": [ "Catch up!", "Get over here!", @@ -348,6 +421,7 @@ { "type": "snippet", "category": "", + "//": "Complaint when the NPC wants to sleep but overrides or rules prevent them from sleeping.", "text": [ "I can barely keep my eyes open.", "When we sleepin'?", @@ -360,24 +434,30 @@ "I need to rest.", " if we don't stop for a moment.", "Did you know that lack of rest kills faster than lack of food?", - "I'll just go to sleep, ?" + "I'll just go to sleep, ?", + "I just...gotta close my eyes for a bit, okay?", + "Can't remember the last time I had a proper kip.", + "I can't keep going for long . I need some rest, bad." ] }, { "type": "snippet", "category": "", + "//": "Complaint when the NPC is actually going off to bed.", "text": [ "I'm going to sleep now.", "I'm off to bed. Wake me if you need me.", "I'm going to sleep over there.", "Time for bed! See you in the morning.", "There's a bed calling my name, and I'm going to it.", - "Good night! Wake me if you need me." + "Good night! Wake me if you need me.", + "Calling it a night for now. You get some rest too, okay?" ] }, { "type": "snippet", "category": "", + "//": "Generic terms of emphasis", "text": [ "extremely", "greatly", @@ -394,42 +474,27 @@ "uber", "ultra", "so ", - " " + " ", + "severely", + "extraordinarily", + "unusually", + "tremendously", + "vastly", + "palpably", + "inordinately", + "staggeringly" ] }, { "type": "snippet", "category": "", - "text": [ "fine", "okay", "get it", "you dig", "dig", "got it", "you see", "see, ", "alright", "that clear" ] - }, - { - "type": "snippet", - "category": "", - "text": [ - "Catch up!", - "Get over here!", - "Get over here, !", - "Keep close, !", - "Keep it moving, !", - "Keep up, !", - "Let's keep going, !", - "Over here!", - "Over here, !", - "Stay close, !", - "Stay with me, !", - "Catch up, !", - "Keep up!", - "Come on, !", - "Keep it moving!", - "Stay with me!", - "Keep close!", - "Stay close!", - "Let's keep going!" - ] + "//": "General terms of acknowledgement for an order", + "text": [ "fine", "okay", "get it", "you dig", "dig", "got it", "you see", "see, ", "alright", "that clear", "capiche" ] }, { "type": "snippet", "category": "", + "//": "Generic terms of emphasis", "text": [ "really", "seriously", @@ -447,6 +512,7 @@ { "type": "snippet", "category": "", + "//": "Said when an NPC needs to move past another character", "text": [ "Excuse me, let me pass.", "Hey , can I get through?", @@ -458,12 +524,14 @@ "Move your ass, !", "Out of my way, !", "Move it, !", - "You need to move, , ?" + "You need to move, , ?", + "Coming through!" ] }, { "type": "snippet", "category": "", + "//": "Said when a hostile NPC completes mugging the player", "text": [ "Thanks for the cash, !", "So long, !", @@ -474,12 +542,16 @@ "Hasta luego, !", "I'm outta here! ", "Bye bye, !", - "Thanks, !" + "Thanks, !", + "Pleasure doing business with you.", + "Now beat it, you .", + "Good haul. See you around" ] }, { "type": "snippet", "category": "", + "//": "Warning from non-hostile NPCs when the player steals something.", "text": [ "Hey! I saw you take that ! Drop it. Now.", "You best be dropping what you just picked up right now .", @@ -489,7 +561,10 @@ "I saw that! Drop what you just stole!", "Thieves will not last long around me , please drop that.", "Consider this a warning , thieves will not be tolerated, drop it.", - "You think I'm blind ? Don't touch our stuff." + "You think I'm blind ? Don't touch our stuff.", + "You have one chance to put it back.", + "Return the stolen goods. You have to the count of three to comply.", + "You're not leaving here with stolen goods, ." ] }, { @@ -507,12 +582,15 @@ " ", "tickled pink", "delighted", - "pumped" + "pumped", + "joyful", + "merry" ] }, { "type": "snippet", "category": "", + "//": "General warning to put a weapon down, either in preparation for a mugging or by an scared NPC as part of a request to establish trust with the avatar.", "text": [ "Drop your weapon!", "Okay , drop your weapon!", @@ -523,17 +601,33 @@ "Put down the !", "Drop your weapon, !", "Put down your !", - "Alright, drop the !" + "Alright, drop the !", + "Please put down your weapon. I'll give you to the count of three. One...", + "Let's take it easy now, okay? Put the weapon down." ] }, { "type": "snippet", "category": "", - "text": [ "fucking", "goddamn", "motherfucking", "freaking", "damn", " ", "fuckin'", "god damn", "mafuckin'" ] + "text": [ + "fucking", + "goddamn", + "motherfucking", + "freaking", + "damn", + " ", + "fuckin'", + "god damn", + "mafuckin'", + "bloody", + "god-forsaken", + "cursed" + ] }, { "type": "snippet", "category": "", + "//": "NPCs shout these things while approaching the avatar for the first time", "text": [ "Wait up, let's talk!", "Hey, I want to talk to you!", @@ -544,12 +638,14 @@ "! Wait up!", "Wait up, ?", "Let's talk, !", - "Look, let's talk!" + "Look, let's talk!", + "Hey, what's the rush? Let's chat a tad." ] }, { "type": "snippet", "category": "", + "//": "Mostly hostile NPCs say these things in preparation for mugging an unarmed avatar.", "text": [ "Put your hands up!", "Put your hands up, !", @@ -560,12 +656,16 @@ "Hands where I can see them!", "Okay , hands up!", "Okay hands up!", - "Hands in the air, !" + "Hands in the air, !", + "Hands up, no sudden movements and we're gravy, okay?", + "Take it easy and put your hands up now, .", + "Why don't you put your hands up for me ." ] }, { "type": "snippet", "category": "", + "//": "Generic orders to move,mostly used as part of firing warnings.", "text": [ "Move", "Move your ass", @@ -576,12 +676,14 @@ "Move your ass", "Get out of my way, ,", "Move to the side", - "Get out of my line of fire" + "Get out of my line of fire", + "Move, move, move" ] }, { "type": "snippet", "category": "", + "//": "Complaint when the NPC is hungry and wants food.", "text": [ "I almost want to eat my now.", "When we eatin'?", @@ -594,12 +696,15 @@ "I need to eat something.", " if I don't get some food.", "Consider this idea: you give me food and I eat it.", - "Did you know that lack of food kills faster than chain smoking?" + "Did you know that lack of food kills faster than chain smoking?", + "Can't remember the last time I got a proper meal.", + "I could eat a horse." ] }, { "type": "snippet", "category": "", + "//": "Extremely negative response to a request or command.", "text": [ "fuck you", "fuck off", @@ -607,12 +712,18 @@ ", ", ", ", "", - " " + " ", + "you can fuck right off, you ", + "I've had enough of you, begone.", + "you're a poster child for abortions", + "how the fuck you've survived this far is beyond me, you ", + "you're the reason the gene pool needs a lifeguard" ] }, { "type": "snippet", "category": "", + "//": "NPC complaint if a HUGE NPC is taking pain from being inside a vehicle. Key points are that the NPC is HUGE and they're in a confined vehicle, along with some hints on how to resolve it.", "text": [ "Can I get out and walk? This vehicle is too small.", "How about we make the next vehicle a convertible?", @@ -620,28 +731,33 @@ "I'm not a contortionist!", "I can't fit in your tiny human vehicle.", "This sucks. I'm too big.", - "I don't like being a mutant crammed into your tiny little vehicle." + "I don't like being a mutant crammed into your tiny little vehicle.", + "Getting awfully cramped in here.", + "I don't think this vehicle was designed for someone like me." ] }, { "type": "snippet", "category": "", + "//": "Hostile NPC warning about a live explosive in the vicinity.", "text": [ " Fire in the hole!", " Get cover!", - "Marines! We are leaving!", "Hit the dirt!", "This shit is gonna blow!", "I'm standing way too close to this firecracker.", "I need to get some distance.", "I need to get some distance.", " I'm getting my ass out of here!", - "Fire in the hole, motherfuckers!" + "Fire in the hole, motherfuckers!", + "Heads up, .", + "Watch out for shrapnel!" ] }, { "type": "snippet", "category": "", + "//": "Friendly NPC warning about a live explosive in the vicinity.", "text": [ "Fire in the hole!", "Get cover!", @@ -650,26 +766,33 @@ "This shit is gonna blow!", "I'm standing way too close to this firecracker.", "I need to get some distance.", - "I'm getting my ass out of here! You'd better do the same, !", - "Fire in the hole, motherfuckers!" + "Fire in the hole, motherfuckers!", + "Bombs away!", + "Shrapnel, incoming! Watch it!", + "Making some noise!", + "Hit the deck!" ] }, { "type": "snippet", "category": "", - "//": "Hostile NPCs are foul-mouthed", + "//": "Hostile NPCs are foul-mouthed. This is a warning about a dangerous monster, and the code always follows it with the name of the monster.", "text": [ "Fuck me! A ", "Watch out for that", "Watch out! I see a", ", a", ", I'm doomed! There's a ", - ", here comes a " + ", here comes a ", + "Incoming!", + "Prepare yourself! We have a", + "" ] }, { "type": "snippet", "category": "", + "//": "This is a warning about a dangerous monster, and the code always follows it with the name of the monster.", "text": [ "Look out for that", "Hey! Over there! I see a", @@ -680,12 +803,14 @@ "Hey, ! ", ", a", "Look out! A", - ", here comes a " + ", here comes a ", + "Keep an eye on that" ] }, { "type": "snippet", "category": "", + "//": "NPC complaint when the threat level increases from very low to dangerous.", "text": [ "Look sharp! Things are heating up.", "Hostiles inbound.", @@ -696,13 +821,17 @@ "Who's there?", "Hello?", "Look alive!", - "" + "", + "Fight or flight?", + "Weapons hot!", + "Lock and load!", + "We've got incoming!" ] }, { "type": "snippet", "category": "", - "//": "Some lines deliberately copied from mi-go text", + "//": "Hostile, swear-filled NPC complaint when the threat level increases from very low to dangerous. Some lines deliberately copied from mi-go text.", "text": [ " look sharp! Things are heating up.", " Hostiles inbound.", @@ -730,6 +859,7 @@ { "type": "snippet", "category": "", + "//": "NPC complaint when the danger level drops from significant to very low, so things are 'safe'", "text": [ "Looks like that's over.", ", ", @@ -743,12 +873,20 @@ "How do we get out of here?", "Is that the last of them?", "I'd kill for a coke.", - "" + "Weapons check everyone. There may be more.", + "That's that, then.", + "That's the last of them for now.", + "Clearing the world, one at a time", + "Well, that got the blood pumping.", + "We're clear, but stay frosty.", + " beautiful work.", + "Getting really good at this." ] }, { "type": "snippet", "category": "", + "//": "Hostile NPC complaint when the danger level drops from significant to very low, so things are 'safe'", "text": [ " What a day.", " I win again!", @@ -770,6 +908,7 @@ { "type": "snippet", "category": "", + "//": "Friendly NPC complaint that they're attacking a particular hostile NPC. The code always appends the name of NPC, so you get 'I can take on Tonza'.", "text": [ "Time for you to die,", "This bullet is for you,", @@ -777,12 +916,18 @@ "Hey, ! I've got", "! Watch my back while I kill", "I'm your huckleberry,", - "Sorry, but you have to do down," + "Sorry, but you have to go down,", + "End of the line,", + "You have it coming", + "Let's dance,", + "You and me,", + "I will kill you to death, " ] }, { "type": "snippet", "category": "", + "//": "Hostile NPC complaint that they're attacking a particular friendly NPC. The code always appends the name of NPC, so you get 'Time to die, Tonza'.", "text": [ "! I'm gonna kill you,", "Watch you bleed out,", @@ -795,6 +940,7 @@ { "type": "snippet", "category": "", + "//": "Hostile NPC complaint that they're attacking the avatar. Could use more variety.", "text": [ "!", "I'ma cut those fuckin' tentacles off, bitch!", @@ -809,6 +955,7 @@ { "type": "snippet", "category": "", + "//": "NPC complaint that they are wounded but have medical equipment and are stopping to heal themselves.", "text": [ "I think I need to see a doctor. I'm patching myself up.", "Please, I don't want to die. Let these bandages work!", @@ -816,39 +963,52 @@ "That cut looks bad, I'm going to fix it.", "I hope these bandages work.", "I think I need to see a doctor. They're all dead, I hope these work.", - "Please, I don't want to die. C'mon, bandages!" + "Please, I don't want to die. C'mon, bandages!", + "Wait a spell, patching myself up!", + "Applying first aid!", + "These bandages ain't much, but they will do for now.", + "Hold up, gotta plug this hole in me.", + "Watch my back while I stitch my arm back on .", + "Gotta bandage this or I'll bleed out. Give me a sec.", + "I ain't got time to ble-wait, that's a lot of blood. Give me a second while I patch this." ] }, { "type": "snippet", "category": "", - "text": [ "Quiet down over there!", "Did you hear someone talking?", "Who said that?", "Who's there?" ] + "//": "NPC complaint that they heard an unknown voice. This goes off a lot and could use more variety.", + "text": [ "Quiet down over there!", "Did you hear someone talking?", "Who said that?", "Who's there?", "Who goes there?" ] }, { "type": "snippet", "category": "", + "//": "NPC complaint that they heard combat noises that they can't see.", "text": [ "That sounds bad.", "Be alert, something is up!", "Did you hear that?", "What's that noise?", - "Is something over there?" + "Is something over there?", + "What was that?" ] }, { "type": "snippet", "category": "", + "//": "NPC complaint that they heard movement that they can't see. The code appends an description of the movement, so you get 'I could swear I heard hooves clopping'. Could use more variety.", "text": [ "I hear something moving - sounded like", "What's that sound? I heard", "What's there? I heard", "Did you hear that? Sounded like", - "What is making that sound? I can hear the" + "What is making that sound? I can hear the", + "I could swear I heard" ] }, { "type": "snippet", "category": "", + "\\": "Generic acknowledgement of a command. Comes up a lot and could use more variety.", "text": [ "Got it!", "I'm on it.", @@ -859,12 +1019,19 @@ "Okay.", "Will do.", "No problem.", - "Can do." + "Can do.", + "Affirmative.", + "Roger that.", + "Capiche.", + "You got it.", + "Aye aye.", + "Aye." ] }, { "type": "snippet", "category": "", + "\\": "Complaint when the NPC is near the avatar who is smoking marijuana.", "text": [ "Whew... smells like skunk!", "Man, that smells like some good shit!", @@ -875,56 +1042,83 @@ "What do I smell? Well, I guess it's legal now.", "Mmm, that weed smells good.", "Man, I can smell the weed, can I have some?", - "Are you sure it's a good idea to smoke that now?" + "Are you sure it's a good idea to smoke that now?", + "Is that the devil's lettuce I smell?" ] }, { "type": "snippet", "category": "", + "\\": "Complaint when the NPC is near the avatar who is smoking meth.", "text": [ "I don't know... should you really be smoking that stuff?", ", that's going to ruin your nose.", "Man, that stinks. Put it out!", "You're going to kill yourself smoking that stuff, .", "Oh, wow, that smell... Can I have some?", - "Are you sure it's a good idea to smoke that now?" + "Are you sure it's a good idea to smoke that now?", + "I smell heresy.", + "Seriously? You're smoking that?", + "Well that's one way to guarantee the zombies don't kill you.", + "Come on , you're better than this." ] }, { "type": "snippet", "category": "", + "\\": "Complaint when the NPC is near the avatar who is smoking crack.", "text": [ "Ew, smells like burning rubber!", "Ugh, that smells rancid!", "" ] }, { "type": "snippet", "category": "", + "//": "NPC complaint when they are low on CBM power and have a battery charger system. Additional versions should continue to specify that the NPC needs batteries and they need them to recharge their power CBMs.", "text": [ "I need some batteries to power my CBMs.", "I can't recharge my CBMs without some batteries.", - "Hey, , can I get some batteries here? I need to recharge." + "Hey, , can I get some batteries here? I need to recharge.", + "Internal batteries running low. How many batteries can you spare right now?", + "I can do a lot more for you if you pass me a couple batteries to recharge.", + "All these implants I got are going to turn to useless scrap real soon if I don't get some batteries to recharge." ] }, { "type": "snippet", "category": "", + "//": "NPC complaint when they are low on CBM power and have an ethanol burner system. Additional versions should continue to specify that the NPC needs alcohol and they need them to recharge their power CBMs.", "text": [ "Pass me a beer, I need to power my ethanol burner.", "Ethanol burners! The power source that's fun to recharge. Get me a drink, please!", - "Waiter! I need a refill, my ethanol burner is running out of charge!" + "Waiter! I need a refill, my ethanol burner is running out of charge!", + "I require ethanol-based drinks for my internal power supply. Anything on you?", + "Got any alcohol to spare? Need to recharge my drives. Mead, if you have any.", + "This ethanol-burning power supply is the best implant I ever got. Speaking of which, got some booze to top me off?" ] }, { "type": "snippet", "category": "", + "//": "NPC complaint when they are low on CBM power and have an internal furnace. Additional versions should continue to specify that the NPC needs junk (withered plants, paper, or wood) and they need them to recharge their power CBMs.", "text": [ "I need some junk to power my internal furnace.", "I can't recharge my CBMs without some firewood for my internal furnace.", "Hey, , can I get some waste paper or withered plants? I need to recharge." ] }, + { + "type": "snippet", + "category": "", + "//": "NPC complaint when they are low on CBM power and have a fueled bionic. Additional versions should continue to specify that the NPC needs fuel and they need it to recharge their power CBMs.", + "text": [ + "I need some fuel to power my bionics.", + "I can't recharge my CBMs without some fuel.", + "Hey, , can I get some fuel? I need to recharge." + ] + }, { "type": "snippet", "category": "", + "//": "NPC complaint when they are low on CBM power and have an internal reactor. Additional versions should continue to specify that the NPC needs radioactive slurry and they need it to recharge their power CBMs. Also, mostly obsolete since internal reactors got removed.", "text": [ "I can't believe I'm saying this, but I need radioactive plutonium slurry for my internal reactor.", "I can't use my internal reactor to recharge my CBMs without some plutonium slurry.", @@ -932,27 +1126,50 @@ "Beta radiation can be blocked by clothing, but is really dangerous if you ingest it. So can I have some plutonium slurry to power my reactor and give me cancer?", "I need some radioactive slurry to power my reactor. Or a less dangerous power source, that would be even better!", "Please, , get me some radioactive slurry to fuel my internal reactor. Or get me another way to recharge my CBMs!", - "I can't use my internal reactor to recharge my CBMs without some plutonium slurry. Which wouldn't be a problem if I had anything else that would recharge my CBMs!" + "I can't use my internal reactor to recharge my CBMs without some plutonium slurry. Which wouldn't be a problem if I had anything else that would recharge my CBMs!", + "I sure could use a highly radioactive slurry shake for my power supply right now." ] }, { "type": "snippet", "category": "", + "//": "avatar response to an NPC that opens up their history.", "text": [ "Tell me about how you survived the cataclysm.", "How did you survive the cataclysm?", - "What was the cataclysm like for you?" + "What was the cataclysm like for you?", + "How did you make it through the initial chaos?", + "Tell me how you survived the initial wave of the Cataclysm.", + "Was it rough surviving thus far?" ] }, { "type": "snippet", "category": "", - "text": [ "Let's talk about something else.", "Let's change the subject.", "I'd like to ask you about something else." ] + "//": "Avatar response to an NPC that can be used for TALK_NONE responses. Could be used in a lot more dialouges. Could also use a lot more variety.", + "text": [ + "Let's talk about something else.", + "Let's change the subject.", + "I'd like to ask you about something else.", + "Moving on...", + "Anyway..." + ] }, { "type": "snippet", "category": "", - "text": [ "We should probably get going.", "We'd better get moving.", "Let's head out." ] + "//": "Avatar response indicated that the conversation is over via TALK_DONE. Could be used in a lot more dialouges. Could also use a lot more variety.", + "text": [ + "We should probably get going.", + "We'd better get moving.", + "Let's head out.", + "Time's a-wasting. Let's head out.", + "Come on. We got stuff to do.", + "Let's hit the road.", + "We'll pick this up another time. Let's go.", + "Let's put a pin in this chat for now.", + "Talk to you later." + ] }, { "type": "snippet", @@ -968,23 +1185,35 @@ "terrible", "horrible", "miserable", - "fucked-up" + "fucked-up", + "deplorable" ] }, { "type": "snippet", "category": "", - "text": [ "stupid", "idiotic", "dumb", "dumb-ass", "moronic", "mickey mouse", "shit-for-brains" ] + "text": [ "stupid", "idiotic", "dumb", "dumb-ass", "moronic", "mickey mouse", "shit-for-brains", "imbecilic" ] }, { "type": "snippet", "category": "", - "text": [ "zombie", "Z", "shambler", "goo-puker", "walker", "walking corpse", " ", "undead", "living dead" ] + "text": [ + "zombie", + "Z", + "shambler", + "goo-puker", + "walker", + "walking corpse", + " ", + "undead", + "a living corpse", + "zed" + ] }, { "type": "snippet", "category": "", - "text": [ "zombies", "Z", "Z's", "undead", " ", "living dead" ] + "text": [ "zombies", "Z", "Z's", "undead", " ", "living dead", "zeds" ] }, { "type": "snippet", @@ -999,7 +1228,10 @@ " ", "unbelievable thing", "walking nightmare", - "thing right out of a scary movie" + "thing right out of a scary movie", + " thing", + "whatever-the-fuck that is", + "eldritch horror" ] }, { @@ -1010,6 +1242,7 @@ { "type": "snippet", "category": "", + "//": "NPC complaint when the NPC intends to run away from overhwelming threats.", "text": [ "They'll kill us! Run away!", "We're going to die! Fall back!", @@ -1023,26 +1256,36 @@ "Please, I don't want to die.", "Me go, you stay.", "Not that way! Go left!", - "!" + "!", + "Retreat! Retreat!", + "Book it!", + "Leg it!", + "Thank fuck for all the cardio!" ] }, { "type": "snippet", "category": "", + "//": "NPC complaint when they would like to run, but have no legal movement options and must fight.", "text": [ "I can't outrun it! I'm going to kill it!", "! Die, you ! I want to live!", - "My feet failed me! Arms don't fail me!" + "My feet failed me! Arms, don't fail me!", + "If I die, I'm taking you all with me!" ] }, { "type": "snippet", "category": "", + "//": "NPC complaint when there is an uncontrolled fire in the vicinity and the NPC wants to run away. Could use more variety.", "text": [ "Call the fire department! Wait, they're dead! Run away!", "This place is on fire. I'm leaving.", "Put the fire out! Put it out!", - "Fire bad! !" + "Fire bad! !", + "Fire, fire, FIRE!", + "Get an extinguisher!", + "Danger hot!" ] }, { diff --git a/data/json/obsolete.json b/data/json/obsolete.json index cfed4ab4d2a95..9ca5915fa11f4 100644 --- a/data/json/obsolete.json +++ b/data/json/obsolete.json @@ -244,6 +244,77 @@ "result": "flamethrower_simple", "obsolete": true }, + { + "id": "wheel_steerable", + "copy-from": "wheel", + "type": "vehicle_part", + "name": "wheel (steerable)", + "extend": { "flags": [ "STEERABLE", "NOINSTALL" ] } + }, + { + "id": "wheel_slick_steerable", + "copy-from": "wheel_slick", + "type": "vehicle_part", + "name": "racing slick (steerable)", + "item": "wheel_slick", + "extend": { "flags": [ "STEERABLE", "NOINSTALL" ] } + }, + { + "id": "wheel_armor_steerable", + "copy-from": "wheel_armor", + "type": "vehicle_part", + "name": "armored wheel (steerable)", + "extend": { "flags": [ "STEERABLE", "NOINSTALL" ] } + }, + { + "id": "wheel_bicycle_steerable", + "copy-from": "wheel_bicycle", + "type": "vehicle_part", + "name": "bicycle wheel (steerable)", + "extend": { "flags": [ "STEERABLE", "NOINSTALL" ] } + }, + { + "id": "wheel_bicycle_or_steerable", + "copy-from": "wheel_bicycle_or", + "type": "vehicle_part", + "name": "off-road bicycle wheel (steerable)", + "extend": { "flags": [ "STEERABLE", "NOINSTALL" ] } + }, + { + "id": "wheel_motorbike_steerable", + "copy-from": "wheel_motorbike", + "type": "vehicle_part", + "name": "motorbike wheel (steerable)", + "extend": { "flags": [ "STEERABLE", "NOINSTALL" ] } + }, + { + "id": "wheel_motorbike_or_steerable", + "copy-from": "wheel_motorbike_or", + "type": "vehicle_part", + "name": "off-road motorbike wheel (steerable)", + "extend": { "flags": [ "STEERABLE", "NOINSTALL" ] } + }, + { + "id": "wheel_small_steerable", + "copy-from": "wheel_small", + "type": "vehicle_part", + "name": "small wheel (steerable)", + "extend": { "flags": [ "STEERABLE", "NOINSTALL" ] } + }, + { + "id": "wheel_wide_steerable", + "copy-from": "wheel_wide", + "type": "vehicle_part", + "name": "wide wheel (steerable)", + "extend": { "flags": [ "STEERABLE", "NOINSTALL" ] } + }, + { + "id": "wheel_wide_or_steerable", + "copy-from": "wheel_wide_or", + "type": "vehicle_part", + "name": "off-road wide wheel (steerable)", + "extend": { "flags": [ "STEERABLE", "NOINSTALL" ] } + }, { "type": "mutation", "id": "INCONSPICUOUS", @@ -252,5 +323,28 @@ "description": "While sleeping or staying still, it is less likely that monsters will wander close to you.", "social_modifiers": { "lie": 2 }, "valid": false + }, + { + "id": "metal_wheel", + "type": "vehicle_part", + "name": "metal wheel", + "item": "wheel_metal", + "location": "under", + "symbol": "|", + "broken_symbol": "x", + "durability": 180, + "description": "A strong metal wheel.", + "damage_modifier": 70, + "breaks_into": [ { "item": "scrap", "count": [ 4, 6 ] }, { "item": "steel_chunk", "count": [ 2, 3 ] } ], + "rolling_resistance": 0.375, + "wheel_type": "rigid", + "contact_area": 80, + "requirements": { + "install": { "skills": [ [ "mechanics", 1 ] ], "time": "15 m", "qualities": [ { "id": "WRENCH", "level": 2 } ] }, + "removal": { "skills": [ [ "mechanics", 1 ] ], "time": "15 m", "qualities": [ { "id": "WRENCH", "level": 2 } ] }, + "repair": { "skills": [ [ "mechanics", 2 ] ], "time": "15 m", "using": [ [ "welding_standard", 5 ] ] } + }, + "flags": [ "WHEEL", "NEEDS_JACKING", "NEEDS_WHEEL_MOUNT_MEDIUM" ], + "damage_reduction": { "all": 66 } } ] diff --git a/data/json/overmap/map_extras.json b/data/json/overmap/map_extras.json index de99246f14d39..50b4bd80f9207 100644 --- a/data/json/overmap/map_extras.json +++ b/data/json/overmap/map_extras.json @@ -325,5 +325,19 @@ "sym": "x", "color": "yellow", "autonote": true + }, + { + "id": "mx_looters", + "type": "map_extra", + "name": "Looters", + "description": "Some looters gathering everything not nailed down.", + "generator": { "generator_method": "map_extra_function", "generator_id": "mx_looters" } + }, + { + "id": "mx_corpses", + "type": "map_extra", + "name": "Corpses", + "description": "Some unfortunates from the billions lost in the cataclysm.", + "generator": { "generator_method": "map_extra_function", "generator_id": "mx_corpses" } } ] diff --git a/data/json/overmap/overmap_special/specials.json b/data/json/overmap/overmap_special/specials.json index 048ad7631ac12..67ba2ef7ea23c 100644 --- a/data/json/overmap/overmap_special/specials.json +++ b/data/json/overmap/overmap_special/specials.json @@ -117,7 +117,7 @@ "spawns": { "group": "GROUP_RAZORCLAW", "population": [ 30, 60 ], "radius": [ 2, 10 ] } }, { - "//": "This special is required for robofac mission 3, and this is a fallback for when the tower doesn’t spawn inside city. Should be removed once we can guarantee the spawning of mid-city specials", + "//": "This special is required for robofac mission 3, and this is a fallback for when the tower doesn’t spawn inside a city. Should be removed once we can guarantee the spawning of mid-city specials", "type": "overmap_special", "id": "office_tower_collapsed", "overmaps": [ @@ -582,7 +582,7 @@ "locations": [ "forest" ], "city_distance": [ 20, -1 ], "city_sizes": [ 0, 6 ], - "occurrences": [ 15, 100 ], + "occurrences": [ 1, 1 ], "flags": [ "UNIQUE" ], "rotate": false }, @@ -644,7 +644,15 @@ { "type": "overmap_special", "id": "Missile Silo", - "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "silo" } ], + "overmaps": [ + { "point": [ 0, -1, 0 ], "overmap": "road_end_north" }, + { "point": [ 0, 0, 0 ], "overmap": "silo" }, + { "point": [ 0, 0, -1 ], "overmap": "silo_1" }, + { "point": [ 0, 0, -2 ], "overmap": "silo_2" }, + { "point": [ 0, 0, -3 ], "overmap": "silo_3" }, + { "point": [ 0, 0, -4 ], "overmap": "silo_4" }, + { "point": [ 0, 0, -5 ], "overmap": "silo_finale" } + ], "connections": [ { "point": [ 0, -1, 0 ], "terrain": "road" } ], "locations": [ "land" ], "city_distance": [ 30, -1 ], @@ -3964,6 +3972,10 @@ { "point": [ 1, 1, -2 ], "overmap": "robofachq_hab_b1_north" }, { "point": [ 2, 1, -2 ], "overmap": "robofachq_hab_b2_north" }, { "point": [ 3, 1, -2 ], "overmap": "robofachq_hab_b3_north" }, + { "point": [ 0, 0, -4 ], "overmap": "robofachq_sub_a0_north" }, + { "point": [ 1, 0, -4 ], "overmap": "robofachq_sub_a1_north" }, + { "point": [ 2, 0, -4 ], "overmap": "robofachq_sub_a2_north" }, + { "point": [ 3, 0, -4 ], "overmap": "robofachq_sub_a3_north" }, { "point": [ 0, 0, -6 ], "overmap": "robofachq_ai_a0_north" }, { "point": [ 1, 0, -6 ], "overmap": "robofachq_ai_a1_north" }, { "point": [ 2, 0, -6 ], "overmap": "robofachq_ai_a2_north" }, @@ -3981,13 +3993,111 @@ { "point": [ 2, 1, -7 ], "overmap": "robofachq_aiutl_b2_north" }, { "point": [ 3, 1, -7 ], "overmap": "robofachq_aiutl_b3_north" } ], - "connections": [ { "point": [ 0, -1, 0 ], "terrain": "road" } ], + "connections": [ + { "point": [ 2, -1, 0 ], "terrain": "road", "connection": "local_road", "from": [ 2, 0, 0 ] }, + { "point": [ 0, -1, 0 ], "terrain": "road", "connection": "local_road", "from": [ 0, 0, 0 ] } + ], "locations": [ "wilderness" ], "city_distance": [ 3, -1 ], "city_sizes": [ 1, 16 ], "occurrences": [ 1, 1 ], "flags": [ "UNIQUE" ] }, + { + "type": "overmap_special", + "id": "4x4_microlab", + "overmaps": [ + { "point": [ 2, -2, -2 ], "overmap": "microlab_sub_connector_north" }, + { "point": [ 2, -1, -2 ], "overmap": "microlab_sub_station_north" }, + { "point": [ 0, -1, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ 1, -1, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ 3, -1, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ 4, -1, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ -1, 0, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ 0, 0, -2 ], "overmap": "microlab_generic_edge" }, + { "point": [ 1, 0, -2 ], "overmap": "microlab_generic_edge" }, + { "point": [ 2, 0, -2 ], "overmap": "microlab_generic_sub_entry_north" }, + { "point": [ 3, 0, -2 ], "overmap": "microlab_generic_edge" }, + { "point": [ 4, 0, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ -1, 1, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ 0, 1, -2 ], "overmap": "microlab_generic_edge" }, + { "point": [ 1, 1, -2 ], "overmap": "microlab_generic" }, + { "point": [ 2, 1, -2 ], "overmap": "microlab_generic" }, + { "point": [ 3, 1, -2 ], "overmap": "microlab_generic_edge" }, + { "point": [ 4, 1, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ -1, 2, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ 0, 2, -2 ], "overmap": "microlab_generic_edge" }, + { "point": [ 1, 2, -2 ], "overmap": "microlab_generic" }, + { "point": [ 2, 2, -2 ], "overmap": "microlab_generic" }, + { "point": [ 3, 2, -2 ], "overmap": "microlab_generic_edge" }, + { "point": [ 4, 2, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ -1, 3, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ 0, 3, -2 ], "overmap": "microlab_generic_edge" }, + { "point": [ 1, 3, -2 ], "overmap": "microlab_generic_edge" }, + { "point": [ 2, 3, -2 ], "overmap": "microlab_generic_edge" }, + { "point": [ 3, 3, -2 ], "overmap": "microlab_generic_edge" }, + { "point": [ 4, 3, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ -1, 4, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ 0, 4, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ 1, 4, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ 2, 4, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ 3, 4, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ 4, 4, -2 ], "overmap": "microlab_rock_border" } + ], + "locations": [ "wilderness" ], + "city_distance": [ 3, -1 ], + "city_sizes": [ 1, 16 ], + "occurrences": [ 4, 8 ] + }, + { + "type": "overmap_special", + "id": "4x4_microlab_surface", + "overmaps": [ + { "point": [ 2, 1, 1 ], "overmap": "microlab_generic_surface_roof_north" }, + { "point": [ 2, 1, 0 ], "overmap": "microlab_generic_surface_north" }, + { "point": [ 2, -2, -2 ], "overmap": "microlab_sub_connector_north" }, + { "point": [ 2, -1, -2 ], "overmap": "microlab_sub_station_north" }, + { "point": [ 0, -1, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ 1, -1, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ 3, -1, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ 4, -1, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ -1, 0, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ 0, 0, -2 ], "overmap": "microlab_generic_edge" }, + { "point": [ 1, 0, -2 ], "overmap": "microlab_generic_edge" }, + { "point": [ 2, 0, -2 ], "overmap": "microlab_generic_sub_entry_north" }, + { "point": [ 3, 0, -2 ], "overmap": "microlab_generic_edge" }, + { "point": [ 4, 0, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ -1, 1, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ 0, 1, -2 ], "overmap": "microlab_generic_edge" }, + { "point": [ 1, 1, -2 ], "overmap": "microlab_generic" }, + { "point": [ 2, 1, -2 ], "overmap": "microlab_generic_surface_connector" }, + { "point": [ 3, 1, -2 ], "overmap": "microlab_generic_edge" }, + { "point": [ 4, 1, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ -1, 2, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ 0, 2, -2 ], "overmap": "microlab_generic_edge" }, + { "point": [ 1, 2, -2 ], "overmap": "microlab_generic" }, + { "point": [ 2, 2, -2 ], "overmap": "microlab_generic" }, + { "point": [ 3, 2, -2 ], "overmap": "microlab_generic_edge" }, + { "point": [ 4, 2, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ -1, 3, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ 0, 3, -2 ], "overmap": "microlab_generic_edge" }, + { "point": [ 1, 3, -2 ], "overmap": "microlab_generic_edge" }, + { "point": [ 2, 3, -2 ], "overmap": "microlab_generic_edge" }, + { "point": [ 3, 3, -2 ], "overmap": "microlab_generic_edge" }, + { "point": [ 4, 3, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ -1, 4, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ 0, 4, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ 1, 4, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ 2, 4, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ 3, 4, -2 ], "overmap": "microlab_rock_border" }, + { "point": [ 4, 4, -2 ], "overmap": "microlab_rock_border" } + ], + "connections": [ { "point": [ 2, 0, 0 ], "terrain": "road", "connection": "local_road", "from": [ 2, 1, 0 ] } ], + "locations": [ "wilderness" ], + "city_distance": [ 3, -1 ], + "city_sizes": [ 1, 16 ], + "occurrences": [ 0, 2 ] + }, { "type": "overmap_special", "id": "ws_survivor_bunker_place", @@ -4524,7 +4634,6 @@ "city_distance": [ 1, -1 ], "city_sizes": [ 0, 20 ], "occurrences": [ 0, 3 ], - "flags": [ "CLASSIC" ], "spawns": { "group": "GROUP_MI-GO_CAMP_OM", "population": [ 2, 5 ], "radius": [ 2, 30 ] } }, { diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_microlab.json b/data/json/overmap/overmap_terrain/overmap_terrain_microlab.json new file mode 100644 index 0000000000000..c97adcce3a1eb --- /dev/null +++ b/data/json/overmap/overmap_terrain/overmap_terrain_microlab.json @@ -0,0 +1,65 @@ +[ + { + "type": "overmap_terrain", + "id": "microlab_generic", + "name": "science lab", + "sym": "L", + "color": "light_blue", + "spawns": { "group": "GROUP_MICROLAB", "population": [ 40, 45 ], "chance": 80 }, + "see_cost": 5, + "flags": [ "NO_ROTATE" ] + }, + { + "type": "overmap_terrain", + "id": "microlab_rock_border", + "name": "solid rock", + "sym": "%", + "color": "dark_gray", + "see_cost": 5, + "flags": [ "NO_ROTATE" ] + }, + { + "type": "overmap_terrain", + "id": "microlab_generic_edge", + "copy-from": "microlab_generic" + }, + { + "type": "overmap_terrain", + "id": "microlab_generic_surface_connector", + "copy-from": "microlab_generic" + }, + { + "type": "overmap_terrain", + "id": "microlab_sub_station", + "name": "subway station?", + "sym": "S", + "color": "light_blue", + "spawns": { "group": "GROUP_LAB", "population": [ 12, 25 ], "chance": 80 }, + "see_cost": 5 + }, + { + "type": "overmap_terrain", + "id": "microlab_sub_connector", + "copy-from": "microlab_sub_station" + }, + { + "type": "overmap_terrain", + "id": "microlab_generic_sub_entry", + "name": "science lab", + "sym": "L", + "copy-from": "microlab_sub_connector" + }, + { + "type": "overmap_terrain", + "id": "microlab_generic_surface", + "name": "lab", + "sym": "L", + "color": "blue", + "see_cost": 5 + }, + { + "type": "overmap_terrain", + "id": "microlab_generic_surface_roof", + "copy-from": "microlab_generic_surface" + } +] diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_military.json b/data/json/overmap/overmap_terrain/overmap_terrain_military.json index 5c189a255f02d..df3b310c341b9 100644 --- a/data/json/overmap/overmap_terrain/overmap_terrain_military.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_military.json @@ -151,6 +151,42 @@ "see_cost": 2, "flags": [ "NO_ROTATE" ] }, + { + "type": "overmap_terrain", + "id": "silo_1", + "name": "missile silo", + "sym": "0", + "color": "light_gray", + "see_cost": 2, + "flags": [ "NO_ROTATE" ] + }, + { + "type": "overmap_terrain", + "id": "silo_2", + "name": "missile silo", + "sym": "0", + "color": "light_gray", + "see_cost": 2, + "flags": [ "NO_ROTATE" ] + }, + { + "type": "overmap_terrain", + "id": "silo_3", + "name": "missile silo", + "sym": "0", + "color": "light_gray", + "see_cost": 2, + "flags": [ "NO_ROTATE" ] + }, + { + "type": "overmap_terrain", + "id": "silo_4", + "name": "missile silo", + "sym": "0", + "color": "light_gray", + "see_cost": 2, + "flags": [ "NO_ROTATE" ] + }, { "type": "overmap_terrain", "id": "silo_finale", diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_robofachq.json b/data/json/overmap/overmap_terrain/overmap_terrain_robofachq.json index caaae3d76b865..1b2421f404ae8 100644 --- a/data/json/overmap/overmap_terrain/overmap_terrain_robofachq.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_robofachq.json @@ -157,6 +157,38 @@ "color": "light_blue", "see_cost": 5 }, + { + "type": "overmap_terrain", + "id": "robofachq_sub_a0", + "name": "hub 01", + "sym": "0", + "color": "light_blue", + "see_cost": 5 + }, + { + "type": "overmap_terrain", + "id": "robofachq_sub_a1", + "name": "hub 01", + "sym": "0", + "color": "light_blue", + "see_cost": 5 + }, + { + "type": "overmap_terrain", + "id": "robofachq_sub_a2", + "name": "hub 01", + "sym": "0", + "color": "light_blue", + "see_cost": 5 + }, + { + "type": "overmap_terrain", + "id": "robofachq_sub_a3", + "name": "hub 01", + "sym": "0", + "color": "light_blue", + "see_cost": 5 + }, { "type": "overmap_terrain", "id": "robofachq_ai_a0", diff --git a/data/json/player_activities.json b/data/json/player_activities.json index b69910bc5931d..e473c9e8b1541 100644 --- a/data/json/player_activities.json +++ b/data/json/player_activities.json @@ -7,6 +7,15 @@ "suspendable": false, "based_on": "speed" }, + { + "id": "ACT_FIND_MOUNT", + "type": "activity_type", + "activity_level": "LIGHT_EXERCISE", + "verb": "finding a mount", + "suspendable": false, + "based_on": "neither", + "no_resume": true + }, { "id": "ACT_READ", "type": "activity_type", @@ -21,18 +30,49 @@ "type": "activity_type", "activity_level": "ACTIVE_EXERCISE", "verb": "constructing", - "suspendable": false, - "based_on": "neither", - "no_resume": true + "based_on": "neither" }, { "id": "ACT_TIDY_UP", "type": "activity_type", "activity_level": "MODERATE_EXERCISE", "verb": "tidying up", - "suspendable": false, - "based_on": "neither", - "no_resume": true + "based_on": "neither" + }, + { + "id": "ACT_VEHICLE_DECONSTRUCTION", + "type": "activity_type", + "activity_level": "ACTIVE_EXERCISE", + "verb": "deconstructing a vehicle", + "based_on": "neither" + }, + { + "id": "ACT_MULTIPLE_CHOP_PLANKS", + "type": "activity_type", + "activity_level": "EXTRA_EXERCISE", + "verb": "chopping logs", + "based_on": "neither" + }, + { + "id": "ACT_MULTIPLE_BUTCHER", + "type": "activity_type", + "activity_level": "MODERATE_EXERCISE", + "verb": "butchering", + "based_on": "neither" + }, + { + "id": "ACT_MULTIPLE_CHOP_TREES", + "type": "activity_type", + "activity_level": "EXTRA_EXERCISE", + "verb": "chopping trees", + "based_on": "neither" + }, + { + "id": "ACT_MULTIPLE_FISH", + "type": "activity_type", + "activity_level": "LIGHT_EXERCISE", + "verb": "fishing", + "based_on": "neither" }, { "id": "ACT_GAME", @@ -139,7 +179,7 @@ "type": "activity_type", "activity_level": "ACTIVE_EXERCISE", "based_on": "neither", - "refuel_fires": "true", + "refuel_fires": true, "verb": "constructing" }, { @@ -526,14 +566,14 @@ "id": "ACT_CHOP_TREE", "type": "activity_type", "activity_level": "ACTIVE_EXERCISE", - "verb": "chopping down", + "verb": "chopping down a tree", "based_on": "speed" }, { "id": "ACT_CHOP_LOGS", "type": "activity_type", "activity_level": "ACTIVE_EXERCISE", - "verb": "chopping down", + "verb": "chopping a log", "based_on": "speed" }, { diff --git a/data/json/professions.json b/data/json/professions.json index 9c958782dbf26..f06c440545c7a 100644 --- a/data/json/professions.json +++ b/data/json/professions.json @@ -15,17 +15,31 @@ "type": "item_group", "subtype": "collection", "id": "charged_cell_phone", - "ammo": 100, - "magazine": 100, - "entries": [ { "item": "cell_phone" } ] + "entries": [ { "item": "light_plus_battery_cell", "ammo-item": "battery", "charges": 150, "container-item": "cell_phone" } ] }, { "type": "item_group", "subtype": "collection", "id": "charged_flashlight", - "ammo": 100, - "magazine": 100, - "entries": [ { "item": "flashlight" } ] + "entries": [ { "item": "light_disposable_cell", "ammo-item": "battery", "charges": 300, "container-item": "flashlight" } ] + }, + { + "type": "item_group", + "subtype": "collection", + "id": "charged_mp3", + "entries": [ { "item": "light_plus_battery_cell", "ammo-item": "battery", "charges": 150, "container-item": "mp3" } ] + }, + { + "type": "item_group", + "subtype": "collection", + "id": "charged_two_way_radio", + "entries": [ { "item": "light_disposable_cell", "ammo-item": "battery", "charges": 300, "container-item": "two_way_radio" } ] + }, + { + "type": "item_group", + "subtype": "collection", + "id": "charged_tazer", + "entries": [ { "item": "medium_disposable_cell", "ammo-item": "battery", "charges": 1200, "container-item": "tazer" } ] }, { "type": "item_group", @@ -332,10 +346,10 @@ "knife_folding", "water_clean", "matches", - "two_way_radio", "wristwatch" ], "entries": [ + { "group": "charged_two_way_radio" }, { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, { "item": "m1911", "ammo-item": "45_acp", "charges": 7, "container-item": "holster" }, { "item": "45_acp", "charges": 23 }, @@ -359,19 +373,8 @@ "skills": [ { "level": 4, "name": "tailor" } ], "items": { "both": { - "items": [ - "polo_shirt", - "blazer", - "pants", - "socks", - "dress_shoes", - "knit_scarf", - "tailors_kit", - "thread", - "scissors", - "wristwatch" - ], - "entries": [ { "group": "charged_cell_phone" } ] + "items": [ "polo_shirt", "blazer", "pants", "socks", "dress_shoes", "knit_scarf", "scissors", "wristwatch" ], + "entries": [ { "group": "charged_cell_phone" }, { "item": "tailors_kit", "ammo-item": "thread", "charges": 100 } ] }, "male": [ "briefs" ], "female": [ "bra", "panties" ] @@ -427,18 +430,10 @@ { "level": 2, "name": "mechanics" } ], "items": { - "both": [ - "dress_shirt", - "pants", - "socks", - "boots", - "coat_lab", - "gloves_rubber", - "glasses_safety", - "chemistry_set", - "smart_phone", - "wristwatch" - ], + "both": { + "items": [ "dress_shirt", "pants", "socks", "boots", "coat_lab", "gloves_rubber", "glasses_safety", "smart_phone", "wristwatch" ], + "entries": [ { "item": "medium_battery_cell", "ammo-item": "battery", "charges": 500, "container-item": "chemistry_set" } ] + }, "male": [ "briefs" ], "female": [ "bra", "panties" ] } @@ -452,23 +447,13 @@ "skills": [ { "level": 3, "name": "mechanics" } ], "items": { "both": { - "ammo": 100, - "magazine": 100, - "items": [ - "slingpack", - "tank_top", - "jeans", - "socks", - "boots_steel", - "tool_belt", - "wrench", - "duct_tape", - "screwdriver", - "wristwatch", - "mag_cars", - "welder" - ], - "entries": [ { "item": "goggles_welding", "custom-flags": [ "no_auto_equip" ] }, { "group": "charged_cell_phone" } ] + "items": [ "slingpack", "tank_top", "jeans", "socks", "boots_steel", "duct_tape", "screwdriver", "wristwatch", "mag_cars" ], + "entries": [ + { "item": "goggles_welding", "custom-flags": [ "no_auto_equip" ] }, + { "group": "charged_cell_phone" }, + { "item": "wrench", "container-item": "tool_belt" }, + { "item": "medium_battery_cell", "ammo-item": "battery", "charges": 500, "container-item": "welder" } + ] }, "male": [ "boxer_shorts" ], "female": [ "bra", "boy_shorts" ] @@ -562,7 +547,6 @@ "items": { "both": { "items": [ - "foodperson_mask", "pants_cargo", "briefs", "cape_fp", @@ -574,7 +558,12 @@ "chestguard_hard", "boots_rubber" ], - "entries": [ { "item": "medium_disposable_cell" }, { "group": "snacks_fancy" }, { "group": "snacks" }, { "item": "bat" } ] + "entries": [ + { "item": "medium_disposable_cell", "ammo-item": "battery", "charges": 1200, "container-item": "foodperson_mask" }, + { "group": "snacks_fancy" }, + { "group": "snacks" }, + { "item": "bat" } + ] } } }, @@ -630,11 +619,11 @@ "gloves_tactical", "socks", "boots_combat", - "two_way_radio", "wristwatch", "molle_pack" ], "entries": [ + { "group": "charged_two_way_radio" }, { "item": "modularvest", "contents-group": "army_mags_m4" }, { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, { "item": "knife_combat", "container-item": "sheath" }, @@ -943,9 +932,10 @@ "pets": [ { "name": "mon_dog_gshepherd", "amount": 1 } ], "items": { "both": { - "items": [ "pants_army", "socks", "badge_deputy", "sheriffshirt", "boots", "dog_whistle", "two_way_radio", "wristwatch" ], + "items": [ "pants_army", "socks", "badge_deputy", "sheriffshirt", "police_belt", "boots", "dog_whistle", "wristwatch" ], "entries": [ { "group": "charged_cell_phone" }, + { "group": "charged_two_way_radio" }, { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, { "item": "usp_45", "ammo-item": "45_acp", "charges": 12, "container-item": "holster" }, { "item": "legpouch_large", "contents-group": "army_mags_usp45" } @@ -992,9 +982,10 @@ "traits": [ "PROF_POLICE" ], "items": { "both": { - "items": [ "pants_army", "socks", "badge_deputy", "sheriffshirt", "boots", "whistle", "two_way_radio", "wristwatch" ], + "items": [ "pants_army", "socks", "badge_deputy", "sheriffshirt", "police_belt", "boots", "whistle", "wristwatch" ], "entries": [ { "group": "charged_cell_phone" }, + { "group": "charged_two_way_radio" }, { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, { "item": "usp_45", "ammo-item": "45_acp", "charges": 12, "container-item": "holster" }, { "item": "legpouch_large", "contents-group": "army_mags_usp45" } @@ -1019,6 +1010,7 @@ "tie_skinny", "waistcoat", "trenchcoat", + "police_belt", "badge_detective", "gloves_leather", "knit_scarf", @@ -1026,12 +1018,12 @@ "wristwatch", "socks", "dress_shoes", - "two_way_radio", "cig", "ref_lighter" ], "entries": [ { "group": "charged_cell_phone" }, + { "group": "charged_two_way_radio" }, { "item": "sw_619", "ammo-item": "357mag_fmj", "charges": 6, "container-item": "sholster" }, { "item": "357mag_fmj", "charges": 24 } ] @@ -1052,10 +1044,11 @@ "traits": [ "PROF_SWAT" ], "items": { "both": { - "items": [ "socks", "swat_armor", "tac_helmet", "boots_combat", "gloves_tactical", "badge_swat", "two_way_radio", "wristwatch" ], + "items": [ "socks", "swat_armor", "police_belt", "tac_helmet", "boots_combat", "gloves_tactical", "badge_swat", "wristwatch" ], "entries": [ + { "group": "charged_two_way_radio" }, { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, - { "item": "chestrig", "contents-group": [ "army_mags_mp5", "army_mags_usp9" ] }, + { "item": "tacvest", "contents-group": [ "army_mags_mp5", "army_mags_usp9" ] }, { "item": "grenadebandolier", "contents-item": [ "flashbang", "flashbang" ] }, { "item": "usp_9mm", "ammo-item": "9mm", "charges": 15, "container-item": "sholster" }, { @@ -1086,23 +1079,15 @@ "traits": [ "PROF_SWAT" ], "items": { "both": { - "items": [ - "socks", - "swat_armor", - "tac_fullhelmet", - "boots_combat", - "gloves_tactical", - "badge_swat", - "baton", - "two_way_radio", - "wristwatch" - ], + "items": [ "socks", "swat_armor", "tac_fullhelmet", "boots_combat", "gloves_tactical", "badge_swat", "wristwatch" ], "entries": [ + { "group": "charged_two_way_radio" }, { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, { "item": "shot_00", "charges": 12, "container-item": "bandolier_shotgun" }, { "item": "shot_slug", "charges": 12, "container-item": "bandolier_shotgun" }, { "item": "legpouch_large", "contents-group": "army_mags_usp9" }, { "item": "usp_9mm", "ammo-item": "9mmfmj", "charges": 15, "container-item": "sholster" }, + { "item": "baton-extended", "container-item": "police_belt" }, { "item": "ksg", "ammo-item": "shot_00", "charges": 7, "contents-item": "shoulder_strap" } ] }, @@ -1120,10 +1105,10 @@ "traits": [ "PROF_POLICE" ], "items": { "both": { - "ammo": 100, "items": [ "socks", "pants_army", + "police_belt", "sheriffshirt", "sweatshirt", "sneakers", @@ -1132,13 +1117,13 @@ "hat_ball", "badge_deputy", "wristwatch", - "two_way_radio", "powered_earmuffs" ], "entries": [ + { "group": "charged_two_way_radio" }, { "item": "usp_45", "ammo-item": "45_acp", "charges": 12, "container-item": "holster" }, { "item": "legpouch_large", "contents-group": "army_mags_usp45" }, - { "item": "m14mag", "ammo-item": "762_51", "charges": 20, "container-item": "chestrig" }, + { "item": "m14mag", "ammo-item": "762_51", "charges": 20, "container-item": "tacvest" }, { "item": "M24", "ammo-item": "762_51", "charges": 20, "container-item": "back_holster" } ] }, @@ -1172,17 +1157,16 @@ "helmet_riot", "armguard_hard", "legguard_hard", - "police_belt", "badge_deputy", - "two_way_radio", "wristwatch", - "tonfa", "gasbomb" ], "entries": [ + { "group": "charged_two_way_radio" }, { "item": "usp_45", "ammo-item": "45_acp", "charges": 12, "container-item": "holster" }, { "item": "legpouch_large", "contents-group": "army_mags_usp45" }, - { "item": "tazer", "charges": 100 } + { "item": "tonfa", "container-item": "police_belt" }, + { "group": "charged_tazer" } ] }, "male": [ "boxer_shorts" ], @@ -1303,13 +1287,13 @@ { "type": "profession", "ident": "construction_worker", - "name": "Handy Man", + "name": { "male": "Handy Man", "female": "Handy Woman" }, "description": "You used to work at a local hardware store, and you did a lot of home renovations yourself. Now you look out at the horizon of a ruined world, and wonder - are your meager skills, and the few supplies you grabbed on the way out, sufficient to help it rebuild?", "points": 1, "skills": [ { "level": 2, "name": "fabrication" } ], "items": { "both": { - "items": [ "tank_top", "socks", "boots_steel", "jeans", "multitool", "wristwatch" ], + "items": [ "tank_top", "socks", "boots_steel", "pants", "multitool", "wristwatch" ], "entries": [ { "group": "charged_cell_phone" }, { "item": "nailgun", "ammo-item": "nail", "charges": 20 }, @@ -1318,7 +1302,7 @@ ] }, "male": [ "boxer_shorts" ], - "female": [ "bra", "boxer_shorts" ] + "female": [ "bra", "panties" ] } }, { @@ -1373,18 +1357,8 @@ "skills": [ { "level": 3, "name": "electronics" } ], "items": { "both": { - "ammo": 100, - "magazine": 100, - "items": [ - "jumpsuit", - "socks", - "boots", - "tool_belt", - "flashlight", - "wristwatch", - { "item": "light_battery_cell", "charges": 100 } - ], - "entries": [ { "group": "charged_cell_phone" } ] + "items": [ "jumpsuit", "socks", "boots", "tool_belt", "wristwatch" ], + "entries": [ { "group": "charged_cell_phone" }, { "group": "charged_flashlight" } ] }, "male": [ "boxer_briefs" ], "female": [ "bra", "panties" ] @@ -1398,17 +1372,10 @@ "points": 1, "skills": [ { "level": 4, "name": "computer" } ], "items": { - "both": [ - "pants", - [ "tshirt_text", "allyourbase" ], - "socks", - "sneakers", - "portable_game", - "mbag", - "laptop", - "smart_phone", - "caffeine" - ], + "both": { + "items": [ "pants", "tshirt_text", "socks", "sneakers", "mbag", "laptop", "smart_phone", "caffeine" ], + "entries": [ { "item": "light_plus_battery_cell", "ammo-item": "battery", "charges": 150, "container-item": "portable_game" } ] + }, "male": [ "briefs" ], "female": [ "panties" ] } @@ -1585,13 +1552,13 @@ "name": "Industrial Cyborg", "description": "For better or for worse, bionic augmentation has turned you into a walking power tool. Upgraded with a standard industrial-grade manual labor surgery and training package, you are augmented with bionic muscles and an integrated toolset, both powered by standard batteries.", "points": 6, - "skills": [ { "level": 3, "name": "fabrication" }, { "level": 3, "name": "mechanics" } ], + "skills": [ { "level": 4, "name": "fabrication" }, { "level": 2, "name": "mechanics" } ], "CBMs": [ "bio_tools", "bio_sunglasses", "bio_flashlight", "bio_hydraulics", - "bio_batteries", + "bio_cable", "bio_power_storage_mkII", "bio_power_storage_mkII" ], @@ -1681,21 +1648,21 @@ "skills": [ { "level": 1, "name": "gun" }, { "level": 1, "name": "pistol" } ], "items": { "both": { - "ammo": 100, "items": [ "tac_fullhelmet", + "police_belt", "pants_cargo", "under_armor", "socks", "boots", "badge_cybercop", "smart_phone", - "wristwatch", - "two_way_radio" + "wristwatch" ], "entries": [ + { "group": "charged_two_way_radio" }, { "item": "glock_18c", "ammo-item": "9mmP", "container-item": "holster" }, - { "item": "chestrig", "container-group": "army_mags_glock17" } + { "item": "tacvest", "contents-group": "army_mags_glock17" } ] }, "male": [ "boxer_shorts" ], @@ -1775,7 +1742,6 @@ ], "items": { "both": { - "ammo": 100, "items": [ "winter_pants_army", "winter_jacket_army", @@ -1784,10 +1750,10 @@ "tac_helmet", "socks", "boots_combat", - "wristwatch", - "two_way_radio" + "wristwatch" ], "entries": [ + { "group": "charged_two_way_radio" }, { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, { "item": "sheath", "contents-item": "knife_combat" }, { "item": "h&k416a5", "ammo-item": "556", "contents-item": [ "shoulder_strap", "acog_scope" ] }, @@ -1824,8 +1790,6 @@ ], "items": { "both": { - "ammo": 100, - "magazine": 100, "items": [ "winter_pants_army", "army_top", @@ -1837,16 +1801,16 @@ "socks", "boots_combat", "canteen", - "two_way_radio", "wristwatch", "tent_kit", "rollmat", - "mil_mess_kit", "e_tool", "binoculars", "knife_hunting" ], "entries": [ + { "item": "medium_plus_battery_cell", "ammo-item": "battery", "charges": 600, "container-item": "mil_mess_kit" }, + { "group": "charged_two_way_radio" }, { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, { "item": "hat_boonie", "custom-flags": [ "no_auto_equip" ] }, { @@ -1857,7 +1821,7 @@ { "item": "usp_45", "ammo-item": "45_acp", "charges": 12, "container-item": "holster" }, { "item": "usp45mag", "ammo-item": "45_acp", "charges": 12 }, { "item": "usp45mag", "ammo-item": "45_acp", "charges": 12 }, - { "item": "chestrig", "contents-group": [ "army_mags_m2010" ] } + { "item": "tacvest", "contents-group": [ "army_mags_m2010" ] } ] }, "male": [ "boxer_shorts" ], @@ -1895,7 +1859,6 @@ "CBMs": [ "bio_cqb", "bio_blade", - "bio_shotgun", "bio_shock", "bio_carbon", "bio_adrenaline", @@ -1911,6 +1874,44 @@ "female": [ "bra", "panties", "stockings", "skirt" ] } }, + { + "type": "profession", + "ident": "bio_gangster", + "name": "Bionic Gangster", + "description": "You were the boss' favorite, their protege; they always counted on you to get the toughest jobs done. Seeing your potential, they invested in \"basic\" augments and the best gear on the market to better aid you in your job. After enjoying some period of freedom to do as you wanted, now you find yourself needing those skills to survive. ", + "points": 8, + "CBMs": [ + "bio_targeting", + "bio_shotgun", + "bio_carbon", + "bio_adrenaline", + "bio_night_vision", + "bio_face_mask", + "bio_metabolics", + "bio_power_storage_mkII" + ], + "skills": [ + { "level": 1, "name": "melee" }, + { "level": 1, "name": "unarmed" }, + { "level": 1, "name": "stabbing" }, + { "level": 1, "name": "gun" }, + { "level": 1, "name": "pistol" }, + { "level": 1, "name": "shotgun" }, + { "level": 1, "name": "driving" } + ], + "items": { + "both": { + "items": [ "suit", "bowhat", "socks", "dress_shoes", "knit_scarf", "cig", "switchblade", "mag_porn", "sunglasses", "shot_00" ], + "entries": [ + { "item": "glock_19", "ammo-item": "9mm", "container-item": "sholster", "charges": 15 }, + { "item": "glockmag", "ammo-item": "9mm", "charges": 15 }, + { "item": "ref_lighter", "charges": 100 } + ] + }, + "male": [ "boxer_shorts" ], + "female": [ "bra", "panties" ] + } + }, { "type": "profession", "ident": "faulty_bionic", @@ -1940,7 +1941,7 @@ "ident": "bionic_customer", "name": "Commercial Cyborg", "description": "You always had to have the latest and best gadgets and gizmos, so is it any wonder that you upgraded your flesh along with your smart phone? Only time will tell if your passion for electronics and your status as a marvel of bionic technology will be enough to ensure your survival after the apocalypse.", - "points": 8, + "points": 6, "CBMs": [ "bio_flashlight", "bio_tools", "bio_ups", "bio_watch", "bio_batteries", "bio_power_storage_mkII" ], "skills": [ { "level": 4, "name": "electronics" }, { "level": 2, "name": "fabrication" } ], "items": { @@ -1981,7 +1982,8 @@ "wristwatch", "tobacco", "rolling_paper", - "matches" + "matches", + "backpack" ], "entries": [ { "group": "charged_cell_phone" }, { "item": "knife_hunting", "container-item": "sheath" } ] }, @@ -2094,11 +2096,10 @@ "weed", "tobacco", "rolling_paper", - "mp3", "ref_lighter", "wristwatch" ], - "entries": [ { "group": "charged_cell_phone" } ] + "entries": [ { "group": "charged_cell_phone" }, { "group": "charged_mp3" } ] }, "male": [ "pants_cargo", "tank_top", "boxer_shorts" ], "female": [ "skirt", "corset", "boxer_shorts" ] @@ -2150,10 +2151,9 @@ "rolling_paper", "tobacco", "wristwatch", - "mp3", "ref_lighter" ], - "entries": [ { "group": "charged_cell_phone" } ] + "entries": [ { "group": "charged_cell_phone" }, { "group": "charged_mp3" } ] }, "male": [ "briefs" ], "female": [ "bra", "panties" ] @@ -2708,7 +2708,7 @@ ], "entries": [ { "group": "charged_cell_phone" }, - { "item": "sw_619", "ammo-item": "38_special", "container-item": "holster" }, + { "item": "sw_619", "ammo-item": "38_special", "charges": 7, "container-item": "holster" }, { "item": "38_special", "charges": 33 } ] }, @@ -2841,18 +2841,9 @@ ], "items": { "both": { - "ammo": 100, - "items": [ - "survivor_vest", - "wsurvivor_suit", - "socks", - "boots_wsurvivor", - "hood_wsurvivor", - "gloves_wsurvivor", - "mess_kit", - "wristwatch" - ], + "items": [ "survivor_vest", "wsurvivor_suit", "socks", "boots_wsurvivor", "hood_wsurvivor", "gloves_wsurvivor", "wristwatch" ], "entries": [ + { "item": "medium_battery_cell", "ammo-item": "battery", "charges": 500, "container-item": "mess_kit" }, { "item": "kukri", "container-item": "sheath" }, { "item": "crossbow", "ammo-item": "bolt_wood", "contents-item": "shoulder_strap" }, { "item": "bolt_wood", "charges": 29, "container-item": "quiver_large" } @@ -2923,19 +2914,23 @@ "balclava", "boots_combat", "gloves_tactical", - "chestrig", "tac_helmet", "canteen", - "mil_mess_kit", "wristwatch", - "two_way_radio", "quikclot" ], "entries": [ { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, { "item": "knife_combat", "container-item": "sheath" }, { "item": "m4a1", "ammo-item": "556", "contents-item": "shoulder_strap" }, - { "item": "stanag30", "ammo-item": "556", "count": 2 } + { + "item": "medium_plus_battery_cell", + "ammo-item": "battery", + "charges": 600, + "container-item": "mil_mess_kit" + }, + { "group": "charged_two_way_radio" }, + { "item": "chestrig", "contents-group": "army_mags_m4" } ] }, "male": [ "boxer_shorts" ], @@ -2961,7 +2956,6 @@ ], "items": { "both": { - "ammo": 100, "items": [ "tank_top", "pants_leather", @@ -2976,16 +2970,16 @@ "canteen", "whistle", "binoculars", - "wearable_light", "duct_tape", "ref_lighter", - "wristwatch", - "gasoline_cooker" + "wristwatch" ], "entries": [ { "item": "knife_combat", "container-item": "sheath" }, + { "item": "gasoline_cooker", "ammo_item": "gasoline", "charges": 500 }, { "item": "XL_holster", "contents-group": "shotgun_d_roadwarrior" }, - { "item": "reloaded_shot_00", "charges": 18, "container-item": "bandolier_shotgun" } + { "item": "reloaded_shot_00", "charges": 18, "container-item": "bandolier_shotgun" }, + { "item": "light_battery_cell", "charges": 100, "container-item": "wearable_light" } ] }, "male": [ "boxer_shorts" ], @@ -3095,19 +3089,8 @@ "points": 0, "items": { "both": { - "items": [ - "pants", - "socks", - "boots", - "longshirt", - "jacket_light", - "baton", - "tazer", - "medium_battery_cell", - "pockknife", - "wristwatch" - ], - "entries": [ { "group": "charged_cell_phone" }, { "group": "charged_flashlight" } ] + "items": [ "pants", "socks", "boots", "longshirt", "jacket_light", "baton", "pockknife", "wristwatch" ], + "entries": [ { "group": "charged_cell_phone" }, { "group": "charged_flashlight" }, { "group": "charged_tazer" } ] }, "male": [ "boxer_shorts" ], "female": [ "bra", "boy_shorts" ] @@ -3174,8 +3157,6 @@ "fishing_waders", "knit_scarf", "fishing_rod_professional", - "fish_bait", - "fish_trap", "vest", "hat_boonie", "wristwatch", @@ -3183,6 +3164,8 @@ ], "entries": [ { "group": "charged_cell_phone" }, + { "item": "fish_trap", "ammo-item": "fish_bait", "charges": 5 }, + { "item": "fish_bait", "charges": 15 }, { "item": "lighter", "charges": 100 }, { "item": "knife_hunting", "container-item": "sheath" } ] @@ -3208,21 +3191,24 @@ "items": [ "stockings", "pockknife", "matches", "pipe_tobacco", "tobacco" ], "entries": [ { "group": "charged_cell_phone" } ] }, - "male": [ - "knee_high_boots", - "breeches", - "waistcoat", - "peacoat", - "leather_belt", - "knit_scarf", - "tricorne", - "shoulder_strap", - "flintlock_pouch", - "rifle_flintlock", - "flintlock_ammo", - "hatchet", - "hardtack" - ], + "male": { + "items": [ + "knee_high_boots", + "breeches", + "waistcoat", + "peacoat", + "leather_belt", + "knit_scarf", + "tricorne", + "hatchet", + "hardtack" + ], + "entries": [ + { "item": "rifle_flintlock", "ammo-item": "flintlock_ammo", "charges": 1, "contents-item": "shoulder_strap" }, + { "item": "flintlock_ammo", "charges": 14, "container-item": "flintlock_pouch" }, + { "item": "flintlock_ammo", "charges": 15 } + ] + }, "female": [ "dress", "apron_leather", @@ -3270,21 +3256,24 @@ "cornmeal", "salt" ], - "female": [ - "knee_high_boots", - "breeches", - "waistcoat", - "peacoat", - "leather_belt", - "knit_scarf", - "tricorne", - "shoulder_strap", - "flintlock_pouch", - "rifle_flintlock", - "flintlock_ammo", - "hatchet", - "hardtack" - ] + "female": { + "items": [ + "knee_high_boots", + "breeches", + "waistcoat", + "peacoat", + "leather_belt", + "knit_scarf", + "tricorne", + "hatchet", + "hardtack" + ], + "entries": [ + { "item": "rifle_flintlock", "ammo-item": "flintlock_ammo", "charges": 1, "contents-item": "shoulder_strap" }, + { "item": "flintlock_ammo", "charges": 14, "container-item": "flintlock_pouch" }, + { "item": "flintlock_ammo", "charges": 15 } + ] + } } }, { @@ -3514,8 +3503,11 @@ "points": 0, "items": { "both": { - "items": [ "pants", "dress_shirt", "blazer", "socks", "dress_shoes", "camera_pro", "wristwatch" ], - "entries": [ { "group": "charged_cell_phone" } ] + "items": [ "pants", "dress_shirt", "blazer", "socks", "dress_shoes", "wristwatch" ], + "entries": [ + { "group": "charged_cell_phone" }, + { "item": "light_disposable_cell", "ammo-item": "battery", "charges": 300, "container-item": "camera_pro" } + ] }, "male": [ "boxer_shorts" ], "female": [ "boy_shorts", "bra" ] @@ -3590,7 +3582,6 @@ "boots_steel", "gloves_work", "knee_pads", - "miner_hat", "jumpsuit", "mask_gas", "jackhammer", @@ -3603,8 +3594,8 @@ ], "entries": [ { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, - { "item": "light_battery_cell", "charges": 100 }, - { "item": "light_battery_cell", "charges": 100 } + { "item": "light_minus_disposable_cell", "charges": 100 }, + { "item": "light_minus_disposable_cell", "charges": 100, "container-item": "miner_hat" } ] }, "male": [ "boxer_shorts" ], @@ -3938,5 +3929,41 @@ "male": [ "boxer_shorts" ], "female": [ "bra", "boy_shorts" ] } + }, + { + "type": "profession", + "ident": "gunslinger", + "name": "Wild West Gunslinger", + "description": "You made your living on Wild West exhibitions and shows, impressing tourists with your displays of marksmanship. But that world has ended, so you took your trusty 6-shooter and wandered into a world where it's always high noon.", + "points": 4, + "skills": [ + { "level": 4, "name": "gun" }, + { "level": 3, "name": "pistol" }, + { "level": 2, "name": "shotgun" }, + { "level": 1, "name": "survival" } + ], + "items": { + "both": { + "items": [ + "under_armor", + "under_armor_shorts", + "cowboy_hat", + "socks", + "jeans", + "chaps_leather", + "gloves_leather", + "boots_western", + "duster", + "badge_deputy", + "sheriffshirt" + ], + "entries": [ + { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, + { "item": "45colt_jhp", "charges": 18, "container-item": "bandolier_pistol" }, + { "item": "whiskey", "container-item": "bottle_glass" }, + { "item": "colt_saa", "ammo-item": "45colt_jhp", "charges": 6, "container-item": "sholster" } + ] + } + } } ] diff --git a/data/json/recipes/ammo/components.json b/data/json/recipes/ammo/components.json index 260d505ca603d..7924f6d18a24c 100644 --- a/data/json/recipes/ammo/components.json +++ b/data/json/recipes/ammo/components.json @@ -20,6 +20,7 @@ "skill_used": "fabrication", "difficulty": 1, "time": "15 s", + "charges": 1, "book_learn": [ [ "pocket_firearms", 3 ], [ "manual_gun", 2 ], [ "recipe_bullets", 1 ], [ "textbook_anarch", 0 ] ], "tools": [ [ [ "mortar_pestle", -1 ] ], [ [ "sieve_steel", -1 ] ] ], "components": [ diff --git a/data/json/recipes/ammo/grenades.json b/data/json/recipes/ammo/grenades.json index 28d6f96d23fdf..3e59e5f1e38de 100644 --- a/data/json/recipes/ammo/grenades.json +++ b/data/json/recipes/ammo/grenades.json @@ -29,7 +29,7 @@ "reversible": true, "book_learn": [ [ "manual_launcher", 4 ], [ "manual_shotgun", 6 ] ], "charges": 1, - "using": [ [ "bullet_forming", 2 ], [ "ammo_40mm", 1 ], [ "ammo_bullet", 12 ] ], + "using": [ [ "shot_forming", 2 ], [ "ammo_40mm", 1 ], [ "ammo_bullet", 12 ] ], "components": [ [ [ "gunpowder", 30 ], [ "gunpowder_pistol", 30 ], [ "gunpowder_shotgun", 30 ] ] ] }, { diff --git a/data/json/recipes/ammo/pistol.json b/data/json/recipes/ammo/pistol.json index 49d65e9cd1ee1..2d36358bc4e87 100644 --- a/data/json/recipes/ammo/pistol.json +++ b/data/json/recipes/ammo/pistol.json @@ -11,8 +11,9 @@ "batch_time_factors": [ 60, 5 ], "book_learn": [ [ "manual_pistol", 1 ], [ "manual_smg", 1 ], [ "recipe_bullets", 2 ] ], "charges": 1, + "reversible": true, "using": [ [ "bullet_forming", 2 ], [ "ammo_bullet", 2 ], [ "ammo_9mm", 1 ] ], - "components": [ [ [ "chem_black_powder", 3 ] ] ] + "components": [ [ [ "chem_black_powder", 4 ] ] ] }, { "result": "bp_9mmfmj", @@ -26,7 +27,264 @@ "batch_time_factors": [ 60, 5 ], "book_learn": [ [ "manual_pistol", 2 ], [ "manual_smg", 2 ], [ "recipe_bullets", 3 ] ], "charges": 1, + "reversible": true, "using": [ [ "bullet_forming", 2 ], [ "ammo_bullet", 2 ], [ "ammo_9mm", 1 ] ], + "components": [ [ [ "chem_black_powder", 4 ] ], [ [ "copper", 1 ] ] ] + }, + { + "result": "bp_40fmj", + "type": "recipe", + "category": "CC_AMMO", + "subcategory": "CSC_AMMO_PISTOL", + "skill_used": "fabrication", + "difficulty": 4, + "skills_required": [ "gun", 4 ], + "time": "2 m", + "batch_time_factors": [ 60, 5 ], + "book_learn": [ [ "manual_pistol", 3 ], [ "recipe_bullets", 4 ] ], + "charges": 1, + "reversible": true, + "using": [ [ "bullet_forming", 2 ], [ "ammo_bullet", 2 ] ], + "components": [ [ [ "40_casing", 1 ] ], [ [ "smpistol_primer", 1 ] ], [ [ "chem_black_powder", 6 ] ], [ [ "copper", 1 ] ] ] + }, + { + "result": "bp_40sw", + "type": "recipe", + "category": "CC_AMMO", + "subcategory": "CSC_AMMO_PISTOL", + "skill_used": "fabrication", + "difficulty": 3, + "skills_required": [ "gun", 1 ], + "time": "2 m", + "batch_time_factors": [ 60, 5 ], + "book_learn": [ [ "manual_pistol", 2 ], [ "recipe_bullets", 3 ] ], + "charges": 1, + "reversible": true, + "using": [ [ "bullet_forming", 2 ], [ "ammo_bullet", 2 ] ], + "components": [ [ [ "40_casing", 1 ] ], [ [ "smpistol_primer", 1 ] ], [ [ "chem_black_powder", 6 ] ] ] + }, + { + "result": "bp_32_acp", + "type": "recipe", + "category": "CC_AMMO", + "subcategory": "CSC_AMMO_PISTOL", + "skill_used": "fabrication", + "difficulty": 2, + "skills_required": [ "gun", 1 ], + "time": "2 m", + "batch_time_factors": [ 60, 5 ], + "book_learn": [ [ "recipe_bullets", 5 ] ], + "charges": 1, + "reversible": true, + "using": [ [ "bullet_forming", 2 ], [ "ammo_bullet", 2 ] ], + "components": [ [ [ "32_casing", 1 ] ], [ [ "smpistol_primer", 1 ] ], [ [ "chem_black_powder", 3 ] ] ] + }, + { + "result": "bp_38_fmj", + "type": "recipe", + "category": "CC_AMMO", + "subcategory": "CSC_AMMO_PISTOL", + "skill_used": "fabrication", + "difficulty": 4, + "skills_required": [ "gun", 4 ], + "time": "2 m", + "batch_time_factors": [ 60, 5 ], + "book_learn": [ [ "manual_pistol", 2 ], [ "recipe_bullets", 3 ] ], + "charges": 1, + "reversible": true, + "using": [ [ "bullet_forming", 2 ], [ "ammo_bullet", 2 ] ], + "components": [ [ [ "38_casing", 1 ] ], [ [ "smpistol_primer", 1 ] ], [ [ "chem_black_powder", 3 ] ], [ [ "copper", 1 ] ] ] + }, + { + "result": "bp_44fmj", + "type": "recipe", + "category": "CC_AMMO", + "subcategory": "CSC_AMMO_PISTOL", + "skill_used": "fabrication", + "difficulty": 5, + "skills_required": [ "gun", 4 ], + "time": "2 m", + "batch_time_factors": [ 60, 5 ], + "book_learn": [ [ "recipe_bullets", 3 ], [ "manual_pistol", 4 ] ], + "charges": 1, + "reversible": true, + "using": [ [ "bullet_forming", 5 ], [ "ammo_bullet", 4 ] ], + "components": [ [ [ "44_casing", 1 ] ], [ [ "lgpistol_primer", 1 ] ], [ [ "chem_black_powder", 9 ] ], [ [ "copper", 2 ] ] ] + }, + { + "result": "bp_45_acp", + "type": "recipe", + "category": "CC_AMMO", + "subcategory": "CSC_AMMO_PISTOL", + "skill_used": "fabrication", + "difficulty": 5, + "skills_required": [ "gun", 5 ], + "time": "2 m", + "batch_time_factors": [ 60, 5 ], + "book_learn": [ [ "manual_pistol", 3 ], [ "manual_smg", 3 ], [ "recipe_bullets", 4 ] ], + "charges": 1, + "reversible": true, + "using": [ [ "bullet_forming", 3 ], [ "ammo_bullet", 3 ] ], + "components": [ [ [ "45_casing", 1 ] ], [ [ "lgpistol_primer", 1 ] ], [ [ "chem_black_powder", 6 ] ] ] + }, + { + "result": "bp_45_jhp", + "type": "recipe", + "category": "CC_AMMO", + "subcategory": "CSC_AMMO_PISTOL", + "skill_used": "fabrication", + "difficulty": 5, + "skills_required": [ "gun", 5 ], + "time": "2 m", + "batch_time_factors": [ 60, 5 ], + "book_learn": [ [ "manual_pistol", 2 ], [ "manual_smg", 2 ], [ "recipe_bullets", 3 ] ], + "charges": 1, + "reversible": true, + "using": [ [ "bullet_forming", 3 ], [ "ammo_bullet", 3 ] ], + "components": [ [ [ "45_casing", 1 ] ], [ [ "lgpistol_primer", 1 ] ], [ [ "chem_black_powder", 6 ] ] ] + }, + { + "result": "bp_46mm", + "type": "recipe", + "category": "CC_AMMO", + "subcategory": "CSC_AMMO_PISTOL", + "skill_used": "fabrication", + "difficulty": 4, + "skills_required": [ "gun", 3 ], + "time": "2 m", + "batch_time_factors": [ 60, 5 ], + "book_learn": [ [ "recipe_bullets", 3 ], [ "mag_rifle", 4 ] ], + "charges": 1, + "reversible": true, + "using": [ [ "bullet_forming", 2 ], [ "ammo_bullet", 2 ] ], + "components": [ [ [ "46mm_casing", 1 ] ], [ [ "smpistol_primer", 1 ] ], [ [ "chem_black_powder", 6 ] ] ] + }, + { + "result": "bp_460_fmj", + "type": "recipe", + "category": "CC_AMMO", + "subcategory": "CSC_AMMO_PISTOL", + "skill_used": "fabrication", + "difficulty": 5, + "skills_required": [ "gun", 4 ], + "time": "2 m", + "batch_time_factors": [ 60, 5 ], + "book_learn": [ [ "recipe_bullets", 3 ], [ "manual_pistol", 4 ] ], + "charges": 1, + "reversible": true, + "using": [ [ "bullet_forming", 3 ], [ "ammo_bullet", 3 ] ], + "components": [ [ [ "460_casing", 1 ] ], [ [ "lgpistol_primer", 1 ] ], [ [ "chem_black_powder", 9 ] ], [ [ "copper", 2 ] ] ] + }, + { + "result": "bp_460_rowland", + "type": "recipe", + "category": "CC_AMMO", + "subcategory": "CSC_AMMO_PISTOL", + "skill_used": "fabrication", + "difficulty": 4, + "skills_required": [ "gun", 3 ], + "time": "2 m", + "batch_time_factors": [ 60, 5 ], + "book_learn": [ [ "recipe_bullets", 3 ], [ "manual_pistol", 4 ] ], + "charges": 1, + "reversible": true, + "using": [ [ "bullet_forming", 3 ], [ "ammo_bullet", 3 ] ], + "components": [ [ [ "460_casing", 1 ] ], [ [ "lgpistol_primer", 1 ] ], [ [ "chem_black_powder", 9 ] ] ] + }, + { + "result": "bp_500_Magnum", + "type": "recipe", + "category": "CC_AMMO", + "subcategory": "CSC_AMMO_PISTOL", + "skill_used": "fabrication", + "difficulty": 9, + "skills_required": [ "gun", 7 ], + "time": "2 m", + "batch_time_factors": [ 60, 5 ], + "book_learn": [ [ "recipe_bullets", 7 ], [ "manual_pistol", 8 ] ], + "charges": 1, + "reversible": true, + "using": [ [ "bullet_forming", 6 ], [ "ammo_bullet", 5 ] ], + "components": [ [ [ "500_casing", 1 ] ], [ [ "lgrifle_primer", 1 ] ], [ [ "chem_black_powder", 12 ] ], [ [ "copper", 2 ] ] ] + }, + { + "result": "bp_762_25", + "type": "recipe", + "category": "CC_AMMO", + "subcategory": "CSC_AMMO_PISTOL", + "skill_used": "fabrication", + "difficulty": 5, + "skills_required": [ "gun", 4 ], + "time": "2 m", + "batch_time_factors": [ 60, 5 ], + "book_learn": [ [ "recipe_bullets", 3 ], [ "manual_pistol", 3 ] ], + "charges": 1, + "reversible": true, + "using": [ [ "bullet_forming", 2 ], [ "ammo_bullet", 2 ], [ "ammo_762_25", 1 ] ], + "components": [ [ [ "chem_black_powder", 6 ] ] ] + }, + { + "result": "bp_9x18mm", + "type": "recipe", + "category": "CC_AMMO", + "subcategory": "CSC_AMMO_PISTOL", + "skill_used": "fabrication", + "difficulty": 3, + "skills_required": [ "gun", 1 ], + "time": "2 m", + "batch_time_factors": [ 60, 5 ], + "book_learn": [ [ "recipe_bullets", 1 ], [ "manual_pistol", 2 ] ], + "charges": 1, + "reversible": true, + "using": [ [ "bullet_forming", 2 ], [ "ammo_bullet", 2 ] ], + "components": [ [ [ "9x18mm_casing", 1 ] ], [ [ "smpistol_primer", 1 ] ], [ [ "chem_black_powder", 4 ] ] ] + }, + { + "result": "bp_9x18mmfmj", + "type": "recipe", + "category": "CC_AMMO", + "subcategory": "CSC_AMMO_PISTOL", + "skill_used": "fabrication", + "difficulty": 4, + "skills_required": [ "gun", 4 ], + "time": "2 m", + "batch_time_factors": [ 60, 5 ], + "book_learn": [ [ "recipe_bullets", 3 ], [ "manual_pistol", 4 ] ], + "charges": 1, + "reversible": true, + "using": [ [ "bullet_forming", 2 ], [ "ammo_bullet", 2 ] ], + "components": [ [ [ "9x18mm_casing", 1 ] ], [ [ "smpistol_primer", 1 ] ], [ [ "chem_black_powder", 4 ] ], [ [ "copper", 1 ] ] ] + }, + { + "result": "bp_380_JHP", + "type": "recipe", + "category": "CC_AMMO", + "subcategory": "CSC_AMMO_PISTOL", + "skill_used": "fabrication", + "difficulty": 4, + "skills_required": [ "gun", 4 ], + "time": "2 m", + "batch_time_factors": [ 60, 5 ], + "book_learn": [ [ "manual_pistol", 1 ], [ "manual_smg", 1 ], [ "recipe_bullets", 2 ] ], + "charges": 1, + "reversible": true, + "using": [ [ "bullet_forming", 2 ], [ "ammo_bullet", 2 ], [ "ammo_380", 1 ] ], + "components": [ [ [ "chem_black_powder", 3 ] ] ] + }, + { + "result": "bp_380_FMJ", + "type": "recipe", + "category": "CC_AMMO", + "subcategory": "CSC_AMMO_PISTOL", + "skill_used": "fabrication", + "difficulty": 3, + "skills_required": [ "gun", 1 ], + "time": "2 m", + "batch_time_factors": [ 60, 5 ], + "book_learn": [ [ "manual_pistol", 2 ], [ "manual_smg", 2 ], [ "recipe_bullets", 3 ] ], + "charges": 1, + "reversible": true, + "using": [ [ "bullet_forming", 2 ], [ "ammo_bullet", 2 ], [ "ammo_380", 1 ] ], "components": [ [ [ "chem_black_powder", 3 ] ], [ [ "copper", 1 ] ] ] }, { @@ -180,13 +438,13 @@ "skill_used": "fabrication", "difficulty": 3, "skills_required": [ "gun", 1 ], - "time": 2000, + "time": "2 m", "batch_time_factors": [ 60, 5 ], "book_learn": [ [ "manual_pistol", 1 ], [ "recipe_bullets", 2 ] ], "charges": 1, "reversible": true, "using": [ [ "bullet_forming", 2 ], [ "ammo_bullet", 2 ] ], - "components": [ [ [ "38_casing", 1 ] ], [ [ "smpistol_primer", 1 ] ], [ [ "chem_black_powder", 2 ] ] ] + "components": [ [ [ "38_casing", 1 ] ], [ [ "smpistol_primer", 1 ] ], [ [ "chem_black_powder", 3 ] ] ] }, { "result": "reloaded_38_super", @@ -314,13 +572,13 @@ "skill_used": "fabrication", "difficulty": 4, "skills_required": [ "gun", 3 ], - "time": 1600, + "time": "2 m", "batch_time_factors": [ 60, 5 ], "book_learn": [ [ "recipe_bullets", 3 ], [ "manual_pistol", 4 ] ], "charges": 1, "reversible": true, "using": [ [ "bullet_forming", 5 ], [ "ammo_bullet", 5 ] ], - "components": [ [ [ "44_casing", 1 ] ], [ [ "lgpistol_primer", 1 ] ], [ [ "chem_black_powder", 6 ] ] ] + "components": [ [ [ "44_casing", 1 ] ], [ [ "lgpistol_primer", 1 ] ], [ [ "chem_black_powder", 9 ] ] ] }, { "result": "reloaded_45_acp", @@ -407,13 +665,13 @@ "skill_used": "fabrication", "difficulty": 7, "skills_required": [ "gun", 7 ], - "time": 1800, + "time": "2 m", "batch_time_factors": [ 60, 5 ], "book_learn": [ [ "recipe_bullets", 6 ], [ "manual_pistol", 7 ] ], "charges": 1, "reversible": true, "using": [ [ "bullet_forming", 5 ], [ "ammo_bullet", 4 ] ], - "components": [ [ [ "454_casing", 1 ] ], [ [ "smrifle_primer", 1 ] ], [ [ "chem_black_powder", 6 ] ], [ [ "copper", 2 ] ] ] + "components": [ [ [ "454_casing", 1 ] ], [ [ "smrifle_primer", 1 ] ], [ [ "chem_black_powder", 9 ] ], [ [ "copper", 2 ] ] ] }, { "result": "reloaded_45colt_jhp", diff --git a/data/json/recipes/ammo/shot.json b/data/json/recipes/ammo/shot.json index 7fd05a9bbb6ce..e566985745419 100644 --- a/data/json/recipes/ammo/shot.json +++ b/data/json/recipes/ammo/shot.json @@ -12,7 +12,8 @@ "book_learn": [ [ "recipe_bullets", 2 ], [ "manual_shotgun", 2 ] ], "charges": 1, "reversible": true, - "using": [ [ "bullet_forming", 1 ], [ "ammo_bullet", 10 ], [ "ammo_shot", 1 ] ], + "using": [ [ "shot_forming", 1 ], [ "ammo_bullet", 10 ], [ "ammo_shot", 1 ] ], + "tools": [ [ [ "press", -1 ] ] ], "components": [ [ [ "gunpowder", 6 ], [ "gunpowder_pistol", 6 ], [ "gunpowder_shotgun", 6 ] ] ] }, { @@ -28,7 +29,8 @@ "book_learn": [ [ "recipe_bullets", 2 ], [ "manual_shotgun", 2 ] ], "charges": 1, "reversible": true, - "using": [ [ "bullet_forming", 1 ], [ "ammo_bullet", 5 ], [ "ammo_410shot", 1 ] ], + "using": [ [ "shot_forming", 1 ], [ "ammo_bullet", 5 ], [ "ammo_410shot", 1 ] ], + "tools": [ [ [ "press", -1 ] ] ], "components": [ [ [ "gunpowder", 5 ], [ "gunpowder_pistol", 5 ], [ "gunpowder_shotgun", 5 ] ] ] }, { @@ -44,7 +46,8 @@ "book_learn": [ [ "recipe_bullets", 1 ], [ "manual_shotgun", 1 ] ], "charges": 1, "reversible": true, - "using": [ [ "bullet_forming", 1 ], [ "ammo_bullet", 10 ], [ "ammo_shot", 1 ] ], + "using": [ [ "shot_forming", 1 ], [ "ammo_bullet", 10 ], [ "ammo_shot", 1 ] ], + "tools": [ [ [ "press", -1 ] ] ], "components": [ [ [ "gunpowder", 3 ], [ "gunpowder_pistol", 3 ], [ "gunpowder_shotgun", 3 ] ] ] }, { @@ -104,12 +107,12 @@ "skill_used": "fabrication", "difficulty": 2, "skills_required": [ "gun", 1 ], - "time": 2000, - "batch_time_factors": [ 60, 5 ], + "time": 3000, "book_learn": [ [ "recipe_bullets", 2 ], [ "manual_shotgun", 2 ] ], "charges": 1, "reversible": true, - "using": [ [ "bullet_forming", 1 ], [ "ammo_bullet", 10 ], [ "ammo_shot", 1 ] ], + "using": [ [ "shot_forming", 1 ], [ "ammo_bullet", 10 ], [ "ammo_shot", 1 ] ], + "tools": [ [ [ "press", -1 ] ] ], "components": [ [ [ "chem_black_powder", 6 ] ] ] }, { @@ -125,7 +128,8 @@ "book_learn": [ [ "recipe_bullets", 1 ], [ "manual_shotgun", 1 ] ], "charges": 1, "reversible": true, - "using": [ [ "bullet_forming", 1 ], [ "ammo_bullet", 10 ], [ "ammo_shot", 1 ] ], + "using": [ [ "shot_forming", 1 ], [ "ammo_bullet", 10 ], [ "ammo_shot", 1 ] ], + "tools": [ [ [ "press", -1 ] ] ], "components": [ [ [ "chem_black_powder", 3 ] ] ] }, { @@ -178,6 +182,76 @@ "using": [ [ "bullet_forming", 1 ], [ "ammo_bullet", 20 ], [ "ammo_shot", 1 ] ], "components": [ [ [ "chem_black_powder", 6 ] ] ] }, + { + "result": "bp_shot_00", + "id_suffix": "with dowel", + "type": "recipe", + "copy-from": "bp_shot_00", + "book_learn": [ [ "survival_book", 1 ], [ "mag_survival", 1 ] ], + "time": 4000, + "tools": [ [ [ "press_dowel", -1 ] ] ], + "components": [ [ [ "chem_black_powder", 6 ] ] ] + }, + { + "result": "bp_shot_bird", + "id_suffix": "with dowel", + "type": "recipe", + "copy-from": "bp_shot_bird", + "book_learn": [ [ "survival_book", 1 ], [ "mag_survival", 1 ] ], + "time": 4000, + "tools": [ [ [ "press_dowel", -1 ] ] ], + "components": [ [ [ "chem_black_powder", 3 ] ] ] + }, + { + "result": "bp_shot_dragon", + "id_suffix": "with dowel", + "type": "recipe", + "copy-from": "bp_shot_dragon", + "book_learn": [ [ "survival_book", 1 ], [ "mag_survival", 1 ] ], + "time": 4000, + "tools": [ [ [ "press_dowel", -1 ] ] ], + "components": [ [ [ "chem_black_powder", 3 ] ], [ [ "magnesium", 5 ] ] ] + }, + { + "result": "bp_shot_slug", + "id_suffix": "with dowel", + "type": "recipe", + "copy-from": "bp_shot_slug", + "book_learn": [ [ "survival_book", 1 ], [ "mag_survival", 1 ] ], + "time": 4000, + "using": [ [ "ammo_bullet", 20 ], [ "ammo_shot", 1 ] ], + "tools": [ + [ [ "press_dowel", -1 ] ], + [ [ "pipe", -1 ], [ "cu_pipe", -1 ], [ "material_sand", -1 ], [ "material_soil", -1 ], [ "clay_lump", -1 ] ], + [ [ "fire", -1 ], [ "hotplate", 2 ], [ "toolset", 2 ] ] + ], + "components": [ [ [ "chem_black_powder", 6 ] ] ] + }, + { + "result": "bp_shot_scrap", + "id_suffix": "with dowel", + "type": "recipe", + "copy-from": "bp_shot_scrap", + "book_learn": [ [ "survival_book", 1 ], [ "mag_survival", 1 ] ], + "time": 4000, + "tools": [ [ [ "press_dowel", -1 ] ] ], + "components": [ + [ [ "chem_black_powder", 6 ] ], + [ + [ "scrap", 1 ], + [ "nail", 10 ], + [ "bb", 20 ], + [ "solder_wire", 10 ], + [ "platinum_small", 4 ], + [ "gold_small", 4 ], + [ "bearing", 5 ], + [ "lead", 7 ], + [ "silver_small", 7 ], + [ "lead", 7 ], + [ "shrapnel", 4 ] + ] + ] + }, { "result": "shot_scrap", "type": "recipe", @@ -195,7 +269,51 @@ "tools": [ [ [ "press", -1 ] ] ], "components": [ [ [ "gunpowder", 12 ], [ "gunpowder_pistol", 12 ], [ "gunpowder_shotgun", 12 ] ], - [ [ "scrap", 1 ], [ "nail", 10 ], [ "bb", 20 ] ] + [ + [ "scrap", 1 ], + [ "nail", 10 ], + [ "bb", 20 ], + [ "solder_wire", 10 ], + [ "platinum_small", 4 ], + [ "gold_small", 4 ], + [ "bearing", 5 ], + [ "lead", 7 ], + [ "silver_small", 7 ], + [ "bismuth", 7 ], + [ "shrapnel", 4 ] + ] + ] + }, + { + "result": "bp_shot_scrap", + "type": "recipe", + "category": "CC_AMMO", + "subcategory": "CSC_AMMO_SHOT", + "skill_used": "fabrication", + "difficulty": 2, + "skills_required": [ "gun", 1 ], + "time": "2 m", + "batch_time_factors": [ 50, 5 ], + "autolearn": true, + "charges": 2, + "reversible": true, + "using": [ [ "ammo_shot", 2 ] ], + "tools": [ [ [ "press", -1 ] ] ], + "components": [ + [ [ "chem_black_powder", 6 ] ], + [ + [ "scrap", 1 ], + [ "nail", 10 ], + [ "bb", 20 ], + [ "solder_wire", 10 ], + [ "platinum_small", 4 ], + [ "gold_small", 4 ], + [ "bearing", 5 ], + [ "lead", 7 ], + [ "silver_small", 7 ], + [ "lead", 7 ], + [ "shrapnel", 4 ] + ] ] }, { @@ -213,5 +331,78 @@ "using": [ [ "ammo_shot", 1 ] ], "tools": [ [ [ "press", -1 ] ] ], "components": [ [ [ "incendiary", 25 ] ] ] + }, + { + "result": "shot_paper_00", + "type": "recipe", + "category": "CC_AMMO", + "subcategory": "CSC_AMMO_SHOT", + "skill_used": "fabrication", + "difficulty": 2, + "skills_required": [ "gun", 1 ], + "time": "1 m", + "batch_time_factors": [ 60, 5 ], + "book_learn": [ [ "manual_shotgun", 3 ], [ "recipe_bullets", 2 ] ], + "charges": 1, + "reversible": true, + "using": [ [ "ammo_bullet", 8 ] ], + "qualities": [ { "id": "CUT", "level": 1 } ], + "components": [ [ [ "chem_black_powder", 5 ] ], [ [ "shotgun_primer", 1 ] ], [ [ "paper", 1 ], [ "aluminum_foil", 1 ] ] ] + }, + { + "result": "shot_paper_slug", + "type": "recipe", + "category": "CC_AMMO", + "subcategory": "CSC_AMMO_SHOT", + "skill_used": "fabrication", + "difficulty": 2, + "skills_required": [ "gun", 1 ], + "time": "1 m", + "batch_time_factors": [ 60, 5 ], + "book_learn": [ [ "manual_shotgun", 3 ], [ "recipe_bullets", 2 ] ], + "charges": 1, + "reversible": true, + "using": [ [ "ammo_bullet", 16 ] ], + "qualities": [ { "id": "CUT", "level": 1 } ], + "components": [ [ [ "chem_black_powder", 5 ] ], [ [ "shotgun_primer", 1 ] ], [ [ "paper", 1 ], [ "aluminum_foil", 1 ] ] ] + }, + { + "result": "shot_paper_dragon", + "type": "recipe", + "category": "CC_AMMO", + "subcategory": "CSC_AMMO_SHOT", + "skill_used": "fabrication", + "difficulty": 2, + "skills_required": [ "gun", 1 ], + "time": "1 m", + "batch_time_factors": [ 60, 5 ], + "book_learn": [ [ "manual_shotgun", 3 ], [ "recipe_bullets", 2 ] ], + "charges": 1, + "reversible": true, + "using": [ [ "ammo_bullet", 16 ] ], + "qualities": [ { "id": "CUT", "level": 1 } ], + "components": [ + [ [ "chem_black_powder", 4 ] ], + [ [ "magnesium", 4 ] ], + [ [ "shotgun_primer", 1 ] ], + [ [ "paper", 1 ], [ "aluminum_foil", 1 ] ] + ] + }, + { + "result": "shot_paper_bird", + "type": "recipe", + "category": "CC_AMMO", + "subcategory": "CSC_AMMO_SHOT", + "skill_used": "fabrication", + "difficulty": 2, + "skills_required": [ "gun", 1 ], + "time": "1 m", + "batch_time_factors": [ 60, 5 ], + "book_learn": [ [ "manual_shotgun", 3 ], [ "recipe_bullets", 2 ] ], + "charges": 1, + "reversible": true, + "using": [ [ "ammo_bullet", 8 ] ], + "qualities": [ { "id": "CUT", "level": 1 } ], + "components": [ [ [ "chem_black_powder", 5 ] ], [ [ "shotgun_primer", 1 ] ], [ [ "paper", 1 ], [ "aluminum_foil", 1 ] ] ] } ] diff --git a/data/json/recipes/armor/head.json b/data/json/recipes/armor/head.json index 0ca0ff84972ff..675d7b6b742da 100644 --- a/data/json/recipes/armor/head.json +++ b/data/json/recipes/armor/head.json @@ -1333,6 +1333,20 @@ "components": [ [ [ "rag", 8 ] ] ], "flags": [ "BLIND_HARD" ] }, + { + "result": "welding_mask_crude", + "type": "recipe", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_HEAD", + "skill_used": "fabrication", + "difficulty": 5, + "time": "540 m", + "autolearn": true, + "using": [ [ "forging_standard", 16 ], [ "steel_standard", 4 ] ], + "qualities": [ { "id": "ANVIL", "level": 3 }, { "id": "HAMMER", "level": 3 }, { "id": "CHISEL", "level": 3 } ], + "tools": [ [ [ "tongs", -1 ] ], [ [ "crucible", -1 ], [ "crucible_clay", -1 ] ] ], + "components": [ [ [ "goggles_welding", 1 ] ] ] + }, { "result": "wetsuit_hood", "type": "recipe", diff --git a/data/json/recipes/armor/legs.json b/data/json/recipes/armor/legs.json index 8eb0527c48dd0..20f98c70da0bd 100644 --- a/data/json/recipes/armor/legs.json +++ b/data/json/recipes/armor/legs.json @@ -473,7 +473,7 @@ [ [ "kevlar", 1 ], [ "modularvest", 1 ], [ "kevlar_plate", 12 ] ], [ [ "rag", 12 ] ], [ - [ "chestrig", 1 ], + [ "tacvest", 1 ], [ "legrig", 1 ], [ "vest", 1 ], [ "tool_belt", 1 ], diff --git a/data/json/recipes/armor/storage.json b/data/json/recipes/armor/storage.json index f6789d1251475..b846e80e88080 100644 --- a/data/json/recipes/armor/storage.json +++ b/data/json/recipes/armor/storage.json @@ -30,7 +30,7 @@ "components": [ [ [ "leather", 8 ], [ "rag", 8 ] ], [ [ "filament", 20, "LIST" ], [ "cordage", 1, "LIST" ] ] ] }, { - "result": "magbandolier", + "result": "chestrig", "type": "recipe", "category": "CC_ARMOR", "subcategory": "CSC_ARMOR_STORAGE", @@ -249,7 +249,7 @@ "components": [ [ [ "leather", 4 ], [ "rag", 4 ] ], [ [ "filament", 10, "LIST" ], [ "cordage_short", 1, "LIST" ] ] ] }, { - "result": "chestrig", + "result": "tacvest", "type": "recipe", "category": "CC_ARMOR", "subcategory": "CSC_ARMOR_STORAGE", @@ -263,7 +263,7 @@ "components": [ [ [ "rag", 20 ] ], [ [ "ragpouch", 2 ], [ "leather_pouch", 2 ] ], - [ [ "chestpouch", 4 ], [ "legpouch_large", 2 ], [ "magbandolier", 1 ] ], + [ [ "chestpouch", 4 ], [ "legpouch_large", 2 ], [ "chestrig", 1 ] ], [ [ "plastic_chunk", 2 ] ] ] }, @@ -647,7 +647,7 @@ [ [ "leather", 20 ], [ "tanned_hide", 4 ] ], [ [ "molle_pack", 4 ], [ "duffelbag", 2 ], [ "rucksack", 4 ] ], [ - [ "chestrig", 1 ], + [ "tacvest", 1 ], [ "legrig", 1 ], [ "vest", 1 ], [ "tool_belt", 1 ], @@ -676,7 +676,7 @@ [ [ "leather", 10 ], [ "tanned_hide", 2 ] ], [ [ "runner_bag", 4 ], [ "backpack", 2 ], [ "backpack_leather", 2 ], [ "mbag", 4 ] ], [ - [ "chestrig", 1 ], + [ "tacvest", 1 ], [ "legrig", 1 ], [ "vest", 1 ], [ "tool_belt", 1 ], @@ -705,7 +705,7 @@ [ [ "leather", 16 ], [ "tanned_hide", 3 ] ], [ [ "backpack", 4 ], [ "backpack_leather", 4 ], [ "molle_pack", 2 ], [ "duffelbag", 1 ], [ "rucksack", 2 ] ], [ - [ "chestrig", 1 ], + [ "tacvest", 1 ], [ "legrig", 1 ], [ "vest", 1 ], [ "tool_belt", 1 ], @@ -734,7 +734,7 @@ [ [ "leather", 8 ], [ "tanned_hide", 2 ] ], [ [ "runner_bag", 2 ], [ "backpack", 1 ], [ "backpack_leather", 1 ], [ "mbag", 2 ] ], [ - [ "chestrig", 1 ], + [ "tacvest", 1 ], [ "legrig", 1 ], [ "vest", 1 ], [ "tool_belt", 1 ], @@ -763,7 +763,7 @@ [ [ "leather", 6 ], [ "tanned_hide", 1 ] ], [ [ "holster", 1 ], [ "sholster", 1 ] ], [ - [ "chestrig", 1 ], + [ "tacvest", 1 ], [ "legrig", 1 ], [ "vest", 1 ], [ "tool_belt", 1 ], diff --git a/data/json/recipes/armor/suit.json b/data/json/recipes/armor/suit.json index d4349b0c63bc6..0da08bd292f3d 100644 --- a/data/json/recipes/armor/suit.json +++ b/data/json/recipes/armor/suit.json @@ -170,7 +170,7 @@ "using": [ [ "sewing_standard", 90 ] ], "components": [ [ [ "duster", 1 ] ], - [ [ "vest", 1 ], [ "chestrig", 1 ] ], + [ [ "vest", 1 ], [ "tacvest", 1 ] ], [ [ "ragpouch", 1 ], [ "leather_pouch", 1 ], [ "dump_pouch", 1 ], [ "fanny", 1 ] ], [ [ "tool_belt", 1 ], [ "legrig", 1 ] ], [ [ "pants_cargo", 1 ], [ "pants_army", 1 ] ], @@ -190,7 +190,7 @@ "components": [ [ [ "tunic", 1 ] ], [ [ "shorts_cargo", 1 ], [ "shorts_denim", 1 ] ], - [ [ "vest", 1 ], [ "chestrig", 1 ] ], + [ [ "vest", 1 ], [ "tacvest", 1 ] ], [ [ "ragpouch", 2 ], [ "dump_pouch", 2 ], [ "fanny", 2 ] ], [ [ "tool_belt", 1 ], [ "legrig", 1 ] ], [ [ "rag", 20 ] ] @@ -252,7 +252,7 @@ "using": [ [ "sewing_standard", 90 ], [ "soldering_standard", 18 ] ], "components": [ [ [ "jacket_army", 1 ] ], - [ [ "vest", 1 ], [ "chestrig", 1 ], [ "mbag", 1 ], [ "runner_bag", 1 ] ], + [ [ "vest", 1 ], [ "tacvest", 1 ], [ "mbag", 1 ], [ "runner_bag", 1 ] ], [ [ "fanny", 2 ], [ "dump_pouch", 1 ] ], [ [ "tool_belt", 1 ], [ "legrig", 1 ] ], [ [ "pants_army", 1 ] ], @@ -422,7 +422,7 @@ [ [ "nomex_suit", 1 ], [ "entry_suit", 1 ], [ "nomex", 20 ] ], [ [ "coat_rain", 1 ], [ "jacket_windbreaker", 1 ], [ "jacket_evac", 1 ], [ "coat_gut", 1 ] ], [ - [ "chestrig", 1 ], + [ "tacvest", 1 ], [ "legrig", 1 ], [ "vest", 1 ], [ "tool_belt", 1 ], @@ -465,7 +465,7 @@ [ [ "rag", 10 ] ], [ [ "wetsuit", 1 ], [ "wetsuit_spring", 1 ] ], [ - [ "chestrig", 1 ], + [ "tacvest", 1 ], [ "legrig", 1 ], [ "vest", 1 ], [ "tool_belt", 1 ], @@ -497,7 +497,7 @@ [ [ "steel_chunk", 4 ], [ "scrap", 12 ] ], [ [ "coat_rain", 1 ], [ "jacket_windbreaker", 1 ], [ "jacket_evac", 1 ], [ "coat_gut", 1 ] ], [ - [ "chestrig", 1 ], + [ "tacvest", 1 ], [ "legrig", 1 ], [ "vest", 1 ], [ "tool_belt", 1 ], @@ -576,7 +576,7 @@ [ [ "rag", 30 ] ], [ [ "coat_rain", 1 ], [ "jacket_windbreaker", 1 ], [ "jacket_evac", 1 ], [ "coat_gut", 1 ] ], [ - [ "chestrig", 1 ], + [ "tacvest", 1 ], [ "legrig", 1 ], [ "vest", 1 ], [ "tool_belt", 1 ], @@ -631,7 +631,7 @@ [ [ "leather", 20 ], [ "tanned_hide", 4 ] ], [ [ "coat_rain", 1 ], [ "jacket_windbreaker", 1 ], [ "jacket_evac", 1 ], [ "coat_gut", 1 ] ], [ - [ "chestrig", 1 ], + [ "tacvest", 1 ], [ "legrig", 1 ], [ "vest", 1 ], [ "tool_belt", 1 ], @@ -774,7 +774,7 @@ [ [ "fur", 20 ], [ "tanned_pelt", 3 ] ], [ [ "coat_rain", 1 ], [ "jacket_windbreaker", 1 ], [ "jacket_evac", 1 ], [ "coat_gut", 1 ] ], [ - [ "chestrig", 1 ], + [ "tacvest", 1 ], [ "legrig", 1 ], [ "vest", 1 ], [ "tool_belt", 1 ], @@ -806,7 +806,7 @@ [ [ "steel_chunk", 8 ], [ "scrap", 24 ] ], [ [ "coat_rain", 2 ], [ "jacket_windbreaker", 2 ], [ "jacket_evac", 2 ], [ "coat_gut", 2 ] ], [ - [ "chestrig", 1 ], + [ "tacvest", 1 ], [ "legrig", 1 ], [ "vest", 1 ], [ "tool_belt", 1 ], @@ -838,7 +838,7 @@ [ [ "scrap", 8 ] ], [ [ "coat_rain", 2 ], [ "jacket_windbreaker", 2 ], [ "jacket_evac", 2 ], [ "coat_gut", 2 ] ], [ - [ "chestrig", 1 ], + [ "tacvest", 1 ], [ "legrig", 1 ], [ "vest", 1 ], [ "tool_belt", 1 ], diff --git a/data/json/recipes/armor/torso.json b/data/json/recipes/armor/torso.json index f45f3458cb530..251f3ca7e76f5 100644 --- a/data/json/recipes/armor/torso.json +++ b/data/json/recipes/armor/torso.json @@ -298,7 +298,7 @@ [ [ "kevlar", 1 ], [ "modularvest", 1 ], [ "kevlar_plate", 16 ] ], [ [ "rag", 19 ] ], [ - [ "chestrig", 1 ], + [ "tacvest", 1 ], [ "legrig", 1 ], [ "vest", 1 ], [ "tool_belt", 1 ], @@ -464,7 +464,7 @@ [ [ "rag", 15 ] ], [ [ "coat_rain", 1 ] ], [ - [ "chestrig", 1 ], + [ "tacvest", 1 ], [ "legrig", 1 ], [ "vest", 1 ], [ "tool_belt", 1 ], @@ -749,7 +749,7 @@ [ [ "kevlar", 1 ], [ "modularvest", 1 ], [ "kevlar_plate", 13 ] ], [ [ "rag", 14 ] ], [ - [ "chestrig", 1 ], + [ "tacvest", 1 ], [ "legrig", 1 ], [ "vest", 1 ], [ "tool_belt", 1 ], @@ -890,7 +890,7 @@ [ [ "kevlar", 1 ], [ "modularvest", 1 ], [ "kevlar_plate", 10 ] ], [ [ "rag", 11 ] ], [ - [ "chestrig", 1 ], + [ "tacvest", 1 ], [ "legrig", 1 ], [ "vest", 1 ], [ "tool_belt", 1 ], @@ -1046,7 +1046,7 @@ [ [ "kevlar", 1 ], [ "modularvest", 1 ], [ "kevlar_plate", 12 ] ], [ [ "rag", 14 ] ], [ - [ "chestrig", 1 ], + [ "tacvest", 1 ], [ "legrig", 1 ], [ "vest", 1 ], [ "tool_belt", 1 ], diff --git a/data/json/recipes/electronics/parts.json b/data/json/recipes/electronics/parts.json index b07ca6b0c1883..eb1bdb89dfadb 100644 --- a/data/json/recipes/electronics/parts.json +++ b/data/json/recipes/electronics/parts.json @@ -43,6 +43,22 @@ [ [ "acid", 2 ], [ "fertilizer_liquid", 2 ], [ "fertilizer_commercial", 2 ] ] ] }, + { + "type": "recipe", + "result": "large_storage_battery", + "category": "CC_ELECTRONIC", + "subcategory": "CSC_ELECTRONIC_PARTS", + "skill_used": "electronics", + "skills_required": [ "fabrication", 4 ], + "difficulty": 3, + "time": "20 m", + "reversible": true, + "decomp_learn": 3, + "book_learn": [ [ "manual_electronics", 2 ], [ "mag_electronics", 2 ], [ "manual_mechanics", 3 ] ], + "using": [ [ "soldering_standard", 20 ] ], + "qualities": [ { "id": "SCREW", "level": 1 } ], + "components": [ [ [ "storage_battery", 2 ] ], [ [ "e_scrap", 4 ] ], [ [ "scrap", 8 ] ], [ [ "cable", 5 ] ] ] + }, { "result": "light_minus_atomic_battery_cell", "type": "recipe", diff --git a/data/json/recipes/recipe_deconstruction.json b/data/json/recipes/recipe_deconstruction.json index 5b2220b7133e9..c7e93bb5ab969 100644 --- a/data/json/recipes/recipe_deconstruction.json +++ b/data/json/recipes/recipe_deconstruction.json @@ -674,10 +674,33 @@ [ [ "identification_module", 1 ] ], [ [ "omni_wheel", 1 ] ], [ [ "copbot_chassis", 1 ] ], - [ [ "android_arms", 1 ] ], + [ [ "gun_module", 1 ] ], + [ [ "power_supply", 4 ] ], + [ [ "solar_cell", 2 ] ], + [ [ "m16a4", 1 ] ], + [ [ "canister_empty", 1 ] ] + ] + }, + { + "result": "broken_talon_m202a1", + "type": "uncraft", + "skill_used": "electronics", + "difficulty": 6, + "time": "120 m", + "using": [ [ "soldering_standard", 20 ], [ "welding_standard", 5 ] ], + "qualities": [ { "id": "SCREW", "level": 1 }, { "id": "SAW_M", "level": 1 } ], + "components": [ + [ [ "ai_module", 1 ] ], + [ [ "sensor_module", 1 ] ], + [ [ "memory_module", 1 ] ], + [ [ "pathfinding_module", 1 ] ], + [ [ "identification_module", 1 ] ], + [ [ "omni_wheel", 1 ] ], + [ [ "copbot_chassis", 1 ] ], + [ [ "gun_module", 1 ] ], [ [ "power_supply", 4 ] ], [ [ "solar_cell", 2 ] ], - [ [ "hk_mp5", 1 ] ], + [ [ "m202_flash", 1 ] ], [ [ "canister_empty", 1 ] ] ] }, @@ -735,7 +758,27 @@ [ [ "ai_module", 1 ] ], [ [ "RAM", 1 ] ], [ [ "gun_module", 1 ] ], - [ [ "m4a1", 1 ] ], + [ [ "m249", 1 ] ], + [ [ "small_storage_battery", 1 ] ], + [ [ "sensor_module", 1 ] ], + [ [ "identification_module", 1 ] ], + [ [ "power_supply", 1 ] ], + [ [ "turret_chassis", 1 ] ] + ] + }, + { + "result": "broken_crows_m240", + "type": "uncraft", + "skill_used": "electronics", + "difficulty": 3, + "time": "60 m", + "using": [ [ "soldering_standard", 10 ] ], + "qualities": [ { "id": "SCREW", "level": 1 } ], + "components": [ + [ [ "ai_module", 1 ] ], + [ [ "RAM", 1 ] ], + [ [ "gun_module", 1 ] ], + [ [ "m240", 1 ] ], [ [ "small_storage_battery", 1 ] ], [ [ "sensor_module", 1 ] ], [ [ "identification_module", 1 ] ], @@ -755,7 +798,7 @@ [ [ "ai_module", 1 ] ], [ [ "RAM", 1 ] ], [ [ "gun_module", 1 ] ], - [ [ "m107a1", 1 ] ], + [ [ "m2browning", 1 ] ], [ [ "small_storage_battery", 1 ] ], [ [ "sensor_module", 1 ] ], [ [ "identification_module", 1 ] ], @@ -2689,15 +2732,6 @@ "qualities": [ { "id": "SAW_M", "level": 1 } ], "components": [ [ [ "sheet_metal_small", 20 ], [ "steel_chunk", 2 ] ] ] }, - { - "result": "muffler", - "type": "uncraft", - "skill_used": "fabrication", - "difficulty": 1, - "time": "48 s", - "qualities": [ { "id": "SAW_M", "level": 1 } ], - "components": [ [ [ "scrap", 7 ] ], [ [ "steel_chunk", 1 ] ], [ [ "platinum_small", 8 ] ], [ [ "pipe", 2 ] ] ] - }, { "result": "fluid_preserved_brain", "type": "uncraft", @@ -2920,5 +2954,68 @@ [ [ "e_scrap", 3 ] ], [ [ "RAM", 1 ] ] ] + }, + { + "result": "camp_chair", + "type": "uncraft", + "time": "5 m", + "qualities": [ { "id": "SCREW", "level": 1 } ], + "components": [ [ [ "sheet_metal_small", 2 ] ], [ [ "steel_chunk", 2 ] ] ] + }, + { + "result": "platinum_hairpin", + "type": "uncraft", + "time": "30 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 3 ] ] ] + }, + { + "result": "platinum_locket", + "type": "uncraft", + "time": "30 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 4 ] ] ] + }, + { + "result": "platinum_necklace", + "type": "uncraft", + "time": "30 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 3 ] ] ] + }, + { + "result": "platinum_bracelet", + "type": "uncraft", + "time": "36 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 8 ] ] ] + }, + { + "result": "platinum_dental_grill", + "type": "uncraft", + "time": "30 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 2 ] ] ] + }, + { + "result": "platinum_ear", + "type": "uncraft", + "time": "30 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 2 ] ] ] + }, + { + "result": "platinum_watch", + "type": "uncraft", + "time": "36 s", + "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "SCREW", "level": 1 } ], + "components": [ [ [ "platinum_small", 12 ] ], [ [ "clockworks", 1 ] ] ] + }, + { + "result": "platinum_ring", + "type": "uncraft", + "time": "30 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 2 ] ] ] } ] diff --git a/data/json/recipes/recipe_electronics.json b/data/json/recipes/recipe_electronics.json index 9bc10cacb5606..00f862490426c 100644 --- a/data/json/recipes/recipe_electronics.json +++ b/data/json/recipes/recipe_electronics.json @@ -47,6 +47,26 @@ [ [ "scrap", 1 ], [ "steel_chunk", 1 ] ] ] }, + { + "type": "recipe", + "result": "reading_light", + "category": "CC_ELECTRONIC", + "subcategory": "CSC_ELECTRONIC_LIGHTING", + "skill_used": "electronics", + "difficulty": 2, + "time": "20 m", + "reversible": true, + "decomp_learn": 2, + "book_learn": [ [ "manual_electronics", 3 ], [ "advanced_electronics", 3 ] ], + "qualities": [ { "id": "SCREW", "level": 1 } ], + "components": [ + [ [ "plastic_chunk", 1 ] ], + [ [ "superglue", 1 ] ], + [ [ "power_supply", 1 ] ], + [ [ "cable", 1 ] ], + [ [ "light_bulb", 1 ], [ "e_scrap", 1 ] ] + ] + }, { "type": "recipe", "result": "trimmer_off", @@ -1248,29 +1268,34 @@ "category": "CC_ELECTRONIC", "subcategory": "CSC_ELECTRONIC_OTHER", "skill_used": "electronics", - "skills_required": [ [ "mechanics", 5 ], [ "computer", 5 ] ], + "skills_required": [ [ "mechanics", 6 ], [ "computer", 6 ], [ "fabrication", 6 ] ], "difficulty": 7, - "time": "30 m", + "time": "300 m", "reversible": true, "decomp_learn": 8, "book_learn": [ [ "recipe_lab_elec", 7 ], [ "textbook_robots", 9 ] ], - "using": [ [ "soldering_standard", 14 ] ], + "using": [ [ "steel_standard", 1 ], [ "welding_standard", 20 ], [ "soldering_standard", 14 ] ], "qualities": [ { "id": "SCREW", "level": 1 }, { "id": "SCREW_FINE", "level": 1 }, { "id": "WRENCH", "level": 2 }, - { "id": "WRENCH_FINE", "level": 1 } + { "id": "WRENCH_FINE", "level": 1 }, + { "id": "SAW_M", "level": 1 }, + { "id": "SAW_M_FINE", "level": 1 } ], "components": [ [ [ "ai_module", 1 ] ], + [ [ "identification_module", 1 ] ], [ [ "RAM", 1 ] ], - [ [ "gun_module", 2 ] ], - [ [ "hk_mp5", 2 ] ], + [ [ "camera", 1 ] ], [ [ "small_storage_battery", 1 ] ], - [ [ "sensor_module", 1 ] ], - [ [ "identification_module", 1 ] ], [ [ "power_supply", 1 ] ], - [ [ "turret_chassis", 1 ] ] + [ [ "motor_tiny", 3 ] ], + [ [ "hk_mp5", 1 ] ], + [ [ "mp5mag", 1 ] ], + [ [ "sheet_metal", 2 ] ], + [ [ "pipe", 4 ] ], + [ [ "spring", 2 ] ] ] }, { @@ -1328,7 +1353,38 @@ [ [ "ai_module", 1 ] ], [ [ "RAM", 1 ] ], [ [ "gun_module", 1 ] ], - [ [ "m4a1", 1 ] ], + [ [ "m249", 1 ] ], + [ [ "small_storage_battery", 1 ] ], + [ [ "sensor_module", 1 ] ], + [ [ "identification_module", 1 ] ], + [ [ "power_supply", 1 ] ], + [ [ "turret_chassis", 1 ] ] + ] + }, + { + "type": "recipe", + "result": "bot_crows_m240", + "category": "CC_ELECTRONIC", + "subcategory": "CSC_ELECTRONIC_OTHER", + "skill_used": "electronics", + "skills_required": [ [ "mechanics", 6 ], [ "computer", 5 ] ], + "difficulty": 8, + "time": "30 m", + "reversible": true, + "decomp_learn": 8, + "book_learn": [ [ "recipe_lab_elec", 7 ], [ "textbook_robots", 9 ] ], + "using": [ [ "soldering_standard", 14 ] ], + "qualities": [ + { "id": "SCREW", "level": 1 }, + { "id": "SCREW_FINE", "level": 1 }, + { "id": "WRENCH", "level": 2 }, + { "id": "WRENCH_FINE", "level": 1 } + ], + "components": [ + [ [ "ai_module", 1 ] ], + [ [ "RAM", 1 ] ], + [ [ "gun_module", 1 ] ], + [ [ "m240", 1 ] ], [ [ "small_storage_battery", 1 ] ], [ [ "sensor_module", 1 ] ], [ [ "identification_module", 1 ] ], @@ -1550,10 +1606,44 @@ [ [ "identification_module", 1 ] ], [ [ "omni_wheel", 1 ] ], [ [ "copbot_chassis", 1 ] ], - [ [ "android_arms", 1 ] ], + [ [ "gun_module", 1 ] ], [ [ "power_supply", 4 ] ], [ [ "solar_cell", 2 ] ], - [ [ "hk_mp5", 1 ] ], + [ [ "m16a4", 1 ] ], + [ [ "canister_empty", 1 ] ] + ] + }, + { + "type": "recipe", + "result": "bot_talon_m202a1", + "category": "CC_ELECTRONIC", + "subcategory": "CSC_ELECTRONIC_OTHER", + "skill_used": "electronics", + "skills_required": [ [ "mechanics", 7 ], [ "computer", 6 ] ], + "reversible": true, + "decomp_learn": 8, + "book_learn": [ [ "schematics_secubot", 7 ] ], + "difficulty": 6, + "time": "40 m", + "using": [ [ "soldering_standard", 20 ], [ "welding_standard", 5 ] ], + "qualities": [ + { "id": "SCREW", "level": 1 }, + { "id": "SCREW_FINE", "level": 1 }, + { "id": "WRENCH", "level": 2 }, + { "id": "WRENCH_FINE", "level": 1 } + ], + "components": [ + [ [ "ai_module", 1 ] ], + [ [ "sensor_module", 1 ] ], + [ [ "memory_module", 1 ] ], + [ [ "pathfinding_module", 1 ] ], + [ [ "identification_module", 1 ] ], + [ [ "omni_wheel", 1 ] ], + [ [ "copbot_chassis", 1 ] ], + [ [ "gun_module", 1 ] ], + [ [ "power_supply", 4 ] ], + [ [ "solar_cell", 2 ] ], + [ [ "m202_flash", 1 ] ], [ [ "canister_empty", 1 ] ] ] }, @@ -1758,7 +1848,7 @@ [ [ "ai_module", 1 ] ], [ [ "RAM", 1 ] ], [ [ "gun_module", 1 ] ], - [ [ "m107a1", 1 ] ], + [ [ "m2browning", 1 ] ], [ [ "small_storage_battery", 1 ] ], [ [ "sensor_module", 1 ] ], [ [ "identification_module", 1 ] ], @@ -1820,6 +1910,7 @@ [ [ "superglue", 1 ] ], [ [ "power_supply", 1 ] ], [ [ "cable", 1 ] ], + [ [ "light_bulb", 1 ], [ "e_scrap", 1 ] ], [ [ "betavoltaic", 1 ] ] ] }, @@ -2260,5 +2351,85 @@ "time": "60 m", "qualities": [ { "id": "HAMMER", "level": 3 }, { "id": "ANVIL", "level": 2 } ], "components": [ [ [ "cu_pipe", 4 ] ], [ [ "sheet_metal_small", 8 ] ], [ [ "sheet_metal", 2 ] ] ] + }, + { + "type": "recipe", + "result": "light_minus_disposable_cell", + "category": "CC_ELECTRONIC", + "subcategory": "CSC_ELECTRONIC_TOOLS", + "skill_used": "cooking", + "skills_required": [ "electronics", 5 ], + "difficulty": 6, + "time": "45 m", + "book_learn": [ [ "adv_chemistry", 6 ] ], + "qualities": [ { "id": "ANVIL", "level": 3 }, { "id": "HAMMER", "level": 3 }, { "id": "CHISEL", "level": 3 } ], + "tools": [ [ [ "tongs", -1 ] ], [ [ "crucible", -1 ], [ "crucible_clay", -1 ] ], [ [ "forge", 20 ], [ "oxy_torch", 4 ] ] ], + "components": [ + [ [ "chem_manganese_dioxide", 2 ] ], + [ [ "zinc_metal", 2 ] ], + [ [ "chem_potassium_hydroxide", 1 ] ], + [ [ "water_clean", 1 ] ], + [ [ "steel_chunk", 1 ], [ "scrap", 2 ] ] + ] + }, + { + "type": "recipe", + "result": "light_disposable_cell", + "category": "CC_ELECTRONIC", + "subcategory": "CSC_ELECTRONIC_TOOLS", + "skill_used": "cooking", + "skills_required": [ "electronics", 5 ], + "difficulty": 6, + "time": "60 m", + "book_learn": [ [ "adv_chemistry", 6 ] ], + "qualities": [ { "id": "ANVIL", "level": 3 }, { "id": "HAMMER", "level": 3 }, { "id": "CHISEL", "level": 3 } ], + "tools": [ [ [ "tongs", -1 ] ], [ [ "crucible", -1 ], [ "crucible_clay", -1 ] ], [ [ "forge", 20 ], [ "oxy_torch", 4 ] ] ], + "components": [ + [ [ "chem_manganese_dioxide", 6 ] ], + [ [ "zinc_metal", 6 ] ], + [ [ "chem_potassium_hydroxide", 3 ] ], + [ [ "water_clean", 3 ] ], + [ [ "steel_chunk", 3 ], [ "scrap", 6 ] ] + ] + }, + { + "type": "recipe", + "result": "medium_disposable_cell", + "category": "CC_ELECTRONIC", + "subcategory": "CSC_ELECTRONIC_TOOLS", + "skill_used": "cooking", + "skills_required": [ "electronics", 5 ], + "difficulty": 6, + "time": "80 m", + "book_learn": [ [ "adv_chemistry", 6 ] ], + "qualities": [ { "id": "ANVIL", "level": 3 }, { "id": "HAMMER", "level": 3 }, { "id": "CHISEL", "level": 3 } ], + "tools": [ [ [ "tongs", -1 ] ], [ [ "crucible", -1 ], [ "crucible_clay", -1 ] ], [ [ "forge", 20 ], [ "oxy_torch", 4 ] ] ], + "components": [ + [ [ "chem_manganese_dioxide", 24 ] ], + [ [ "zinc_metal", 24 ] ], + [ [ "chem_potassium_hydroxide", 12 ] ], + [ [ "water_clean", 12 ] ], + [ [ "steel_chunk", 12 ], [ "scrap", 24 ] ] + ] + }, + { + "type": "recipe", + "result": "heavy_disposable_cell", + "category": "CC_ELECTRONIC", + "subcategory": "CSC_ELECTRONIC_TOOLS", + "skill_used": "cooking", + "skills_required": [ "electronics", 5 ], + "difficulty": 6, + "time": "105 m", + "book_learn": [ [ "adv_chemistry", 6 ] ], + "qualities": [ { "id": "ANVIL", "level": 3 }, { "id": "HAMMER", "level": 3 }, { "id": "CHISEL", "level": 3 } ], + "tools": [ [ [ "tongs", -1 ] ], [ [ "crucible", -1 ], [ "crucible_clay", -1 ] ], [ [ "forge", 20 ], [ "oxy_torch", 4 ] ] ], + "components": [ + [ [ "chem_manganese_dioxide", 50 ] ], + [ [ "zinc_metal", 50 ] ], + [ [ "chem_potassium_hydroxide", 25 ] ], + [ [ "water_clean", 25 ] ], + [ [ "steel_chunk", 25 ], [ "scrap", 50 ] ] + ] } ] diff --git a/data/json/recipes/recipe_food.json b/data/json/recipes/recipe_food.json index 9a685e2a10b30..7dd8a860d06dd 100644 --- a/data/json/recipes/recipe_food.json +++ b/data/json/recipes/recipe_food.json @@ -1,4 +1,40 @@ [ + { + "type": "recipe", + "result": "cake2", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_BREAD", + "skill_used": "cooking", + "difficulty": 6, + "time": "2 h", + "autolearn": true, + "qualities": [ { "id": "COOK", "level": 3 } ], + "tools": [ [ [ "surface_heat", 15, "LIST" ] ] ], + "charges": 12, + "components": [ + [ [ "flour", 4 ] ], + [ [ "salt", 12 ] ], + [ [ "sugar", 24 ] ], + [ [ "chocolate", 3 ] ], + [ [ "cooking_oil", 2 ], [ "cooking_oil2", 2 ], [ "butter", 2 ] ], + [ [ "powder_eggs", 2 ], [ "eggs_bird", 2, "LIST" ], [ "egg_reptile", 2 ] ], + [ [ "water", 6 ], [ "water_clean", 6 ] ] + ] + }, + { + "type": "recipe", + "result": "donut_holes", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_BREAD", + "skill_used": "cooking", + "difficulty": 3, + "time": "30 m", + "autolearn": true, + "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 1 } ], + "tools": [ [ [ "surface_heat", 5, "LIST" ] ] ], + "charges": 4, + "components": [ [ [ "flour", 1 ] ], [ [ "water", 1 ], [ "water_clean", 1 ] ], [ [ "salt", 5 ] ], [ [ "sugar", 16 ] ] ] + }, { "type": "recipe", "result": "water_clean", diff --git a/data/json/recipes/recipe_medsandchemicals.json b/data/json/recipes/recipe_medsandchemicals.json index aa507baab91c9..cc142073b4d95 100644 --- a/data/json/recipes/recipe_medsandchemicals.json +++ b/data/json/recipes/recipe_medsandchemicals.json @@ -773,6 +773,19 @@ "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ [ [ "chem_hydrogen_peroxide_conc", 1 ] ], [ [ "water", 4 ], [ "water_clean", 4 ] ] ] }, + { + "type": "recipe", + "result": "chem_muriatic_acid", + "category": "CC_CHEM", + "subcategory": "CSC_CHEM_CHEMICALS", + "skill_used": "cooking", + "difficulty": 4, + "time": "15 m", + "book_learn": [ [ "recipe_labchem", 3 ], [ "textbook_chemistry", 3 ] ], + "qualities": [ { "id": "BOIL", "level": 2 }, { "id": "CHEM", "level": 2 } ], + "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], + "components": [ [ [ "salt", 210 ] ], [ [ "chem_sulphuric_acid", 1 ] ], [ [ "water_clean", 1 ] ] ] + }, { "type": "recipe", "result": "chem_sulphuric_acid", @@ -814,6 +827,20 @@ "tools": [ [ [ "surface_heat", 25, "LIST" ] ], [ [ "pressure_cooker", -1 ] ], [ [ "platinum_grille", -1 ] ] ], "components": [ [ [ "water", 3 ], [ "water_clean", 3 ] ], [ [ "ammonia", 1 ] ] ] }, + { + "type": "recipe", + "result": "chem_nitric_acid", + "byproducts": [ [ "chem_potassium_chloride" ] ], + "category": "CC_CHEM", + "subcategory": "CSC_CHEM_CHEMICALS", + "skill_used": "cooking", + "difficulty": 5, + "time": "10 m", + "autolearn": true, + "qualities": [ { "id": "BOIL", "level": 2 }, { "id": "CHEM", "level": 2 } ], + "tools": [ [ [ "surface_heat", 50, "LIST" ] ] ], + "components": [ [ [ "chem_muriatic_acid", 1 ] ], [ [ "chem_saltpetre", 25 ] ] ] + }, { "type": "recipe", "result": "chem_aluminium_sulphate", @@ -841,6 +868,25 @@ "tools": [ [ [ "surface_heat", 25, "LIST" ] ] ], "components": [ [ [ "chem_nitric_acid", 5 ] ], [ [ "ammonia", 5 ] ] ] }, + { + "type": "recipe", + "result": "chem_potassium_hydroxide", + "byproducts": [ [ "water" ] ], + "category": "CC_CHEM", + "subcategory": "CSC_CHEM_CHEMICALS", + "skill_used": "cooking", + "difficulty": 5, + "time": "45 m", + "book_learn": [ [ "textbook_chemistry", 4 ], [ "adv_chemistry", 5 ] ], + "tools": [ + [ [ "electrolysis_kit", 100 ] ], + [ [ "chemistry_set_basic", -1 ], [ "chemistry_set", -1 ] ], + [ [ "platinum_small", -1 ] ], + [ [ "silver_small", -1 ] ], + [ [ "salt", -1 ] ] + ], + "components": [ [ [ "water_clean", 3 ] ], [ [ "chem_potassium_chloride", 25 ] ] ] + }, { "type": "recipe", "result": "chem_saltpetre", @@ -1097,5 +1143,40 @@ [ [ "chem_ethanol", 250 ] ], [ [ "chem_acetic_acid", 1 ], [ "chem_nitric_acid", 1 ], [ "chem_sulphuric_acid", 1 ], [ "acid", 1 ] ] ] + }, + { + "result": "zinc_metal", + "type": "recipe", + "category": "CC_CHEM", + "subcategory": "CSC_CHEM_CHEMICALS", + "skill_used": "cooking", + "difficulty": 3, + "time": "120 m", + "byproducts": [ [ "chem_zinc" ] ], + "qualities": [ { "id": "CONTAIN", "level": 1 }, { "id": "BOIL", "level": 2 } ], + "components": [ [ [ "material_zincite", 1 ] ], [ [ "coal_lump", 1 ] ] ] + }, + { + "result": "chem_zinc_powder", + "type": "recipe", + "category": "CC_CHEM", + "subcategory": "CSC_CHEM_CHEMICALS", + "skill_used": "cooking", + "difficulty": 3, + "time": "120 m", + "qualities": [ { "id": "CONTAIN", "level": 1 }, { "id": "BOIL", "level": 2 } ], + "components": [ [ [ "chem_zinc", 50 ] ], [ [ "coal_lump", 25 ], [ "charcoal", 50 ] ] ] + }, + { + "result": "chem_manganese_dioxide", + "type": "recipe", + "category": "CC_CHEM", + "subcategory": "CSC_CHEM_CHEMICALS", + "skill_used": "fabrication", + "difficulty": 4, + "time": "60 m", + "byproducts": [ [ "chem_manganese_dioxide", 50 ] ], + "qualities": [ { "id": "CHISEL", "level": 2 }, { "id": "HAMMER", "level": 2 } ], + "components": [ [ [ "material_rhodonite", 1 ] ] ] } ] diff --git a/data/json/recipes/recipe_obsolete.json b/data/json/recipes/recipe_obsolete.json index 1ff9a360b9277..a47168132894d 100644 --- a/data/json/recipes/recipe_obsolete.json +++ b/data/json/recipes/recipe_obsolete.json @@ -1840,5 +1840,30 @@ "type": "recipe", "result": "plut_slurry", "obsolete": true + }, + { + "type": "recipe", + "result": "smg_22", + "obsolete": true + }, + { + "type": "recipe", + "result": "smg_38", + "obsolete": true + }, + { + "type": "recipe", + "result": "smg_22_mag", + "obsolete": true + }, + { + "type": "recipe", + "result": "smg_38_mag", + "obsolete": true + }, + { + "type": "recipe", + "result": "magbandolier", + "obsolete": true } ] diff --git a/data/json/recipes/recipe_others.json b/data/json/recipes/recipe_others.json index 3fd30425119aa..cbe7276dbb34e 100644 --- a/data/json/recipes/recipe_others.json +++ b/data/json/recipes/recipe_others.json @@ -376,6 +376,24 @@ "tools": [ [ [ "tongs", -1 ] ], [ [ "swage", -1 ] ], [ [ "forge", 50 ], [ "oxy_torch", 10 ] ] ], "components": [ [ [ "scrap", 6 ] ], [ [ "element", 2 ], [ "hotplate", 1 ] ], [ [ "cable", 2 ] ] ] }, + { + "type": "recipe", + "result": "press_dowel", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_TOOLS", + "skill_used": "survival", + "skills_required": [ "fabrication", 2 ], + "difficulty": 3, + "time": "30 m", + "autolearn": true, + "qualities": [ { "id": "CUT", "level": 1 } ], + "components": [ + [ [ "stick", 1 ], [ "mop", 1 ], [ "broom", 1 ], [ "hoe", 1 ] ], + [ [ "2x4", 1 ], [ "puck", 1 ] ], + [ [ "nail", 1 ], [ "antenna", 1 ] ], + [ [ "shot_hull", 1 ] ] + ] + }, { "type": "recipe", "result": "tailors_kit", @@ -1294,7 +1312,7 @@ "autolearn": true, "qualities": [ { "id": "CONTAIN", "level": 1 } ], "tools": [ [ [ "lighter", 5 ], [ "ref_lighter", 5 ], [ "surface_heat", 2, "LIST" ] ] ], - "components": [ [ [ "wax", 2 ], [ "tallow", 4 ], [ "tallow_tainted", 4 ] ], [ [ "string_6", 1 ] ] ] + "components": [ [ [ "wax", 1 ], [ "tallow", 4 ], [ "tallow_tainted", 4 ] ], [ [ "string_6", 1 ] ] ] }, { "type": "recipe", @@ -1808,6 +1826,7 @@ "skill_used": "fabrication", "difficulty": 1, "time": "2 m", + "reversible": true, "autolearn": true, "qualities": [ { "id": "HAMMER", "level": 2 } ], "components": [ [ [ "sheet_metal", 1 ] ] ] diff --git a/data/json/recipes/recipe_vehicle.json b/data/json/recipes/recipe_vehicle.json index 83df62327a9d8..9a4adb948a243 100644 --- a/data/json/recipes/recipe_vehicle.json +++ b/data/json/recipes/recipe_vehicle.json @@ -306,7 +306,7 @@ "type": "recipe", "result": "boat_board", "category": "CC_OTHER", - "subcategory": "CSC_OTHER_VEHICLES", + "subcategory": "CSC_OTHER_VEHICLE", "skill_used": "fabrication", "difficulty": 3, "time": 6000, @@ -319,7 +319,7 @@ "type": "recipe", "result": "plastic_boat_hull", "category": "CC_OTHER", - "subcategory": "CSC_OTHER_VEHICLES", + "subcategory": "CSC_OTHER_VEHICLE", "skill_used": "fabrication", "difficulty": 4, "time": 30000, @@ -331,7 +331,7 @@ "type": "recipe", "result": "sail", "category": "CC_OTHER", - "subcategory": "CSC_OTHER_VEHICLES", + "subcategory": "CSC_OTHER_VEHICLE", "skill_used": "fabrication", "difficulty": 2, "time": 30000, @@ -345,7 +345,7 @@ "type": "recipe", "result": "hand_paddles", "category": "CC_OTHER", - "subcategory": "CSC_OTHER_VEHICLES", + "subcategory": "CSC_OTHER_VEHICLE", "skill_used": "fabrication", "difficulty": 1, "time": 500, @@ -372,12 +372,25 @@ "type": "recipe", "result": "towel_hanger", "category": "CC_OTHER", - "subcategory": "CSC_OTHER_VEHICLES", + "subcategory": "CSC_OTHER_VEHICLE", "skill_used": "fabrication", "difficulty": 2, "time": "40 m", "autolearn": true, "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "SAW_W", "level": 1 } ], "components": [ [ [ "nail", 4 ] ], [ [ "2x4", 2 ] ], [ [ "stick", 2 ], [ "2x4", 2 ] ], [ [ "towel", 3 ] ] ] + }, + { + "type": "recipe", + "result": "wheel_mount_light", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_VEHICLE", + "skill_used": "mechanics", + "difficulty": 1, + "time": "10 m", + "autolearn": true, + "using": [ [ "welding_standard", 1 ] ], + "qualities": [ { "id": "DRILL", "level": 3 } ], + "components": [ [ [ "scrap", 2 ] ] ] } ] diff --git a/data/json/recipes/recipe_weapon.json b/data/json/recipes/recipe_weapon.json index 30fa53710fd42..d494cf136a0cf 100644 --- a/data/json/recipes/recipe_weapon.json +++ b/data/json/recipes/recipe_weapon.json @@ -1619,7 +1619,7 @@ "book_learn": [ [ "manual_rifle", 5 ], [ "textbook_anarch", 5 ] ], "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "SAW_M_FINE", "level": 1 }, { "id": "DRILL", "level": 1 } ], "tools": [ - [ [ "ar15", -1 ], [ "h&k416a5", -1 ], [ "m27iar", -1 ], [ "m4a1", -1 ] ], + [ [ "ar15", -1 ], [ "h&k416a5", -1 ], [ "m27iar", -1 ], [ "m4a1", -1 ], [ "m16a4", -1 ] ], [ [ "oxy_torch", 4 ], [ "welder", 20 ], [ "welder_crude", 40 ], [ "toolset", 40 ] ], [ [ "small_repairkit", 40 ], [ "large_repairkit", 40 ] ] ], diff --git a/data/json/recipes/weapon/magazines.json b/data/json/recipes/weapon/magazines.json index f3c555ba706f3..a4119085a1b49 100644 --- a/data/json/recipes/weapon/magazines.json +++ b/data/json/recipes/weapon/magazines.json @@ -124,6 +124,7 @@ [ "m249", -1 ], [ "m27iar", -1 ], [ "m4a1", -1 ], + [ "m16a4", -1 ], [ "scar_l", -1 ], [ "sig552", -1 ], [ "surv_carbine_223", -1 ] diff --git a/data/json/regional_map_settings.json b/data/json/regional_map_settings.json index 848917357611c..7e4e441127266 100644 --- a/data/json/regional_map_settings.json +++ b/data/json/regional_map_settings.json @@ -427,7 +427,8 @@ "mx_clay_deposit": 125, "mx_point_dead_vegetation": 500, "mx_point_burned_ground": 500, - "mx_casings": 30 + "mx_casings": 30, + "mx_corpses": 30 } }, "forest_thick": { @@ -452,7 +453,8 @@ "mx_clay_deposit": 125, "mx_point_dead_vegetation": 500, "mx_point_burned_ground": 500, - "mx_casings": 30 + "mx_casings": 30, + "mx_corpses": 30 } }, "forest_water": { @@ -475,7 +477,8 @@ "mx_clay_deposit": 125, "mx_point_dead_vegetation": 500, "mx_point_burned_ground": 500, - "mx_casings": 30 + "mx_casings": 30, + "mx_corpses": 30 } }, "field": { @@ -492,7 +495,8 @@ "mx_portal_in": 3, "mx_point_dead_vegetation": 50, "mx_point_burned_ground": 50, - "mx_casings": 50 + "mx_casings": 50, + "mx_corpses": 30 } }, "road": { @@ -512,7 +516,8 @@ "mx_portal_in": 4, "mx_roadworks": 100, "mx_mayhem": 50, - "mx_casings": 100 + "mx_casings": 100, + "mx_corpses": 30 } }, "build": { @@ -527,7 +532,9 @@ "mx_crater": 60, "mx_portal_in": 3, "mx_point_burned_ground": 5, - "mx_casings": 30 + "mx_casings": 30, + "mx_looters": 10, + "mx_corpses": 30 } }, "marloss": { "chance": 20, "extras": { "mx_marloss_pilgrimage": 100 } }, @@ -663,7 +670,7 @@ "s_restaurant_1": 400, "s_restaurant_2": 400, "s_restaurant_3": 400, - "sub_station": 500, + "sub_station": 1600, "bank": 300, "bank_1": 300, "s_pizza_parlor": 400, diff --git a/data/json/requirements/materials.json b/data/json/requirements/materials.json index 07bd074c72060..7cefa00a92298 100644 --- a/data/json/requirements/materials.json +++ b/data/json/requirements/materials.json @@ -138,5 +138,11 @@ "type": "requirement", "//": "Materials used for adding weight to weapons and to other items. The materials should be malleable, ductile and dense.", "components": [ [ [ "lead", 5 ], [ "silver_small", 5 ], [ "gold_small", 3 ], [ "platinum_small", 3 ] ] ] + }, + { + "id": "plastics", + "type": "requirement", + "//": "Materials used for plastic and rubber things.", + "components": [ [ [ "plastic_chunk", 1 ] ] ] } ] diff --git a/data/json/requirements/toolsets.json b/data/json/requirements/toolsets.json index 0ab205b8ea50b..724df19996f9d 100644 --- a/data/json/requirements/toolsets.json +++ b/data/json/requirements/toolsets.json @@ -5,6 +5,24 @@ "//": "Forming of bullets from raw materials", "tools": [ [ [ "press", -1 ] ], [ [ "fire", -1 ], [ "hotplate", 2 ], [ "toolset", 2 ] ] ] }, + { + "id": "shot_forming", + "type": "requirement", + "//": "Forming of shot from raw materials", + "tools": [ + [ [ "crucible", -1 ], [ "crucible_clay", -1 ], [ "iron_pot", -1 ], [ "pan", -1 ], [ "pot_makeshift", -1 ] ], + [ [ "water", 1 ], [ "water_clean", -1 ], [ "salt_water", -1 ], [ "water_sewage", -1 ] ], + [ + [ "ladle", -1 ], + [ "ceramic_mug", -1 ], + [ "ceramic_cup", -1 ], + [ "teapot", -1 ], + [ "clay_teapot", -1 ], + [ "can_food_unsealed", -1 ] + ], + [ [ "fire", -1 ], [ "hotplate", 2 ], [ "toolset", 2 ] ] + ] + }, { "id": "earthenware_firing", "type": "requirement", diff --git a/data/json/skillDisplayType.json b/data/json/skillDisplayType.json new file mode 100644 index 0000000000000..ed267545464ae --- /dev/null +++ b/data/json/skillDisplayType.json @@ -0,0 +1,27 @@ +[ + { + "type": "skill_display_type", + "ident": "display_melee", + "display_string": "Melee skills" + }, + { + "type": "skill_display_type", + "ident": "display_ranged", + "display_string": "Ranged skills" + }, + { + "type": "skill_display_type", + "ident": "display_crafting", + "display_string": "Crafting skills" + }, + { + "type": "skill_display_type", + "ident": "display_interaction", + "display_string": "Interaction skills" + }, + { + "type": "skill_display_type", + "ident": "display_social", + "display_string": "Social skills" + } +] diff --git a/data/json/skills.json b/data/json/skills.json index 9b0cf1d1e6444..75f5575891f63 100644 --- a/data/json/skills.json +++ b/data/json/skills.json @@ -3,182 +3,210 @@ "type": "skill", "ident": "barter", "name": "bartering", - "description": "Your skill in bargaining, haggling, and trading with others. Higher levels increase the odds of getting the better end of a deal, and might even see you convincing others to give you free stuff." + "description": "Your skill in bargaining, haggling, and trading with others. Higher levels increase the odds of getting the better end of a deal, and might even see you convincing others to give you free stuff.", + "display_category": "display_social" }, { "type": "skill", - "ident": "computer", - "name": "computers", - "description": "Your skill in accessing and manipulating computers. Higher levels can allow a user to navigate complex software systems and even bypass their security." - }, - { - "type": "skill", - "ident": "cooking", - "name": "cooking", - "description": "Your skill in combining food ingredients to make other, tastier food items. It may also be used in certain chemical mixtures and other, more esoteric tasks." - }, - { - "type": "skill", - "ident": "driving", - "name": "driving", - "description": "Your skill in operating and steering a vehicle in motion. A higher level allows greater control over vehicles at higher speeds, and reduces the penalty of shooting while driving." - }, - { - "type": "skill", - "ident": "electronics", - "name": "electronics", - "description": "Your skill in dealing with electrical systems, used in the craft and repair of objects with electrical components. This skill is an important part of installing and managing bionic implants." + "ident": "speech", + "name": "speaking", + "description": "Your skill in speaking to other people. Covers ability in boasting, flattery, threats, persuasion, lies, and other facets of interpersonal communication. Works best in conjunction with a high level of intelligence.", + "display_category": "display_social" }, { "type": "skill", - "ident": "fabrication", - "name": "fabrication", - "description": "Your skill in working with raw materials and shaping them into useful objects. This skill plays an important role in the crafting of many objects." + "ident": "computer", + "name": "computers", + "description": "Your skill in accessing and manipulating computers. Higher levels can allow a user to navigate complex software systems and even bypass their security.", + "display_category": "display_interaction" }, { "type": "skill", "ident": "firstaid", "name": "first aid", - "description": "Your skill in effecting emergency medical treatment. Higher levels allow better use of medicines and items like bandages and first aid kits, and reduce the failure and complication rates of medical procedures." + "description": "Your skill in effecting emergency medical treatment. Higher levels allow better use of medicines and items like bandages and first aid kits, and reduce the failure and complication rates of medical procedures.", + "display_category": "display_interaction" }, { "type": "skill", "ident": "mechanics", "name": "mechanics", - "description": "Your skill in engineering, maintaining and repairing vehicles and other mechanical systems. This skill covers the craft of items with complex parts, and plays a role in the installation of bionic equipment." + "description": "Your skill in engineering, maintaining and repairing vehicles and other mechanical systems. This skill covers the craft of items with complex parts, and plays a role in the installation of bionic equipment.", + "display_category": "display_interaction" }, { "type": "skill", - "ident": "speech", - "name": "speaking", - "description": "Your skill in speaking to other people. Covers ability in boasting, flattery, threats, persuasion, lies, and other facets of interpersonal communication. Works best in conjunction with a high level of intelligence." + "ident": "traps", + "name": "trapping", + "description": "Your skill in creating, setting, finding and disarming traps safely and effectively. This skill does not affect the evasion of traps that are triggered.", + "display_category": "display_interaction" }, { "type": "skill", - "ident": "survival", - "name": "survival", - "description": "Your skill in surviving the wilderness, and in crafting various basic survival items. This also covers your ability to skin and butcher animals for meat and hides." + "ident": "driving", + "name": "driving", + "description": "Your skill in operating and steering a vehicle in motion. A higher level allows greater control over vehicles at higher speeds, and reduces the penalty of shooting while driving.", + "display_category": "display_interaction" }, { "type": "skill", "ident": "swimming", "name": "swimming", - "description": "Your ability to stay afloat and move around in bodies of water. This skill keeps you from drowning, affects your combat effectiveness and speed in deep water, and determines the detriment of swimming with heavier gear." + "description": "Your ability to stay afloat and move around in bodies of water. This skill keeps you from drowning, affects your combat effectiveness and speed in deep water, and determines the detriment of swimming with heavier gear.", + "display_category": "display_interaction" }, { "type": "skill", - "ident": "tailor", - "name": "tailoring", - "description": "Your skill in the craft and repair of clothing, bags, blankets and other textiles. Affects knitting, sewing, stitching, weaving, and nearly anything else involving a needle and thread." + "ident": "fabrication", + "name": "fabrication", + "description": "Your skill in working with raw materials and shaping them into useful objects. This skill plays an important role in the crafting of many objects.", + "display_category": "display_crafting" }, { "type": "skill", - "ident": "traps", - "name": "trapping", - "description": "Your skill in creating, setting, finding and disarming traps safely and effectively. This skill does not affect the evasion of traps that are triggered." + "ident": "cooking", + "name": "cooking", + "description": "Your skill in combining food ingredients to make other, tastier food items. It may also be used in certain chemical mixtures and other, more esoteric tasks.", + "display_category": "display_crafting" }, { "type": "skill", - "ident": "archery", - "name": "archery", - "description": "Your skill in using bow weapons, from hand-carved self bows to complex compound bows. Quiet and effective, they require strength of body and sight to wield, and are not terribly accurate over a long distance.", - "tags": [ "combat_skill" ] + "ident": "tailor", + "name": "tailoring", + "description": "Your skill in the craft and repair of clothing, bags, blankets and other textiles. Affects knitting, sewing, stitching, weaving, and nearly anything else involving a needle and thread.", + "display_category": "display_crafting" }, { "type": "skill", - "ident": "bashing", - "name": "bashing weapons", - "description": "Your skill in fighting with blunt weaponry, from rocks and sticks to baseball bats and the butts of rifles. Skill increases damage, and higher levels will improve the accuracy of an attack.", - "tags": [ "combat_skill" ] + "ident": "survival", + "name": "survival", + "description": "Your skill in surviving the wilderness, and in crafting various basic survival items. This also covers your ability to skin and butcher animals for meat and hides.", + "display_category": "display_crafting" }, { "type": "skill", - "ident": "cutting", - "name": "cutting weapons", - "description": "Your skill in fighting with weaponry designed to cut, hack and slash an opponent. Lower levels of skill increase accuracy and damage, while higher levels will help to bypass heavy armor and thick hides.", - "tags": [ "combat_skill" ] + "ident": "electronics", + "name": "electronics", + "description": "Your skill in dealing with electrical systems, used in the craft and repair of objects with electrical components. This skill is an important part of installing and managing bionic implants.", + "display_category": "display_crafting" }, { "type": "skill", - "ident": "dodge", - "name": "dodging", - "description": "Your ability to dodge an oncoming threat, be it an enemy's attack, a triggered trap, or a falling rock. This skill is also used in attempts to fall gracefully, and for other acrobatic feats. The first number shown includes modifiers, and the second does not." + "ident": "archery", + "name": "archery", + "description": "Your skill in using bow weapons, from hand-carved self bows to complex compound bows. Quiet and effective, they require strength of body and sight to wield, and are not terribly accurate over a long distance.", + "tags": [ "combat_skill" ], + "display_category": "display_ranged" }, { "type": "skill", "ident": "gun", "name": "marksmanship", "description": "Your overall skill in using bows and firearms. With higher levels, this general experience increases accuracy with any bows or firearms, but is secondary to practice with the type of ranged weapon in question.", - "tags": [ "combat_skill" ] + "tags": [ "combat_skill" ], + "display_category": "display_ranged" }, { "type": "skill", "ident": "launcher", "name": "launchers", "description": "Your skill in using heavy weapons like rocket, grenade or missile launchers. These weapons have a variety of applications and may carry immense destructive power, but they are cumbersome and hard to manage.", - "tags": [ "combat_skill" ] + "tags": [ "combat_skill" ], + "display_category": "display_ranged" }, { "type": "skill", - "ident": "melee", - "name": "melee", - "description": "Your skill and finesse in personal combat, both with and without a weapon. Higher levels can significantly increase the accuracy and effectiveness of your physical attacks.", - "tags": [ "combat_skill" ] + "ident": "pistol", + "name": "handguns", + "description": "Handguns have poor accuracy compared to rifles, but are usually quick to fire and reload faster than other guns. They are very effective at close quarters, though unsuited for long range engagement.", + "tags": [ "combat_skill" ], + "display_category": "display_ranged" }, { "type": "skill", - "ident": "stabbing", - "name": "piercing weapons", - "description": "Your skill in fighting with knives, spears and other such stabbing implements. Skill increases attack accuracy as well as the chance of inflicting a deadly and critical blow.", - "tags": [ "combat_skill" ] + "ident": "rifle", + "name": "rifles", + "description": "Rifles have terrific range and accuracy compared to other firearms, but may be slow to fire and reload, and can prove difficult to use in close quarters. Fully automatic rifles can fire rapidly, but are harder to handle properly.", + "tags": [ "combat_skill" ], + "display_category": "display_ranged" + }, + { + "type": "skill", + "ident": "shotgun", + "name": "shotguns", + "description": "Shotguns are easy to shoot and can inflict massive damage, but their effectiveness and accuracy decline rapidly with range. Slugs can be loaded into shotguns to provide greater range, though they are somewhat inaccurate.", + "tags": [ "combat_skill" ], + "display_category": "display_ranged" + }, + { + "type": "skill", + "ident": "smg", + "name": "submachine guns", + "description": "Comprised of an automatic rifle carbine designed to fire a pistol cartridge, submachine guns can reload and fire quickly, sometimes in bursts, but they are relatively inaccurate and may be prone to mechanical failures.", + "tags": [ "combat_skill" ], + "display_category": "display_ranged" }, { "type": "skill", "ident": "throw", "name": "throwing", "description": "Your skill in throwing objects over a distance. Skill increases accuracy, and at higher levels, the range of a throw.", - "tags": [ "combat_skill" ] + "tags": [ "combat_skill" ], + "display_category": "display_ranged" }, { "type": "skill", - "ident": "unarmed", - "name": "unarmed combat", - "description": "Your skill in hand-to-hand fighting. For the unskilled, it's a good way to get hurt, but those with enough practice can perform special blows and techniques to quickly dispatch enemies.", - "tags": [ "combat_skill" ] + "ident": "melee", + "name": "melee", + "description": "Your skill and finesse in personal combat, both with and without a weapon. Higher levels can significantly increase the accuracy and effectiveness of your physical attacks.", + "tags": [ "combat_skill" ], + "display_category": "display_melee" }, { "type": "skill", - "ident": "pistol", - "name": "handguns", - "description": "Handguns have poor accuracy compared to rifles, but are usually quick to fire and reload faster than other guns. They are very effective at close quarters, though unsuited for long range engagement.", - "tags": [ "combat_skill" ] + "ident": "bashing", + "name": "bashing weapons", + "description": "Your skill in fighting with blunt weaponry, from rocks and sticks to baseball bats and the butts of rifles. Skill increases damage, and higher levels will improve the accuracy of an attack.", + "tags": [ "combat_skill" ], + "display_category": "display_melee" }, { "type": "skill", - "ident": "rifle", - "name": "rifles", - "description": "Rifles have terrific range and accuracy compared to other firearms, but may be slow to fire and reload, and can prove difficult to use in close quarters. Fully automatic rifles can fire rapidly, but are harder to handle properly.", - "tags": [ "combat_skill" ] + "ident": "cutting", + "name": "cutting weapons", + "description": "Your skill in fighting with weaponry designed to cut, hack and slash an opponent. Lower levels of skill increase accuracy and damage, while higher levels will help to bypass heavy armor and thick hides.", + "tags": [ "combat_skill" ], + "display_category": "display_melee" }, { "type": "skill", - "ident": "shotgun", - "name": "shotguns", - "description": "Shotguns are easy to shoot and can inflict massive damage, but their effectiveness and accuracy decline rapidly with range. Slugs can be loaded into shotguns to provide greater range, though they are somewhat inaccurate.", - "tags": [ "combat_skill" ] + "ident": "dodge", + "name": "dodging", + "description": "Your ability to dodge an oncoming threat, be it an enemy's attack, a triggered trap, or a falling rock. This skill is also used in attempts to fall gracefully, and for other acrobatic feats. The first number shown includes modifiers, and the second does not.", + "display_category": "display_melee" }, { "type": "skill", - "ident": "smg", - "name": "submachine guns", - "description": "Comprised of an automatic rifle carbine designed to fire a pistol cartridge, submachine guns can reload and fire quickly, sometimes in bursts, but they are relatively inaccurate and may be prone to mechanical failures.", - "tags": [ "combat_skill" ] + "ident": "stabbing", + "name": "piercing weapons", + "description": "Your skill in fighting with knives, spears and other such stabbing implements. Skill increases attack accuracy as well as the chance of inflicting a deadly and critical blow.", + "tags": [ "combat_skill" ], + "display_category": "display_melee" + }, + { + "type": "skill", + "ident": "unarmed", + "name": "unarmed combat", + "description": "Your skill in hand-to-hand fighting. For the unskilled, it's a good way to get hurt, but those with enough practice can perform special blows and techniques to quickly dispatch enemies.", + "tags": [ "combat_skill" ], + "display_category": "display_melee" }, { "type": "skill", "ident": "weapon", "name": "weapon", "description": "seeing this is a bug", - "tags": [ "contextual_skill" ] + "tags": [ "contextual_skill" ], + "display_category": "none" } ] diff --git a/data/json/snippets/hazardous_waste_sarcophagus.json b/data/json/snippets/hazardous_waste_sarcophagus.json new file mode 100644 index 0000000000000..98d9cd085085f --- /dev/null +++ b/data/json/snippets/hazardous_waste_sarcophagus.json @@ -0,0 +1,65 @@ +[ + { + "type": "snippet", + "category": "sr1_mess", + "text": [ + "\nSubj: Security Reminder\nTo: all SRCF staff\nFrom: Constantine Dvorak, Undersecretary of Nuclear Security\n\n I want to remind everyone on staff: do not open or examine containers above your security-clearance. If you have some question about safety protocols or shipping procedures, please contact your SRCF administrator or on-site military officer. When in doubt, assume all containers are Class-A Biohazards and highly toxic. Take full precautions!" + ] + }, + { + "type": "snippet", + "category": "sr2_mess", + "text": [ + "\nSubj: Security Reminder\nTo: all SRCF staff\nFrom: Constantine Dvorak, Undersecretary of Nuclear Security\n\n From today onward medical wastes are not to be stored anywhere near radioactive materials. All containers are to be re-arranged according to these new regulations. If your facility currently has these containers stored in close proximity, you are to work with armed guards on duty at all times. Report any unusual activity to your SRCF administrator at once." + ] + }, + { + "type": "snippet", + "category": "sr3_mess", + "text": [ + "\nSubj: Security Reminder\nTo: all SRCF staff\nFrom: Constantine Dvorak, Undersecretary of Nuclear Security\n\n Worker health and safety is our number one concern! As such, we are instituting weekly health examinations for all SRCF employees. Report any unusual symptoms or physical changes to your SRCF administrator at once." + ] + }, + { + "type": "snippet", + "category": "sr4_mess", + "text": [ + "\nSubj: Security Reminder\nTo: all SRCF staff\nFrom: Constantine Dvorak, Undersecretary of Nuclear Security\n\n All compromised facilities will remain under lock down until further notice. Anyone who has seen or come in direct contact with the creatures is to report to the home office for a full medical evaluation and security debriefing." + ] + }, + { + "type": "snippet", + "category": "scrf_1_mess", + "text": [ + "Subj: EPA: Report All Potential Containment Breaches 3873643\nTo: all SRCF staff\nFrom: Robert Shane, Director of the EPA\n\n All hazardous waste dumps and sarcophagi must submit three samples from each operational leache system to the following addresses:\n\nCDC Bioterrorism Lab\nBuilding 10\nCorporate Square Boulevard\nAtlanta, GA 30329\n\nEPA Region 8 Laboratory\n16194 W. 45th Drive\nGolden, CO 80403\n\n These samples must be accurate and any attempts to cover incompetencies will result in charges of Federal Corruption and potentially Treason.\n\nDirector of the EPA,\n Robert Shane" + ] + }, + { + "type": "snippet", + "category": "scrf_2_1_mess", + "text": [ + "Subj: SRCF: Internal Memo, EPA [2918024]\nTo: all SRCF admin staff\nFrom: Constantine Dvorak, Undersecretary of Nuclear Security\n\n Director Grimes has released a new series of accusations that will soon be investigated by a Congressional committee. Below is the message that he sent me.\n--------------------------------------------------------------\nSubj: Congressional Investigations\nTo: Constantine Dvorak, Undersecretary of Nuclear Safety\nFrom: Robert Shane, director of the EPA\n\n The EPA has opposed the Security-Restricted Containment Facility (SRCF) project from its inception. We were horrified that these facilities would be constructed so close to populated areas, and only agreed to sign-off on the project if we were allowed to freely examine and monitor the sarcophagi. But that has not happened. Since then, the DoE has employed any and all means to keep EPA agents from visiting the SRCFs, using military secrecy, emergency powers, and inter-departmental gag orders to surround the project with an impenetrable thicket of red tape." + ] + }, + { + "type": "snippet", + "category": "scrf_2_2_mess", + "text": [ + "Although our agents have not been allowed inside, our atmospheric testers in nearby communities have detected high levels of toxins and radiation, and we've found dozens of potentially dangerous unidentified compounds in the ground water. We now have conclusive evidence that the SRCFs are a threat to the public safety. We are taking these data to state representatives and petitioning for a full Congressional inquiry. They should be able to force open your secret vaults, and the world will see what you've been hiding.\n\nIf you had any hand in this outbreak I hope you will rot in hell.\n\nDirector of the EPA,\n Robert Shane" + ] + }, + { + "type": "snippet", + "category": "scrf_3_mess", + "text": [ + "Subj: CDC: Internal Memo, Standby [2918115]\nTo: all SRCF staff\nFrom: Ellen Grimes, Director of the CDC\n\n Your site along with many others has been found to be contaminated with what we will now refer to as [redacted]. It is vital that you standby for further orders. We are currently awaiting the President to decide our course of action in this national crisis. You will proceed with fail-safe procedures and rig the sarcophagus with C-4 as outlined in Publication 4423. We will send you orders to either detonate and seal the sarcophagus or remove the charges. It is of the utmost importance that the facility be sealed immediately when the orders are given. We have been alerted by Homeland Security that there are potential terrorist suspects that are being detained in connection with the recent national crisis.\n\nDirector of the CDC,\n Ellen Grimes" + ] + }, + { + "type": "snippet", + "category": "scrf_seal_order", + "text": [ + "Subj: USARMY: SEAL SRCF [987167]\nTo: all SRCF staff\nFrom: Major General Cornelius, U.S. Army\n\n As a general warning to all civilian staff: the 10th Mountain Division has been assigned to oversee the sealing of the SRCF facilities. By direct order, all non-essential staff must vacate at the earliest possible opportunity to prevent potential contamination. Low yield tactical nuclear demolition charges will be deployed in the lower tunnels to ensure that recovery of hazardous material is impossible. The Army Corps of Engineers will then dump concrete over the rubble so that we can redeploy the 10th Mountain into the greater Boston area.\n\nCornelius,\nMajor General, U.S. Army\nCommander of the 10th Mountain Division" + ] + } +] diff --git a/data/json/snippets/snippets.json b/data/json/snippets/snippets.json index 8e2dd6cb356d0..663a893471b60 100644 --- a/data/json/snippets/snippets.json +++ b/data/json/snippets/snippets.json @@ -533,6 +533,7 @@ "Today we tested weaponry against XE142 and XE157, two amorphous subprime samples. Their form proved to be nearly invulnerable to projectile based weaponry, but they were susceptible to directed energy weapons and flagration.", "Our cloning department has failed to produce results. In vats containing stem cell treatments, XE037, and control vats, the subjects simple disintegrated. This suggests that XE037, while compatible with subprime lifeforms, shows only destructive effects on prime plane lifeforms.", "The vivisection program has shown mixed results, revealing an incredible degree of variation in subplane lifeforms. Certain specimens have an internal structure that is amazingly similar to that of mammals, while others seem to have no internal structure at all.", + "We've had to remind the groups that the trams that have been completed for inter-facility shipments are not for personal use, no matter how long it's been since they've seen their significant others. Receiving says their stockrooms are a mess because of all the frivolous shipments. Don't people know better about office romances anyways?", "Our security department has identified several key flaws. Though our surface entrance is quite secure, there are several possible points of entry below the surface, particularly in the sewage systems.", "Today we applied a very small sample of XE037, suspended in water, to subject TP92, prior to necessary termination. During the postmortem examination, the subject went through a revivification progress, but displayed next to no human intelligence.", "Mendelson shows a dismaying lack of organization and security consciousness. Containment of all samples of XE037 is of critical importance, as shown by contamination experiments.", @@ -552,7 +553,7 @@ "Exposure to radiation of test subject T3D indicates stimulation of internal XE037 deposits and a temporary lifting of the mammalian stasis condition.", "As in the tests of isolated XE037 samples, prolonged radiation exposure of T3D has resulted in significant structural changes. These do not appear to be random. T3D appears to be in immense pain as a result of these changes, but the lack of an oral opening has rendered him unable to vocalize.", "Subject T3D has succumbed to radiation poisoning, but not before undergoing several more physiological changes the lab boys are referring to as \"mutations\". They do not appear to be truly random, and may be an attempt by XE037 to adapt its host to an unknown stimulus.", - "Post-mortem revivification of subject T3D occurred as expected, followed by an immediate autopsy. The internal changes were significant, with large parts of the subjects internal anatomy replaced with \"organs\" of XE037 with unknown properties, primarily those known to succumb earlier to the effects of radiation poisoning.", + "Post-mortem revivification of subject T3D occurred as expected, followed by an immediate autopsy. The internal changes were significant, with large parts of the subject's internal anatomy replaced with \"organs\" of XE037 with unknown properties, primarily those known to succumb earlier to the effects of radiation poisoning.", "Samples of XE037 from subject T3D remains extremely active. Further experimentation on induced mutation in infected individuals shows significant potential. Samples of the enhanced XE037, labeled PE012, have been sent to several researchers for further study.", "S37ZBE, the special investigation into the effects of XE037 on inert human bodies, has made terrific discoveries. It seems that it occasionally displays a mutagenic property which manifests itself after termination of the subject, resulting in a striking variety in postmortem morphology.", "Incidence of post-mortem mutation seems to depend on several factors - leading candidates include type and amount of damage sustained leading to expiration, embedded foreign bodies at time of revivification, proximity to other revived individuals, and the body mass of the subject.", @@ -562,6 +563,8 @@ "Jakobson was killed today by one of S37ZBE's subjects; ironic considering how hard he fought to keep the project active. Alarmingly, his corpse revivified immediately. This suggests that XE037 may have contaminated the lab at large.", "Termination of a subject which was never a part of S37ZBE has confirmed my fears. XE037 has contaminated most, if not all of the laboratory, most likely via the water supply. Research has started immediately into a process to destroy XE037 within the human body.", "Despite a wide variety of treatments, we have been completely unsuccessful in removing XE037 from human subjects. Every individual displayed revivification post termination. Interestingly, XE037 seems to be completely inert prior to termination.", + "Facilities security has been scrambling to hold onto their security contractors due to the massive uptick in fatalities; a decision was made to procure a number of obsoleted remote turrets and EOD bots to increase safety. Few of us are comfortable working with a gun over our shoulders being run electronically by a glorified mall cop, but we're assured it's safer for all of us.", + "Following S37ZBE's fallout, IT has noted far too many attempts have been made to access other teams' drives and terminals, including certain unofficial directories. Lack of sufficient monitoring means we have been unable to pinpoint the bad actors, but IT has proposed automatically dispatching the UGV's as a deterrant.", "We have finally found success in S37BEP, our emergency investigation into the destruction of XE037 in living subjects. 8 of 10 of the subjects showed no revivification, despite confirmed dosages of XE037.", "PE062, our \"cure\" for XE037 contamination, has neared perfection. Sadly, the production of PE062 is a costly and time-consuming process. What is more, the substance shows no effect on postmortem subjects whatsoever; a substance which renders XE037 inert after it has activated would be immensely useful in the case of an outbreak.", "An alarming discovery has been made. A colony of XE037 has formed nearly a half mile from the laboratory. It is unclear how it escaped; it is quite possible that it is in the ground water now.", @@ -569,6 +572,7 @@ "It has begun. The XE037 contamination has spread for miles, and those who have since deceased have revivified. It is my fear that extremely large populations will be decimated by this pandemic. We must find a way to remove XE037 from revivified bodies.", "We have even more distressing news than the widespread XE037 contamination, there are reports of the XE037 mutating into various new variants. See data files on XE037a - XE037f. Research on the effects of these variants is ongoing. We do know that XE037d shows signs of PE062 immunity, and XE037b can revive various breeds of canines. However, revival is not as guaranteed as standard XE037 humanoid infection. Canine body size seems to influence the chances. See experiment tXE037b_c.", "Today we found our solution, quite by accident. It was found that XE037 is completely removed from a revivified body following a series of extremely-high energy 4th dimensional transpositions. Unfortunately, this invariably allows subplane life forms to pass into the prime plan. The cure is worse than the disease.", + "Herrera's group retained copies of the source General Carlsberg asked us to look into; with several of our facilities no longer responding, or other teams essentially 'going down with their ships', they've done their best to adapt the code to the older equipment. It's likely several revisions old now, and mostly shoots at anything humanoid shaped with a heat signature, but our hope is it'll buy us all some time.", "XE037 revivification has reached critical levels, which are rapidly overwhelming the available military and regional police assets' ability to stop. Every team in the field has encountered hostile specimens, and several are no longer responding to communications. Dr. Savage has proposed a strategic redeployment to the underground complex known as the VAULT, and continuing production of PE062 there." ] }, @@ -631,5 +635,12 @@ "type": "snippet", "category": "headshop_graffiti", "text": [ "(~);}", " + forever", "Be Kind", "Save the whales!" ] + }, + { + "type": "snippet", + "category": "death_note", + "text": [ + "This is General Baker. Today I received a top-secret letter with new orders from high command. These orders described a new set of coordinates for our ICBM. My men deciphered it, and it became crystal-clear that coordinates are pointing to a certain place inside our country. I requested re-confirmation, and after a short while I received it with the same coordinates, so it wasn't an weird error as I originally thought. I don't know what's on the minds of these guys in the government, but I'm not gonna bomb innocent people of my country. We're just one step away from starting a war, so failure to comply with an order will obviously result in a execution. And it's just a matter of time when they come for me. So actually I'm already a dead man. Whomever may find this. Please tell my wife Jane I love her and Michael Jr. And tell her I'm sorry. General Michael Baker" + ] } ] diff --git a/data/json/techniques.json b/data/json/techniques.json index 58c343cac1726..fb81530aa06dd 100644 --- a/data/json/techniques.json +++ b/data/json/techniques.json @@ -855,6 +855,120 @@ "unarmed_allowed": true, "mult_bonuses": [ [ "damage", "bash", 1.2 ] ] }, + { + "type": "technique", + "id": "tec_krav_maga_rapid", + "messages": [ "You jab at %s", " jabs at %s" ], + "name": "Jab", + "min_unarmed": 1, + "melee_allowed": true, + "unarmed_allowed": true, + "mult_bonuses": [ [ "movecost", 0.5 ], [ "damage", "bash", 0.66 ], [ "damage", "cut", 0.66 ], [ "damage", "stab", 0.66 ] ] + }, + { + "type": "technique", + "id": "tec_krav_maga_crit", + "name": "Cheapshot", + "messages": [ "You hit %s where it hurts", " hits %s with a cheapshot" ], + "min_unarmed": 2, + "melee_allowed": true, + "unarmed_allowed": true, + "crit_tec": true, + "stun_dur": 1 + }, + { + "type": "technique", + "id": "tec_krav_maga_takedown", + "name": "Takedown", + "messages": [ "You force %s to the ground", " forces %s to the ground" ], + "min_unarmed": 3, + "melee_allowed": true, + "unarmed_allowed": true, + "crit_ok": true, + "down_dur": 1 + }, + { + "type": "technique", + "id": "tec_krav_maga_disarm", + "name": "Bone Breaker", + "messages": [ "*CRACK!* You brutally maim %s's arm", "*CRACK!* brutally maims %s's arm" ], + "min_unarmed": 5, + "unarmed_allowed": true, + "weighting": 3, + "crit_ok": true, + "downed_target": true, + "stunned_target": true, + "disarms": true, + "stun_dur": 3, + "flat_bonuses": [ [ "arpen", "bash", "str", 1.0 ] ], + "mult_bonuses": [ [ "damage", "bash", 3.0 ] ] + }, + { + "type": "technique", + "id": "tec_krav_maga_break", + "name": "Grab Break", + "messages": [ "The %s tries to grab you, but you wrestle free!", "The %s tries to grab , but they wrestle free!" ], + "min_unarmed": 3, + "melee_allowed": true, + "unarmed_allowed": true, + "defensive": true, + "grab_break": true + }, + { + "type": "technique", + "id": "tec_krav_maga_counter", + "name": "Counter", + "messages": [ "You block and counter %s", " blocks and counters %s" ], + "min_unarmed": 4, + "melee_allowed": true, + "unarmed_allowed": true, + "crit_ok": true, + "block_counter": true, + "mult_bonuses": [ [ "movecost", 0.0 ] ] + }, + { + "type": "technique", + "id": "tec_leopard_feint", + "name": "Leopard Paw", + "messages": [ "You paw aggressively at %s", " paws aggressively at %s" ], + "min_unarmed": 2, + "unarmed_allowed": true, + "defensive": true, + "miss_recovery": true + }, + { + "type": "technique", + "id": "tec_leopard_precise", + "name": "Leopard Fist", + "messages": [ "You strike out at %s with your Leopard Fist", " strikes out at %s with a Leopard Fist" ], + "min_unarmed": 4, + "unarmed_allowed": true, + "crit_tec": true, + "stun_dur": 1, + "mult_bonuses": [ [ "movecost", 0.5 ] ] + }, + { + "type": "technique", + "id": "tec_leopard_rapid", + "name": "Leopard Swipe", + "messages": [ "You quickly swipe at %s", " quickly swipes at %s" ], + "min_unarmed": 0, + "unarmed_allowed": true, + "mult_bonuses": [ [ "movecost", 0.5 ], [ "damage", "bash", 0.66 ], [ "damage", "cut", 0.66 ], [ "damage", "stab", 0.66 ] ] + }, + { + "type": "technique", + "id": "tec_leopard_counter", + "name": "Leopard Foresight", + "messages": [ "You dodge the attack and swipe at %s's exposed flank", " dodges and catches %s exposed" ], + "min_unarmed": 5, + "unarmed_allowed": true, + "crit_ok": true, + "dodge_counter": true, + "knockback_dist": 1, + "knockback_spread": 1, + "mult_bonuses": [ [ "movecost", 0.0 ] ] + }, { "type": "technique", "id": "tec_pankration_kick", @@ -973,64 +1087,6 @@ "messages": [ "You flying knee %s", " flying knees %s" ], "stun_dur": 2 }, - { - "type": "technique", - "id": "tec_krav_maga_rapid", - "name": "quick punch", - "min_unarmed": 2, - "unarmed_allowed": true, - "messages": [ "You quickly punch %s", " quickly punches %s" ], - "mult_bonuses": [ [ "movecost", 0.5 ], [ "damage", "bash", 0.66 ], [ "damage", "cut", 0.66 ], [ "damage", "stab", 0.66 ] ] - }, - { - "type": "technique", - "id": "tec_krav_maga_feint", - "name": "feint at", - "min_unarmed": 2, - "unarmed_allowed": true, - "defensive": true, - "miss_recovery": true, - "messages": [ "You feint at %s", " feints at %s" ] - }, - { - "type": "technique", - "id": "tec_krav_maga_precise", - "name": "precise strike", - "min_unarmed": 3, - "unarmed_allowed": true, - "crit_tec": true, - "messages": [ "You jab %s", " jabs %s" ], - "stun_dur": 2 - }, - { - "type": "technique", - "id": "tec_krav_maga_disarm", - "name": "disarm", - "min_unarmed": 3, - "unarmed_allowed": true, - "disarms": true, - "messages": [ "You disarm %s", " disarms %s" ] - }, - { - "type": "technique", - "id": "tec_krav_maga_grab", - "name": "grab", - "min_unarmed": 4, - "unarmed_allowed": true, - "down_dur": 1, - "messages": [ "You grab %s", " grabs %s" ] - }, - { - "type": "technique", - "id": "tec_krav_maga_break", - "name": "grab break", - "min_unarmed": 4, - "unarmed_allowed": true, - "melee_allowed": true, - "defensive": true, - "grab_break": true, - "messages": [ "The %s tries to grab you, but you break its grab!", "The %s tries to grab , but they break its grab!" ] - }, { "type": "technique", "id": "tec_ninjutsu_precise", @@ -1145,36 +1201,6 @@ "down_dur": 1, "messages": [ "You grab and ground %s", " grabs and grounds %s" ] }, - { - "type": "technique", - "id": "tec_leopard_precise", - "name": "Leopard Fist", - "min_unarmed": 5, - "unarmed_allowed": true, - "crit_tec": true, - "messages": [ "You strike out at %s with your Leopard Fist", " strikes out at %s with a Leopard Fist" ], - "stun_dur": 2 - }, - { - "type": "technique", - "id": "tec_leopard_rapid", - "name": "Leopard Swipe", - "min_unarmed": 2, - "unarmed_allowed": true, - "mult_bonuses": [ [ "movecost", 0.5 ], [ "damage", "bash", 0.66 ], [ "damage", "cut", 0.66 ], [ "damage", "stab", 0.66 ] ], - "messages": [ "You quickly swipe at %s", " quickly swipes at %s" ] - }, - { - "type": "technique", - "id": "tec_leopard_counter", - "name": "Leopard Foresight", - "min_unarmed": 4, - "unarmed_allowed": true, - "dodge_counter": true, - "crit_ok": true, - "mult_bonuses": [ [ "movecost", 0.0 ], [ "damage", "bash", 1.5 ] ], - "messages": [ "You dodge the attack and swipe at %s's exposed flank", " dodges and catches %s exposed" ] - }, { "type": "technique", "id": "tec_snake_rapid", diff --git a/data/json/tool_qualities.json b/data/json/tool_qualities.json index 58f601f231791..ef9e4a9d11a09 100644 --- a/data/json/tool_qualities.json +++ b/data/json/tool_qualities.json @@ -21,6 +21,11 @@ "id": "ANESTHESIA", "name": "anesthesia" }, + { + "type": "tool_quality", + "id": "FISHING", + "name": "fishing" + }, { "type": "tool_quality", "id": "SMOOTH", diff --git a/data/json/uncraft/vehicle/noise.json b/data/json/uncraft/vehicle/noise.json new file mode 100644 index 0000000000000..7c6066d8bb1f7 --- /dev/null +++ b/data/json/uncraft/vehicle/noise.json @@ -0,0 +1,40 @@ +[ + { + "type": "uncraft", + "result": "muffler", + "skill_used": "fabrication", + "difficulty": 1, + "time": "48 s", + "qualities": [ { "id": "SAW_M", "level": 1 } ], + "components": [ [ [ "scrap", 7 ] ], [ [ "steel_chunk", 1 ] ], [ [ "platinum_small", 1 ] ], [ [ "pipe", 2 ] ] ] + }, + { + "type": "uncraft", + "result": "beeper", + "skill_used": "mechanics", + "difficulty": 1, + "time": "500 s", + "qualities": [ { "id": "SCREW", "level": 1 } ], + "components": [ [ [ "plastic_chunk", 2 ] ], [ [ "cable", 2 ] ], [ [ "scrap", 3 ] ] ] + }, + { + "type": "uncraft", + "result": "stereo", + "skill_used": "mechanics", + "difficulty": 2, + "time": "20 m", + "qualities": [ { "id": "SCREW", "level": 1 }, { "id": "SAW_M", "level": 1 } ], + "using": [ [ "soldering_standard", 10 ], [ "welding_standard", 10 ] ], + "components": [ [ [ "power_supply", 1 ] ], [ [ "cable", 40 ] ], [ [ "e_scrap", 7 ] ], [ [ "scrap", 12 ] ], [ [ "beeper", 1 ] ] ] + }, + { + "type": "uncraft", + "result": "chimes", + "skill_used": "mechanics", + "difficulty": 2, + "time": "20 m", + "qualities": [ { "id": "SCREW", "level": 1 }, { "id": "SAW_M", "level": 1 } ], + "using": [ [ "soldering_standard", 10 ], [ "welding_standard", 10 ] ], + "components": [ [ [ "power_supply", 1 ] ], [ [ "cable", 20 ] ], [ [ "e_scrap", 5 ] ], [ [ "scrap", 15 ] ], [ [ "beeper", 1 ] ] ] + } +] diff --git a/data/json/vehicleparts/battery.json b/data/json/vehicleparts/battery.json index 33b24c6ebed0d..7d3bb3f7ffa7d 100644 --- a/data/json/vehicleparts/battery.json +++ b/data/json/vehicleparts/battery.json @@ -50,6 +50,31 @@ { "item": "scrap", "count": [ 4, 7 ] } ] }, + { + "id": "large_storage_battery", + "copy-from": "storage_battery", + "type": "vehicle_part", + "name": "large storage battery", + "item": "large_storage_battery", + "durability": 600, + "breaks_into": [ + { "item": "steel_lump", "count": [ 10, 20 ] }, + { "item": "steel_chunk", "count": [ 5, 10 ] }, + { "item": "scrap", "count": [ 5, 10 ] }, + { "item": "storage_battery", "count": [ 0, 1 ] } + ] + }, + { + "id": "large_storage_battery_removable", + "copy-from": "large_storage_battery", + "type": "vehicle_part", + "name": "swappable large storage battery", + "item": "large_storage_battery", + "location": "on_battery_mount", + "requirements": { "install": { "time": 1000 } }, + "description": "A battery for storing electrical power, and discharging it to power electrical devices built into the vehicle. This one is mounted on a quick release framework to allow it to be easily swapped, though it still weighs so much that a lifting tool of some kind is necessary for most people.", + "flags": [ "NEEDS_BATTERY_MOUNT" ] + }, { "id": "medium_storage_battery", "copy-from": "storage_battery", diff --git a/data/json/vehicleparts/boards.json b/data/json/vehicleparts/boards.json index d5a35d437daae..b4b4640fc146a 100644 --- a/data/json/vehicleparts/boards.json +++ b/data/json/vehicleparts/boards.json @@ -57,11 +57,11 @@ "broken_symbol": "#", "broken_color": "light_gray", "difficulty": 2, - "durability": 160, + "durability": 80, "description": "A metal wall with a storage locker. Keeps zombies outside the vehicle and prevents people from seeing through it.", "size": 250, "flags": [ "OBSTACLE", "OPAQUE", "CARGO", "COVERED", "FULL_BOARD", "NO_ROOF_NEEDED" ], - "damage_reduction": { "all": 34 } + "damage_reduction": { "all": 28 } }, { "abstract": "hdstowboard", diff --git a/data/json/vehicleparts/turret.json b/data/json/vehicleparts/turret.json old mode 100644 new mode 100755 index 58e6c02516e59..8224c52cb819e --- a/data/json/vehicleparts/turret.json +++ b/data/json/vehicleparts/turret.json @@ -55,6 +55,21 @@ "removal": { "skills": [ [ "mechanics", 3 ] ] } } }, + { + "id": "laser_cannon", + "copy-from": "turret", + "type": "vehicle_part", + "name": "mounted Cerberus laser cannon", + "item": "laser_cannon", + "color": "magenta", + "broken_color": "magenta", + "difficulty": 5, + "breaks_into": [ { "item": "laser_cannon", "prob": 50 } ], + "requirements": { + "install": { "skills": [ [ "mechanics", 5 ], [ "electronics", 5 ] ], "time": 10000 }, + "removal": { "skills": [ [ "mechanics", 3 ] ] } + } + }, { "id": "m249", "copy-from": "turret", diff --git a/data/json/vehicleparts/wheel.json b/data/json/vehicleparts/wheel.json index e21976eacc700..06910551efb37 100644 --- a/data/json/vehicleparts/wheel.json +++ b/data/json/vehicleparts/wheel.json @@ -1,22 +1,109 @@ [ { - "id": "metal_wheel", "type": "vehicle_part", - "name": "metal wheel", - "item": "wheel_metal", - "location": "under", - "symbol": "|", - "broken_symbol": "x", - "difficulty": 2, - "durability": 180, - "description": "A strong metal wheel.", - "damage_modifier": 70, - "breaks_into": [ { "item": "scrap", "count": [ 4, 6 ] }, { "item": "steel_chunk", "count": [ 2, 3 ] } ], - "rolling_resistance": 0.375, - "wheel_type": "rigid", - "contact_area": 80, - "flags": [ "WHEEL" ], - "damage_reduction": { "all": 66 } + "id": "wheel_mount_light", + "name": "light wheel mount", + "symbol": "-", + "color": "light_gray", + "location": "axle", + "broken_symbol": "X", + "broken_color": "light_gray", + "damage_modifier": 80, + "folded_volume": 1, + "durability": 120, + "description": "A piece of metal with holes suitable for a bike or motorbike wheel.", + "item": "wheel_mount_light", + "requirements": { + "install": { "skills": [ [ "mechanics", 2 ] ], "time": "10 m", "using": [ [ "welding_standard", 3 ] ] }, + "removal": { "skills": [ [ "mechanics", 1 ] ], "time": "10 m", "qualities": [ { "id": "SAW_M", "level": 2 } ] }, + "repair": { "skills": [ [ "mechanics", 1 ] ], "time": "10 m", "using": [ [ "welding_standard", 5 ] ] } + }, + "flags": [ "WHEEL_MOUNT_LIGHT", "NEEDS_JACKING", "FOLDABLE" ], + "breaks_into": [ { "item": "scrap", "count": [ 0, 1 ] } ], + "damage_reduction": { "all": 10 } + }, + { + "id": "wheel_mount_light_steerable", + "copy-from": "wheel_mount_light", + "type": "vehicle_part", + "name": "light wheel mount (steerable)", + "extend": { "flags": [ "STEERABLE" ] } + }, + { + "type": "vehicle_part", + "id": "wheel_mount_medium", + "name": "hub assembly", + "symbol": "-", + "color": "light_gray", + "location": "axle", + "broken_symbol": "X", + "broken_color": "light_gray", + "damage_modifier": 80, + "durability": 120, + "description": "Connection where wheels can be connected on. This particular one is fit for normal car wheels.", + "item": "wheel_mount_medium", + "requirements": { + "install": { + "skills": [ [ "mechanics", 4 ] ], + "time": "45 m", + "qualities": [ { "id": "WRENCH", "level": 2 } ], + "using": [ [ "welding_standard", 10 ] ] + }, + "removal": { + "skills": [ [ "mechanics", 3 ] ], + "time": "15 m", + "qualities": [ { "id": "WRENCH", "level": 2 }, { "id": "SAW_M", "level": 2 } ] + }, + "repair": { "skills": [ [ "mechanics", 2 ] ], "time": "15 m", "using": [ [ "welding_standard", 5 ] ] } + }, + "flags": [ "WHEEL_MOUNT_MEDIUM", "NEEDS_JACKING" ], + "breaks_into": [ { "item": "scrap", "count": [ 1, 4 ] }, { "item": "steel_chunk", "count": [ 2, 5 ] } ], + "damage_reduction": { "all": 30 } + }, + { + "id": "wheel_mount_medium_steerable", + "copy-from": "wheel_mount_medium", + "type": "vehicle_part", + "name": "hub assembly (steerable)", + "extend": { "flags": [ "STEERABLE" ] } + }, + { + "type": "vehicle_part", + "id": "wheel_mount_heavy", + "name": "heavy hub assembly", + "symbol": "-", + "color": "light_gray", + "location": "axle", + "broken_symbol": "X", + "broken_color": "light_gray", + "damage_modifier": 80, + "durability": 120, + "description": "Connection where wheels can be connected on. This particular one is fit for large car wheels.", + "item": "wheel_mount_heavy", + "requirements": { + "install": { + "skills": [ [ "mechanics", 5 ] ], + "time": "60 m", + "qualities": [ { "id": "WRENCH", "level": 2 } ], + "using": [ [ "welding_standard", 15 ] ] + }, + "removal": { + "skills": [ [ "mechanics", 3 ] ], + "time": "20 m", + "qualities": [ { "id": "WRENCH", "level": 2 }, { "id": "SAW_M", "level": 2 } ] + }, + "repair": { "skills": [ [ "mechanics", 2 ] ], "time": "15 m", "using": [ [ "welding_standard", 5 ] ] } + }, + "flags": [ "WHEEL_MOUNT_HEAVY", "NEEDS_JACKING" ], + "breaks_into": [ { "item": "scrap", "count": [ 1, 4 ] }, { "item": "steel_chunk", "count": [ 3, 7 ] } ], + "damage_reduction": { "all": 40 } + }, + { + "id": "wheel_mount_heavy_steerable", + "copy-from": "wheel_mount_heavy", + "type": "vehicle_part", + "name": "heavy hub assembly (steerable)", + "extend": { "flags": [ "STEERABLE" ] } }, { "id": "rail_wheel", @@ -34,7 +121,7 @@ "rolling_resistance": 0.25, "wheel_type": "rail", "contact_area": 80, - "flags": [ "WHEEL", "RAIL" ], + "flags": [ "WHEEL", "NEEDS_JACKING", "RAIL" ], "damage_reduction": { "all": 66 } }, { @@ -63,7 +150,7 @@ { "item": "scrap", "count": [ 50, 150 ] } ], "rolling_resistance": 0.125, - "flags": [ "ARMOR", "OBSTACLE", "WHEEL", "STEERABLE" ], + "flags": [ "ARMOR", "OBSTACLE", "WHEEL", "NEEDS_JACKING", "STEERABLE" ], "wheel_type": "rigid", "contact_area": 400, "damage_reduction": { "all": 280 } @@ -77,7 +164,6 @@ "symbol": "0", "broken_symbol": "x", "color": "dark_gray", - "difficulty": 3, "durability": 200, "description": "A wheel.", "damage_modifier": 50, @@ -89,16 +175,14 @@ "rolling_resistance": 1, "wheel_type": "standard", "contact_area": 153, - "flags": [ "WHEEL" ], + "requirements": { + "install": { "skills": [ [ "mechanics", 0 ] ], "time": "15 m", "qualities": [ { "id": "WRENCH", "level": 2 } ] }, + "removal": { "skills": [ [ "mechanics", 0 ] ], "time": "15 m", "qualities": [ { "id": "WRENCH", "level": 2 } ] }, + "repair": { "skills": [ [ "mechanics", 4 ] ], "time": "15 m", "using": [ [ "adhesive", 1 ], [ "plastics", 1 ] ] } + }, + "flags": [ "WHEEL", "NEEDS_JACKING", "NEEDS_WHEEL_MOUNT_MEDIUM" ], "damage_reduction": { "bash": 20 } }, - { - "id": "wheel_steerable", - "copy-from": "wheel", - "type": "vehicle_part", - "name": "wheel (steerable)", - "extend": { "flags": [ "STEERABLE" ] } - }, { "id": "wheel_slick", "copy-from": "wheel", @@ -109,14 +193,6 @@ "contact_area": 180, "damage_reduction": { "bash": 12 } }, - { - "id": "wheel_slick_steerable", - "copy-from": "wheel_slick", - "type": "vehicle_part", - "name": "racing slick (steerable)", - "item": "wheel_slick", - "extend": { "flags": [ "STEERABLE" ] } - }, { "id": "wheel_armor", "type": "vehicle_part", @@ -126,7 +202,6 @@ "symbol": "0", "broken_symbol": "x", "color": "green", - "difficulty": 4, "durability": 800, "description": "A very strong, armored metal wheel.", "damage_modifier": 50, @@ -138,16 +213,14 @@ "rolling_resistance": 0.6, "wheel_type": "standard", "contact_area": 480, - "flags": [ "WHEEL" ], + "requirements": { + "install": { "skills": [ [ "mechanics", 0 ] ], "time": "20 m", "qualities": [ { "id": "WRENCH", "level": 2 } ] }, + "removal": { "skills": [ [ "mechanics", 0 ] ], "time": "20 m", "qualities": [ { "id": "WRENCH", "level": 2 } ] }, + "repair": { "skills": [ [ "mechanics", 5 ] ], "time": "20 m", "using": [ [ "adhesive", 1 ], [ "plastics", 1 ] ] } + }, + "flags": [ "WHEEL", "NEEDS_JACKING", "NEEDS_WHEEL_MOUNT_HEAVY" ], "damage_reduction": { "all": 60, "cut": 30, "stab": 16 } }, - { - "id": "wheel_armor_steerable", - "copy-from": "wheel_armor", - "type": "vehicle_part", - "name": "armored wheel (steerable)", - "extend": { "flags": [ "STEERABLE" ] } - }, { "id": "wheel_barrow", "type": "vehicle_part", @@ -157,7 +230,6 @@ "symbol": "o", "broken_symbol": "x", "color": "dark_gray", - "difficulty": 2, "durability": 70, "description": "A small wheel.", "damage_modifier": 50, @@ -166,7 +238,12 @@ "rolling_resistance": 1.62, "wheel_type": "off-road", "contact_area": 30, - "flags": [ "WHEEL", "STABLE", "TOOL_WRENCH", "STEERABLE", "FOLDABLE" ], + "requirements": { + "install": { "skills": [ [ "mechanics", 0 ] ], "time": "15 m", "qualities": [ { "id": "WRENCH", "level": 2 } ] }, + "removal": { "skills": [ [ "mechanics", 0 ] ], "time": "15 m", "qualities": [ { "id": "WRENCH", "level": 2 } ] }, + "repair": { "skills": [ [ "mechanics", 2 ] ], "time": "15 m", "using": [ [ "adhesive", 1 ], [ "plastics", 1 ] ] } + }, + "flags": [ "WHEEL", "NEEDS_JACKING", "STABLE", "STEERABLE", "FOLDABLE", "NEEDS_WHEEL_MOUNT_LIGHT" ], "damage_reduction": { "bash": 10 } }, { @@ -178,7 +255,6 @@ "symbol": "|", "broken_symbol": "x", "color": "dark_gray", - "difficulty": 1, "durability": 40, "description": "A thin bicycle wheel.", "damage_modifier": 50, @@ -191,32 +267,23 @@ "rolling_resistance": 0.45, "wheel_type": "standard", "contact_area": 40, - "flags": [ "WHEEL", "FOLDABLE", "TOOL_WRENCH" ], + "requirements": { + "install": { "skills": [ [ "mechanics", 0 ] ], "time": "15 m", "qualities": [ { "id": "WRENCH", "level": 2 } ] }, + "removal": { "skills": [ [ "mechanics", 0 ] ], "time": "15 m", "qualities": [ { "id": "WRENCH", "level": 2 } ] }, + "repair": { "skills": [ [ "mechanics", 2 ] ], "time": "15 m", "using": [ [ "adhesive", 1 ], [ "plastics", 1 ] ] } + }, + "flags": [ "WHEEL", "NEEDS_JACKING", "FOLDABLE", "NEEDS_WHEEL_MOUNT_LIGHT" ], "damage_reduction": { "bash": 6 } }, - { - "id": "wheel_bicycle_steerable", - "copy-from": "wheel_bicycle", - "type": "vehicle_part", - "name": "bicycle wheel (steerable)", - "extend": { "flags": [ "STEERABLE" ] } - }, { "id": "wheel_bicycle_or", "copy-from": "wheel_bicycle", "type": "vehicle_part", "name": "off-road bicycle wheel", "item": "wheel_bicycle_or", - "wheel_area": 36, + "contact_area": 36, "wheel_type": "off-road" }, - { - "id": "wheel_bicycle_or_steerable", - "copy-from": "wheel_bicycle_or", - "type": "vehicle_part", - "name": "off-road bicycle wheel (steerable)", - "extend": { "flags": [ "STEERABLE" ] } - }, { "id": "wheel_caster", "type": "vehicle_part", @@ -239,7 +306,7 @@ "rolling_resistance": 29, "wheel_type": "rigid", "contact_area": 4, - "flags": [ "WHEEL", "STABLE", "FOLDABLE", "TOOL_WRENCH", "STEERABLE" ] + "flags": [ "WHEEL", "NEEDS_JACKING", "STABLE", "FOLDABLE", "TOOL_WRENCH", "STEERABLE" ] }, { "id": "wheel_motorbike", @@ -250,7 +317,6 @@ "symbol": "o", "broken_symbol": "x", "color": "dark_gray", - "difficulty": 2, "durability": 90, "description": "A small wheel from a motorcycle.", "damage_modifier": 50, @@ -262,16 +328,14 @@ "rolling_resistance": 1.9, "wheel_type": "standard", "contact_area": 66, - "flags": [ "WHEEL" ], + "requirements": { + "install": { "skills": [ [ "mechanics", 0 ] ], "time": "15 m", "qualities": [ { "id": "WRENCH", "level": 2 } ] }, + "removal": { "skills": [ [ "mechanics", 0 ] ], "time": "15 m", "qualities": [ { "id": "WRENCH", "level": 2 } ] }, + "repair": { "skills": [ [ "mechanics", 2 ] ], "time": "15 m", "using": [ [ "adhesive", 1 ], [ "plastics", 1 ] ] } + }, + "flags": [ "WHEEL", "NEEDS_JACKING", "NEEDS_WHEEL_MOUNT_LIGHT" ], "damage_reduction": { "bash": 10 } }, - { - "id": "wheel_motorbike_steerable", - "copy-from": "wheel_motorbike", - "type": "vehicle_part", - "name": "motorbike wheel (steerable)", - "extend": { "flags": [ "STEERABLE" ] } - }, { "id": "wheel_motorbike_or", "copy-from": "wheel_motorbike", @@ -282,13 +346,6 @@ "wheel_type": "off-road", "damage_reduction": { "bash": 10, "cut": 8, "stab": 4 } }, - { - "id": "wheel_motorbike_or_steerable", - "copy-from": "wheel_motorbike_or", - "type": "vehicle_part", - "name": "off-road motorbike wheel (steerable)", - "extend": { "flags": [ "STEERABLE" ] } - }, { "id": "wheel_small", "type": "vehicle_part", @@ -298,7 +355,6 @@ "symbol": "o", "broken_symbol": "x", "color": "dark_gray", - "difficulty": 2, "durability": 70, "description": "A small wheel.", "damage_modifier": 50, @@ -307,14 +363,12 @@ "rolling_resistance": 1.5, "wheel_type": "racing", "contact_area": 30, - "flags": [ "WHEEL", "NO_JACK", "FOLDABLE" ] - }, - { - "id": "wheel_small_steerable", - "copy-from": "wheel_small", - "type": "vehicle_part", - "name": "small wheel (steerable)", - "extend": { "flags": [ "STEERABLE" ] } + "requirements": { + "install": { "skills": [ [ "mechanics", 0 ] ], "time": "15 m", "qualities": [ { "id": "WRENCH", "level": 2 } ] }, + "removal": { "skills": [ [ "mechanics", 0 ] ], "time": "15 m", "qualities": [ { "id": "WRENCH", "level": 2 } ] }, + "repair": { "skills": [ [ "mechanics", 2 ] ], "time": "15 m", "using": [ [ "adhesive", 1 ], [ "plastics", 1 ] ] } + }, + "flags": [ "WHEEL", "FOLDABLE", "NEEDS_WHEEL_MOUNT_LIGHT" ] }, { "id": "wheel_tricycle", @@ -325,20 +379,19 @@ "symbol": "|", "broken_symbol": "x", "color": "dark_gray", - "difficulty": 0, "durability": 30, "description": "A set of three plastic wheels, with a larger one in the front, mounted with bolts.", "damage_modifier": 50, "breaks_into": [ { "item": "plastic_chunk", "count": [ 1, 3 ] } ], "requirements": { - "install": { "time": 30000, "qualities": [ { "id": "WRENCH", "level": 1 } ] }, - "removal": { "time": 15000, "qualities": [ { "id": "WRENCH", "level": 1 } ] }, - "repair": { "skills": [ [ "mechanics", 1 ] ], "time": 5000, "using": [ [ "adhesive", 1 ] ] } + "install": { "skills": [ [ "mechanics", 0 ] ], "time": "4 m", "qualities": [ { "id": "WRENCH", "level": 1 } ] }, + "removal": { "skills": [ [ "mechanics", 0 ] ], "time": "2 m", "qualities": [ { "id": "WRENCH", "level": 1 } ] }, + "repair": { "skills": [ [ "mechanics", 1 ] ], "time": "15 m", "using": [ [ "adhesive", 1 ] ] } }, "rolling_resistance": 10, "wheel_type": "standard", "contact_area": 10, - "flags": [ "STABLE", "STEERABLE", "TOOL_WRENCH", "WHEEL" ], + "flags": [ "STABLE", "STEERABLE", "WHEEL", "NEEDS_JACKING" ], "damage_reduction": { "bash": 8 } }, { @@ -350,7 +403,6 @@ "symbol": "|", "broken_symbol": "x", "color": "dark_gray", - "difficulty": 2, "durability": 40, "description": "A small wheel.", "damage_modifier": 50, @@ -363,7 +415,12 @@ "rolling_resistance": 0.45, "wheel_type": "standard", "contact_area": 20, - "flags": [ "WHEEL", "STABLE", "FOLDABLE", "TOOL_WRENCH", "STEERABLE" ], + "requirements": { + "install": { "skills": [ [ "mechanics", 0 ] ], "time": "15 m", "qualities": [ { "id": "WRENCH", "level": 2 } ] }, + "removal": { "skills": [ [ "mechanics", 0 ] ], "time": "15 m", "qualities": [ { "id": "WRENCH", "level": 2 } ] }, + "repair": { "skills": [ [ "mechanics", 2 ] ], "time": "15 m", "using": [ [ "adhesive", 1 ], [ "plastics", 1 ] ] } + }, + "flags": [ "WHEEL", "NEEDS_JACKING", "STABLE", "FOLDABLE", "STEERABLE", "NEEDS_WHEEL_MOUNT_LIGHT" ], "damage_reduction": { "bash": 8 } }, { @@ -375,7 +432,6 @@ "symbol": "|", "broken_symbol": "x", "color": "dark_gray", - "difficulty": 2, "durability": 40, "description": "A pair of wheelchair wheels.", "damage_modifier": 50, @@ -388,7 +444,12 @@ "rolling_resistance": 1.95, "wheel_type": "racing", "contact_area": 40, - "flags": [ "WHEEL", "STABLE", "FOLDABLE", "TOOL_WRENCH", "STEERABLE" ], + "requirements": { + "install": { "skills": [ [ "mechanics", 0 ] ], "time": "15 m", "qualities": [ { "id": "WRENCH", "level": 2 } ] }, + "removal": { "skills": [ [ "mechanics", 0 ] ], "time": "15 m", "qualities": [ { "id": "WRENCH", "level": 2 } ] }, + "repair": { "skills": [ [ "mechanics", 2 ] ], "time": "15 m", "using": [ [ "adhesive", 1 ], [ "plastics", 1 ] ] } + }, + "flags": [ "WHEEL", "NEEDS_JACKING", "STABLE", "FOLDABLE", "STEERABLE", "NEEDS_WHEEL_MOUNT_LIGHT" ], "damage_reduction": { "bash": 6 } }, { @@ -400,7 +461,6 @@ "symbol": "O", "broken_symbol": "x", "color": "dark_gray", - "difficulty": 4, "durability": 400, "description": "A wide wheel that provides more traction and better off-road performance.", "damage_modifier": 50, @@ -412,16 +472,14 @@ "rolling_resistance": 0.575, "wheel_type": "standard", "contact_area": 360, - "flags": [ "WHEEL" ], + "requirements": { + "install": { "skills": [ [ "mechanics", 0 ] ], "time": "15 m", "qualities": [ { "id": "WRENCH", "level": 2 } ] }, + "removal": { "skills": [ [ "mechanics", 0 ] ], "time": "15 m", "qualities": [ { "id": "WRENCH", "level": 2 } ] }, + "repair": { "skills": [ [ "mechanics", 4 ] ], "time": "15 m", "using": [ [ "adhesive", 1 ], [ "plastics", 1 ] ] } + }, + "flags": [ "WHEEL", "NEEDS_JACKING", "NEEDS_WHEEL_MOUNT_MEDIUM" ], "damage_reduction": { "bash": 25 } }, - { - "id": "wheel_wide_steerable", - "copy-from": "wheel_wide", - "type": "vehicle_part", - "name": "wide wheel (steerable)", - "extend": { "flags": [ "STEERABLE" ] } - }, { "id": "wheel_wide_or", "copy-from": "wheel_wide", @@ -432,13 +490,6 @@ "contact_area": 320, "damage_reduction": { "bash": 20, "cut": 15, "stab": 10 } }, - { - "id": "wheel_wide_or_steerable", - "copy-from": "wheel_wide_or", - "type": "vehicle_part", - "name": "off-road wide wheel (steerable)", - "extend": { "flags": [ "STEERABLE" ] } - }, { "id": "wheel_wood", "type": "vehicle_part", @@ -454,14 +505,14 @@ "damage_modifier": 50, "breaks_into": [ { "item": "2x4", "count": [ 0, 4 ] }, { "item": "nail", "charges": [ 5, 15 ] } ], "requirements": { - "install": { "skills": [ [ "mechanics", 2 ] ], "time": 30000, "using": "vehicle_bolt" }, - "removal": { "skills": [ [ "mechanics", 2 ] ], "using": "vehicle_bolt" }, + "install": { "skills": [ [ "mechanics", 1 ] ], "time": "5 m", "qualities": [ { "id": "WRENCH", "level": 2 } ] }, + "removal": { "skills": [ [ "mechanics", 1 ] ], "time": "5 m", "qualities": [ { "id": "WRENCH", "level": 2 } ] }, "repair": { "skills": [ [ "mechanics", 2 ] ], "time": 5000, "using": [ [ "adhesive", 1 ] ] } }, "rolling_resistance": 2.15, "wheel_type": "rigid", "contact_area": 60, - "flags": [ "WHEEL" ], + "flags": [ "WHEEL", "NEEDS_JACKING" ], "damage_reduction": { "all": 14 } }, { diff --git a/data/json/vehicles/bikes.json b/data/json/vehicles/bikes.json index 574fa12a6ff41..95b41a92ecfeb 100644 --- a/data/json/vehicles/bikes.json +++ b/data/json/vehicles/bikes.json @@ -6,8 +6,8 @@ "blueprint": [ "o#o" ], "parts": [ { "x": 0, "y": 0, "parts": [ "xlframe_vertical_2", "saddle", "horn_bicycle", "foot_pedals" ] }, - { "x": 1, "y": 0, "parts": [ "xlframe_vertical", "wheel_bicycle_steerable" ] }, - { "x": -1, "y": 0, "parts": [ "xlframe_vertical", "wheel_bicycle", "basketsm" ] } + { "x": 1, "y": 0, "parts": [ "xlframe_vertical", "wheel_mount_light_steerable", "wheel_bicycle" ] }, + { "x": -1, "y": 0, "parts": [ "xlframe_vertical", "wheel_mount_light", "wheel_bicycle", "basketsm" ] } ] }, { @@ -17,8 +17,8 @@ "blueprint": [ "o#o" ], "parts": [ { "x": 0, "y": 0, "parts": [ "xlframe_vertical_2", "saddle", "horn_bicycle", "foot_pedals" ] }, - { "x": 1, "y": 0, "parts": [ "xlframe_vertical", "wheel_bicycle_or_steerable" ] }, - { "x": -1, "y": 0, "parts": [ "xlframe_vertical", "wheel_bicycle_or" ] } + { "x": 1, "y": 0, "parts": [ "xlframe_vertical", "wheel_mount_light_steerable", "wheel_bicycle_or" ] }, + { "x": -1, "y": 0, "parts": [ "xlframe_vertical", "wheel_mount_light", "wheel_bicycle_or" ] } ] }, { @@ -28,8 +28,8 @@ "blueprint": [ "o#o" ], "parts": [ { "x": 0, "y": 0, "parts": [ "xlframe_vertical_2", "saddle", "horn_bicycle", "foot_pedals" ] }, - { "x": 1, "y": 0, "parts": [ "xlframe_vertical", "wheel_bicycle_steerable", "headlight" ] }, - { "x": -1, "y": 0, "parts": [ "xlframe_vertical", "wheel_bicycle", "basketsm" ] }, + { "x": 1, "y": 0, "parts": [ "xlframe_vertical", "wheel_mount_light_steerable", "wheel_bicycle", "headlight" ] }, + { "x": -1, "y": 0, "parts": [ "xlframe_vertical", "wheel_mount_light", "wheel_bicycle", "basketsm" ] }, { "x": 0, "y": 0, "parts": [ "controls", "controls_electronic", "alternator_bicycle" ] }, { "x": -1, "y": 0, "parts": [ "small_storage_battery", "engine_electric_tiny" ] } ] @@ -40,7 +40,7 @@ "name": "Motocross Bike", "blueprint": [ "o#o" ], "parts": [ - { "x": 1, "y": 0, "parts": [ "frame_vertical_2", "wheel_motorbike_or_steerable" ] }, + { "x": 1, "y": 0, "parts": [ "frame_vertical_2", "wheel_mount_light_steerable", "wheel_motorbike_or" ] }, { "x": 0, "y": 0, @@ -54,7 +54,7 @@ "alternator_motorbike" ] }, - { "x": -1, "y": 0, "parts": [ "xlframe_vertical", "muffler", "wheel_motorbike_or" ] } + { "x": -1, "y": 0, "parts": [ "xlframe_vertical", "muffler", "wheel_mount_light", "wheel_motorbike_or" ] } ] }, { @@ -63,7 +63,11 @@ "name": "Street-Legal Dirt Bike", "blueprint": [ "o#o" ], "parts": [ - { "x": 1, "y": 0, "parts": [ "frame_vertical_2", "motorcycle_headlight", "wheel_motorbike_or_steerable" ] }, + { + "x": 1, + "y": 0, + "parts": [ "frame_vertical_2", "motorcycle_headlight", "wheel_mount_light_steerable", "wheel_motorbike_or" ] + }, { "x": 0, "y": 0, @@ -79,7 +83,7 @@ "alternator_motorbike" ] }, - { "x": -1, "y": 0, "parts": [ "frame_handle", "muffler", "wheel_motorbike_or" ] } + { "x": -1, "y": 0, "parts": [ "frame_handle", "muffler", "wheel_mount_light", "wheel_motorbike_or" ] } ] }, { @@ -90,8 +94,8 @@ "parts": [ { "x": 0, "y": 0, "parts": [ "frame_vertical_2", "saddle", "motorcycle_kickstand" ] }, { "x": 1, "y": 0, "parts": [ "frame_handle", { "part": "tank_small", "fuel": "gasoline" } ] }, - { "x": -1, "y": 0, "parts": [ "frame_vertical", "wheel_motorbike" ] }, - { "x": 2, "y": 0, "parts": [ "frame_vertical", "wheel_motorbike_steerable" ] }, + { "x": -1, "y": 0, "parts": [ "frame_vertical", "wheel_mount_light", "wheel_motorbike" ] }, + { "x": 2, "y": 0, "parts": [ "frame_vertical", "wheel_mount_light_steerable", "wheel_motorbike" ] }, { "x": 0, "y": 0, "parts": [ "controls", "controls_electronic", "vehicle_alarm" ] }, { "x": 0, "y": 0, "parts": [ "horn_car", "engine_vtwin", "alternator_motorbike" ] }, { "x": 1, "y": 0, "parts": [ "headlight", "battery_motorbike" ] }, @@ -106,7 +110,7 @@ "parts": [ { "x": 0, "y": 0, "parts": [ "frame_vertical_2", "saddle" ] }, { "x": 1, "y": 0, "parts": [ "frame_handle", { "part": "tank_small", "fuel": "gasoline" } ] }, - { "x": -1, "y": 0, "parts": [ "frame_vertical", "wheel_motorbike" ] } + { "x": -1, "y": 0, "parts": [ "frame_vertical", "wheel_mount_light", "wheel_motorbike" ] } ] }, { @@ -120,13 +124,13 @@ "parts": [ { "x": 0, "y": 0, "parts": [ "frame_vertical_2", "saddle" ] }, { "x": 1, "y": 0, "parts": [ "frame_handle", { "part": "tank_small", "fuel": "gasoline" } ] }, - { "x": -1, "y": 0, "parts": [ "frame_vertical", "wheel_motorbike" ] }, - { "x": 2, "y": 0, "parts": [ "frame_vertical", "wheel_motorbike_steerable" ] }, + { "x": -1, "y": 0, "parts": [ "frame_vertical", "wheel_mount_light", "wheel_motorbike" ] }, + { "x": 2, "y": 0, "parts": [ "frame_vertical", "wheel_mount_light_steerable", "wheel_motorbike" ] }, { "x": 0, "y": 0, "parts": [ "controls", "controls_electronic", "vehicle_alarm" ] }, { "x": 0, "y": 0, "parts": [ "horn_car", "engine_vtwin", "alternator_motorbike" ] }, { "x": 1, "y": 0, "parts": [ "headlight", "battery_motorbike" ] }, { "x": -1, "y": 0, "parts": [ "muffler", "box" ] }, - { "x": 0, "y": 1, "parts": [ "frame_cross", "wheel_motorbike", "seat" ] }, + { "x": 0, "y": 1, "parts": [ "frame_cross", "wheel_mount_light", "wheel_motorbike", "seat" ] }, { "x": 1, "y": 1, "parts": [ "frame_handle", "box" ] } ], "items": [ @@ -149,10 +153,10 @@ { "x": 1, "y": 0, "parts": [ "frame_cover", "engine_vtwin", "alternator_motorbike", "battery_motorbike" ] }, { "x": 1, "y": 0, "parts": [ "headlight", { "part": "tank_small", "fuel": "gasoline" }, "plating_steel" ] }, { "x": -1, "y": 0, "parts": [ "frame_horizontal", "muffler", "trunk" ] }, - { "x": 1, "y": 1, "parts": [ "frame_horizontal", "wheel_motorbike_or_steerable" ] }, - { "x": 1, "y": -1, "parts": [ "frame_horizontal", "wheel_motorbike_or_steerable" ] }, - { "x": -1, "y": -1, "parts": [ "frame_horizontal", "wheel_motorbike_or" ] }, - { "x": -1, "y": 1, "parts": [ "frame_horizontal", "wheel_motorbike_or" ] } + { "x": 1, "y": 1, "parts": [ "frame_horizontal", "wheel_mount_light_steerable", "wheel_motorbike_or" ] }, + { "x": 1, "y": -1, "parts": [ "frame_horizontal", "wheel_mount_light_steerable", "wheel_motorbike_or" ] }, + { "x": -1, "y": -1, "parts": [ "frame_horizontal", "wheel_mount_light", "wheel_motorbike_or" ] }, + { "x": -1, "y": 1, "parts": [ "frame_horizontal", "wheel_mount_light", "wheel_motorbike_or" ] } ], "items": [ { "x": -1, "y": 0, "chance": 10, "items": [ "helmet_motor" ] } ] }, @@ -169,9 +173,9 @@ { "x": 0, "y": 0, "parts": [ "frame_vertical_2", "saddle" ] }, { "x": 1, "y": 0, "part": "frame_cover" }, { "x": -1, "y": 0, "part": "frame_horizontal" }, - { "x": 1, "y": -1, "parts": [ "frame_horizontal", "wheel_motorbike_or_steerable" ] }, - { "x": -1, "y": -1, "parts": [ "frame_horizontal", "wheel_motorbike_or" ] }, - { "x": -1, "y": 1, "parts": [ "frame_horizontal", "wheel_motorbike_or" ] } + { "x": 1, "y": -1, "parts": [ "frame_horizontal", "wheel_mount_light_steerable", "wheel_motorbike_or" ] }, + { "x": -1, "y": -1, "parts": [ "frame_horizontal", "wheel_mount_light", "wheel_motorbike_or" ] }, + { "x": -1, "y": 1, "parts": [ "frame_horizontal", "wheel_mount_light", "wheel_motorbike_or" ] } ] }, { @@ -183,8 +187,8 @@ { "x": 0, "y": 0, "parts": [ "frame_handle", "headlight", "saddle", "controls", "controls_electronic" ] }, { "x": 0, "y": 0, "parts": [ "horn_car", "motorcycle_kickstand", "engine_1cyl", "alternator_motorbike" ] }, { "x": 0, "y": 0, "parts": [ "battery_motorbike", { "part": "tank_small", "fuel": "gasoline" } ] }, - { "x": 1, "y": 0, "parts": [ "xlframe_vertical", "wheel_small_steerable" ] }, - { "x": -1, "y": 0, "parts": [ "xlframe_vertical", "wheel_small" ] }, + { "x": 1, "y": 0, "parts": [ "xlframe_vertical", "wheel_mount_light_steerable", "wheel_small" ] }, + { "x": -1, "y": 0, "parts": [ "xlframe_vertical", "wheel_mount_light", "wheel_small" ] }, { "x": -1, "y": 0, "part": "muffler" } ] }, @@ -197,8 +201,8 @@ { "x": 0, "y": 0, "parts": [ "frame_handle", "headlight", "saddle", "controls" ] }, { "x": 0, "y": 0, "parts": [ "controls_electronic", "horn_car", "motorcycle_kickstand" ] }, { "x": 0, "y": 0, "parts": [ "medium_storage_battery", "engine_electric_small" ] }, - { "x": 1, "y": 0, "parts": [ "xlframe_vertical", "wheel_small_steerable" ] }, - { "x": -1, "y": 0, "parts": [ "xlframe_vertical", "wheel_small" ] } + { "x": 1, "y": 0, "parts": [ "xlframe_vertical", "wheel_mount_light_steerable", "wheel_small" ] }, + { "x": -1, "y": 0, "parts": [ "xlframe_vertical", "wheel_mount_light", "wheel_small" ] } ] }, { @@ -209,8 +213,8 @@ "parts": [ { "x": 0, "y": 0, "parts": [ "frame_vertical_2", "saddle", "motorcycle_kickstand" ] }, { "x": 1, "y": 0, "parts": [ "frame_handle", { "part": "tank_small", "fuel": "gasoline" } ] }, - { "x": -1, "y": 0, "parts": [ "frame_vertical", "wheel_motorbike" ] }, - { "x": 2, "y": 0, "parts": [ "frame_vertical", "wheel_motorbike_steerable" ] }, + { "x": -1, "y": 0, "parts": [ "frame_vertical", "wheel_mount_light", "wheel_motorbike" ] }, + { "x": 2, "y": 0, "parts": [ "frame_vertical", "wheel_mount_light_steerable", "wheel_motorbike" ] }, { "x": 0, "y": 0, "parts": [ "controls", "controls_electronic", "vehicle_alarm" ] }, { "x": 0, "y": 0, "parts": [ "horn_car", "engine_inline4", "alternator_motorbike" ] }, { "x": 1, "y": 0, "parts": [ "headlight", "battery_car" ] }, @@ -224,9 +228,9 @@ "blueprint": [ "o##o" ], "parts": [ { "x": 0, "y": 0, "parts": [ "xlframe_vertical_2", "saddle", "horn_bicycle", "foot_pedals" ] }, - { "x": 1, "y": 0, "parts": [ "xlframe_vertical", "wheel_bicycle_steerable" ] }, + { "x": 1, "y": 0, "parts": [ "xlframe_vertical", "wheel_mount_light_steerable", "wheel_bicycle" ] }, { "x": -1, "y": 0, "parts": [ "xlframe_vertical_2", "saddle" ] }, - { "x": -2, "y": 0, "parts": [ "xlframe_vertical", "wheel_bicycle", "basketsm" ] } + { "x": -2, "y": 0, "parts": [ "xlframe_vertical", "wheel_mount_light", "wheel_bicycle", "basketsm" ] } ] }, { @@ -241,6 +245,6 @@ "type": "vehicle", "name": "Unicycle", "blueprint": [ "#" ], - "parts": [ { "x": 0, "y": 0, "parts": [ "frame_handle", "saddle", "foot_pedals", "wheel_unicycle" ] } ] + "parts": [ { "x": 0, "y": 0, "parts": [ "frame_handle", "saddle", "foot_pedals", "wheel_mount_light", "wheel_unicycle" ] } ] } ] diff --git a/data/json/vehicles/boats.json b/data/json/vehicles/boats.json index d68a256184b5c..beefc6defc544 100644 --- a/data/json/vehicles/boats.json +++ b/data/json/vehicles/boats.json @@ -21,11 +21,11 @@ { "x": 0, "y": 2, "parts": [ "frame_cross", "seat", "seatbelt", "roof", "metal_boat_hull" ] }, { "x": 0, "y": 3, "parts": [ "frame_vertical", "door", "metal_boat_hull" ] }, { "x": 0, "y": -1, "parts": [ "frame_vertical", "door", "metal_boat_hull" ] }, - { "x": 1, "y": -1, "parts": [ "frame_vertical", "windshield", "wheel_wide_steerable" ] }, + { "x": 1, "y": -1, "parts": [ "frame_vertical", "windshield", "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": 1, "y": 0, "parts": [ "frame_cross", "windshield", "metal_boat_hull" ] }, { "x": 1, "y": 1, "parts": [ "frame_cross", "windshield", "metal_boat_hull" ] }, { "x": 1, "y": 2, "parts": [ "frame_cross", "windshield", "metal_boat_hull" ] }, - { "x": 1, "y": 3, "parts": [ "frame_vertical", "windshield", "wheel_wide_steerable" ] }, + { "x": 1, "y": 3, "parts": [ "frame_vertical", "windshield", "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": 2, "y": -1, "parts": [ "frame_nw", "halfboard_nw", "metal_boat_hull" ] }, { "x": 2, "y": 0, "parts": [ "frame_horizontal", "halfboard_horizontal", "headlight", "metal_boat_hull" ] }, { "x": 2, "y": 1, "parts": [ "frame_horizontal", "halfboard_horizontal", "metal_boat_hull" ] }, @@ -44,16 +44,16 @@ { "x": -2, "y": 1, "parts": [ "frame_cross", "cargo_space", "metal_boat_hull" ] }, { "x": -2, "y": 2, "parts": [ "frame_cross", "cargo_space", "metal_boat_hull" ] }, { "x": -2, "y": 3, "parts": [ "frame_vertical", "halfboard_vertical", "metal_boat_hull" ] }, - { "x": -3, "y": -1, "parts": [ "frame_vertical", "halfboard_vertical", "wheel_wide" ] }, + { "x": -3, "y": -1, "parts": [ "frame_vertical", "halfboard_vertical", "wheel_mount_medium", "wheel_wide" ] }, { "x": -3, "y": 0, "parts": [ "frame_cross", "cargo_space", "metal_boat_hull" ] }, { "x": -3, "y": 1, "parts": [ "frame_cross", "cargo_space", "metal_boat_hull" ] }, { "x": -3, "y": 2, "parts": [ "frame_cross", "cargo_space", "metal_boat_hull" ] }, - { "x": -3, "y": 3, "parts": [ "frame_vertical", "halfboard_vertical", "wheel_wide" ] }, - { "x": -4, "y": -1, "parts": [ "frame_vertical", "halfboard_vertical", "wheel_wide" ] }, + { "x": -3, "y": 3, "parts": [ "frame_vertical", "halfboard_vertical", "wheel_mount_medium", "wheel_wide" ] }, + { "x": -4, "y": -1, "parts": [ "frame_vertical", "halfboard_vertical", "wheel_mount_medium", "wheel_wide" ] }, { "x": -4, "y": 0, "parts": [ "frame_cross", "cargo_space", "metal_boat_hull" ] }, { "x": -4, "y": 1, "parts": [ "frame_cross", "cargo_space", "metal_boat_hull" ] }, { "x": -4, "y": 2, "parts": [ "frame_cross", "cargo_space", "metal_boat_hull" ] }, - { "x": -4, "y": 3, "parts": [ "frame_vertical", "halfboard_vertical", "wheel_wide" ] }, + { "x": -4, "y": 3, "parts": [ "frame_vertical", "halfboard_vertical", "wheel_mount_medium", "wheel_wide" ] }, { "x": -5, "y": -1, "parts": [ "frame_sw", "halfboard_sw", "metal_boat_hull" ] }, { "x": -5, "y": 0, "parts": [ "frame_cross", "cargo_space", "metal_boat_hull" ] }, { "x": -5, "y": 1, "parts": [ "frame_cross", "cargo_space", "metal_boat_hull" ] }, diff --git a/data/json/vehicles/cars.json b/data/json/vehicles/cars.json index 29e8c4ac1f6e3..731fc1fb1d9d8 100644 --- a/data/json/vehicles/cars.json +++ b/data/json/vehicles/cars.json @@ -21,11 +21,19 @@ { "x": 1, "y": 0, "parts": [ "frame_horizontal", "windshield" ] }, { "x": 1, "y": 1, "parts": [ "frame_horizontal", "windshield" ] }, { "x": 1, "y": 2, "parts": [ "frame_horizontal", "windshield" ] }, - { "x": 2, "y": -1, "parts": [ "frame_nw", "halfboard_nw", "wheel_wide_or_steerable", "headlight" ] }, + { + "x": 2, + "y": -1, + "parts": [ "frame_nw", "halfboard_nw", "wheel_mount_medium_steerable", "wheel_wide_or", "headlight" ] + }, { "x": 2, "y": 0, "parts": [ "frame_horizontal", "halfboard_horizontal" ] }, { "x": 2, "y": 0, "parts": [ "engine_v6", "alternator_car", "battery_car" ] }, { "x": 2, "y": 1, "parts": [ "frame_horizontal", "halfboard_horizontal" ] }, - { "x": 2, "y": 2, "parts": [ "frame_ne", "halfboard_ne", "wheel_wide_or_steerable", "headlight" ] }, + { + "x": 2, + "y": 2, + "parts": [ "frame_ne", "halfboard_ne", "wheel_mount_medium_steerable", "wheel_wide_or", "headlight" ] + }, { "x": 3, "y": -1, "part": "hdframe_horizontal_2" }, { "x": 3, "y": 0, "part": "hdframe_horizontal" }, { "x": 3, "y": 1, "part": "hdframe_horizontal" }, @@ -35,11 +43,11 @@ { "x": -1, "y": 1, "parts": [ "frame_vertical", "trunk", "roof" ] }, { "x": -1, "y": 2, "parts": [ "frame_vertical", "halfboard_vertical" ] }, { "x": -2, "y": -1, "parts": [ "frame_vertical", "halfboard_vertical" ] }, - { "x": -2, "y": -1, "part": "wheel_wide_or" }, + { "x": -2, "y": -1, "parts": [ "wheel_mount_medium", "wheel_wide_or" ] }, { "x": -2, "y": 0, "parts": [ "frame_vertical", "trunk", "tank", "roof" ] }, { "x": -2, "y": 1, "parts": [ "frame_vertical", "trunk", "roof" ] }, { "x": -2, "y": 2, "parts": [ "frame_vertical", "halfboard_vertical" ] }, - { "x": -2, "y": 2, "part": "wheel_wide_or" }, + { "x": -2, "y": 2, "parts": [ "wheel_mount_medium", "wheel_wide_or" ] }, { "x": -3, "y": -1, "parts": [ "frame_horizontal", "halfboard_sw" ] }, { "x": -3, "y": 0, "parts": [ "frame_horizontal", "door_trunk", "roof" ] }, { "x": -3, "y": 1, "parts": [ "frame_horizontal", "door_trunk", "roof", "muffler" ] }, @@ -104,10 +112,10 @@ { "x": -1, "y": 1, "part": "halfboard_nw" }, { "x": -1, "y": -1, "part": "frame_horizontal" }, { "x": -1, "y": -1, "part": "halfboard_sw" }, - { "x": -1, "y": -1, "part": "wheel" }, + { "x": -1, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -1, "y": 2, "part": "frame_horizontal" }, { "x": -1, "y": 2, "part": "halfboard_se" }, - { "x": -1, "y": 2, "part": "wheel" }, + { "x": -1, "y": 2, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": 2, "y": 0, "part": "frame_vertical_2" }, { "x": 2, "y": 0, "part": "trunk" }, { "x": 2, "y": 1, "part": "frame_vertical_2" }, @@ -116,11 +124,11 @@ { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, { "x": 2, "y": -1, "part": "headlight" }, - { "x": 2, "y": -1, "part": "wheel_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": 2, "part": "frame_ne" }, { "x": 2, "y": 2, "part": "halfboard_ne" }, { "x": 2, "y": 2, "part": "headlight" }, - { "x": 2, "y": 2, "part": "wheel_steerable" } + { "x": 2, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] } ], "items": [ { "x": 0, "y": 0, "chance": 8, "item_groups": [ "car_misc" ] }, @@ -171,10 +179,10 @@ { "x": 0, "y": 0, "part": "horn_car" }, { "x": -1, "y": 0, "part": "headlight" }, { "x": 0, "y": 1, "part": "xlframe_cross" }, - { "x": 0, "y": 1, "part": "wheel_steerable" }, + { "x": 0, "y": 1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 0, "y": 1, "part": "windshield" }, { "x": 0, "y": -1, "part": "xlframe_cross" }, - { "x": 0, "y": -1, "part": "wheel_steerable" }, + { "x": 0, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 0, "y": -1, "part": "windshield" }, { "x": 0, "y": 2, "part": "xlframe_ne" }, { "x": 0, "y": 2, "part": "windshield" }, @@ -185,10 +193,10 @@ { "x": -2, "y": 0, "part": "trunk" }, { "x": -2, "y": 0, "part": "roof" }, { "x": -2, "y": 1, "part": "xlframe_cross" }, - { "x": -2, "y": 1, "part": "wheel_steerable" }, + { "x": -2, "y": 1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": -2, "y": 1, "part": "windshield" }, { "x": -2, "y": -1, "part": "xlframe_cross" }, - { "x": -2, "y": -1, "part": "wheel_steerable" }, + { "x": -2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": -2, "y": -1, "part": "windshield" }, { "x": -2, "y": 2, "part": "xlframe_sw" }, { "x": -2, "y": 2, "part": "door" }, @@ -270,11 +278,11 @@ { "x": 2, "y": 1, "part": "halfboard_horizontal" }, { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, - { "x": 2, "y": -1, "part": "wheel_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": -1, "part": "headlight" }, { "x": 2, "y": 2, "part": "frame_ne" }, { "x": 2, "y": 2, "part": "halfboard_ne" }, - { "x": 2, "y": 2, "part": "wheel_steerable" }, + { "x": 2, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": 2, "part": "headlight" }, { "x": -2, "y": 0, "part": "frame_vertical" }, { "x": -2, "y": 0, "part": "trunk" }, @@ -290,14 +298,14 @@ { "x": -2, "y": 2, "part": "halfboard_vertical" }, { "x": -3, "y": -1, "part": "frame_horizontal" }, { "x": -3, "y": -1, "part": "halfboard_sw" }, - { "x": -3, "y": -1, "part": "wheel" }, + { "x": -3, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -3, "y": 0, "part": "frame_horizontal" }, { "x": -3, "y": 0, "part": "door_trunk" }, { "x": -3, "y": 1, "part": "frame_horizontal" }, { "x": -3, "y": 1, "part": "door_trunk" }, { "x": -3, "y": 2, "part": "frame_horizontal" }, { "x": -3, "y": 2, "part": "halfboard_se" }, - { "x": -3, "y": 2, "part": "wheel" } + { "x": -3, "y": 2, "parts": [ "wheel_mount_medium", "wheel" ] } ], "items": [ { "x": 0, "y": 0, "chance": 14, "item_groups": [ "car_misc" ] }, @@ -367,11 +375,11 @@ { "x": 2, "y": 1, "part": "halfboard_horizontal" }, { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, - { "x": 2, "y": -1, "part": "wheel_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": -1, "part": "headlight" }, { "x": 2, "y": 2, "part": "frame_ne" }, { "x": 2, "y": 2, "part": "halfboard_ne" }, - { "x": 2, "y": 2, "part": "wheel_steerable" }, + { "x": 2, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": 2, "part": "headlight" }, { "x": -2, "y": 0, "part": "frame_vertical" }, { "x": -2, "y": 0, "part": "animal_compartment" }, @@ -387,14 +395,14 @@ { "x": -2, "y": 2, "part": "halfboard_vertical" }, { "x": -3, "y": -1, "part": "frame_horizontal" }, { "x": -3, "y": -1, "part": "halfboard_sw" }, - { "x": -3, "y": -1, "part": "wheel" }, + { "x": -3, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -3, "y": 0, "part": "frame_horizontal" }, { "x": -3, "y": 0, "part": "door_trunk" }, { "x": -3, "y": 1, "part": "frame_horizontal" }, { "x": -3, "y": 1, "part": "door_trunk" }, { "x": -3, "y": 2, "part": "frame_horizontal" }, { "x": -3, "y": 2, "part": "halfboard_se" }, - { "x": -3, "y": 2, "part": "wheel" } + { "x": -3, "y": 2, "parts": [ "wheel_mount_medium", "wheel" ] } ], "items": [ { "x": 0, "y": 0, "chance": 14, "item_groups": [ "car_misc" ] }, @@ -436,10 +444,10 @@ { "x": 2, "y": 1, "part": "halfboard_horizontal" }, { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, - { "x": 2, "y": -1, "part": "wheel_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": 2, "part": "frame_ne" }, { "x": 2, "y": 2, "part": "halfboard_ne" }, - { "x": 2, "y": 2, "part": "wheel_steerable" }, + { "x": 2, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": -2, "y": 0, "part": "frame_vertical" }, { "x": -2, "y": 1, "part": "frame_vertical" }, { "x": -2, "y": -1, "part": "frame_vertical" }, @@ -449,12 +457,12 @@ { "x": -2, "y": 2, "part": "halfboard_vertical" }, { "x": -3, "y": -1, "part": "frame_horizontal" }, { "x": -3, "y": -1, "part": "halfboard_sw" }, - { "x": -3, "y": -1, "part": "wheel" }, + { "x": -3, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -3, "y": 0, "part": "frame_horizontal" }, { "x": -3, "y": 1, "part": "frame_horizontal" }, { "x": -3, "y": 2, "part": "frame_horizontal" }, { "x": -3, "y": 2, "part": "halfboard_se" }, - { "x": -3, "y": 2, "part": "wheel" } + { "x": -3, "y": 2, "parts": [ "wheel_mount_medium", "wheel" ] } ] }, { @@ -502,16 +510,16 @@ { "x": 2, "y": 1, "part": "halfboard_horizontal" }, { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, - { "x": 2, "y": -1, "part": "wheel_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": -1, "part": "headlight" }, { "x": 2, "y": 2, "part": "frame_ne" }, { "x": 2, "y": 2, "part": "halfboard_ne" }, - { "x": 2, "y": 2, "part": "wheel_steerable" }, + { "x": 2, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": 2, "part": "headlight" }, { "x": -1, "y": -1, "part": "frame_horizontal" }, { "x": -1, "y": -1, "part": "tank_small", "fuel": "gasoline" }, { "x": -1, "y": -1, "part": "halfboard_sw" }, - { "x": -1, "y": -1, "part": "wheel" }, + { "x": -1, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -1, "y": 0, "part": "frame_horizontal" }, { "x": -1, "y": 0, "part": "hatch" }, { "x": -1, "y": 0, "part": "muffler" }, @@ -520,7 +528,7 @@ { "x": -1, "y": 2, "part": "frame_horizontal" }, { "x": -1, "y": 2, "part": "tank_small", "fuel": "gasoline" }, { "x": -1, "y": 2, "part": "halfboard_se" }, - { "x": -1, "y": 2, "part": "wheel" } + { "x": -1, "y": 2, "parts": [ "wheel_mount_medium", "wheel" ] } ], "items": [ { "x": 0, "y": 0, "chance": 5, "item_groups": [ "car_misc" ] }, @@ -571,11 +579,11 @@ { "x": 2, "y": 1, "part": "halfboard_horizontal" }, { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, - { "x": 2, "y": -1, "part": "wheel_slick_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel_slick" ] }, { "x": 2, "y": -1, "part": "headlight" }, { "x": 2, "y": 2, "part": "frame_ne" }, { "x": 2, "y": 2, "part": "halfboard_ne" }, - { "x": 2, "y": 2, "part": "wheel_slick_steerable" }, + { "x": 2, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel_slick" ] }, { "x": 2, "y": 2, "part": "headlight" }, { "x": -1, "y": 0, "part": "frame_vertical" }, { "x": -1, "y": 0, "part": "trunk" }, @@ -591,14 +599,14 @@ { "x": -1, "y": 2, "part": "halfboard_vertical" }, { "x": -2, "y": -1, "part": "frame_horizontal" }, { "x": -2, "y": -1, "part": "halfboard_sw" }, - { "x": -2, "y": -1, "part": "wheel_slick" }, + { "x": -2, "y": -1, "parts": [ "wheel_mount_medium", "wheel_slick" ] }, { "x": -2, "y": 0, "part": "frame_horizontal" }, { "x": -2, "y": 0, "part": "door_trunk" }, { "x": -2, "y": 1, "part": "frame_horizontal" }, { "x": -2, "y": 1, "part": "door_trunk" }, { "x": -2, "y": 2, "part": "frame_horizontal" }, { "x": -2, "y": 2, "part": "halfboard_se" }, - { "x": -2, "y": 2, "part": "wheel_slick" } + { "x": -2, "y": 2, "parts": [ "wheel_mount_medium", "wheel_slick" ] } ], "items": [ { "x": 0, "y": 0, "chance": 10, "item_groups": [ "snacks_fancy" ] }, @@ -657,11 +665,11 @@ { "x": 2, "y": 1, "part": "halfboard_horizontal" }, { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, - { "x": 2, "y": -1, "part": "wheel_slick_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel_slick" ] }, { "x": 2, "y": -1, "part": "headlight" }, { "x": 2, "y": 2, "part": "frame_ne" }, { "x": 2, "y": 2, "part": "halfboard_ne" }, - { "x": 2, "y": 2, "part": "wheel_slick_steerable" }, + { "x": 2, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel_slick" ] }, { "x": 2, "y": 2, "part": "headlight" }, { "x": -2, "y": 0, "part": "hdframe_vertical" }, { "x": -2, "y": 0, "part": "minireactor" }, @@ -678,7 +686,7 @@ { "x": -2, "y": 2, "part": "halfboard_vertical" }, { "x": -3, "y": -1, "part": "frame_horizontal" }, { "x": -3, "y": -1, "part": "halfboard_sw" }, - { "x": -3, "y": -1, "part": "wheel_slick" }, + { "x": -3, "y": -1, "parts": [ "wheel_mount_medium", "wheel_slick" ] }, { "x": -3, "y": 0, "part": "hdframe_horizontal" }, { "x": -3, "y": 0, "part": "halfboard_vertical_2" }, { "x": -3, "y": 0, "part": "engine_electric_enhanced" }, @@ -689,7 +697,7 @@ { "x": -3, "y": 1, "part": "plating_steel" }, { "x": -3, "y": 2, "part": "frame_horizontal" }, { "x": -3, "y": 2, "part": "halfboard_se" }, - { "x": -3, "y": 2, "part": "wheel_slick" } + { "x": -3, "y": 2, "parts": [ "wheel_mount_medium", "wheel_slick" ] } ], "items": [ { "x": 0, "y": 0, "chance": 16, "items": [ "coke" ] }, @@ -743,11 +751,11 @@ { "x": 2, "y": 1, "part": "xlhalfboard_horizontal" }, { "x": 2, "y": -1, "part": "xlframe_nw" }, { "x": 2, "y": -1, "part": "xlhalfboard_nw" }, - { "x": 2, "y": -1, "part": "wheel_slick_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel_slick" ] }, { "x": 2, "y": -1, "part": "headlight" }, { "x": 2, "y": 2, "part": "xlframe_ne" }, { "x": 2, "y": 2, "part": "xlhalfboard_ne" }, - { "x": 2, "y": 2, "part": "wheel_slick_steerable" }, + { "x": 2, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel_slick" ] }, { "x": 2, "y": 2, "part": "headlight" }, { "x": -1, "y": 0, "part": "frame_vertical" }, { "x": -1, "y": 0, "part": "storage_battery" }, @@ -763,14 +771,14 @@ { "x": -1, "y": 2, "part": "xlhalfboard_vertical" }, { "x": -2, "y": -1, "part": "xlframe_horizontal" }, { "x": -2, "y": -1, "part": "xlhalfboard_sw" }, - { "x": -2, "y": -1, "part": "wheel_slick" }, + { "x": -2, "y": -1, "parts": [ "wheel_mount_medium", "wheel_slick" ] }, { "x": -2, "y": 0, "part": "xlframe_horizontal" }, { "x": -2, "y": 0, "part": "door_trunk" }, { "x": -2, "y": 1, "part": "xlframe_horizontal" }, { "x": -2, "y": 1, "part": "door_trunk" }, { "x": -2, "y": 2, "part": "xlframe_horizontal" }, { "x": -2, "y": 2, "part": "xlhalfboard_se" }, - { "x": -2, "y": 2, "part": "wheel_slick" } + { "x": -2, "y": 2, "parts": [ "wheel_mount_medium", "wheel_slick" ] } ], "items": [ { "x": -1, "y": 0, "chance": 8, "items": [ "sm_extinguisher" ] } ] }, @@ -797,16 +805,24 @@ { "x": 2, "y": 0, "parts": [ "xlframe_horizontal", "xlhalfboard_horizontal" ] }, { "x": 2, "y": 0, "parts": [ "engine_electric_super", "storage_battery" ] }, { "x": 2, "y": 1, "parts": [ "xlframe_horizontal", "storage_battery", "xlhalfboard_horizontal" ] }, - { "x": 2, "y": -1, "parts": [ "xlframe_nw", "xlhalfboard_nw", "wheel_slick_steerable", "headlight" ] }, - { "x": 2, "y": 2, "parts": [ "xlframe_ne", "xlhalfboard_ne", "wheel_slick_steerable", "headlight" ] }, + { + "x": 2, + "y": -1, + "parts": [ "xlframe_nw", "xlhalfboard_nw", "wheel_mount_medium_steerable", "wheel_slick", "headlight" ] + }, + { + "x": 2, + "y": 2, + "parts": [ "xlframe_ne", "xlhalfboard_ne", "wheel_mount_medium_steerable", "wheel_slick", "headlight" ] + }, { "x": -1, "y": 0, "parts": [ "xlframe_vertical", "storage_battery", "trunk", "roof" ] }, { "x": -1, "y": 1, "parts": [ "xlframe_vertical", "storage_battery", "trunk", "roof" ] }, { "x": -1, "y": -1, "parts": [ "xlframe_vertical", "xlhalfboard_vertical" ] }, { "x": -1, "y": 2, "parts": [ "xlframe_vertical", "xlhalfboard_vertical" ] }, - { "x": -2, "y": -1, "parts": [ "xlframe_horizontal", "xlhalfboard_sw", "wheel_slick" ] }, + { "x": -2, "y": -1, "parts": [ "xlframe_horizontal", "xlhalfboard_sw", "wheel_mount_medium", "wheel_slick" ] }, { "x": -2, "y": 0, "parts": [ "xlframe_horizontal", "door_trunk" ] }, { "x": -2, "y": 1, "parts": [ "xlframe_horizontal", "door_trunk" ] }, - { "x": -2, "y": 2, "parts": [ "xlframe_horizontal", "xlhalfboard_se", "wheel_slick" ] } + { "x": -2, "y": 2, "parts": [ "xlframe_horizontal", "xlhalfboard_se", "wheel_mount_medium", "wheel_slick" ] } ], "items": [ { "x": -1, "y": 0, "chance": 8, "items": [ "sm_extinguisher" ] }, @@ -869,11 +885,11 @@ { "x": 2, "y": -1, "part": "xlframe_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, { "x": 2, "y": -1, "part": "headlight" }, - { "x": 2, "y": -1, "part": "wheel_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": 2, "part": "xlframe_ne" }, { "x": 2, "y": 2, "part": "halfboard_ne" }, { "x": 2, "y": 2, "part": "headlight" }, - { "x": 2, "y": 2, "part": "wheel_steerable" }, + { "x": 2, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": -2, "y": 0, "part": "xlframe_vertical" }, { "x": -2, "y": 0, "part": "trunk" }, { "x": -2, "y": 0, "part": "roof" }, @@ -892,7 +908,7 @@ { "x": -2, "y": 2, "part": "solar_panel" }, { "x": -3, "y": -1, "part": "xlframe_sw" }, { "x": -3, "y": -1, "part": "halfboard_sw" }, - { "x": -3, "y": -1, "part": "wheel" }, + { "x": -3, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -3, "y": -1, "part": "solar_panel" }, { "x": -3, "y": 0, "part": "xlframe_horizontal" }, { "x": -3, "y": 0, "part": "door_trunk" }, @@ -900,7 +916,7 @@ { "x": -3, "y": 1, "part": "door_trunk" }, { "x": -3, "y": 2, "part": "xlframe_se" }, { "x": -3, "y": 2, "part": "halfboard_se" }, - { "x": -3, "y": 2, "part": "wheel" }, + { "x": -3, "y": 2, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -3, "y": 2, "part": "solar_panel" } ] }, @@ -940,10 +956,10 @@ { "x": 0, "y": 0, "part": "horn_car" }, { "x": -1, "y": 0, "part": "headlight" }, { "x": 0, "y": 1, "part": "xlframe_cross" }, - { "x": 0, "y": 1, "part": "wheel_steerable" }, + { "x": 0, "y": 1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 0, "y": 1, "part": "door" }, { "x": 0, "y": -1, "part": "xlframe_cross" }, - { "x": 0, "y": -1, "part": "wheel_steerable" }, + { "x": 0, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 0, "y": -1, "part": "door" }, { "x": 0, "y": 2, "part": "xlframe_ne" }, { "x": 0, "y": -2, "part": "xlframe_nw" }, @@ -984,7 +1000,7 @@ { "x": -4, "y": -1, "part": "solar_panel_v2" }, { "x": -5, "y": 0, "part": "xlframe_horizontal" }, { "x": -5, "y": 0, "part": "solar_panel_v2" }, - { "x": -5, "y": 0, "part": "wheel_steerable" }, + { "x": -5, "y": 0, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": -5, "y": 1, "part": "xlframe_se" }, { "x": -5, "y": 1, "part": "solar_panel_v2" }, { "x": -5, "y": -1, "part": "xlframe_sw" }, @@ -1049,11 +1065,11 @@ { "x": 2, "y": 1, "part": "halfboard_ne" }, { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, - { "x": 2, "y": -1, "part": "wheel_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": -1, "part": "headlight" }, { "x": 2, "y": 2, "part": "frame_ne" }, { "x": 2, "y": 2, "part": "halfboard_ne" }, - { "x": 2, "y": 2, "part": "wheel_steerable" }, + { "x": 2, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": 2, "part": "headlight" }, { "x": -2, "y": 0, "part": "frame_vertical" }, { "x": -2, "y": 0, "part": "trunk" }, @@ -1076,10 +1092,10 @@ { "x": -3, "y": -1, "part": "frame_vertical" }, { "x": -3, "y": -1, "part": "halfboard_vertical" }, { "x": -3, "y": -1, "part": "tank", "fuel": "gasoline" }, - { "x": -3, "y": -1, "part": "wheel" }, + { "x": -3, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -3, "y": 2, "part": "frame_vertical" }, { "x": -3, "y": 2, "part": "halfboard_vertical" }, - { "x": -3, "y": 2, "part": "wheel" }, + { "x": -3, "y": 2, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -4, "y": -1, "part": "frame_horizontal" }, { "x": -4, "y": -1, "part": "halfboard_sw" }, { "x": -4, "y": 0, "part": "frame_horizontal" }, @@ -1135,21 +1151,29 @@ { "x": 1, "y": 0, "parts": [ "xlframe_horizontal", "windshield" ] }, { "x": 1, "y": 1, "parts": [ "xlframe_horizontal", "windshield" ] }, { "x": 1, "y": 2, "parts": [ "xlframe_horizontal", "windshield" ] }, - { "x": 2, "y": -1, "parts": [ "xlframe_nw", "halfboard_nw", "wheel_steerable", "headlight" ] }, + { + "x": 2, + "y": -1, + "parts": [ "xlframe_nw", "halfboard_nw", "wheel_mount_medium_steerable", "wheel", "headlight" ] + }, { "x": 2, "y": 0, "parts": [ "xlframe_horizontal", "halfboard_nw" ] }, { "x": 2, "y": 0, "part": "engine_electric_large" }, { "x": 2, "y": 1, "parts": [ "xlframe_horizontal", "halfboard_ne" ] }, - { "x": 2, "y": 2, "parts": [ "xlframe_ne", "halfboard_ne", "wheel_steerable", "headlight" ] }, + { + "x": 2, + "y": 2, + "parts": [ "xlframe_ne", "halfboard_ne", "wheel_mount_medium_steerable", "wheel", "headlight" ] + }, { "x": -2, "y": -1, "parts": [ "xlframe_vertical", "halfboard_vertical" ] }, { "x": -2, "y": 0, "parts": [ "xlframe_vertical", "trunk", "roof", "solar_panel" ] }, { "x": -2, "y": 1, "parts": [ "xlframe_vertical", "trunk", "roof", "solar_panel" ] }, { "x": -2, "y": 2, "parts": [ "xlframe_vertical", "halfboard_vertical" ] }, { "x": -3, "y": -1, "parts": [ "xlframe_vertical", "halfboard_vertical" ] }, - { "x": -3, "y": -1, "part": "wheel" }, + { "x": -3, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -3, "y": 0, "parts": [ "xlframe_vertical", "trunk", "roof", "solar_panel" ] }, { "x": -3, "y": 1, "parts": [ "xlframe_vertical", "trunk", "roof", "solar_panel" ] }, { "x": -3, "y": 2, "parts": [ "xlframe_vertical", "halfboard_vertical" ] }, - { "x": -3, "y": 2, "part": "wheel" }, + { "x": -3, "y": 2, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -4, "y": -1, "parts": [ "xlframe_horizontal", "halfboard_sw" ] }, { "x": -4, "y": 0, "parts": [ "xlframe_horizontal", "door_trunk" ] }, { "x": -4, "y": 1, "parts": [ "xlframe_horizontal", "door_trunk" ] }, @@ -1195,11 +1219,19 @@ { "x": 1, "y": 0, "parts": [ "xlframe_horizontal", "windshield" ] }, { "x": 1, "y": 1, "parts": [ "xlframe_horizontal", "windshield" ] }, { "x": 1, "y": 2, "parts": [ "xlframe_horizontal", "windshield" ] }, - { "x": 2, "y": -1, "parts": [ "xlframe_nw", "halfboard_nw", "wheel_steerable", "headlight" ] }, + { + "x": 2, + "y": -1, + "parts": [ "xlframe_nw", "halfboard_nw", "wheel_mount_medium_steerable", "wheel", "headlight" ] + }, { "x": 2, "y": 0, "parts": [ "xlframe_horizontal", "halfboard_nw" ] }, { "x": 2, "y": 0, "part": "engine_electric_large" }, { "x": 2, "y": 1, "parts": [ "xlframe_horizontal", "halfboard_ne" ] }, - { "x": 2, "y": 2, "parts": [ "xlframe_ne", "halfboard_ne", "wheel_steerable", "headlight" ] }, + { + "x": 2, + "y": 2, + "parts": [ "xlframe_ne", "halfboard_ne", "wheel_mount_medium_steerable", "wheel", "headlight" ] + }, { "x": -1, "y": -1, "parts": [ "xlframe_vertical", "door" ] }, { "x": -1, "y": 0, "parts": [ "xlframe_vertical_2", "roof" ] }, { "x": -1, "y": 0, "parts": [ "seat", "seatbelt" ] }, @@ -1211,11 +1243,11 @@ { "x": -2, "y": 1, "parts": [ "xlframe_vertical", "trunk", "roof", "solar_panel" ] }, { "x": -2, "y": 2, "parts": [ "xlframe_vertical", "halfboard_vertical" ] }, { "x": -3, "y": -1, "parts": [ "xlframe_vertical", "halfboard_vertical" ] }, - { "x": -3, "y": -1, "part": "wheel" }, + { "x": -3, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -3, "y": 0, "parts": [ "xlframe_vertical", "trunk", "roof", "solar_panel" ] }, { "x": -3, "y": 1, "parts": [ "xlframe_vertical", "trunk", "roof", "solar_panel" ] }, { "x": -3, "y": 2, "parts": [ "xlframe_vertical", "halfboard_vertical" ] }, - { "x": -3, "y": 2, "part": "wheel" }, + { "x": -3, "y": 2, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -4, "y": -1, "parts": [ "xlframe_horizontal", "halfboard_sw" ] }, { "x": -4, "y": 0, "parts": [ "xlframe_horizontal", "door_trunk" ] }, { "x": -4, "y": 1, "parts": [ "xlframe_horizontal", "door_trunk" ] }, diff --git a/data/json/vehicles/carts.json b/data/json/vehicles/carts.json index 2978f4d93bfa3..fab44d865d906 100644 --- a/data/json/vehicles/carts.json +++ b/data/json/vehicles/carts.json @@ -85,16 +85,16 @@ { "x": 0, "y": 1, "part": "storage_battery" }, { "x": 1, "y": 0, "part": "frame_nw" }, { "x": 1, "y": 0, "part": "halfboard_nw" }, - { "x": 1, "y": 0, "part": "wheel_small_steerable" }, + { "x": 1, "y": 0, "parts": [ "wheel_mount_light_steerable", "wheel_small" ] }, { "x": 1, "y": 1, "part": "frame_ne" }, { "x": 1, "y": 1, "part": "halfboard_ne" }, - { "x": 1, "y": 1, "part": "wheel_small_steerable" }, + { "x": 1, "y": 1, "parts": [ "wheel_mount_light_steerable", "wheel_small" ] }, { "x": -1, "y": 0, "part": "frame_sw" }, { "x": -1, "y": 0, "part": "box" }, - { "x": -1, "y": 0, "part": "wheel_small" }, + { "x": -1, "y": 0, "parts": [ "wheel_mount_light", "wheel_small" ] }, { "x": -1, "y": 1, "part": "frame_se" }, { "x": -1, "y": 1, "part": "box" }, - { "x": -1, "y": 1, "part": "wheel_small" } + { "x": -1, "y": 1, "parts": [ "wheel_mount_light", "wheel_small" ] } ], "items": [ { "x": -1, "y": 0, "chance": 25, "repeat": 2, "item_groups": [ "golf_cart" ] }, @@ -121,18 +121,18 @@ { "x": 0, "y": 1, "part": "storage_battery" }, { "x": 1, "y": 0, "part": "frame_nw" }, { "x": 1, "y": 0, "part": "halfboard_nw" }, - { "x": 1, "y": 0, "part": "wheel_small_steerable" }, + { "x": 1, "y": 0, "parts": [ "wheel_mount_light_steerable", "wheel_small" ] }, { "x": 1, "y": 1, "part": "frame_ne" }, { "x": 1, "y": 1, "part": "halfboard_ne" }, - { "x": 1, "y": 1, "part": "wheel_small_steerable" }, + { "x": 1, "y": 1, "parts": [ "wheel_mount_light_steerable", "wheel_small" ] }, { "x": -1, "y": 0, "part": "frame_sw" }, { "x": -1, "y": 0, "part": "roof" }, { "x": -1, "y": 0, "part": "seat" }, - { "x": -1, "y": 0, "part": "wheel_small" }, + { "x": -1, "y": 0, "parts": [ "wheel_mount_light", "wheel_small" ] }, { "x": -1, "y": 1, "part": "frame_se" }, { "x": -1, "y": 1, "part": "roof" }, { "x": -1, "y": 1, "part": "seat" }, - { "x": -1, "y": 1, "part": "wheel_small" } + { "x": -1, "y": 1, "parts": [ "wheel_mount_light", "wheel_small" ] } ], "items": [ { "x": -1, "y": 0, "chance": 20, "repeat": 2, "item_groups": [ "golf_cart" ] }, @@ -277,7 +277,7 @@ "blueprint": [ "o" ], "parts": [ { "x": 0, "y": 0, "part": "frame_handle" }, - { "x": 0, "y": 0, "part": "wheel_barrow" }, + { "x": 0, "y": 0, "parts": [ "wheel_mount_light", "wheel_barrow" ] }, { "x": 0, "y": 0, "part": "box" } ] }, @@ -289,7 +289,7 @@ "parts": [ { "x": 0, "y": 0, "part": "folding_frame" }, { "x": 0, "y": 0, "part": "folding_seat" }, - { "x": 0, "y": 0, "part": "wheel_wheelchair" }, + { "x": 0, "y": 0, "parts": [ "wheel_mount_light", "wheel_wheelchair" ] }, { "x": 0, "y": 0, "part": "hand_rims" }, { "x": 0, "y": 0, "part": "basketsm" } ] diff --git a/data/json/vehicles/custom_vehicles.json b/data/json/vehicles/custom_vehicles.json index 7b6f0c11cf6bc..481457634a62d 100644 --- a/data/json/vehicles/custom_vehicles.json +++ b/data/json/vehicles/custom_vehicles.json @@ -73,11 +73,11 @@ { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, { "x": 2, "y": -1, "part": "headlight" }, - { "x": 2, "y": -1, "part": "wheel_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": 2, "part": "frame_ne" }, { "x": 2, "y": 2, "part": "halfboard_ne" }, { "x": 2, "y": 2, "part": "headlight" }, - { "x": 2, "y": 2, "part": "wheel_steerable" }, + { "x": 2, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": -3, "y": 0, "part": "frame_vertical" }, { "x": -3, "y": 0, "part": "trunk" }, { "x": -3, "y": 0, "part": "muffler" }, @@ -96,7 +96,7 @@ { "x": -3, "y": 2, "part": "roof" }, { "x": -4, "y": -1, "part": "frame_sw" }, { "x": -4, "y": -1, "part": "board_sw" }, - { "x": -4, "y": -1, "part": "wheel" }, + { "x": -4, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -4, "y": -1, "part": "roof" }, { "x": -4, "y": 0, "part": "frame_horizontal" }, { "x": -4, "y": 0, "part": "door" }, @@ -108,7 +108,7 @@ { "x": -4, "y": 1, "part": "roof" }, { "x": -4, "y": 2, "part": "frame_se" }, { "x": -4, "y": 2, "part": "board_se" }, - { "x": -4, "y": 2, "part": "wheel" }, + { "x": -4, "y": 2, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -4, "y": 2, "part": "roof" } ] }, @@ -172,12 +172,12 @@ { "x": 2, "y": 1, "part": "halfboard_horizontal" }, { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, - { "x": 2, "y": -1, "part": "wheel_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": -1, "part": "spring_plate" }, { "x": 2, "y": -1, "part": "headlight" }, { "x": 2, "y": 2, "part": "frame_ne" }, { "x": 2, "y": 2, "part": "halfboard_ne" }, - { "x": 2, "y": 2, "part": "wheel_steerable" }, + { "x": 2, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": 2, "part": "spring_plate" }, { "x": 2, "y": 2, "part": "headlight" }, { "x": 3, "y": 0, "part": "ram_spiked" }, @@ -201,7 +201,7 @@ { "x": -2, "y": 2, "part": "tank", "fuel": "gasoline" }, { "x": -3, "y": -1, "part": "frame_horizontal" }, { "x": -3, "y": -1, "part": "halfboard_sw" }, - { "x": -3, "y": -1, "part": "wheel" }, + { "x": -3, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -3, "y": -1, "part": "spring_plate" }, { "x": -3, "y": 0, "part": "frame_horizontal" }, { "x": -3, "y": 0, "part": "trunk" }, @@ -209,7 +209,7 @@ { "x": -3, "y": 1, "part": "aisle_vertical" }, { "x": -3, "y": 2, "part": "frame_horizontal" }, { "x": -3, "y": 2, "part": "halfboard_se" }, - { "x": -3, "y": 2, "part": "wheel" }, + { "x": -3, "y": 2, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -3, "y": 2, "part": "spring_plate" } ], "items": [ diff --git a/data/json/vehicles/emergency.json b/data/json/vehicles/emergency.json index 37c1456834dce..30cb28975c7cc 100644 --- a/data/json/vehicles/emergency.json +++ b/data/json/vehicles/emergency.json @@ -57,11 +57,11 @@ { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, { "x": 2, "y": -1, "part": "headlight" }, - { "x": 2, "y": -1, "part": "wheel_wide_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": 2, "y": 3, "part": "frame_ne" }, { "x": 2, "y": 3, "part": "halfboard_ne" }, { "x": 2, "y": 3, "part": "headlight" }, - { "x": 2, "y": 3, "part": "wheel_wide_steerable" }, + { "x": 2, "y": 3, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": -1, "y": 0, "part": "frame_horizontal" }, { "x": -1, "y": 0, "part": "board_horizontal" }, { "x": -1, "y": 0, "part": "light_red" }, @@ -136,11 +136,11 @@ { "x": -5, "y": 2, "part": "light_blue" }, { "x": -5, "y": -1, "part": "frame_sw" }, { "x": -5, "y": -1, "part": "board_sw" }, - { "x": -5, "y": -1, "part": "wheel_wide" }, + { "x": -5, "y": -1, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -5, "y": -1, "part": "roof" }, { "x": -5, "y": 3, "part": "frame_se" }, { "x": -5, "y": 3, "part": "board_se" }, - { "x": -5, "y": 3, "part": "wheel_wide" }, + { "x": -5, "y": 3, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -5, "y": 3, "part": "roof" } ], "items": [ @@ -222,11 +222,11 @@ { "x": 2, "y": 1, "part": "halfboard_horizontal" }, { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, - { "x": 2, "y": -1, "part": "wheel_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": -1, "part": "headlight" }, { "x": 2, "y": 2, "part": "frame_ne" }, { "x": 2, "y": 2, "part": "halfboard_ne" }, - { "x": 2, "y": 2, "part": "wheel_steerable" }, + { "x": 2, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": 2, "part": "headlight" }, { "x": -2, "y": 0, "part": "frame_vertical" }, { "x": -2, "y": 0, "part": "trunk" }, @@ -242,14 +242,14 @@ { "x": -2, "y": 2, "part": "halfboard_vertical" }, { "x": -3, "y": -1, "part": "frame_horizontal" }, { "x": -3, "y": -1, "part": "halfboard_sw" }, - { "x": -3, "y": -1, "part": "wheel" }, + { "x": -3, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -3, "y": 0, "part": "frame_horizontal" }, { "x": -3, "y": 0, "part": "door_trunk" }, { "x": -3, "y": 1, "part": "frame_horizontal" }, { "x": -3, "y": 1, "part": "door_trunk" }, { "x": -3, "y": 2, "part": "frame_horizontal" }, { "x": -3, "y": 2, "part": "halfboard_se" }, - { "x": -3, "y": 2, "part": "wheel" } + { "x": -3, "y": 2, "parts": [ "wheel_mount_medium", "wheel" ] } ], "items": [ { "x": -2, "y": 1, "chance": 75, "magazine": 100, "ammo": 50, "item_groups": [ "guns_cop" ] } ] }, @@ -355,12 +355,12 @@ { "x": 0, "y": 0, "part": "light_red" }, { "x": -4, "y": -1, "part": "light_red" }, { "x": -4, "y": 1, "part": "light_red" }, - { "x": -5, "y": -2, "part": "wheel_wide" }, - { "x": -4, "y": -2, "part": "wheel_wide" }, - { "x": 0, "y": -2, "part": "wheel_wide_steerable" }, - { "x": -5, "y": 2, "part": "wheel_wide" }, - { "x": -4, "y": 2, "part": "wheel_wide" }, - { "x": 0, "y": 2, "part": "wheel_wide_steerable" }, + { "x": -5, "y": -2, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, + { "x": -4, "y": -2, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, + { "x": 0, "y": -2, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, + { "x": -5, "y": 2, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, + { "x": -4, "y": 2, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, + { "x": 0, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": -1, "y": -2, "part": "door" }, { "x": -1, "y": 2, "part": "door" }, { "x": 0, "y": -2, "part": "door" }, @@ -521,7 +521,7 @@ { "x": 0, "y": -1, "part": "hdframe_vertical" }, { "x": 0, "y": -1, "part": "door" }, { "x": 0, "y": -1, "part": "roof" }, - { "x": 0, "y": -1, "part": "wheel_wide_steerable" }, + { "x": 0, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": 0, "y": 0, "part": "hdframe_horizontal" }, { "x": 0, "y": 0, "part": "seat" }, { "x": 0, "y": 0, "part": "seatbelt" }, @@ -542,7 +542,7 @@ { "x": 0, "y": 3, "part": "hdframe_vertical" }, { "x": 0, "y": 3, "part": "door" }, { "x": 0, "y": 3, "part": "roof" }, - { "x": 0, "y": 3, "part": "wheel_wide_steerable" }, + { "x": 0, "y": 3, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": -1, "y": -1, "part": "hdframe_vertical" }, { "x": -1, "y": -1, "part": "board_vertical" }, { "x": -1, "y": -1, "part": "roof" }, @@ -610,7 +610,7 @@ { "x": -4, "y": 3, "part": "stowboard_vertical" }, { "x": -4, "y": 3, "part": "roof" }, { "x": -5, "y": -1, "part": "hdframe_vertical" }, - { "x": -5, "y": -1, "part": "wheel_wide" }, + { "x": -5, "y": -1, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -5, "y": -1, "part": "tank", "fuel": "gasoline" }, { "x": -5, "y": -1, "part": "stowboard_vertical" }, { "x": -5, "y": -1, "part": "roof" }, @@ -624,7 +624,7 @@ { "x": -5, "y": 2, "part": "trunk" }, { "x": -5, "y": 2, "part": "roof" }, { "x": -5, "y": 3, "part": "hdframe_vertical" }, - { "x": -5, "y": 3, "part": "wheel_wide" }, + { "x": -5, "y": 3, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -5, "y": 3, "part": "tank", "fuel": "gasoline" }, { "x": -5, "y": 3, "part": "stowboard_vertical" }, { "x": -5, "y": 3, "part": "roof" }, @@ -741,11 +741,11 @@ { "x": 2, "y": 1, "part": "halfboard_horizontal" }, { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, - { "x": 2, "y": -1, "part": "wheel_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": -1, "part": "headlight" }, { "x": 2, "y": 2, "part": "frame_ne" }, { "x": 2, "y": 2, "part": "halfboard_ne" }, - { "x": 2, "y": 2, "part": "wheel_steerable" }, + { "x": 2, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": 2, "part": "headlight" }, { "x": -2, "y": 0, "part": "frame_vertical" }, { "x": -2, "y": 0, "part": "trunk" }, @@ -761,14 +761,14 @@ { "x": -2, "y": 2, "part": "halfboard_vertical" }, { "x": -3, "y": -1, "part": "frame_horizontal" }, { "x": -3, "y": -1, "part": "halfboard_sw" }, - { "x": -3, "y": -1, "part": "wheel" }, + { "x": -3, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -3, "y": 0, "part": "frame_horizontal" }, { "x": -3, "y": 0, "part": "door_trunk" }, { "x": -3, "y": 1, "part": "frame_horizontal" }, { "x": -3, "y": 1, "part": "door_trunk" }, { "x": -3, "y": 2, "part": "frame_horizontal" }, { "x": -3, "y": 2, "part": "halfboard_se" }, - { "x": -3, "y": 2, "part": "wheel" } + { "x": -3, "y": 2, "parts": [ "wheel_mount_medium", "wheel" ] } ], "items": [ { "x": -2, "y": 0, "chance": 5, "item_groups": [ "tools_entry" ] }, @@ -834,11 +834,11 @@ { "x": 2, "y": 1, "part": "halfboard_horizontal" }, { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, - { "x": 2, "y": -1, "part": "wheel_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": -1, "part": "headlight" }, { "x": 2, "y": 2, "part": "frame_ne" }, { "x": 2, "y": 2, "part": "halfboard_ne" }, - { "x": 2, "y": 2, "part": "wheel_steerable" }, + { "x": 2, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": 2, "part": "headlight" }, { "x": -2, "y": 0, "part": "frame_vertical" }, { "x": -2, "y": 0, "part": "trunk" }, @@ -854,14 +854,14 @@ { "x": -2, "y": 2, "part": "halfboard_vertical" }, { "x": -3, "y": -1, "part": "frame_horizontal" }, { "x": -3, "y": -1, "part": "halfboard_sw" }, - { "x": -3, "y": -1, "part": "wheel" }, + { "x": -3, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -3, "y": 0, "part": "frame_horizontal" }, { "x": -3, "y": 0, "part": "door_trunk" }, { "x": -3, "y": 1, "part": "frame_horizontal" }, { "x": -3, "y": 1, "part": "door_trunk" }, { "x": -3, "y": 2, "part": "frame_horizontal" }, { "x": -3, "y": 2, "part": "halfboard_se" }, - { "x": -3, "y": 2, "part": "wheel" } + { "x": -3, "y": 2, "parts": [ "wheel_mount_medium", "wheel" ] } ], "items": [ { "x": 0, "y": 1, "chance": 8, "items": [ "dog_whistle" ] }, @@ -929,11 +929,11 @@ { "x": 2, "y": 1, "part": "halfboard_ne" }, { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, - { "x": 2, "y": -1, "part": "wheel_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": -1, "part": "headlight_reinforced" }, { "x": 2, "y": 2, "part": "frame_ne" }, { "x": 2, "y": 2, "part": "halfboard_ne" }, - { "x": 2, "y": 2, "part": "wheel_steerable" }, + { "x": 2, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": 2, "part": "headlight_reinforced" }, { "x": -2, "y": 0, "part": "frame_vertical" }, { "x": -2, "y": 0, "part": "trunk" }, @@ -956,10 +956,10 @@ { "x": -3, "y": -1, "part": "frame_vertical" }, { "x": -3, "y": -1, "part": "halfboard_vertical" }, { "x": -3, "y": -1, "part": "tank", "fuel": "gasoline" }, - { "x": -3, "y": -1, "part": "wheel" }, + { "x": -3, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -3, "y": 2, "part": "frame_vertical" }, { "x": -3, "y": 2, "part": "halfboard_vertical" }, - { "x": -3, "y": 2, "part": "wheel" }, + { "x": -3, "y": 2, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -4, "y": -1, "part": "frame_horizontal" }, { "x": -4, "y": -1, "part": "halfboard_sw" }, { "x": -4, "y": 0, "part": "frame_horizontal" }, @@ -1035,11 +1035,11 @@ { "x": 2, "y": 1, "part": "halfboard_ne" }, { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, - { "x": 2, "y": -1, "part": "wheel_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": -1, "part": "headlight_reinforced" }, { "x": 2, "y": 2, "part": "frame_ne" }, { "x": 2, "y": 2, "part": "halfboard_ne" }, - { "x": 2, "y": 2, "part": "wheel_steerable" }, + { "x": 2, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": 2, "part": "headlight_reinforced" }, { "x": -2, "y": 0, "part": "frame_vertical" }, { "x": -2, "y": 0, "part": "trunk" }, @@ -1062,10 +1062,10 @@ { "x": -3, "y": -1, "part": "frame_vertical" }, { "x": -3, "y": -1, "part": "halfboard_vertical" }, { "x": -3, "y": -1, "part": "tank", "fuel": "gasoline" }, - { "x": -3, "y": -1, "part": "wheel" }, + { "x": -3, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -3, "y": 2, "part": "frame_vertical" }, { "x": -3, "y": 2, "part": "halfboard_vertical" }, - { "x": -3, "y": 2, "part": "wheel" }, + { "x": -3, "y": 2, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -4, "y": -1, "part": "frame_horizontal" }, { "x": -4, "y": -1, "part": "halfboard_sw" }, { "x": -4, "y": 0, "part": "frame_horizontal" }, @@ -1144,11 +1144,11 @@ { "x": 2, "y": 1, "part": "halfboard_ne" }, { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, - { "x": 2, "y": -1, "part": "wheel_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": -1, "part": "headlight" }, { "x": 2, "y": 2, "part": "frame_ne" }, { "x": 2, "y": 2, "part": "halfboard_ne" }, - { "x": 2, "y": 2, "part": "wheel_steerable" }, + { "x": 2, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": 2, "part": "headlight" }, { "x": -2, "y": 0, "part": "frame_vertical" }, { "x": -2, "y": 0, "part": "trunk" }, @@ -1171,10 +1171,10 @@ { "x": -3, "y": -1, "part": "frame_vertical" }, { "x": -3, "y": -1, "part": "halfboard_vertical" }, { "x": -3, "y": -1, "part": "tank", "fuel": "gasoline" }, - { "x": -3, "y": -1, "part": "wheel" }, + { "x": -3, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -3, "y": 2, "part": "frame_vertical" }, { "x": -3, "y": 2, "part": "halfboard_vertical" }, - { "x": -3, "y": 2, "part": "wheel" }, + { "x": -3, "y": 2, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -4, "y": -1, "part": "frame_horizontal" }, { "x": -4, "y": -1, "part": "halfboard_sw" }, { "x": -4, "y": 0, "part": "frame_horizontal" }, @@ -1261,12 +1261,12 @@ { "x": 2, "y": -1, "part": "hdframe_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, { "x": 2, "y": -1, "part": "headlight_reinforced" }, - { "x": 2, "y": -1, "part": "wheel_wide_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": 2, "y": -1, "part": "plating_steel" }, { "x": 2, "y": 3, "part": "hdframe_ne" }, { "x": 2, "y": 3, "part": "halfboard_ne" }, { "x": 2, "y": 3, "part": "headlight_reinforced" }, - { "x": 2, "y": 3, "part": "wheel_wide_steerable" }, + { "x": 2, "y": 3, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": 2, "y": 3, "part": "plating_steel" }, { "x": -1, "y": 0, "part": "hdframe_horizontal" }, { "x": -1, "y": 0, "part": "hdboard_horizontal" }, @@ -1360,12 +1360,12 @@ { "x": -5, "y": 2, "part": "plating_steel" }, { "x": -5, "y": -1, "part": "hdframe_sw" }, { "x": -5, "y": -1, "part": "hdboard_sw" }, - { "x": -5, "y": -1, "part": "wheel_wide" }, + { "x": -5, "y": -1, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -5, "y": -1, "part": "hdroof" }, { "x": -5, "y": -1, "part": "plating_steel" }, { "x": -5, "y": 3, "part": "hdframe_se" }, { "x": -5, "y": 3, "part": "hdboard_se" }, - { "x": -5, "y": 3, "part": "wheel_wide" }, + { "x": -5, "y": 3, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -5, "y": 3, "part": "hdroof" }, { "x": -5, "y": 3, "part": "plating_steel" } ], diff --git a/data/json/vehicles/farm.json b/data/json/vehicles/farm.json index b7c111829eebe..166621f1f617b 100644 --- a/data/json/vehicles/farm.json +++ b/data/json/vehicles/farm.json @@ -23,10 +23,10 @@ { "x": 3, "y": 0, "part": "reaper" }, { "x": -1, "y": 0, "parts": [ "frame_cross", "plow" ] }, { "x": -2, "y": 0, "part": "seed_drill" }, - { "x": -1, "y": 1, "parts": [ "frame_cross", "wheel_wide_or" ] }, - { "x": -1, "y": -1, "parts": [ "frame_cross", "wheel_wide_or" ] }, - { "x": 2, "y": 1, "parts": [ "frame_cross", "wheel_wide_or_steerable" ] }, - { "x": 2, "y": -1, "parts": [ "frame_cross", "wheel_wide_or_steerable" ] } + { "x": -1, "y": 1, "parts": [ "frame_cross", "wheel_mount_medium", "wheel_wide_or" ] }, + { "x": -1, "y": -1, "parts": [ "frame_cross", "wheel_mount_medium", "wheel_wide_or" ] }, + { "x": 2, "y": 1, "parts": [ "frame_cross", "wheel_mount_medium_steerable", "wheel_wide_or" ] }, + { "x": 2, "y": -1, "parts": [ "frame_cross", "wheel_mount_medium_steerable", "wheel_wide_or" ] } ], "items": [ ] }, @@ -55,14 +55,14 @@ { "x": 1, "y": -1, "part": "frame_vertical" }, { "x": 1, "y": -1, "part": "board_vertical" }, { "x": 2, "y": 1, "part": "frame_ne" }, - { "x": 2, "y": 1, "part": "wheel_wide_or_steerable" }, + { "x": 2, "y": 1, "parts": [ "wheel_mount_medium_steerable", "wheel_wide_or" ] }, { "x": 2, "y": 1, "part": "board_ne" }, { "x": 2, "y": 0, "part": "frame_horizontal" }, { "x": 2, "y": 0, "part": "board_horizontal" }, { "x": 2, "y": 0, "part": "headlight" }, { "x": 2, "y": 0, "part": "omnicam" }, { "x": 2, "y": -1, "part": "frame_nw" }, - { "x": 2, "y": -1, "part": "wheel_wide_or_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel_wide_or" ] }, { "x": 2, "y": -1, "part": "board_nw" }, { "x": -1, "y": 1, "part": "frame_cross" }, { "x": -1, "y": 1, "part": "storage_battery_mount" }, @@ -80,14 +80,14 @@ { "x": -2, "y": 1, "part": "storage_battery_mount" }, { "x": -2, "y": 1, "part": "storage_battery_removable" }, { "x": -2, "y": 1, "part": "cargo_space" }, - { "x": -2, "y": 1, "part": "wheel_wide_or_steerable" }, + { "x": -2, "y": 1, "parts": [ "wheel_mount_medium_steerable", "wheel_wide_or" ] }, { "x": -2, "y": 0, "part": "seed_drill_advanced" }, { "x": -2, "y": -1, "part": "frame_sw" }, { "x": -2, "y": -1, "part": "engine_electric" }, { "x": -2, "y": -1, "part": "storage_battery_mount" }, { "x": -2, "y": -1, "part": "storage_battery_removable" }, { "x": -2, "y": -1, "part": "cargo_space" }, - { "x": -2, "y": -1, "part": "wheel_wide_or_steerable" } + { "x": -2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel_wide_or" ] } ], "items": [ ] }, @@ -107,8 +107,8 @@ { "x": 2, "y": 0, "part": "halfboard_vertical" }, { "x": 2, "y": -1, "part": "frame_horizontal" }, { "x": 2, "y": 1, "part": "frame_horizontal" }, - { "x": 2, "y": -1, "part": "wheel_wide_or_steerable" }, - { "x": 2, "y": 1, "part": "wheel_wide_or_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel_wide_or" ] }, + { "x": 2, "y": 1, "parts": [ "wheel_mount_medium_steerable", "wheel_wide_or" ] }, { "x": 1, "y": 0, "part": "frame_horizontal" }, { "x": 1, "y": 0, "part": "halfboard_vertical" }, { "x": 1, "y": 0, "part": "battery_car" }, @@ -123,8 +123,8 @@ { "x": -1, "y": 0, "part": "halfboard_vertical" }, { "x": -1, "y": 1, "part": "frame_horizontal" }, { "x": -1, "y": -1, "part": "frame_horizontal" }, - { "x": -1, "y": 1, "part": "wheel_wide_or" }, - { "x": -1, "y": -1, "part": "wheel_wide_or" }, + { "x": -1, "y": 1, "parts": [ "wheel_mount_medium", "wheel_wide_or" ] }, + { "x": -1, "y": -1, "parts": [ "wheel_mount_medium", "wheel_wide_or" ] }, { "x": -2, "y": 0, "part": "frame_cross" }, { "x": -2, "y": 1, "part": "frame_cross" }, { "x": -2, "y": -1, "part": "frame_cross" }, @@ -152,8 +152,8 @@ { "x": 2, "y": 0, "part": "halfboard_vertical" }, { "x": 2, "y": -1, "part": "frame_horizontal" }, { "x": 2, "y": 1, "part": "frame_horizontal" }, - { "x": 2, "y": -1, "part": "wheel_wide_or_steerable" }, - { "x": 2, "y": 1, "part": "wheel_wide_or_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel_wide_or" ] }, + { "x": 2, "y": 1, "parts": [ "wheel_mount_medium_steerable", "wheel_wide_or" ] }, { "x": 1, "y": 0, "part": "frame_horizontal" }, { "x": 1, "y": 0, "part": "halfboard_vertical" }, { "x": 1, "y": 0, "part": "battery_car" }, @@ -168,8 +168,8 @@ { "x": -1, "y": 0, "part": "halfboard_vertical" }, { "x": -1, "y": 1, "part": "frame_horizontal" }, { "x": -1, "y": -1, "part": "frame_horizontal" }, - { "x": -1, "y": 1, "part": "wheel_wide_or" }, - { "x": -1, "y": -1, "part": "wheel_wide_or" }, + { "x": -1, "y": 1, "parts": [ "wheel_mount_medium", "wheel_wide_or" ] }, + { "x": -1, "y": -1, "parts": [ "wheel_mount_medium", "wheel_wide_or" ] }, { "x": -2, "y": 0, "part": "reaper" }, { "x": -2, "y": 1, "part": "frame_cross" }, { "x": -2, "y": -1, "part": "frame_cross" }, @@ -194,8 +194,8 @@ { "x": 2, "y": 0, "part": "halfboard_vertical" }, { "x": 2, "y": -1, "part": "frame_horizontal" }, { "x": 2, "y": 1, "part": "frame_horizontal" }, - { "x": 2, "y": -1, "part": "wheel_wide_or_steerable" }, - { "x": 2, "y": 1, "part": "wheel_wide_or_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel_wide_or" ] }, + { "x": 2, "y": 1, "parts": [ "wheel_mount_medium_steerable", "wheel_wide_or" ] }, { "x": 1, "y": 0, "part": "frame_horizontal" }, { "x": 1, "y": 0, "part": "halfboard_vertical" }, { "x": 1, "y": 0, "part": "battery_car" }, @@ -210,8 +210,8 @@ { "x": -1, "y": 0, "part": "halfboard_vertical" }, { "x": -1, "y": 1, "part": "frame_horizontal" }, { "x": -1, "y": -1, "part": "frame_horizontal" }, - { "x": -1, "y": 1, "part": "wheel_wide_or" }, - { "x": -1, "y": -1, "part": "wheel_wide_or" }, + { "x": -1, "y": 1, "parts": [ "wheel_mount_medium", "wheel_wide_or" ] }, + { "x": -1, "y": -1, "parts": [ "wheel_mount_medium", "wheel_wide_or" ] }, { "x": -2, "y": 0, "part": "seed_drill" }, { "x": -2, "y": 1, "part": "frame_cross" }, { "x": -2, "y": -1, "part": "frame_cross" }, diff --git a/data/json/vehicles/military.json b/data/json/vehicles/military.json index ac6823376a975..e63b195f2b9a2 100644 --- a/data/json/vehicles/military.json +++ b/data/json/vehicles/military.json @@ -19,7 +19,7 @@ { "y": -1, "x": 4, "parts": [ "headlight_reinforced", "reinforced_windshield" ] }, { "y": -2, "x": 4, "parts": [ "hdframe_nw", "hdboard_nw", "plating_military" ] }, { "y": 2, "x": 3, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": 2, "x": 3, "parts": [ "wheel_armor_steerable", "omnicam" ] }, + { "y": 2, "x": 3, "parts": [ "wheel_mount_heavy_steerable", "wheel_armor", "omnicam" ] }, { "y": 1, "x": 3, "parts": [ "hdframe_vertical_2", "hdroof", "plating_military" ] }, { "y": 1, "x": 3, "parts": [ { "fuel": "diesel", "part": "tank_small" }, "cam_control" ] }, { @@ -42,28 +42,28 @@ { "y": -1, "x": 3, "parts": [ "controls", "dashboard", "cam_control", "vehicle_clock" ] }, { "y": -1, "x": 3, "parts": [ "seat", "seatbelt_heavyduty" ] }, { "y": -2, "x": 3, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": -2, "x": 3, "parts": [ "wheel_armor_steerable", "omnicam" ] }, + { "y": -2, "x": 3, "parts": [ "wheel_mount_heavy_steerable", "wheel_armor", "omnicam" ] }, { "y": 2, "x": 2, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": 2, "x": 2, "parts": [ "wheel_armor" ] }, + { "y": 2, "x": 2, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 1, "x": 2, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": 0, "x": 2, "parts": [ "hdframe_vertical_2", "aisle_horizontal", "hdroof" ] }, { "y": -1, "x": 2, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": -2, "x": 2, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": -2, "x": 2, "parts": [ "wheel_armor" ] }, + { "y": -2, "x": 2, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 2, "x": 1, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": 2, "x": 1, "parts": [ "wheel_armor" ] }, + { "y": 2, "x": 1, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 1, "x": 1, "parts": [ "hdframe_vertical_2", "box", "recharge_station", "hdroof" ] }, { "y": 0, "x": 1, "parts": [ "hdframe_vertical_2", "aisle_horizontal", "hdroof" ] }, { "y": -1, "x": 1, "parts": [ "hdframe_vertical_2", "box", "recharge_station", "hdroof" ] }, { "y": -2, "x": 1, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": -2, "x": 1, "parts": [ "wheel_armor" ] }, + { "y": -2, "x": 1, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 2, "x": 0, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": 2, "x": 0, "parts": [ "wheel_armor" ] }, + { "y": 2, "x": 0, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 1, "x": 0, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": 0, "x": 0, "parts": [ "hdframe_vertical_2", "aisle_horizontal", "hdroof" ] }, { "y": -1, "x": 0, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": -2, "x": 0, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": -2, "x": 0, "parts": [ "wheel_armor" ] }, + { "y": -2, "x": 0, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 2, "x": -1, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, { "y": 1, "x": -1, "parts": [ "hdframe_vertical_2", "box", "recharge_station", "hdroof" ] }, { "y": 0, "x": -1, "parts": [ "hdframe_vertical_2", "aisle_horizontal", "hdroof" ] }, @@ -114,7 +114,7 @@ { "y": -1, "x": 4, "parts": [ "headlight_reinforced", "reinforced_windshield" ] }, { "y": -2, "x": 4, "parts": [ "hdframe_nw", "hdboard_nw", "plating_military" ] }, { "y": 2, "x": 3, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": 2, "x": 3, "parts": [ "wheel_armor_steerable", "omnicam" ] }, + { "y": 2, "x": 3, "parts": [ "wheel_mount_heavy_steerable", "wheel_armor", "omnicam" ] }, { "y": 1, "x": 3, "parts": [ "hdframe_vertical_2", "hdroof", "plating_military" ] }, { "y": 1, "x": 3, "parts": [ { "fuel": "diesel", "part": "tank_small" }, "cam_control" ] }, { @@ -129,28 +129,28 @@ { "y": -1, "x": 3, "parts": [ "controls", "dashboard", "cam_control", "vehicle_clock" ] }, { "y": -1, "x": 3, "parts": [ "seat", "seatbelt_heavyduty" ] }, { "y": -2, "x": 3, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": -2, "x": 3, "parts": [ "wheel_armor_steerable", "omnicam" ] }, + { "y": -2, "x": 3, "parts": [ "wheel_mount_heavy_steerable", "wheel_armor", "omnicam" ] }, { "y": 2, "x": 2, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": 2, "x": 2, "parts": [ "wheel_armor" ] }, + { "y": 2, "x": 2, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 1, "x": 2, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": 0, "x": 2, "parts": [ "hdframe_vertical_2", "aisle_horizontal", "hdroof" ] }, { "y": -1, "x": 2, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": -2, "x": 2, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": -2, "x": 2, "parts": [ "wheel_armor" ] }, + { "y": -2, "x": 2, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 2, "x": 1, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": 2, "x": 1, "parts": [ "wheel_armor" ] }, + { "y": 2, "x": 1, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 1, "x": 1, "parts": [ "hdframe_vertical_2", "box", "recharge_station", "hdroof" ] }, { "y": 0, "x": 1, "parts": [ "hdframe_vertical_2", "aisle_horizontal", "hdroof" ] }, { "y": -1, "x": 1, "parts": [ "hdframe_vertical_2", "box", "recharge_station", "hdroof" ] }, { "y": -2, "x": 1, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": -2, "x": 1, "parts": [ "wheel_armor" ] }, + { "y": -2, "x": 1, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 2, "x": 0, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": 2, "x": 0, "parts": [ "wheel_armor" ] }, + { "y": 2, "x": 0, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 1, "x": 0, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": 0, "x": 0, "parts": [ "hdframe_vertical_2", "aisle_horizontal", "hdroof" ] }, { "y": -1, "x": 0, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": -2, "x": 0, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": -2, "x": 0, "parts": [ "wheel_armor" ] }, + { "y": -2, "x": 0, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 2, "x": -1, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, { "y": 1, "x": -1, "parts": [ "hdframe_vertical_2", "box", "recharge_station", "hdroof" ] }, { "y": 0, "x": -1, "parts": [ "hdframe_vertical_2", "aisle_horizontal", "hdroof" ] }, @@ -201,7 +201,7 @@ { "y": -1, "x": 4, "parts": [ "headlight_reinforced", "reinforced_windshield" ] }, { "y": -2, "x": 4, "parts": [ "hdframe_nw", "hdboard_nw", "plating_military" ] }, { "y": 2, "x": 3, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": 2, "x": 3, "parts": [ "wheel_armor_steerable", "omnicam" ] }, + { "y": 2, "x": 3, "parts": [ "wheel_mount_heavy_steerable", "wheel_armor", "omnicam" ] }, { "y": 1, "x": 3, "parts": [ "hdframe_vertical_2", "hdroof", "plating_military" ] }, { "y": 1, "x": 3, "parts": [ { "fuel": "diesel", "part": "tank_small" }, "cam_control" ] }, { @@ -216,28 +216,28 @@ { "y": -1, "x": 3, "parts": [ "controls", "dashboard", "cam_control", "vehicle_clock" ] }, { "y": -1, "x": 3, "parts": [ "seat", "seatbelt_heavyduty" ] }, { "y": -2, "x": 3, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": -2, "x": 3, "parts": [ "wheel_armor_steerable", "omnicam" ] }, + { "y": -2, "x": 3, "parts": [ "wheel_mount_heavy_steerable", "wheel_armor", "omnicam" ] }, { "y": 2, "x": 2, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": 2, "x": 2, "parts": [ "wheel_armor" ] }, + { "y": 2, "x": 2, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 1, "x": 2, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": 0, "x": 2, "parts": [ "hdframe_vertical_2", "aisle_horizontal", "hdroof" ] }, { "y": -1, "x": 2, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": -2, "x": 2, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": -2, "x": 2, "parts": [ "wheel_armor" ] }, + { "y": -2, "x": 2, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 2, "x": 1, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": 2, "x": 1, "parts": [ "wheel_armor" ] }, + { "y": 2, "x": 1, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 1, "x": 1, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": 0, "x": 1, "parts": [ "hdframe_vertical_2", "aisle_horizontal", "hdroof" ] }, { "y": -1, "x": 1, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": -2, "x": 1, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": -2, "x": 1, "parts": [ "wheel_armor" ] }, + { "y": -2, "x": 1, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 2, "x": 0, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": 2, "x": 0, "parts": [ "wheel_armor" ] }, + { "y": 2, "x": 0, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 1, "x": 0, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": 0, "x": 0, "parts": [ "hdframe_vertical_2", "aisle_horizontal", "hdroof" ] }, { "y": -1, "x": 0, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": -2, "x": 0, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": -2, "x": 0, "parts": [ "wheel_armor" ] }, + { "y": -2, "x": 0, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 2, "x": -1, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, { "y": 1, "x": -1, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": 0, "x": -1, "parts": [ "hdframe_vertical_2", "aisle_horizontal", "hdroof" ] }, @@ -274,7 +274,7 @@ { "y": -1, "x": 4, "parts": [ "headlight_reinforced", "reinforced_windshield" ] }, { "y": -2, "x": 4, "parts": [ "hdframe_nw", "hdboard_nw", "plating_military" ] }, { "y": 2, "x": 3, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": 2, "x": 3, "parts": [ "wheel_armor_steerable", "omnicam" ] }, + { "y": 2, "x": 3, "parts": [ "wheel_mount_heavy_steerable", "wheel_armor", "omnicam" ] }, { "y": 1, "x": 3, "parts": [ "hdframe_vertical_2", "hdroof", "plating_military" ] }, { "y": 1, "x": 3, "parts": [ { "fuel": "diesel", "part": "tank_small" }, "cam_control" ] }, { @@ -297,28 +297,28 @@ { "y": -1, "x": 3, "parts": [ "controls", "dashboard", "cam_control", "vehicle_clock" ] }, { "y": -1, "x": 3, "parts": [ "seat", "seatbelt_heavyduty" ] }, { "y": -2, "x": 3, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": -2, "x": 3, "parts": [ "wheel_armor_steerable", "omnicam" ] }, + { "y": -2, "x": 3, "parts": [ "wheel_mount_heavy_steerable", "wheel_armor", "omnicam" ] }, { "y": 2, "x": 2, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": 2, "x": 2, "parts": [ "wheel_armor" ] }, + { "y": 2, "x": 2, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 1, "x": 2, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": 0, "x": 2, "parts": [ "hdframe_vertical_2", "aisle_horizontal", "hdroof" ] }, { "y": -1, "x": 2, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": -2, "x": 2, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": -2, "x": 2, "parts": [ "wheel_armor" ] }, + { "y": -2, "x": 2, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 2, "x": 1, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": 2, "x": 1, "parts": [ "wheel_armor" ] }, + { "y": 2, "x": 1, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 1, "x": 1, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": 0, "x": 1, "parts": [ "hdframe_vertical_2", "aisle_horizontal", "hdroof" ] }, { "y": -1, "x": 1, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": -2, "x": 1, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": -2, "x": 1, "parts": [ "wheel_armor" ] }, + { "y": -2, "x": 1, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 2, "x": 0, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": 2, "x": 0, "parts": [ "wheel_armor" ] }, + { "y": 2, "x": 0, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 1, "x": 0, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": 0, "x": 0, "parts": [ "hdframe_vertical_2", "aisle_horizontal", "hdroof" ] }, { "y": -1, "x": 0, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": -2, "x": 0, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": -2, "x": 0, "parts": [ "wheel_armor" ] }, + { "y": -2, "x": 0, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 2, "x": -1, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, { "y": 1, "x": -1, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": 0, "x": -1, "parts": [ "hdframe_vertical_2", "aisle_horizontal", "hdroof" ] }, @@ -351,7 +351,7 @@ { "y": 0, "x": 3, "parts": [ "hdframe_horizontal_2", "plating_military" ] }, { "y": -1, "x": 3, "parts": [ "hdframe_horizontal", "plating_military" ] }, { "y": 3, "x": 2, "parts": [ "hdframe_ne", "hdhalfboard_ne", "plating_military" ] }, - { "y": 3, "x": 2, "parts": [ "wheel_armor_steerable" ] }, + { "y": 3, "x": 2, "parts": [ "wheel_mount_heavy_steerable", "wheel_armor" ] }, { "y": 2, "x": 2, "parts": [ "hdframe_horizontal", "hdhalfboard_horizontal", "plating_military" ] }, { "y": 2, "x": 2, "parts": [ "headlight_reinforced" ] }, { "y": 1, "x": 2, "parts": [ "hdframe_horizontal", "hdhalfboard_horizontal", "plating_military" ] }, @@ -359,7 +359,7 @@ { "y": 0, "x": 2, "parts": [ "hdframe_horizontal", "hdhalfboard_horizontal", "plating_military" ] }, { "y": 0, "x": 2, "parts": [ "headlight_reinforced" ] }, { "y": -1, "x": 2, "parts": [ "hdframe_nw", "hdhalfboard_nw", "plating_military" ] }, - { "y": -1, "x": 2, "parts": [ "wheel_armor_steerable" ] }, + { "y": -1, "x": 2, "parts": [ "wheel_mount_heavy_steerable", "wheel_armor" ] }, { "y": 3, "x": 1, "parts": [ "hdframe_vertical", "reinforced_windshield" ] }, { "y": 2, "x": 1, "parts": [ "hdframe_horizontal", "reinforced_windshield" ] }, { "y": 1, "x": 1, "parts": [ "hdframe_horizontal", "reinforced_windshield" ] }, @@ -388,11 +388,19 @@ { "y": 1, "x": -2, "parts": [ "hdframe_horizontal_2", "trunk", "hdroof" ] }, { "y": 0, "x": -2, "parts": [ "hdframe_horizontal_2", "trunk", "hdroof" ] }, { "y": -1, "x": -2, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": 3, "x": -3, "parts": [ "hdframe_se", "hdboard_se", "plating_military", "wheel_armor" ] }, + { + "y": 3, + "x": -3, + "parts": [ "hdframe_se", "hdboard_se", "plating_military", "wheel_mount_heavy", "wheel_armor" ] + }, { "y": 2, "x": -3, "parts": [ "hdframe_horizontal", "hddoor_trunk", "plating_military" ] }, { "y": 1, "x": -3, "parts": [ "hdframe_horizontal", "hddoor_trunk", "plating_military" ] }, { "y": 0, "x": -3, "parts": [ "hdframe_horizontal", "hddoor_trunk", "muffler", "plating_military" ] }, - { "y": -1, "x": -3, "parts": [ "hdframe_sw", "hdboard_sw", "plating_military", "wheel_armor" ] } + { + "y": -1, + "x": -3, + "parts": [ "hdframe_sw", "hdboard_sw", "plating_military", "wheel_mount_heavy", "wheel_armor" ] + } ], "items": [ { "x": 0, "y": 0, "chance": 5, "items": [ "id_military" ] }, @@ -417,7 +425,7 @@ { "y": 0, "x": 3, "parts": [ "hdframe_horizontal_2", "plating_military" ] }, { "y": -1, "x": 3, "parts": [ "hdframe_horizontal", "plating_military" ] }, { "y": 3, "x": 2, "parts": [ "hdframe_ne", "hdhalfboard_ne", "plating_military" ] }, - { "y": 3, "x": 2, "parts": [ "wheel_armor_steerable" ] }, + { "y": 3, "x": 2, "parts": [ "wheel_mount_heavy_steerable", "wheel_armor" ] }, { "y": 2, "x": 2, "parts": [ "hdframe_horizontal", "hdhalfboard_horizontal", "plating_military" ] }, { "y": 2, "x": 2, "parts": [ "headlight_reinforced" ] }, { "y": 1, "x": 2, "parts": [ "hdframe_horizontal", "hdhalfboard_horizontal", "plating_military" ] }, @@ -425,7 +433,7 @@ { "y": 0, "x": 2, "parts": [ "hdframe_horizontal", "hdhalfboard_horizontal", "plating_military" ] }, { "y": 0, "x": 2, "parts": [ "headlight_reinforced" ] }, { "y": -1, "x": 2, "parts": [ "hdframe_nw", "hdhalfboard_nw", "plating_military" ] }, - { "y": -1, "x": 2, "parts": [ "wheel_armor_steerable" ] }, + { "y": -1, "x": 2, "parts": [ "wheel_mount_heavy_steerable", "wheel_armor" ] }, { "y": 3, "x": 1, "parts": [ "hdframe_vertical", "reinforced_windshield" ] }, { "y": 2, "x": 1, "parts": [ "hdframe_horizontal", "reinforced_windshield" ] }, { "y": 1, "x": 1, "parts": [ "hdframe_horizontal", "reinforced_windshield" ] }, @@ -462,11 +470,19 @@ { "y": 1, "x": -2, "parts": [ "hdframe_horizontal_2", "trunk", "hdroof" ] }, { "y": 0, "x": -2, "parts": [ "hdframe_horizontal_2", "trunk", "hdroof" ] }, { "y": -1, "x": -2, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": 3, "x": -3, "parts": [ "hdframe_se", "hdboard_se", "plating_military", "wheel_armor" ] }, + { + "y": 3, + "x": -3, + "parts": [ "hdframe_se", "hdboard_se", "plating_military", "wheel_mount_heavy", "wheel_armor" ] + }, { "y": 2, "x": -3, "parts": [ "hdframe_horizontal", "hddoor_trunk", "plating_military" ] }, { "y": 1, "x": -3, "parts": [ "hdframe_horizontal", "hddoor_trunk", "plating_military" ] }, { "y": 0, "x": -3, "parts": [ "hdframe_horizontal", "hddoor_trunk", "muffler", "plating_military" ] }, - { "y": -1, "x": -3, "parts": [ "hdframe_sw", "hdboard_sw", "plating_military", "wheel_armor" ] } + { + "y": -1, + "x": -3, + "parts": [ "hdframe_sw", "hdboard_sw", "plating_military", "wheel_mount_heavy", "wheel_armor" ] + } ], "items": [ { "x": 0, "y": 0, "chance": 5, "items": [ "id_military" ] }, @@ -491,7 +507,7 @@ { "y": 0, "x": 3, "parts": [ "hdframe_horizontal_2", "plating_spiked" ] }, { "y": -1, "x": 3, "parts": [ "hdframe_nw", "plating_spiked" ] }, { "y": 3, "x": 2, "parts": [ "hdframe_horizontal", "hdhalfboard_ne", "plating_military" ] }, - { "y": 3, "x": 2, "parts": [ "wheel_armor_steerable" ] }, + { "y": 3, "x": 2, "parts": [ "wheel_mount_heavy_steerable", "wheel_armor" ] }, { "y": 2, "x": 2, "parts": [ "hdframe_horizontal", "hdhalfboard_horizontal", "plating_military" ] }, { "y": 2, "x": 2, "parts": [ "headlight_reinforced" ] }, { "y": 1, "x": 2, "parts": [ "hdframe_vertical_2", "hdhalfboard_vertical_2", "plating_military" ] }, @@ -499,7 +515,7 @@ { "y": 0, "x": 2, "parts": [ "hdframe_horizontal", "hdhalfboard_horizontal", "plating_military" ] }, { "y": 0, "x": 2, "parts": [ "headlight_reinforced" ] }, { "y": -1, "x": 2, "parts": [ "hdframe_horizontal", "hdhalfboard_nw", "plating_military" ] }, - { "y": -1, "x": 2, "parts": [ "wheel_armor_steerable" ] }, + { "y": -1, "x": 2, "parts": [ "wheel_mount_heavy_steerable", "wheel_armor" ] }, { "y": 3, "x": 1, "parts": [ "hdframe_vertical", "reinforced_windshield" ] }, { "y": 2, "x": 1, "parts": [ "hdframe_horizontal", "reinforced_windshield" ] }, { "y": 1, "x": 1, "parts": [ "hdframe_horizontal", "reinforced_windshield" ] }, @@ -525,19 +541,19 @@ { "y": 0, "x": -2, "parts": [ "hdframe_vertical_2", "seat" ] }, { "y": -1, "x": -2, "parts": [ "hdframe_vertical", "hdhalfboard_vertical", "plating_military" ] }, { "y": 3, "x": -3, "parts": [ "hdframe_horizontal", "hdhalfboard_vertical", "plating_military" ] }, - { "y": 3, "x": -3, "parts": [ "wheel_armor" ] }, - { "y": 2, "x": -3, "parts": [ "hdframe_horizontal", "seat", "wheel_armor" ] }, + { "y": 3, "x": -3, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, + { "y": 2, "x": -3, "parts": [ "hdframe_horizontal", "seat", "wheel_mount_heavy", "wheel_armor" ] }, { "y": 1, "x": -3, "parts": [ "hdframe_horizontal", "aisle_vertical" ] }, - { "y": 0, "x": -3, "parts": [ "hdframe_horizontal", "seat", "wheel_armor" ] }, + { "y": 0, "x": -3, "parts": [ "hdframe_horizontal", "seat", "wheel_mount_heavy", "wheel_armor" ] }, { "y": -1, "x": -3, "parts": [ "hdframe_horizontal", "hdhalfboard_vertical", "plating_military" ] }, - { "y": -1, "x": -3, "parts": [ "wheel_armor" ] }, + { "y": -1, "x": -3, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 3, "x": -4, "parts": [ "hdframe_horizontal", "hdhalfboard_vertical", "plating_military" ] }, - { "y": 3, "x": -4, "parts": [ "wheel_armor" ] }, - { "y": 2, "x": -4, "parts": [ "hdframe_horizontal", "seat", "wheel_armor" ] }, + { "y": 3, "x": -4, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, + { "y": 2, "x": -4, "parts": [ "hdframe_horizontal", "seat", "wheel_mount_heavy", "wheel_armor" ] }, { "y": 1, "x": -4, "parts": [ "hdframe_horizontal", "aisle_vertical" ] }, - { "y": 0, "x": -4, "parts": [ "hdframe_horizontal", "seat", "wheel_armor" ] }, + { "y": 0, "x": -4, "parts": [ "hdframe_horizontal", "seat", "wheel_mount_heavy", "wheel_armor" ] }, { "y": -1, "x": -4, "parts": [ "hdframe_horizontal", "hdhalfboard_vertical", "plating_military" ] }, - { "y": -1, "x": -4, "parts": [ "wheel_armor" ] }, + { "y": -1, "x": -4, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 3, "x": -5, "parts": [ "hdframe_vertical", "hdhalfboard_vertical", "plating_military" ] }, { "y": 2, "x": -5, "parts": [ "hdframe_vertical_2", "seat" ] }, { "y": 1, "x": -5, "parts": [ "hdframe_horizontal", "aisle_vertical" ] }, diff --git a/data/json/vehicles/test.json b/data/json/vehicles/test.json index ef215ce07f7b4..b5a6640832808 100644 --- a/data/json/vehicles/test.json +++ b/data/json/vehicles/test.json @@ -55,11 +55,19 @@ { "x": 1, "y": 0, "parts": [ "xlframe_horizontal", "windshield" ] }, { "x": 1, "y": 1, "parts": [ "xlframe_horizontal", "windshield" ] }, { "x": 1, "y": 2, "parts": [ "xlframe_horizontal", "windshield" ] }, - { "x": 2, "y": -1, "parts": [ "xlframe_nw", "halfboard_nw", "wheel_steerable", "headlight" ] }, + { + "x": 2, + "y": -1, + "parts": [ "xlframe_nw", "halfboard_nw", "wheel_mount_medium_steerable", "wheel", "headlight" ] + }, { "x": 2, "y": 0, "parts": [ "xlframe_horizontal", "halfboard_nw" ] }, { "x": 2, "y": 0, "part": "engine_electric_large" }, { "x": 2, "y": 1, "parts": [ "xlframe_horizontal", "halfboard_ne" ] }, - { "x": 2, "y": 2, "parts": [ "xlframe_ne", "halfboard_ne", "wheel_steerable", "headlight" ] }, + { + "x": 2, + "y": 2, + "parts": [ "xlframe_ne", "halfboard_ne", "wheel_mount_medium_steerable", "wheel", "headlight" ] + }, { "x": -1, "y": -1, "parts": [ "xlframe_vertical", "door" ] }, { "x": -1, "y": 0, "parts": [ "xlframe_vertical_2", "roof" ] }, { "x": -1, "y": 0, "parts": [ "seat", "seatbelt" ] }, @@ -71,11 +79,11 @@ { "x": -2, "y": 1, "parts": [ "xlframe_vertical", "trunk", "roof", "solar_panel" ] }, { "x": -2, "y": 2, "parts": [ "xlframe_vertical", "halfboard_vertical" ] }, { "x": -3, "y": -1, "parts": [ "xlframe_vertical", "halfboard_vertical" ] }, - { "x": -3, "y": -1, "part": "wheel" }, + { "x": -3, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -3, "y": 0, "parts": [ "xlframe_vertical", "trunk", "roof", "solar_panel" ] }, { "x": -3, "y": 1, "parts": [ "xlframe_vertical", "trunk", "roof", "solar_panel" ] }, { "x": -3, "y": 2, "parts": [ "xlframe_vertical", "halfboard_vertical" ] }, - { "x": -3, "y": 2, "part": "wheel" }, + { "x": -3, "y": 2, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -4, "y": -1, "parts": [ "xlframe_horizontal", "trunk" ] }, { "x": -4, "y": 0, "parts": [ "xlframe_horizontal", "trunk" ] }, { "x": -4, "y": 1, "parts": [ "xlframe_horizontal", "trunk" ] }, @@ -91,10 +99,10 @@ { "x": -7, "y": 0, "parts": [ "reclining_seat", "seatbelt", "storage_battery" ] }, { "x": -7, "y": 0, "parts": [ "controls", "dashboard", "vehicle_clock", "vehicle_alarm" ] }, { "x": -7, "y": -1, "parts": [ "xlframe_horizontal", "halfboard_se", "engine_electric_large" ] }, - { "x": -6, "y": 1, "part": "wheel_steerable" }, - { "x": -6, "y": 0, "part": "wheel_steerable" }, - { "x": -7, "y": 1, "part": "wheel_steerable" }, - { "x": -7, "y": 0, "part": "wheel_steerable" } + { "x": -6, "y": 1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, + { "x": -6, "y": 0, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, + { "x": -7, "y": 1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, + { "x": -7, "y": 0, "parts": [ "wheel_mount_medium_steerable", "wheel" ] } ] }, { @@ -106,12 +114,12 @@ { "x": 0, "y": 0, "parts": [ "seat", "foot_pedals" ] }, { "x": 0, "y": 1, "parts": [ "frame_vertical", "bed" ] }, { "x": 0, "y": 2, "parts": [ "frame_vertical", "bed" ] }, - { "x": 1, "y": 2, "parts": [ "frame_vertical", "bed", "wheel_steerable" ] }, - { "x": -1, "y": 2, "parts": [ "frame_vertical", "bed", "wheel_steerable" ] }, + { "x": 1, "y": 2, "parts": [ "frame_vertical", "bed", "wheel_mount_medium_steerable", "wheel" ] }, + { "x": -1, "y": 2, "parts": [ "frame_vertical", "bed", "wheel_mount_medium_steerable", "wheel" ] }, { "x": 0, "y": -1, "parts": [ "frame_vertical", "seat" ] }, { "x": 0, "y": -2, "parts": [ "frame_vertical", "seat" ] }, - { "x": 1, "y": -2, "parts": [ "frame_vertical", "seat", "wheel_steerable" ] }, - { "x": -1, "y": -2, "parts": [ "frame_vertical", "seat", "wheel_steerable" ] }, + { "x": 1, "y": -2, "parts": [ "frame_vertical", "seat", "wheel_mount_medium_steerable", "wheel" ] }, + { "x": -1, "y": -2, "parts": [ "frame_vertical", "seat", "wheel_mount_medium_steerable", "wheel" ] }, { "x": 1, "y": 0, "parts": [ "frame_vertical", "door" ] }, { "x": -1, "y": 0, "parts": [ "frame_vertical", "engine_electric", "storage_battery" ] } ] diff --git a/data/json/vehicles/trucks.json b/data/json/vehicles/trucks.json index 19a7d96962a92..14ead2c9e8105 100644 --- a/data/json/vehicles/trucks.json +++ b/data/json/vehicles/trucks.json @@ -52,11 +52,11 @@ { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, { "x": 2, "y": -1, "part": "headlight" }, - { "x": 2, "y": -1, "part": "wheel_wide_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": 2, "y": 3, "part": "frame_ne" }, { "x": 2, "y": 3, "part": "halfboard_ne" }, { "x": 2, "y": 3, "part": "headlight" }, - { "x": 2, "y": 3, "part": "wheel_wide_steerable" }, + { "x": 2, "y": 3, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": -1, "y": 0, "part": "frame_horizontal" }, { "x": -1, "y": 0, "part": "windshield" }, { "x": -1, "y": 1, "part": "frame_horizontal" }, @@ -127,10 +127,10 @@ { "x": -7, "y": 2, "part": "cargo_space" }, { "x": -7, "y": -1, "part": "frame_vertical" }, { "x": -7, "y": -1, "part": "halfboard_vertical" }, - { "x": -7, "y": -1, "part": "wheel_wide" }, + { "x": -7, "y": -1, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -7, "y": 3, "part": "frame_vertical" }, { "x": -7, "y": 3, "part": "halfboard_vertical" }, - { "x": -7, "y": 3, "part": "wheel_wide" }, + { "x": -7, "y": 3, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -8, "y": 0, "part": "frame_horizontal" }, { "x": -8, "y": 0, "part": "cargo_space" }, { "x": -8, "y": 1, "part": "frame_horizontal" }, @@ -206,11 +206,11 @@ { "x": 2, "y": 1, "part": "halfboard_horizontal" }, { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, - { "x": 2, "y": -1, "part": "wheel_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": -1, "part": "headlight" }, { "x": 2, "y": 2, "part": "frame_ne" }, { "x": 2, "y": 2, "part": "halfboard_ne" }, - { "x": 2, "y": 2, "part": "wheel_steerable" }, + { "x": 2, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": 2, "part": "headlight" }, { "x": -2, "y": 0, "part": "frame_vertical" }, { "x": -2, "y": 0, "part": "cargo_space" }, @@ -233,10 +233,10 @@ { "x": -3, "y": 1, "part": "roof" }, { "x": -3, "y": -1, "part": "frame_vertical" }, { "x": -3, "y": -1, "part": "halfboard_vertical" }, - { "x": -3, "y": -1, "part": "wheel" }, + { "x": -3, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -3, "y": 2, "part": "frame_vertical" }, { "x": -3, "y": 2, "part": "halfboard_vertical" }, - { "x": -3, "y": 2, "part": "wheel" }, + { "x": -3, "y": 2, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -4, "y": -1, "part": "frame_horizontal" }, { "x": -4, "y": -1, "part": "halfboard_sw" }, { "x": -4, "y": 0, "part": "frame_horizontal" }, @@ -365,13 +365,13 @@ { "x": -5, "y": 2, "part": "hdframe_cross" }, { "x": -5, "y": 1, "part": "hdframe_cross" }, { "x": -5, "y": 3, "part": "hdframe_horizontal" }, - { "x": -5, "y": 3, "part": "wheel_wide" }, + { "x": -5, "y": 3, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -5, "y": 0, "part": "hdframe_horizontal" }, - { "x": -5, "y": 0, "part": "wheel_wide" }, + { "x": -5, "y": 0, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -5, "y": 4, "part": "hdframe_horizontal" }, - { "x": -5, "y": 4, "part": "wheel_wide" }, + { "x": -5, "y": 4, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -5, "y": -1, "part": "hdframe_horizontal" }, - { "x": -5, "y": -1, "part": "wheel_wide" }, + { "x": -5, "y": -1, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": 2, "y": 2, "part": "hdframe_vertical_2" }, { "x": 2, "y": 2, "part": "halfboard_vertical_2" }, { "x": 2, "y": 1, "part": "hdframe_vertical_2" }, @@ -385,20 +385,20 @@ { "x": 2, "y": 0, "part": "halfboard_horizontal" }, { "x": 2, "y": 4, "part": "hdframe_vertical" }, { "x": 2, "y": 4, "part": "halfboard_vertical" }, - { "x": 2, "y": 4, "part": "wheel_wide_steerable" }, + { "x": 2, "y": 4, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": 2, "y": -1, "part": "hdframe_vertical" }, { "x": 2, "y": -1, "part": "halfboard_vertical" }, - { "x": 2, "y": -1, "part": "wheel_wide_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": -6, "y": 2, "part": "hdframe_cross" }, { "x": -6, "y": 1, "part": "hdframe_cross" }, { "x": -6, "y": 3, "part": "hdframe_horizontal" }, - { "x": -6, "y": 3, "part": "wheel_wide" }, + { "x": -6, "y": 3, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -6, "y": 0, "part": "hdframe_horizontal" }, - { "x": -6, "y": 0, "part": "wheel_wide" }, + { "x": -6, "y": 0, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -6, "y": 4, "part": "hdframe_horizontal" }, - { "x": -6, "y": 4, "part": "wheel_wide" }, + { "x": -6, "y": 4, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -6, "y": -1, "part": "hdframe_horizontal" }, - { "x": -6, "y": -1, "part": "wheel_wide" }, + { "x": -6, "y": -1, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": 3, "y": 2, "part": "hdframe_cover" }, { "x": 3, "y": 2, "part": "halfboard_cover" }, { "x": 3, "y": 1, "part": "hdframe_cover" }, @@ -476,19 +476,19 @@ { "x": -1, "y": -1, "part": "cargo_space" }, { "x": -1, "y": -1, "part": "roof" }, { "x": -1, "y": 1, "part": "hdframe_horizontal" }, - { "x": -1, "y": 1, "part": "wheel_wide" }, + { "x": -1, "y": 1, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -1, "y": 1, "part": "cargo_space" }, { "x": -1, "y": 1, "part": "roof" }, { "x": -1, "y": -2, "part": "hdframe_horizontal" }, - { "x": -1, "y": -2, "part": "wheel_wide" }, + { "x": -1, "y": -2, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -1, "y": -2, "part": "cargo_space" }, { "x": -1, "y": -2, "part": "roof" }, { "x": -1, "y": 2, "part": "hdframe_horizontal" }, { "x": -1, "y": 2, "part": "board_vertical" }, - { "x": -1, "y": 2, "part": "wheel_wide" }, + { "x": -1, "y": 2, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -1, "y": -3, "part": "hdframe_horizontal" }, { "x": -1, "y": -3, "part": "board_vertical" }, - { "x": -1, "y": -3, "part": "wheel_wide" }, + { "x": -1, "y": -3, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": 2, "y": 0, "part": "hdframe_horizontal" }, { "x": 2, "y": 0, "part": "cargo_space" }, { "x": 2, "y": 0, "part": "roof" }, @@ -512,19 +512,19 @@ { "x": -2, "y": -1, "part": "cargo_space" }, { "x": -2, "y": -1, "part": "roof" }, { "x": -2, "y": 1, "part": "hdframe_horizontal" }, - { "x": -2, "y": 1, "part": "wheel_wide" }, + { "x": -2, "y": 1, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -2, "y": 1, "part": "cargo_space" }, { "x": -2, "y": 1, "part": "roof" }, { "x": -2, "y": -2, "part": "hdframe_horizontal" }, - { "x": -2, "y": -2, "part": "wheel_wide" }, + { "x": -2, "y": -2, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -2, "y": -2, "part": "cargo_space" }, { "x": -2, "y": -2, "part": "roof" }, { "x": -2, "y": 2, "part": "hdframe_horizontal" }, { "x": -2, "y": 2, "part": "board_vertical" }, - { "x": -2, "y": 2, "part": "wheel_wide" }, + { "x": -2, "y": 2, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -2, "y": -3, "part": "hdframe_horizontal" }, { "x": -2, "y": -3, "part": "board_vertical" }, - { "x": -2, "y": -3, "part": "wheel_wide" }, + { "x": -2, "y": -3, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": 3, "y": 0, "part": "hdframe_horizontal" }, { "x": 3, "y": 0, "part": "cargo_space" }, { "x": 3, "y": 0, "part": "roof" }, @@ -716,11 +716,11 @@ { "x": -3, "y": 2, "part": "roof_cloth" }, { "x": -3, "y": -1, "part": "hdframe_horizontal" }, { "x": -3, "y": -1, "part": "clothboard_vertical" }, - { "x": -3, "y": -1, "part": "wheel_wide" }, + { "x": -3, "y": -1, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -3, "y": -1, "part": "roof_cloth" }, { "x": -3, "y": 3, "part": "hdframe_horizontal" }, { "x": -3, "y": 3, "part": "clothboard_vertical" }, - { "x": -3, "y": 3, "part": "wheel_wide" }, + { "x": -3, "y": 3, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -3, "y": 3, "part": "roof_cloth" }, { "x": 2, "y": 1, "part": "hdframe_horizontal" }, { "x": 2, "y": 1, "part": "hdhalfboard_horizontal" }, @@ -735,10 +735,10 @@ { "x": 2, "y": 2, "part": "headlight_reinforced" }, { "x": 2, "y": -1, "part": "hdframe_horizontal" }, { "x": 2, "y": -1, "part": "hdhalfboard_nw" }, - { "x": 2, "y": -1, "part": "wheel_wide_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": 2, "y": 3, "part": "hdframe_horizontal" }, { "x": 2, "y": 3, "part": "hdhalfboard_ne" }, - { "x": 2, "y": 3, "part": "wheel_wide_steerable" }, + { "x": 2, "y": 3, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": -4, "y": 1, "part": "hdframe_horizontal" }, { "x": -4, "y": 1, "part": "wooden_aisle_vertical" }, { "x": -4, "y": 1, "part": "roof_cloth" }, @@ -750,11 +750,11 @@ { "x": -4, "y": 2, "part": "roof_cloth" }, { "x": -4, "y": -1, "part": "hdframe_horizontal" }, { "x": -4, "y": -1, "part": "clothboard_vertical" }, - { "x": -4, "y": -1, "part": "wheel_wide" }, + { "x": -4, "y": -1, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -4, "y": -1, "part": "roof_cloth" }, { "x": -4, "y": 3, "part": "hdframe_horizontal" }, { "x": -4, "y": 3, "part": "clothboard_vertical" }, - { "x": -4, "y": 3, "part": "wheel_wide" }, + { "x": -4, "y": 3, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -4, "y": 3, "part": "roof_cloth" }, { "x": 3, "y": 1, "part": "frame_horizontal_2" }, { "x": 3, "y": 0, "part": "frame_horizontal_2" }, @@ -836,11 +836,11 @@ { "x": 2, "y": 1, "part": "halfboard_horizontal" }, { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, - { "x": 2, "y": -1, "part": "wheel_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": -1, "part": "headlight" }, { "x": 2, "y": 2, "part": "frame_ne" }, { "x": 2, "y": 2, "part": "halfboard_ne" }, - { "x": 2, "y": 2, "part": "wheel_steerable" }, + { "x": 2, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": 2, "part": "headlight" }, { "x": -2, "y": 0, "part": "frame_vertical" }, { "x": -2, "y": 0, "part": "animal_compartment" }, @@ -863,10 +863,10 @@ { "x": -3, "y": 1, "part": "roof" }, { "x": -3, "y": -1, "part": "frame_vertical" }, { "x": -3, "y": -1, "part": "hatch" }, - { "x": -3, "y": -1, "part": "wheel" }, + { "x": -3, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -3, "y": 2, "part": "frame_vertical" }, { "x": -3, "y": 2, "part": "hatch" }, - { "x": -3, "y": 2, "part": "wheel" }, + { "x": -3, "y": 2, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -4, "y": -1, "part": "frame_horizontal" }, { "x": -4, "y": -1, "part": "halfboard_sw" }, { "x": -4, "y": 0, "part": "frame_horizontal" }, diff --git a/data/json/vehicles/utility.json b/data/json/vehicles/utility.json index cb0355e35c75a..2ae1439ad32fc 100644 --- a/data/json/vehicles/utility.json +++ b/data/json/vehicles/utility.json @@ -23,7 +23,7 @@ { "x": 1, "y": 0, "part": "headlight" }, { "x": 1, "y": 0, "part": "omnicam" }, { "x": -2, "y": -1, "part": "frame_horizontal" }, - { "x": -2, "y": -1, "part": "wheel_steerable" }, + { "x": -2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": -2, "y": -1, "part": "storage_battery_mount" }, { "x": -2, "y": -1, "part": "storage_battery_removable" }, { "x": -2, "y": -1, "part": "board_sw" }, @@ -32,10 +32,10 @@ { "x": 0, "y": -1, "part": "frame_vertical" }, { "x": 0, "y": -1, "part": "board_vertical" }, { "x": 1, "y": -1, "part": "frame_horizontal" }, - { "x": 1, "y": -1, "part": "wheel_steerable" }, + { "x": 1, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 1, "y": -1, "part": "board_nw" }, { "x": -2, "y": 1, "part": "frame_horizontal" }, - { "x": -2, "y": 1, "part": "wheel_steerable" }, + { "x": -2, "y": 1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": -2, "y": 1, "part": "storage_battery_mount" }, { "x": -2, "y": 1, "part": "storage_battery_removable" }, { "x": -2, "y": 1, "part": "board_se" }, @@ -44,7 +44,7 @@ { "x": 0, "y": 1, "part": "frame_vertical" }, { "x": 0, "y": 1, "part": "board_vertical" }, { "x": 1, "y": 1, "part": "frame_horizontal" }, - { "x": 1, "y": 1, "part": "wheel_steerable" }, + { "x": 1, "y": 1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 1, "y": 1, "part": "board_ne" } ], "items": [ @@ -82,10 +82,10 @@ { "x": 1, "y": -1, "part": "roof" }, { "x": 1, "y": 0, "part": "roof" }, { "x": 1, "y": 1, "part": "roof" }, - { "x": -1, "y": -1, "part": "wheel" }, - { "x": -1, "y": 1, "part": "wheel" }, - { "x": 1, "y": -1, "part": "wheel_steerable" }, - { "x": 1, "y": 1, "part": "wheel_steerable" }, + { "x": -1, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] }, + { "x": -1, "y": 1, "parts": [ "wheel_mount_medium", "wheel" ] }, + { "x": 1, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, + { "x": 1, "y": 1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": -1, "y": -1, "part": "board_sw" }, { "x": -1, "y": 0, "part": "hatch" }, { "x": -1, "y": 1, "part": "board_se" }, @@ -122,12 +122,12 @@ { "x": 0, "y": 0, "part": "small_storage_battery" }, { "x": 0, "y": 0, "part": "engine_vtwin" }, { "x": 0, "y": 0, "part": "generator_7500w" }, - { "x": 0, "y": 0, "part": "wheel_small" }, + { "x": 0, "y": 0, "parts": [ "wheel_mount_light", "wheel_small" ] }, { "x": 1, "y": 0, "part": "frame_cover" }, { "x": 1, "y": 0, "part": "tank_small", "fuel": "gasoline" }, { "x": 1, "y": 0, "part": "stowboard_vertical" }, { "x": 1, "y": 0, "part": "controls" }, - { "x": 1, "y": 0, "part": "wheel_small" } + { "x": 1, "y": 0, "parts": [ "wheel_mount_light", "wheel_small" ] } ], "items": [ { "x": 1, "y": 0, "chance": 50, "items": [ "jumper_cable" ] }, @@ -248,10 +248,10 @@ "parts": [ { "x": -1, "y": 0, "part": "frame_sw" }, { "x": -1, "y": 0, "part": "halfboard_sw" }, - { "x": -1, "y": 0, "part": "wheel_small_steerable" }, + { "x": -1, "y": 0, "parts": [ "wheel_mount_light_steerable", "wheel_small" ] }, { "x": -1, "y": 1, "part": "frame_se" }, { "x": -1, "y": 1, "part": "halfboard_se" }, - { "x": -1, "y": 1, "part": "wheel_small_steerable" }, + { "x": -1, "y": 1, "parts": [ "wheel_mount_light_steerable", "wheel_small" ] }, { "x": 0, "y": 0, "part": "frame_horizontal" }, { "x": 0, "y": 0, "part": "seat" }, { "x": 0, "y": 0, "part": "roof" }, @@ -264,10 +264,10 @@ { "x": 0, "y": 1, "part": "storage_battery" }, { "x": 1, "y": 0, "part": "frame_nw" }, { "x": 1, "y": 0, "part": "halfboard_nw" }, - { "x": 1, "y": 0, "part": "wheel_small_steerable" }, + { "x": 1, "y": 0, "parts": [ "wheel_mount_light_steerable", "wheel_small" ] }, { "x": 1, "y": 1, "part": "frame_ne" }, { "x": 1, "y": 1, "part": "halfboard_ne" }, - { "x": 1, "y": 1, "part": "wheel_small_steerable" }, + { "x": 1, "y": 1, "parts": [ "wheel_mount_light_steerable", "wheel_small" ] }, { "x": 2, "y": 0, "part": "forklift_fork" }, { "x": 2, "y": 1, "part": "forklift_fork" } ], @@ -307,10 +307,10 @@ { "x": 1, "y": -1, "part": "roof" }, { "x": 1, "y": 0, "part": "roof" }, { "x": 1, "y": 1, "part": "roof" }, - { "x": -1, "y": -1, "part": "wheel_wide_or" }, - { "x": -1, "y": 1, "part": "wheel_wide_or" }, - { "x": 1, "y": -1, "part": "wheel_wide_or_steerable" }, - { "x": 1, "y": 1, "part": "wheel_wide_or_steerable" }, + { "x": -1, "y": -1, "parts": [ "wheel_mount_medium", "wheel_wide_or" ] }, + { "x": -1, "y": 1, "parts": [ "wheel_mount_medium", "wheel_wide_or" ] }, + { "x": 1, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel_wide_or" ] }, + { "x": 1, "y": 1, "parts": [ "wheel_mount_medium_steerable", "wheel_wide_or" ] }, { "x": -1, "y": -1, "part": "board_sw" }, { "x": -1, "y": 0, "part": "hatch" }, { "x": -1, "y": 1, "part": "board_se" }, diff --git a/data/json/vehicles/vans_busses.json b/data/json/vehicles/vans_busses.json index 4519e3b44cd2c..fb412c45ec012 100644 --- a/data/json/vehicles/vans_busses.json +++ b/data/json/vehicles/vans_busses.json @@ -61,7 +61,7 @@ { "x": 2, "y": 3, "part": "hdframe_ne" }, { "x": 2, "y": 3, "part": "hdhalfboard_ne" }, { "x": 2, "y": 3, "part": "plating_steel" }, - { "x": 2, "y": 3, "part": "wheel_armor_steerable" }, + { "x": 2, "y": 3, "parts": [ "wheel_mount_heavy_steerable", "wheel_armor" ] }, { "x": 2, "y": 0, "part": "hdframe_horizontal" }, { "x": 2, "y": 0, "part": "hdhalfboard_horizontal" }, { "x": 2, "y": 0, "part": "plating_steel" }, @@ -69,7 +69,7 @@ { "x": 2, "y": -1, "part": "hdframe_nw" }, { "x": 2, "y": -1, "part": "hdhalfboard_nw" }, { "x": 2, "y": -1, "part": "plating_steel" }, - { "x": 2, "y": -1, "part": "wheel_armor_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_heavy_steerable", "wheel_armor" ] }, { "x": 3, "y": 1, "part": "hdframe_cover" }, { "x": 3, "y": 1, "part": "plating_spiked" }, { "x": 3, "y": 2, "part": "hdframe_cover" }, @@ -124,14 +124,14 @@ { "x": -3, "y": 3, "part": "hdframe_se" }, { "x": -3, "y": 3, "part": "hdboard_se" }, { "x": -3, "y": 3, "part": "plating_steel" }, - { "x": -3, "y": 3, "part": "wheel_armor" }, + { "x": -3, "y": 3, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "x": -3, "y": 0, "part": "hdframe_horizontal" }, { "x": -3, "y": 0, "part": "hdboard_horizontal" }, { "x": -3, "y": 0, "part": "plating_steel" }, { "x": -3, "y": -1, "part": "hdframe_sw" }, { "x": -3, "y": -1, "part": "hdboard_sw" }, { "x": -3, "y": -1, "part": "plating_steel" }, - { "x": -3, "y": -1, "part": "wheel_armor" } + { "x": -3, "y": -1, "parts": [ "wheel_mount_heavy", "wheel_armor" ] } ] }, { @@ -191,11 +191,11 @@ { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, { "x": 2, "y": -1, "part": "headlight" }, - { "x": 2, "y": -1, "part": "wheel_wide_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": 2, "y": 3, "part": "frame_ne" }, { "x": 2, "y": 3, "part": "halfboard_ne" }, { "x": 2, "y": 3, "part": "headlight" }, - { "x": 2, "y": 3, "part": "wheel_wide_steerable" }, + { "x": 2, "y": 3, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": -1, "y": 0, "part": "frame_horizontal" }, { "x": -1, "y": 0, "part": "board_horizontal" }, { "x": -1, "y": 1, "part": "frame_horizontal" }, @@ -249,11 +249,11 @@ { "x": -4, "y": 2, "part": "roof" }, { "x": -4, "y": -1, "part": "frame_vertical" }, { "x": -4, "y": -1, "part": "board_vertical" }, - { "x": -4, "y": -1, "part": "wheel_wide" }, + { "x": -4, "y": -1, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -4, "y": -1, "part": "roof" }, { "x": -4, "y": 3, "part": "frame_vertical" }, { "x": -4, "y": 3, "part": "board_vertical" }, - { "x": -4, "y": 3, "part": "wheel_wide" }, + { "x": -4, "y": 3, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -4, "y": 3, "part": "roof" }, { "x": -5, "y": 0, "part": "frame_horizontal" }, { "x": -5, "y": 0, "part": "door_shutter" }, @@ -340,11 +340,11 @@ { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, { "x": 2, "y": -1, "part": "headlight" }, - { "x": 2, "y": -1, "part": "wheel_wide_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": 2, "y": 3, "part": "frame_ne" }, { "x": 2, "y": 3, "part": "halfboard_ne" }, { "x": 2, "y": 3, "part": "headlight" }, - { "x": 2, "y": 3, "part": "wheel_wide_steerable" }, + { "x": 2, "y": 3, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": -1, "y": 0, "part": "frame_horizontal" }, { "x": -1, "y": 0, "part": "board_horizontal" }, { "x": -1, "y": 1, "part": "frame_horizontal" }, @@ -398,11 +398,11 @@ { "x": -4, "y": 2, "part": "roof" }, { "x": -4, "y": -1, "part": "frame_vertical" }, { "x": -4, "y": -1, "part": "board_vertical" }, - { "x": -4, "y": -1, "part": "wheel_wide" }, + { "x": -4, "y": -1, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -4, "y": -1, "part": "roof" }, { "x": -4, "y": 3, "part": "frame_vertical" }, { "x": -4, "y": 3, "part": "board_vertical" }, - { "x": -4, "y": 3, "part": "wheel_wide" }, + { "x": -4, "y": 3, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -4, "y": 3, "part": "roof" }, { "x": -5, "y": 0, "part": "frame_horizontal" }, { "x": -5, "y": 0, "part": "door_shutter" }, @@ -501,11 +501,11 @@ { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, { "x": 2, "y": -1, "part": "headlight" }, - { "x": 2, "y": -1, "part": "wheel_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": 2, "part": "frame_ne" }, { "x": 2, "y": 2, "part": "halfboard_ne" }, { "x": 2, "y": 2, "part": "headlight" }, - { "x": 2, "y": 2, "part": "wheel_steerable" }, + { "x": 2, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": -3, "y": 0, "part": "frame_vertical" }, { "x": -3, "y": 0, "part": "trunk" }, { "x": -3, "y": 0, "part": "muffler" }, @@ -522,7 +522,7 @@ { "x": -3, "y": 2, "part": "roof" }, { "x": -4, "y": -1, "part": "frame_sw" }, { "x": -4, "y": -1, "part": "board_sw" }, - { "x": -4, "y": -1, "part": "wheel" }, + { "x": -4, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -4, "y": -1, "part": "roof" }, { "x": -4, "y": 0, "part": "frame_horizontal" }, { "x": -4, "y": 0, "part": "door_trunk" }, @@ -532,7 +532,7 @@ { "x": -4, "y": 1, "part": "roof" }, { "x": -4, "y": 2, "part": "frame_se" }, { "x": -4, "y": 2, "part": "board_se" }, - { "x": -4, "y": 2, "part": "wheel" }, + { "x": -4, "y": 2, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -4, "y": 2, "part": "roof" } ], "items": [ @@ -598,7 +598,7 @@ { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, { "x": 2, "y": -1, "part": "headlight" }, - { "x": 2, "y": -1, "part": "wheel_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": 1, "part": "frame_cover" }, { "x": 2, "y": 1, "part": "halfboard_cover" }, { "x": 2, "y": 1, "part": "engine_v6" }, @@ -609,7 +609,7 @@ { "x": 2, "y": 3, "part": "frame_ne" }, { "x": 2, "y": 3, "part": "halfboard_ne" }, { "x": 2, "y": 3, "part": "headlight" }, - { "x": 2, "y": 3, "part": "wheel_steerable" }, + { "x": 2, "y": 3, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": -1, "y": 0, "part": "frame_vertical_2" }, { "x": -1, "y": 0, "part": "box" }, { "x": -1, "y": 0, "part": "roof" }, @@ -657,7 +657,7 @@ { "x": -4, "y": 0, "part": "roof" }, { "x": -4, "y": -1, "part": "frame_sw" }, { "x": -4, "y": -1, "part": "board_sw" }, - { "x": -4, "y": -1, "part": "wheel" }, + { "x": -4, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -4, "y": -1, "part": "roof" }, { "x": -4, "y": 1, "part": "frame_horizontal" }, { "x": -4, "y": 1, "part": "door" }, @@ -668,7 +668,7 @@ { "x": -4, "y": 2, "part": "roof" }, { "x": -4, "y": 3, "part": "frame_se" }, { "x": -4, "y": 3, "part": "board_se" }, - { "x": -4, "y": 3, "part": "wheel" }, + { "x": -4, "y": 3, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -4, "y": 3, "part": "roof" } ], "items": [ @@ -709,7 +709,7 @@ { "x": 1, "y": 3, "part": "windshield" }, { "x": 1, "y": 4, "part": "wing_mirror" }, { "x": 0, "y": -1, "part": "frame_vertical" }, - { "x": 0, "y": -1, "part": "wheel_wide_steerable" }, + { "x": 0, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": 0, "y": -1, "part": "door" }, { "x": 0, "y": 0, "part": "frame_vertical_2" }, { "x": 0, "y": 0, "part": "reclining_seat" }, @@ -732,7 +732,7 @@ { "x": 0, "y": 2, "part": "seatbelt" }, { "x": 0, "y": 2, "part": "roof" }, { "x": 0, "y": 3, "part": "frame_vertical" }, - { "x": 0, "y": 3, "part": "wheel_wide_steerable" }, + { "x": 0, "y": 3, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": 0, "y": 3, "part": "door" }, { "x": -1, "y": -1, "part": "frame_vertical" }, { "x": -1, "y": -1, "part": "board_vertical" }, @@ -834,7 +834,7 @@ { "x": -7, "y": 3, "part": "frame_vertical" }, { "x": -7, "y": 3, "part": "stowboard_vertical" }, { "x": -8, "y": -1, "part": "frame_vertical" }, - { "x": -8, "y": -1, "part": "wheel_wide" }, + { "x": -8, "y": -1, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -8, "y": -1, "part": "windshield" }, { "x": -8, "y": -1, "part": "v_curtain" }, { "x": -8, "y": -1, "part": "tank", "fuel": "diesel" }, @@ -848,12 +848,12 @@ { "x": -8, "y": 2, "part": "bed" }, { "x": -8, "y": 2, "part": "roof" }, { "x": -8, "y": 3, "part": "frame_vertical" }, - { "x": -8, "y": 3, "part": "wheel_wide" }, + { "x": -8, "y": 3, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -8, "y": 3, "part": "windshield" }, { "x": -8, "y": 3, "part": "v_curtain" }, { "x": -8, "y": 3, "part": "tank", "fuel": "diesel" }, { "x": -9, "y": -1, "part": "frame_sw" }, - { "x": -9, "y": -1, "part": "wheel_wide" }, + { "x": -9, "y": -1, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -9, "y": -1, "part": "board_sw" }, { "x": -9, "y": -1, "part": "solar_panel" }, { "x": -9, "y": 0, "part": "frame_horizontal" }, @@ -868,7 +868,7 @@ { "x": -9, "y": 2, "part": "board_horizontal" }, { "x": -9, "y": 2, "part": "solar_panel" }, { "x": -9, "y": 3, "part": "frame_se" }, - { "x": -9, "y": 3, "part": "wheel_wide" }, + { "x": -9, "y": 3, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -9, "y": 3, "part": "board_se" }, { "x": -9, "y": 3, "part": "solar_panel" } ], @@ -955,10 +955,10 @@ { "x": 2, "y": 0, "part": "headlight" }, { "x": 2, "y": 3, "part": "frame_ne" }, { "x": 2, "y": 3, "part": "halfboard_ne" }, - { "x": 2, "y": 3, "part": "wheel_wide_steerable" }, + { "x": 2, "y": 3, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, - { "x": 2, "y": -1, "part": "wheel_wide_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": -1, "y": 1, "part": "frame_vertical_2" }, { "x": -1, "y": 1, "part": "door_internal" }, { "x": -1, "y": 1, "part": "roof" }, @@ -1016,12 +1016,12 @@ { "x": -4, "y": 0, "part": "roof" }, { "x": -4, "y": 3, "part": "frame_vertical" }, { "x": -4, "y": 3, "part": "board_vertical" }, - { "x": -4, "y": 3, "part": "wheel_wide" }, + { "x": -4, "y": 3, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -4, "y": 3, "part": "roof" }, { "x": -4, "y": -1, "part": "frame_vertical" }, { "x": -4, "y": -1, "part": "board_vertical" }, { "x": -4, "y": -1, "part": "storage_battery" }, - { "x": -4, "y": -1, "part": "wheel_wide" }, + { "x": -4, "y": -1, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -4, "y": -1, "part": "roof" }, { "x": -5, "y": 1, "part": "frame_vertical_2" }, { "x": -5, "y": 1, "part": "lit_aisle_vertical" }, @@ -1034,12 +1034,12 @@ { "x": -5, "y": 0, "part": "roof" }, { "x": -5, "y": 3, "part": "frame_vertical" }, { "x": -5, "y": 3, "part": "board_vertical" }, - { "x": -5, "y": 3, "part": "wheel_wide" }, + { "x": -5, "y": 3, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -5, "y": 3, "part": "roof" }, { "x": -5, "y": -1, "part": "frame_vertical" }, { "x": -5, "y": -1, "part": "board_vertical" }, { "x": -5, "y": -1, "part": "tank", "fuel": "gasoline" }, - { "x": -5, "y": -1, "part": "wheel_wide" }, + { "x": -5, "y": -1, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -5, "y": -1, "part": "roof" }, { "x": -6, "y": 1, "part": "frame_horizontal" }, { "x": -6, "y": 1, "part": "board_horizontal" }, @@ -1158,10 +1158,10 @@ { "x": 2, "y": 0, "part": "headlight" }, { "x": 2, "y": 3, "part": "frame_ne" }, { "x": 2, "y": 3, "part": "halfboard_ne" }, - { "x": 2, "y": 3, "part": "wheel_wide_steerable" }, + { "x": 2, "y": 3, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, - { "x": 2, "y": -1, "part": "wheel_wide_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": -1, "y": 1, "part": "frame_vertical_2" }, { "x": -1, "y": 1, "part": "door_internal" }, { "x": -1, "y": 1, "part": "roof" }, @@ -1220,12 +1220,12 @@ { "x": -4, "y": 0, "part": "roof" }, { "x": -4, "y": 3, "part": "frame_vertical" }, { "x": -4, "y": 3, "part": "board_vertical" }, - { "x": -4, "y": 3, "part": "wheel_wide" }, + { "x": -4, "y": 3, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -4, "y": 3, "part": "roof" }, { "x": -4, "y": -1, "part": "frame_vertical" }, { "x": -4, "y": -1, "part": "board_vertical" }, { "x": -4, "y": -1, "part": "storage_battery" }, - { "x": -4, "y": -1, "part": "wheel_wide" }, + { "x": -4, "y": -1, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -4, "y": -1, "part": "roof" }, { "x": -5, "y": 1, "part": "frame_vertical_2" }, { "x": -5, "y": 1, "part": "lit_aisle_vertical" }, @@ -1239,12 +1239,12 @@ { "x": -5, "y": 0, "part": "roof" }, { "x": -5, "y": 3, "part": "frame_vertical" }, { "x": -5, "y": 3, "part": "board_vertical" }, - { "x": -5, "y": 3, "part": "wheel_wide" }, + { "x": -5, "y": 3, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -5, "y": 3, "part": "roof" }, { "x": -5, "y": -1, "part": "frame_vertical" }, { "x": -5, "y": -1, "part": "board_vertical" }, { "x": -5, "y": -1, "part": "tank", "fuel": "gasoline" }, - { "x": -5, "y": -1, "part": "wheel_wide" }, + { "x": -5, "y": -1, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -5, "y": -1, "part": "roof" }, { "x": -6, "y": 1, "part": "frame_horizontal" }, { "x": -6, "y": 1, "part": "board_horizontal" }, @@ -1304,8 +1304,16 @@ { "x": 2, "y": 0, "parts": [ "engine_v6", "alternator_car", "battery_car" ] }, { "x": 2, "y": 1, "parts": [ "frame_horizontal", "halfboard_horizontal" ] }, { "x": 2, "y": 1, "part": "tank", "fuel": "gasoline" }, - { "x": 2, "y": -1, "parts": [ "frame_nw", "halfboard_nw", "headlight", "wheel_steerable" ] }, - { "x": 2, "y": 2, "parts": [ "frame_ne", "halfboard_ne", "headlight", "wheel_steerable" ] }, + { + "x": 2, + "y": -1, + "parts": [ "frame_nw", "halfboard_nw", "headlight", "wheel_mount_medium_steerable", "wheel" ] + }, + { + "x": 2, + "y": 2, + "parts": [ "frame_ne", "halfboard_ne", "headlight", "wheel_mount_medium_steerable", "wheel" ] + }, { "x": -1, "y": 0, "parts": [ "frame_horizontal", "windshield", "v_curtain", "door_motor" ] }, { "x": -1, "y": 1, "parts": [ "frame_horizontal", "windshield", "v_curtain", "door_motor" ] }, { "x": -1, "y": -1, "parts": [ "frame_vertical", "halfboard_vertical" ] }, @@ -1336,8 +1344,8 @@ { "x": -6, "y": 2, "parts": [ "frame_vertical", "halfboard_vertical" ] }, { "x": -7, "y": 0, "parts": [ "frame_horizontal", "door_trunk", "door_motor" ] }, { "x": -7, "y": 1, "parts": [ "frame_horizontal", "door_trunk", "door_motor" ] }, - { "x": -7, "y": -1, "parts": [ "frame_sw", "halfboard_sw", "wheel", "roof" ] }, - { "x": -7, "y": 2, "parts": [ "frame_se", "halfboard_se", "wheel", "roof" ] } + { "x": -7, "y": -1, "parts": [ "frame_sw", "halfboard_sw", "wheel_mount_medium", "wheel", "roof" ] }, + { "x": -7, "y": 2, "parts": [ "frame_se", "halfboard_se", "wheel_mount_medium", "wheel", "roof" ] } ], "items": [ { "x": -6, "y": 1, "chance": 80, "item_groups": "ammo_light_batteries_full" }, @@ -1399,7 +1407,7 @@ { "x": 1, "y": 3, "part": "windshield" }, { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, - { "x": 2, "y": -1, "part": "wheel_wide_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": 2, "y": 0, "part": "frame_horizontal_2" }, { "x": 2, "y": 0, "part": "halfboard_horizontal_2" }, { "x": 2, "y": 0, "part": "headlight" }, @@ -1413,7 +1421,7 @@ { "x": 2, "y": 2, "part": "headlight" }, { "x": 2, "y": 3, "part": "frame_ne" }, { "x": 2, "y": 3, "part": "halfboard_ne" }, - { "x": 2, "y": 3, "part": "wheel_wide_steerable" }, + { "x": 2, "y": 3, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": -1, "y": -1, "part": "frame_vertical" }, { "x": -1, "y": -1, "part": "windshield" }, { "x": -1, "y": 0, "part": "frame_horizontal_2" }, @@ -1482,7 +1490,7 @@ { "x": -5, "y": 3, "part": "frame_vertical" }, { "x": -5, "y": 3, "part": "windshield" }, { "x": -6, "y": -1, "part": "frame_horizontal" }, - { "x": -6, "y": -1, "part": "wheel_wide" }, + { "x": -6, "y": -1, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -6, "y": -1, "part": "windshield" }, { "x": -6, "y": 0, "part": "frame_horizontal_2" }, { "x": -6, "y": 0, "part": "seat" }, @@ -1494,7 +1502,7 @@ { "x": -6, "y": 2, "part": "seat" }, { "x": -6, "y": 2, "part": "roof" }, { "x": -6, "y": 3, "part": "frame_horizontal" }, - { "x": -6, "y": 3, "part": "wheel_wide" }, + { "x": -6, "y": 3, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -6, "y": 3, "part": "windshield" }, { "x": -7, "y": -1, "part": "frame_vertical" }, { "x": -7, "y": -1, "part": "windshield" }, @@ -1585,7 +1593,7 @@ { "x": 1, "y": 4, "part": "wing_mirror" }, { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, - { "x": 2, "y": -1, "part": "wheel_wide_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": 2, "y": 0, "part": "frame_horizontal_2" }, { "x": 2, "y": 0, "part": "halfboard_horizontal_2" }, { "x": 2, "y": 0, "part": "headlight" }, @@ -1599,7 +1607,7 @@ { "x": 2, "y": 2, "part": "headlight" }, { "x": 2, "y": 3, "part": "frame_ne" }, { "x": 2, "y": 3, "part": "halfboard_ne" }, - { "x": 2, "y": 3, "part": "wheel_wide_steerable" }, + { "x": 2, "y": 3, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": -1, "y": -1, "part": "frame_vertical" }, { "x": -1, "y": -1, "part": "board_vertical" }, { "x": -1, "y": 0, "part": "frame_horizontal_2" }, @@ -1668,7 +1676,7 @@ { "x": -5, "y": 3, "part": "frame_vertical" }, { "x": -5, "y": 3, "part": "windshield" }, { "x": -6, "y": -1, "part": "frame_horizontal" }, - { "x": -6, "y": -1, "part": "wheel_wide" }, + { "x": -6, "y": -1, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -6, "y": -1, "part": "windshield" }, { "x": -6, "y": 0, "part": "frame_horizontal_2" }, { "x": -6, "y": 0, "part": "seat" }, @@ -1680,7 +1688,7 @@ { "x": -6, "y": 2, "part": "seat" }, { "x": -6, "y": 2, "part": "roof" }, { "x": -6, "y": 3, "part": "frame_horizontal" }, - { "x": -6, "y": 3, "part": "wheel_wide" }, + { "x": -6, "y": 3, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -6, "y": 3, "part": "windshield" }, { "x": -7, "y": -1, "part": "frame_vertical" }, { "x": -7, "y": -1, "part": "windshield" }, @@ -1817,7 +1825,7 @@ { "x": 1, "y": 4, "part": "wing_mirror" }, { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, - { "x": 2, "y": -1, "part": "wheel_wide_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": 2, "y": 0, "part": "frame_horizontal_2" }, { "x": 2, "y": 0, "part": "halfboard_horizontal_2" }, { "x": 2, "y": 0, "part": "headlight" }, @@ -1831,7 +1839,7 @@ { "x": 2, "y": 2, "part": "headlight" }, { "x": 2, "y": 3, "part": "frame_ne" }, { "x": 2, "y": 3, "part": "halfboard_ne" }, - { "x": 2, "y": 3, "part": "wheel_wide_steerable" }, + { "x": 2, "y": 3, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": -1, "y": -1, "part": "frame_vertical" }, { "x": -1, "y": -1, "part": "board_vertical" }, { "x": -1, "y": 0, "part": "frame_horizontal_2" }, @@ -1901,7 +1909,7 @@ { "x": -5, "y": 3, "part": "frame_vertical" }, { "x": -5, "y": 3, "part": "board_vertical" }, { "x": -6, "y": -1, "part": "frame_horizontal" }, - { "x": -6, "y": -1, "part": "wheel_wide" }, + { "x": -6, "y": -1, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -6, "y": -1, "part": "board_vertical" }, { "x": -6, "y": 0, "part": "frame_horizontal_2" }, { "x": -6, "y": 0, "part": "bed" }, @@ -1913,7 +1921,7 @@ { "x": -6, "y": 2, "part": "bed" }, { "x": -6, "y": 2, "part": "roof" }, { "x": -6, "y": 3, "part": "frame_horizontal" }, - { "x": -6, "y": 3, "part": "wheel_wide" }, + { "x": -6, "y": 3, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -6, "y": 3, "part": "board_vertical" }, { "x": -7, "y": -1, "part": "frame_vertical" }, { "x": -7, "y": -1, "part": "board_vertical" }, @@ -2072,12 +2080,12 @@ { "x": 2, "y": -1, "part": "hdframe_nw" }, { "x": 2, "y": -1, "part": "hdhalfboard_nw" }, { "x": 2, "y": -1, "part": "headlight_reinforced" }, - { "x": 2, "y": -1, "part": "wheel_wide_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": 2, "y": -1, "part": "plating_steel" }, { "x": 2, "y": 3, "part": "hdframe_ne" }, { "x": 2, "y": 3, "part": "hdhalfboard_ne" }, { "x": 2, "y": 3, "part": "headlight_reinforced" }, - { "x": 2, "y": 3, "part": "wheel_wide_steerable" }, + { "x": 2, "y": 3, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": 2, "y": 3, "part": "plating_steel" }, { "x": -1, "y": 0, "part": "hdframe_horizontal" }, { "x": -1, "y": 0, "part": "hdboard_horizontal" }, @@ -2163,12 +2171,12 @@ { "x": -5, "y": 2, "part": "plating_steel" }, { "x": -5, "y": -1, "part": "hdframe_sw" }, { "x": -5, "y": -1, "part": "hdboard_sw" }, - { "x": -5, "y": -1, "part": "wheel_wide" }, + { "x": -5, "y": -1, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -5, "y": -1, "part": "hdroof" }, { "x": -5, "y": -1, "part": "plating_steel" }, { "x": -5, "y": 3, "part": "hdframe_se" }, { "x": -5, "y": 3, "part": "hdboard_se" }, - { "x": -5, "y": 3, "part": "wheel_wide" }, + { "x": -5, "y": 3, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -5, "y": 3, "part": "hdroof" }, { "x": -5, "y": 3, "part": "plating_steel" } ], @@ -2207,7 +2215,7 @@ { "x": 0, "y": -1, "part": "frame_vertical" }, { "x": 0, "y": -1, "part": "windshield" }, { "x": 0, "y": -1, "part": "roof" }, - { "x": 0, "y": -1, "part": "wheel_wide_steerable" }, + { "x": 0, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": 0, "y": -2, "part": "wing_mirror" }, { "x": 0, "y": 1, "part": "frame_vertical_2" }, { "x": 0, "y": 1, "part": "aisle_vertical" }, @@ -2222,7 +2230,7 @@ { "x": 0, "y": 3, "part": "frame_vertical" }, { "x": 0, "y": 3, "part": "windshield" }, { "x": 0, "y": 3, "part": "roof" }, - { "x": 0, "y": 3, "part": "wheel_wide_steerable" }, + { "x": 0, "y": 3, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": 0, "y": 4, "part": "wing_mirror" }, { "x": 1, "y": -1, "part": "frame_nw" }, { "x": 1, "y": -1, "part": "halfboard_nw" }, @@ -2290,7 +2298,7 @@ { "x": -4, "y": -1, "part": "frame_vertical" }, { "x": -4, "y": -1, "part": "board_vertical" }, { "x": -4, "y": -1, "part": "roof" }, - { "x": -4, "y": -1, "part": "wheel_wide" }, + { "x": -4, "y": -1, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -4, "y": 0, "part": "frame_vertical_2" }, { "x": -4, "y": 0, "part": "board_horizontal" }, { "x": -4, "y": 0, "part": "roof" }, @@ -2304,7 +2312,7 @@ { "x": -4, "y": 3, "part": "frame_vertical" }, { "x": -4, "y": 3, "part": "board_vertical" }, { "x": -4, "y": 3, "part": "roof" }, - { "x": -4, "y": 3, "part": "wheel_wide" }, + { "x": -4, "y": 3, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -5, "y": -1, "part": "frame_sw" }, { "x": -5, "y": -1, "part": "board_sw" }, { "x": -5, "y": -1, "part": "roof" }, diff --git a/data/mods/Aftershock/items/afs__items.json b/data/mods/Aftershock/items/afs__items.json index 61848cdd56d56..714e35188b7ad 100644 --- a/data/mods/Aftershock/items/afs__items.json +++ b/data/mods/Aftershock/items/afs__items.json @@ -52,24 +52,6 @@ "description": "This refurbished refrigerator has been stripped of much of its internal components and converted to run at a much lower temperature, causing it to serve as a freezer for more power. Like its predecessor, it runs on vehicle power.", "color": "light_blue" }, - { - "id": "afs_rolling_pin", - "type": "GENERIC", - "name": "rolling pin", - "description": "A light wooden rolling pin used to flatten dough.", - "symbol": "[", - "color": "brown", - "weight": 472, - "volume": 4, - "price": 1500, - "price_postapoc": 500, - "material": [ "wood" ], - "to_hit": -1, - "bashing": 6, - "flags": [ "DURABLE_MELEE", "FIREWOOD" ], - "techniques": [ "RAPID" ], - "looks_like": "bat" - }, { "type": "GENERIC", "id": "afs_scrap_titanium", @@ -126,26 +108,6 @@ "name_plural": "cooking rigs", "description": "Skillet, pot, hotplate, and chemistry set; everything you need to cook food and chemicals. Includes proper fume vents and a separator, so you don't contaminate your food with toxic chemicals." }, - { - "id": "afs_large_storage_battery", - "type": "MAGAZINE", - "category": "veh_parts", - "name": "large storage battery", - "name_plural": "large storage batteries", - "description": "A huge lithium ion storage battery, weighing easily 600 pounds. Holds a tremendous amount of energy.", - "weight": 300000, - "volume": 80, - "price": 400000, - "price_postapoc": 50000, - "to_hit": -2, - "bashing": 40, - "material": [ "plastic", "steel" ], - "symbol": ":", - "color": "light_cyan", - "ammo_type": "battery", - "capacity": 100000, - "flags": [ "NO_SALVAGE", "NO_UNLOAD", "NO_RELOAD", "RECHARGE" ] - }, { "id": "nuclear_waste", "type": "GENERIC", diff --git a/data/mods/Aftershock/items/afs_armor.json b/data/mods/Aftershock/items/afs_armor.json index 445efe53015f3..5829dc2494f38 100644 --- a/data/mods/Aftershock/items/afs_armor.json +++ b/data/mods/Aftershock/items/afs_armor.json @@ -41,27 +41,6 @@ "use_action": { "type": "bandolier", "capacity": 40, "ammo": [ "arrow", "bolt" ], "draw_cost": 20 }, "flags": [ "BELTED", "OVERSIZE", "WATER_FRIENDLY" ] }, - { - "id": "afs_daypack", - "type": "ARMOR", - "name": "daypack", - "description": "An ultralight, bright red nylon backpack intended for one-day hiking trips. Waterproof, slim, and spacious.", - "symbol": "[", - "color": "red", - "weight": 411, - "volume": 4, - "//": "REI Co-op 22-liter daypack costs $54.95, so ballpark to $50", - "price": 5000, - "price_postapoc": 10000, - "material": [ "plastic" ], - "covers": [ "TORSO" ], - "coverage": 50, - "material_thickness": 1, - "encumbrance": 10, - "storage": 80, - "flags": [ "BELTED", "ONLY_ONE", "OVERSIZE", "STURDY" ], - "looks_like": "backpack" - }, { "id": "afs_blatant_half_life_reference", "type": "ARMOR", @@ -183,27 +162,6 @@ "encumbrance": 50, "warmth": 90 }, - { - "id": "afs_ski_jacket", - "type": "ARMOR", - "name": "ski jacket", - "description": "An insulated, breathable hoodie made for alpine skiing. Very warm, and with sizable pockets.", - "weight": 1105, - "volume": 20, - "price": 18000, - "material": [ "cotton", "plastic" ], - "symbol": "[", - "color": "light_blue", - "covers": [ "TORSO", "ARMS" ], - "coverage": 95, - "encumbrance": 14, - "storage": 12, - "warmth": 80, - "material_thickness": 5, - "environmental_protection": 3, - "flags": [ "VARSIZE", "POCKETS", "HOOD", "COLLAR", "OUTER" ], - "looks_like": "coat_winter" - }, { "id": "afs_survivor_belt", "copy-from": "survivor_belt", @@ -226,44 +184,6 @@ "type": "ARMOR", "name": "survivor utility belt (sheath)" }, - { - "id": "afs_welding_mask", - "type": "ARMOR", - "name": "welding mask", - "description": "A metal mask with a very dark visor, meant to protect the entire face during welding. It also serves as good armor, but makes it hard to see.", - "weight": 4000, - "volume": 4, - "price": 1400, - "to_hit": -3, - "material": [ "steel" ], - "symbol": "[", - "color": "dark_gray", - "covers": [ "HEAD", "MOUTH", "EYES" ], - "coverage": 100, - "encumbrance": 30, - "material_thickness": 3, - "qualities": [ [ "GLARE", 3 ] ], - "flags": [ "SUN_GLASSES", "FLASH_PROTECTION" ] - }, - { - "id": "afs_welding_mask_makeshift", - "type": "ARMOR", - "name": "makeshift welding mask", - "description": "A crude welding mask made from shaped metal, with dark cloth and tinted glass to protect the eyes. It's extremely hard to see with, but with nothing else available, it can protect your sight while welding.", - "weight": 4000, - "volume": 4, - "price": 1400, - "to_hit": -3, - "material": [ "steel" ], - "symbol": "[", - "color": "dark_gray", - "covers": [ "MOUTH", "EYES" ], - "coverage": 100, - "encumbrance": 60, - "material_thickness": 2, - "qualities": [ [ "GLARE", 2 ] ], - "flags": [ "SUN_GLASSES", "FLASH_PROTECTION", "BLIND" ] - }, { "id": "afs_brigandine", "type": "ARMOR", diff --git a/data/mods/Aftershock/items/afs_books.json b/data/mods/Aftershock/items/afs_books.json index b48d7f2db5bc2..d2abc20fc7091 100644 --- a/data/mods/Aftershock/items/afs_books.json +++ b/data/mods/Aftershock/items/afs_books.json @@ -17,24 +17,13 @@ "chapters": 30, "fun": 6 }, - { - "id": "recipe_lab_cvd", - "type": "BOOK", - "copy-from": "recipe_lab_cvd", - "name": "lab journal-Curie", - "name_plural": "lab journals-Curie", - "description": "This lab notebook is filled with the collective discoveries and refinements of a research team dedicated to nuclear energy. It mostly pertains to fission power, but there's also blueprints for recycling plutonium, adaptation of nuclear power into everyday batteries, early specs for several Rivtech products, and... schematics for a nuclear warhead. You don't think you're ready to start a second Cataclysm, but the details about the miniaturized handheld version on the next page might be useful...", - "skill": "mechanics", - "required_level": 6, - "max_level": 10 - }, { "id": "afs_textbook_shotguns", "type": "BOOK", "name": "USMC M1014 technical manual", "description": "A pocket-sized book printed in 2000 by the United States Marine Corps for official use. It describes the operation, repair, and cleaning of the Benilli M1014 shotgun. Though specific to the M4, it can provide a wealth of information to the trained eye.", "weight": 600, - "volume": 1, + "volume": "250 ml", "price": 3000, "material": [ "paper" ], "symbol": "?", @@ -43,7 +32,7 @@ "required_level": 2, "max_level": 6, "intelligence": 8, - "time": 15 + "time": "15 m" }, { "id": "afs_textbook_handguns", @@ -52,7 +41,7 @@ "name_plural": "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, - "volume": 3, + "volume": "750 ml", "price": 3000, "material": [ "paper" ], "symbol": "?", @@ -61,7 +50,7 @@ "required_level": 2, "max_level": 6, "intelligence": 6, - "time": 20 + "time": "20 m" }, { "id": "afs_textbook_rifles", @@ -70,7 +59,7 @@ "name_plural": "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, - "volume": 2, + "volume": "500 ml", "price": 3000, "material": [ "paper" ], "symbol": "?", @@ -79,7 +68,7 @@ "required_level": 2, "max_level": 6, "intelligence": 6, - "time": 20 + "time": "20 m" }, { "id": "afs_textbook_launchers", @@ -88,7 +77,7 @@ "name_plural": "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, - "volume": 1, + "volume": "250 ml", "price": 2000, "material": [ "paper" ], "symbol": "?", @@ -97,16 +86,16 @@ "required_level": 2, "max_level": 6, "intelligence": 5, - "time": 18 + "time": "18 m" }, { "id": "textbook_atomic", "type": "BOOK", "name": "Nuclear Physics Made Easy", "name_plural": "Nuclear Physics Made Easy", - "description": "A book detailing the workings of state of the art atomic technology, and the physics behind it", + "description": "A book detailing the workings of state of the art atomic technology, and the physics behind it.", "weight": 2063, - "volume": 8, + "volume": "2 L", "price": 9200, "bashing": 8, "material": [ "paper" ], @@ -116,7 +105,7 @@ "required_level": 5, "max_level": 7, "intelligence": 13, - "time": 50, - "fun": -1 + "fun": -1, + "time": "50 m" } ] diff --git a/data/mods/Aftershock/items/afs_comestibles.json b/data/mods/Aftershock/items/afs_comestibles.json index 4374cc626e9f4..822dc2f9942c2 100644 --- a/data/mods/Aftershock/items/afs_comestibles.json +++ b/data/mods/Aftershock/items/afs_comestibles.json @@ -1,12 +1,4 @@ [ - { - "type": "COMESTIBLE", - "id": "afs_cake", - "name": "plain cake", - "copy-from": "jihelucake", - "description": "A modest chocolate cake with no icing added. Nothing special, but some of the best you can get nowadays. Besides, cake is cake!", - "fun": 15 - }, { "id": "afs_calorie_pill", "type": "COMESTIBLE", @@ -60,26 +52,6 @@ "looks_like": "flour", "fun": -5 }, - { - "id": "afs_fried_donut_holes", - "type": "COMESTIBLE", - "name": "fried donut holes", - "name_plural": "fried donut holes", - "weight": 226, - "color": "yellow", - "comestible_type": "FOOD", - "symbol": "%", - "calories": 60, - "quench": -1, - "healthy": -1, - "description": "These balls of dough have been cut into shape, covered with sugar, and cooked to a crisp. A staple of fairgrounds everywhere.", - "price": 100, - "volume": 1, - "charges": 4, - "flags": [ "EATEN_HOT" ], - "looks_like": "bread", - "fun": 4 - }, { "id": "afs_sundew", "type": "COMESTIBLE", diff --git a/data/mods/Aftershock/items/afs_tools.json b/data/mods/Aftershock/items/afs_tools.json index 14ca18088d4ab..32afc9d57ed04 100644 --- a/data/mods/Aftershock/items/afs_tools.json +++ b/data/mods/Aftershock/items/afs_tools.json @@ -39,45 +39,6 @@ "//": "since we cost no battery, no reason not to keep these", "flags": [ "WATCH", "ALARMCLOCK", "LIGHT_25" ] }, - { - "id": "afs_atomic_reading_light", - "type": "TOOL", - "name": "atomic reading light", - "description": "Rated for almost 100 million years of operation, the Rivtech atomic reading light clips onto any book, anytime, anywhere! Following after their obsession with making household gadgets powered with plutonium cells, it's bulky for a reading light, but can provide a small, steady light with no fear of ever running out of batteries.", - "weight": 120, - "volume": "100 ml", - "price": 10000, - "price_postapoc": 1000, - "material": [ "plastic", "aluminum" ], - "looks_like": "reading_light", - "symbol": ",", - "color": "light_green", - "use_action": { - "target": "afs_atomic_reading_light_on", - "msg": "You switch on the reading light.", - "active": true, - "menu_text": "Turn on", - "type": "transform" - }, - "flags": [ "ALLOWS_REMOTE_USE" ] - }, - { - "id": "afs_atomic_reading_light_on", - "copy-from": "afs_atomic_reading_light", - "type": "TOOL", - "name": "atomic reading light (on)", - "description": "Rated for almost 200 million years of operation, the Rivtech atomic reading light clips onto any book, anytime, anywhere! Its blue-tinted lens sheds a pleasing Cherenkov glow in a small circle onto anything you might need to read.", - "name_plural": "atomic reading lights (on)", - "revert_to": "afs_atomic_reading_light", - "looks_like": "reading_light_on", - "use_action": { - "target": "afs_atomic_reading_light", - "msg": "You switch off the light.", - "menu_text": "Turn off", - "type": "transform" - }, - "flags": [ "ALLOWS_REMOTE_USE", "LIGHT_8" ] - }, { "id": "afs_atompot", "type": "TOOL", diff --git a/data/mods/Aftershock/items/afs_weapons.json b/data/mods/Aftershock/items/afs_weapons.json index 668edcf53a8da..374d01649ce9c 100644 --- a/data/mods/Aftershock/items/afs_weapons.json +++ b/data/mods/Aftershock/items/afs_weapons.json @@ -114,11 +114,11 @@ { "id": "afs_rolling_pin_barbed_wire", "type": "GENERIC", - "copy-from": "afs_rolling_pin", + "copy-from": "rolling_pin", "name": "barbed-wire rolling pin", "description": "Typically used to flatten dough, this rolling pin has been repurposed as a weapon, with barbed wire adding some extra power and weight to its swing. It has some real heft to it; perfect for the bakers of the apocalypse.", "weight": 923, - "volume": 6, + "volume": "1500 ml", "price_postapoc": 1500, "material": [ "steel", "wood" ], "to_hit": 1, diff --git a/data/mods/Aftershock/maps/afs_item_groups.json b/data/mods/Aftershock/maps/afs_item_groups.json index 6c3a57a236133..72ecabacffbc9 100644 --- a/data/mods/Aftershock/maps/afs_item_groups.json +++ b/data/mods/Aftershock/maps/afs_item_groups.json @@ -91,97 +91,72 @@ { "id": "spider", "type": "item_group", - "items": [ - [ "afs_energy_saber_off", 1 ], - [ "afs_bag_of_holding", 2 ], - [ "afs_hydraulic_gauntlet", 1 ], - [ "afs_atomic_reading_light", 5 ] - ] + "items": [ [ "afs_energy_saber_off", 1 ], [ "afs_bag_of_holding", 2 ], [ "afs_hydraulic_gauntlet", 1 ] ] }, { "id": "survivorzed_extra", "type": "item_group", - "items": [ [ "afs_daypack", 4 ], [ "afs_rolling_pin_barbed_wire", 5 ], [ "afs_chain_wrench", 8 ] ] + "items": [ [ "afs_rolling_pin_barbed_wire", 5 ], [ "afs_chain_wrench", 8 ] ] }, { "id": "camping", "type": "item_group", - "items": [ [ "afs_daypack", 20 ], [ "afs_rope_lighter", 10 ], [ "afs_atomic_reading_light", 1 ] ] + "items": [ [ "afs_rope_lighter", 10 ], [ "atomic_light", 1 ] ] }, { "id": "allsporting", "type": "item_group", - "items": [ [ "afs_daypack", 30 ], [ "afs_rope_lighter", 10 ], [ "afs_ski_jacket", 5 ] ] + "items": [ [ "afs_rope_lighter", 10 ] ] }, { "id": "traveler", "type": "item_group", - "items": [ [ "afs_daypack", 20 ], [ "afs_rope_lighter", 10 ] ] - }, - { - "id": "shelter", - "type": "item_group", - "items": [ [ "afs_daypack", 10 ] ] + "items": [ [ "afs_rope_lighter", 10 ] ] }, { "id": "drugdealer", "type": "item_group", - "items": [ [ "afs_daypack", 20 ], [ "afs_atomic_smartphone", 3 ], [ "afs_bio_missiles", 8 ] ] - }, - { - "id": "college_camping", - "type": "item_group", - "items": [ [ "afs_daypack", 75 ] ] + "items": [ [ "afs_atomic_smartphone", 3 ], [ "afs_bio_missiles", 8 ] ] }, { "id": "kitchen", "type": "item_group", - "items": [ [ "afs_rolling_pin", 25 ], [ "afs_atompot", 1 ] ] - }, - { - "id": "dollar_kitchen", - "type": "item_group", - "items": [ [ "afs_rolling_pin", 20 ] ] + "items": [ [ "afs_atompot", 1 ] ] }, { "id": "oven", "type": "item_group", - "items": [ [ "afs_rolling_pin", 25 ], [ "afs_atompot", 3 ] ] + "items": [ [ "afs_atompot", 3 ] ] }, { "id": "bed", "type": "item_group", "items": [ [ "afs_quilt", 10 ], [ "afs_quilt_patchwork", 8 ] ] }, - { - "id": "mechanics", - "type": "item_group", - "items": [ [ "afs_welding_mask", 30 ] ] - }, { "id": "livingroom", "type": "item_group", - "items": [ [ "afs_atomic_smartphone", 1 ], [ "afs_atomic_reading_light", 2 ] ] + "items": [ [ "afs_atomic_smartphone", 1 ], [ "atomic_light", 2 ] ] }, { "id": "bedroom", "type": "item_group", - "items": [ [ "afs_atomic_smartphone", 1 ], [ "afs_atomic_reading_light", 2 ] ] + "items": [ [ "afs_atomic_smartphone", 1 ], [ "atomic_light", 2 ] ] }, { "id": "consumer_electronics", "type": "item_group", - "items": [ [ "afs_atomic_smartphone", 2 ], [ "afs_bio_precision_solderers", 1 ], [ "afs_atomic_reading_light", 4 ] ] + "items": [ [ "afs_atomic_smartphone", 2 ], [ "afs_bio_precision_solderers", 1 ], [ "atomic_light", 4 ] ] }, { "id": "electronics", "type": "item_group", - "items": [ [ "afs_atomic_smartphone", 1 ], [ "afs_bio_precision_solderers", 2 ], [ "afs_atomic_reading_light", 2 ] ] + "items": [ [ "afs_atomic_smartphone", 1 ], [ "afs_bio_precision_solderers", 2 ], [ "atomic_light", 2 ] ] }, { "id": "lab_dorm", "type": "item_group", - "items": [ [ "afs_atomic_smartphone", 5 ], [ "afs_atomic_reading_light", 3 ] ] + "items": [ [ "afs_atomic_smartphone", 5 ], [ "atomic_light", 3 ] ] }, { "id": "subway", @@ -191,7 +166,7 @@ { "id": "hardware", "type": "item_group", - "items": [ [ "afs_power_cutter", 5 ], [ "toolbox", 5 ] ] + "items": [ [ "afs_power_cutter", 5 ] ] }, { "id": "hardware_bulk", @@ -204,21 +179,6 @@ "type": "item_group", "items": [ [ "afs_power_cutter", 5 ] ] }, - { - "id": "winter", - "type": "item_group", - "items": [ [ "afs_ski_jacket", 40 ] ] - }, - { - "id": "allclothes", - "type": "item_group", - "items": [ [ "afs_ski_jacket", 40 ] ] - }, - { - "id": "shelter", - "type": "item_group", - "items": [ [ "afs_ski_jacket", 40 ], [ "afs_atomic_reading_light", 2 ] ] - }, { "id": "book_gunref", "type": "item_group", diff --git a/data/mods/Aftershock/maps/mapgen/municipal_microreactor.json b/data/mods/Aftershock/maps/mapgen/municipal_microreactor.json index a7626287f8c93..45c9a386370ea 100644 --- a/data/mods/Aftershock/maps/mapgen/municipal_microreactor.json +++ b/data/mods/Aftershock/maps/mapgen/municipal_microreactor.json @@ -243,7 +243,7 @@ { "item": "nuclear_reactor", "x": 12, "y": 7, "chance": 100 } ], "place_monsters": [ { "monster": "GROUP_LAB", "x": [ 2, 21 ], "y": [ 2, 21 ], "repeat": [ 1, 3 ] } ], - "monster": { "T": { "monster": "mon_turret" }, "M": { "monster": "mon_charred_nightmare" } } + "monster": { "T": { "monster": "mon_turret_rifle" }, "M": { "monster": "mon_charred_nightmare" } } } }, { diff --git a/data/mods/Aftershock/player/afs_professions.json b/data/mods/Aftershock/player/afs_professions.json index 4ea567ebb8b3c..a42b13cf739a2 100644 --- a/data/mods/Aftershock/player/afs_professions.json +++ b/data/mods/Aftershock/player/afs_professions.json @@ -19,7 +19,7 @@ "traits": [ "AFS_PROF_SKIIER" ], "skills": [ { "level": 3, "name": "dodge" }, { "level": 2, "name": "survival" } ], "items": { - "both": [ "afs_ski_jacket", "pants_ski", "socks_wool", "boots_winter", "mask_ski", "goggles_ski", "gloves_wool", "duffelbag" ], + "both": [ "ski_jacket", "pants_ski", "socks_wool", "boots_winter", "mask_ski", "goggles_ski", "gloves_wool", "duffelbag" ], "male": [ "briefs" ], "female": [ "sports_bra", "boy_shorts" ] } @@ -32,17 +32,8 @@ "points": 2, "skills": [ { "level": 5, "name": "computer" } ], "items": { - "both": [ - "laptop", - "software_useless", - "eink_tablet_pc", - "linuxtshirt", - "pants_cargo", - "socks", - "slingpack", - "sneakers", - "smart_phone" - ], + "both": [ "laptop", "software_useless", "linuxtshirt", "pants_cargo", "socks", "slingpack", "sneakers", "smart_phone" ], + "entries": [ { "item": "light_plus_battery_cell", "ammo-item": "battery", "charges": 150, "container-item": "eink_tablet_pc" } ], "male": [ "briefs" ], "female": [ "bra", "panties" ] } @@ -106,7 +97,7 @@ "socks", "mbag", "afs_atomic_smartphone", - "afs_atomic_reading_light", + "atomic_light", "atomic_coffeepot", "atomic_lamp_off", "afs_atompot", @@ -124,7 +115,7 @@ "points": 1, "skills": [ { "level": 2, "name": "cooking" } ], "items": { - "both": [ "jihelucake", "afs_rolling_pin", "flour", "cooking_oil", "tshirt", "socks", "jeans", "sneakers", "slingpack" ], + "both": [ "jihelucake", "rolling_pin", "flour", "cooking_oil", "tshirt", "socks", "jeans", "sneakers", "slingpack" ], "male": [ "briefs" ], "female": [ "bra", "panties" ] } @@ -144,7 +135,7 @@ "traits": [ "PSYCHOPATH", "KILLER" ], "items": { "both": [ - "afs_welding_mask", + "welding_mask", "crowbar", "fire_ax", "jacket_leather", diff --git a/data/mods/Aftershock/recipes/afs__recipes.json b/data/mods/Aftershock/recipes/afs__recipes.json index ed17a735a74c0..1ae34e36d8bc2 100644 --- a/data/mods/Aftershock/recipes/afs__recipes.json +++ b/data/mods/Aftershock/recipes/afs__recipes.json @@ -27,7 +27,7 @@ "time": 360000, "reversible": true, "decomp_learn": 10, - "book_learn": [ [ "recipe_lab_cvd", 5 ] ], + "book_learn": [ [ "textbook_atomic_lab", 5 ] ], "qualities": [ { "id": "SCREW", "level": 1 }, { "id": "WRENCH", "level": 1 } ], "components": [ [ [ "canister_empty", 1 ] ], @@ -48,7 +48,7 @@ "skills_required": [ "electronics", 4 ], "difficulty": 8, "time": 30000, - "book_learn": [ [ "recipe_lab_cvd", 5 ] ], + "book_learn": [ [ "textbook_atomic_lab", 5 ] ], "qualities": [ { "id": "SCREW", "level": 1 }, { "id": "WRENCH", "level": 1 } ], "components": [ [ [ "canister_empty", 1 ] ], [ [ "plut_slurry", 10 ], [ "plut_slurry_dense", 5 ] ], [ [ "power_supply", 2 ] ] ] }, @@ -61,7 +61,7 @@ "skill_used": "electronics", "difficulty": 6, "time": 30000, - "book_learn": [ [ "recipe_lab_cvd", 3 ] ], + "book_learn": [ [ "textbook_atomic_lab", 3 ] ], "qualities": [ { "id": "SCREW", "level": 1 } ], "components": [ [ [ "steel_chunk", 1 ], [ "scrap", 1 ] ], @@ -84,7 +84,7 @@ "byproducts": [ [ "plastic_chunk" ], [ "plastic_chunk" ] ] }, { - "result": "afs_rolling_pin", + "result": "rolling_pin", "type": "recipe", "category": "CC_WEAPON", "subcategory": "CSC_WEAPON_BASHING", @@ -104,9 +104,9 @@ "subcategory": "CSC_WEAPON_BASHING", "skill_used": "fabrication", "difficulty": 1, - "time": 10000, + "time": "10 m", "autolearn": true, - "components": [ [ [ "afs_rolling_pin", 1 ] ], [ [ "wire_barbed", 1 ] ], [ [ "adhesive", 1, "LIST" ] ] ] + "components": [ [ [ "rolling_pin", 1 ] ], [ [ "wire_barbed", 1 ] ], [ [ "adhesive", 1, "LIST" ] ] ] }, { "type": "recipe", @@ -161,21 +161,35 @@ }, { "type": "recipe", - "result": "afs_welding_mask_makeshift", - "category": "CC_ARMOR", - "subcategory": "CSC_ARMOR_HEAD", - "skill_used": "mechanics", - "difficulty": 2, - "skills_required": [ "fabrication", 3 ], - "time": 10000, - "autolearn": true, - "byproducts": [ [ "sheet_metal_small" ] ], - "qualities": [ { "id": "HAMMER", "level": 3 }, { "id": "SAW_M", "level": 2 } ], + "result": "turret_mount", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_VEHICLE", + "skill_used": "electronics", + "skills_required": [ [ "mechanics", 7 ], [ "computer", 6 ], [ "fabrication", 6 ] ], + "difficulty": 9, + "time": "8 h", + "reversible": true, + "decomp_learn": 9, + "book_learn": [ [ "recipe_lab_elec", 8 ], [ "textbook_robots", 10 ] ], + "using": [ [ "soldering_standard", 14 ], [ "welding_standard", 5 ], [ "forging_standard", 4 ], [ "steel_standard", 4 ] ], + "tools": [ [ [ "surface_heat", 30, "LIST" ] ] ], + "qualities": [ + { "id": "HAMMER", "level": 3 }, + { "id": "SCREW", "level": 1 }, + { "id": "WRENCH", "level": 2 }, + { "id": "SAW_M", "level": 1 }, + { "id": "DRILL", "level": 1 } + ], "components": [ - [ [ "sheet_metal", 1 ] ], - [ [ "leather", 6 ], [ "rag", 6 ], [ "string_36", 1 ] ], - [ [ "blindfold", 1 ] ], - [ [ "glass_tinted", 3 ] ] + [ [ "ai_module", 1 ] ], + [ [ "RAM", 1 ] ], + [ [ "gun_module", 1 ] ], + [ [ "small_storage_battery", 1 ] ], + [ [ "sensor_module", 1 ] ], + [ [ "identification_module", 1 ] ], + [ [ "power_supply", 1 ] ], + [ [ "pipe", 2 ] ], + [ [ "spring", 2 ] ] ] }, { @@ -197,54 +211,6 @@ [ [ "scrap", 1 ] ] ] }, - { - "type": "recipe", - "result": "reading_light", - "category": "CC_OTHER", - "subcategory": "CSC_OTHER_TOOLS", - "skill_used": "electronics", - "time": 45000, - "difficulty": 4, - "book_learn": [ [ "manual_electronics", 2 ] ], - "using": [ [ "soldering_standard", 15 ] ], - "tools": [ [ [ "surface_heat", 10, "LIST" ] ], [ [ "mold_plastic", -1 ] ] ], - "qualities": [ { "id": "SCREW_FINE", "level": 1 } ], - "components": [ - [ [ "plastic_chunk", 1 ] ], - [ [ "scrap", 4 ] ], - [ [ "cable", 4 ] ], - [ [ "circuit", 1 ] ], - [ [ "lens", 1 ], [ "lens_small", 1 ] ] - ] - }, - { - "type": "recipe", - "result": "turret_mount", - "category": "CC_OTHER", - "subcategory": "CSC_OTHER_VEHICLE", - "skill_used": "fabrication", - "difficulty": 3, - "time": 20000, - "autolearn": true, - "using": [ [ "soldering_standard", 5 ] ], - "qualities": [ { "id": "SCREW", "level": 1 } ], - "components": [ [ [ "steel_lump", 4 ] ], [ [ "wire", 2 ] ], [ [ "pipe", 4 ] ] ] - }, - { - "type": "recipe", - "result": "motor_micro", - "category": "CC_ELECTRONIC", - "subcategory": "CSC_ELECTRONIC_PARTS", - "skill_used": "electronics", - "difficulty": 1, - "time": 5000, - "reversible": true, - "decomp_learn": 1, - "book_learn": [ [ "manual_electronics", 1 ], [ "mag_electronics", 1 ] ], - "using": [ [ "soldering_standard", 5 ] ], - "qualities": [ { "id": "SCREW", "level": 1 } ], - "components": [ [ [ "steel_chunk", 1 ] ], [ [ "cable", 4 ] ] ] - }, { "type": "recipe", "result": "afs_chain_wrench", @@ -349,50 +315,11 @@ "skill_used": "electronics", "difficulty": 5, "time": 30000, - "book_learn": [ [ "recipe_caseless", 5 ], [ "recipe_lab_cvd", 4 ] ], + "book_learn": [ [ "recipe_caseless", 5 ], [ "textbook_atomic_lab", 4 ] ], "qualities": [ { "id": "SCREW", "level": 1 } ], "//": "Conversion of a normal smartphone into an atomic one by replacing the power supply.", "components": [ [ [ "plastic_chunk", 1 ] ], [ [ "processor", 1 ] ], [ [ "smart_phone", 1 ] ], [ [ "plut_cell", 1 ] ] ] }, - { - "type": "recipe", - "result": "afs_atomic_reading_light", - "category": "CC_OTHER", - "subcategory": "CSC_OTHER_TOOLS", - "skill_used": "electronics", - "time": 45000, - "difficulty": 4, - "reversible": true, - "decomp_learn": 3, - "book_learn": [ [ "recipe_caseless", 4 ], [ "recipe_lab_cvd", 3 ] ], - "using": [ [ "soldering_standard", 15 ] ], - "tools": [ [ [ "surface_heat", 10, "LIST" ] ], [ [ "mold_plastic", -1 ] ] ], - "qualities": [ { "id": "SCREW_FINE", "level": 1 } ], - "components": [ - [ [ "plastic_chunk", 1 ] ], - [ [ "scrap", 4 ] ], - [ [ "cable", 4 ] ], - [ [ "circuit", 1 ] ], - [ [ "lens", 1 ], [ "lens_small", 1 ] ], - [ [ "plut_cell", 1 ] ] - ] - }, - { - "type": "recipe", - "result": "afs_large_storage_battery", - "category": "CC_ELECTRONIC", - "subcategory": "CSC_ELECTRONIC_PARTS", - "skill_used": "electronics", - "skills_required": [ "fabrication", 1 ], - "difficulty": 4, - "time": 20000, - "reversible": true, - "decomp_learn": 3, - "book_learn": [ [ "manual_electronics", 2 ], [ "mag_electronics", 2 ], [ "manual_mechanics", 3 ] ], - "using": [ [ "soldering_standard", 20 ] ], - "qualities": [ { "id": "SCREW", "level": 1 } ], - "components": [ [ [ "storage_battery", 2 ] ], [ [ "scrap", 8 ] ], [ [ "cable", 10 ] ] ] - }, { "type": "recipe", "result": "purifier_smart_shot", diff --git a/data/mods/Aftershock/recipes/afs_comestible_recipes.json b/data/mods/Aftershock/recipes/afs_comestible_recipes.json index 888e1463fb29a..abeeab4538f01 100644 --- a/data/mods/Aftershock/recipes/afs_comestible_recipes.json +++ b/data/mods/Aftershock/recipes/afs_comestible_recipes.json @@ -10,7 +10,7 @@ "charges": 2, "batch_time_factors": [ 50, 4 ], "autolearn": true, - "tools": [ [ "afs_rolling_pin" ] ], + "tools": [ [ "rolling_pin" ] ], "components": [ [ [ "flour", 2 ] ], [ [ "water", 2 ], [ "water_clean", 2 ] ] ] }, { @@ -61,28 +61,6 @@ "tools": [ [ [ "surface_heat", 15, "LIST" ] ] ], "components": [ [ [ "afs_dough", 2 ] ], [ [ "salt", 1 ], [ "soysauce", 1 ], [ "seasoning_salt", 1 ] ] ] }, - { - "type": "recipe", - "result": "afs_cake", - "category": "CC_FOOD", - "subcategory": "CSC_FOOD_BREAD", - "skill_used": "cooking", - "difficulty": 2, - "time": 30000, - "autolearn": true, - "qualities": [ { "id": "COOK", "level": 3 } ], - "tools": [ [ [ "surface_heat", 15, "LIST" ] ] ], - "charges": 10, - "components": [ - [ [ "afs_dough", 5 ] ], - [ [ "salt", 10 ] ], - [ [ "sugar", 20 ] ], - [ [ "chocolate", 3 ] ], - [ [ "cooking_oil", 3 ], [ "cooking_oil2", 3 ] ], - [ [ "powder_eggs", 2 ], [ "eggs_bird", 2, "LIST" ], [ "egg_reptile", 2 ] ], - [ [ "water", 2 ], [ "water_clean", 2 ] ] - ] - }, { "type": "recipe", "result": "afs_calorie_water", @@ -94,20 +72,6 @@ "qualities": [ { "id": "CONTAIN", "level": 1 } ], "components": [ [ [ "afs_calorie_pill", 1 ] ], [ [ "water", 1 ], [ "water_clean", 1 ] ] ] }, - { - "type": "recipe", - "result": "afs_fried_donut_holes", - "category": "CC_FOOD", - "subcategory": "CSC_FOOD_BREAD", - "skill_used": "cooking", - "difficulty": 1, - "time": 10000, - "autolearn": true, - "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 1 } ], - "tools": [ [ [ "surface_heat", 5, "LIST" ] ] ], - "charges": 4, - "components": [ [ [ "afs_dough", 1 ] ], [ [ "salt", 5 ] ], [ [ "sugar", 16 ] ] ] - }, { "type": "recipe", "result": "afs_sungel", diff --git a/data/mods/Aftershock/recipes/afs_recipe_overrides.json b/data/mods/Aftershock/recipes/afs_recipe_overrides.json index 3d012030f9241..6b297ee82c25f 100644 --- a/data/mods/Aftershock/recipes/afs_recipe_overrides.json +++ b/data/mods/Aftershock/recipes/afs_recipe_overrides.json @@ -8,7 +8,7 @@ "difficulty": 4, "time": 3000, "reversible": true, - "book_learn": [ [ "recipe_caseless", 8 ], [ "recipe_lab_cvd", 3 ] ], + "book_learn": [ [ "recipe_caseless", 8 ], [ "textbook_atomic_lab", 3 ] ], "qualities": [ { "id": "SCREW", "level": 1 } ], "components": [ [ [ "plastic_chunk", 5 ] ], @@ -28,7 +28,7 @@ "difficulty": 3, "time": 20000, "reversible": true, - "book_learn": [ [ "recipe_caseless", 6 ], [ "recipe_lab_cvd", 3 ] ], + "book_learn": [ [ "recipe_caseless", 6 ], [ "textbook_atomic_lab", 3 ] ], "qualities": [ { "id": "SCREW", "level": 1 } ], "components": [ [ [ "plastic_chunk", 1 ] ], @@ -47,7 +47,7 @@ "difficulty": 3, "time": 30000, "reversible": true, - "book_learn": [ [ "recipe_caseless", 6 ], [ "recipe_lab_cvd", 3 ] ], + "book_learn": [ [ "recipe_caseless", 6 ], [ "textbook_atomic_lab", 3 ] ], "qualities": [ { "id": "SCREW", "level": 1 } ], "components": [ [ [ "plastic_chunk", 2 ] ], diff --git a/data/mods/Aftershock/vehicles/afs_part_items.json b/data/mods/Aftershock/vehicles/afs_part_items.json index 95fadbea8dfa3..05e21751a491a 100644 --- a/data/mods/Aftershock/vehicles/afs_part_items.json +++ b/data/mods/Aftershock/vehicles/afs_part_items.json @@ -14,26 +14,6 @@ "category": "veh_parts", "price": 50000 }, - { - "id": "afs_large_storage_battery", - "type": "MAGAZINE", - "category": "veh_parts", - "name": "large storage battery", - "name_plural": "large storage batteries", - "description": "A huge lithium ion storage battery, weighing easily 600 pounds. Holds a tremendous amount of energy.", - "weight": 300000, - "volume": 80, - "price": 400000, - "price_postapoc": 50000, - "to_hit": -2, - "bashing": 40, - "material": [ "plastic", "steel" ], - "symbol": ":", - "color": "light_cyan", - "ammo_type": "battery", - "capacity": 100000, - "flags": [ "NO_SALVAGE", "NO_UNLOAD", "NO_RELOAD", "RECHARGE" ] - }, { "type": "GENERIC", "id": "afs_titanium_frame", diff --git a/data/mods/Aftershock/vehicles/afs_vehicle_overrides.json b/data/mods/Aftershock/vehicles/afs_vehicle_overrides.json index 43a5d01d23ef6..d1cdaf2087907 100644 --- a/data/mods/Aftershock/vehicles/afs_vehicle_overrides.json +++ b/data/mods/Aftershock/vehicles/afs_vehicle_overrides.json @@ -18,7 +18,7 @@ { "y": -1, "x": 4, "parts": [ "headlight_reinforced", "reinforced_windshield" ] }, { "y": -2, "x": 4, "parts": [ "hdframe_nw", "hdboard_nw", "plating_military" ] }, { "y": 2, "x": 3, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": 2, "x": 3, "parts": [ "wheel_armor_steerable", "omnicam" ] }, + { "y": 2, "x": 3, "parts": [ "wheel_mount_heavy_steerable", "wheel_armor", "omnicam" ] }, { "y": 1, "x": 3, "parts": [ "hdframe_vertical_2", "hdroof", "plating_military" ] }, { "y": 1, "x": 3, "parts": [ { "fuel": "diesel", "part": "tank_small" }, "cam_control" ] }, { @@ -33,28 +33,28 @@ { "y": -1, "x": 3, "parts": [ "afs_control_station", "dashboard" ] }, { "y": -1, "x": 3, "parts": [ "seat", "seatbelt_heavyduty" ] }, { "y": -2, "x": 3, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": -2, "x": 3, "parts": [ "wheel_armor_steerable", "omnicam" ] }, + { "y": -2, "x": 3, "parts": [ "wheel_mount_heavy_steerable", "wheel_armor", "omnicam" ] }, { "y": 2, "x": 2, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": 2, "x": 2, "parts": [ "wheel_armor" ] }, + { "y": 2, "x": 2, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 1, "x": 2, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": 0, "x": 2, "parts": [ "hdframe_vertical_2", "aisle_horizontal", "hdroof" ] }, { "y": -1, "x": 2, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": -2, "x": 2, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": -2, "x": 2, "parts": [ "wheel_armor" ] }, + { "y": -2, "x": 2, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 2, "x": 1, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": 2, "x": 1, "parts": [ "wheel_armor" ] }, + { "y": 2, "x": 1, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 1, "x": 1, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": 0, "x": 1, "parts": [ "hdframe_vertical_2", "aisle_horizontal", "hdroof" ] }, { "y": -1, "x": 1, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": -2, "x": 1, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": -2, "x": 1, "parts": [ "wheel_armor" ] }, + { "y": -2, "x": 1, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 2, "x": 0, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": 2, "x": 0, "parts": [ "wheel_armor" ] }, + { "y": 2, "x": 0, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 1, "x": 0, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": 0, "x": 0, "parts": [ "hdframe_vertical_2", "aisle_horizontal", "hdroof" ] }, { "y": -1, "x": 0, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": -2, "x": 0, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": -2, "x": 0, "parts": [ "wheel_armor" ] }, + { "y": -2, "x": 0, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 2, "x": -1, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, { "y": 1, "x": -1, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": 0, "x": -1, "parts": [ "hdframe_vertical_2", "aisle_horizontal", "hdroof" ] }, @@ -91,7 +91,7 @@ { "y": -1, "x": 4, "parts": [ "headlight_reinforced", "reinforced_windshield" ] }, { "y": -2, "x": 4, "parts": [ "hdframe_nw", "hdboard_nw", "plating_military" ] }, { "y": 2, "x": 3, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": 2, "x": 3, "parts": [ "wheel_armor_steerable", "omnicam" ] }, + { "y": 2, "x": 3, "parts": [ "wheel_mount_heavy_steerable", "wheel_armor", "omnicam" ] }, { "y": 1, "x": 3, "parts": [ "hdframe_vertical_2", "hdroof", "plating_military" ] }, { "y": 1, "x": 3, "parts": [ { "fuel": "diesel", "part": "tank_small" }, "cam_control" ] }, { @@ -114,28 +114,28 @@ { "y": -1, "x": 3, "parts": [ "afs_control_station", "dashboard" ] }, { "y": -1, "x": 3, "parts": [ "seat", "seatbelt_heavyduty" ] }, { "y": -2, "x": 3, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": -2, "x": 3, "parts": [ "wheel_armor_steerable", "omnicam" ] }, + { "y": -2, "x": 3, "parts": [ "wheel_mount_heavy_steerable", "wheel_armor", "omnicam" ] }, { "y": 2, "x": 2, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": 2, "x": 2, "parts": [ "wheel_armor" ] }, + { "y": 2, "x": 2, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 1, "x": 2, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": 0, "x": 2, "parts": [ "hdframe_vertical_2", "aisle_horizontal", "hdroof" ] }, { "y": -1, "x": 2, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": -2, "x": 2, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": -2, "x": 2, "parts": [ "wheel_armor" ] }, + { "y": -2, "x": 2, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 2, "x": 1, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": 2, "x": 1, "parts": [ "wheel_armor" ] }, + { "y": 2, "x": 1, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 1, "x": 1, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": 0, "x": 1, "parts": [ "hdframe_vertical_2", "aisle_horizontal", "hdroof" ] }, { "y": -1, "x": 1, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": -2, "x": 1, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": -2, "x": 1, "parts": [ "wheel_armor" ] }, + { "y": -2, "x": 1, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 2, "x": 0, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": 2, "x": 0, "parts": [ "wheel_armor" ] }, + { "y": 2, "x": 0, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 1, "x": 0, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": 0, "x": 0, "parts": [ "hdframe_vertical_2", "aisle_horizontal", "hdroof" ] }, { "y": -1, "x": 0, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": -2, "x": 0, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, - { "y": -2, "x": 0, "parts": [ "wheel_armor" ] }, + { "y": -2, "x": 0, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "y": 2, "x": -1, "parts": [ "hdframe_vertical", "hdboard_vertical", "plating_military" ] }, { "y": 1, "x": -1, "parts": [ "hdframe_vertical_2", "seat", "hdroof" ] }, { "y": 0, "x": -1, "parts": [ "hdframe_vertical_2", "aisle_horizontal", "hdroof" ] }, @@ -169,10 +169,18 @@ { "x": 1, "y": -3, "parts": [ "hdframe_vertical", "board_vertical" ] }, { "x": -1, "y": 0, "parts": [ "hdframe_cross", "afs_hauling_space", "roof" ] }, { "x": -1, "y": -1, "parts": [ "hdframe_cross", "afs_hauling_space", "roof" ] }, - { "x": -1, "y": 1, "parts": [ "hdframe_horizontal", "wheel_wide", "afs_hauling_space", "roof" ] }, - { "x": -1, "y": -2, "parts": [ "hdframe_horizontal", "wheel_wide", "afs_hauling_space", "roof" ] }, - { "x": -1, "y": 2, "parts": [ "hdframe_horizontal", "board_vertical", "wheel_wide" ] }, - { "x": -1, "y": -3, "parts": [ "hdframe_horizontal", "board_vertical", "wheel_wide" ] }, + { + "x": -1, + "y": 1, + "parts": [ "hdframe_horizontal", "wheel_mount_medium", "wheel_wide", "afs_hauling_space", "roof" ] + }, + { + "x": -1, + "y": -2, + "parts": [ "hdframe_horizontal", "wheel_mount_medium", "wheel_wide", "afs_hauling_space", "roof" ] + }, + { "x": -1, "y": 2, "parts": [ "hdframe_horizontal", "board_vertical", "wheel_mount_medium", "wheel_wide" ] }, + { "x": -1, "y": -3, "parts": [ "hdframe_horizontal", "board_vertical", "wheel_mount_medium", "wheel_wide" ] }, { "x": 2, "y": 0, "parts": [ "hdframe_horizontal", "afs_hauling_space", "roof" ] }, { "x": 2, "y": -1, "parts": [ "hdframe_horizontal", "afs_hauling_space", "roof" ] }, { "x": 2, "y": 1, "parts": [ "hdframe_horizontal", "afs_hauling_space", "roof" ] }, @@ -181,10 +189,18 @@ { "x": 2, "y": -3, "parts": [ "hdframe_vertical", "board_vertical" ] }, { "x": -2, "y": 0, "parts": [ "hdframe_cross", "afs_hauling_space", "roof" ] }, { "x": -2, "y": -1, "parts": [ "hdframe_cross", "afs_hauling_space", "roof" ] }, - { "x": -2, "y": 1, "parts": [ "hdframe_horizontal", "wheel_wide", "afs_hauling_space", "roof" ] }, - { "x": -2, "y": -2, "parts": [ "hdframe_horizontal", "wheel_wide", "afs_hauling_space", "roof" ] }, - { "x": -2, "y": 2, "parts": [ "hdframe_horizontal", "board_vertical", "wheel_wide" ] }, - { "x": -2, "y": -3, "parts": [ "hdframe_horizontal", "board_vertical", "wheel_wide" ] }, + { + "x": -2, + "y": 1, + "parts": [ "hdframe_horizontal", "wheel_mount_medium", "wheel_wide", "afs_hauling_space", "roof" ] + }, + { + "x": -2, + "y": -2, + "parts": [ "hdframe_horizontal", "wheel_mount_medium", "wheel_wide", "afs_hauling_space", "roof" ] + }, + { "x": -2, "y": 2, "parts": [ "hdframe_horizontal", "board_vertical", "wheel_mount_medium", "wheel_wide" ] }, + { "x": -2, "y": -3, "parts": [ "hdframe_horizontal", "board_vertical", "wheel_mount_medium", "wheel_wide" ] }, { "x": 3, "y": 0, "parts": [ "hdframe_horizontal", "afs_hauling_space", "roof" ] }, { "x": 3, "y": -1, "parts": [ "hdframe_horizontal", "afs_hauling_space", "roof" ] }, { "x": 3, "y": 1, "parts": [ "hdframe_horizontal", "afs_hauling_space", "roof" ] }, @@ -301,15 +317,25 @@ { "x": -1, "y": 1, - "parts": [ "hdframe_horizontal", "wheel_wide", { "fuel": "gasoline", "part": "afs_mounted_external_tank" } ] + "parts": [ + "hdframe_horizontal", + "wheel_mount_medium", + "wheel_wide", + { "fuel": "gasoline", "part": "afs_mounted_external_tank" } + ] }, { "x": -1, "y": -2, - "parts": [ "hdframe_horizontal", "wheel_wide", { "fuel": "gasoline", "part": "afs_mounted_external_tank" } ] + "parts": [ + "hdframe_horizontal", + "wheel_mount_medium", + "wheel_wide", + { "fuel": "gasoline", "part": "afs_mounted_external_tank" } + ] }, - { "x": -1, "y": 2, "parts": [ "hdframe_horizontal", "wheel_wide" ] }, - { "x": -1, "y": -3, "parts": [ "hdframe_horizontal", "wheel_wide" ] }, + { "x": -1, "y": 2, "parts": [ "hdframe_horizontal", "wheel_mount_medium", "wheel_wide" ] }, + { "x": -1, "y": -3, "parts": [ "hdframe_horizontal", "wheel_mount_medium", "wheel_wide" ] }, { "x": 2, "y": 0, @@ -337,15 +363,25 @@ { "x": -2, "y": 1, - "parts": [ "hdframe_horizontal", "wheel_wide", { "fuel": "gasoline", "part": "afs_mounted_external_tank" } ] + "parts": [ + "hdframe_horizontal", + "wheel_mount_medium", + "wheel_wide", + { "fuel": "gasoline", "part": "afs_mounted_external_tank" } + ] }, { "x": -2, "y": -2, - "parts": [ "hdframe_horizontal", "wheel_wide", { "fuel": "gasoline", "part": "afs_mounted_external_tank" } ] + "parts": [ + "hdframe_horizontal", + "wheel_mount_medium", + "wheel_wide", + { "fuel": "gasoline", "part": "afs_mounted_external_tank" } + ] }, - { "x": -2, "y": 2, "parts": [ "hdframe_horizontal", "wheel_wide" ] }, - { "x": -2, "y": -3, "parts": [ "hdframe_horizontal", "wheel_wide" ] }, + { "x": -2, "y": 2, "parts": [ "hdframe_horizontal", "wheel_mount_medium", "wheel_wide" ] }, + { "x": -2, "y": -3, "parts": [ "hdframe_horizontal", "wheel_mount_medium", "wheel_wide" ] }, { "x": -3, "y": 2, "parts": [ "hdframe_vertical" ] }, { "x": -3, "y": -3, "parts": [ "hdframe_vertical" ] }, { @@ -440,15 +476,15 @@ { "x": -1, "y": 1, - "parts": [ "hdframe_horizontal", "wheel_wide", { "fuel": "water", "part": "afs_mounted_external_tank" } ] + "parts": [ "hdframe_horizontal", "wheel_mount_medium", "wheel_wide", { "fuel": "water", "part": "afs_mounted_external_tank" } ] }, { "x": -1, "y": -2, - "parts": [ "hdframe_horizontal", "wheel_wide", { "fuel": "water", "part": "afs_mounted_external_tank" } ] + "parts": [ "hdframe_horizontal", "wheel_mount_medium", "wheel_wide", { "fuel": "water", "part": "afs_mounted_external_tank" } ] }, - { "x": -1, "y": 2, "parts": [ "hdframe_horizontal", "wheel_wide" ] }, - { "x": -1, "y": -3, "parts": [ "hdframe_horizontal", "wheel_wide" ] }, + { "x": -1, "y": 2, "parts": [ "hdframe_horizontal", "wheel_mount_medium", "wheel_wide" ] }, + { "x": -1, "y": -3, "parts": [ "hdframe_horizontal", "wheel_mount_medium", "wheel_wide" ] }, { "x": 2, "y": 0, "parts": [ "hdframe_horizontal", { "fuel": "water", "part": "afs_mounted_external_tank" } ] }, { "x": 2, "y": -1, "parts": [ "hdframe_horizontal", { "fuel": "water", "part": "afs_mounted_external_tank" } ] }, { "x": 2, "y": 1, "parts": [ "hdframe_horizontal", { "fuel": "water", "part": "afs_mounted_external_tank" } ] }, @@ -460,15 +496,15 @@ { "x": -2, "y": 1, - "parts": [ "hdframe_horizontal", "wheel_wide", { "fuel": "water", "part": "afs_mounted_external_tank" } ] + "parts": [ "hdframe_horizontal", "wheel_mount_medium", "wheel_wide", { "fuel": "water", "part": "afs_mounted_external_tank" } ] }, { "x": -2, "y": -2, - "parts": [ "hdframe_horizontal", "wheel_wide", { "fuel": "water", "part": "afs_mounted_external_tank" } ] + "parts": [ "hdframe_horizontal", "wheel_mount_medium", "wheel_wide", { "fuel": "water", "part": "afs_mounted_external_tank" } ] }, - { "x": -2, "y": 2, "parts": [ "hdframe_horizontal", "wheel_wide" ] }, - { "x": -2, "y": -3, "parts": [ "hdframe_horizontal", "wheel_wide" ] }, + { "x": -2, "y": 2, "parts": [ "hdframe_horizontal", "wheel_mount_medium", "wheel_wide" ] }, + { "x": -2, "y": -3, "parts": [ "hdframe_horizontal", "wheel_mount_medium", "wheel_wide" ] }, { "x": -3, "y": 2, "parts": [ "hdframe_vertical" ] }, { "x": -3, "y": -3, "parts": [ "hdframe_vertical" ] }, { "x": 3, "y": 0, "parts": [ "hdframe_horizontal", { "fuel": "water", "part": "afs_mounted_external_tank" } ] }, diff --git a/data/mods/Aftershock/vehicles/afs_vehicle_parts.json b/data/mods/Aftershock/vehicles/afs_vehicle_parts.json index 2118a0f8beb68..eaa6a41f22333 100644 --- a/data/mods/Aftershock/vehicles/afs_vehicle_parts.json +++ b/data/mods/Aftershock/vehicles/afs_vehicle_parts.json @@ -211,27 +211,6 @@ { "item": "e_scrap", "charges": [ 3, 8 ] } ] }, - { - "id": "afs_large_storage_battery", - "type": "vehicle_part", - "name": "large storage battery", - "item": "afs_large_storage_battery", - "location": "fuel_source", - "fuel_type": "battery", - "symbol": "O", - "color": "yellow", - "broken_color": "red", - "difficulty": 3, - "durability": 600, - "description": "A battery for storing electrical power, and discharging it to power electrical devices built into the vehicle.", - "damage_modifier": 80, - "breaks_into": [ - { "item": "steel_lump", "count": [ 10, 20 ] }, - { "item": "steel_chunk", "count": [ 5, 10 ] }, - { "item": "scrap", "count": [ 5, 10 ] }, - { "item": "storage_battery", "count": [ 0, 1 ] } - ] - }, { "id": "afs_roof_external_tank", "copy-from": "external_tank_small", diff --git a/data/mods/Aftershock/vehicles/afs_vehicles.json b/data/mods/Aftershock/vehicles/afs_vehicles.json index b37288eb92829..9fc911500fbde 100644 --- a/data/mods/Aftershock/vehicles/afs_vehicles.json +++ b/data/mods/Aftershock/vehicles/afs_vehicles.json @@ -6,8 +6,12 @@ "blueprint": [ "o#o" ], "parts": [ { "x": 0, "y": 0, "parts": [ "afs_lightweight_frame_vertical_2", "saddle", "foot_pedals" ] }, - { "x": 1, "y": 0, "parts": [ "afs_lightweight_frame_vertical", "wheel_bicycle_steerable" ] }, - { "x": -1, "y": 0, "parts": [ "afs_lightweight_frame_vertical", "wheel_bicycle" ] } + { + "x": 1, + "y": 0, + "parts": [ "afs_lightweight_frame_vertical", "wheel_mount_light_steerable", "wheel_bicycle" ] + }, + { "x": -1, "y": 0, "parts": [ "afs_lightweight_frame_vertical", "wheel_mount_light", "wheel_bicycle" ] } ] }, { @@ -47,10 +51,10 @@ { "x": -1, "y": 1, "part": "board_horizontal" }, { "x": -1, "y": 3, "part": "hdframe_horizontal" }, { "x": -1, "y": 3, "part": "board_horizontal" }, - { "x": -1, "y": 3, "part": "afs_large_storage_battery" }, + { "x": -1, "y": 3, "part": "large_storage_battery" }, { "x": -1, "y": 0, "part": "hdframe_horizontal" }, { "x": -1, "y": 0, "part": "board_horizontal" }, - { "x": -1, "y": 0, "part": "afs_large_storage_battery" }, + { "x": -1, "y": 0, "part": "large_storage_battery" }, { "x": -1, "y": 4, "part": "hdframe_vertical" }, { "x": -1, "y": 4, "part": "board_vertical" }, { "x": -1, "y": -1, "part": "hdframe_vertical" }, @@ -113,13 +117,13 @@ { "x": -5, "y": 2, "part": "hdframe_cross" }, { "x": -5, "y": 1, "part": "hdframe_cross" }, { "x": -5, "y": 3, "part": "hdframe_horizontal" }, - { "x": -5, "y": 3, "part": "wheel_wide" }, + { "x": -5, "y": 3, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -5, "y": 0, "part": "hdframe_horizontal" }, - { "x": -5, "y": 0, "part": "wheel_wide" }, + { "x": -5, "y": 0, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -5, "y": 4, "part": "hdframe_horizontal" }, - { "x": -5, "y": 4, "part": "wheel_wide" }, + { "x": -5, "y": 4, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -5, "y": -1, "part": "hdframe_horizontal" }, - { "x": -5, "y": -1, "part": "wheel_wide" }, + { "x": -5, "y": -1, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": 2, "y": 2, "part": "hdframe_vertical_2" }, { "x": 2, "y": 2, "part": "halfboard_vertical_2" }, { "x": 2, "y": 2, "part": "engine_electric_large" }, @@ -136,20 +140,20 @@ { "x": 2, "y": 0, "part": "reinforced_solar_panel" }, { "x": 2, "y": 4, "part": "hdframe_vertical" }, { "x": 2, "y": 4, "part": "halfboard_vertical" }, - { "x": 2, "y": 4, "part": "wheel_wide_steerable" }, + { "x": 2, "y": 4, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": 2, "y": -1, "part": "hdframe_vertical" }, { "x": 2, "y": -1, "part": "halfboard_vertical" }, - { "x": 2, "y": -1, "part": "wheel_wide_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel_wide" ] }, { "x": -6, "y": 2, "part": "hdframe_cross" }, { "x": -6, "y": 1, "part": "hdframe_cross" }, { "x": -6, "y": 3, "part": "hdframe_horizontal" }, - { "x": -6, "y": 3, "part": "wheel_wide" }, + { "x": -6, "y": 3, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -6, "y": 0, "part": "hdframe_horizontal" }, - { "x": -6, "y": 0, "part": "wheel_wide" }, + { "x": -6, "y": 0, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -6, "y": 4, "part": "hdframe_horizontal" }, - { "x": -6, "y": 4, "part": "wheel_wide" }, + { "x": -6, "y": 4, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": -6, "y": -1, "part": "hdframe_horizontal" }, - { "x": -6, "y": -1, "part": "wheel_wide" }, + { "x": -6, "y": -1, "parts": [ "wheel_mount_medium", "wheel_wide" ] }, { "x": 3, "y": 2, "part": "hdframe_cover" }, { "x": 3, "y": 2, "part": "halfboard_cover" }, { "x": 3, "y": 1, "part": "hdframe_cover" }, @@ -201,7 +205,7 @@ { "x": 1, "y": 0, "part": "xlframe_horizontal" }, { "x": 1, "y": 0, "part": "windshield" }, { "x": 1, "y": 0, "part": "headlight" }, - { "x": 1, "y": 0, "part": "wheel_steerable" }, + { "x": 1, "y": 0, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 1, "y": 1, "part": "xlframe_horizontal" }, { "x": 1, "y": 1, "part": "xlhalfboard_vertical" }, { "x": 1, "y": -1, "part": "xlframe_vertical" }, @@ -220,13 +224,13 @@ { "x": -1, "y": 1, "part": "plating_steel" }, { "x": -2, "y": -1, "part": "xlframe_horizontal" }, { "x": -2, "y": -1, "part": "xlhalfboard_sw" }, - { "x": -2, "y": -1, "part": "wheel" }, + { "x": -2, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -2, "y": 0, "part": "xlframe_horizontal" }, { "x": -2, "y": 0, "part": "windshield" }, { "x": -2, "y": 1, "part": "xlframe_horizontal" }, { "x": -2, "y": 1, "part": "engine_electric" }, { "x": -2, "y": 1, "part": "halfboard_vertical_2" }, - { "x": -2, "y": 1, "part": "wheel" }, + { "x": -2, "y": 1, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -2, "y": 1, "part": "plating_steel" } ], "items": [ @@ -301,11 +305,11 @@ { "x": 2, "y": 2, "part": "halfboard_horizontal" }, { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, - { "x": 2, "y": -1, "part": "wheel_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": -1, "part": "headlight" }, { "x": 2, "y": 3, "part": "frame_ne" }, { "x": 2, "y": 3, "part": "halfboard_ne" }, - { "x": 2, "y": 3, "part": "wheel_steerable" }, + { "x": 2, "y": 3, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": 3, "part": "headlight" }, { "x": -2, "y": 0, "part": "frame_vertical" }, { "x": -2, "y": 0, "part": "trunk" }, @@ -323,7 +327,7 @@ { "x": -2, "y": 3, "part": "halfboard_vertical" }, { "x": -3, "y": -1, "part": "frame_horizontal" }, { "x": -3, "y": -1, "part": "halfboard_sw" }, - { "x": -3, "y": -1, "part": "wheel" }, + { "x": -3, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -3, "y": 0, "part": "frame_horizontal" }, { "x": -3, "y": 0, "part": "door_trunk" }, { "x": -3, "y": 1, "part": "frame_horizontal_2" }, @@ -335,7 +339,7 @@ { "x": -3, "y": 2, "part": "door_trunk" }, { "x": -3, "y": 3, "part": "frame_horizontal" }, { "x": -3, "y": 3, "part": "halfboard_se" }, - { "x": -3, "y": 3, "part": "wheel" } + { "x": -3, "y": 3, "parts": [ "wheel_mount_medium", "wheel" ] } ], "items": [ { "x": 0, "y": 0, "chance": 14, "item_groups": [ "car_misc" ] }, @@ -407,11 +411,11 @@ { "x": 2, "y": 1, "part": "plating_steel" }, { "x": 2, "y": -1, "part": "frame_nw" }, { "x": 2, "y": -1, "part": "halfboard_nw" }, - { "x": 2, "y": -1, "part": "wheel_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": -1, "part": "headlight" }, { "x": 2, "y": 2, "part": "frame_ne" }, { "x": 2, "y": 2, "part": "halfboard_ne" }, - { "x": 2, "y": 2, "part": "wheel_steerable" }, + { "x": 2, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 2, "y": 2, "part": "headlight" }, { "x": -2, "y": 0, "part": "frame_vertical" }, { "x": -2, "y": 0, "part": "trunk" }, @@ -425,14 +429,14 @@ { "x": -2, "y": 2, "part": "halfboard_vertical" }, { "x": -3, "y": -1, "part": "frame_horizontal" }, { "x": -3, "y": -1, "part": "halfboard_sw" }, - { "x": -3, "y": -1, "part": "wheel" }, + { "x": -3, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -3, "y": 0, "part": "frame_horizontal" }, { "x": -3, "y": 0, "part": "door_trunk" }, { "x": -3, "y": 1, "part": "frame_horizontal" }, { "x": -3, "y": 1, "part": "door_trunk" }, { "x": -3, "y": 2, "part": "frame_horizontal" }, { "x": -3, "y": 2, "part": "halfboard_se" }, - { "x": -3, "y": 2, "part": "wheel" } + { "x": -3, "y": 2, "parts": [ "wheel_mount_medium", "wheel" ] } ], "items": [ { "x": 0, "y": 0, "chance": 14, "item_groups": [ "car_misc" ] }, @@ -473,10 +477,10 @@ { "x": -1, "y": 1, "part": "frame_vertical_2" }, { "x": -1, "y": 1, "part": "minireactor" }, { "x": -1, "y": -1, "part": "frame_vertical" }, - { "x": -1, "y": -1, "part": "wheel" }, + { "x": -1, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -1, "y": -1, "part": "storage_battery" }, { "x": -1, "y": 2, "part": "frame_vertical" }, - { "x": -1, "y": 2, "part": "wheel" }, + { "x": -1, "y": 2, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -1, "y": 2, "part": "storage_battery" }, { "x": 1, "y": 0, "part": "frame_horizontal" }, { "x": 1, "y": 0, "part": "engine_electric_large" }, @@ -485,11 +489,11 @@ { "x": 1, "y": 1, "part": "frame_horizontal" }, { "x": 1, "y": 1, "part": "storage_battery_mount", "//": "to make the blazemod happy" }, { "x": 1, "y": -1, "part": "frame_nw" }, - { "x": 1, "y": -1, "part": "wheel_steerable" }, + { "x": 1, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 1, "y": -1, "part": "turret_mount" }, { "x": 1, "y": -1, "part": "watercannon" }, { "x": 1, "y": 2, "part": "frame_ne" }, - { "x": 1, "y": 2, "part": "wheel_steerable" }, + { "x": 1, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 1, "y": 2, "part": "tank", "fuel": "water" }, { "x": 1, "y": 2, "part": "turret_mount" }, { "x": 1, "y": 2, "part": "m249", "ammo": 100 } diff --git a/data/mods/CRT_EXPANSION/crt_materials.json b/data/mods/CRT_EXPANSION/crt_materials.json index a6e6c4d269069..d4ce6d0592136 100644 --- a/data/mods/CRT_EXPANSION/crt_materials.json +++ b/data/mods/CRT_EXPANSION/crt_materials.json @@ -11,7 +11,7 @@ "fire_resist": 1, "elec_resist": 20, "chip_resist": 9, - "repaired_with": [ "plastic_chunk", "chunk_rubber" ], + "repaired_with": "plastic_chunk", "salvaged_into": "chunk_rubber", "dmg_adj": [ "ripped", "torn", "shredded", "tattered" ], "bash_dmg_verb": "ripped", diff --git a/data/mods/Craft_Gunpowder/cgp_recipes.json b/data/mods/Craft_Gunpowder/cgp_recipes.json index 0c0777336e716..f73bcb1507c82 100644 --- a/data/mods/Craft_Gunpowder/cgp_recipes.json +++ b/data/mods/Craft_Gunpowder/cgp_recipes.json @@ -150,34 +150,6 @@ ] ] }, - { - "type": "recipe", - "result": "smg_22", - "category": "CC_WEAPON", - "subcategory": "CSC_WEAPON_RANGED", - "skill_used": "mechanics", - "skills_required": [ "gun", 4 ], - "difficulty": 6, - "time": 36000, - "reversible": true, - "autolearn": true, - "qualities": [ { "id": "SAW_M_FINE", "level": 1 }, { "id": "SCREW_FINE", "level": 1 } ], - "components": [ [ [ "pipe", 2 ] ], [ [ "scrap", 3 ] ], [ [ "spring", 1 ] ], [ [ "2x4", 2 ] ], [ [ "sheet_metal", 1 ] ] ] - }, - { - "type": "recipe", - "result": "smg_38", - "category": "CC_WEAPON", - "subcategory": "CSC_WEAPON_RANGED", - "skill_used": "mechanics", - "skills_required": [ "gun", 4 ], - "difficulty": 6, - "time": 36000, - "reversible": true, - "autolearn": true, - "qualities": [ { "id": "SAW_M_FINE", "level": 1 }, { "id": "SCREW_FINE", "level": 1 } ], - "components": [ [ [ "pipe", 2 ] ], [ [ "scrap", 3 ] ], [ [ "spring", 1 ] ], [ [ "2x4", 2 ] ], [ [ "sheet_metal", 1 ] ] ] - }, { "type": "recipe", "result": "smg_9mm", diff --git a/data/mods/CrazyCataclysm/crazy_vehicles.json b/data/mods/CrazyCataclysm/crazy_vehicles.json index f4cc12590e42d..dc724e07f84f4 100644 --- a/data/mods/CrazyCataclysm/crazy_vehicles.json +++ b/data/mods/CrazyCataclysm/crazy_vehicles.json @@ -28,10 +28,10 @@ { "x": -1, "y": 1, "part": "frame_vertical_2" }, { "x": -1, "y": 1, "part": "minireactor" }, { "x": -1, "y": -1, "part": "frame_vertical" }, - { "x": -1, "y": -1, "part": "wheel" }, + { "x": -1, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -1, "y": -1, "part": "storage_battery" }, { "x": -1, "y": 2, "part": "frame_vertical" }, - { "x": -1, "y": 2, "part": "wheel" }, + { "x": -1, "y": 2, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -1, "y": 2, "part": "storage_battery" }, { "x": 1, "y": 0, "part": "frame_horizontal" }, { "x": 1, "y": 0, "part": "engine_electric_large" }, @@ -40,11 +40,11 @@ { "x": 1, "y": 1, "part": "frame_horizontal" }, { "x": 1, "y": 1, "part": "storage_battery_mount", "//": "to make the blazemod happy" }, { "x": 1, "y": -1, "part": "frame_nw" }, - { "x": 1, "y": -1, "part": "wheel_steerable" }, + { "x": 1, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 1, "y": -1, "part": "turret_mount" }, { "x": 1, "y": -1, "part": "watercannon" }, { "x": 1, "y": 2, "part": "frame_ne" }, - { "x": 1, "y": 2, "part": "wheel_steerable" }, + { "x": 1, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": 1, "y": 2, "part": "tank", "fuel": "water" }, { "x": 1, "y": 2, "part": "turret_mount" }, { "x": 1, "y": 2, "part": "m249", "ammo": 100 } diff --git a/data/mods/Fuji_Structures/npc/npc.json b/data/mods/Fuji_Structures/npc/npc.json index c0e40e0b52bf5..2f35fab32b308 100644 --- a/data/mods/Fuji_Structures/npc/npc.json +++ b/data/mods/Fuji_Structures/npc/npc.json @@ -7,6 +7,6 @@ "attitude": 0, "mission": 3, "chat": "TALK_BUNKER_MERCHANT", - "faction": "wasteland_scavengers" + "faction": "no_faction" } ] diff --git a/data/mods/Fuji_Structures/starts/professions.json b/data/mods/Fuji_Structures/starts/professions.json index 5dcab5469feba..50597a997504b 100644 --- a/data/mods/Fuji_Structures/starts/professions.json +++ b/data/mods/Fuji_Structures/starts/professions.json @@ -49,7 +49,7 @@ ], "entries": [ { "item": "hk_mp5", "ammo-item": "9mmfmj", "charges": 30, "contents-item": "folding_stock" }, - { "item": "mp5mag", "ammo-item": "9mmfmj", "charges": 30, "container-item": "chestrig" }, + { "item": "mp5mag", "ammo-item": "9mmfmj", "charges": 30, "container-item": "tacvest" }, { "item": "knife_combat", "container-item": "sheath" } ] }, diff --git a/data/mods/Fuji_Structures/worldgen/gas/s_gas_b11.json b/data/mods/Fuji_Structures/worldgen/gas/s_gas_b11.json index e6a369bc29e1d..33fb4f7dd4d73 100644 --- a/data/mods/Fuji_Structures/worldgen/gas/s_gas_b11.json +++ b/data/mods/Fuji_Structures/worldgen/gas/s_gas_b11.json @@ -66,7 +66,7 @@ { "group": "bed", "chance": 60, "repeat": [ 2 ], "x": [ 13, 14 ], "y": [ 12, 12 ] }, { "group": "bed", "chance": 60, "repeat": [ 2 ], "x": [ 13, 14 ], "y": [ 15, 15 ] } ], - "monster": { "q": { "monster": "mon_turret" }, "r": { "monster": "mon_zombie_soldier" } } + "monster": { "q": { "monster": "mon_turret_rifle" }, "r": { "monster": "mon_zombie_soldier" } } } } ] diff --git a/data/mods/Fuji_Structures/worldgen/overmap_multitile_city.json b/data/mods/Fuji_Structures/worldgen/overmap_multitile_city.json new file mode 100644 index 0000000000000..bcc733a231448 --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/overmap_multitile_city.json @@ -0,0 +1,72 @@ +[ + { + "type": "city_building", + "id": "s_electronicstore", + "locations": [ "land" ], + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "s_electronicstore_north" }, + { "point": [ 0, 0, 1 ], "overmap": "s_electronicstore_2ndfloor_north" } + ] + }, + { + "type": "city_building", + "id": "s_gunstore", + "locations": [ "land" ], + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "s_gunstore_north" }, + { "point": [ 0, 0, 1 ], "overmap": "s_gunstore_2ndfloor_north" }, + { "point": [ 0, 0, 2 ], "overmap": "s_gunstore_roof_north" } + ] + }, + { + "type": "city_building", + "id": "s_camping", + "locations": [ "land" ], + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "s_camping_north" }, { "point": [ 0, 0, 1 ], "overmap": "s_camping_roof_north" } ] + }, + { + "type": "city_building", + "id": "s_cardealer", + "locations": [ "land" ], + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "s_cardealer_north" }, + { "point": [ 0, 0, 1 ], "overmap": "s_cardealer_roof_north" } + ] + }, + { + "type": "city_building", + "id": "s_diner", + "locations": [ "land" ], + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "s_diner_north" }, + { "point": [ 0, 0, 1 ], "overmap": "s_diner_2ndfloor_north" }, + { "point": [ 0, 0, 2 ], "overmap": "s_diner_roof_north" } + ] + }, + { + "type": "city_building", + "id": "s_games", + "locations": [ "land" ], + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "s_games_north" }, { "point": [ 0, 0, 1 ], "overmap": "s_games_roof_north" } ] + }, + { + "type": "city_building", + "id": "s_apt", + "locations": [ "land" ], + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "s_apt_north" }, + { "point": [ 0, 0, 1 ], "overmap": "s_apt_2ndfloor_north" }, + { "point": [ 0, 0, 2 ], "overmap": "s_apt_roof_north" } + ] + }, + { + "type": "city_building", + "id": "s_apt_2", + "locations": [ "land" ], + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "s_apt_2_north" }, + { "point": [ 0, 0, 1 ], "overmap": "s_apt_2_2ndfloor_north" }, + { "point": [ 0, 0, 2 ], "overmap": "s_apt_2_roof_north" } + ] + } +] diff --git a/data/mods/Fuji_Structures/worldgen/overmap_terrain.json b/data/mods/Fuji_Structures/worldgen/overmap_terrain.json index 52879d52c55ec..750716b5a6b7b 100644 --- a/data/mods/Fuji_Structures/worldgen/overmap_terrain.json +++ b/data/mods/Fuji_Structures/worldgen/overmap_terrain.json @@ -1,80 +1,138 @@ [ + { + "type": "overmap_terrain", + "id": "s_electronicstore", + "name": "electronics store", + "copy-from": "generic_city_building", + "color": "yellow" + }, + { + "type": "overmap_terrain", + "id": "s_electronicstore_2ndfloor", + "name": "electronics store", + "copy-from": "s_electronicstore", + "color": "yellow" + }, { "type": "overmap_terrain", "id": "s_gunstore", "name": "gun store", - "sym": "g", - "color": "red", - "see_cost": 5, - "extras": "build", - "mondensity": 2, - "flags": [ "SIDEWALK" ] + "copy-from": "generic_city_building", + "color": "red" + }, + { + "type": "overmap_terrain", + "id": "s_gunstore_2ndfloor", + "name": "gun store", + "copy-from": "s_gunstore" + }, + { + "type": "overmap_terrain", + "id": "s_gunstore_roof", + "name": "gun store", + "copy-from": "s_gunstore" }, { "type": "overmap_terrain", "id": "s_diner", "name": "diner", + "copy-from": "generic_city_building", "sym": "d", - "color": "green", - "see_cost": 5, - "extras": "build", - "mondensity": 2, - "flags": [ "SIDEWALK" ] + "color": "green" + }, + { + "type": "overmap_terrain", + "id": "s_diner_2ndfloor", + "name": "diner", + "copy-from": "s_diner" + }, + { + "type": "overmap_terrain", + "id": "s_diner_roof", + "name": "diner", + "copy-from": "s_diner" }, { "type": "overmap_terrain", "id": "s_apt", "name": "apartment", + "copy-from": "generic_city_building", "sym": "A", - "color": "light_green", - "see_cost": 5, - "extras": "build", - "mondensity": 2, - "flags": [ "SIDEWALK" ] + "color": "light_green" + }, + { + "type": "overmap_terrain", + "id": "s_apt_2ndfloor", + "name": "apartment", + "copy-from": "s_apt" + }, + { + "type": "overmap_terrain", + "id": "s_apt_roof", + "name": "apartment", + "copy-from": "s_apt" }, { "type": "overmap_terrain", "id": "s_apt_2", "name": "apartment", + "copy-from": "generic_city_building", "sym": "A", - "color": "light_green", - "see_cost": 5, - "extras": "build", - "mondensity": 2, - "flags": [ "SIDEWALK" ] + "color": "light_green" + }, + { + "type": "overmap_terrain", + "id": "s_apt_2_2ndfloor", + "name": "apartment", + "copy-from": "s_apt_2" + }, + { + "type": "overmap_terrain", + "id": "s_apt_2_roof", + "name": "apartment", + "copy-from": "s_apt_2" }, { "type": "overmap_terrain", "id": "s_cardealer", "name": "dealership", + "copy-from": "generic_city_building", "sym": "0", - "color": "blue", - "see_cost": 5, - "extras": "build", - "mondensity": 2, - "flags": [ "SIDEWALK" ] + "color": "blue" + }, + { + "type": "overmap_terrain", + "id": "s_cardealer_roof", + "name": "dealership", + "copy-from": "s_cardealer" }, { "type": "overmap_terrain", "id": "s_camping", "name": "outdoorsman's store", + "copy-from": "generic_city_building", "sym": "o", - "color": "brown", - "see_cost": 5, - "extras": "build", - "mondensity": 2, - "flags": [ "SIDEWALK" ] + "color": "brown" + }, + { + "type": "overmap_terrain", + "id": "s_camping_roof", + "name": "outdoorsman's store", + "copy-from": "s_camping" }, { "type": "overmap_terrain", "id": "s_games", "name": "gaming store", + "copy-from": "generic_city_building", "sym": "g", - "color": "cyan", - "see_cost": 5, - "extras": "build", - "mondensity": 2, - "flags": [ "SIDEWALK" ] + "color": "cyan" + }, + { + "type": "overmap_terrain", + "id": "s_games_roof", + "name": "gaming store", + "copy-from": "s_games" }, { "type": "overmap_terrain", diff --git a/data/mods/Fuji_Structures/worldgen/palette_electronic.json b/data/mods/Fuji_Structures/worldgen/palette_electronic.json new file mode 100644 index 0000000000000..1492c445231f4 --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/palette_electronic.json @@ -0,0 +1,59 @@ +[ + { + "type": "palette", + "id": "electro_palette", + "terrain": { + " ": [ [ "t_dirt", 5 ], [ "t_grass", 16 ], [ "t_grass_long", 5 ], [ "t_underbrush", 1 ] ], + ",": "t_floor", + "_": "t_thconc_floor", + "^": "t_carpet_yellow", + "C": "t_carpet_yellow", + "!": "t_pavement", + "+": "t_door_c", + "-": "t_brick_wall", + "=": "t_door_metal_c", + "D": "t_door_locked_interior", + "G": "t_door_glass_c", + "W": "t_wall_glass", + "w": "t_window", + "s": "t_sidewalk", + "x": "t_console_broken", + "f": "t_chainfence_v", + "g": "t_chaingate_c", + "<": "t_stairs_up", + "|": "t_ladder_up", + "O": "t_thconc_floor", + "(": "t_pavement" + }, + "furniture": { + "n": "f_displaycase", + "1": "f_rack", + "2": "f_rack", + "3": "f_rack", + "4": "f_rack", + "m": "f_rack", + "C": "f_counter", + "t": "f_counter", + "d": "f_desk", + "S": "f_sink", + "f": "f_filing_cabinet", + "c": "f_chair", + "o": "f_crate_c", + "O": "f_crate_c", + "(": "f_dumpster" + }, + "toilets": { "T": { } }, + "items": { + "1": { "item": "elecsto_books", "chance": 10 }, + "2": { "item": "elecsto_homapl", "chance": 50 }, + "3": { "item": "elecsto_lights", "chance": 20 }, + "4": { "item": "elecsto_diy", "chance": 35 }, + "C": { "item": "elecsto_displ", "chance": 20 }, + "n": { "item": "elecsto_persele", "chance": 50 }, + "o": { "item": "supplies_electronics", "chance": 50, "repeat": [ 2, 5 ] }, + "O": { "item": "supplies_electronics", "chance": 50, "repeat": [ 3, 5 ] }, + "d": { "item": "office_mess", "chance": 20, "repeat": [ 1, 2 ] }, + "f": { "item": "file_room", "chance": 50, "repeat": [ 1, 5 ] } + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/s_apt.json b/data/mods/Fuji_Structures/worldgen/s_apt.json index d4b2d8dbaef7b..4df9c9680ca61 100644 --- a/data/mods/Fuji_Structures/worldgen/s_apt.json +++ b/data/mods/Fuji_Structures/worldgen/s_apt.json @@ -6,127 +6,35 @@ "object": { "fill_ter": "t_floor", "rows": [ - "aabaaaabaabcbaabaaaabaar", - "aqppqakkla al aq ar", - "b pp c ia ai c ppbr", - "a a ha ah ma ar", - "aaaaaa ja aj laaaaaar", - "rbo c c c c obrr", - "raoniamlma a ainoarr", - "aaaaaaaaaa aaaaaaaaaar", - "a qa la amlma p ar", - "b p c ia ai c p br", - "a p ak ha ah aq ar", - "aaaaaak ja aj aaaaaar", - "rbo c c c c obrr", - "raoniamlma alkkainoarr", - "aaaaaaaaaa aaaaaaaaaar", - "a a a a al a qar", - "adeadeadea ai c ppbr", - "a a ah la qar", - "a a aj maaaaaar", - "adeadea c c c obrr", - "a a agfa akkmainoarr", - "aaaaaaaaaa aabaaaaaarr", - "rrrrrrrrraacaarrrrrrrrrr", - "rrrrrrrrrrrrrrrrrrrrrrrr" + "--w----w--W+W--w----w-- ", + "-dBBd-FFt-...-t..-d...- ", + "w.BB.+..3-.<.-3..+..BBw ", + "-....-..O-...-O.A-....- ", + "------..e-...-e.t------ ", + " wwii+...D...D...+iiww ", + " -wTS-hth-...-...-STw- ", + "----------...---------- ", + "-...d-..t-...-th.-..B.- ", + "w.B..+..3-...-3..+..B.w ", + "-.B..-F.O-...-O..-d...- ", + "------F.e-...-e..------ ", + " wwii+...D...D...+iiww ", + " -wTS-hth-...-tFF-STw- ", + "----------...---------- ", + "-ii-ii-ii-...-t..-...d- ", + "-fg-fg-fg-...-3..+..BBw ", + "-iiiiiiii-...-O.t-...d- ", + "-iiiiiiii-...-e.h------ ", + "-fg-fg-iiD.<.D...+iiww ", + "-ii-ii-gf-...-FFA-STw- ", + "----------...--w------ ", + " -W+W- ", + " " ], - "terrain": { - "a": "t_wall", - "b": "t_window_domestic", - "c": "t_door_c", - "d": "t_chainfence_v", - "e": "t_chaingate_c", - "f": "t_floor", - "g": "t_floor", - "h": "t_floor", - "i": "t_floor", - "j": "t_floor", - "k": "t_floor", - "l": "t_floor", - "m": "t_floor", - "n": "t_floor", - "o": "t_floor", - "p": "t_floor", - "q": "t_floor", - "r": [ "t_grass", "t_grass", "t_grass", "t_dirt" ] - }, - "furniture": { - "f": "f_washer", - "g": "f_dryer", - "h": "f_oven", - "i": "f_sink", - "j": "f_fridge", - "k": "f_sofa", - "l": "f_table", - "m": "f_chair", - "o": "f_bathtub", - "p": "f_bed", - "q": "f_dresser" - }, - "toilets": { "n": { } }, + "palettes": [ "apartment_palette" ], + "terrain": { "4": "t_linoleum_white", "5": "t_linoleum_white" }, + "furniture": { "4": "f_washer", "5": "f_dryer" }, "place_loot": [ - { "group": "bed", "chance": 50, "repeat": [ 2 ], "x": [ 2, 2 ], "y": [ 9, 10 ] }, - { "group": "bed", "chance": 50, "repeat": [ 2 ], "x": [ 2, 2 ], "y": [ 1, 2 ] }, - { "group": "bed", "chance": 50, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 1, 2 ] }, - { "group": "bed", "chance": 50, "repeat": [ 2 ], "x": [ 20, 21 ], "y": [ 2, 2 ] }, - { "group": "bed", "chance": 50, "repeat": [ 2 ], "x": [ 20, 20 ], "y": [ 8, 9 ] }, - { "group": "bed", "chance": 50, "repeat": [ 2 ], "x": [ 20, 21 ], "y": [ 16, 16 ] }, - { "group": "oven", "chance": 50, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 17, 17 ] }, - { "group": "oven", "chance": 50, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 10, 10 ] }, - { "group": "oven", "chance": 50, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 3, 3 ] }, - { "group": "oven", "chance": 50, "repeat": [ 2 ], "x": [ 8, 8 ], "y": [ 3, 3 ] }, - { "group": "oven", "chance": 50, "repeat": [ 2 ], "x": [ 8, 8 ], "y": [ 10, 10 ] }, - { "group": "kitchen", "chance": 50, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 9, 9 ] }, - { "group": "kitchen", "chance": 50, "repeat": [ 2 ], "x": [ 8, 8 ], "y": [ 9, 9 ] }, - { "group": "kitchen", "chance": 50, "repeat": [ 2 ], "x": [ 8, 8 ], "y": [ 2, 2 ] }, - { "group": "kitchen", "chance": 50, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 2, 2 ] }, - { "group": "kitchen", "chance": 50, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 16, 16 ] }, - { "group": "fridge", "chance": 50, "repeat": [ 4 ], "x": [ 14, 14 ], "y": [ 11, 11 ] }, - { "group": "fridge", "chance": 50, "repeat": [ 4 ], "x": [ 14, 14 ], "y": [ 4, 4 ] }, - { "group": "fridge", "chance": 50, "repeat": [ 4 ], "x": [ 8, 8 ], "y": [ 4, 4 ] }, - { "group": "fridge", "chance": 50, "repeat": [ 4 ], "x": [ 8, 8 ], "y": [ 11, 11 ] }, - { "group": "fridge", "chance": 50, "repeat": [ 4 ], "x": [ 14, 14 ], "y": [ 18, 18 ] }, - { "group": "cleaning", "chance": 50, "repeat": [ 3 ], "x": [ 18, 18 ], "y": [ 20, 20 ] }, - { "group": "cleaning", "chance": 50, "repeat": [ 3 ], "x": [ 18, 18 ], "y": [ 13, 13 ] }, - { "group": "cleaning", "chance": 50, "repeat": [ 3 ], "x": [ 18, 18 ], "y": [ 6, 6 ] }, - { "group": "cleaning", "chance": 50, "repeat": [ 3 ], "x": [ 4, 4 ], "y": [ 6, 6 ] }, - { "group": "cleaning", "chance": 50, "repeat": [ 3 ], "x": [ 4, 4 ], "y": [ 13, 13 ] }, - { "group": "cleaning", "chance": 50, "repeat": [ 3 ], "x": [ 20, 20 ], "y": [ 19, 20 ] }, - { "group": "cleaning", "chance": 50, "repeat": [ 3 ], "x": [ 20, 20 ], "y": [ 12, 13 ] }, - { "group": "cleaning", "chance": 50, "repeat": [ 3 ], "x": [ 20, 20 ], "y": [ 5, 6 ] }, - { "group": "cleaning", "chance": 50, "repeat": [ 3 ], "x": [ 2, 2 ], "y": [ 5, 6 ] }, - { "group": "cleaning", "chance": 50, "repeat": [ 3 ], "x": [ 2, 2 ], "y": [ 12, 13 ] }, - { "group": "allclothes", "chance": 50, "repeat": [ 5 ], "x": [ 18, 18 ], "y": [ 1, 1 ] }, - { "group": "allclothes", "chance": 50, "repeat": [ 5 ], "x": [ 18, 18 ], "y": [ 10, 10 ] }, - { "group": "allclothes", "chance": 50, "repeat": [ 5 ], "x": [ 21, 21 ], "y": [ 15, 15 ] }, - { "group": "allclothes", "chance": 50, "repeat": [ 5 ], "x": [ 21, 21 ], "y": [ 17, 17 ] }, - { "group": "allclothes", "chance": 50, "repeat": [ 5 ], "x": [ 4, 4 ], "y": [ 8, 8 ] }, - { "group": "clothing_female", "chance": 50, "repeat": [ 5 ], "x": [ 1, 1 ], "y": [ 1, 1 ] }, - { "group": "clothing_male", "chance": 50, "repeat": [ 5 ], "x": [ 4, 4 ], "y": [ 1, 1 ] }, - { "group": "homebooks", "chance": 50, "repeat": [ 2 ], "x": [ 7, 7 ], "y": [ 6, 6 ] }, - { "group": "homebooks", "chance": 50, "repeat": [ 2 ], "x": [ 7, 7 ], "y": [ 13, 13 ] }, - { "group": "homebooks", "chance": 50, "repeat": [ 2 ], "x": [ 8, 8 ], "y": [ 8, 8 ] }, - { "group": "homebooks", "chance": 50, "repeat": [ 2 ], "x": [ 8, 8 ], "y": [ 1, 1 ] }, - { "group": "homebooks", "chance": 50, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 1, 1 ] }, - { "group": "homebooks", "chance": 50, "repeat": [ 2 ], "x": [ 16, 16 ], "y": [ 4, 4 ] }, - { "group": "homebooks", "chance": 50, "repeat": [ 2 ], "x": [ 15, 15 ], "y": [ 8, 8 ] }, - { "group": "homebooks", "chance": 50, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 13, 13 ] }, - { "group": "homebooks", "chance": 50, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 15, 15 ] }, - { "group": "homebooks", "chance": 50, "repeat": [ 2 ], "x": [ 16, 16 ], "y": [ 17, 17 ] }, - { "group": "clothing_male", "chance": 50, "repeat": [ 5 ], "x": [ 4, 4 ], "y": [ 1, 1 ] }, - { "group": "clothing_male", "chance": 50, "repeat": [ 5 ], "x": [ 4, 4 ], "y": [ 1, 1 ] }, - { "group": "bedroom", "chance": 50, "repeat": [ 5 ], "x": [ 1, 4 ], "y": [ 3, 1 ] }, - { "group": "bedroom", "chance": 50, "repeat": [ 5 ], "x": [ 21, 18 ], "y": [ 3, 1 ] }, - { "group": "bedroom", "chance": 50, "repeat": [ 5 ], "x": [ 18, 21 ], "y": [ 8, 10 ] }, - { "group": "bedroom", "chance": 50, "repeat": [ 5 ], "x": [ 18, 21 ], "y": [ 15, 17 ] }, - { "group": "bedroom", "chance": 50, "repeat": [ 5 ], "x": [ 1, 4 ], "y": [ 8, 10 ] }, - { "group": "livingroom", "chance": 50, "repeat": [ 2 ], "x": [ 6, 8 ], "y": [ 1, 6 ] }, - { "group": "livingroom", "chance": 50, "repeat": [ 2 ], "x": [ 6, 8 ], "y": [ 8, 13 ] }, - { "group": "livingroom", "chance": 50, "repeat": [ 2 ], "x": [ 16, 14 ], "y": [ 8, 13 ] }, - { "group": "livingroom", "chance": 50, "repeat": [ 2 ], "x": [ 16, 14 ], "y": [ 15, 20 ] }, - { "group": "livingroom", "chance": 50, "repeat": [ 2 ], "x": [ 16, 14 ], "y": [ 6, 1 ] }, - { "group": "tools_home", "chance": 50, "repeat": [ 1 ], "x": [ 7, 8 ], "y": [ 15, 15 ] }, { "group": "allclothes", "chance": 50, "repeat": [ 5 ], "x": [ 7, 8 ], "y": [ 20, 20 ] }, { "group": "tools_home", "chance": 50, "repeat": [ 1 ], "x": [ 5, 4 ], "y": [ 15, 15 ] }, { "group": "tools_home", "chance": 50, "repeat": [ 1 ], "x": [ 2, 1 ], "y": [ 15, 15 ] }, @@ -134,5 +42,76 @@ { "group": "tools_home", "chance": 50, "repeat": [ 1 ], "x": [ 4, 5 ], "y": [ 20, 20 ] } ] } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_apt_2ndfloor" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + "--w----w--W-W--w----w--*", + "-dB.d-..t-...-t..-....-*", + "w.B..+..3-.>.-3..+..BBw*", + "-...d-A.O-...-O.h-...d-*", + "------..e-...-e.t------*", + "*wwii+...D...D...+iiww**", + "*-wTS-AtA-...-...-STw-**", + "----------...----------*", + "-...d-..t-...-AtA-..B.-*", + "w.B..+..3-...-3..+..B.w*", + "-.B..-F.O-...-O..-d...-*", + "------F.e-...-e..------*", + "*wwii+...D...D...+iiww**", + "*-wTS-htA-...-tFF-STw-**", + "----------...----------*", + "-...d-A.t-...-...-..BB-*", + "w.B..+..3-...-3..+...dw*", + "-.B..-F.O-.<.-O.t-..BB-*", + "------F.e-...-e.h------*", + "*wwii+...D.>.D...+iiww**", + "*-wTS-AtA-...-FFA-STw-**", + "*---------W-W--w------**", + "************************", + "************************" + ], + "palettes": [ "apartment_palette" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_apt_roof" ], + "object": { + "fill_ter": "t_flat_roof", + "rows": [ + "|2222222222222222222222 ", + "|.....................3 ", + "|.A..A...........A..A.3 ", + "|.....................3 ", + "||...................33 ", + " |&.................&3 ", + " |..X................3 ", + "||................:..33 ", + "|.....................3 ", + "|.A..A...........A..A.3 ", + "|.....................3 ", + "||...................33 ", + " |&.................&3 ", + " |...................3 ", + "||...................33 ", + "|.........$$+$$.......3 ", + "|.A..A....$___$..A..A.3 ", + "|.........$>__$.......3 ", + "||........$$$$$......33 ", + " |&...............X.&3 ", + " |...................3 ", + " |-------------------3 ", + " ", + " " + ], + "palettes": [ "roof_palette" ], + "terrain": { "$": "t_wall", "+": "t_door_c", ">": "t_stairs_down" } + } } ] diff --git a/data/mods/Fuji_Structures/worldgen/s_apt_2.json b/data/mods/Fuji_Structures/worldgen/s_apt_2.json index 1800ee81e8cf0..b2eaca8e04fdf 100644 --- a/data/mods/Fuji_Structures/worldgen/s_apt_2.json +++ b/data/mods/Fuji_Structures/worldgen/s_apt_2.json @@ -6,133 +6,105 @@ "object": { "fill_ter": "t_floor", "rows": [ - "aabbaaabaacddcaaaaaabbaa", - "amffma fmacddcanknam a", - "b ff a f bcddcb aff b", - "b a bcddcb aff b", - "amm a acddcan ma ma", - "aaaeaaaeaacddcaaeaaaeaaa", - "attsss lacddca sssssa", - "bsssss jacddcak sssssb", - "athgis labeebak sighta", - "aaaaaa arssra aaaaaa", - "cbqsse esssse essqbc", - "caqpgakkkassssaljlagpqac", - "caaaaaaaaassssaaaaaaaaac", - "caqpgajlarssssra agpqac", - "cbqsse esssssse essqbc", - "aaaaaa assssssal aaaaaa", - "bthgis kassssssaj sightb", - "bsssss karssssral sssssb", - "aaaeaaeaaaassaaaaeaaeaaa", - "cam a mmassakkn am ac", - "cb an abea a bc", - "cb f an addan lja f bc", - "ca f a ffaddanjoja f ac", - "caabaaabbaaddaabbaaabaac" + "--ww---w--.ss.------ww--", + "-dBBd-.Bd-.ss.-oFo-d...-", + "w.BB.-.B.w.ss.w...-BB..w", + "w....-...w.ss.w...-BB..w", + "-dd..-...-.ss.-o.d-...d-", + "---+---+--.ss.--+---+---", + "-12iii..h-.ss.-...iii11-", + "wiiiii..j-.ss.-F..iiiiiw", + "-2O3ei..h-W++W-F..ie3O1-", + "------...-^ii^-...------", + ".wbii+...DiiiiD...+iibw.", + ".-bTS-FFF-iiii-hjh-STb-.", + ".---------iiii---------.", + ".-bTS-jh-^iiii^-..-STb-.", + ".wbii+..DiiiiiiD..+iibw.", + "------..-iiiiii-h.------", + "w1O3e2.F-iiii>-j.2e3O1w", + "wiiiii..-_$........A..3", + "||......$$$$-|.........3", + " |........3 |.........3", + " |........3 |.........3", + " |........3 |.........3", + " |........3 |.........3", + " |--------3 |--------.3" + ], + "palettes": [ "roof_palette" ], + "terrain": { "$": "t_wall", "+": "t_door_c", ">": "t_stairs_down" } } } ] diff --git a/data/mods/Fuji_Structures/worldgen/s_camping.json b/data/mods/Fuji_Structures/worldgen/s_camping.json index ccaea8d715ed1..815e3ac4c9ae5 100644 --- a/data/mods/Fuji_Structures/worldgen/s_camping.json +++ b/data/mods/Fuji_Structures/worldgen/s_camping.json @@ -22,7 +22,7 @@ "dc cffffxvwfgdd", "da cffffwwwfgdd", "da ssssss affffffffgdd", - "da aaaaaabaaffffffffadd", + "da aaaaaabaa;fffffffadd", "da aooonnnqaaahhaaaaadd", "daabaoopnnnqammffilllgdd", "da annnnnnnbffffflllgdd", @@ -59,7 +59,8 @@ "y": "t_linoleum_gray", "z": "t_linoleum_gray", "A": "t_linoleum_gray", - "B": "t_linoleum_gray" + "B": "t_linoleum_gray", + ";": "t_gutter_downspout" }, "furniture": { "i": "f_brazier", @@ -101,5 +102,40 @@ { "group": "cannedfood", "chance": 50, "repeat": [ 5 ], "x": [ 5, 6 ], "y": [ 18, 18 ] } ] } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_camping_roof" ], + "object": { + "fill_ter": "t_flat_roof", + "rows": [ + " ", + " |22222222223 ", + " |..........3 ", + " |..oo..oo..3 ", + " |..........3 ", + " |..........3 ", + " |..........3 ", + " |..oo..oo..3 ", + " |..........3 ", + " |...A......3 ", + " |..........3 ", + " |..oo..oo..3 ", + " |..........3 ", + " |..........3 ", + " |..........3 ", + " |..........3 ", + " |.=........5 ", + " |.=........3 ", + " |..........3 ", + " |.......:..3 ", + " |....A.....3 ", + " |..........3 ", + " |----------3 ", + " " + ], + "palettes": [ "roof_palette" ] + } } ] diff --git a/data/mods/Fuji_Structures/worldgen/s_cardealer.json b/data/mods/Fuji_Structures/worldgen/s_cardealer.json index 254e179dbeec8..d192252d35c3f 100644 --- a/data/mods/Fuji_Structures/worldgen/s_cardealer.json +++ b/data/mods/Fuji_Structures/worldgen/s_cardealer.json @@ -25,7 +25,7 @@ "beeeeeeeee b", "bcfgfffffc b", "bcndddddkc aaaaaab", - "bcdddddlkc b", + "bcdddddlkc; b", "bckkkkddkcccc b", "bcmldkdddcjic b", "bcmddddmdghhc b", @@ -45,7 +45,8 @@ "k": "t_floor", "l": "t_floor", "m": "t_floor", - "n": "t_floor" + "n": "t_floor", + ";": "t_gutter_downspout" }, "furniture": { "j": "f_sink", "k": "f_table", "l": "f_chair", "m": "f_locker", "n": "f_vending_c" }, "toilets": { "i": { } }, @@ -66,5 +67,40 @@ { "vehicle": "dealership", "x": [ 20, 20 ], "y": [ 20, 20 ], "chance": 50, "rotation": 0 } ] } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_cardealer_roof" ], + "object": { + "fill_ter": "t_flat_roof", + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " |22222223 ", + " |.......3 ", + " |...A...5 ", + " |.......3--3 ", + " |.........=3 ", + " |..........3 ", + " |----------3 " + ], + "palettes": [ "roof_palette" ] + } } ] diff --git a/data/mods/Fuji_Structures/worldgen/s_diner.json b/data/mods/Fuji_Structures/worldgen/s_diner.json index a2be039298ead..fbf6613ebff6a 100644 --- a/data/mods/Fuji_Structures/worldgen/s_diner.json +++ b/data/mods/Fuji_Structures/worldgen/s_diner.json @@ -11,7 +11,7 @@ "hiiiiiiiiiiiiiiiiihhhhhh", "hiiviiiviihhhhiiiihhhhhh", "hivuvivuvaabbaaccaabbaah", - "hiiviiivia ah", + "hiiviiivia< ah", "hiiiiiiiiag gg gg gah", "haabacabaaf ff ff fah", "hagfg gfgag gg gg gah", @@ -53,7 +53,8 @@ "s": "t_floor", "t": "t_linoleum_gray", "u": "t_sidewalk", - "v": "t_sidewalk" + "v": "t_sidewalk", + "<": "t_stairs_up" }, "furniture": { "e": "f_counter", @@ -113,5 +114,78 @@ { "group": "coffee_table", "chance": 50, "repeat": [ 1 ], "x": [ 21, 19 ], "y": [ 13, 13 ] } ] } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_diner_2ndfloor" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + "************************", + "************************", + "************************", + "************************", + "*********---W--WW--W---*", + "*********->-hh...h..hh-*", + "*********-.-tt...t..ttW*", + "*--W---W--..hh...h..hh-*", + "*-....................-*", + "*W^..RRRRRRRRRRRRRR..^-*", + "*-h..R;;;;;;;;;;;;R...-*", + "*-t..R;;;;;;;;;;;;R..^-*", + "*-h..RRRRRRRRRRRRRR...-*", + "*W^...................W*", + "*-........hth.hth.hth.-*", + "*----.-----------------*", + "*4zz-.j-9zzzzzzzzzzzzz6*", + "*4zz-+--zzzzzzzzz&zzzz6*", + "*4zzzzzzzzzzzzzzzzzzzz6*", + "*4zzzzzzzzzzzz((zzzzzz6*", + "*4zzzzzzzzzzzzzzzzzzzz6*", + "*4zzzzzzzzzzzzzzzzzzzz6*", + "*4555555555555555555556*", + "************************" + ], + "palettes": [ "apartment_palette" ], + "terrain": { "*": "t_open_air", "9": "t_gutter_downspout", "R": "t_glass_railing", ";": "t_open_air_rooved" }, + "furniture": { "h": "f_chair" }, + "items": { "t": { "item": "coffee_table", "chance": 50 }, "j": { "item": "bar_trash", "chance": 65, "repeat": [ 1, 3 ] } } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_diner_roof" ], + "object": { + "fill_ter": "t_flat_roof", + "rows": [ + " ", + " ", + " ", + " ", + " |2222222222223 ", + " |..........X.3 ", + " |............3 ", + " |2222222|............3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |...A.........A......3 ", + " |....................3 ", + " |.........&..........3 ", + " |...............==...3 ", + " |--|..35-------------3 ", + " |..3 ", + " |--3 ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "palettes": [ "roof_palette" ] + } } ] diff --git a/data/mods/Fuji_Structures/worldgen/s_electronicstore.json b/data/mods/Fuji_Structures/worldgen/s_electronicstore.json new file mode 100644 index 0000000000000..150fd5f762715 --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/s_electronicstore.json @@ -0,0 +1,74 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_electronicstore" ], + "object": { + "fill_ter": "t_linoleum_white", + "rows": [ + "! sssssss ss !", + "! sssssss -w+- !", + "!--WW-GG---------,,----!", + "!-.......t......-,,-ST-!", + "!-.......t......--,-..-!", + "!-.......txnnnn.-<,-+--!", + "!-.1111.........----..-!", + "!-.2222.^^^^^...4444..-!", + "!-......^CCC^.........-!", + "!-......^CCC^.........-!", + "!-.2222.^^^^^.4444.4---!", + "!-.3333.^CCC^.4444.4-|!!", + "!-......^CCC^......4-!!!", + "!-......^^^^^.444444-!!!", + "!-.3333.......-------- ", + "!--------.....ooo-ddf- ", + "!!!!!-__-........+.c.- ", + "!!!!!=__----++-------- ", + "!!!!!=________O- ", + "!!!!(-________O- ", + "!!!!(----O____O- ", + "!!!!! -OO____- ", + "!!!!( -------- ", + "!!!!( " + ], + "palettes": [ "electro_palette" ], + "terrain": { " ": [ [ "t_dirt", 5 ], [ "t_grass", 16 ], [ "t_grass_long", 5 ], [ "t_underbrush", 1 ] ] } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_electronicstore_2ndfloor" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + "************************", + "****************zzzz****", + "*--w---w-ww-w----WW-RRR*", + "*-2ie-tltntI....D..-zzR*", + "*wOiu-tl........--.WzzR*", + "*-1iii......AooY->.-zzR*", + "*w3iii..FFF-------D-+--*", + "*-----....o-hh.-tn.eiO-*", + "*-r.r-j...o-tt.....ii2w*", + "*--.-----..-hh.....ii3-*", + "*-I..dd.-.A-...-FF.Y---*", + "*w......+..-..o-...A-/R*", + "*-.....t-..-..o-I...+#R*", + "*w.BB.ht--+-+-----+--#R*", + "*-.BB..t-S.-.S-r-d..--R*", + "*--w--w--T.-.T-.....d-**", + "*****4zz-bb-bb-r-I.BB-**", + "*****4zz--w-w-----ww--**", + "*****4zzzzzzzzz6********", + "*****4zzzzzzzzz6********", + "*****4554zzzzzz6********", + "********4zzzzzz6********", + "********45555556********", + "************************" + ], + "palettes": [ "apartment_palette" ], + "terrain": { "-": "t_brick_wall", "#": "t_metal_floor_no_roof", "/": "t_ladder_down" } + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/s_games.json b/data/mods/Fuji_Structures/worldgen/s_games.json index 21e114c3e66f7..e0a1bc5f659d7 100644 --- a/data/mods/Fuji_Structures/worldgen/s_games.json +++ b/data/mods/Fuji_Structures/worldgen/s_games.json @@ -24,7 +24,7 @@ "ea hh hhh i ae", "eahhhhha oaacaaa aaaae", "eaababaaaacaa a aprae", - "eddddddda a ll a cpqae", + "edddddd9a a ll a cpqae", "edddddddc alkkla aaaae", "ennddddda malkkla cpqae", "enndddddammma ll asaprae", @@ -50,7 +50,8 @@ "p": "t_linoleum_gray", "q": "t_linoleum_gray", "r": "t_linoleum_gray", - "s": "t_floor" + "s": "t_floor", + "9": "t_gutter_downspout" }, "furniture": { "h": "f_rack", @@ -83,5 +84,40 @@ { "group": "trash", "chance": 50, "repeat": [ 5 ], "x": [ 1, 2 ], "y": [ 20, 22 ] } ] } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_games_roof" ], + "object": { + "fill_ter": "t_flat_roof", + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " |222222222222223 ", + " |22252|..............3 ", + " |...............X.:..3 ", + " |....................3 ", + " |....................3 ", + " |...A...........=&...3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |-----5|.............3 ", + " |.............3 ", + " |.............3 ", + " |........A....3 ", + " |.............3 ", + " |-------------3 ", + " " + ], + "palettes": [ "roof_palette" ] + } } ] diff --git a/data/mods/Fuji_Structures/worldgen/s_gunstore.json b/data/mods/Fuji_Structures/worldgen/s_gunstore.json index 977470110a7bd..259cd13570335 100644 --- a/data/mods/Fuji_Structures/worldgen/s_gunstore.json +++ b/data/mods/Fuji_Structures/worldgen/s_gunstore.json @@ -21,11 +21,11 @@ "ea m jhiiiiiae", "ea m oaiiiiiae", "eaadaaddaaaaaadaaiiiiiae", - "ear a avvou oaiiiiiae", + "ear a< avvou oaiiiiiae", "ea ao avt hiiiiiae", "eaqpao av raxxxxxae", "eaaaa aaaaadaaaaaaaae", - "easss aggggggge", + "easss a;gggggge", "ea ss ss cgggggwwe", "eass ss ss cgggggwwe", "eassss agggggwwe", @@ -55,7 +55,9 @@ "u": "t_floor", "v": "t_floor", "w": "t_pavement", - "x": "t_thconc_floor" + "x": "t_thconc_floor", + "<": "t_stairs_up", + ";": "t_gutter_downspout" }, "furniture": { "j": "f_rack", @@ -213,5 +215,84 @@ } ] } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_gunstore_2ndfloor" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + "************************", + "*---w-----w--w---*******", + "*-BB.dd-...BB...-*******", + "*-BB...-...BB...-*******", + "*w.....-d......o-*******", + "*-....^-d...A..I-888886*", + "*----+---+-------zzzzz6*", + "*-I.......j-iiiO-zzzzz6*", + "*wt.FFll...iiii1-zzzzz6*", + "*-n..Ftt...iiii3wzzzzz6*", + "*wt..Fll..o-1ii2-zzzzz6*", + "*-........o-uiie-zzzzz6*", + "*-+--D-Y...------zzzzz6*", + "*-iS-.-A...+...;-zzzzz6*", + "*wiT->-....-rr.;-9zzzz6*", + "*-bb---w+w-------zzzzz6*", + "*----zzzzzzfMzfzzzzzzz6*", + "*4zzzzzzzzzgzzgzzzzzzz6*", + "*4z@zzzzzzzffff67555556*", + "*4zzzzzzzzzzzzz6********", + "*4zzzzzzzzzzzzz6********", + "*4zzzzzzzzzzzzz6********", + "*4zzzzzzzzzzzzz6********", + "*455555555555556********" + ], + "palettes": [ "apartment_palette" ], + "terrain": { "9": "t_gutter_downspout" }, + "furniture": { ";": "f_gunsafe_ml" }, + "items": { + ";": [ + { "item": "guns_obscure", "chance": 30, "repeat": [ 1, 3 ] }, + { "item": "mags_obscure", "chance": 30, "repeat": [ 1, 4 ] }, + { "item": "ammo_obscure", "chance": 100, "repeat": [ 1, 2 ] } + ] + } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_gunstore_roof" ], + "object": { + "fill_ter": "t_flat_roof", + "rows": [ + " ", + " |222222222222223 ", + " |..............3 ", + " |..............3 ", + " |...A..........3 ", + " |..............3 ", + " |..............3 ", + " |X..........A.&3 ", + " |..............3 ", + " |..............3 ", + " |..............3 ", + " |..............3 ", + " |..............3 ", + " |.=............3 ", + " |..............5 ", + " |..|-----------3 ", + " |--| ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "palettes": [ "roof_palette" ] + } } ] diff --git a/data/mods/Magiclysm/Spells/classless.json b/data/mods/Magiclysm/Spells/classless.json index 98ec74b25bc6f..90e7569d0d5dc 100644 --- a/data/mods/Magiclysm/Spells/classless.json +++ b/data/mods/Magiclysm/Spells/classless.json @@ -1,4 +1,22 @@ [ + { + "id": "dark_sight", + "type": "SPELL", + "name": "Dark Sight", + "description": "Gives you the power to see in the dark", + "message": "Your eyes glow green for a moment. Now your sight can pierce the darkest shadows.", + "valid_targets": [ "self" ], + "effect": "target_attack", + "effect_str": "dark_sight", + "min_range": 1, + "max_range": 1, + "base_casting_time": 100, + "base_energy_cost": 400, + "energy_source": "MANA", + "min_duration": 100000, + "max_duration": 1000000, + "duration_increment": 2000 + }, { "id": "megablast", "type": "SPELL", diff --git a/data/mods/Magiclysm/Spells/debug.json b/data/mods/Magiclysm/Spells/debug.json index 629fae550317c..48abd65774807 100644 --- a/data/mods/Magiclysm/Spells/debug.json +++ b/data/mods/Magiclysm/Spells/debug.json @@ -5,6 +5,8 @@ "type": "SPELL", "name": "Template Spell", "description": "This is a template to show off all the available values", + "message": "As you cast %s, your ears pops!", + "//": "The 'message' will replace 'You cast %s!' message when you cast this spell", "valid_targets": [ "hostile", "ground", "self", "ally" ], "//": "effect is only limited by what is coded.", "effect": "none", @@ -40,6 +42,7 @@ "type": "SPELL", "name": "Spawn Debug Monsters", "description": "Set level to number of monsters spawned.", + "message": "Debug spell %s cast.", "valid_targets": [ "ground" ], "effect": "summon", "effect_str": "debug_mon", @@ -61,6 +64,7 @@ "type": "SPELL", "name": "Debug Stamina Spell", "description": "Uses a little stamina", + "message": "Debug spell [ %s ] has no effect. Debug warning is expected.", "valid_targets": [ "self" ], "effect": "none", "min_range": 1, @@ -74,6 +78,7 @@ "type": "SPELL", "name": "Debug Fatigue Spell", "description": "Uses a little fatigue", + "message": "Debug spell %s cast.", "valid_targets": [ "self" ], "effect": "none", "min_range": 1, @@ -87,6 +92,7 @@ "type": "SPELL", "name": "Debug HP Spell", "description": "Uses a little HP", + "message": "Debug spell %s cast.", "valid_targets": [ "self" ], "effect": "none", "min_range": 1, @@ -100,6 +106,7 @@ "type": "SPELL", "name": "Debug Bionic Spell", "description": "Uses a little Bionic Power", + "message": "Debug spell %s cast.", "valid_targets": [ "self" ], "effect": "none", "min_range": 1, @@ -113,6 +120,7 @@ "type": "SPELL", "name": "Debug effect spell", "description": "Adds an effect to the target", + "message": "Debug spell %s cast.", "valid_targets": [ "self", "hostile", "ally" ], "effect": "target_attack", "effect_str": "dazed", @@ -129,6 +137,7 @@ "type": "SPELL", "name": "Test Area Pull", "description": "Pulls all objects inside.", + "message": "Debug spell %s cast.", "effect": "area_pull", "effect_filter": [ "ally", "hostile", "item", "fd_fire", "fd_blood" ], "effect_iterations": 4, @@ -150,6 +159,7 @@ "type": "SPELL", "name": "Test Area Pull (Field)", "description": "Pulls field contents tiles inside.", + "message": "Debug spell %s cast.", "effect": "area_pull", "effect_filter": [ "fd_fire", "fd_blood" ], "effect_iterations": 4, @@ -171,6 +181,7 @@ "type": "SPELL", "name": "Test Area Push", "description": "Pushes all objects outside.", + "message": "Debug spell %s cast.", "effect": "area_push", "effect_filter": [ "ally", "hostile", "item" ], "effect_iterations": 4, @@ -186,5 +197,39 @@ "base_casting_time": 100, "energy_source": "MANA", "base_energy_cost": 100 + }, + { + "id": "debug_full_protection", + "type": "SPELL", + "name": "Debug Full Protection", + "description": "You can not be harmed by anything.", + "message": "You are invulnerable, nothing can harm you!", + "valid_targets": [ "self" ], + "effect": "target_attack", + "effect_str": "debug_full_protection", + "min_range": 1, + "max_range": 1, + "base_casting_time": 100, + "base_energy_cost": 100, + "energy_source": "MANA", + "min_duration": 100000, + "max_duration": 100000 + }, + { + "id": "debug_fall_protection", + "type": "SPELL", + "name": "Debug Feather Falling", + "description": "You are light as a feather and fall like.", + "message": "You eat a feather!", + "valid_targets": [ "self" ], + "effect": "target_attack", + "effect_str": "debug_feather_fall", + "min_range": 1, + "max_range": 1, + "base_casting_time": 100, + "base_energy_cost": 100, + "energy_source": "MANA", + "min_duration": 400, + "max_duration": 400 } ] diff --git a/data/mods/Magiclysm/bionics.json b/data/mods/Magiclysm/bionics.json new file mode 100644 index 0000000000000..6e06ff647d6d3 --- /dev/null +++ b/data/mods/Magiclysm/bionics.json @@ -0,0 +1,14 @@ +[ + { + "id": "bio_fuel_cell_blood", + "type": "bionic", + "name": "Blood Power Generator CBM", + "description": "Embedded into your back and connected to your bionic power supply is a powerfull spell focus able to consume blood from dead creatures to produce bionic power. It can store up to 100 mL of blood.", + "occupied_bodyparts": [ [ "TORSO", 8 ] ], + "fuel_options": [ "blood", "dragon_blood", "tainted_blood" ], + "fuel_capacity": 100, + "fuel_efficiency": 0.6, + "time": 6, + "flags": [ "BIONIC_TOGGLED", "BIONIC_POWER_SOURCE" ] + } +] diff --git a/data/mods/Magiclysm/effects/effects.json b/data/mods/Magiclysm/effects/effects.json index e5587c702bc66..44f6d7c8acb16 100644 --- a/data/mods/Magiclysm/effects/effects.json +++ b/data/mods/Magiclysm/effects/effects.json @@ -9,6 +9,16 @@ "rating": "good", "base_mods": { "speed_mod": [ 20 ], "stamina_min": [ 10 ] } }, + { + "type": "effect_type", + "id": "dark_sight", + "name": [ "Dark Sight" ], + "desc": [ "You can see in the dark." ], + "apply_message": "Your sight adjusts to the darkness.", + "remove_message": "The darkness loses its shape.", + "rating": "good", + "flags": [ "EFFECT_NIGHT_VISION" ] + }, { "type": "effect_type", "id": "effect_ethereal_grasp", @@ -163,5 +173,34 @@ "rating": "good", "removes_effects": [ "eagles_sight", "cats_grace", "ogres_strength" ], "base_mods": { "int_mod": [ 4 ] } + }, + { + "type": "effect_type", + "id": "debug_full_protection", + "name": [ "Debug Full Protection" ], + "desc": [ "You can not be harmed by anything." ], + "apply_message": "Your skin tingle with the power of the Devs!", + "remove_message": "Your skin stops tingling, your life is empty and meaningless again.", + "rating": "good", + "flags": [ + "EFFECT_ELECTRIC_IMMUNE", + "EFFECT_BIO_IMMUNE", + "EFFECT_BASH_IMMUNE", + "EFFECT_CUT_IMMUNE", + "EFFECT_ACID_IMMUNE", + "EFFECT_STAB_IMMUNE", + "EFFECT_HEAT_IMMUNE", + "EFFECT_COLD_IMMUNE" + ] + }, + { + "type": "effect_type", + "id": "debug_feather_fall", + "name": [ "Debug Feather Fall" ], + "desc": [ "You are light as a feather and fall like one." ], + "apply_message": "Your body feels light as a feather.", + "remove_message": "The earth pulls you down hard.", + "rating": "good", + "flags": [ "EFFECT_FEATHER_FALL" ] } ] diff --git a/data/mods/Magiclysm/harvest.json b/data/mods/Magiclysm/harvest.json index 4e336c2ce7ecf..2999bc41966c3 100644 --- a/data/mods/Magiclysm/harvest.json +++ b/data/mods/Magiclysm/harvest.json @@ -165,10 +165,74 @@ "type": "harvest", "entries": [ { "drop": "meat_tainted", "type": "flesh", "mass_ratio": 0.1 }, + { "drop": "dragon_blood", "type": "flesh", "mass_ratio": 0.1 }, { "drop": "meat_dragon", "type": "flesh", "mass_ratio": 0.18 }, { "drop": "dragon_black_scale", "type": "skin", "mass_ratio": 0.05 }, { "drop": "black_dragon_hide_raw", "type": "skin", "mass_ratio": 0.1 }, { "drop": "bone", "type": "bone", "mass_ratio": 0.1 } ] + }, + { + "id": "zombie", + "//": "your bog standard zombie", + "type": "harvest", + "entries": [ + { "drop": "tainted_blood", "type": "flesh", "mass_ratio": 0.1 }, + { "drop": "meat_tainted", "type": "flesh", "mass_ratio": 0.25 }, + { "drop": "fat_tainted", "type": "flesh", "mass_ratio": 0.08 }, + { "drop": "bone_tainted", "type": "bone", "mass_ratio": 0.1 }, + { "drop": "pheromone", "type": "bionic", "max": 1 } + ] + }, + { + "id": "zombie_leather", + "//": "any zombie that might drop leather. mostly animals.", + "type": "harvest", + "entries": [ + { "drop": "tainted_blood", "type": "flesh", "mass_ratio": 0.1 }, + { "drop": "meat_tainted", "type": "flesh", "mass_ratio": 0.25 }, + { "drop": "fat_tainted", "type": "flesh", "mass_ratio": 0.08 }, + { "drop": "bone_tainted", "type": "bone", "mass_ratio": 0.1 }, + { "drop": "raw_tainted_leather", "type": "skin", "mass_ratio": 0.02 }, + { "drop": "pheromone", "type": "bionic", "max": 1 } + ] + }, + { + "id": "zombie_fur", + "//": "any zombie that might drop leather. mostly animals.", + "type": "harvest", + "entries": [ + { "drop": "tainted_blood", "type": "flesh", "mass_ratio": 0.1 }, + { "drop": "meat_tainted", "type": "flesh", "mass_ratio": 0.25 }, + { "drop": "fat_tainted", "type": "flesh", "mass_ratio": 0.08 }, + { "drop": "bone_tainted", "type": "bone", "mass_ratio": 0.1 }, + { "drop": "raw_tainted_fur", "type": "skin", "mass_ratio": 0.02 }, + { "drop": "pheromone", "type": "bionic", "max": 1 } + ] + }, + { + "id": "zombie_meatslug", + "//": "no bones or organs", + "type": "harvest", + "entries": [ + { "drop": "tainted_blood", "type": "flesh", "mass_ratio": 0.2 }, + { "drop": "meat_tainted", "type": "flesh", "mass_ratio": 0.4 }, + { "drop": "fat_tainted", "type": "flesh", "mass_ratio": 0.1 }, + { "drop": "fat_tainted", "type": "offal", "mass_ratio": 0.1 } + ] + }, + { + "id": "human", + "//": "a monstrous horror, probably the most destructive entity you will ever see", + "type": "harvest", + "entries": [ + { "drop": "blood", "type": "flesh", "mass_ratio": 0.1 }, + { "drop": "human_flesh", "type": "flesh", "mass_ratio": 0.2 }, + { "drop": "hstomach", "scale_num": [ 1, 1 ], "max": 1, "type": "offal" }, + { "drop": "fat", "type": "flesh", "mass_ratio": 0.1 }, + { "drop": "bone_human", "type": "bone", "mass_ratio": 0.12 }, + { "drop": "sinew", "type": "bone", "mass_ratio": 0.001 }, + { "drop": "raw_leather", "type": "skin", "mass_ratio": 0.01 } + ] } ] diff --git a/data/mods/Magiclysm/itemgroups/itemgroups.json b/data/mods/Magiclysm/itemgroups/itemgroups.json index 8fc2fe3d24f5d..9b041dc4d41c2 100644 --- a/data/mods/Magiclysm/itemgroups/itemgroups.json +++ b/data/mods/Magiclysm/itemgroups/itemgroups.json @@ -182,5 +182,35 @@ [ "broom", 100 ], [ "battery_car", 35 ] ] + }, + { + "type": "item_group", + "id": "magic_CBM", + "items": [ [ "bio_fuel_cell_blood", 10 ] ] + }, + { + "type": "item_group", + "id": "lair_loot_generic", + "//": "Stuff you would find in any dragon lair, gold, jewelry, etc.", + "items": [ + { "group": "jewelry_safe", "prob": 50 }, + { "group": "jewelry_front", "prob": 8 }, + { "item": "bone_human", "prob": 20, "count-min": 1, "count-max": 5 } + ] + }, + { + "type": "item_group", + "id": "lair_black_dragon", + "//": "Stuff you would find in any dragon lair, gold, jewelry, etc.", + "items": [ + { "item": "bone_human", "prob": 30, "count-min": 1, "count-max": 5 }, + { "group": "archery", "prob": 1 }, + { "group": "jewelry_safe", "prob": 2 }, + { "group": "jewelry_front", "prob": 2 }, + { "group": "corpses", "prob": 20 }, + { "group": "remains_human_generic", "prob": 5, "count-min": 1, "count-max": 2 }, + { "group": "archery_ammo", "prob": 2, "count-min": 1, "count-max": 4 }, + { "group": "medieval", "prob": 1, "count-min": 1, "count-max": 2 } + ] } ] diff --git a/data/mods/Magiclysm/itemgroups/spellbooks.json b/data/mods/Magiclysm/itemgroups/spellbooks.json index 56884a5a516db..770f9e2316c39 100644 --- a/data/mods/Magiclysm/itemgroups/spellbooks.json +++ b/data/mods/Magiclysm/itemgroups/spellbooks.json @@ -88,7 +88,8 @@ [ "spell_scroll_foxs_cunning", 50 ], [ "spell_scroll_storm_hammer", 35 ], [ "spell_scroll_animated_blade", 35 ], - [ "spell_scroll_mirror_image", 15 ] + [ "spell_scroll_mirror_image", 15 ], + [ "spell_scroll_dark_sight", 30 ] ] }, { diff --git a/data/mods/Magiclysm/items/ammo_types.json b/data/mods/Magiclysm/items/ammo_types.json new file mode 100644 index 0000000000000..ac2494a6c213e --- /dev/null +++ b/data/mods/Magiclysm/items/ammo_types.json @@ -0,0 +1,20 @@ +[ + { + "type": "ammunition_type", + "id": "dragon_blood", + "name": "dragon blood", + "default": "dragon_blood" + }, + { + "type": "ammunition_type", + "id": "tainted_blood", + "name": "tainted blood", + "default": "tainted_blood" + }, + { + "type": "ammunition_type", + "id": "blood", + "name": "blood", + "default": "blood" + } +] diff --git a/data/mods/Magiclysm/items/bionics.json b/data/mods/Magiclysm/items/bionics.json new file mode 100644 index 0000000000000..b7b2de4bd6c62 --- /dev/null +++ b/data/mods/Magiclysm/items/bionics.json @@ -0,0 +1,12 @@ +[ + { + "id": "bio_fuel_cell_blood", + "copy-from": "bionic_general", + "type": "BIONIC_ITEM", + "name": "Blood Power Generator CBM", + "description": "Using the latest advancement in technomancy this bionic is able to convert the innate energy stored in blood into bionic power. The stronger the blood the better. It can hold up to 100 mL of blood.", + "price": 450000, + "weight": 500, + "difficulty": 8 + } +] diff --git a/data/mods/Magiclysm/items/cast_spell_items.json b/data/mods/Magiclysm/items/cast_spell_items.json index 43a322dd1793a..0c7149b97a50c 100644 --- a/data/mods/Magiclysm/items/cast_spell_items.json +++ b/data/mods/Magiclysm/items/cast_spell_items.json @@ -16,7 +16,7 @@ "container": "flask_glass", "color": "light_blue", "comestible_type": "DRINK", - "flags": [ "EATEN_COLD" ], + "flags": [ "EATEN_COLD", "NUTRIENT_OVERRIDE" ], "phase": "liquid", "price": 2500, "freezing_point": 40 @@ -53,7 +53,7 @@ "container": "flask_glass", "color": "yellow", "comestible_type": "DRINK", - "flags": [ "EATEN_COLD" ], + "flags": [ "EATEN_COLD", "NUTRIENT_OVERRIDE" ], "phase": "liquid", "price": 3000, "freezing_point": 40 @@ -97,14 +97,14 @@ "color": "pink", "stack_size": 1, "spoils_in": "4 days", - "flags": [ "TRADER_AVOID", "INEDIBLE" ] + "flags": [ "TRADER_AVOID", "INEDIBLE", "NUTRIENT_OVERRIDE" ] }, { "id": "animist_doll_skeleton", "name": "ossified voodoo doll", "description": "A remarkably accurate effigy of an undead human covered with bone, including pieces of organs. Necromantic magic delays immediate rot, but it won't last forever. Piercing it with the attached needle could compel it to serve you.", "use_action": { "type": "cast_spell", "spell_id": "summon_skeleton", "no_fail": true, "level": 10 }, - "type": "TOOL", + "type": "COMESTIBLE", "category": "weapons", "copy-from": "animist_doll_zombie" }, @@ -113,7 +113,7 @@ "name": "cougar voodoo doll", "description": "A remarkably accurate effigy of an undead cougar, complete with fur, bones, and organs. Necromantic magic delays immediate rot, but it won't last forever. Piercing it with the attached needle could compel it to serve you.", "use_action": { "type": "cast_spell", "spell_id": "summon_decayed_pouncer", "no_fail": true, "level": 13 }, - "type": "TOOL", + "type": "COMESTIBLE", "category": "weapons", "material": [ "fur", "flesh", "bone" ], "copy-from": "animist_doll_skeleton" diff --git a/data/mods/Magiclysm/items/class_runes.json b/data/mods/Magiclysm/items/class_runes.json index 7d4671ed64858..1b4090bdcf25b 100644 --- a/data/mods/Magiclysm/items/class_runes.json +++ b/data/mods/Magiclysm/items/class_runes.json @@ -69,7 +69,7 @@ "id": "rune_magus", "type": "TOOL", "symbol": "=", - "color": "purple", + "color": "magenta", "name": "Magus rune", "plural": "Magi runes", "description": "This magical pebble has an insignia of crystal and mana orbs on it. It is necessary for Magi to channel magic into their crafts.", @@ -155,7 +155,7 @@ "cutting": 29, "material": [ "wood", "steel" ], "symbol": "/", - "color": "gray", + "color": "light_gray", "techniques": [ "WBLOCK_2", "BRUTAL" ], "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 9 ] ], "use_action": "WEATHER_TOOL", @@ -250,7 +250,7 @@ "id": "rune_animist", "type": "TOOL", "symbol": "=", - "color": "orange", + "color": "light_red", "name": "Animist rune", "plural": "Animist runes", "description": "This magical pebble has an insignia of summoners on it. It is necessary for Animists to channel magic into their crafts.", @@ -273,7 +273,7 @@ "cutting": 13, "material": [ "wood", "steel" ], "symbol": ";", - "color": "gray", + "color": "light_gray", "techniques": [ "WBLOCK_1", "PRECISE" ], "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 11 ] ], "flags": [ "STAB", "SHEATH_KNIFE", "MAGIC_FOCUS", "TRADER_AVOID" ] diff --git a/data/mods/Magiclysm/items/enchanted.json b/data/mods/Magiclysm/items/enchanted.json new file mode 100644 index 0000000000000..98c962361f295 --- /dev/null +++ b/data/mods/Magiclysm/items/enchanted.json @@ -0,0 +1,20 @@ +[ + { + "id": "belt_str", + "copy-from": "leather_belt", + "type": "ARMOR", + "name": "belt of strength +2", + "name_plural": "belts of strength +2", + "relic_data": { "passive_effects": [ { "has": "WORN", "condition": "ALWAYS", "values": [ { "value": "STRENGTH", "add": 2 } ] } ] } + }, + { + "id": "belt_haste", + "copy-from": "leather_belt", + "type": "ARMOR", + "name": "belt of haste", + "name_plural": "belts of haste", + "relic_data": { + "passive_effects": [ { "has": "WORN", "condition": "ALWAYS", "values": [ { "value": "SPEED", "multiply": 0.15, "add": 5 } ] } ] + } + } +] diff --git a/data/mods/Magiclysm/items/fuel.json b/data/mods/Magiclysm/items/fuel.json new file mode 100644 index 0000000000000..46c5e5eb3e280 --- /dev/null +++ b/data/mods/Magiclysm/items/fuel.json @@ -0,0 +1,64 @@ +[ + { + "type": "AMMO", + "id": "dragon_blood", + "name": "dragon blood", + "name_plural": "dragon blood", + "weight": 2, + "color": "red", + "container": "flask_glass", + "symbol": "~", + "description": "Blood of a dragon, it radiates warmth and looking at it you see moving patterns form and disappear in it as if looking at an actual fire.", + "price": 100000, + "material": "flesh", + "volume": "1 ml", + "phase": "liquid", + "category": "fuel", + "ammo_type": "dragon_blood", + "damage": 5, + "range": 4, + "pierce": 5, + "effects": [ "FLAME", "STREAM", "INCENDIARY", "NEVER_MISFIRES" ], + "fuel": { + "energy": 50, + "explosion_data": { "chance_hot": 20, "chance_cold": 1000, "factor": 0.2, "fiery": true, "size_factor": 0.1 } + } + }, + { + "type": "AMMO", + "id": "tainted_blood", + "name": "tainted blood", + "name_plural": "tainted blood", + "weight": 2, + "color": "black", + "container": "flask_glass", + "symbol": "~", + "description": "Blood from a blob corrupted creature. The surface of this black sluge ondulate slowy as if agitated by a soft breeze.", + "price": 0, + "material": "flesh", + "volume": "1 ml", + "phase": "liquid", + "category": "fuel", + "ammo_type": "tainted_blood", + "fuel": { "energy": 5 } + }, + { + "type": "AMMO", + "id": "blood", + "name": "blood", + "name_plural": "blood", + "weight": 265, + "color": "red", + "container": "flask_glass", + "comestible_type": "DRINK", + "symbol": "~", + "description": "Blood, possibly that of a human. Disgusting!", + "price": 0, + "material": "hflesh", + "volume": "250 ml", + "phase": "liquid", + "category": "fuel", + "ammo_type": "blood", + "fuel": { "energy": 1 } + } +] diff --git a/data/mods/Magiclysm/items/recipe_books.json b/data/mods/Magiclysm/items/recipe_books.json index 1cf561ac06b3d..ce77a230f1960 100644 --- a/data/mods/Magiclysm/items/recipe_books.json +++ b/data/mods/Magiclysm/items/recipe_books.json @@ -10,7 +10,7 @@ "bashing": 5, "material": [ "paper" ], "symbol": "?", - "color": "white_black", + "color": "black_white", "skill": "spellcraft", "required_level": 1, "max_level": 3, diff --git a/data/mods/Magiclysm/items/spell_scrolls.json b/data/mods/Magiclysm/items/spell_scrolls.json index 87d390461b68a..a1165a9a7787a 100644 --- a/data/mods/Magiclysm/items/spell_scrolls.json +++ b/data/mods/Magiclysm/items/spell_scrolls.json @@ -10,6 +10,14 @@ "symbol": "?", "color": "white" }, + { + "type": "GENERIC", + "copy-from": "spell_scroll", + "id": "spell_scroll_dark_sight", + "name": "Scroll 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" ] } + }, { "type": "GENERIC", "copy-from": "spell_scroll", diff --git a/data/mods/Magiclysm/items/spellbooks.json b/data/mods/Magiclysm/items/spellbooks.json index aa7eb61123c43..7f75fbe8c1f86 100644 --- a/data/mods/Magiclysm/items/spellbooks.json +++ b/data/mods/Magiclysm/items/spellbooks.json @@ -206,7 +206,7 @@ "weight": 483, "volume": 3.3, "symbol": "?", - "color": "light_brown", + "color": "brown", "use_action": { "type": "learn_spell", "spells": [ "eshaper_rockbolt", "eshaper_shardspray", "eshaper_piercing_bolt", "eshaper_shardstorm" ] @@ -253,7 +253,7 @@ "weight": 258, "volume": 3, "symbol": "?", - "color": "light_grey", + "color": "light_gray", "use_action": { "type": "learn_spell", "spells": [ "synaptic_stimulation", "animated_blade", "mirror_image" ] } }, { @@ -264,7 +264,7 @@ "weight": 211, "volume": 2, "symbol": "?", - "color": "light_grey", + "color": "light_gray", "use_action": { "type": "learn_spell", "spells": [ "taze", "quantum_tunnel_lesser" ] } }, { @@ -275,7 +275,7 @@ "weight": 284, "volume": 4, "symbol": "?", - "color": "light_grey", + "color": "light_gray", "use_action": { "type": "learn_spell", "spells": [ "taze", "laze" ] } }, { diff --git a/data/mods/Magiclysm/modinfo.json b/data/mods/Magiclysm/modinfo.json index fab3d8f390c7c..0d005b134db4d 100644 --- a/data/mods/Magiclysm/modinfo.json +++ b/data/mods/Magiclysm/modinfo.json @@ -13,6 +13,7 @@ "type": "skill", "ident": "spellcraft", "name": "spellcraft", + "display_category": "display_ranged", "description": "Your skill in the arcane. Represents magic theory and all that entails. A higher skill increases how quickly you can learn spells, and decreases their spell failure chance. You learn this skill by studying books or spells." } ] diff --git a/data/mods/Magiclysm/monster_factions.json b/data/mods/Magiclysm/monster_factions.json index 26737c9d4a023..d273d01c7133c 100644 --- a/data/mods/Magiclysm/monster_factions.json +++ b/data/mods/Magiclysm/monster_factions.json @@ -5,6 +5,12 @@ }, { "type": "MONSTER_FACTION", - "name": "dragon_black" + "name": "dragon_black", + "friendly": [ "ooze" ] + }, + { + "type": "MONSTER_FACTION", + "name": "ooze", + "friendly": [ "dragon_black" ] } ] diff --git a/data/mods/Magiclysm/monstergroups.json b/data/mods/Magiclysm/monstergroups.json index ef569e9319935..1c9e8c4c8a766 100644 --- a/data/mods/Magiclysm/monstergroups.json +++ b/data/mods/Magiclysm/monstergroups.json @@ -23,6 +23,7 @@ "default": "mon_null", "is_animal": true, "monsters": [ + { "monster": "mon_black_pudding", "freq": 14, "cost_multiplier": 0.8, "pack_size": [ 4, 6 ] }, { "monster": "mon_wisp", "freq": 5, "cost_multiplier": 10, "conditions": [ "NIGHT" ] }, { "monster": "mon_wisp", "freq": 1, "cost_multiplier": 10, "conditions": [ "NIGHT" ], "pack_size": [ 1, 3 ] }, { "monster": "mon_dragon_black_wyrmling", "freq": 2, "cost_multiplier": 50 }, @@ -42,5 +43,32 @@ "default": "mon_worm", "is_animal": true, "monsters": [ { "monster": "mon_bulette", "freq": 5, "cost_multiplier": 40 } ] + }, + { + "type": "monstergroup", + "name": "GROUP_BLACKDRAGON_LAIR_1", + "default": "mon_null", + "is_animal": true, + "monsters": [ + { "monster": "mon_black_pudding", "freq": 14, "cost_multiplier": 0.8, "pack_size": [ 4, 6 ] }, + { "monster": "mon_wisp", "freq": 5, "cost_multiplier": 10, "conditions": [ "NIGHT" ] }, + { "monster": "mon_wisp", "freq": 1, "cost_multiplier": 10, "conditions": [ "NIGHT" ], "pack_size": [ 1, 3 ] }, + { "monster": "mon_bat", "freq": 5, "cost_multiplier": 5, "pack_size": [ 6, 10 ] }, + { "monster": "mon_rattlesnake", "freq": 5, "cost_multiplier": 1 }, + { "monster": "mon_rattlesnake_giant", "freq": 5, "cost_multiplier": 2 }, + { "monster": "mon_black_rat", "freq": 10, "cost_multiplier": 1 }, + { "monster": "mon_dragon_black_wyrmling", "freq": 2, "cost_multiplier": 50 } + ] + }, + { + "type": "monstergroup", + "name": "GROUP_BLACKDRAGON_LAIR_2", + "default": "mon_null", + "is_animal": true, + "monsters": [ + { "monster": "mon_black_pudding", "freq": 14, "cost_multiplier": 0.8, "pack_size": [ 4, 6 ] }, + { "monster": "mon_dragon_black_wyrmling", "freq": 2, "cost_multiplier": 50 }, + { "monster": "mon_dragon_black_young", "freq": 1, "cost_multiplier": 65 } + ] } ] diff --git a/data/mods/Magiclysm/monsters/demon_spider.json b/data/mods/Magiclysm/monsters/demon_spider.json index 58f4ba73c7340..f731a969d9bbe 100644 --- a/data/mods/Magiclysm/monsters/demon_spider.json +++ b/data/mods/Magiclysm/monsters/demon_spider.json @@ -224,9 +224,6 @@ "vision_night": 18, "harvest": "demon_spider_queen", "flags": [ "SEES", "SMELLS", "HEARS", "VENOM", "WEBWALK", "CLIMBS", "HARDTOSHOOT", "PUSH_MON", "STUN_IMMUNE" ], - "special_attacks": [ - { "type": "spell", "spell_id": "mon_summon_demon_spiderlings", "cooldown": 35 }, - { "type": "spell", "spell_id": "mon_demon_fireball", "cooldown": 10 } - ] + "special_attacks": [ { "type": "spell", "spell_id": "mon_summon_demon_spiderlings", "cooldown": 14 } ] } ] diff --git a/data/mods/Magiclysm/monsters/dragon.json b/data/mods/Magiclysm/monsters/dragon.json index 579d7e84bfc94..adc13c7fed12c 100644 --- a/data/mods/Magiclysm/monsters/dragon.json +++ b/data/mods/Magiclysm/monsters/dragon.json @@ -67,8 +67,7 @@ "armor_pierce": 6, "special_attacks": [ { "type": "bite", "cooldown": 10 }, - [ "scratch", 6 ], - [ "scratch", 6 ], + [ "scratch", 3 ], { "type": "spell", "spell_id": "dragon_breath_black", "spell_level": 12, "cooldown": 20 } ] } diff --git a/data/mods/Magiclysm/monsters/monsters.json b/data/mods/Magiclysm/monsters/monsters.json index a48cea4b341cd..fd32a99da1790 100644 --- a/data/mods/Magiclysm/monsters/monsters.json +++ b/data/mods/Magiclysm/monsters/monsters.json @@ -32,6 +32,44 @@ "special_attacks": [ { "type": "bite", "cooldown": 10 }, [ "GRAB", 7 ], [ "scratch", 7 ] ], "flags": [ "SEES", "HEARS", "SMELLS", "KEENNOSE", "PATH_AVOID_DANGER_1", "WARM", "GRABS", "SWARMS" ] }, + { + "id": "mon_black_pudding", + "type": "MONSTER", + "name": "black pudding", + "description": "Writhing, sticky, black sludge undulates across the ground. A faint sizzling sound comes from the ground beneath it as it lurches toward you.", + "default_faction": "ooze", + "bodytype": "blob", + "symbol": "O", + "species": [ "BLOB" ], + "diff": 1, + "volume": "62500 ml", + "weight": 81500, + "color": "dark_gray", + "hp": 100, + "speed": 75, + "phase": "LIQUID", + "aggression": 100, + "morale": 100, + "melee_skill": 5, + "melee_dice": 2, + "melee_dice_sides": 4, + "melee_cut": 0, + "armor_bash": 12, + "armor_stab": 14, + "armor_acid": 15, + "harvest": "exempt", + "death_function": [ "MELT" ], + "special_attacks": [ + { + "type": "spell", + "spell_id": "bio_acidicspray", + "cooldown": 20, + "monster_message": "The black pudding burns you with acid!", + "level": 0 + } + ], + "flags": [ "HEARS", "GOODHEARING", "NOHEAD", "POISON", "NO_BREATHE", "ACIDPROOF" ] + }, { "id": "mon_nothic", "name": "nothic", @@ -67,7 +105,7 @@ "cooldown": 1, "damage_max_instance": [ { "damage_type": "cut", "amount": 25, "armor_multiplier": 1.2 } ] }, - { "type": "spell", "spell_id": "necrotic_gaze", "cooldown": 5 } + { "type": "spell", "spell_id": "necrotic_gaze", "cooldown": 5, "monster_message": "The nothic gazes at %3$s!" } ] }, { diff --git a/data/mods/Magiclysm/terrain.json b/data/mods/Magiclysm/terrain.json index d00b3d1cfca2d..5d90160216ef6 100644 --- a/data/mods/Magiclysm/terrain.json +++ b/data/mods/Magiclysm/terrain.json @@ -5,7 +5,7 @@ "name": "burnt tree", "description": "This tree looks like it has been burnt badly, but it is somehow still standing.", "symbol": "7", - "color": "dark_grey", + "color": "dark_gray", "move_cost": 0, "coverage": 60, "flags": [ "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT" ], @@ -24,7 +24,7 @@ "name": "burnt tree", "description": "This is a large coccoon-like object that looks to be the vague shape of some creature. You don't want to know how long it stayed alive while being sucked dry by these spiders.", "symbol": "7", - "color": "light_grey", + "color": "light_gray", "move_cost": 0, "coverage": 30, "bash": { diff --git a/data/mods/Magiclysm/worldgen/black_dragon_lair.json b/data/mods/Magiclysm/worldgen/black_dragon_lair.json new file mode 100644 index 0000000000000..32a70f9ce2899 --- /dev/null +++ b/data/mods/Magiclysm/worldgen/black_dragon_lair.json @@ -0,0 +1,466 @@ +[ + { + "type": "mapgen", + "method": "json", + "//": "ground entrance", + "om_terrain": [ + [ "black_dragon_lair_z-0_NW", "black_dragon_lair_z-0_NE" ], + [ "black_dragon_lair_z-0_SW", "black_dragon_lair_z-0_SE" ] + ], + "object": { + "fill_ter": "t_water_sh", + "predecessor_mapgen": "forest_water", + "rows": [ + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + ".......................>>.......................", + ".......................>>.......................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................", + "................................................" + ], + "place_monsters": [ { "monster": "GROUP_SWAMP", "x": [ 1, 22 ], "y": [ 1, 22 ], "density": 0.03, "repeat": [ 4, 10 ] } ], + "terrain": { + ">": "t_slope_down", + "<": "t_slope_up", + "X": "t_rock", + ".": [ + [ "t_grass_tall", 5 ], + [ "t_grass_dead", 4 ], + [ "t_stump", 3 ], + [ "t_tree_dead", 3 ], + [ "t_trunk", 3 ], + [ "t_tree_deadpine", 2 ], + [ "t_tree_hickory_dead", 2 ], + [ "t_grass_long", 5 ], + [ "t_water_sh", 25 ], + [ "t_swater_sh", 25 ], + [ "t_water_dp", 50 ], + [ "t_moss", 10 ], + [ "t_mud", 10 ], + [ "t_underbrush", 3 ], + [ "t_dirt", 2 ], + "t_shrub" + ] + }, + "furniture": { "a": "f_boulder_small", "c": "f_boulder_medium", "b": "f_boulder_large" } + } + }, + { + "type": "mapgen", + "method": "json", + "//": "z -1, open area entrance", + "om_terrain": [ + [ "black_dragon_lair_z-1_NW", "black_dragon_lair_z-1_NE" ], + [ "black_dragon_lair_z-1_SW", "black_dragon_lair_z-1_SE" ] + ], + "object": { + "fill_ter": "t_water_sh", + "rows": [ + "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", + "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", + "XXXX.......XXXX.........x......XXXXXX.......XXXX", + "XX..........XX..........x.......XXXX..........XX", + "XX....1.....XX.................XXXX.......1...XX", + "XXXX.........XX........>>.......XX............XX", + "XXXXXX........XX.......>>......XX.......>>....XX", + "XXXX..........................XXXX......>>....XX", + "XX......................x......XX.............XX", + "XX......>>..............x......XX.............XX", + "XX......>>..............x......XX.............XX", + "XXXX....................x......XX.............XX", + "XXX.XXXX.............1..x.......XX..........XXXX", + "XXX.XXXXXX..............x......XXXX...1...XXXXXX", + "XXX..XXXXXXX............x.......XXXX.....XXXXXXX", + "XXX..XXXXXX.............x..........XX.....XXXXXX", + "XXXX..XXXX..............x....1......XX.....XXXXX", + "XXXXX.XX................x............XX.....XXXX", + "XXXX....................x.....................XX", + "XX......................x.....................XX", + "XX......................x.................>>..XX", + "XX......................x.................>>..XX", + "XX..........1......... ....................XX", + "XX.................. << ...........1......XX", + "XX.................. << ..................XX", + "XX.................... ....................XX", + "XXXX....................x.....................XX", + "XXXXXX..................x.....................XX", + "XXXXXX..................x.....................XX", + "XXXX.......1............x....................XXX", + "XX......................x.................XXXXXX", + "XX..................1...x................XXXXXXX", + "XX........>>............x...........XXX.XXX1XXXX", + "XX........>>............x...........XXX.XX...XXX", + "XX......................x..........XXXX......XXX", + "XX......................x........XXXXXXXXX...XXX", + "XXXX............2.......x........XXXXXXXXXX.XXXX", + "XXXXXX..................x......XXXXXXXXXXXX.XXXX", + "XXXXXXXXX...............X......1......XXXXX..XXX", + "XXXXXXXXXX.............XX...............XXXX.XXX", + "XXXXXXXXXXX.1....XXXXXXXX........>>......XXXXXXX", + "XXXXXXX.............XXXXXX.......>>.........XXXX", + "XXXXXXX.....2........XXXXX...................XXX", + "XXXXXXX............XXXXXXXXX..2..............XXX", + "XXXXXXXXX............XXXXXX............XXX...XXX", + "XXXXXXXXXX..........XXXXXXXX.....XXXXXXXXXXXXXXX", + "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", + "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" + ], + "place_monsters": [ + { "monster": "GROUP_BLACKDRAGON_LAIR_1", "x": [ 4, 23 ], "y": [ 4, 23 ], "density": 0.1, "repeat": [ 4, 10 ] }, + { + "monster": "GROUP_BLACKDRAGON_LAIR_1", + "x": [ 4, 19 ], + "y": [ 24, 44 ], + "density": 0.1, + "repeat": [ 4, 10 ] + }, + { + "monster": "GROUP_BLACKDRAGON_LAIR_1", + "x": [ 24, 44 ], + "y": [ 24, 44 ], + "density": 0.1, + "repeat": [ 4, 10 ] + }, + { + "monster": "GROUP_BLACKDRAGON_LAIR_1", + "x": [ 24, 44 ], + "y": [ 4, 23 ], + "density": 0.1, + "repeat": [ 4, 10 ] + }, + { + "monster": "GROUP_BLACKDRAGON_LAIR_1", + "x": [ 10, 23 ], + "y": [ 10, 23 ], + "density": 0.1, + "repeat": [ 4, 10 ] + } + ], + "terrain": { + ">": "t_slope_down", + "<": "t_slope_up", + "X": "t_rock", + " ": "t_sand", + "~": "t_water_dp_underground", + ".": [ + [ "t_grass_tall", 5 ], + [ "t_stump", 1 ], + [ "t_pit_shallow", 2 ], + [ "t_pit_corpsed", 2 ], + [ "t_pit_spiked", 2 ], + [ "t_pit_glass", 2 ], + [ "t_grass_long", 5 ], + [ "t_water_murky", 25 ], + [ "t_water_sh_underground", 25 ], + [ "t_swater_sh_underground", 25 ], + [ "t_sand_underground", 3 ], + [ "t_water_dp_underground", 40 ], + [ "t_moss_underground", 10 ], + [ "t_underbrush", 3 ], + [ "t_dirt_underground", 2 ], + [ "t_mud_underground", 2 ], + "t_shrub" + ] + }, + "furniture": { "a": "f_boulder_small", "c": "f_boulder_medium", "b": "f_boulder_large", "1": "f_fog", "2": "f_swamp_gas" }, + "items": { ".": [ { "item": "lair_black_dragon", "chance": 5 } ] } + } + }, + { + "type": "mapgen", + "method": "json", + "//": "dragon nests, open to cavern below", + "om_terrain": [ + [ "black_dragon_lair_z-2_NW", "black_dragon_lair_z-2_NE" ], + [ "black_dragon_lair_z-2_SW", "black_dragon_lair_z-2_SE" ] + ], + "object": { + "fill_ter": "t_sand", + "rows": [ + "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", + "XXXXXXXXXXX...XX XXXXXXXXXX XXX..XXXXXXXXXX", + "XXXXXXXXXXX... XXXXXXX .....XXXXXXXXX", + "XXXXX..XXXX...XX XXXXXXX .......XXXXXXXXX", + "XXXX....XXXXXXXXXX XXXXXXXXXX X.......XXXXXXXXX", + "XXXX....XXXXXXXXXXXXXXX>>XXX XX..XXXXXXXXXXXXX", + "XXXX.............XXXXXX<>XXXXXX", + "XX.....XXXXXX......XXXXXXXXXX XX..XXXXXX<>XXXXXX....XX.....XXX.....XXXXXXXXXXXXX", + "XXX XXX<>XXXX", + "XXXXXXX....XXXXX....XXXXXX XX..XXX..XXXXX<>XX .........................XXXXXX", + "XXX..XXXXX<>XXXXX....XXXX", + "XX.......................XXX XX<": "t_slope_down", "<": "t_slope_up" }, + "furniture": { "a": "f_boulder_small", "c": "f_boulder_medium", "b": "f_boulder_large" }, + "items": { " ": [ { "item": "lair_loot_generic", "chance": 10, "repeat": [ 2, 4 ] } ] } + } + }, + { + "type": "mapgen", + "method": "json", + "//": "z -2, reserved for loot/habitat rooms, should be vaulted x2 with dragon entrances from above?", + "om_terrain": [ + [ "black_dragon_lair_z-3_NW", "black_dragon_lair_z-3_NE" ], + [ "black_dragon_lair_z-3_SW", "black_dragon_lair_z-3_SE" ] + ], + "object": { + "fill_ter": "t_water_sh", + "rows": [ + "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", + "XXXXXXXXXXX > XXXXXXXXXXXXXXXXXXXXXX..XXXXXXXXXX", + "XXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX.....XXXXXXXXX", + "XXXXX..XXXX XXXXXXXXXXXXXXXXXX.......XXXXXXXXX", + "XXXX....XXXXXXXXXXXXXXXXXXXXXXXX1.....XXXXXXXXXX", + "XXXX.1...XXXXXXXXXXXXXX>>XXXXXXXX..XXXXXXXXXXXXX", + "XXXX.............XXXXXX<>XXXXXX", + "XX.....XXXXXX......XXXXXXXXXXXXX..XXXXXX<>XXXXXX....XX.....XXX.....XXXXXXXXXXXXX", + "XXXXXXXX<>...........XXXXX", + "XXXXXXXXXXXXXXXXX...........................XXXX", + "XXX > XXXXXXXXXXX............................XXX", + "XXX XXXXXXXXXX.........................XXXXXXX", + "XXX XXXXXXXXX.........1...............XXXXXXXX", + "XXXXXXXXXXXXXX.........................XXXXXXXXX", + "XXXXXXXXXXXXXXX....XXXXXXXXX..XXXX....XXXX>>XXXX", + "XXXXXXX....XXXXX....XXXXXXXXXX..XXX..XXXXX<>XXXXX.........................XXXXXX", + "XXX..XXXXX<>.................XXXX", + "XXXXX.XXXXXXXXXXXX...........................XXX", + "XXXXX.XXXXXXXXXXXXX.............XXXXX.........XX", + "XXXX...XXXXXXXXXXXXXXXX......XXXXXXXXXXXX...XXXX", + "XX.......XXXXXXXXXXXX.....XXXXXXXXXXXXXX...XXXXX", + "XX....2...XXXX....XXXXXX....XXXXXXXXXXXXX...XXXX", + "XXX........................XXXXXX>>XXXXX....XXXX", + "XX.......................XXXXXXXX< XX", + "XXXXX....XXXXXXXXX....XXXX.........XXXXXXXX XX", + "XXXXXXXXXXXXXXXXXXXXXXXXXXXX.....XXXXXXXXXX XX", + "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" + ], + "place_monsters": [ + { "monster": "GROUP_BLACKDRAGON_LAIR_2", "x": 5, "y": 5, "density": 0.1, "repeat": [ 4, 10 ] }, + { "monster": "GROUP_BLACKDRAGON_LAIR_2", "x": 35, "y": 3, "density": 0.1, "repeat": [ 4, 10 ] }, + { "monster": "GROUP_BLACKDRAGON_LAIR_2", "x": 20, "y": 14, "density": 0.1, "repeat": [ 4, 10 ] }, + { "monster": "GROUP_BLACKDRAGON_LAIR_2", "x": 37, "y": 14, "density": 0.1, "repeat": [ 4, 10 ] }, + { "monster": "GROUP_BLACKDRAGON_LAIR_2", "x": 23, "y": 17, "density": 0.1, "repeat": [ 4, 10 ] }, + { "monster": "GROUP_BLACKDRAGON_LAIR_2", "x": 20, "y": 32, "density": 0.1, "repeat": [ 4, 10 ] }, + { "monster": "GROUP_BLACKDRAGON_LAIR_2", "x": 39, "y": 33, "density": 0.1, "repeat": [ 4, 10 ] }, + { "monster": "GROUP_BLACKDRAGON_LAIR_2", "x": 41, "y": 40, "density": 0.1, "repeat": [ 4, 10 ] }, + { "monster": "GROUP_BLACKDRAGON_LAIR_2", "x": 5, "y": 40, "density": 0.1, "repeat": [ 4, 10 ] }, + { "monster": "GROUP_BLACKDRAGON_LAIR_2", "x": 20, "y": 43, "density": 0.1, "repeat": [ 4, 10 ] } + ], + "terrain": { + ">": "t_slope_down", + "<": "t_slope_up", + "X": "t_rock", + " ": "t_sand", + "~": "t_water_cube", + ".": [ + [ "t_grass_tall", 5 ], + [ "t_stump", 1 ], + [ "t_pit_shallow", 2 ], + [ "t_pit_corpsed", 2 ], + [ "t_pit_spiked", 2 ], + [ "t_pit_glass", 2 ], + [ "t_grass_long", 5 ], + [ "t_water_sh_underground", 25 ], + [ "t_swater_sh_underground", 25 ], + [ "t_sand_underground", 3 ], + [ "t_water_dp_underground", 40 ], + [ "t_moss_underground", 10 ], + [ "t_underbrush", 3 ], + [ "t_dirt_underground", 2 ], + "t_shrub" + ] + }, + "furniture": { "a": "f_boulder_small", "c": "f_boulder_medium", "b": "f_boulder_large", "1": "f_fog", "2": "f_swamp_gas" }, + "items": { + ".": [ { "item": "lair_black_dragon", "chance": 15, "repeat": [ 0, 2 ] } ], + " ": [ + { "item": "lair_black_dragon", "chance": 10, "repeat": [ 0, 2 ] }, + { "item": "spellbook_loot_1", "chance": 20, "repeat": [ 1, 2 ] }, + { "item": "spellbook_loot_2", "chance": 20, "repeat": [ 1, 2 ] } + ] + } + } + }, + { + "type": "mapgen", + "method": "json", + "//": "z, -3 underwater passageways up to loot rooms", + "om_terrain": [ + [ "black_dragon_lair_z-4_NW", "black_dragon_lair_z-4_NE" ], + [ "black_dragon_lair_z-4_SW", "black_dragon_lair_z-4_SE" ] + ], + "object": { + "fill_ter": "t_water_dp_underground", + "rows": [ + "XXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", + "XXXXXXXXX < XXXXXXXXXXXXXXXXX XXXXXXX", + "XXXX XXXXXXXXXXXXXX XXXXXX", + "XXXX XXXXXXX XXXXXXXXXXXXX XXXXX XXXXXX", + "XXX XXXXXXXXX XXXXXXXXXXXXXX XXXXXXX XXXXXX", + "XXX XXXXXXXXX XXXXXX << XXXXXXXX XXXXX", + "X XXXXX XXX XXXXXX << XXXXXXX << XXXX", + "X XXXXX XXX XXXXXXXXXXXXXX XX XXX << XXXX", + "X XXXX XX XXX XXXXXXXXX XX XXXXX XXX", + "X XXX << XX XXX XXXXXX XXXX", + "X XXX << XX XX XX XXXX XXX", + "X XXX XXX XX XX XXX XXXXXXX XX", + "X XXXX XXX X XXXX XXX XXXXXX XXX X", + "XX XXXX XXXX XXXXXXXX XXXX X", + "XXX XXX XXXX XXXXXXXXXXX << XXXXX X", + "XXX XXX XX XXXXXXXXXXX XXXXXXXXXXX X", + "XXX < XXX XXXXXXXXXXXXX XXXXXXXXXXXXX X", + "XXX XXX XXXXX XXXXX XXXXXXXXXXXXX X", + "XXXXXXXXX XXXXX XXX XXX XXXXXXXXXXXX X", + "XXXXXXX XXXXXX XXXXXXXXXXX XX", + "XXXXXX XXXXXXX XXXXX << XXX", + "XXXXXX XXXXXXXXXXXXXX XXXX XXXXX XXX << XXX", + "XXXXXX XXXXXXXXXXXXXXX XXXXX XXX XXXX XXX", + "XXXXXX XXXXXXXXXXXXXX XXXX XXXXX XXXX", + "XXXXXX XXXXXXX XXXXX XXXXXXX XXXX", + "XXXXXX XXX XXXXXX XXXXXXXX XXXXX XXXX", + "XXXXXX XX XX XXXXXXX XXXXXXXX XXXX", + "XXXXXX X XXXXXXXXXXX XXXX XXXX", + "XXX XXXXXXXXXXXXXXXX XX XXXXX XXXX", + "XX XXXXXXXXXXXXXXXXXX XXXXXXX XXXX", + "XX XXXXXXXXXXXXXX XXXXXXXXXXXX XXXX", + "XX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXX", + "XX XXXXX << XXXXXX XXXX XXXXXXXXXXXXXXX XXXX", + "XX XXXXX << XXXXXX XXX XXXXX XXX XXXX", + "XX XXXXXX XXX << XXXX XXXX", + "XX XXXXXX XXX XXX XXXX X XXXX", + "XX XXXXXXX XXXXXXXXXXXXXXXX XXXXX XXX XXXX", + "XX XXXXXXXX XXXXXXXXXXXXXXXXX XXXXXXXXX XXXX", + "XX XXXX XXXX XXXXXXX XXXXXXXXX XXXX", + "XX XX XXXX XXX XXX XXX XX XXXXX XXXX", + "XX XXXXXXXX XXXX XXX << XXXX", + "XX XXXXXXXXX XXXXX XXX << XXXXX", + "XX XXXXXXXXXX XXXXXXX XXXXXX XXXXXXXXXXX", + "XX XXXXXX XXXXXXX XXXXXXXXXXXXXXXXXX X", + "XXX XXXX XXXXX XXXXXXXXXXXXXXX < X", + "XXXXXXX XXXXXX XX", + "XXXXXXXX XX", + "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" + ], + "place_monster": [ + { "monster": "mon_gator", "x": 10, "y": 2, "repeat": [ 1, 2 ], "chance": 50 }, + { "monster": "mon_gator", "x": 24, "y": 9, "repeat": [ 1, 2 ], "chance": 50 }, + { "monster": "mon_gator", "x": 20, "y": 19, "repeat": [ 1, 2 ], "chance": 50 }, + { "monster": "mon_gator", "x": 14, "y": 33, "repeat": [ 1, 2 ], "chance": 50 }, + { "monster": "mon_gator", "x": 7, "y": 18, "repeat": [ 1, 2 ], "chance": 50 }, + { "monster": "mon_gator", "x": 20, "y": 45, "repeat": [ 1, 2 ], "chance": 50 } + ], + "terrain": { "<": "t_slope_up", "X": "t_rock", " ": "t_water_dp_underground" } + } + } +] diff --git a/data/mods/Magiclysm/worldgen/magic_basement.json b/data/mods/Magiclysm/worldgen/magic_basement.json index cb1232e90670b..8d0f3d021a27c 100644 --- a/data/mods/Magiclysm/worldgen/magic_basement.json +++ b/data/mods/Magiclysm/worldgen/magic_basement.json @@ -61,7 +61,10 @@ { "item": "basement_utility_closet", "chance": 55, "repeat": [ 1, 2 ] }, { "item": "magic_shop_potions", "chance": 15, "repeat": [ 1, 2 ] } ], - "D": { "item": "magic_shop_potions", "chance": 35, "repeat": [ 3, 4 ] } + "D": [ + { "item": "magic_shop_potions", "chance": 35, "repeat": [ 3, 4 ] }, + { "item": "magic_CBM", "chance": 30, "repeat": [ 1, 2 ] } + ] }, "vehicles": { "c": { "vehicle": "swivel_chair", "chance": 100, "status": 0 } } } diff --git a/data/mods/Magiclysm/worldgen/overmap_specials.json b/data/mods/Magiclysm/worldgen/overmap_specials.json index 1aa5c90406cb9..863e09b77ce9d 100644 --- a/data/mods/Magiclysm/worldgen/overmap_specials.json +++ b/data/mods/Magiclysm/worldgen/overmap_specials.json @@ -19,5 +19,35 @@ "city_distance": [ 20, -1 ], "city_sizes": [ 0, 20 ], "occurrences": [ 0, 2 ] + }, + { + "type": "overmap_special", + "id": "black_dragon_lair", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "black_dragon_lair_z-0_NW_north" }, + { "point": [ 1, 0, 0 ], "overmap": "black_dragon_lair_z-0_NE_north" }, + { "point": [ 0, 1, 0 ], "overmap": "black_dragon_lair_z-0_SW_north" }, + { "point": [ 1, 1, 0 ], "overmap": "black_dragon_lair_z-0_SE_north" }, + { "point": [ 0, 0, -1 ], "overmap": "black_dragon_lair_z-1_NW_north" }, + { "point": [ 1, 0, -1 ], "overmap": "black_dragon_lair_z-1_NE_north" }, + { "point": [ 0, 1, -1 ], "overmap": "black_dragon_lair_z-1_SW_north" }, + { "point": [ 1, 1, -1 ], "overmap": "black_dragon_lair_z-1_SE_north" }, + { "point": [ 0, 0, -2 ], "overmap": "black_dragon_lair_z-2_NW_north" }, + { "point": [ 1, 0, -2 ], "overmap": "black_dragon_lair_z-2_NE_north" }, + { "point": [ 0, 1, -2 ], "overmap": "black_dragon_lair_z-2_SW_north" }, + { "point": [ 1, 1, -2 ], "overmap": "black_dragon_lair_z-2_SE_north" }, + { "point": [ 0, 0, -3 ], "overmap": "black_dragon_lair_z-3_NW_north" }, + { "point": [ 1, 0, -3 ], "overmap": "black_dragon_lair_z-3_NE_north" }, + { "point": [ 0, 1, -3 ], "overmap": "black_dragon_lair_z-3_SW_north" }, + { "point": [ 1, 1, -3 ], "overmap": "black_dragon_lair_z-3_SE_north" }, + { "point": [ 0, 0, -4 ], "overmap": "black_dragon_lair_z-4_NW_north" }, + { "point": [ 1, 0, -4 ], "overmap": "black_dragon_lair_z-4_NE_north" }, + { "point": [ 0, 1, -4 ], "overmap": "black_dragon_lair_z-4_SW_north" }, + { "point": [ 1, 1, -4 ], "overmap": "black_dragon_lair_z-4_SE_north" } + ], + "locations": [ "wilderness" ], + "city_distance": [ 20, -1 ], + "city_sizes": [ 0, 20 ], + "occurrences": [ 0, 0 ] } ] diff --git a/data/mods/Magiclysm/worldgen/overmap_terrain.json b/data/mods/Magiclysm/worldgen/overmap_terrain.json index e72d01bc35712..6e99e80728249 100644 --- a/data/mods/Magiclysm/worldgen/overmap_terrain.json +++ b/data/mods/Magiclysm/worldgen/overmap_terrain.json @@ -88,5 +88,165 @@ "type": "overmap_terrain", "id": "magic_basement", "copy-from": "generic_city_house_basement" + }, + { + "type": "overmap_terrain", + "id": "black_dragon_lair_z-0_NW", + "name": "Swamp", + "sym": "F", + "color": "cyan", + "see_cost": 5 + }, + { + "type": "overmap_terrain", + "id": "black_dragon_lair_z-0_NE", + "name": "Swamp", + "sym": "F", + "color": "cyan", + "see_cost": 5 + }, + { + "type": "overmap_terrain", + "id": "black_dragon_lair_z-0_SE", + "name": "Swamp", + "sym": "F", + "color": "cyan", + "see_cost": 5 + }, + { + "type": "overmap_terrain", + "id": "black_dragon_lair_z-0_SW", + "name": "Swamp", + "sym": "F", + "color": "cyan", + "see_cost": 5 + }, + { + "type": "overmap_terrain", + "id": "black_dragon_lair_z-1_NW", + "name": "solid rock", + "sym": "%", + "color": "light_gray", + "see_cost": 5 + }, + { + "type": "overmap_terrain", + "id": "black_dragon_lair_z-1_NE", + "name": "solid rock", + "sym": "%", + "color": "light_gray", + "see_cost": 5 + }, + { + "type": "overmap_terrain", + "id": "black_dragon_lair_z-1_SE", + "name": "solid rock", + "sym": "%", + "color": "light_gray", + "see_cost": 5 + }, + { + "type": "overmap_terrain", + "id": "black_dragon_lair_z-1_SW", + "name": "solid rock", + "sym": "%", + "color": "light_gray", + "see_cost": 5 + }, + { + "type": "overmap_terrain", + "id": "black_dragon_lair_z-2_NW", + "name": "solid rock", + "sym": "%", + "color": "light_gray", + "see_cost": 5 + }, + { + "type": "overmap_terrain", + "id": "black_dragon_lair_z-2_NE", + "name": "solid rock", + "sym": "%", + "color": "light_gray", + "see,_cost": 5 + }, + { + "type": "overmap_terrain", + "id": "black_dragon_lair_z-2_SE", + "name": "solid rock", + "sym": "%", + "color": "light_gray", + "see_cost": 5 + }, + { + "type": "overmap_terrain", + "id": "black_dragon_lair_z-2_SW", + "name": "solid rock", + "sym": "%", + "color": "light_gray", + "see_cost": 5 + }, + { + "type": "overmap_terrain", + "id": "black_dragon_lair_z-3_NW", + "name": "solid rock", + "sym": "%", + "color": "light_gray", + "see_cost": 5 + }, + { + "type": "overmap_terrain", + "id": "black_dragon_lair_z-3_NE", + "name": "solid rock", + "sym": "%", + "color": "light_gray", + "see_cost": 5 + }, + { + "type": "overmap_terrain", + "id": "black_dragon_lair_z-3_SE", + "name": "solid rock", + "sym": "%", + "color": "light_gray", + "see_cost": 5 + }, + { + "type": "overmap_terrain", + "id": "black_dragon_lair_z-3_SW", + "name": "solid rock", + "sym": "%", + "color": "light_gray", + "see_cost": 5 + }, + { + "type": "overmap_terrain", + "id": "black_dragon_lair_z-4_NW", + "name": "solid rock", + "sym": "%", + "color": "light_gray", + "see_cost": 5 + }, + { + "type": "overmap_terrain", + "id": "black_dragon_lair_z-4_NE", + "name": "solid rock", + "sym": "%", + "color": "light_gray", + "see_cost": 5 + }, + { + "type": "overmap_terrain", + "id": "black_dragon_lair_z-4_SE", + "name": "solid rock", + "sym": "%", + "color": "light_gray", + "see_cost": 5 + }, + { + "type": "overmap_terrain", + "id": "black_dragon_lair_z-4_SW", + "name": "solid rock", + "sym": "%", + "color": "light_gray", + "see_cost": 5 } ] diff --git a/data/mods/Modular_Turrets/corpses.json b/data/mods/Modular_Turrets/corpses.json index 2c5fe4785a1c3..36a8f5d9b4f4b 100644 --- a/data/mods/Modular_Turrets/corpses.json +++ b/data/mods/Modular_Turrets/corpses.json @@ -2,7 +2,7 @@ { "abstract": "broken_turret_base", "type": "GENERIC", - "override": "true", + "override": true, "symbol": ",", "looks_like": "bot_turret", "color": "light_gray", @@ -245,7 +245,7 @@ { "abstract": "broken_hack_base", "type": "GENERIC", - "override": "true", + "override": true, "symbol": ",", "color": "light_green", "name": "broken hack", diff --git a/data/mods/Modular_Turrets/items.json b/data/mods/Modular_Turrets/items.json index df50b96dd85cc..5d484b69d7c2f 100644 --- a/data/mods/Modular_Turrets/items.json +++ b/data/mods/Modular_Turrets/items.json @@ -261,7 +261,7 @@ "id": "bot_turret", "type": "TOOL", "copy-from": "bot_turret_base", - "override": "true", + "override": true, "name": "inactive 9mm defense turret", "description": "An inactive 9mm defense turret. Up to 100 standard 9mm rounds will be automatically loaded from your inventory into the turret upon activation. Place the turret and it will ID you as friendly with its advanced IFF software. Consult your safety manual in the event of a malfunction.", "color": "red", @@ -352,7 +352,7 @@ "id": "bot_rifleturret", "copy-from": "bot_turret_base", "type": "TOOL", - "override": "true", + "override": true, "name": "inactive 5.56mm military turret", "description": "An inactive 5.56mm military turret. Up to 100 standard 5.56mm NATO rounds will be automatically loaded from your inventory into the turret upon activation. Place the turret and it will ID you as friendly with its advanced IFF software. Consult your safety manual in the event of a malfunction.", "color": "green", @@ -515,7 +515,7 @@ "id": "bot_laserturret", "type": "TOOL", "copy-from": "bot_turret_base", - "override": "true", + "override": true, "name": "inactive advanced laser turret", "description": "An inactive advanced laser turret. Place the turret and it will ID you as friendly with its advanced IFF software. Consult your safety manual in the event of a malfunction.", "color": "yellow", diff --git a/data/mods/Modular_Turrets/recipe.json b/data/mods/Modular_Turrets/recipe.json index 7baaf53507f1c..d322c1e428735 100644 --- a/data/mods/Modular_Turrets/recipe.json +++ b/data/mods/Modular_Turrets/recipe.json @@ -2,7 +2,7 @@ { "abstract": "bot_hack_base", "type": "recipe", - "override": "true", + "override": true, "category": "CC_ELECTRONIC", "subcategory": "CSC_ELECTRONIC_OTHER", "skill_used": "electronics", @@ -284,7 +284,7 @@ { "type": "recipe", "result": "bot_laserturret", - "override": "true", + "override": true, "copy-from": "bot_turret_base", "category": "CC_ELECTRONIC", "subcategory": "CSC_ELECTRONIC_PARTS", diff --git a/data/mods/Modular_Turrets/uncraft_corpse.json b/data/mods/Modular_Turrets/uncraft_corpse.json index a58467aa86011..605cb2b6f3109 100644 --- a/data/mods/Modular_Turrets/uncraft_corpse.json +++ b/data/mods/Modular_Turrets/uncraft_corpse.json @@ -2,7 +2,7 @@ { "result": "broken_manhack", "type": "uncraft", - "override": "true", + "override": true, "skill_used": "electronics", "difficulty": 4, "time": 2000, @@ -13,7 +13,7 @@ { "result": "broken_flashbang_hack", "type": "uncraft", - "override": "true", + "override": true, "skill_used": "electronics", "difficulty": 4, "time": 2000, @@ -24,7 +24,7 @@ { "result": "broken_gasbomb_hack", "type": "uncraft", - "override": "true", + "override": true, "skill_used": "electronics", "difficulty": 4, "time": 2000, @@ -35,7 +35,7 @@ { "result": "broken_EMP_hack", "type": "uncraft", - "override": "true", + "override": true, "skill_used": "electronics", "difficulty": 4, "time": 2000, @@ -46,7 +46,7 @@ { "result": "broken_grenade_hack", "type": "uncraft", - "override": "true", + "override": true, "skill_used": "electronics", "difficulty": 4, "time": 2000, @@ -57,7 +57,7 @@ { "result": "broken_c4_hack", "type": "uncraft", - "override": "true", + "override": true, "skill_used": "electronics", "difficulty": 4, "time": 2000, @@ -68,7 +68,7 @@ { "result": "broken_mininuke_hack", "type": "uncraft", - "override": "true", + "override": true, "skill_used": "electronics", "difficulty": 5, "time": 2000, @@ -147,7 +147,7 @@ "difficulty": 2, "time": 3000, "qualities": [ { "id": "SCREW", "level": 1 } ], - "override": "true", + "override": true, "components": [ [ [ "broken_turret_disarmed", 1 ] ], [ [ "robopart_9mm", 1 ] ] ] }, { @@ -274,7 +274,7 @@ "difficulty": 2, "time": 3000, "qualities": [ { "id": "SCREW", "level": 1 } ], - "override": "true", + "override": true, "components": [ [ [ "broken_advturret_disarmed", 1 ] ], [ [ "robopart_laser", 1 ] ] ] }, { diff --git a/data/mods/More_Locations/factory/factory_be_02.json b/data/mods/More_Locations/factory/factory_be_02.json index 5c402d01caa34..2d3244d787ddb 100644 --- a/data/mods/More_Locations/factory/factory_be_02.json +++ b/data/mods/More_Locations/factory/factory_be_02.json @@ -34,7 +34,7 @@ ",,,,,,,,,,,,,,,,,,,,,,,," ], "palettes": [ "factory" ], - "monster": { "t": { "monster": "mon_turret" } } + "monster": { "t": { "monster": "mon_turret_rifle" } } } } ] diff --git a/data/mods/More_Locations/factory/factory_be_05.json b/data/mods/More_Locations/factory/factory_be_05.json index 4d6a0753dcfea..1e46830a65a26 100644 --- a/data/mods/More_Locations/factory/factory_be_05.json +++ b/data/mods/More_Locations/factory/factory_be_05.json @@ -34,7 +34,7 @@ ",,,,,,,,,,,,,,,,,,,,,,,," ], "palettes": [ "factory" ], - "monster": { "t": { "monster": "mon_turret" } } + "monster": { "t": { "monster": "mon_turret_rifle" } } } } ] diff --git a/data/mods/More_Locations/factory/factory_be_gate_01.json b/data/mods/More_Locations/factory/factory_be_gate_01.json index bea15177c1f08..c3f5b4f372e81 100644 --- a/data/mods/More_Locations/factory/factory_be_gate_01.json +++ b/data/mods/More_Locations/factory/factory_be_gate_01.json @@ -34,7 +34,7 @@ ",,,,,,, ,,,,,,," ], "palettes": [ "factory" ], - "monster": { "t": { "monster": "mon_turret" }, "Z": { "monster": "mon_secubot" }, "z": { "monster": "mon_skitterbot" } }, + "monster": { "t": { "monster": "mon_turret_rifle" }, "Z": { "monster": "mon_secubot" }, "z": { "monster": "mon_skitterbot" } }, "mapping": { "H": { "item": { "item": "chem_zinc_powder", "count": 50 } } } } } diff --git a/data/mods/More_Locations/factory/factory_be_gate_02.json b/data/mods/More_Locations/factory/factory_be_gate_02.json index 19394b42d50d0..53834d03c7637 100644 --- a/data/mods/More_Locations/factory/factory_be_gate_02.json +++ b/data/mods/More_Locations/factory/factory_be_gate_02.json @@ -34,7 +34,7 @@ ",,,, ,,,," ], "palettes": [ "factory" ], - "monster": { "t": { "monster": "mon_turret" }, "Z": { "monster": "mon_secubot" }, "z": { "monster": "mon_skitterbot" } } + "monster": { "t": { "monster": "mon_turret_rifle" }, "Z": { "monster": "mon_secubot" }, "z": { "monster": "mon_skitterbot" } } } } ] diff --git a/data/mods/More_Locations/factory/factory_be_gate_03.json b/data/mods/More_Locations/factory/factory_be_gate_03.json index 3634077d7cba0..766adec199b3e 100644 --- a/data/mods/More_Locations/factory/factory_be_gate_03.json +++ b/data/mods/More_Locations/factory/factory_be_gate_03.json @@ -34,7 +34,7 @@ ",,,, ,,,," ], "palettes": [ "factory" ], - "monster": { "t": { "monster": "mon_turret" }, "Z": { "monster": "mon_secubot" }, "z": { "monster": "mon_skitterbot" } }, + "monster": { "t": { "monster": "mon_turret_rifle" }, "Z": { "monster": "mon_secubot" }, "z": { "monster": "mon_skitterbot" } }, "place_signs": [ { "x": 11, "y": 21, "snippet": "robot_protest" }, { "x": 14, "y": 21, "snippet": "robot protest" }, diff --git a/data/mods/More_Locations/factory/factory_blc_04.json b/data/mods/More_Locations/factory/factory_blc_04.json index c4dd5f2abe3e7..694518bc18eda 100644 --- a/data/mods/More_Locations/factory/factory_blc_04.json +++ b/data/mods/More_Locations/factory/factory_blc_04.json @@ -34,7 +34,7 @@ ",,,,,,,,,,,,,,,,,,,,,,,," ], "palettes": [ "factory" ], - "monster": { "t": { "monster": "mon_turret" } } + "monster": { "t": { "monster": "mon_turret_rifle" } } } } ] diff --git a/data/mods/More_Locations/factory/factory_blc_05.json b/data/mods/More_Locations/factory/factory_blc_05.json index 0523ccacd8ee5..46015e24ee79c 100644 --- a/data/mods/More_Locations/factory/factory_blc_05.json +++ b/data/mods/More_Locations/factory/factory_blc_05.json @@ -34,7 +34,7 @@ ",,,,,,,,,,,,,,,,,,,,,,,," ], "palettes": [ "factory" ], - "monster": { "t": { "monster": "mon_turret" } } + "monster": { "t": { "monster": "mon_turret_rifle" } } } } ] diff --git a/data/mods/More_Locations/factory/factory_brc_02.json b/data/mods/More_Locations/factory/factory_brc_02.json index c7633deafd318..3eff76311e285 100644 --- a/data/mods/More_Locations/factory/factory_brc_02.json +++ b/data/mods/More_Locations/factory/factory_brc_02.json @@ -34,7 +34,7 @@ "......|..........|5....." ], "palettes": [ "factory" ], - "monster": { "t": { "monster": "mon_turret" } } + "monster": { "t": { "monster": "mon_turret_rifle" } } } } ] diff --git a/data/mods/More_Locations/factory/factory_le_05.json b/data/mods/More_Locations/factory/factory_le_05.json index 329fca302057d..45a33d8e3d9ec 100644 --- a/data/mods/More_Locations/factory/factory_le_05.json +++ b/data/mods/More_Locations/factory/factory_le_05.json @@ -34,7 +34,7 @@ ",,F,,,,,,|||=.....|....." ], "palettes": [ "factory" ], - "monster": { "t": { "monster": "mon_turret" } } + "monster": { "t": { "monster": "mon_turret_rifle" } } } } ] diff --git a/data/mods/More_Locations/factory/factory_mid_10.json b/data/mods/More_Locations/factory/factory_mid_10.json index ad47a9fa96f8c..601477adfb83c 100644 --- a/data/mods/More_Locations/factory/factory_mid_10.json +++ b/data/mods/More_Locations/factory/factory_mid_10.json @@ -35,7 +35,7 @@ ], "rotation": [ 0, 3 ], "palettes": [ "factory" ], - "monster": { "t": { "monster": "mon_turret" } } + "monster": { "t": { "monster": "mon_turret_rifle" } } } } ] diff --git a/data/mods/More_Locations/factory/factory_mid_15.json b/data/mods/More_Locations/factory/factory_mid_15.json index 82d1b22615804..6bbf03aa0bce9 100644 --- a/data/mods/More_Locations/factory/factory_mid_15.json +++ b/data/mods/More_Locations/factory/factory_mid_15.json @@ -35,7 +35,7 @@ ], "rotation": [ 0, 3 ], "palettes": [ "factory" ], - "monster": { "t": { "monster": "mon_turret" } } + "monster": { "t": { "monster": "mon_turret_rifle" } } } } ] diff --git a/data/mods/More_Locations/factory/factory_re_06.json b/data/mods/More_Locations/factory/factory_re_06.json index 4f31e74ed9b0e..b6cc4b672d36a 100644 --- a/data/mods/More_Locations/factory/factory_re_06.json +++ b/data/mods/More_Locations/factory/factory_re_06.json @@ -34,7 +34,7 @@ ".....|......||,,,,,,,F,," ], "palettes": [ "factory" ], - "monster": { "t": { "monster": "mon_turret" } } + "monster": { "t": { "monster": "mon_turret_rifle" } } } } ] diff --git a/data/mods/More_Locations/factory/factory_te_04.json b/data/mods/More_Locations/factory/factory_te_04.json index 48f08e14a5b67..221da4cd45384 100644 --- a/data/mods/More_Locations/factory/factory_te_04.json +++ b/data/mods/More_Locations/factory/factory_te_04.json @@ -34,7 +34,7 @@ "......|.........=|......" ], "palettes": [ "factory" ], - "monster": { "t": { "monster": "mon_turret" } } + "monster": { "t": { "monster": "mon_turret_rifle" } } } } ] diff --git a/data/mods/More_Locations/factory/factory_trc_01.json b/data/mods/More_Locations/factory/factory_trc_01.json index 557bbb3ead2e4..ff492d6ec8b69 100644 --- a/data/mods/More_Locations/factory/factory_trc_01.json +++ b/data/mods/More_Locations/factory/factory_trc_01.json @@ -34,7 +34,7 @@ "....2|......||,,,,,,,F,," ], "palettes": [ "factory" ], - "monster": { "t": { "monster": "mon_turret" }, "Z": { "monster": "mon_secubot" }, "z": { "monster": "mon_skitterbot" } } + "monster": { "t": { "monster": "mon_turret_rifle" }, "Z": { "monster": "mon_secubot" }, "z": { "monster": "mon_skitterbot" } } } } ] diff --git a/data/mods/More_Locations/factory/factory_trc_02.json b/data/mods/More_Locations/factory/factory_trc_02.json index 6ec5a42e28096..02cbb1393a8ae 100644 --- a/data/mods/More_Locations/factory/factory_trc_02.json +++ b/data/mods/More_Locations/factory/factory_trc_02.json @@ -34,7 +34,7 @@ ".....|.....=||,,,,,,,F,," ], "palettes": [ "factory" ], - "monster": { "t": { "monster": "mon_turret" } } + "monster": { "t": { "monster": "mon_turret_rifle" } } } } ] diff --git a/data/mods/More_Locations/military_outpost/mil_outpost_ubrc_04.json b/data/mods/More_Locations/military_outpost/mil_outpost_ubrc_04.json index 809796cda6f2d..0c994aac61c7d 100644 --- a/data/mods/More_Locations/military_outpost/mil_outpost_ubrc_04.json +++ b/data/mods/More_Locations/military_outpost/mil_outpost_ubrc_04.json @@ -35,7 +35,7 @@ ], "palettes": [ "mil_outpost_underground" ], "items": { "$": { "item": "bots", "chance": 60 } }, - "monster": { "t": { "monster": "mon_turret" } }, + "monster": { "t": { "monster": "mon_turret_rifle" } }, "vehicles": { "v": { "vehicle": "swivel_chair", "chance": 100, "fuel": 50, "status": 3 } } } } diff --git a/data/mods/More_Locations/military_outpost/mil_outpost_utlc_03.json b/data/mods/More_Locations/military_outpost/mil_outpost_utlc_03.json index a4ab2932ec73d..efb3fbd217fae 100644 --- a/data/mods/More_Locations/military_outpost/mil_outpost_utlc_03.json +++ b/data/mods/More_Locations/military_outpost/mil_outpost_utlc_03.json @@ -35,7 +35,7 @@ ], "palettes": [ "mil_outpost_underground" ], "item": { "x": { "item": "dogfood", "count": [ 5, 25 ] } }, - "monster": { "t": { "monster": "mon_turret" } } + "monster": { "t": { "monster": "mon_turret_rifle" } } } } ] diff --git a/data/mods/More_Locations/refugee_faction/refugee_item_groups.json b/data/mods/More_Locations/refugee_faction/refugee_item_groups.json index a82a9bbef3eab..ce4de00c1c7c5 100644 --- a/data/mods/More_Locations/refugee_faction/refugee_item_groups.json +++ b/data/mods/More_Locations/refugee_faction/refugee_item_groups.json @@ -163,7 +163,7 @@ "subtype": "collection", "items": [ { "item": "cash_card", "prob": 100, "charges-min": 0, "charges-max": 50000 }, - { "item": "flashlight_on", "prob": 10 }, + { "item": "flashlight", "prob": 10 }, { "distribution": [ { "item": "pockknife", "chance": 200 }, diff --git a/data/mods/More_Locations/tpalettes.json b/data/mods/More_Locations/tpalettes.json index 035f854f935e8..064bb40945c8f 100644 --- a/data/mods/More_Locations/tpalettes.json +++ b/data/mods/More_Locations/tpalettes.json @@ -512,7 +512,7 @@ "S": { "item": "cleaning", "chance": 5 } }, "mapping": { - "*": { "furniture": "f_rubble", "item": { "item": "heavy_flashlight_on" } }, + "*": { "furniture": "f_rubble", "item": { "item": "heavy_flashlight" } }, "W": { "furniture": "f_woodstove", "item": { "item": "2x4", "amount": 10 }, "fields": { "field": "fd_fire" } } } }, diff --git a/data/mods/Mundane_Zombies/modinfo.json b/data/mods/Mundane_Zombies/modinfo.json index ea5fc653871d5..e421808a79a97 100644 --- a/data/mods/Mundane_Zombies/modinfo.json +++ b/data/mods/Mundane_Zombies/modinfo.json @@ -66,7 +66,16 @@ "mon_zombie_gasbag_fungus", "mon_zombie_smoker_fungus", "mon_skeleton_hulk_fungus", - "mon_skeleton_electric" + "mon_skeleton_electric", + "mon_zombie_kevlar_1", + "mon_zombie_kevlar_2", + "mon_skeleton_brute", + "mon_zombie_gasbag_immobile", + "mon_zombie_gasbag_crawler", + "mon_zombie_gasbag_impaler", + "mon_zombie_crushed_giant", + "mon_zombie_living_wall", + "mon_zombie_thorny" ] } ] diff --git a/data/mods/Salvaged_Robots/robot_additions/vehicles.json b/data/mods/Salvaged_Robots/robot_additions/vehicles.json index fdc72ac034c56..4737041c07ad0 100644 --- a/data/mods/Salvaged_Robots/robot_additions/vehicles.json +++ b/data/mods/Salvaged_Robots/robot_additions/vehicles.json @@ -12,7 +12,7 @@ "parts": [ { "x": -4, "y": -1, "part": "frame_vertical" }, { "x": -4, "y": -1, "part": "windshield" }, - { "x": -4, "y": -1, "part": "wheel" }, + { "x": -4, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -3, "y": -1, "part": "frame_vertical" }, { "x": -3, "y": -1, "part": "windshield" }, { "x": -2, "y": -1, "part": "frame_vertical" }, @@ -23,7 +23,7 @@ { "x": 0, "y": -1, "part": "windshield" }, { "x": 1, "y": -1, "part": "frame_vertical" }, { "x": 1, "y": -1, "part": "windshield" }, - { "x": 1, "y": -1, "part": "wheel_steerable" }, + { "x": 1, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, { "x": -4, "y": 0, "part": "frame_vertical" }, { "x": -4, "y": 0, "part": "door" }, { "x": -3, "y": 0, "part": "frame_vertical" }, @@ -63,7 +63,7 @@ { "x": 1, "y": 1, "part": "windshield" }, { "x": -4, "y": 2, "part": "frame_vertical" }, { "x": -4, "y": 2, "part": "windshield" }, - { "x": -4, "y": 2, "part": "wheel" }, + { "x": -4, "y": 2, "parts": [ "wheel_mount_medium", "wheel" ] }, { "x": -3, "y": 2, "part": "frame_vertical" }, { "x": -3, "y": 2, "part": "door" }, { "x": -2, "y": 2, "part": "frame_vertical" }, @@ -78,7 +78,7 @@ { "x": 1, "y": 2, "part": "halfboard_vertical" }, { "x": 1, "y": 2, "part": "storage_battery_mount" }, { "x": 1, "y": 2, "part": "storage_battery_removable" }, - { "x": 1, "y": 2, "part": "wheel_steerable" } + { "x": 1, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] } ] }, { @@ -126,7 +126,7 @@ { "x": 0, "y": -1, "part": "hdroof" }, { "x": 0, "y": -2, "part": "hdframe_vertical" }, { "x": 0, "y": -2, "part": "hddoor_opaque" }, - { "x": 0, "y": -2, "part": "wheel_armor" }, + { "x": 0, "y": -2, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "x": 0, "y": -2, "part": "plating_military" }, { "x": 0, "y": 0, "part": "hdframe_vertical_2" }, { "x": 0, "y": 0, "part": "aisle_horizontal" }, @@ -135,7 +135,7 @@ { "x": 0, "y": 1, "part": "robot_cargo" }, { "x": 0, "y": 1, "part": "hdroof" }, { "x": 0, "y": 2, "part": "hdframe_vertical" }, - { "x": 0, "y": 2, "part": "wheel_armor" }, + { "x": 0, "y": 2, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "x": 0, "y": 2, "part": "hddoor_opaque" }, { "x": 0, "y": 2, "part": "plating_military" }, { "x": 1, "y": -1, "part": "hdframe_vertical_2" }, @@ -143,7 +143,7 @@ { "x": 1, "y": -1, "part": "hdroof" }, { "x": 1, "y": -2, "part": "hdframe_vertical" }, { "x": 1, "y": -2, "part": "hddoor_opaque" }, - { "x": 1, "y": -2, "part": "wheel_armor" }, + { "x": 1, "y": -2, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "x": 1, "y": -2, "part": "plating_military" }, { "x": 1, "y": 0, "part": "hdframe_vertical_2" }, { "x": 1, "y": 0, "part": "aisle_horizontal" }, @@ -152,7 +152,7 @@ { "x": 1, "y": 1, "part": "robot_cargo" }, { "x": 1, "y": 1, "part": "hdroof" }, { "x": 1, "y": 2, "part": "hdframe_vertical" }, - { "x": 1, "y": 2, "part": "wheel_armor" }, + { "x": 1, "y": 2, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "x": 1, "y": 2, "part": "hddoor_opaque" }, { "x": 1, "y": 2, "part": "plating_military" }, { "x": 2, "y": -1, "part": "hdframe_vertical_2" }, @@ -160,7 +160,7 @@ { "x": 2, "y": -1, "part": "hdroof" }, { "x": 2, "y": -2, "part": "hdframe_vertical" }, { "x": 2, "y": -2, "part": "hddoor_opaque" }, - { "x": 2, "y": -2, "part": "wheel_armor" }, + { "x": 2, "y": -2, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "x": 2, "y": -2, "part": "plating_military" }, { "x": 2, "y": 0, "part": "hdframe_vertical_2" }, { "x": 2, "y": 0, "part": "aisle_horizontal" }, @@ -169,7 +169,7 @@ { "x": 2, "y": 1, "part": "robot_cargo" }, { "x": 2, "y": 1, "part": "hdroof" }, { "x": 2, "y": 2, "part": "hdframe_vertical" }, - { "x": 2, "y": 2, "part": "wheel_armor" }, + { "x": 2, "y": 2, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "x": 2, "y": 2, "part": "hddoor_opaque" }, { "x": 2, "y": 2, "part": "plating_military" }, { "x": 3, "y": -1, "part": "hdframe_vertical_2" }, @@ -181,7 +181,7 @@ { "x": 3, "y": -1, "part": "seatbelt_heavyduty" }, { "x": 3, "y": -1, "part": "hdroof" }, { "x": 3, "y": -2, "part": "hdframe_vertical" }, - { "x": 3, "y": -2, "part": "wheel_armor_steerable" }, + { "x": 3, "y": -2, "parts": [ "wheel_mount_heavy_steerable", "wheel_armor" ] }, { "x": 3, "y": -2, "part": "hdboard_vertical" }, { "x": 3, "y": -2, "part": "omnicam" }, { "x": 3, "y": -2, "part": "plating_military" }, @@ -201,7 +201,7 @@ { "x": 3, "y": 1, "part": "turret_mount" }, { "x": 3, "y": 1, "part": "mounted_browning", "ammo": 60, "ammo_qty": [ 10, 100 ] }, { "x": 3, "y": 2, "part": "hdframe_vertical" }, - { "x": 3, "y": 2, "part": "wheel_armor_steerable" }, + { "x": 3, "y": 2, "parts": [ "wheel_mount_heavy_steerable", "wheel_armor" ] }, { "x": 3, "y": 2, "part": "hdboard_vertical" }, { "x": 3, "y": 2, "part": "omnicam" }, { "x": 3, "y": 2, "part": "plating_military" }, @@ -298,7 +298,7 @@ { "x": 2, "y": 3, "part": "hdframe_ne" }, { "x": 2, "y": 3, "part": "hdhalfboard_ne" }, { "x": 2, "y": 3, "part": "plating_military" }, - { "x": 2, "y": 3, "part": "wheel_armor_steerable" }, + { "x": 2, "y": 3, "parts": [ "wheel_mount_heavy_steerable", "wheel_armor" ] }, { "x": 2, "y": 0, "part": "hdframe_horizontal" }, { "x": 2, "y": 0, "part": "hdhalfboard_horizontal" }, { "x": 2, "y": 0, "part": "plating_military" }, @@ -306,7 +306,7 @@ { "x": 2, "y": -1, "part": "hdframe_nw" }, { "x": 2, "y": -1, "part": "hdhalfboard_nw" }, { "x": 2, "y": -1, "part": "plating_military" }, - { "x": 2, "y": -1, "part": "wheel_armor_steerable" }, + { "x": 2, "y": -1, "parts": [ "wheel_mount_heavy_steerable", "wheel_armor" ] }, { "x": 3, "y": 1, "part": "hdframe_horizontal_2" }, { "x": 3, "y": 1, "part": "plating_military" }, { "x": 3, "y": 2, "part": "hdframe_horizontal_2" }, @@ -365,7 +365,7 @@ { "x": -3, "y": 3, "part": "hdframe_se" }, { "x": -3, "y": 3, "part": "hdboard_se" }, { "x": -3, "y": 3, "part": "plating_military" }, - { "x": -3, "y": 3, "part": "wheel_armor" }, + { "x": -3, "y": 3, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "x": -3, "y": 0, "part": "hdframe_horizontal" }, { "x": -3, "y": 0, "part": "hddoor_trunk" }, { "x": -3, "y": 0, "part": "muffler" }, @@ -373,7 +373,7 @@ { "x": -3, "y": -1, "part": "hdframe_sw" }, { "x": -3, "y": -1, "part": "hdboard_sw" }, { "x": -3, "y": -1, "part": "plating_military" }, - { "x": -3, "y": -1, "part": "wheel_armor" } + { "x": -3, "y": -1, "parts": [ "wheel_mount_heavy", "wheel_armor" ] } ], "items": [ { "x": 0, "y": 0, "chance": 5, "items": [ "id_military" ] }, diff --git a/data/mods/Salvaged_Robots/uncraft_corpse.json b/data/mods/Salvaged_Robots/uncraft_corpse.json index 42696c2fd6aca..3130245aa672b 100644 --- a/data/mods/Salvaged_Robots/uncraft_corpse.json +++ b/data/mods/Salvaged_Robots/uncraft_corpse.json @@ -11,7 +11,7 @@ { "result": "broken_light_hack", "type": "uncraft", - "override": "true", + "override": true, "skill_used": "electronics", "difficulty": 4, "time": 2000, @@ -29,7 +29,7 @@ { "result": "broken_distract_hack", "type": "uncraft", - "override": "true", + "override": true, "skill_used": "electronics", "difficulty": 4, "time": 2000, @@ -47,7 +47,7 @@ { "result": "broken_arson_hack", "type": "uncraft", - "override": "true", + "override": true, "skill_used": "electronics", "difficulty": 4, "time": 2000, @@ -65,7 +65,7 @@ { "result": "broken_spore_hack", "type": "uncraft", - "override": "true", + "override": true, "skill_used": "electronics", "difficulty": 4, "time": 2000, diff --git a/data/mods/StatsThroughSkills/modinfo.json b/data/mods/StatsThroughSkills/modinfo.json index 103e2baf12022..9bc42859de70b 100644 --- a/data/mods/StatsThroughSkills/modinfo.json +++ b/data/mods/StatsThroughSkills/modinfo.json @@ -2,7 +2,7 @@ { "type": "MOD_INFO", "ident": "StatsThroughSkills", - "name": "StatsThroughSkills", + "name": "Stats Through Skills", "authors": [ "Ryan \"DeNarr\" Saige", "Kevin Granade" ], "description": "Allows stats to raise via skill progression.", "category": "rebalance", diff --git a/data/mods/Tanks/vehicles.json b/data/mods/Tanks/vehicles.json index 5995bd2da32b2..d04aeedf46ae2 100644 --- a/data/mods/Tanks/vehicles.json +++ b/data/mods/Tanks/vehicles.json @@ -1451,18 +1451,18 @@ { "x": -4, "y": -1, "part": "plating_military" }, { "x": -3, "y": -1, "part": "hdframe_vertical" }, { "x": -3, "y": -1, "part": "hdboard_vertical" }, - { "x": -3, "y": -1, "part": "wheel_armor" }, + { "x": -3, "y": -1, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "x": -3, "y": -1, "part": "plating_military" }, { "x": -2, "y": -1, "part": "hdframe_vertical" }, { "x": -2, "y": -1, "part": "door_opaque" }, - { "x": -2, "y": -1, "part": "wheel_armor" }, + { "x": -2, "y": -1, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "x": -2, "y": -1, "part": "plating_military" }, { "x": -1, "y": -1, "part": "hdframe_vertical" }, { "x": -1, "y": -1, "part": "hdboard_vertical" }, - { "x": -1, "y": -1, "part": "wheel_armor" }, + { "x": -1, "y": -1, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "x": -1, "y": -1, "part": "plating_military" }, { "x": 0, "y": -1, "part": "hdframe_vertical" }, - { "x": 0, "y": -1, "part": "wheel_armor_steerable" }, + { "x": 0, "y": -1, "parts": [ "wheel_mount_heavy_steerable", "wheel_armor" ] }, { "x": 0, "y": -1, "part": "hdboard_vertical" }, { "x": 0, "y": -1, "part": "plating_military" }, { "x": 1, "y": -1, "part": "hdframe_vertical" }, @@ -1593,19 +1593,19 @@ { "x": -4, "y": 3, "part": "hdboard_vertical" }, { "x": -4, "y": 3, "part": "plating_military" }, { "x": -3, "y": 3, "part": "hdframe_vertical" }, - { "x": -3, "y": 3, "part": "wheel_armor" }, + { "x": -3, "y": 3, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "x": -3, "y": 3, "part": "hdboard_vertical" }, { "x": -3, "y": 3, "part": "plating_military" }, { "x": -2, "y": 3, "part": "hdframe_vertical" }, - { "x": -2, "y": 3, "part": "wheel_armor" }, + { "x": -2, "y": 3, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "x": -2, "y": 3, "part": "hdboard_vertical" }, { "x": -2, "y": 3, "part": "plating_military" }, { "x": -1, "y": 3, "part": "hdframe_vertical" }, - { "x": -1, "y": 3, "part": "wheel_armor" }, + { "x": -1, "y": 3, "parts": [ "wheel_mount_heavy", "wheel_armor" ] }, { "x": -1, "y": 3, "part": "hdboard_vertical" }, { "x": -1, "y": 3, "part": "plating_military" }, { "x": 0, "y": 3, "part": "hdframe_vertical" }, - { "x": 0, "y": 3, "part": "wheel_armor_steerable" }, + { "x": 0, "y": 3, "parts": [ "wheel_mount_heavy_steerable", "wheel_armor" ] }, { "x": 0, "y": 3, "part": "hdboard_vertical" }, { "x": 0, "y": 3, "part": "plating_military" }, { "x": 1, "y": 3, "part": "hdframe_ne" }, diff --git a/data/mods/blazemod/blaze_blob_parts.json b/data/mods/blazemod/blaze_blob_parts.json index 2786888e0ef5b..1a9bbf75b8913 100644 --- a/data/mods/blazemod/blaze_blob_parts.json +++ b/data/mods/blazemod/blaze_blob_parts.json @@ -19,7 +19,7 @@ "wheel_type": "treads", "contact_area": 2500, "rolling_resistance": 6, - "flags": [ "WHEEL", "VARIABLE_SIZE", "MULTISQUARE", "TRACKED", "NO_JACK", "FOLDABLE" ] + "flags": [ "WHEEL", "VARIABLE_SIZE", "MULTISQUARE", "TRACKED", "FOLDABLE" ] }, { "id": "oozletread", @@ -176,7 +176,7 @@ "rolling_resistance": 1.5, "wheel_type": "standard", "contact_area": 153, - "flags": [ "WHEEL", "TOOL_NONE", "FOLDABLE", "EXTRA_DRAG", "SHARP", "TRACKED", "NO_JACK" ] + "flags": [ "WHEEL", "TOOL_NONE", "FOLDABLE", "EXTRA_DRAG", "SHARP", "TRACKED" ] }, { "id": "frostie_wheel_sea", @@ -195,7 +195,7 @@ "breaks_into": [ { "item": "frostiegrow" } ], "description": "A living blob, existing in a super-cooled state. It acts as a boat hull.", "requirements": { "repair": { "time": 30000, "using": [ [ "blobrep", 1 ] ] } }, - "flags": [ "FLOATS", "TOOL_NONE", "FOLDABLE", "EXTRA_DRAG", "SHARP", "TRACKED", "NO_JACK" ] + "flags": [ "FLOATS", "TOOL_NONE", "FOLDABLE", "EXTRA_DRAG", "SHARP", "TRACKED" ] }, { "id": "fuzzle", @@ -486,7 +486,7 @@ "rolling_resistance": 1.75, "wheel_type": "standard", "contact_area": 153, - "flags": [ "WHEEL", "TOOL_NONE", "FOLDABLE", "TRACKED", "NO_JACK" ] + "flags": [ "WHEEL", "TOOL_NONE", "FOLDABLE", "TRACKED" ] }, { "id": "gloopleaisle_horizontal", @@ -892,7 +892,7 @@ "rolling_resistance": 1.25, "wheel_type": "standard", "contact_area": 153, - "flags": [ "WHEEL", "TOOL_NONE", "FOLDABLE", "TRACKED", "NO_JACK" ] + "flags": [ "WHEEL", "TOOL_NONE", "FOLDABLE", "TRACKED" ] }, { "id": "grayaisle_horizontal", @@ -1025,7 +1025,7 @@ "rolling_resistance": 6, "wheel_type": "rigid", "contact_area": 500, - "flags": [ "WHEEL", "TOOL_NONE", "FOLDABLE", "PROTRUSION", "STABLE", "TRACKED", "NO_JACK" ] + "flags": [ "WHEEL", "TOOL_NONE", "FOLDABLE", "PROTRUSION", "STABLE", "TRACKED" ] }, { "id": "halfgloopleboard_horizontal", @@ -1508,7 +1508,7 @@ "rolling_resistance": 1.5, "wheel_type": "standard", "contact_area": 153, - "flags": [ "WHEEL", "TOOL_NONE", "FOLDABLE", "TRACKED", "NO_JACK" ] + "flags": [ "WHEEL", "TOOL_NONE", "FOLDABLE", "TRACKED" ] }, { "id": "oozleaisle_horizontal", diff --git a/data/mods/blazemod/blaze_other_parts.json b/data/mods/blazemod/blaze_other_parts.json index 707b351a0fc0b..63ba81740739d 100644 --- a/data/mods/blazemod/blaze_other_parts.json +++ b/data/mods/blazemod/blaze_other_parts.json @@ -219,7 +219,7 @@ "rolling_resistance": 6, "wheel_type": "treads", "contact_area": 900, - "flags": [ "WHEEL", "VARIABLE_SIZE", "MULTISQUARE", "TRACKED", "NO_JACK" ] + "flags": [ "WHEEL", "VARIABLE_SIZE", "MULTISQUARE", "TRACKED" ] }, { "id": "tread2", @@ -244,7 +244,7 @@ "rolling_resistance": 5, "wheel_type": "treads", "contact_area": 2500, - "flags": [ "WHEEL", "VARIABLE_SIZE", "MULTISQUARE", "TRACKED", "NO_JACK" ] + "flags": [ "WHEEL", "VARIABLE_SIZE", "MULTISQUARE", "TRACKED" ] }, { "id": "tread3", @@ -269,7 +269,7 @@ "rolling_resistance": 5, "wheel_type": "treads", "contact_area": 3600, - "flags": [ "WHEEL", "VARIABLE_SIZE", "MULTISQUARE", "TRACKED", "NO_JACK" ] + "flags": [ "WHEEL", "VARIABLE_SIZE", "MULTISQUARE", "TRACKED" ] }, { "id": "turretframe", diff --git a/data/mods/desert_region/desert.png b/data/mods/desert_region/desert.png new file mode 100644 index 0000000000000..86c999e1eb71b Binary files /dev/null and b/data/mods/desert_region/desert.png differ diff --git a/data/mods/desert_region/mod_tileset.json b/data/mods/desert_region/mod_tileset.json new file mode 100644 index 0000000000000..ffc07dc4dfcbd --- /dev/null +++ b/data/mods/desert_region/mod_tileset.json @@ -0,0 +1,43 @@ +[ + { + "type": "mod_tileset", + "compatibility": [ "MshockXottoplus", "MSX++DEAD_PEOPLE", "UNDEAD_PEOPLE" ], + "tiles-new": [ + { + "file": "desert.png", + "tiles": [ + { + "id": [ "t_sand", "t_searth_test" ], + "fg": 0, + "bg": 16, + "multitile": true, + "additional_tiles": [ + { "id": "center", "fg": 0, "bg": 16 }, + { "id": "corner", "fg": [ 1, 2, 3, 4 ], "bg": 16 }, + { "id": "t_connection", "fg": [ 5, 6, 7, 8 ], "bg": 16 }, + { "id": "edge", "fg": [ 9, 10 ], "bg": 16 }, + { "id": "end_piece", "fg": [ 11, 12, 13, 14 ], "bg": 16 }, + { "id": "unconnected", "fg": 15, "bg": 16 } + ], + "rotates": false + }, + { + "id": [ "t_searth_test" ], + "fg": 16, + "bg": 16, + "multitile": true, + "additional_tiles": [ + { "id": "center", "fg": 16, "bg": 16 }, + { "id": "corner", "fg": [ 17, 18, 19, 20 ], "bg": 16 }, + { "id": "t_connection", "fg": [ 21, 22, 23, 24 ], "bg": 16 }, + { "id": "edge", "fg": [ 25, 26 ], "bg": 16 }, + { "id": "end_piece", "fg": [ 27, 28, 29, 30 ], "bg": 16 }, + { "id": "unconnected", "fg": 31, "bg": 16 } + ], + "rotates": false + } + ] + } + ] + } +] diff --git a/data/mods/mapspecials_demo/missile_silo/silo_utlcb_03.json b/data/mods/mapspecials_demo/missile_silo/silo_utlcb_03.json index 139a32a6e42fe..f616597b6a0a6 100644 --- a/data/mods/mapspecials_demo/missile_silo/silo_utlcb_03.json +++ b/data/mods/mapspecials_demo/missile_silo/silo_utlcb_03.json @@ -35,7 +35,7 @@ ], "rotation": 0, "palettes": [ "missile_silo" ], - "monster": { "z": { "monster": "mon_turret" } } + "monster": { "z": { "monster": "mon_turret_rifle" } } } } ] diff --git a/data/mods/mapspecials_demo/missile_silo/silo_utrc_02.json b/data/mods/mapspecials_demo/missile_silo/silo_utrc_02.json index b87b4293c16b5..6f0958fb58140 100644 --- a/data/mods/mapspecials_demo/missile_silo/silo_utrc_02.json +++ b/data/mods/mapspecials_demo/missile_silo/silo_utrc_02.json @@ -35,7 +35,7 @@ ], "rotation": 1, "palettes": [ "missile_silo" ], - "monster": { "z": { "monster": "mon_turret" } } + "monster": { "z": { "monster": "mon_turret_rifle" } } } } ] diff --git a/data/mods/more_classes_scenarios/cs_classes.json b/data/mods/more_classes_scenarios/cs_classes.json index 640d78649c13e..37e9a15a3a98b 100644 --- a/data/mods/more_classes_scenarios/cs_classes.json +++ b/data/mods/more_classes_scenarios/cs_classes.json @@ -147,14 +147,16 @@ "roadmap", "restaurantmap", "shavingkit", - "mess_kit", "aluminum_foil", "can_chowder", "apple_cider", "fruit_leather", "suitcase_m" ], - "entries": [ { "group": "charged_cell_phone" } ] + "entries": [ + { "group": "charged_cell_phone" }, + { "item": "medium_battery_cell", "ammo-item": "battery", "charges": 500, "container-item": "mess_kit" } + ] }, "male": [ "boxer_shorts" ], "female": [ "bra", "panties" ] @@ -305,43 +307,6 @@ "female": [ "panties" ] } }, - { - "type": "profession", - "ident": "bio_gangster", - "name": "Bionic Gangster", - "description": "You were the boss' favorite, their protege; they always counted on you to get the toughest jobs done. Seeing your potential, they invested in \"basic\" augments and the best gear on the market to better aid you in your job. After enjoying some period of freedom to do as you wanted, now you find yourself needing those skills to survive. ", - "points": 8, - "CBMs": [ - "bio_targeting", - "bio_shock", - "bio_carbon", - "bio_adrenaline", - "bio_night_vision", - "bio_face_mask", - "bio_metabolics", - "bio_power_storage_mkII" - ], - "skills": [ - { "level": 1, "name": "melee" }, - { "level": 1, "name": "unarmed" }, - { "level": 1, "name": "stabbing" }, - { "level": 1, "name": "gun" }, - { "level": 1, "name": "pistol" }, - { "level": 1, "name": "driving" } - ], - "items": { - "both": { - "items": [ "suit", "bowhat", "socks", "dress_shoes", "knit_scarf", "cig", "switchblade", "mag_porn", "sunglasses" ], - "entries": [ - { "item": "glock_19", "ammo-item": "9mm", "container-item": "sholster", "charges": 15 }, - { "item": "glockmag", "ammo-item": "9mm", "charges": 15 }, - { "item": "ref_lighter", "charges": 100 } - ] - }, - "male": [ "boxer_shorts" ], - "female": [ "bra", "panties" ] - } - }, { "type": "profession", "ident": "waken", @@ -349,7 +314,7 @@ "description": "You were awoken in the middle of the night by a noise. Armed only with a flashlight you went to investigate, now you face the cataclysm.", "points": 0, "items": { - "both": [ "slippers", "flashlight" ], + "both": { "items": [ "slippers" ], "entries": [ { "group": "charged_flashlight" } ] }, "male": [ "boxer_shorts", "socks", "house_coat" ], "female": [ "bra", "panties", "stockings", "gown" ] } @@ -386,18 +351,13 @@ "points": 4, "skills": [ { "level": 1, "name": "mechanics" } ], "items": { - "both": [ - "socks", - "wearable_light", - "goggles_welding", - "jumpsuit", - "gloves_work", - "boots_steel", - "tool_belt", - "apron_leather", - "oxy_torch", - "tinyweldtank" - ], + "both": { + "items": [ "socks", "goggles_welding", "jumpsuit", "gloves_work", "boots_steel", "tool_belt", "apron_leather" ], + "entries": [ + { "item": "tinyweldtank", "ammo-item": "oxyacetylene", "charges": 60, "container-item": "oxy_torch" }, + { "item": "light_battery_cell", "ammo-item": "battery", "charges": 100, "container-item": "wearable_light" } + ] + }, "male": [ "boxer_shorts" ], "female": [ "bra", "boxer_shorts" ] } diff --git a/data/mods/more_classes_scenarios/cs_scenarios.json b/data/mods/more_classes_scenarios/cs_scenarios.json index d63ef7e41d5f7..40c76b4b43a6f 100644 --- a/data/mods/more_classes_scenarios/cs_scenarios.json +++ b/data/mods/more_classes_scenarios/cs_scenarios.json @@ -1,27 +1,4 @@ [ - { - "type": "scenario", - "name": "Bunker Evacuee", - "description": "You had connections, or intel somehow...and because of it, you found this LMOE Shelter. It's summer now, and you somehow survived. Now things get a little bit easier.", - "flags": [ "SUR_START", "SUM_START" ], - "ident": "bunker", - "points": 2, - "start_name": "LMOE Shelter", - "allowed_locs": [ "lmoe" ], - "professions": [ - "senior", - "hacker", - "lawyer", - "labtech", - "bionic_spy", - "soldier", - "national_guard", - "specops", - "bio_soldier", - "bio_sniper", - "bio_specops" - ] - }, { "type": "scenario", "ident": "fema_help", @@ -56,17 +33,6 @@ "start_name": "Mansion", "flags": [ "SUR_START" ] }, - { - "type": "scenario", - "ident": "last_crime", - "name": "The Last Gig", - "points": -6, - "description": "You were on your way to another routine job. It might have been a target to kill, an item to steal or intel to gather. Whatever it was doesn't matter anymore; you did your best to avoid the horde and when you arrived, the place was surrounded. Not by cops, as you might have expected, but by the dead. Worse, you got a cut somewhere along the way and it's looking infected.", - "allowed_locs": [ "house", "bank", "pawn", "s_gun", "s_gas_s" ], - "professions": [ "convict", "scoundrel", "gangster", "burglar", "bionic_thief", "razorgirl", "bionic_hitman", "bio_gangster" ], - "start_name": "Intended Crime Scene", - "flags": [ "SUR_START", "INFECTED" ] - }, { "type": "scenario", "ident": "summer_advanced_start", @@ -84,24 +50,24 @@ "ident": "cyberpunk", "copy-from": "cyberpunk", "add_professions": true, - "extend": { "professions": [ "bio_gangster", "wasteland_cyborg" ] } + "extend": { "professions": [ "bio_gangster", "bionic_hitman" ] } + }, + { + "type": "scenario", + "ident": "missed", + "copy-from": "missed", + "extend": { "allowed_locs": [ "s_electronics_s", "s_clothes_s", "bank", "pawn", "s_gun", "s_gas_s" ] } }, { "type": "scenario", "ident": "infected", "copy-from": "infected", - "extend": { "allowed_locs": [ "s_electronics_s", "s_clothes_s" ] } + "extend": { "allowed_locs": [ "s_electronics_s", "s_clothes_s", "bank", "pawn", "s_gun", "s_gas_s" ] } }, { "type": "scenario", "ident": "fire", "copy-from": "fire", - "extend": { "allowed_locs": [ "s_electronics_s", "s_clothes_s" ] } - }, - { - "type": "scenario", - "ident": "evacuee", - "copy-from": "evacuee", - "extend": { "allowed_locs": [ "s_electronics_s", "s_clothes_s" ] } + "extend": { "allowed_locs": [ "s_electronics_s", "s_clothes_s", "bank", "pawn", "s_gun", "s_gas_s" ] } } ] diff --git a/data/mods/realguns/gun.json b/data/mods/realguns/gun.json index e88ac0cbd8698..fd3e5cefd9e2a 100644 --- a/data/mods/realguns/gun.json +++ b/data/mods/realguns/gun.json @@ -16,6 +16,7 @@ "ammo": "38", "dispersion": 360, "durability": 8, + "blackpowder_tolerance": 56, "clip_size": 6, "magazines": [ [ "38", [ "38_speedloader" ] ] ] }, @@ -47,26 +48,6 @@ "valid_mod_locations": [ [ "accessories", 2 ], [ "muzzle", 1 ], [ "sling", 1 ], [ "underbarrel", 1 ] ], "flags": [ "RELOAD_ONE", "RELOAD_EJECT", "NEEDS_UNFOLD", "COLLAPSIBLE_STOCK" ] }, - { - "id": "colt_saa", - "copy-from": "pistol_revolver", - "type": "GUN", - "name": "Colt Single Action Army", - "name_plural": "Colt Single Action Army", - "//": "Can be vaguely either an original or a reproduction, price based off of MSRP of Uberti Single-Action Cattleman.", - "description": "Also known as the Peacemaker and M1873, the Colt Single Action Army is one of the first revolvers to use a modern self-contained cartridge. Made famous by westerns, modern reproductions are still made for Cowboy Action Shooting, and some deem them the greatest gun ever made.", - "weight": 1050, - "volume": 3, - "price": 47900, - "to_hit": -1, - "bashing": 8, - "material": [ "steel", "wood" ], - "ammo": "45colt", - "dispersion": 360, - "durability": 8, - "clip_size": 6, - "proportional": { "reload": 1.5 } - }, { "id": "colt_lightning", "copy-from": "rifle_manual", diff --git a/data/mods/realguns/item_groups.json b/data/mods/realguns/item_groups.json index 81d329f9951f5..f7748be977160 100644 --- a/data/mods/realguns/item_groups.json +++ b/data/mods/realguns/item_groups.json @@ -17,7 +17,7 @@ { "id": "guns_pistol_rare", "type": "item_group", - "items": [ [ "colt_saa", 30 ], [ "bond_410", 20 ] ] + "items": [ [ "bond_410", 20 ] ] }, { "id": "guns_pistol_obscure", diff --git a/data/raw/keybindings.json b/data/raw/keybindings.json index 317c92cbd6453..24230be36a0b3 100644 --- a/data/raw/keybindings.json +++ b/data/raw/keybindings.json @@ -186,6 +186,18 @@ "name": "Page down", "bindings": [ { "input_method": "keyboard", "key": "NPAGE" } ] }, + { + "type": "keybinding", + "id": "SCROLL_UP", + "name": "Scroll up", + "bindings": [ { "input_method": "mouse", "key": "SCROLL_UP" } ] + }, + { + "type": "keybinding", + "id": "SCROLL_DOWN", + "name": "Scroll down", + "bindings": [ { "input_method": "mouse", "key": "SCROLL_DOWN" } ] + }, { "type": "keybinding", "id": "SELECT_ALL", @@ -251,6 +263,27 @@ { "input_method": "gamepad", "key": "JOY_RIGHT" } ] }, + { + "type": "keybinding", + "id": "ENABLE_MAPEXTRA_NOTE", + "category": "AUTO_NOTES", + "name": "Enable auto note for map extra", + "bindings": [ { "input_method": "keyboard", "key": "e" }, { "input_method": "keyboard", "key": "E" } ] + }, + { + "type": "keybinding", + "id": "SWITCH_AUTO_NOTE_OPTION", + "category": "AUTO_NOTES", + "name": "Toggle auto notes option", + "bindings": [ { "input_method": "keyboard", "key": "s" }, { "input_method": "keyboard", "key": "S" } ] + }, + { + "type": "keybinding", + "id": "DISABLE_MAPEXTRA_NOTE", + "category": "AUTO_NOTES", + "name": "Disable auto note for map extra", + "bindings": [ { "input_method": "keyboard", "key": "d" }, { "input_method": "keyboard", "key": "D" } ] + }, { "type": "keybinding", "id": "ADD_RULE", @@ -1221,16 +1254,13 @@ { "type": "keybinding", "id": "CONFIRM_QUIT", - "category": "EDITMAP_TERRAIN", + "category": "EDITMAP_FEATURE", "name": "Confirm & quit", - "bindings": [ { "input_method": "keyboard", "key": "g" } ] - }, - { - "type": "keybinding", - "id": "CONFIRM_QUIT", - "category": "EDITMAP_TRAPS", - "name": "Confirm & quit", - "bindings": [ { "input_method": "keyboard", "key": "t" } ] + "bindings": [ + { "input_method": "keyboard", "key": "e" }, + { "input_method": "keyboard", "key": "u" }, + { "input_method": "keyboard", "key": "t" } + ] }, { "type": "keybinding", @@ -1243,7 +1273,7 @@ "type": "keybinding", "id": "START", "category": "EDITMAP_SHAPE", - "name": "Select shape", + "name": "To start", "bindings": [ { "input_method": "keyboard", "key": "z" } ] }, { @@ -1283,8 +1313,15 @@ "type": "keybinding", "id": "EDIT_TERRAIN", "category": "EDITMAP", - "name": "Edit terrain / furniture", - "bindings": [ { "input_method": "keyboard", "key": "g" } ] + "name": "Edit terrain", + "bindings": [ { "input_method": "keyboard", "key": "e" } ] + }, + { + "type": "keybinding", + "id": "EDIT_FURNITURE", + "category": "EDITMAP", + "name": "Edit furniture", + "bindings": [ { "input_method": "keyboard", "key": "u" } ] }, { "type": "keybinding", @@ -2062,6 +2099,12 @@ "category": "DEFAULTMODE", "id": "open_autopickup" }, + { + "type": "keybinding", + "name": "Autonotes manager", + "category": "DEFAULTMODE", + "id": "open_autonotes" + }, { "type": "keybinding", "name": "Safe Mode manager", @@ -2728,6 +2771,38 @@ "name": "Ignore further distractions and finish", "bindings": [ { "input_method": "keyboard", "key": "I" }, { "input_method": "keyboard", "key": "i" } ] }, + { + "type": "keybinding", + "id": "YES", + "category": "YES_NO_ALWAYS_NEVER", + "name": "Yes", + "bindings": [ { "input_method": "keyboard", "key": [ "Y" ] }, { "input_method": "keyboard", "key": [ "y" ] } ] + }, + { + "type": "keybinding", + "id": "NO", + "category": "YES_NO_ALWAYS_NEVER", + "name": "No", + "bindings": [ + { "input_method": "keyboard", "key": [ "N" ] }, + { "input_method": "keyboard", "key": [ "n" ] }, + { "input_method": "keyboard", "key": [ "ESC" ] } + ] + }, + { + "type": "keybinding", + "id": "ALWAYS", + "category": "YES_NO_ALWAYS_NEVER", + "name": "Always", + "bindings": [ { "input_method": "keyboard", "key": [ "A" ] }, { "input_method": "keyboard", "key": [ "a" ] } ] + }, + { + "type": "keybinding", + "id": "NEVER", + "category": "YES_NO_ALWAYS_NEVER", + "name": "Never", + "bindings": [ { "input_method": "keyboard", "key": [ "E" ] }, { "input_method": "keyboard", "key": [ "e" ] } ] + }, { "type": "keybinding", "id": "QUIT", diff --git a/data/xdg/org.Cataclysm.DDA.Tiles.desktop b/data/xdg/org.Cataclysm.DDA.Tiles.desktop deleted file mode 100644 index 61c8ecdfac9f5..0000000000000 --- a/data/xdg/org.Cataclysm.DDA.Tiles.desktop +++ /dev/null @@ -1,10 +0,0 @@ -[Desktop Entry] -Name=Cataclysm: Dark Days Ahead - Tiles -GenericName=Post-apocalyptic roguelike -Comment=A turn-based survival game set in a post-apocalyptic world. -Icon=org.Cataclysm.DDA.Tiles -Type=Application -Exec=cataclysm-launcher -Terminal=false -Categories=Game;RolePlaying; -Keywords=zombie;rogue;roguelike;tiles;dda;cdda; diff --git a/data/xdg/org.Cataclysm.DDA.desktop b/data/xdg/org.Cataclysm.DDA.desktop deleted file mode 100644 index 420d62563620a..0000000000000 --- a/data/xdg/org.Cataclysm.DDA.desktop +++ /dev/null @@ -1,10 +0,0 @@ -[Desktop Entry] -Name=Cataclysm: Dark Days Ahead -GenericName=Post-apocalyptic roguelike -Comment=A turn-based survival game set in a post-apocalyptic world. -Icon=org.Cataclysm.DDA -Type=Application -Exec=cataclysm-launcher -Terminal=true -Categories=Game;RolePlaying; -Keywords=zombie;rogue;roguelike;tiles;dda;cdda; diff --git a/doc/COMPILER_SUPPORT.md b/doc/COMPILING/COMPILER_SUPPORT.md similarity index 88% rename from doc/COMPILER_SUPPORT.md rename to doc/COMPILING/COMPILER_SUPPORT.md index 3597d77320a7a..f2b78d0efee6a 100644 --- a/doc/COMPILER_SUPPORT.md +++ b/doc/COMPILING/COMPILER_SUPPORT.md @@ -31,7 +31,7 @@ currently used both in the tests and for the Windows release binaries. ## MSYS2 -MSYS2 is [a way to build the project](../COMPILING-MSYS.md) on Windows. It +MSYS2 is [a way to build the project](COMPILING-MSYS.md) on Windows. It currently offers gcc at versions 7 or higher. MSYS also provides clang. We don't currently support using clang here, but @@ -39,4 +39,4 @@ work to that end is welcome. ## Visual Studio -We also support [Visual Studio](../COMPILING-VS-VCPKG.md) 2015 Update 3 and above. +We also support [Visual Studio](COMPILING-VS-VCPKG.md) 2015 Update 3 and above. diff --git a/COMPILING-CMAKE.md b/doc/COMPILING/COMPILING-CMAKE.md similarity index 99% rename from COMPILING-CMAKE.md rename to doc/COMPILING/COMPILING-CMAKE.md index 5c23c529dfa43..f4d2f7b0d69c8 100644 --- a/COMPILING-CMAKE.md +++ b/doc/COMPILING/COMPILING-CMAKE.md @@ -3,7 +3,7 @@ **WARNING**: CMake build is **NOT** official and should be used for *dev purposes ONLY*. For official way to build CataclysmDDA See: - * [COMPILING.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/COMPILING.md) + * [COMPILING.md](COMPILING.md) #Contents diff --git a/COMPILING-CYGWIN.md b/doc/COMPILING/COMPILING-CYGWIN.md similarity index 100% rename from COMPILING-CYGWIN.md rename to doc/COMPILING/COMPILING-CYGWIN.md diff --git a/doc/COMPILING/COMPILING-FLATPAK.md b/doc/COMPILING/COMPILING-FLATPAK.md new file mode 100644 index 0000000000000..3a1320ab899b7 --- /dev/null +++ b/doc/COMPILING/COMPILING-FLATPAK.md @@ -0,0 +1,9 @@ +The supplied flatpak manifest org.cataclysmdda.CataclysmDDA.json will +download and build the latest release of Cataclysm-DDA. An app built in +this way should be available on flathub: + + https://flathub.org/apps/detail/org.cataclysmdda.CataclysmDDA + +Check the flatpak documentation at http://docs.flatpak.org for +information on how to customise the manifest, build your own copies of +the app, and install or distribute them. diff --git a/COMPILING-MSYS.md b/doc/COMPILING/COMPILING-MSYS.md similarity index 100% rename from COMPILING-MSYS.md rename to doc/COMPILING/COMPILING-MSYS.md diff --git a/COMPILING-VS-VCPKG.md b/doc/COMPILING/COMPILING-VS-VCPKG.md similarity index 100% rename from COMPILING-VS-VCPKG.md rename to doc/COMPILING/COMPILING-VS-VCPKG.md diff --git a/COMPILING.md b/doc/COMPILING/COMPILING.md similarity index 96% rename from COMPILING.md rename to doc/COMPILING/COMPILING.md index 59f17a6ac5a0e..bc08be44edafb 100644 --- a/COMPILING.md +++ b/doc/COMPILING/COMPILING.md @@ -19,6 +19,7 @@ * [Building with Visual Studio](#building-with-visual-studio) * [Building with MSYS2](#building-with-msys2) * [Building with CYGWIN](#building-with-cygwin) + * [Building with Clang and MinGW64](#building-with-clang-and-mingw64) * [BSDs](#bsds) # General Linux Guide @@ -258,7 +259,7 @@ Your directory tree should look like: Populated with respective frameworks, dylibs and headers. Tested lib versions are libintl.8.dylib for gettext, libncurses.5.4.dylib for ncurses. These libs were obtained from `homebrew` binary distribution at OS X 10.11 -Frameworks were obtained from SDL official website as described in the next [section](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/COMPILING.md#sdl) +Frameworks were obtained from SDL official website as described in the next [section](#sdl) ### Building (SDL) @@ -574,22 +575,26 @@ Open Terminal's preferences, turn on "Use bright colors for bold text" in "Prefe ## Building with Visual Studio -See [COMPILING-VS-VCPKG.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/COMPILING-VS-VCPKG.md) for instructions on how to set up and use a build environment using Visual Studio on windows. +See [COMPILING-VS-VCPKG.md](COMPILING-VS-VCPKG.md) for instructions on how to set up and use a build environment using Visual Studio on windows. This is probably the easiest solution for someone used to working with Visual Studio and similar IDEs. ## Building with MSYS2 -See [COMPILING-MSYS.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/COMPILING-MSYS.md) for instructions on how to set up and use a build environment using MSYS2 on windows. +See [COMPILING-MSYS.md](COMPILING-MSYS.md) for instructions on how to set up and use a build environment using MSYS2 on windows. MSYS2 strikes a balance between a native Windows application and a UNIX-like environment. There's some command-line tools that our project uses (notably our JSON linter) that are harder to use without a command-line environment such as what MSYS2 or CYGWIN provide. ## Building with CYGWIN -See [COMPILING-CYGWIN.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/COMPILING-CYGWIN.md) for instructions on how to set up and use a build environment using CYGWIN on windows. +See [COMPILING-CYGWIN.md](COMPILING-CYGWIN.md) for instructions on how to set up and use a build environment using CYGWIN on windows. CYGWIN attempts to more fully emulate a POSIX environment, to be "more unix" than MSYS2. It is a little less modern in some respects, and lacks the convenience of the MSYS2 package manager. +## Building with Clang and MinGW64 + +Clang by default uses MSVC on Windows, but also supports the MinGW64 library. Simply replace `CLANG=1` with `"CLANG=clang++ -target x86_64-pc-windows-gnu -pthread"` in your batch script, and make sure MinGW64 is in your path. You may also need to apply [a patch](https://sourceforge.net/p/mingw-w64/mailman/message/36386405/) to `float.h` of MinGW64 for the unit test to compile. + # BSDs There are reports of CDDA building fine on recent OpenBSD and FreeBSD machines (with appropriately recent compilers), and there is some work being done on making the `Makefile` "just work", however we're far from that and BSDs support is mostly based on user contributions. Your mileage may vary. So far essentially all testing has been on amd64, but there is no (known) reason that other architectures shouldn't work, in principle. diff --git a/doc/JSON_FLAGS.md b/doc/JSON_FLAGS.md index 55b1ea400b60d..93b399e9db6e0 100644 --- a/doc/JSON_FLAGS.md +++ b/doc/JSON_FLAGS.md @@ -631,7 +631,8 @@ List of known flags, used in both `terrain.json` and `furniture.json`. ### Flags - ```ANESTHESIA``` ... Item is considered anesthesia for the purpose of installing or uninstalling bionics. -- ```BIONIC_NPC_USABLE``` Safe CBMs that NPCs can use without extensive NPC rewrites to utilize toggle CBMs. +- ```BIONIC_NPC_USABLE``` ... Safe CBMs that NPCs can use without extensive NPC rewrites to utilize toggle CBMs. +- ```CORPSE``` ... Flag used to spawn various human corpses during the mapgen. - ```DANGEROUS``` ... NPCs will not accept this item. Explosion iuse actor implies this flag. Implies "NPC_THROW_NOW". - ```DURABLE_MELEE``` ... Item is made to hit stuff and it does it well, so it's considered to be a lot tougher than other weapons made of the same materials. - ```FAKE_MILL``` ... Item is a fake item, to denote a partially milled product by @ref Item::process_fake_mill, where conditions for its removal are set. @@ -646,7 +647,7 @@ List of known flags, used in both `terrain.json` and `furniture.json`. - ```NO_PACKED``` ... This item is not protected against contamination and won't stay sterile. Only applies to CBMs. - ```NO_PICKUP``` ... Character can not pickup anything while wielding this item (e.g. bionic claws). - ```NO_REPAIR``` ... Prevents repairing of this item even if otherwise suitable tools exist. -- ```NO_SALVAGE``` Item cannot be broken down through a salvage process. Best used when something should not be able to be broken down (i.e. base components like leather patches). +- ```NO_SALVAGE``` ... Item cannot be broken down through a salvage process. Best used when something should not be able to be broken down (i.e. base components like leather patches). - ```NO_STERILE``` ... This item is not sterile. Only applies to CBMs. - ```NPC_ACTIVATE``` ... NPCs can activate this item as an alternative attack. Currently by throwing it right after activation. Implied by "BOMB". - ```NPC_ALT_ATTACK``` ... Shouldn't be set directly. Implied by "NPC_ACTIVATE" and "NPC_THROWN". @@ -664,7 +665,7 @@ List of known flags, used in both `terrain.json` and `furniture.json`. - ```TINDER``` ... This item can be used as tinder for lighting a fire with a REQUIRES_TINDER flagged firestarter. - ```TRADER_AVOID``` ... NPCs will not start with this item. Use this for active items (e.g. flashlight (on)), dangerous items (e.g. active bomb), fake item or unusual items (e.g. unique quest item). - ```UNBREAKABLE_MELEE``` ... Does never get damaged when used as melee weapon. -- ```UNRECOVERABLE``` Cannot be recovered from a disassembly. +- ```UNRECOVERABLE``` ... Cannot be recovered from a disassembly. ## Guns @@ -1186,11 +1187,12 @@ Melee flags are fully compatible with tool flags, and vice versa. - ```CABLE_SPOOL``` This item is a cable spool and must be processed as such. It has an internal "state" variable which may be in the states "attach_first" or "pay_out_cable" -- in the latter case, set its charges to `max_charges - dist(here, point(vars["source_x"], vars["source_y"]))`. If this results in 0 or a negative number, set its state back to "attach_first". - ```CHARGEDIM``` If illuminated, light intensity fades with charge, starting at 20% charge left. - ```DIG_TOOL``` If wielded, digs thorough terrain like rock and walls, as player walks into them. If item also has ```POWERED``` flag, then it digs faster, but uses up the item's ammo as if activating it. -- ```FIRESTARTER``` Item will start fire. -- ```FIRE``` Counts as a fire for crafting purposes. +- ```FIRESTARTER``` Item will start fire with some difficulty. +- ```FIRE``` Item will start a fire immediately. - ```FISH_GOOD``` When used for fishing, it's a good tool (requires that the matching use_action has been set). - ```FISH_POOR``` When used for fishing, it's a poor tool (requires that the matching use_action has been set). - ```HAS_RECIPE``` Used by the E-Ink tablet to indicates it's currently showing a recipe. +- ```IS_UPS``` Item is Unified Power Supply. Used in active item processing - ```LIGHT_[X]``` Illuminates the area with light intensity `[X]` where `[X]` is an intensity value. (e.x. `LIGHT_4` or `LIGHT_100`). - ```MC_MOBILE```, ```MC_RANDOM_STUFF```, ```MC_SCIENCE_STUFF```, ```MC_USED```, ```MC_HAS_DATA``` Memory card related flags, see `iuse.cpp` - ```NO_DROP``` Item should never exist on map tile as a discrete item (must be contained by another item) diff --git a/doc/MISSIONS_JSON.md b/doc/MISSIONS_JSON.md index ca9351731498e..0bbfd5f79191f 100644 --- a/doc/MISSIONS_JSON.md +++ b/doc/MISSIONS_JSON.md @@ -7,6 +7,7 @@ NPCs can assign missions to the player. There is a fairly regular structure for "id": "MISSION_GET_BLACK_BOX_TRANSCRIPT", "type": "mission_definition", "name": "Retrieve Black Box Transcript", + "description": "Decrypt the contents of the black box using a terminal from a nearby lab.", "goal": "MGOAL_FIND_ITEM", "difficulty": 2, "value": 150000, @@ -36,11 +37,28 @@ Must always be there and must always be "mission_definition". ### id The mission id is required, but for new missions, it can be arbitrary. Convention is to start -it with "MISSION" and to use a fairly desriptive name. +it with "MISSION" and to use a fairly descriptive name. ### name -The name is also required, and the name is what is displayed in the 'm'issions menu, so please -make it descriptive. +The name is also required, and is displayed to the user in the 'm'issions menu. + +### description +Not required, but it's strongly recommended that you summarize all relevant info for the mission. +You may refer to mission end effects of the "u_buy_item" type, as long as they do not come at a +cost to the player. See the example below: +```JSON + "id": "MISSION_EXAMPLE_TOKENS", + "type": "mission_definition", + "name": "Murder Money", + "description": "Whack the target in exchange for c-notes and cigarettes.", + "goal": "MGOAL_ASSASSINATE", + "end": { + "effect": [ + { "u_buy_item": "FMCNote", "count": 999 }, + { "u_buy_item": "cig", "count": 666 } ] + } +``` +This system may be expanded in the future to allow referring to other mission parameters and effects. ### goal Must be included, and must be one of these strings: diff --git a/doc/NPCs.md b/doc/NPCs.md index b0192abb88cd2..5dad194d5ec17 100644 --- a/doc/NPCs.md +++ b/doc/NPCs.md @@ -428,6 +428,7 @@ Effect | Description `u_lose_trait: trait_string`
`npc_lose_trait: trait_string` | Your character or the NPC will lose the trait. `u_add_var, npc_add_var`: `var_name, type: type_str`, `context: context_str`, `value: value_str` | Your character or the NPC will store `value_str` as a variable that can be later retrieved by `u_has_var` or `npc_has_var`. `npc_add_var` can be used to store arbitary local variables, and `u_add_var` can be used to store arbitrary "global" variables, and should be used in preference to setting effects. `u_lose_var`, `npc_lose_var`: `var_name`, `type: type_str`, `context: context_str` | Your character or the NPC will clear any stored variable that has the same `var_name`, `type_str`, and `context_str`. +`u_adjust_var, npc_adjust_var`: `var_name, type: type_str`, `context: context_str`, `adjustment: adjustment_num` | Your character or the NPC will adjust the stored variable by `adjustment_num`. `barber_hair` | Opens a menu allowing the player to choose a new hair style. `barber_beard` | Opens a menu allowing the player to choose a new beard style. `u_learn_recipe: recipe_string` | Your character will learn and memorize the recipe `recipe_string`. @@ -552,6 +553,7 @@ Condition | Type | Description `"u_has_trait_flag"`
`"npc_has_trait_flag"` | string | `true` if the player character or NPC has any traits with the specific trait flag. More robust versions of `u_has_any_trait` and `npc_has_any_trait`. The special trait flag `"MUTATION_THRESHOLD"` checks to see if the player or NPC has crossed a mutation threshold. `"u_has_any_trait"`
`"npc_has_any_trait"` | array | `true` if the player character or NPC has any trait or mutation in the array. Used to check multiple specific traits. `"u_has_var"`, `"npc_has_var"` | string | `"type": type_str`, `"context": context_str`, and `"value": value_str` are required fields in the same dictionary as `"u_has_var"` or `"npc_has_var"`.
`true` is the player character or NPC has a variable set by `"u_add_var"` or `"npc_add_var"` with the string, `type_str`, `context_str`, and `value_str`. +`"u_compare_var"`, `"npc_compare_var"` | dictionary | `"type": type_str`, `"context": context_str`, `"op": op_str`, `"value": value_num` are required fields, referencing a var as in `"u_add_var"` or `"npc_add_var"`.
`true` if the player character or NPC has a stored variable that is true for the provided operator `op_str` (one of `==`, `!=`, `<`, `>`, `<=`, `>=`) and value. `"u_has_strength"`
`"npc_has_strength"` | int | `true` if the player character's or NPC's strength is at least the value of `u_has_strength` or `npc_has_strength`. `"u_has_dexterity"`
`"npc_has_dexterity"` | int | `true` if the player character's or NPC's dexterity is at least the value of `u_has_dexterity` or `npc_has_dexterity`. `"u_has_intelligence"`
`"npc_has_intelligence"` | int | `true` if the player character's or NPC's intelligence is at least the value of `u_has_intelligence` or `npc_has_intelligence`. @@ -587,6 +589,7 @@ Condition | Type | Description `"mission_goal"` | string | `true` if the NPC's current mission has the same goal as `mission_goal`. `"mission_complete"` | simple string | `true` if the player has completed the NPC's current mission. `"mission_incomplete"` | simple string | `true` if the player hasn't completed the NPC's current mission. +`"mission_has_generic_rewards"` | simple string | `true` if the NPC's current mission is flagged as having generic rewards. `"npc_service"` | int | `true` if the NPC does not have the `"currently_busy"` effect and the player character has at least `npc_service` cash available. Useful to check if the player character can hire an NPC to perform a task that would take time to complete. Functionally, this is identical to `"and": [ { "not": { "npc_has_effect": "currently_busy" } }, { "u_has_cash": service_cost } ]` `"npc_allies"` | int | `true` if the player character has at least `npc_allies` number of NPC allies. `"npc_following"` | simple string | `true` if the NPC is following the player character. diff --git a/doc/TRANSLATING.md b/doc/TRANSLATING.md index bd4304ec581c0..c9dda32f65926 100644 --- a/doc/TRANSLATING.md +++ b/doc/TRANSLATING.md @@ -255,6 +255,11 @@ new syntax "name" would be a `dict`, which may break unmigrated script. | Terrain bash sound descriptions | Trap-vehicle collision sound descriptions | Vehicle part names/descriptions +| Skill display type names +| NPC dialogue u_buy_monster unique names +| Spell messages and monster spell messages +| Martial art names and descriptions +| Mission names and descriptions ### Recommendations diff --git a/gfx/MSX++DeadPeopleEdition/13_tiles_kawaiimaidmod_64x48-22340-22364.png b/gfx/MSX++DeadPeopleEdition/13_tiles_kawaiimaidmod_64x48-22340-22364.png index 797623f0d5329..7be308449ebfc 100644 Binary files a/gfx/MSX++DeadPeopleEdition/13_tiles_kawaiimaidmod_64x48-22340-22364.png and b/gfx/MSX++DeadPeopleEdition/13_tiles_kawaiimaidmod_64x48-22340-22364.png differ diff --git a/gfx/MSX++DeadPeopleEdition/14_tiles2_32x32_22365-27564.png b/gfx/MSX++DeadPeopleEdition/14_tiles2_32x32_22365-27564.png index fbf8952cffa79..1acab05187317 100644 Binary files a/gfx/MSX++DeadPeopleEdition/14_tiles2_32x32_22365-27564.png and b/gfx/MSX++DeadPeopleEdition/14_tiles2_32x32_22365-27564.png differ diff --git a/gfx/MSX++DeadPeopleEdition/15_tiles-connected_variants_32x32_27565-32764.png b/gfx/MSX++DeadPeopleEdition/15_tiles-connected_variants_32x32_27565-32764.png index bfa813599812d..a84bb10f72c81 100644 Binary files a/gfx/MSX++DeadPeopleEdition/15_tiles-connected_variants_32x32_27565-32764.png and b/gfx/MSX++DeadPeopleEdition/15_tiles-connected_variants_32x32_27565-32764.png differ diff --git a/gfx/MSX++DeadPeopleEdition/16_tiles_trees_64x80_32765-33164.png b/gfx/MSX++DeadPeopleEdition/16_tiles_trees_64x80_32765-33164.png index b7fe91667fcff..050354d5b3ed5 100644 Binary files a/gfx/MSX++DeadPeopleEdition/16_tiles_trees_64x80_32765-33164.png and b/gfx/MSX++DeadPeopleEdition/16_tiles_trees_64x80_32765-33164.png differ diff --git a/gfx/MSX++DeadPeopleEdition/17_top_hats_32x32-33165-35756.png b/gfx/MSX++DeadPeopleEdition/17_top_hats_32x32-33165-35756.png index d93b81e9c7ae4..80ff8e57aeb74 100644 Binary files a/gfx/MSX++DeadPeopleEdition/17_top_hats_32x32-33165-35756.png and b/gfx/MSX++DeadPeopleEdition/17_top_hats_32x32-33165-35756.png differ diff --git a/gfx/MSX++DeadPeopleEdition/18_big_things_64x80_35757-36076.png b/gfx/MSX++DeadPeopleEdition/18_big_things_64x80_35757-36076.png new file mode 100644 index 0000000000000..47d0969e13e74 Binary files /dev/null and b/gfx/MSX++DeadPeopleEdition/18_big_things_64x80_35757-36076.png differ diff --git a/gfx/MSX++DeadPeopleEdition/18_big_things_64x80_35757.png b/gfx/MSX++DeadPeopleEdition/18_big_things_64x80_35757.png deleted file mode 100644 index 94881113d9cee..0000000000000 Binary files a/gfx/MSX++DeadPeopleEdition/18_big_things_64x80_35757.png and /dev/null differ diff --git a/gfx/MSX++DeadPeopleEdition/1_tiles_32x32_0-5199.png b/gfx/MSX++DeadPeopleEdition/1_tiles_32x32_0-5199.png index a2aa4cef5505d..c6b7848ef02a0 100644 Binary files a/gfx/MSX++DeadPeopleEdition/1_tiles_32x32_0-5199.png and b/gfx/MSX++DeadPeopleEdition/1_tiles_32x32_0-5199.png differ diff --git a/gfx/MSX++DeadPeopleEdition/3_tree_64x80_5392-5471.png b/gfx/MSX++DeadPeopleEdition/3_tree_64x80_5392-5471.png index aeb21cbb1e9c3..9f21701e93849 100644 Binary files a/gfx/MSX++DeadPeopleEdition/3_tree_64x80_5392-5471.png and b/gfx/MSX++DeadPeopleEdition/3_tree_64x80_5392-5471.png differ diff --git a/gfx/MSX++DeadPeopleEdition/5_tiles_character_customization_32x32_9568-11567.png b/gfx/MSX++DeadPeopleEdition/5_tiles_character_customization_32x32_9568-11567.png index 773e0cb0f1456..154f1d603ecbe 100644 Binary files a/gfx/MSX++DeadPeopleEdition/5_tiles_character_customization_32x32_9568-11567.png and b/gfx/MSX++DeadPeopleEdition/5_tiles_character_customization_32x32_9568-11567.png differ diff --git a/gfx/MSX++DeadPeopleEdition/7_expan2_32x32_11604-11651.png b/gfx/MSX++DeadPeopleEdition/7_expan2_32x32_11604-11651.png index b397c3bc3ae2f..eaa72804195e2 100644 Binary files a/gfx/MSX++DeadPeopleEdition/7_expan2_32x32_11604-11651.png and b/gfx/MSX++DeadPeopleEdition/7_expan2_32x32_11604-11651.png differ diff --git a/gfx/MSX++DeadPeopleEdition/8_tiles-monster-variants_32x32_11652-16851.png b/gfx/MSX++DeadPeopleEdition/8_tiles-monster-variants_32x32_11652-16851.png index 1a163b85e680c..df32334b36d72 100644 Binary files a/gfx/MSX++DeadPeopleEdition/8_tiles-monster-variants_32x32_11652-16851.png and b/gfx/MSX++DeadPeopleEdition/8_tiles-monster-variants_32x32_11652-16851.png differ diff --git a/gfx/MSX++DeadPeopleEdition/9_tiles-connected_32x32_16852-22051.png b/gfx/MSX++DeadPeopleEdition/9_tiles-connected_32x32_16852-22051.png index 39c98abbe9047..30b3695ec5440 100644 Binary files a/gfx/MSX++DeadPeopleEdition/9_tiles-connected_32x32_16852-22051.png and b/gfx/MSX++DeadPeopleEdition/9_tiles-connected_32x32_16852-22051.png differ diff --git a/gfx/MSX++DeadPeopleEdition/tile_config.json b/gfx/MSX++DeadPeopleEdition/tile_config.json index a6ab8034f0037..0b64ebac2c463 100644 --- a/gfx/MSX++DeadPeopleEdition/tile_config.json +++ b/gfx/MSX++DeadPeopleEdition/tile_config.json @@ -2,7 +2,8 @@ "tile_info": [ { "height": 32, - "width": 32 + "width": 32, + "pixelscale": 1 } ], "tiles-new": [ @@ -13,6 +14,7 @@ "id": [ "tear_gas_payload", "tear_gas_payload_act", + "mut_dragonfire", "nectar", "grass", "underbrush", @@ -31,7 +33,11 @@ "nano_turret_rifle_weapon", "nano_turret_shredder_weapon", "nano_turret_smg_weapon", - "tr_downspout_funnel" + "tr_downspout_funnel", + "arcfurnace", + "fake_inkjet", + "fake_mucusspit", + "fake_waterspit" ], "fg": 0, @@ -29391,7 +29397,7 @@ ] }, { - "id": ["overlay_worn_survivor_maid_dress", "overlay_wielded_maid_dress_french", "overlay_worn_jokyu_fuku"], + "id": ["overlay_worn_survivor_maid_dress", "overlay_worn_maid_dress_french", "overlay_worn_survivor_maid_dress_french", "overlay_worn_jokyu_fuku"], "fg": 698, "rotates": false }, @@ -46791,6 +46797,12 @@ "fg": 31, "bg": 957, "rotates": false + }, + { + "id": "bp_32_acp", + "fg": 31, + "bg": 957, + "rotates": false }, { "id": "reloaded_32_acp", @@ -46802,7 +46814,7 @@ "bg": 957 }, { - "id": ["38_fmj", "38super_fmj", "reloaded_38super_fmj"], + "id": ["38_fmj", "38super_fmj", "reloaded_38super_fmj", "bp_38_fmj"], "fg": 33, "bg": 957, "rotates": false @@ -46820,7 +46832,7 @@ "rotates": false }, { - "id": "40fmj", + "id": ["40fmj", "bp_40fmj"], "fg": 36, "bg": 957, "rotates": false @@ -46886,19 +46898,19 @@ "rotates": false }, { - "id": "40sw", + "id": ["40sw", "bp_40sw"], "fg": 47, "bg": 957, "rotates": false }, { - "id": "44fmj", + "id": ["44fmj", "bp_44fmj"], "fg": 48, "bg": 957, "rotates": false }, { - "id": ["44magnum", "460_rowland", "460_fmj", "reloaded_460_fmj", "reloaded_460_rowland"], + "id": ["44magnum", "460_rowland", "460_fmj", "reloaded_460_fmj", "reloaded_460_rowland", "bp_460_fmj", "bp_460_rowland"], "fg": 49, "bg": 957, "rotates": false @@ -46922,13 +46934,13 @@ "rotates": false }, { - "id": "45_acp", + "id": ["45_acp", "bp_45_acp"], "fg": 51, "bg": 957, "rotates": false }, { - "id": "45_jhp", + "id": ["45_jhp", "bp_45_jhp"], "fg": 52, "bg": 957, "rotates": false @@ -46940,13 +46952,13 @@ "rotates": false }, { - "id": "46mm", + "id": ["46mm", "bp_46mm"], "fg": 54, "bg": 957, "rotates": false }, { - "id": "500_Magnum", + "id": ["500_Magnum", "bp_500_Magnum"], "fg": 55, "bg": 957, "rotates": false @@ -46992,7 +47004,7 @@ "rotates": false }, { - "id": "57mm", + "id": ["57mm", "bp_57mm"], "fg": 63, "bg": 957, "rotates": false @@ -47041,7 +47053,7 @@ "fg": 68 }, { - "id": ["762_25", "762_38R", "763_25g"], + "id": ["762_25", "762_38R", "763_25g", "bp_762_25"], "fg": 69, "bg": 957, "rotates": false @@ -47155,7 +47167,7 @@ "rotates": false }, { - "id": "9x18mm", + "id": ["9x18mm", "bp_9x18mm"], "fg": 85, "bg": 957, "rotates": false @@ -47167,7 +47179,7 @@ "rotates": false }, { - "id": "9x18mmfmj", + "id": ["9x18mmfmj", "bp_9x18mmfmj"], "fg": 86, "bg": 957, "rotates": false @@ -47569,7 +47581,7 @@ "rotates": false }, { - "id": "gasoline", + "id": ["gasoline", "flamethrower_fuel"], "fg": 138, "rotates": false }, @@ -47588,7 +47600,7 @@ "bg": 957 }, { - "id": "gunpowder", + "id": ["gunpowder", "gunpowder_artillery", "gunpowder_large_rifle", "gunpowder_magnum_pistol", "gunpowder_pistol", "gunpowder_rifle", "gunpowder_shotgun"], "fg": 141, "rotates": false }, @@ -48292,7 +48304,7 @@ "bg": 957 }, { - "id": "shot_scrap", + "id": ["shot_scrap", "bp_shot_scrap"], "fg": 227, "bg": 957 }, @@ -48396,10 +48408,6 @@ "bg": 957, "rotates": false }, - { - "id": "bucket", - "fg": 244 - }, { "id": "yarn", "fg": 245, @@ -54187,11 +54195,12 @@ "rotates": false }, { - "id": ["bio_dis_acid", "bio_glowy"], + "id": ["bio_dis_acid", "bio_glowy", "bio_fuel_cell_gasoline", "bio_fuel_cell_blood"], "fg": 1016, "bg": 957, "rotates": false }, + { "id": ["bio_dis_shock", "bio_syringe", "bio_weight"], "fg": 1016, @@ -54203,6 +54212,17 @@ "fg": 1016, "bg": 957, "rotates": false + }, { + "id": ["afs_bio_dopamine_stimulators", "afs_bio_linguistic_coprocessor", "afs_bio_missiles", "afs_bio_precision_solderers"], + "fg": 1016, + "bg": 957, + "rotates": false + }, + { + "id": ["bio_lobotomy_awakened", "bio_lobotomy_badtemper", "bio_lobotomy_chemimbalance", "bio_lobotomy_hoarder", "bio_lobotomy_insomnia", "bio_lobotomy_moodswings", "bio_lobotomy_narcoleptic", "bio_lobotomy_psychopath", "bio_lobotomy_schizophrenic", "bio_resist_fear", "bio_resist_psychic"], + "fg": 1016, + "bg": 957, + "rotates": false }, { "id": "bio_chest_gun", @@ -56637,7 +56657,7 @@ "rotates": false }, { - "id": ["usb_drive", "software","software_useless", "software_hacking", "software_medical", "software_math", "software_blood_data", "software_lab_data", "software_train_data", "Software_BioCo_Civilian_Designs", "Software_BioCo_Experimental_Designs", "Software_BioCo_Medical_Designs", "Software_BioCo_Military_Designs"], + "id": ["usb_drive", "software","software_useless", "software_hacking", "software_medical", "software_math", "software_blood_data", "software_lab_data", "software_train_data", "Software_BioCo_Civilian_Designs", "Software_BioCo_Experimental_Designs", "Software_BioCo_Medical_Designs", "Software_BioCo_Military_Designs", "software_electronics_reference"], "fg": 1965, "bg": 957, "rotates": false @@ -61032,6 +61052,12 @@ "fg": 1021, "bg": 963, "rotates": false + }, + { + "id": "textbook_atomic_lab", + "fg": 1021, + "bg": 963, + "rotates": false }, { "id": "recipe_lab_elec", @@ -61353,10 +61379,16 @@ "rotates": false }, { - "id": "mon_ant_larva", + "id": ["mon_ant_larva", "mon_tame_large_ant_larva"], "fg": 2313, "bg": 0, "rotates": false + }, + { + "id": ["mon_tame_large_ant_larva"], + "fg": 2313, + "bg": 25461, + "rotates": false }, { "id": "mon_ant_queen", @@ -62283,7 +62315,12 @@ { "id": "mon_spider_web_s", "fg": 2615, - "bg": 967, + "bg": 0, + "rotates": false + }, { + "id": "mon_tame_small_web_spider", + "fg": 2615, + "bg": 25500, "rotates": false }, { @@ -68558,6 +68595,20 @@ "id": "wine_chardonnay", "fg": 1072, "rotates": false + }, + { + "id": "wine_vermouth", + "fg": 1072, + "rotates": false + }, { + "id": "wine_marsala", + "fg": 1072, + "rotates": false + }, + { + "id": "wine_barley", + "fg": 1072, + "rotates": false }, { "id": "wine_riesling", @@ -68788,6 +68839,11 @@ "id": "vodka", "fg": 1094, "rotates": false + }, + { + "id": "drink_martini", + "fg": 1094, + "rotates": false }, { "id": "moonshine", @@ -69310,7 +69366,7 @@ "rotates": false }, { - "id": ["milk", "rice_milk", "milkshake", "milkshake_deluxe", "milkshake_fastfood", "almond_milk", "soy_milk", "milk_reconstituted", "milk_raw", "milk_evap", "milk_UHT"], + "id": ["milk", "rice_milk", "milkshake", "milkshake_deluxe", "milkshake_fastfood", "almond_milk", "soy_milk", "milk_reconstituted", "milk_raw", "milk_evap", "milk_UHT", "afs_calorie_water"], "fg": 1153, "rotates": false }, @@ -69318,6 +69374,11 @@ "id": "saline", "fg": 1153, "rotates": false + }, + { + "id": "gas_insecticidal", + "fg": 1153, + "rotates": false }, { "id": "strength_potion", @@ -69373,6 +69434,10 @@ { "id": "lemonade_powder", "fg": 1161 + }, + { + "id": "insecticide", + "fg": 1161 }, { "id": "grahmcrackers", @@ -70578,6 +70643,10 @@ { "id": "mixed_alcohol_strong", "fg": 1345 + }, + { + "id": "potion_starter", + "fg": 1345 }, { "id": "soup_veggy", @@ -71713,12 +71782,12 @@ "rotates": false }, { - "id": "vp_fridge", + "id": ["vp_fridge", "vp_afs_freezer"], "fg": 1516, "rotates": false }, { - "id": "fridge", + "id": ["fridge", "afs_freezer"], "fg": 1516, "rotates": false }, @@ -72232,7 +72301,7 @@ "rotates": false }, { - "id": "3006_casing", + "id": ["3006_casing", "300blk_casing"], "fg": 1607, "rotates": false }, @@ -73032,6 +73101,10 @@ { "id": "l_lmg_223_kit", "fg": 1794 + }, + { + "id": "retool_ar15_300blk", + "fg": 1794 }, { "id": "l_mbr_223_kit", @@ -73168,6 +73241,10 @@ { "id": "survnote", "fg": 1823 + }, + { + "id": "cf_rep_trade_receipt", + "fg": 1823 }, { "id": "overlay_wielded_bagh_nakha", @@ -73982,6 +74059,11 @@ "id": "wasp_sting", "fg": 1971, "rotates": false + }, + { + "id": ["wasp_sting", "stinger"], + "fg": 1971, + "rotates": false }, { "id": "needle_curved", @@ -75863,7 +75945,7 @@ ] }, { - "id": ["overlay_worn_survivor_maid_dress", "maid_dress_french", "overlay_worn_jokyu_fuku"], + "id": ["overlay_worn_survivor_maid_dress", "maid_dress_french", "overlay_worn_maid_dress_french", "overlay_worn_jokyu_fuku"], "fg": 698, "rotates": false }, @@ -79779,7 +79861,7 @@ "rotates": false }, { - "id": ["bio_shock_absorber", "pseuso_bio_picklock", "null", "mon_null", "tr_null", "tr_temple_toggle", "tr_glow", "tr_hum", "tr_shadow", "tr_snake", "fd_null", "mon_null", "fd_null", "tr_null", "null", "vp_null", "tr_temple_toggle", "tr_glow", "tr_hum", "tr_shadow", "tr_snake", "TANK", "acid_spit", "candle_barrier_aftermath", "apparatus", "clairvoyance_plus_rod", "fire", "gloople_act", "gray_act", "money", "muscle", "oozle_act", "oxyacetylene", "pseuso_bio_picklock", "software", "toolset", "upstest", "vp_plating_acidchitin", "vp_plating_bone", "vp_plating_chitin", "vp_plating_diamond", "vp_plating_hard", "vp_plating_military", "vp_plating_spiked", "vp_plating_steel", "vp_plating_superalloy", "vp_plating_wood", "vp_gloople_plate", "vp_gray_plate", "vp_oozle_plate", "bog_iron_spot"], + "id": ["bio_shock_absorber", "pseuso_bio_picklock", "null", "mon_null", "tr_null", "tr_temple_toggle", "tr_glow", "tr_hum", "tr_shadow", "tr_snake", "fd_null", "mon_null", "fd_null", "tr_null", "null", "vp_null", "tr_temple_toggle", "tr_glow", "tr_hum", "tr_shadow", "tr_snake", "TANK", "acid_spit", "candle_barrier_aftermath", "apparatus", "clairvoyance_plus_rod", "fire", "gloople_act", "gray_act", "money", "muscle", "oozle_act", "oxyacetylene", "pseuso_bio_picklock", "software", "toolset", "upstest", "vp_plating_acidchitin", "vp_plating_bone", "vp_plating_chitin", "vp_plating_diamond", "vp_plating_hard", "vp_plating_military", "vp_plating_spiked", "vp_plating_steel", "vp_plating_superalloy", "vp_plating_wood", "vp_gloople_plate", "vp_gray_plate", "vp_oozle_plate", "bog_iron_spot", "vp_bulette_plate"], "fg": 0, "rotates": false }, @@ -82943,13 +83025,25 @@ "rotates": false }, { - "id": "mon_bee_larvae", + "id": ["mon_bee_larvae", "mon_small_bee_larva"], "fg": 2342, "bg": 0, "rotates": false + }, + { + "id": ["mon_tame_small_bee_larva"], + "fg": 2342, + "bg": 25461, + "rotates": false + }, + { + "id": ["mon_tame_small_bee_queen_larva"], + "fg": 2342, + "bg": 25462, + "rotates": false }, { - "id": "mon_bee_queen", + "id": ["mon_bee_queen", "mon_mega_bee_queen"], "fg": 2343, "bg": 967, "rotates": false @@ -83420,10 +83514,16 @@ "rotates": false }, { - "id": "mon_ant_acid_larva", + "id": ["mon_ant_acid_larva", "mon_tame_large_acid_ant_larva"], "fg": 4235, "bg": 0, "rotates": false + }, + { + "id": ["mon_tame_large_acid_ant_larva"], + "fg": 4235, + "bg": 25461, + "rotates": false }, { "id": "mon_ant_acid", @@ -84884,6 +84984,10 @@ { "id": ["f_standing_tank", "t_bulk_tank"], "fg": 3068 + }, { + "id": ["t_bulk_tank"], + "fg": 3068, + "bg": 5010 }, { "id": "t_backboard_in", @@ -85144,11 +85248,6 @@ "id": "t_ind_press", "fg": 3113 }, - { - "id": "f_water_heater", - "fg": 3115, - "rotates": true - }, { "id": "t_metal_floor", "fg": 3121, @@ -88312,6 +88411,10 @@ { "id": [ "tr_shotgun_2", "tr_shotgun_2_1", "tr_shotgun_1" ], "fg": 3932 + }, + { + "id": "tr_shotgun_2_1", + "fg": 3932 }, { "id": "tr_sinkhole", @@ -90064,6 +90167,19 @@ "bg": 4045 } ] + }, + { + "id": "vp_birchbark_funnel", + "fg": 4045, + "rotates": true, + "multitile": true, + "additional_tiles": [ + { + "id": "broken", + "fg": 3987, + "bg": 4045 + } + ] }, { "id": "vp_fusion_gun", @@ -94736,7 +94852,9 @@ { "id": "overlay_mutation_HOOVES", "fg": 10121, "rotates": false }, { "id": "overlay_female_mutation_FELINE_EARS", "fg": 10122, "rotates": false }, { "id": "overlay_male_mutation_FELINE_EARS", "fg": 10123, "rotates": false }, - { "id": "overlay_mutation_TAIL_FIN", "fg": 10124, "rotates": false } + { "id": "overlay_mutation_TAIL_FIN", "fg": 10124, "rotates": false }, + { "id": "overlay_female_mutation_SENIOR", "fg": 10125, "rotates": false }, + { "id": "overlay_male_mutation_SENIOR", "fg": 10126, "rotates": false } ] }, @@ -94816,6 +94934,10 @@ { "id": "wet", "bg": 11611 + }, + { + "id": "overlay_effect_playing_instrument", + "bg": 11612 }, { "id": ["overlay_effect_evil", "overlay_effect_attention"], @@ -94930,7 +95052,7 @@ "bg": 11645 }, { - "id": "overlay_effect_haslight", + "id": "!overlay_effect_haslight", "fg": 11646 }, { @@ -95251,7 +95373,15 @@ { "weight":3, "sprite":12088}, { "weight":3, "sprite":12089}, { "weight":3, "sprite":12090}, - { "weight":3, "sprite":12091} + { "weight":3, "sprite":12091}, + { "weight":3, "sprite":12092}, + { "weight":3, "sprite":12093}, + { "weight":3, "sprite":12094}, + { "weight":3, "sprite":12095}, + { "weight":3, "sprite":12096}, + { "weight":3, "sprite":12097}, + { "weight":3, "sprite":12098}, + { "weight":3, "sprite":12099} ], "bg": 967, "rotates": false @@ -95721,7 +95851,97 @@ } ], "rotates": false - }, + }, + { + "id": ["t_water_sh_underground", "t_swater_sh_underground"], + "fg": 16852, + "bg": 4844, + "multitile": true, + "additional_tiles": [ + { + "fg": [ + { "weight":30, "sprite":16852}, + { "weight":30, "sprite":27613}, + { "weight":30, "sprite":27614}, + { "weight":30, "sprite":27615}, + { "weight":30, "sprite":27616}, + { "weight":30, "sprite":27617}, + { "weight":30, "sprite":27618}, + { "weight":30, "sprite":27619}, + { "weight":30, "sprite":27620} + ], + "bg": 4844, + "id": "center" + }, + { + "fg": [ + { "weight":30, "sprite":16853}, + { "weight":30, "sprite":27621}, + { "weight":30, "sprite":27622}, + { "weight":30, "sprite":27623}, + { "weight":30, "sprite":27624}, + { "weight":30, "sprite":27625}, + { "weight":30, "sprite":27626}, + { "weight":30, "sprite":27627}, + { "weight":30, "sprite":27628} + ], + "bg": 4844, + "id": "corner" + }, + { + "fg": [16857, 16858, 16859, 16860], + "bg": 4844, + "id": "t_connection" + }, + { + "fg": [ + { "weight":30, "sprite":16861}, + { "weight":30, "sprite":27637}, + { "weight":30, "sprite":27638}, + { "weight":30, "sprite":27639}, + { "weight":30, "sprite":27640}, + { "weight":30, "sprite":27641}, + { "weight":30, "sprite":27642}, + { "weight":30, "sprite":27643}, + { "weight":30, "sprite":27644} + ], + "bg": 4844, + "id": "edge" + }, + { + "fg": [ + { "weight":30, "sprite":16863}, + { "weight":30, "sprite":27645}, + { "weight":30, "sprite":27646}, + { "weight":30, "sprite":27647}, + { "weight":30, "sprite":27648}, + { "weight":30, "sprite":27649}, + { "weight":30, "sprite":27650}, + { "weight":30, "sprite":27651}, + { "weight":30, "sprite":27652} + ], + "bg": 4844, + "id": "end_piece" + }, + + { + "fg": [ + { "weight":30, "sprite":16867}, + { "weight":30, "sprite":27653}, + { "weight":30, "sprite":27654}, + { "weight":30, "sprite":27655}, + { "weight":30, "sprite":27656}, + { "weight":30, "sprite":27657}, + { "weight":30, "sprite":27658}, + { "weight":30, "sprite":27659}, + { "weight":30, "sprite":27660} + ], + "bg": 4844, + "id": "unconnected" + } + ], + "rotates": false + }, { "id": ["t_water_sh_season_winter", "t_swater_sh_season_winter"], "fg": 16852, @@ -95900,7 +96120,95 @@ } ], "rotates": false - }, + }, { + "id": ["t_water_dp_underground", "t_swater_dp_underground"], + "fg": 16868, + "bg": 4844, + "multitile": true, + "additional_tiles": [ + { + "fg": [ + { "weight":30, "sprite":16868}, + { "weight":30, "sprite":27565}, + { "weight":30, "sprite":27566}, + { "weight":30, "sprite":27567}, + { "weight":30, "sprite":27568}, + { "weight":30, "sprite":27569}, + { "weight":30, "sprite":27570}, + { "weight":30, "sprite":27571}, + { "weight":30, "sprite":27572} + ], + "bg": 4844, + "id": "center" + }, + { + "fg": [ + { "weight":30, "sprite":16869}, + { "weight":30, "sprite":27573}, + { "weight":30, "sprite":27574}, + { "weight":30, "sprite":27575}, + { "weight":30, "sprite":27576}, + { "weight":30, "sprite":27577}, + { "weight":30, "sprite":27578}, + { "weight":30, "sprite":27579}, + { "weight":30, "sprite":27580} + ], + "bg": 4844, + "id": "corner" + }, + { + "fg": [16873, 16874, 16875, 16876], + "bg": 4844, + "id": "t_connection" + }, + { + "fg": [ + { "weight":30, "sprite":16877}, + { "weight":30, "sprite":27589}, + { "weight":30, "sprite":27590}, + { "weight":30, "sprite":27591}, + { "weight":30, "sprite":27592}, + { "weight":30, "sprite":27593}, + { "weight":30, "sprite":27594}, + { "weight":30, "sprite":27595}, + { "weight":30, "sprite":27596} + ], + "bg": 4844, + "id": "edge" + }, + { + "fg": [ + { "weight":30, "sprite":16879}, + { "weight":30, "sprite":27597}, + { "weight":30, "sprite":27598}, + { "weight":30, "sprite":27599}, + { "weight":30, "sprite":27600}, + { "weight":30, "sprite":27601}, + { "weight":30, "sprite":27602}, + { "weight":30, "sprite":27603}, + { "weight":30, "sprite":27604} + ], + "bg": 4844, + "id": "end_piece" + }, + { + "fg": [ + { "weight":30, "sprite":16883}, + { "weight":30, "sprite":27605}, + { "weight":30, "sprite":27606}, + { "weight":30, "sprite":27607}, + { "weight":30, "sprite":27608}, + { "weight":30, "sprite":27609}, + { "weight":30, "sprite":27610}, + { "weight":30, "sprite":27611}, + { "weight":30, "sprite":27612} + ], + "bg": 4844, + "id": "unconnected" + } + ], + "rotates": false + }, { "id": ["t_water_dp_season_winter", "t_swater_dp_season_winter"], "fg": 16868, @@ -99231,7 +99539,7 @@ "rotates": false }, { - "id": ["t_open_air", "t_open_air_rooved"], + "id": ["t_open_air", "t_open_air_rooved", "t_open_air_rooved_outside"], "fg": 17652, "multitile": true, "additional_tiles": [ @@ -101252,6 +101560,81 @@ "id": "unconnected", "fg": 18435, "bg": 1012 + } + ], + "rotates": false + }, { + "id": "t_water_moving_sh_underground", + "fg": 18404, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 18404, + "bg": 4844 + }, + { + "id": "corner", + "fg": [18405, 18406, 18407, 18408], + "bg": 4844 + }, + { + "id": "t_connection", + "fg": [18409, 18410, 18411, 18412], + "bg": 4844 + }, + { + "id": "edge", + "fg": [18413, 18414], + "bg": 4844 + }, + { + "id": "end_piece", + "fg": [18415, 18416, 18417, 18418], + "bg": 4844 + }, + { + "id": "unconnected", + "fg": 18419, + "bg": 4844 + } + ], + "rotates": false + }, + { + "id": "t_water_moving_dp_underground", + "fg": 18420, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 18420, + "bg": 4844 + }, + { + "id": "corner", + "fg": [18421, 18422, 18423, 18424], + "bg": 4844 + }, + { + "id": "t_connection", + "fg": [18425, 18426, 18427, 18428], + "bg": 4844 + }, + { + "id": "edge", + "fg": [18429, 18430], + "bg": 4844 + }, + { + "id": "end_piece", + "fg": [18431, 18432, 18433, 18434], + "bg": 4844 + }, + { + "id": "unconnected", + "fg": 18435, + "bg": 4844 } ], "rotates": false @@ -103976,7 +104359,7 @@ ], "rotates": true },{ - "id": "fd_tear_gas", + "id": ["fd_tear_gas", "fd_insecticidal_gas"], "fg": 19476, "bg": 0, "multitile": true, @@ -104086,6 +104469,977 @@ "id": "unconnected", "fg": 19523, "bg": 5010 + } + ], + "rotates": true + },{ + "id": "t_floor_resin", + "fg": 19524, + "bg": 5010, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19524, + "bg": 5010 + }, + { + "id": "corner", + "fg": [19525, 19526, 19527, 19528], + "bg": 5010 + }, + { + "id": "t_connection", + "fg": [19529, 19530, 19531, 19532], + "bg": 5010 + }, + { + "id": "edge", + "fg": [19533, 19534], + "bg": 5010 + }, + { + "id": "end_piece", + "fg": [19535, 19536, 19537, 19538], + "bg": 5010 + }, + { + "id": "unconnected", + "fg": 19539, + "bg": 5010 + } + ], + "rotates": true + },{ + "id": "t_wall_resin", + "fg": 19540, + "bg": 5010, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19540, + "bg": 5010 + }, + { + "id": "corner", + "fg": [19541, 19542, 19543, 19544], + "bg": 5010 + }, + { + "id": "t_connection", + "fg": [19545, 19546, 19547, 19548], + "bg": 5010 + }, + { + "id": "edge", + "fg": [19549, 19550], + "bg": 5010 + }, + { + "id": "end_piece", + "fg": [19551, 19552, 19553, 19554], + "bg": 5010 + }, + { + "id": "unconnected", + "fg": 19555, + "bg": 5010 + } + ], + "rotates": true + },{ + "id": "t_wall_resin_cage", + "fg": 19556, + "bg": 5010, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19556, + "bg": 5010 + }, + { + "id": "corner", + "fg": [19557, 19558, 19559, 19560], + "bg": 5010 + }, + { + "id": "t_connection", + "fg": [19561, 19562, 19563, 19564], + "bg": 5010 + }, + { + "id": "edge", + "fg": [19565, 19566], + "bg": 5010 + }, + { + "id": "end_piece", + "fg": [19567, 19568, 19569, 19570], + "bg": 5010 + }, + { + "id": "unconnected", + "fg": 19571, + "bg": 5010 + } + ], + "rotates": true + },{ + "id": "t_platform_resin", + "fg": 19572, + "bg": 5010, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19572, + "bg": 5010 + }, + { + "id": "corner", + "fg": [19573, 19574, 19575, 19576], + "bg": 5010 + }, + { + "id": "t_connection", + "fg": [19577, 19578, 19579, 19580], + "bg": 5010 + }, + { + "id": "edge", + "fg": [19581, 19582], + "bg": 5010 + }, + { + "id": "end_piece", + "fg": [19583, 19584, 19585, 19586], + "bg": 5010 + }, + { + "id": "unconnected", + "fg": 19587, + "bg": 5010 + } + ], + "rotates": true + }, + { + "id": "t_resin_roof", + "fg": 19588, + "bg": 5010, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19588, + "bg": 5010 + }, + { + "id": "corner", + "fg": [19589, 19590, 19591, 19592], + "bg": 5010 + }, + { + "id": "t_connection", + "fg": [19593, 19594, 19595, 19596], + "bg": 5010 + }, + { + "id": "edge", + "fg": [19597, 19598], + "bg": 5010 + }, + { + "id": "end_piece", + "fg": [19599, 19600, 19601, 19602], + "bg": 5010 + }, + { + "id": "unconnected", + "fg": 19603, + "bg": 5010 + } + ], + "rotates": true + }, + { + "id": "f_alien_table", + "fg": 19604, + "bg": 0, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19604, + "bg": 0 + }, + { + "id": "corner", + "fg": [19605, 19606, 19607, 19608], + "bg": 0 + }, + { + "id": "t_connection", + "fg": [19609, 19610, 19611, 19612], + "bg": 0 + }, + { + "id": "edge", + "fg": [19613, 19614], + "bg": 0 + }, + { + "id": "end_piece", + "fg": [19615, 19616, 19617, 19618], + "bg": 0 + }, + { + "id": "unconnected", + "fg": 19619, + "bg": 0 + } + ], + "rotates": true + }, + { + "id": "t_demon_web_wall", + "fg": 19620, + "bg": 986, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19620, + "bg": 986 + }, + { + "id": "corner", + "fg": [19621, 19622, 19623, 19624], + "bg": 986 + }, + { + "id": "t_connection", + "fg": [19625, 19626, 19627, 19628], + "bg": 986 + }, + { + "id": "edge", + "fg": [19629, 19630], + "bg": 986 + }, + { + "id": "end_piece", + "fg": [19631, 19632, 19633, 19634], + "bg": 986 + }, + { + "id": "unconnected", + "fg": 19635, + "bg": 986 + } + ], + "rotates": true + }, + { + "id": "t_wall_stick", + "fg": 19636, + "bg": 986, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19636, + "bg": 986 + }, + { + "id": "corner", + "fg": [19637, 19638, 19639, 19640], + "bg": 986 + }, + { + "id": "t_connection", + "fg": [19641, 19642, 19643, 19644], + "bg": 986 + }, + { + "id": "edge", + "fg": [19645, 19646], + "bg": 986 + }, + { + "id": "end_piece", + "fg": [19647, 19648, 19649, 19650], + "bg": 986 + }, + { + "id": "unconnected", + "fg": 19651, + "bg": 986 + } + ], + "rotates": true + }, + { + "id": "t_wax", + "fg": 19652, + "bg": 985, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19652, + "bg": 985 + }, + { + "id": "corner", + "fg": [19653, 19654, 19655, 19656], + "bg": 985 + }, + { + "id": "t_connection", + "fg": [19657, 19658, 19659, 19660], + "bg": 985 + }, + { + "id": "edge", + "fg": [19661, 19662], + "bg": 985 + }, + { + "id": "end_piece", + "fg": [19663, 19664, 19665, 19666], + "bg": 985 + }, + { + "id": "unconnected", + "fg": 19667, + "bg": 985 + } + ], + "rotates": false + }, + { + "id": "t_wall_P", + "fg": 19668, + "bg": 986, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19668, + "bg": 986 + }, + { + "id": "corner", + "fg": [19669, 19670, 19671, 19672], + "bg": 986 + }, + { + "id": "t_connection", + "fg": [19673, 19674, 19675, 19676], + "bg": 986 + }, + { + "id": "edge", + "fg": [19677, 19678], + "bg": 986 + }, + { + "id": "end_piece", + "fg": [19679, 19680, 19681, 19682], + "bg": 986 + }, + { + "id": "unconnected", + "fg": 19683, + "bg": 986 + } + ], + "rotates": true + }, + { + "id": "fd_veil_darkness", + "fg": 19684, + "bg": 0, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19684, + "bg": 0 + }, + { + "id": "corner", + "fg": [19685, 19686, 19687, 19688], + "bg": 0 + }, + { + "id": "t_connection", + "fg": [19689, 19690, 19691, 19692], + "bg": 0 + }, + { + "id": "edge", + "fg": [19693, 19694], + "bg": 0 + }, + { + "id": "end_piece", + "fg": [19695, 19696, 19697, 19698], + "bg": 0 + }, + { + "id": "unconnected", + "fg": 19699, + "bg": 0 + } + ], + "rotates": true + }, + { + "id": ["fd_fog", "f_fog"], + "fg": 19700, + "bg": 0, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19700, + "bg": 0 + }, + { + "id": "corner", + "fg": [19701, 19702, 19703, 19704], + "bg": 0 + }, + { + "id": "t_connection", + "fg": [19705, 19706, 19707, 19708], + "bg": 0 + }, + { + "id": "edge", + "fg": [19709, 19710], + "bg": 0 + }, + { + "id": "end_piece", + "fg": [19711, 19712, 19713, 19714], + "bg": 0 + }, + { + "id": "unconnected", + "fg": 19715, + "bg": 0 + } + ], + "rotates": true + }, + { + "id": ["fd_fog"], + "fg": 19716, + "bg": 0, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19716, + "bg": 0 + }, + { + "id": "corner", + "fg": [19717, 19718, 19719, 19720], + "bg": 0 + }, + { + "id": "t_connection", + "fg": [19721, 19722, 19723, 19724], + "bg": 0 + }, + { + "id": "edge", + "fg": [19725, 19726], + "bg": 0 + }, + { + "id": "end_piece", + "fg": [19727, 19728, 19729, 19730], + "bg": 0 + }, + { + "id": "unconnected", + "fg": 19731, + "bg": 0 + } + ], + "rotates": true + }, + { + "id": ["t_clay"], + "fg": 19732, + "bg": 0, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19732, + "bg": 0 + }, + { + "id": "corner", + "fg": [19733, 19734, 19735, 19736], + "bg": 0 + }, + { + "id": "t_connection", + "fg": [19737, 19738, 19739, 19740], + "bg": 0 + }, + { + "id": "edge", + "fg": [19741, 19742], + "bg": 0 + }, + { + "id": "end_piece", + "fg": [19743, 19744, 19745, 19746], + "bg": 0 + }, + { + "id": "unconnected", + "fg": 19747, + "bg": 0 + } + ], + "rotates": true + }, + { + "id": ["t_mud"], + "fg": 19748, + "bg": 0, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19748, + "bg": 0 + }, + { + "id": "corner", + "fg": [19749, 19750, 19751, 19752], + "bg": 0 + }, + { + "id": "t_connection", + "fg": [19753, 19754, 19755, 19756], + "bg": 0 + }, + { + "id": "edge", + "fg": [19757, 19758], + "bg": 0 + }, + { + "id": "end_piece", + "fg": [19759, 19760, 19761, 19762], + "bg": 0 + }, + { + "id": "unconnected", + "fg": 19763, + "bg": 0 + } + ], + "rotates": true + }, + { + "id": ["t_mud_underground"], + "fg": 19764, + "bg": 0, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19764, + "bg": 0 + }, + { + "id": "corner", + "fg": [19765, 19766, 19767, 19768], + "bg": 0 + }, + { + "id": "t_connection", + "fg": [19769, 19770, 19771, 19772], + "bg": 0 + }, + { + "id": "edge", + "fg": [19773, 19774], + "bg": 0 + }, + { + "id": "end_piece", + "fg": [19775, 19776, 19777, 19778], + "bg": 0 + }, + { + "id": "unconnected", + "fg": 19779, + "bg": 0 + } + ], + "rotates": true + }, + { + "id": ["t_dirt_underground"], + "fg": 19780, + "bg": 0, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19780, + "bg": 0 + }, + { + "id": "corner", + "fg": [19781, 19782, 19783, 19784], + "bg": 0 + }, + { + "id": "t_connection", + "fg": [19785, 19786, 19787, 19788], + "bg": 0 + }, + { + "id": "edge", + "fg": [19789, 19790], + "bg": 0 + }, + { + "id": "end_piece", + "fg": [19791, 19792, 19793, 19794], + "bg": 0 + }, + { + "id": "unconnected", + "fg": 19795, + "bg": 0 + } + ], + "rotates": true + }, + { + "id": ["t_sand_underground"], + "fg": 19796, + "bg": 0, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19796, + "bg": 0 + }, + { + "id": "corner", + "fg": [19797, 19798, 19799, 19800], + "bg": 0 + }, + { + "id": "t_connection", + "fg": [19801, 19802, 19803, 19804], + "bg": 0 + }, + { + "id": "edge", + "fg": [19805, 19806], + "bg": 0 + }, + { + "id": "end_piece", + "fg": [19807, 19808, 19809, 19810], + "bg": 0 + }, + { + "id": "unconnected", + "fg": 19811, + "bg": 0 + } + ], + "rotates": true + }, + { + "id": ["t_moss_underground"], + "fg": 19812, + "bg": 0, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19812, + "bg": 0 + }, + { + "id": "corner", + "fg": [19813, 19814, 19815, 19816], + "bg": 0 + }, + { + "id": "t_connection", + "fg": [19817, 19818, 19819, 19820], + "bg": 0 + }, + { + "id": "edge", + "fg": [19821, 19822], + "bg": 0 + }, + { + "id": "end_piece", + "fg": [19823, 19824, 19825, 19826], + "bg": 0 + }, + { + "id": "unconnected", + "fg": 19827, + "bg": 0 + } + ], + "rotates": true + }, + { + "id": ["t_clay_underground"], + "fg": 19828, + "bg": 0, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19828, + "bg": 0 + }, + { + "id": "corner", + "fg": [19829, 19830, 19831, 19832], + "bg": 0 + }, + { + "id": "t_connection", + "fg": [19833, 19834, 19835, 19836], + "bg": 0 + }, + { + "id": "edge", + "fg": [19837, 19838], + "bg": 0 + }, + { + "id": "end_piece", + "fg": [19839, 19840, 19841, 19842], + "bg": 0 + }, + { + "id": "unconnected", + "fg": 19843, + "bg": 0 + } + ], + "rotates": true + }, + { + "id": ["t_claymound_underground"], + "fg": 19844, + "bg": 0, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19844, + "bg": 0 + }, + { + "id": "corner", + "fg": [19845, 19846, 19847, 19848], + "bg": 0 + }, + { + "id": "t_connection", + "fg": [19849, 19850, 19851, 19852], + "bg": 0 + }, + { + "id": "edge", + "fg": [19853, 19854], + "bg": 0 + }, + { + "id": "end_piece", + "fg": [19855, 19856, 19857, 19858], + "bg": 0 + }, + { + "id": "unconnected", + "fg": 19859, + "bg": 0 + } + ], + "rotates": true + }, + { + "id": ["t_water_murky"], + "fg": 19860, + "bg": 1012, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19860, + "bg": 1012 + }, + { + "id": "corner", + "fg": [19861, 19862, 19863, 19864], + "bg": 1012 + }, + { + "id": "t_connection", + "fg": [19865, 19866, 19867, 19868], + "bg": 1012 + }, + { + "id": "edge", + "fg": [19869, 19870], + "bg": 1012 + }, + { + "id": "end_piece", + "fg": [19871, 19872, 19873, 19874], + "bg": 1012 + }, + { + "id": "unconnected", + "fg": 19875, + "bg": 1012 + } + ], + "rotates": true + }, + { + "id": ["t_water_sh_murky_underground"], + "fg": 19860, + "bg": 4844, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19860, + "bg": 4844 + }, + { + "id": "corner", + "fg": [19861, 19862, 19863, 19864], + "bg": 4844 + }, + { + "id": "t_connection", + "fg": [19865, 19866, 19867, 19868], + "bg": 4844 + }, + { + "id": "edge", + "fg": [19869, 19870], + "bg": 4844 + }, + { + "id": "end_piece", + "fg": [19871, 19872, 19873, 19874], + "bg": 4844 + }, + { + "id": "unconnected", + "fg": 19875, + "bg": 4844 + } + ], + "rotates": true + }, + { + "id": ["fd_swamp_gas"], + "fg": 19876, + "bg": 0, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19876, + "bg": 0 + }, + { + "id": "corner", + "fg": [19877, 19878, 19879, 19880], + "bg": 0 + }, + { + "id": "t_connection", + "fg": [19881, 19882, 19883, 19884], + "bg": 0 + }, + { + "id": "edge", + "fg": [19885, 19886], + "bg": 0 + }, + { + "id": "end_piece", + "fg": [19887, 19888, 19889, 19890], + "bg": 0 + }, + { + "id": "unconnected", + "fg": 19891, + "bg": 0 + } + ], + "rotates": true + }, + { + "id": ["f_swamp_gas"], + "fg": 19892, + "bg": 0, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19892, + "bg": 0 + }, + { + "id": "corner", + "fg": [19893, 19894, 19895, 19896], + "bg": 0 + }, + { + "id": "t_connection", + "fg": [19897, 19898, 19899, 19900], + "bg": 0 + }, + { + "id": "edge", + "fg": [19901, 19902], + "bg": 0 + }, + { + "id": "end_piece", + "fg": [19903, 19904, 19905, 19906], + "bg": 0 + }, + { + "id": "unconnected", + "fg": 19907, + "bg": 0 } ], "rotates": true @@ -104094,7 +105448,7 @@ ] }, { - "file": "10_xfiles_32x32_22052-22195.png", + "file": "10_xfiles_32x32_22052-22195.png", "tiles": [ { "id": "mon_pink_mist", @@ -104487,7 +105841,9 @@ { "id": "overlay_wielded_ecs_lajatang_off", "fg": 22348, "rotates": false }, { "id": "overlay_wielded_ecs_lajatang_on", "fg": 22349, "rotates": false }, { "id": "overlay_wielded_bio_sword_weapon", "fg": 22350, "rotates": false }, - { "id": "overlay_wielded_makeshift_scythe_war", "fg": 22351, "rotates": false } + { "id": "overlay_wielded_makeshift_scythe_war", "fg": 22351, "rotates": false }, + { "id": "overlay_wielded_lucern_hammer", "fg": 22352, "rotates": false }, + { "id": "overlay_wielded_lucern_hammerfake", "fg": 22352, "rotates": false } ] }, { @@ -105346,7 +106702,7 @@ "fg": 22518 }, { - "id": ["tr_birch_funnel", "overlay_wielded_birch_funnel"], + "id": ["tr_birch_funnel", "overlay_wielded_birch_funnel", "overlay_wielded_birchbark_funnel", "birchbark_funnel"], "fg": 22519 }, { @@ -112900,10 +114256,6 @@ "id": ["overlay_effect_snow_glare"], "fg": 23923 }, - { - "id": ["overlay_wielded_craft"], - "fg": 23924 - }, { "id": ["overlay_wielded_linuxtshirt"], "fg": 23925 @@ -114091,7 +115443,7 @@ "fg": 22518 }, { - "id": ["tr_birch_funnel", "birch_funnel"], + "id": ["tr_birch_funnel", "birch_funnel", "tr_birchbark_funnel"], "fg": 22519 }, { @@ -118501,6 +119853,11 @@ "id": "standard_template_construct", "fg": 23393, "bg": 0 + }, + { + "id": "template_photonics", + "fg": 23393, + "bg": 0 }, { "id": "ruined_chunks", @@ -118815,10 +120172,16 @@ "fg": 23445 }, { - "id": "mon_wasp_larvae", + "id": ["mon_wasp_larvae", "mon_large_wasp_larva"], "fg": 23446, "bg": 0, "rotates": false + }, + { + "id": ["mon_tame_large_wasp_larva"], + "fg": 23446, + "bg": 25461, + "rotates": false }, { "id": "analytical_set_basic", @@ -119699,7 +121062,7 @@ "rotates": false }, { - "id": "corpse_mon_spider_web_s", + "id": ["corpse_mon_spider_web_s", "corpse_mon_tame_small_web_spider"], "fg": 23573, "bg": 0, "rotates": false @@ -119753,7 +121116,7 @@ "rotates": false }, { - "id": "corpse_mon_ant_larva", + "id": ["corpse_mon_ant_larva", "corpse_mon_tame_large_ant_larva"], "fg": 23580, "bg": 0, "rotates": false @@ -119777,7 +121140,7 @@ "rotates": false }, { - "id": "corpse_mon_ant_acid_larva", + "id": ["corpse_mon_ant_acid_larva", "corpse_mon_tame_large_acid_ant_larva"], "fg": 23584, "bg": 0, "rotates": false @@ -120894,7 +122257,7 @@ "rotates": false }, { - "id": "f_dishwasher", + "id": ["f_dishwasher", "dishwasher", "vp_dishwasher"], "fg": 23780, "bg": 0, "rotates": false @@ -120922,12 +122285,6 @@ "fg": 23784, "bg": 0, "rotates": false - }, - { - "id": "f_HPLC", - "fg": 23784, - "bg": 0, - "rotates": false }, { "id": "f_GC", @@ -120948,7 +122305,7 @@ "rotates": false }, { - "id": "f_autoclave", + "id": ["f_autoclave", "vh_autoclave", "vp_autoclave"], "fg": 23788, "bg": 0, "rotates": false @@ -121366,7 +122723,7 @@ "rotates": false }, { - "id": "f_arc_furnace", + "id": ["f_arc_furnace", "f_arcfurnace_empty"], "fg": 23866, "rotates": false }, @@ -122420,7 +123777,7 @@ "fg": 24072 }, { - "id": ["380_FMJ","380_JHP","380_p","reloaded_380_FMJ","reloaded_380_JHP","reloaded_380_p"], + "id": ["380_FMJ","380_JHP","380_p","reloaded_380_FMJ","reloaded_380_JHP","reloaded_380_p", "bp_380_FMJ", "bp_380_JHP"], "fg": 24073 }, { @@ -123891,13 +125248,13 @@ "rotates": false }, { - "id": "corpse_mon_bee_queen", + "id": ["corpse_mon_bee_queen", "corpse_mon_mega_bee_queen"], "fg": 24267, "bg": 0, "rotates": false }, { - "id": "corpse_mon_bee_larvae", + "id": ["corpse_mon_bee_larvae", "corpse_mon_small_bee_larva", "corpse_mon_tame_small_bee_larva", "corpse_mon_tame_small_bee_queen_larva"], "fg": 24268, "bg": 0, "rotates": false @@ -123909,7 +125266,7 @@ "rotates": false }, { - "id": "corpse_mon_wasp_larvae", + "id": ["corpse_mon_wasp_larvae", "corpse_mon_large_wasp_larva", "corpse_mon_tame_large_wasp_larva"], "fg": 24270, "bg": 0, "rotates": false @@ -125687,7 +127044,7 @@ "rotates": false }, { - "id": "tarp_raincatcher", + "id": "tr_raincatcher", "fg": 24564, "rotates": false }, @@ -125823,21 +127180,21 @@ "rotates": false }, { - "id": ["afs_welding_mask"], + "id": ["afs_welding_mask", "welding_mask"], "fg": 24594, "rotates": false }, { - "id": ["overlay_worn_afs_welding_mask"], + "id": ["overlay_worn_afs_welding_mask", "overlay_worn_welding_mask"], "fg": 24595, "rotates": false }, { - "id": ["afs_welding_mask_makeshift"], + "id": ["afs_welding_mask_makeshift", "welding_mask_crude"], "fg": 24596, "rotates": false }, { - "id": ["overlay_worn_afs_welding_mask_makeshift"], + "id": ["overlay_worn_afs_welding_mask_makeshift", "overlay_worn_welding_mask_crude"], "fg": 24597, "rotates": false }, @@ -126568,7 +127925,7 @@ "bg": 0 }, { - "id": ["shot_dragon", "reloaded_shot_dragon"], + "id": ["shot_dragon", "reloaded_shot_dragon", "bp_shot_dragon"], "fg": 24735, "bg": 0 }, @@ -127884,6 +129241,24 @@ "fg": 24966, "bg": 3819 }, + { + "id": ["cestus_plus_one"], + "fg": 24965, + "bg": 1704 + }, { + "id": ["cestus_plus_two"], + "fg": 24966, + "bg": 1704 + }, + { + "id": ["flaming_fist_plus_one"], + "fg": 24965, + "bg": 25123 + }, { + "id": ["flaming_fist_plus_two"], + "fg": 24966, + "bg": 25123 + }, { "id": ["mon_animated_blade"], @@ -128083,911 +129458,5268 @@ "fg": 25012, "bg": 0 }, - { - "id": "atlatl", "note": "before that i add all new items to the tileset! !!!NEW-ITEMS-HERE!!", - "fg": 1986, - "bg": 0, - "rotates": false + "id": [ "t_resin_hole_c"], + "fg": 25013, + "bg": 0 + }, + { + "id": [ "t_resin_hole_o"], + "fg": 25014, + "bg": 0 + }, + { + "id": [ "t_resin_hole"], + "fg": 25015, + "bg": 0 + }, { + "id": [ "f_alien_anemone"], + "fg": 25016, + "bg": 0 }, - { - "id": ["overlay_wielded_corpse", "overlay_wielded_rmi2_corpse"], - "fg": 1840, + { + "id": "f_alien_zapper", + "fg": 25017, "rotates": false - } - ] - }, - { - "file": "15_tiles-connected_variants_32x32_27565-32764.png", - "tiles": - [ - { - "id": "atlatl", - "fg": 1986, - "bg": 0, + }, + { + "id": "f_alien_scar", + "fg": 25018, "rotates": false - } - ] - }, - { - "file": "16_tiles_trees_64x80_32765-33164.png", - "sprite_width":64, - "sprite_height":80, - "sprite_offset_x":-16, - "sprite_offset_y":-48, - "tiles": - [ + }, { - "id": "t_tree_season_spring", - "fg": 32765, - "bg": 32977, + "id": "f_alien_pod", + "fg": 25019, "rotates": false - }, - { - "id": ["t_tree_season_summer", "t_tree"], - "fg": 32766, - "bg": 32977, + }, { + "id": "f_alien_pod_organ", + "fg": 25020, "rotates": false - }, - { - "id": "t_tree_season_autumn", - "fg": 32767, - "bg": 32977, + }, { + "id": "f_alien_pod_resin", + "fg": 25021, "rotates": false - }, + }, { - "id": "t_tree_season_winter", - "fg": 32768, - "bg": 32978, + "id": "resin_chunk", + "fg": 25022, "rotates": false }, - { - "id": ["t_tree_harvested_season_spring", "t_tree_oak_harvested_season_spring"], - "fg": 32769, - "bg": 32977, + { + "id": "alien_pod_resin", + "fg": 25023, "rotates": false - }, - { - "id": ["t_tree_harvested_season_summer", "t_tree_harvested", "t_tree_oak_harvested_season_summer", "t_tree_oak_harvested"], - "fg": 32770, - "bg": 32977, + },{ + "id": "mon_demon_spider", + "fg": 25024, + "bg": 967, "rotates": false - }, - { - "id": ["t_tree_harvested_season_autumn", "t_tree_oak_harvested_season_autumn"], - "fg": 32771, - "bg": 32977, + },{ + "id": "corpse_mon_demon_spider", + "fg": 25025, + "bg": 0, "rotates": false - }, + }, { - "id": ["t_tree_harvested_season_winter", "t_tree_oak_harvested_season_winter"], - "fg": 32772, - "bg": 32978, + "id": "mon_demon_spiderling", + "fg": 25026, + "bg": 967, + "rotates": false + },{ + "id": "corpse_mon_demon_spiderling", + "fg": 25027, + "bg": 0, "rotates": false }, { - "id": "t_tree_blackjack_season_spring", - "fg": 32773, - "bg": 32977, + "id": "t_webbed_corpse", + "fg": 25028, + "bg": 0, "rotates": false - }, - { - "id": ["t_tree_blackjack_season_summer", "t_tree_blackjack"], - "fg": 32774, - "bg": 32977, + }, { + "id": "f_magic_circle", + "fg": 25029, + "bg": 0, "rotates": false - }, + }, { - "id": "t_tree_blackjack_season_autumn", - "fg": 32775, - "bg": 32977, + "id": "mon_nothic", + "fg": 25030, + "bg": 967, "rotates": false - }, - { - "id": "t_tree_blackjack_season_winter", - "fg": 32776, - "bg": 32978, + }, { + "id": "corpse_mon_nothic", + "fg": 25031, + "bg": 0, + "rotates": false + },{ + "id": "adrenal_gland_large", + "fg": 25032, + "bg": 0, + "rotates": false + },{ + "id": "alchemy_basic", + "fg": 25033, + "bg": 0, + "rotates": false + },{ + "id": "bulette_pearl", + "fg": 25034, + "bg": 0, + "rotates": false + },{ + "id": "bulette_plate", + "fg": 25035, + "bg": 0, "rotates": false }, { - "id": "t_tree_blackjack_harvested_season_spring", - "fg": 32777, - "bg": 32977, + "id": "copper_circlet", + "fg": 25036, + "bg": 0, "rotates": false - }, + }, { - "id": ["t_tree_blackjack_harvested_season_summer", "t_tree_blackjack_harvested"], - "fg": 32778, - "bg": 32977, + "id": "overlay_worn_copper_circlet", + "fg": 25037, + "bg": 0, "rotates": false - }, + }, { + "id": "copper_infuser", + "fg": 25038, + "bg": 0, + "rotates": false + }, { - "id": "t_tree_blackjack_harvested_season_autumn", - "fg": 32779, - "bg": 32977, + "id": "overlay_worn_copper_infuser", + "fg": 25039, + "bg": 0, "rotates": false - }, + }, { - "id": "t_tree_blackjack_harvested_season_winter", - "fg": 32780, - "bg": 32978, + "id": "demon_chitin_piece", + "fg": 25040, + "bg": 0, + "rotates": false + }, { + "id": "demon_chitin_plate", + "fg": 25041, + "bg": 0, "rotates": false }, { - "id": "t_tree_walnut_season_spring", - "fg": 32781, - "bg": 32977, + "id": "demon_spider_fang", + "fg": 25042, + "bg": 0, "rotates": false - }, - { - "id": ["t_tree_walnut_season_summer", "t_tree_walnut"], - "fg": 32782, - "bg": 32977, + }, { + "id": "glow_light", + "fg": 25043, + "bg": 0, "rotates": false - }, - { - "id": "t_tree_walnut_season_autumn", - "fg": 32783, - "bg": 32977, + },{ + "id": "glow_light_off", + "fg": 25044, + "bg": 0, "rotates": false - }, - { - "id": "t_tree_walnut_season_winter", - "fg": 32784, - "bg": 32978, + },{ + "id": "hairball", + "fg": 25045, + "bg": 0, + "rotates": false + },{ + "id": "stone_chisel", + "fg": 25046, + "bg": 0, "rotates": false }, { - "id": "t_tree_walnut_harvested_season_spring", - "fg": 32785, - "bg": 32977, + "id": ["lightning_storm_scroll", "spell_scroll_animated_blade", "spell_scroll_bio_acidicspray", "spell_scroll_bio_bonespear", "spell_scroll_bio_fleshpouch", "spell_scroll_bio_grotesque", "spell_scroll_bless", "spell_scroll_blinding_flash", "spell_scroll_burning_hands", "spell_scroll_cats_grace", "spell_scroll_chilling_touch", "spell_scroll_cone_cold", "spell_scroll_create_atomic_lamp", "spell_scroll_create_atomic_light", "spell_scroll_create_lighter", "spell_scroll_druid_naturebow1", "spell_scroll_druid_rootstrike", "spell_scroll_druid_veggrasp", "spell_scroll_druid_woodshaft", "spell_scroll_eagles_sight", "spell_scroll_eshaper_piercing_bolt", "spell_scroll_eshaper_rockbolt", "spell_scroll_eshaper_shardspray", "spell_scroll_eshaper_shardstorm", "spell_scroll_ethereal_grasp", "spell_scroll_fireball", "spell_scroll_foxs_cunning", "spell_scroll_frost_armor", "spell_scroll_frost_spray", "spell_scroll_glide_ice", "spell_scroll_gravity_well", "spell_scroll_hoary_blast", "spell_scroll_holy_blade", "spell_scroll_ice_shield", "spell_scroll_ice_spike", "spell_scroll_jolt", "spell_scroll_laze", "spell_scroll_light_healing", "spell_scroll_lightning_blast", "spell_scroll_lightning_bolt", "spell_scroll_magic_missile", "spell_scroll_magus_escape", "spell_scroll_magus_haste", "spell_scroll_magus_mana_beam", "spell_scroll_magus_mana_blast", "spell_scroll_magus_mana_bolt", "spell_scroll_megablast", "spell_scroll_mirror_image", "spell_scroll_necrotic_gaze", "spell_scroll_ogres_strength", "spell_scroll_pain_split", "spell_scroll_phase_door", "spell_scroll_point_flare", "spell_scroll_protection_aura", "spell_scroll_quantum_tunnel_lesser", "spell_scroll_recover_bionic_power", "spell_scroll_recover_fatigue", "spell_scroll_recover_mana", "spell_scroll_recover_pain", "spell_scroll_recover_stamina", "spell_scroll_seismic_stomp", "spell_scroll_smite", "spell_scroll_spirit_armor", "spell_scroll_stonefist", "spell_scroll_storm_hammer", "spell_scroll_summon_cats", "spell_scroll_summon_decayed_pouncer", "spell_scroll_summon_skeleton", "spell_scroll_summon_zombie", "spell_scroll_synaptic_stimulation", "spell_scroll_taze", "spell_scroll_vicious_tentacle", "spell_scroll_windrun", "spell_scroll_windstrike", "spell_scroll_purification_seed", "spell_scroll_dark_sight"], + "fg": 25047, + "bg": 0, "rotates": false - }, + }, { - "id": ["t_tree_walnut_harvested_season_summer", "t_tree_walnut_harvested"], - "fg": 32786, - "bg": 32977, + "id": "corpse_mon_slasher", + "fg": 25048, + "bg": 0, "rotates": false - }, + }, { - "id": "t_tree_walnut_harvested_season_autumn", - "fg": 32787, - "bg": 32977, + "id": "corpse_mon_waster", + "fg": 25049, + "bg": 0, "rotates": false - }, - { - "id": "t_tree_walnut_harvested_season_winter", - "fg": 32788, - "bg": 32978, + }, { + "id": "corpse_mon_leaper", + "fg": 25050, + "bg": 0, "rotates": false - }, + }, { - "id": "t_tree_chestnut_season_spring", - "fg": 32789, - "bg": 32977, + "id": "corpse_mon_twitcher", + "fg": 25051, + "bg": 0, "rotates": false - }, + }, { - "id": ["t_tree_chestnut_season_summer", "t_tree_chestnut"], - "fg": 32790, - "bg": 32977, + "id": "corpse_mon_pack", + "fg": 25052, + "bg": 0, "rotates": false - }, - { - "id": "t_tree_chestnut_season_autumn", - "fg": 32791, - "bg": 32977, + }, { + "id": "corpse_mon_puker", + "fg": 25053, + "bg": 0, "rotates": false - }, + }, { - "id": "t_tree_chestnut_season_winter", - "fg": 32792, - "bg": 32978, + "id": "corpse_mon_animate_arm", + "fg": 25054, + "bg": 0, + "rotates": false + }, { + "id": "corpse_mon_dullahan", + "fg": 25055, + "bg": 0, "rotates": false }, { - "id": "t_tree_chestnut_harvested_season_spring", - "fg": 32793, - "bg": 32977, + "id": "mon_skeleton_electric", + "fg": 25056, + "bg": 967, "rotates": false - }, - { - "id": ["t_tree_chestnut_harvested_season_summer", "t_tree_chestnut_harvested"], - "fg": 32794, - "bg": 32977, + }, { + "id": "corpse_mon_skeleton_electric", + "fg": 25057, + "bg": 0, "rotates": false - }, - { - "id": "t_tree_chestnut_harvested_season_autumn", - "fg": 32795, - "bg": 32977, + },{ + "id": "spear_spike", + "fg": 25058, + "bg": 0, "rotates": false - }, - { - "id": "t_tree_chestnut_harvested_season_winter", - "fg": 32796, - "bg": 32978, + },{ + "id": "overlay_wielded_spear_spike", + "fg": 25059, + "bg": 0, "rotates": false - }, - { - "id": "t_tree_beech_season_spring", - "fg": 32797, - "bg": 32977, + },{ + "id": "spear_knife_superior", + "fg": 25060, + "bg": 0, "rotates": false - }, - { - "id": ["t_tree_beech_season_summer", "t_tree_beech"], - "fg": 32798, - "bg": 32977, + },{ + "id": "overlay_wielded_spear_knife_superior", + "fg": 25061, + "bg": 0, "rotates": false - }, - { - "id": "t_tree_beech_season_autumn", - "fg": 32799, - "bg": 32977, + },{ + "id": "alloy_pellet", + "fg": 25062, + "bg": 0, "rotates": false - }, - { - "id": "t_tree_beech_season_winter", - "fg": 32800, - "bg": 32978, + },{ + "id": "beam_difractor", + "fg": 25063, + "bg": 0, + "rotates": false + },{ + "id": "blade_crt", + "fg": 25064, + "bg": 0, + "rotates": false + },{ + "id": "bthk_stock", + "fg": 25065, + "bg": 0, "rotates": false }, - { - "id": "t_tree_beech_harvested_season_spring", - "fg": 32801, - "bg": 32977, + { + "id": "chunk_rubber", + "fg": 25066, + "bg": 0, "rotates": false - }, - { - "id": ["t_tree_beech_harvested_season_summer", "t_tree_beech_harvested"], - "fg": 32802, - "bg": 32977, + },{ + "id": "speargun", + "fg": 25067, + "bg": 0, "rotates": false - }, - { - "id": "t_tree_beech_harvested_season_autumn", - "fg": 32803, - "bg": 32977, + },{ + "id": "minispeargun", + "fg": 25068, + "bg": 0, "rotates": false - }, - { - "id": "t_tree_beech_harvested_season_winter", - "fg": 32804, - "bg": 32978, + },{ + "id": "doublespeargun", + "fg": 25069, + "bg": 0, + "rotates": false + },{ + "id": "airspeargun", + "fg": 25070, + "bg": 0, "rotates": false }, { - "id": "t_tree_dead_season_spring", - "fg": 32805, - "bg": 32977, + "id": "mon_songbird", + "fg": 25071, + "bg": 967, "rotates": false - }, - { - "id": ["t_tree_dead_season_summer", "t_tree_dead_season_summer"], - "fg": 32806, - "bg": 32977, + }, { + "id": "corpse_mon_songbird", + "fg": 25072, + "bg": 0, "rotates": false - }, - { - "id": "t_tree_dead_season_autumn", - "fg": 32807, - "bg": 32977, + }, { + "id": "mon_animal_mutant_tunneler", + "fg": 25073, + "bg": 967, "rotates": false - }, - { - "id": "t_tree_dead_season_winter", - "fg": 32808, - "bg": 32978, + }, { + "id": "corpse_mon_animal_mutant_tunneler", + "fg": 25074, + "bg": 0, "rotates": false - }, - { - "id": "t_tree_pecan_season_spring", - "fg": 32809, - "bg": 32977, + },{ + "id": "mon_animal_mutant_runner", + "fg": 25075, + "bg": 967, "rotates": false - }, - { - "id": ["t_tree_pecan_season_summer", "t_tree_pecan"], - "fg": 32810, - "bg": 32977, + }, { + "id": "corpse_mon_animal_mutant_runner", + "fg": 25076, + "bg": 0, "rotates": false - }, - { - "id": "t_tree_pecan_season_autumn", - "fg": 32811, - "bg": 32977, + },{ + "id": "mon_animal_mutant_flyer", + "fg": 25077, + "bg": 967, "rotates": false - }, - { - "id": "t_tree_pecan_season_winter", - "fg": 32812, - "bg": 32978, + }, { + "id": "corpse_mon_animal_mutant_flyer", + "fg": 25078, + "bg": 0, "rotates": false - }, - { - "id": "t_tree_pecan_harvested_season_spring", - "fg": 32813, - "bg": 32977, + },{ + "id": "mon_animal_mutant_swimmer", + "fg": 25079, + "bg": 967, "rotates": false - }, - { - "id": ["t_tree_pecan_harvested_season_summer", "t_tree_pecan_harvested"], - "fg": 32814, - "bg": 32977, + }, { + "id": "corpse_mon_animal_mutant_swimmer", + "fg": 25080, + "bg": 0, "rotates": false - }, - { - "id": "t_tree_pecan_harvested_season_autumn", - "fg": 32815, - "bg": 32977, + },{ + "id": "mon_animal_mutant_lurker", + "fg": 25081, + "bg": 967, "rotates": false - }, - { - "id": "t_tree_pecan_harvested_season_winter", - "fg": 32816, - "bg": 32978, + }, { + "id": "corpse_mon_animal_mutant_lurker", + "fg": 25082, + "bg": 0, "rotates": false - }, - { - "id": "t_tree_hazelnut_season_spring", - "fg": 32817, - "bg": 32977, + },{ + "id": "mon_animal_mutant_swallower", + "fg": 25083, + "bg": 967, "rotates": false - }, - { - "id": ["t_tree_hazelnut_season_summer", "t_tree_hazelnut"], - "fg": 32818, - "bg": 32977, + }, { + "id": "corpse_mon_animal_mutant_swallower", + "fg": 25084, + "bg": 0, "rotates": false - }, - { - "id": "t_tree_hazelnut_season_autumn", - "fg": 32819, - "bg": 32977, + },{ + "id": "mon_animal_mutant_babler", + "fg": 25085, + "bg": 967, "rotates": false - }, - { - "id": "t_tree_hazelnut_season_winter", - "fg": 32820, - "bg": 32978, + }, { + "id": "corpse_mon_animal_mutant_babler", + "fg": 25086, + "bg": 0, "rotates": false - }, - { - "id": "t_tree_hazelnut_harvested_season_spring", - "fg": 32821, - "bg": 32977, + },{ + "id": "mon_animal_mutant_gasser", + "fg": 25087, + "bg": 967, "rotates": false - }, + }, { + "id": "corpse_mon_animal_mutant_gasser", + "fg": 25088, + "bg": 0, + "rotates": false + },{ + "id": "mon_bird_mutant_songbird", + "fg": 25089, + "bg": 967, + "rotates": false + }, { + "id": "corpse_mon_bird_mutant_songbird", + "fg": 25090, + "bg": 0, + "rotates": false + },{ + "id": ["mon_bird_mutant_chick", "mon_bird_sick_chick"], + "fg": 25091, + "bg": 0, + "rotates": false + }, { + "id": ["corpse_mon_bird_mutant_chick", "corpse_mon_bird_sick_chick"], + "fg": 25092, + "bg": 0, + "rotates": false + },{ + "id": ["mon_bird_sick_malformed"], + "fg": 25093, + "bg": 967, + "rotates": false + }, { + "id": ["corpse_mon_bird_sick_malformed"], + "fg": 25094, + "bg": 0, + "rotates": false + },{ + "id": ["mon_bird_sick_irradiated"], + "fg": 25095, + "bg": 967, + "rotates": false + }, { - "id": ["t_tree_hazelnut_harvested_season_summer", "t_tree_hazelnut_harvested"], - "fg": 32822, - "bg": 32977, + "id": ["corpse_mon_bird_sick_irradiated"], + "fg": 25096, + "bg": 0, "rotates": false - }, + }, { - "id": "t_tree_hazelnut_harvested_season_autumn", - "fg": 32823, - "bg": 32977, + "id": ["mon_bird_sick_plague"], + "fg": 25097, + "bg": 967, "rotates": false - }, + }, { - "id": "t_tree_hazelnut_harvested_season_winter", - "fg": 32824, - "bg": 32978, + "id": ["corpse_mon_bird_sick_plague"], + "fg": 25098, + "bg": 0, "rotates": false }, { - "id": "t_tree_almond_season_spring", - "fg": 32825, - "bg": 32977, + "id": ["mon_bird_mutant_vultch"], + "fg": 25099, + "bg": 967, "rotates": false - }, + }, { - "id": ["t_tree_almond_season_summer", "t_tree_almond"], - "fg": 32826, - "bg": 32977, + "id": ["corpse_mon_bird_mutant_vultch"], + "fg": 25100, + "bg": 0, "rotates": false - }, + }, { - "id": "t_tree_almond_season_autumn", - "fg": 32827, - "bg": 32977, + "id": ["mon_bird_mutant_vultch_chick"], + "fg": 25101, + "bg": 967, "rotates": false - }, + }, { - "id": "t_tree_almond_season_winter", - "fg": 32828, - "bg": 32978, + "id": ["corpse_mon_bird_mutant_vultch_chick"], + "fg": 25102, + "bg": 0, "rotates": false }, { - "id": "t_tree_almond_harvested_season_spring", - "fg": 32829, - "bg": 32977, + "id": ["mon_bird_mutant_thing"], + "fg": 25103, + "bg": 967, "rotates": false - }, - { - "id": ["t_tree_almond_harvested_season_summer", "t_tree_almond_harvested"], - "fg": 32830, - "bg": 32977, + }, { + "id": ["mon_bird_mutant_iridescent"], + "fg": 25104, + "bg": 967, "rotates": false - }, + }, { - "id": "t_tree_almond_harvested_season_autumn", - "fg": 32831, - "bg": 32977, + "id": ["corpse_mon_bird_mutant_iridescent"], + "fg": 25105, + "bg": 0, "rotates": false - }, + },{ + "id": ["mon_bird_mutant_iridescent_chick"], + "fg": 25106, + "bg": 967, + "rotates": false + }, { - "id": "t_tree_almond_harvested_season_winter", - "fg": 32832, - "bg": 32978, + "id": ["corpse_mon_bird_mutant_iridescent_chick"], + "fg": 25107, + "bg": 0, "rotates": false - }, + },{ + "id": ["mon_bird_mutant_ghoul"], + "fg": 25108, + "bg": 967, + "rotates": false + }, { - "id": "t_tree_pistachio_season_spring", - "fg": 32833, - "bg": 32977, + "id": ["corpse_mon_bird_mutant_ghoul"], + "fg": 25109, + "bg": 0, "rotates": false - }, + },{ + "id": ["mon_bird_mutant_ghoul_chick"], + "fg": 25110, + "bg": 967, + "rotates": false + }, { - "id": ["t_tree_pistachio_season_summer", "t_tree_pistachio"], - "fg": 32834, - "bg": 32977, + "id": ["corpse_mon_bird_mutant_ghoul_chick"], + "fg": 25111, + "bg": 0, "rotates": false - }, + },{ + "id": ["mon_bird_mutant_elephant_chick"], + "fg": 25112, + "bg": 967, + "rotates": false + }, { - "id": "t_tree_pistachio_season_autumn", - "fg": 32835, - "bg": 32977, + "id": ["corpse_mon_bird_mutant_elephant_chick"], + "fg": 25113, + "bg": 0, "rotates": false - }, + }, { - "id": "t_tree_pistachio_season_winter", - "fg": 32836, - "bg": 32978, + "id": ["ammo_pouch"], + "fg": 25114, + "bg": 0, "rotates": false - }, + }, { - "id": "t_tree_pistachio_harvested_season_spring", - "fg": 32837, - "bg": 32977, + "id": ["overlay_worn_ammo_pouch"], + "fg": 25115, + "bg": 0, "rotates": false - }, + }, { + "id": ["battery_test"], + "fg": 25116, + "bg": 0, + "rotates": false + },{ + "id": ["ceramicdisks"], + "fg": 25117, + "bg": 0, + "rotates": false + }, { - "id": ["t_tree_pistachio_harvested_season_summer", "t_tree_pistachio_harvested"], - "fg": 32838, - "bg": 32977, + "id": "dragonskinempty", + "fg": 25118 + }, + { + "id": "overlay_worn_dragonskinempty", + "fg": 25119, "rotates": false - }, + }, + { + "id": "lucern_hammer", + "fg": 25120, + "rotates": false + }, { - "id": "t_tree_pistachio_harvested_season_autumn", - "fg": 32839, - "bg": 32977, + "id": "lucern_hammerfake", + "fg": 25121, "rotates": false - }, + }, { - "id": "t_tree_pistachio_harvested_season_winter", - "fg": 32840, - "bg": 32978, + "id": "manual_medievalpole", + "fg": 25122, "rotates": false }, - { - "id": "t_tree_mulberry_season_spring", - "fg": 32841, - "bg": 32977, + { + "id": "flaming_fist", + "fg": 25123, "rotates": false - }, + }, { - "id": ["t_tree_mulberry_season_summer", "t_tree_mulberry"], - "fg": 32842, - "bg": 32977, + "id": "overlay_wielded_flaming_fist", + "fg": 25124, "rotates": false - }, + }, { - "id": "t_tree_mulberry_season_autumn", - "fg": 32843, - "bg": 32977, + "id": "gauntlet_pounding", + "fg": 25125, "rotates": false - }, + }, { - "id": "t_tree_mulberry_season_winter", - "fg": 32844, - "bg": 32978, + "id": "overlay_wielded_gauntlet_pounding", + "fg": 25126, + "rotates": false + }, + { + "id": "druid_dust", + "fg": 25127, + "rotates": false + },{ + "id": "druid_seed", + "fg": 25128, "rotates": false }, { - "id": "t_tree_mulberry_harvested_season_spring", - "fg": 32845, - "bg": 32977, + "id": "wand_cone_cold_lesser", + "fg": 25130, "rotates": false - }, + }, { - "id": ["t_tree_mulberry_harvested_season_summer", "t_tree_mulberry_harvested"], - "fg": 32846, - "bg": 32977, + "id": "wand_cone_cold_minor", + "fg": 25131, "rotates": false - }, + }, { + "id": "wand_cone_cold_greater", + "fg": 25132, + "rotates": false + }, { + "id": "wand_iceball_lesser", + "fg": 25133, + "rotates": false + }, { - "id": "t_tree_mulberry_harvested_season_autumn", - "fg": 32847, - "bg": 32977, + "id": "wand_iceball_minor", + "fg": 25134, "rotates": false - }, + }, { - "id": "t_tree_mulberry_harvested_season_winter", - "fg": 32848, - "bg": 32978, + "id": "wand_iceball_greater", + "fg": 25135, "rotates": false }, { - "id": "t_tree_elderberry_season_spring", - "fg": 32849, - "bg": 32977, + "id": "wand_fireball_lesser", + "fg": 25136, "rotates": false - }, + }, { - "id": ["t_tree_elderberry_season_summer", "t_tree_elderberry"], - "fg": 32850, - "bg": 32977, + "id": "wand_fireball_minor", + "fg": 25137, "rotates": false - }, + }, { - "id": "t_tree_elderberry_season_autumn", - "fg": 32851, - "bg": 32977, + "id": "wand_fireball_greater", + "fg": 25138, "rotates": false - }, + }, { + "id": "wand_point_flare_lesser", + "fg": 25139, + "rotates": false + }, { - "id": "t_tree_elderberry_season_winter", - "fg": 32852, - "bg": 32978, + "id": "wand_point_flare_minor", + "fg": 25140, + "rotates": false + }, + { + "id": "wand_point_flare_greater", + "fg": 25141, "rotates": false }, { - "id": ["t_tree_elderberry_harvested_season_spring"], - "fg": 32853, - "bg": 32977, + "id": "wand_magic_missile_lesser", + "fg": 25142, "rotates": false - }, + }, { - "id": ["t_tree_elderberry_harvested_season_summer", "t_tree_elderberry"], - "fg": 32854, - "bg": 32977, + "id": "wand_magic_missile_minor", + "fg": 25143, "rotates": false - }, + }, { - "id": "t_tree_elderberry_harvested_season_autumn", - "fg": 32855, - "bg": 32977, + "id": "wand_magic_missile_greater", + "fg": 25144, "rotates": false - }, + }, { - "id": "t_tree_elderberry_harvested_season_winter", - "fg": 32856, - "bg": 32978, + "id": "wand_mana_beam_lesser", + "fg": 25145, "rotates": false - }, + }, { - "id": "t_tree_cottonwood_season_spring", - "fg": 32857, - "bg": 32977, + "id": "wand_mana_beam_minor", + "fg": 25146, "rotates": false - }, + }, { - "id": ["t_tree_cottonwood_season_summer", "t_tree_cottonwood"], - "fg": 32858, - "bg": 32977, + "id": "wand_mana_beam_greater", + "fg": 25147, "rotates": false - }, + }, { - "id": "t_tree_cottonwood_season_autumn", - "fg": 32859, - "bg": 32977, + "id": ["overlay_wielded_wand_cone_cold_lesser", "overlay_wielded_wand_iceball_lesser"], + "fg": 25148, "rotates": false - }, + }, { + "id": ["overlay_wielded_wand_cone_cold_minor", "overlay_wielded_wand_iceball_minor"], + "fg": 25149, + "rotates": false + }, { + "id": ["overlay_wielded_wand_cone_cold_greater", "overlay_wielded_wand_iceball_greater"], + "fg": 25150, + "rotates": false + }, + { - "id": "t_tree_cottonwood_season_winter", - "fg": 32860, - "bg": 32978, + "id": ["overlay_wielded_wand_fireball_lesser", "overlay_wielded_wand_point_flare_lesser"], + "fg": 25151, + "rotates": false + }, { + "id": ["overlay_wielded_wand_fireball_minor", "overlay_wielded_wand_point_flare_minor"], + "fg": 25152, + "rotates": false + },{ + "id": ["overlay_wielded_wand_fireball_greater", "overlay_wielded_wand_point_flare_greater"], + "fg": 25153, "rotates": false }, - { - "id": ["t_tree_elm_season_spring"], - "fg": 32861, - "bg": 32977, + + { + "id": ["overlay_wielded_wand_magic_missile_lesser", "overlay_wielded_wand_mana_beam_lesser"], + "fg": 25154, "rotates": false - }, + }, { + "id": ["overlay_wielded_wand_magic_missile_minor", "overlay_wielded_wand_mana_beam_minor"], + "fg": 25155, + "rotates": false + },{ + "id": ["overlay_wielded_wand_magic_missile_greater", "overlay_wielded_wand_mana_beam_greater"], + "fg": 25156, + "rotates": false + }, { - "id": ["t_tree_elm_season_summer", "t_tree_elm"], - "fg": 32862, - "bg": 32977, + "id": ["mon_dog_sick_scab"], + "fg": 25157, + "bg": 967, "rotates": false - }, + }, { - "id": "t_tree_elm_season_autumn", - "fg": 32863, - "bg": 32977, + "id": ["corpse_mon_dog_sick_scab"], + "fg": 25158, "rotates": false - }, + }, { - "id": "t_tree_elm_season_winter", - "fg": 32864, - "bg": 32978, + "id": ["mon_dog_sick_blister"], + "fg": 25159, + "bg": 967, "rotates": false }, { - "id": ["t_tree_apple_season_spring"], - "fg": 32865, - "bg": 32977, + "id": ["corpse_mon_dog_sick_blister"], + "fg": 25160, "rotates": false - }, + }, { - "id": ["t_tree_apple_season_summer", "t_tree_apple"], - "fg": 32866, - "bg": 32977, + "id": ["mon_dog_sick_pus"], + "fg": 25161, + "bg": 967, "rotates": false - }, + }, { - "id": "t_tree_apple_season_autumn", - "fg": 32867, - "bg": 32977, + "id": ["corpse_mon_dog_sick_pus"], + "fg": 25162, "rotates": false - }, + }, { - "id": "t_tree_apple_season_winter", - "fg": 32868, - "bg": 32978, + "id": ["mon_dog_sick_pup"], + "fg": 25163, + "bg": 967, "rotates": false }, { - "id": ["t_tree_apple_harvested_season_spring"], - "fg": 32869, - "bg": 32977, + "id": ["corpse_mon_dog_sick_pup"], + "fg": 25164, "rotates": false - }, + }, { - "id": ["t_tree_apple_harvested_season_summer", "t_tree_apple_harvested"], - "fg": 32870, - "bg": 32977, + "id": ["corpse_mon_dog_mutant_worm"], + "fg": 25165, "rotates": false - }, + }, { - "id": "t_tree_apple_harvested_season_autumn", - "fg": 32871, - "bg": 32977, + "id": ["mon_dog_mutant_worm_pup"], + "fg": 25166, + "bg": 967, "rotates": false - }, + }, { - "id": "t_tree_apple_harvested_season_winter", - "fg": 32872, - "bg": 32978, + "id": ["corpse_mon_dog_mutant_worm_pup"], + "fg": 25167, + "rotates": false + }, { + "id": ["mon_dog_mutant_happy"], + "fg": 25168, + "bg": 967, "rotates": false }, { - "id": ["t_tree_pear_season_spring"], - "fg": 32873, - "bg": 32977, + "id": ["corpse_mon_dog_mutant_happy"], + "fg": 25169, "rotates": false - }, - { - "id": ["t_tree_pear_season_summer", "t_tree_pear"], - "fg": 32874, - "bg": 32977, + }, { + "id": ["mon_dog_mutant_happy_pup"], + "fg": 25170, + "bg": 967, "rotates": false - }, + }, { - "id": "t_tree_pear_season_autumn", - "fg": 32875, - "bg": 32977, + "id": ["corpse_mon_dog_mutant_happy_pup"], + "fg": 25171, "rotates": false - }, + }, + { - "id": "t_tree_pear_season_winter", - "fg": 32876, - "bg": 32978, + "id": ["mon_dog_mutant_digiri"], + "fg": 25172, + "bg": 967, "rotates": false }, { - "id": ["t_tree_pear_harvested_season_spring"], - "fg": 32877, - "bg": 32977, + "id": ["corpse_mon_dog_mutant_digiri"], + "fg": 25173, "rotates": false - }, - { - "id": ["t_tree_pear_harvested_season_summer", "t_tree_pear_harvested"], - "fg": 32878, - "bg": 32977, + }, + + { + "id": ["mon_dog_mutant_digiri_pup"], + "fg": 25174, + "bg": 967, "rotates": false - }, + }, { - "id": "t_tree_pear_harvested_season_autumn", - "fg": 32879, - "bg": 32977, + "id": ["corpse_mon_dog_mutant_digiri_pup"], + "fg": 25175, "rotates": false - }, - { - "id": "t_tree_pear_harvested_season_winter", - "fg": 32880, - "bg": 32978, + }, { + "id": ["mon_dog_mutant_dire_pup"], + "fg": 25176, + "bg": 967, "rotates": false }, { - "id": ["t_tree_cherry_season_spring"], - "fg": 32881, - "bg": 32977, + "id": ["corpse_mon_dog_mutant_dire_pup"], + "fg": 25177, "rotates": false - }, - { - "id": ["t_tree_cherry_season_summer", "t_tree_cherry"], - "fg": 32882, - "bg": 32977, + }, { + "id": ["mon_cat_sick_hairless"], + "fg": 25178, + "bg": 967, "rotates": false - }, + }, { - "id": "t_tree_cherry_season_autumn", - "fg": 32883, - "bg": 32977, + "id": ["corpse_mon_cat_sick_hairless"], + "fg": 25179, "rotates": false - }, - { - "id": "t_tree_cherry_season_winter", - "fg": 32884, - "bg": 32978, + }, { + "id": ["mon_cat_sick_multilimbed"], + "fg": 25180, + "bg": 967, "rotates": false }, { - "id": ["t_tree_cherry_harvested_season_spring"], - "fg": 32885, - "bg": 32977, + "id": ["corpse_mon_cat_sick_multilimbed"], + "fg": 25181, "rotates": false - }, + }, { - "id": ["t_tree_cherry_harvested_season_summer", "t_tree_cherry_harvested"], - "fg": 32886, - "bg": 32977, + "id": ["mon_cat_mutant_venom"], + "fg": 25182, + "bg": 967, "rotates": false - }, + }, { - "id": "t_tree_cherry_harvested_season_autumn", - "fg": 32887, - "bg": 32977, + "id": ["corpse_mon_cat_mutant_venom"], + "fg": 25183, "rotates": false - }, - { - "id": "t_tree_cherry_harvested_season_winter", - "fg": 32888, - "bg": 32978, + }, + { + "id": ["mon_cat_mutant_vampire"], + "fg": 25184, + "bg": 967, "rotates": false }, { - "id": ["t_tree_peach_season_spring"], - "fg": 32889, - "bg": 32977, + "id": ["corpse_mon_cat_mutant_vampire"], + "fg": 25185, "rotates": false - }, + }, { - "id": ["t_tree_peach_season_summer", "t_tree_peach"], - "fg": 32890, - "bg": 32977, + "id": ["mon_cat_mutant_ink"], + "fg": 25186, + "bg": 967, "rotates": false - }, + }, { - "id": "t_tree_peach_season_autumn", - "fg": 32891, - "bg": 32977, + "id": ["corpse_mon_cat_mutant_ink"], + "fg": 25187, "rotates": false - }, - { - "id": "t_tree_peach_season_winter", - "fg": 32892, - "bg": 32978, + }, + { + "id": ["mon_cat_mutant_whip"], + "fg": 25188, + "bg": 967, "rotates": false }, { - "id": ["t_tree_peach_harvested_season_spring"], - "fg": 32893, - "bg": 32977, + "id": ["corpse_mon_cat_mutant_whip"], + "fg": 25189, "rotates": false - }, - { - "id": ["t_tree_peach_harvested_season_summer", "t_tree_peach_harvested"], - "fg": 32894, - "bg": 32977, + }, + + { + "id": ["mon_fish_sick_puke"], + "fg": 25190, + "bg": 0, "rotates": false - }, + }, { - "id": "t_tree_peach_harvested_season_autumn", - "fg": 32895, - "bg": 32977, + "id": ["corpse_mon_fish_sick_puke"], + "fg": 25191, "rotates": false - }, + }, { - "id": "t_tree_peach_harvested_season_winter", - "fg": 32896, - "bg": 32978, + "id": ["mon_fish_sick_finger"], + "fg": 25192, + "bg": 0, "rotates": false }, { - "id": ["t_tree_apricot_season_spring"], - "fg": 32897, - "bg": 32977, + "id": ["corpse_mon_fish_sick_finger"], + "fg": 25193, "rotates": false - }, - { - "id": ["t_tree_apricot_season_summer", "t_tree_apricot"], - "fg": 32898, - "bg": 32977, + }, + { + "id": ["mon_fish_sick_tumor"], + "fg": 25194, + "bg": 0, "rotates": false - }, + }, { - "id": "t_tree_apricot_season_autumn", - "fg": 32899, - "bg": 32977, + "id": ["corpse_mon_fish_sick_tumor"], + "fg": 25195, "rotates": false - }, + }, + { - "id": "t_tree_apricot_season_winter", - "fg": 32900, - "bg": 32978, + "id": ["mon_fish_mutant_angel"], + "fg": 25196, + "bg": 0, "rotates": false }, { - "id": ["t_tree_apricot_harvested_season_spring"], - "fg": 32901, - "bg": 32977, + "id": ["corpse_mon_fish_mutant_angel"], + "fg": 25197, "rotates": false - }, - { - "id": ["t_tree_apricot_harvested_season_summer", "t_tree_apricot_harvested"], - "fg": 32902, - "bg": 32977, + }, + + { + "id": ["mon_fish_mutant_bloat"], + "fg": 25198, + "bg": 0, "rotates": false - }, + }, { - "id": "t_tree_apricot_harvested_season_autumn", - "fg": 32903, - "bg": 32977, + "id": ["mon_fish_mutant_accordian"], + "fg": 25199, + "bg": 0, "rotates": false - }, + }, { - "id": "t_tree_apricot_harvested_season_winter", - "fg": 32904, - "bg": 32978, + "id": ["corpse_mon_fish_mutant_accordian"], + "fg": 25200, + "rotates": false + }, + + { + "id": ["mon_fish_mutant_whisper"], + "fg": 25201, + "bg": 0, "rotates": false }, { - "id": ["t_tree_plum_season_spring"], - "fg": 32905, - "bg": 32977, + "id": ["corpse_mon_fish_mutant_whisper"], + "fg": 25202, "rotates": false - }, - { - "id": ["t_tree_plum_season_summer", "t_tree_plum"], - "fg": 32906, - "bg": 32977, + }, { + "id": ["mon_fish_mutant_butter"], + "fg": 25203, + "bg": 0, "rotates": false - }, + }, { - "id": "t_tree_plum_season_autumn", - "fg": 32907, - "bg": 32977, + "id": ["corpse_mon_fish_mutant_butter"], + "fg": 25204, "rotates": false - }, + }, { - "id": "t_tree_plum_season_winter", - "fg": 32908, - "bg": 32978, + "id": ["mon_fish_mutant_spit"], + "fg": 25205, + "bg": 0, "rotates": false }, { - "id": ["t_tree_plum_harvested_season_spring"], - "fg": 32909, - "bg": 32977, + "id": ["corpse_mon_fish_mutant_spit"], + "fg": 25206, "rotates": false - }, - { + }, { + "id": ["mon_spider_fungus"], + "fg": 25207, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_spider_fungus"], + "fg": 25208, + "rotates": false + }, + { + "id": ["mon_zombie_gasbag_fungus"], + "fg": 25209, + "bg": 967, + "rotates": false + }, { + "id": ["mon_zombie_smoker_fungus"], + "fg": 25210, + "bg": 967, + "rotates": false + }, + { + "id": ["f_arcfurnace_full"], + "fg": 25211, + "bg": 0, + "rotates": false + }, + { + "id": ["f_autoclave_full"], + "fg": 25212, + "bg": 0, + "rotates": false + }, + { + "id": ["acetylene"], + "fg": 25213, + "bg": 0, + "rotates": false + }, + { + "id": ["acetylene_machine"], + "fg": 25214, + "bg": 0, + "rotates": false + }, + { + "id": ["autoclave"], + "fg": 25215, + "bg": 0, + "rotates": false + }, + { + "id": ["brew_mycus_wine", "wine_mycus"], + "fg": 25216, + "bg": 0, + "rotates": false + }, + { + "id": ["cac2powder"], + "fg": 25217, + "bg": 0, + "rotates": false + }, + { + "id": ["can_food_big"], + "fg": 25218, + "bg": 0, + "rotates": false + }, + { + "id": ["can_food_big_unsealed"], + "fg": 25219, + "bg": 0, + "rotates": false + }, + + { + "id": ["dogfood_canned", "dogfood"], + "fg": 25220, + "bg": 0, + "rotates": false + }, + { + "id": ["catfood_canned", "catfood"], + "fg": 25221, + "bg": 0, + "rotates": false + }, + { + "id": ["effective_emitter"], + "fg": 25222, + "bg": 0, + "rotates": false + }, + { + "id": ["fire_brick"], + "fg": 25223, + "bg": 0, + "rotates": false + }, { + "id": ["focusing_lens"], + "fg": 25224, + "bg": 0, + "rotates": false + }, + { + "id": ["oxygen_cylinder"], + "fg": 25225, + "bg": 0, + "rotates": false + }, { + "id": ["pouch_autoclave"], + "fg": 25226, + "bg": 0, + "rotates": false + }, + { + "id": ["signed_chit"], + "fg": 25227, + "bg": 0, + "rotates": false + }, + + { + "id": ["sponge"], + "fg": 25228, + "bg": 0, + "rotates": false + }, + { + "id": ["towel_hanger"], + "fg": 25229, + "bg": 0, + "rotates": false + },{ + "id": ["overlay_wielded_towel_hanger"], + "fg": 25230, + "bg": 0, + "rotates": false + }, + { + "id": ["vp_towel_hanger"], + "fg": 25231, + "bg": 0, + "rotates": false + }, + { + "id": ["unfinished_cac2"], + "fg": 25232, + "bg": 0, + "rotates": false + }, + { + "id": ["plasma_gun"], + "fg": 25233, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_wielded_plasma_gun"], + "fg": 25234, + "bg": 0, + "rotates": false + }, + { + "id": ["vp_mounted_plasma_gun"], + "fg": 25235, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_dragon_black_wyrmling"], + "fg": 25236, + "bg": 967, + "rotates": false + },{ + "id": ["corpse_mon_dragon_black_wyrmling"], + "fg": 25237, + "bg": 0, + "rotates": false + },{ + "id": ["dragon_black_scale"], + "fg": 25238, + "bg": 0, + "rotates": false + }, + { + "id": ["black_dragon_hide_raw"], + "fg": 25239, + "bg": 0, + "rotates": false + }, + { + "id": ["black_dragon_tanning_hide"], + "fg": 25240, + "bg": 0, + "rotates": false + }, + { + "id": ["black_dragon_tanned_hide"], + "fg": 25241, + "bg": 0, + "rotates": false + }, + { + "id": ["boots_black_dragon_scale"], + "fg": 25242, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_boots_black_dragon_scale", "overlay_worn_boots_black_dragon_hide"], + "fg": 25243, + "bg": 0, + "rotates": false + }, + { + "id": ["boots_black_dragon_hide"], + "fg": 25244, + "bg": 0, + "rotates": false + }, + { + "id": ["black_dragons"], + "fg": 25245, + "bg": 0, + "rotates": false + }, + { + "id": ["dragon_essence"], + "fg": 25246, + "bg": 0, + "rotates": false + },{ + "id": ["meat_dragon"], + "fg": 25247, + "bg": 0, + "rotates": false + }, + { + "id": ["gauntlets_black_dragon_scale"], + "fg": 25248, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_gauntlets_black_dragon_scale"], + "fg": 25249, + "bg": 0, + "rotates": false + }, { + "id": ["gloves_black_dragon_hide"], + "fg": 25250, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_gloves_black_dragon_hide"], + "fg": 25251, + "bg": 0, + "rotates": false + }, + { + "id": ["helmet_black_dragon_hide"], + "fg": 25252, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_helmet_black_dragon_hide"], + "fg": 25253, + "bg": 0, + "rotates": false + }, + { + "id": ["helmet_black_dragon_scale"], + "fg": 25254, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_helmet_black_dragon_scale"], + "fg": 25255, + "bg": 0, + "rotates": false + }, + { + "id": ["diveknife"], + "fg": 25256, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_wielded_diveknife"], + "fg": 25257, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_wielded_knife_butcher"], + "fg": 25258, + "bg": 0, + "rotates": false + }, { + "id": ["overlay_wielded_knife_chef"], + "fg": 25259, + "bg": 0, + "rotates": false + },{ + "id": ["overlay_wielded_base_kitchen_knife"], + "fg": 25260, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_wielded_knife_paring"], + "fg": 25261, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_wielded_knife_vegetable_cleaver"], + "fg": 25262, + "bg": 0, + "rotates": false + }, + { + "id": ["suit_black_dragon_scale"], + "fg": 25263, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_suit_black_dragon_scale"], + "fg": 25264, + "bg": 0, + "rotates": false + }, + { + "id": ["suit_black_dragon_hide"], + "fg": 25265, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_suit_black_dragon_hide"], + "fg": 25266, + "bg": 0, + "rotates": false + }, + { + "id": ["bead_ear"], + "fg": 25267, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_bead_ear"], + "fg": 25268, + "bg": 0, + "rotates": false + }, + { + "id": ["bracelet_friendship"], + "fg": 25269, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_bracelet_friendship"], + "fg": 25270, + "bg": 0, + "rotates": false + }, { + "id": ["bronze_medal"], + "fg": 25271, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_bronze_medal"], + "fg": 25272, + "bg": 0, + "rotates": false + }, { + "id": ["silver_medal"], + "fg": 25273, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_silver_medal"], + "fg": 25274, + "bg": 0, + "rotates": false + }, { + "id": ["gold_medal"], + "fg": 25275, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_gold_medal"], + "fg": 25276, + "bg": 0, + "rotates": false + }, + { + "id": ["copper_hairpin"], + "fg": 25277, + "bg": 0, + "rotates": false + }, { + "id": ["silver_hairpin"], + "fg": 25278, + "bg": 0, + "rotates": false + }, { + "id": ["gold_hairpin"], + "fg": 25279, + "bg": 0, + "rotates": false + }, { + "id": ["platinum_hairpin"], + "fg": 25280, + "bg": 0, + "rotates": false + }, + { + "id": ["copper_locket"], + "fg": 25281, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_copper_locket"], + "fg": 25282, + "bg": 0, + "rotates": false + }, { + "id": ["silver_locket"], + "fg": 25283, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_silver_locket"], + "fg": 25284, + "bg": 0, + "rotates": false + }, + { + "id": ["gold_locket"], + "fg": 25285, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_gold_locket"], + "fg": 25286, + "bg": 0, + "rotates": false + }, + { + "id": ["platinum_locket"], + "fg": 25287, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_platinum_locket"], + "fg": 25288, + "bg": 0, + "rotates": false + }, { + "id": ["copper_necklace"], + "fg": 25289, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_copper_necklace"], + "fg": 25290, + "bg": 0, + "rotates": false + }, { + "id": ["silver_necklace"], + "fg": 25291, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_silver_necklace"], + "fg": 25292, + "bg": 0, + "rotates": false + }, + { + "id": ["gold_necklace"], + "fg": 25293, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_gold_necklace"], + "fg": 25294, + "bg": 0, + "rotates": false + }, + { + "id": ["platinum_necklace"], + "fg": 25295, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_platinum_necklace"], + "fg": 25296, + "bg": 0, + "rotates": false + }, + { + "id": ["copper_ring"], + "fg": 25297, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_copper_ring"], + "fg": 25298, + "bg": 0, + "rotates": false + }, { + "id": ["silver_ring"], + "fg": 25299, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_silver_ring"], + "fg": 25300, + "bg": 0, + "rotates": false + }, + { + "id": ["gold_ring"], + "fg": 25301, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_gold_ring"], + "fg": 25302, + "bg": 0, + "rotates": false + }, + { + "id": ["platinum_ring"], + "fg": 25303, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_platinum_ring"], + "fg": 25304, + "bg": 0, + "rotates": false + }, { + "id": ["ring_engagement"], + "fg": 25305, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_ring_engagement"], + "fg": 25306, + "bg": 0, + "rotates": false + }, { + "id": ["ring_purity"], + "fg": 25307, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_ring_purity"], + "fg": 25308, + "bg": 0, + "rotates": false + }, + { + "id": ["ring_signet"], + "fg": 25309, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_ring_signet"], + "fg": 25310, + "bg": 0, + "rotates": false + }, + { + "id": ["ring_wedding"], + "fg": 25311, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_ring_wedding"], + "fg": 25312, + "bg": 0, + "rotates": false + }, + { + "id": ["cufflinks"], + "fg": 25313, + "bg": 0, + "rotates": false + }, + { + "id": ["cufflinks_intricate"], + "fg": 25314, + "bg": 0, + "rotates": false + }, + { + "id": ["claw_bar"], + "fg": 25315, + "bg": 0, + "rotates": false + },{ + "id": ["overlay_wielded_claw_bar"], + "fg": 25316, + "bg": 0, + "rotates": false + }, { + "id": ["recon_mech_laser"], + "fg": 25317, + "bg": 0, + "rotates": false + },{ + "id": ["overlay_wielded_recon_mech_laser"], + "fg": 25318, + "bg": 0, + "rotates": false + },{ + "id": ["gatling_mech_laser"], + "fg": 25319, + "bg": 0, + "rotates": false + },{ + "id": ["overlay_wielded_gatling_mech_laser"], + "fg": 25320, + "bg": 0, + "rotates": false + },{ + "id": ["huge_atomic_battery_cell"], + "fg": 25321, + "bg": 0, + "rotates": false + }, + { + "id": ["jade_brooch"], + "fg": 25322, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_jade_brooch"], + "fg": 25323, + "bg": 0, + "rotates": false + }, { + "id": ["platinum_bracelet"], + "fg": 25324, + "bg": 0, + "rotates": false + }, + { + "id": ["platinum_dental_grill"], + "fg": 25325, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_platinum_dental_grill"], + "fg": 25326, + "bg": 0, + "rotates": false + }, + { + "id": ["platinum_ear"], + "fg": 25327, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_platinum_ear"], + "fg": 25328, + "bg": 0, + "rotates": false + }, + { + "id": ["platinum_watch"], + "fg": 25329, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_platinum_watch"], + "fg": 25330, + "bg": 0, + "rotates": false + }, { + "id": ["silver_watch"], + "fg": 25331, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_silver_watch"], + "fg": 25332, + "bg": 0, + "rotates": false + }, { + "id": ["tie_bow"], + "fg": 25333, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_tie_bow"], + "fg": 25334, + "bg": 0, + "rotates": false + }, { + "id": ["tie_clipon"], + "fg": 25335, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_tie_clipon"], + "fg": 25336, + "bg": 0, + "rotates": false + }, + { + "id": ["tie_necktie"], + "fg": 25337, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_tie_necktie"], + "fg": 25338, + "bg": 0, + "rotates": false + }, + { + "id": ["tie_skinny"], + "fg": 25339, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_worn_tie_skinny"], + "fg": 25340, + "bg": 0, + "rotates": false + }, + { + "id": ["t_dirt_barren"], + "fg": [ + { "weight":40, "sprite":25341}, + { "weight":40, "sprite":25342}, + { "weight":40, "sprite":25343}, + { "weight":40, "sprite":25344}, + { "weight":1, "sprite":25345} + ], + "bg": 0, + "rotates": false + }, + { + "id": ["f_seat_airplane"], + "fg": 25346, + "bg": 0, + "rotates": false + }, + { + "id": ["crash_axe"], + "fg": 25347, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_wielded_crash_axe"], + "fg": 25348, + "bg": 0, + "rotates": false + }, + { + "id": ["long_undertop_sleeveless"], + "fg": 25349, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_female_worn_long_undertop_sleeveless"], + "fg": 25350, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_male_worn_long_undertop_sleeveless"], + "fg": 25351, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_snake_sick_molting"], + "fg": 25352, + "bg": 0, + "rotates": false + }, + { + "id": ["corpse_mon_snake_sick_molting"], + "fg": 25353, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_snake_mutant_jaculus"], + "fg": 25354, + "bg": 0, + "rotates": false + }, + { + "id": ["corpse_mon_snake_mutant_jaculus"], + "fg": 25355, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_snake_mutant_bone"], + "fg": 25356, + "bg": 0, + "rotates": false + }, + { + "id": ["corpse_mon_snake_mutant_bone"], + "fg": 25357, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_snake_mutant_frostbite"], + "fg": 25358, + "bg": 0, + "rotates": false + }, + { + "id": ["corpse_mon_snake_mutant_frostbite"], + "fg": 25359, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_frog_devil"], + "fg": 25360, + "bg": 0, + "rotates": false + }, + { + "id": ["corpse_mon_frog_devil"], + "fg": 25361, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_rat_mutant_plague"], + "fg": 25362, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_rat_mutant_plague"], + "fg": 25363, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_rat_mutant_piranha"], + "fg": 25364, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_rat_mutant_piranha"], + "fg": 25365, + "bg": 0, + "rotates": false + },{ + "id": ["mon_rat_mutant_creature"], + "fg": 25366, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_rat_mutant_creature"], + "fg": 25367, + "bg": 0, + "rotates": false + },{ + "id": ["mon_cow_sick_twisthorn"], + "fg": 25368, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_cow_sick_twisthorn"], + "fg": 25369, + "bg": 0, + "rotates": false + },{ + "id": ["mon_cow_sick_obese"], + "fg": 25370, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_cow_sick_obese"], + "fg": 25371, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_zombie_gasbag_immobile"], + "fg": 25372, + "bg": 967, + "rotates": false + }, + { + "id": ["300blk_ss", "300blk", "reloaded_300blk"], + "fg": 25373, + "bg": 0, + "rotates": false + }, + { + "id": ["acr_300blk"], + "fg": 25374, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_wielded_acr_300blk"], + "fg": 25375, + "bg": 0, + "rotates": false + },{ + "id": ["ar15_retool_300blk"], + "fg": 25376, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_wielded_ar15_retool_300blk"], + "fg": 25377, + "bg": 0, + "rotates": false + },{ + "id": ["iwi_tavor_x95_300blk"], + "fg": 25378, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_wielded_iwi_tavor_x95_300blk"], + "fg": 25379, + "bg": 0, + "rotates": false + },{ + "id": ["backpack_hiking"], + "fg": 25380, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_male_worn_backpack_hiking"], + "fg": 25381, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_female_worn_backpack_hiking"], + "fg": 25382, + "bg": 0, + "rotates": false + }, + { + "id": ["backpack_tactical_large"], + "fg": 25383, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_male_worn_backpack_tactical_large"], + "fg": 25384, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_female_worn_backpack_tactical_large"], + "fg": 25385, + "bg": 0, + "rotates": false + }, + { + "id": ["bigback"], + "fg": 25386, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_male_worn_bigback"], + "fg": 25387, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_female_worn_bigback"], + "fg": 25388, + "bg": 0, + "rotates": false + }, + { + "id": ["petpack"], + "fg": 25389, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_male_worn_petpack"], + "fg": 25390, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_female_worn_petpack"], + "fg": 25391, + "bg": 0, + "rotates": false + }, + { + "id": ["travelpack"], + "fg": 25392, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_male_worn_travelpack"], + "fg": 25393, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_female_worn_travelpack"], + "fg": 25394, + "bg": 0, + "rotates": false + }, + { + "id": ["insecticidalbomb", "insecticidalbomb_act", "insecticidalbomb_makeshift", "insecticidalbomb_makeshift_act"], + "fg": 25395, + "bg": 0, + "rotates": false + }, + { + "id": ["fungicidalbomb", "fungicidalbomb_act", "fungicidalbomb_makeshift", "fungicidalbomb_makeshift_act"], + "fg": 25396, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_cow_mutant_ironhorn"], + "fg": 25397, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_cow_mutant_ironhorn"], + "fg": 25398, + "bg": 0, + "rotates": false + }, { + "id": ["mon_cow_calf_mutant_ironhorn"], + "fg": 25399, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_cow_calf_mutant_ironhorn"], + "fg": 25400, + "bg": 0, + "rotates": false + }, { + "id": ["mon_cow_mutant_auroch"], + "fg": 25401, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_cow_mutant_auroch"], + "fg": 25402, + "bg": 0, + "rotates": false + }, { + "id": ["mon_cow_calf_mutant_auroch"], + "fg": 25403, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_cow_calf_mutant_auroch"], + "fg": 25404, + "bg": 0, + "rotates": false + }, { + "id": ["mon_cow_mutant_moss"], + "fg": 25405, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_cow_mutant_moss"], + "fg": 25406, + "bg": 0, + "rotates": false + }, { + "id": ["mon_cow_calf_mutant_moss"], + "fg": 25407, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_cow_calf_mutant_moss"], + "fg": 25408, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_deer_sick_crying"], + "fg": 25409, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_deer_sick_crying"], + "fg": 25410, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_deer_sick_burnt"], + "fg": 25411, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_deer_sick_burnt"], + "fg": 25412, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_horse_sick_famine"], + "fg": 25413, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_horse_sick_famine"], + "fg": 25414, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_horse_sick_glue"], + "fg": 25415, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_horse_sick_glue"], + "fg": 25416, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_sheep_sick_naked"], + "fg": 25417, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_sheep_sick_naked"], + "fg": 25418, + "bg": 0, + "rotates": false + }, { + "id": ["mon_sheep_sick_gamma"], + "fg": 25419, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_sheep_sick_gamma"], + "fg": 25420, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_ungulate_mutant_glass"], + "fg": 25421, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_ungulate_mutant_glass"], + "fg": 25422, + "bg": 0, + "rotates": false + }, + { + "id": ["t_laminated_glass"], + "fg": [ + { "weight":1000, "sprite":25423}, + { "weight":1, "sprite":25424}, + { "weight":1, "sprite":25425} + ], + "bg": 5010, + "rotates": false + }, + { + "id": ["t_laminated_door_glass_c"], + "fg": 25426, + "bg": 5010, + "rotates": false + }, + { + "id": ["t_laminated_door_glass_o"], + "fg": 25427, + "bg": 5010, + "rotates": false + }, { + "id": ["t_linoleum_gray_no_roof"], + "fg": [ + { "weight":1000, "sprite":25428}, + { "weight":1, "sprite":27720}, + { "weight":1, "sprite":27721}, + { "weight":1, "sprite":27722}, + { "weight":1, "sprite":27723}, + { "weight":1, "sprite":27724} + ], + "bg": 5010, + "rotates": false + }, + { + "id": ["t_linoleum_white_no_roof"], + "fg": [ + { "weight":1000, "sprite":25429}, + { "weight":1, "sprite":27725}, + { "weight":1, "sprite":27726}, + { "weight":1, "sprite":27727}, + { "weight":1, "sprite":27728}, + { "weight":1, "sprite":27729}, + { "weight":1, "sprite":27730}, + { "weight":1, "sprite":27731}, + { "weight":1, "sprite":27732} + ], + "bg": 5010, + "rotates": false + }, + { + "id": ["t_ballistic_glass"], + "fg": 25430, + "bg": 5010, + "rotates": false + }, + { + "id": ["t_ballistic_door_glass_c"], + "fg": 25431, + "bg": 5010, + "rotates": false + }, + { + "id": ["t_ballistic_door_glass_o"], + "fg": 25432, + "bg": 5010, + "rotates": false + }, + + { + "id": ["pet_carrier_wooden"], + "fg": 25433, + "bg": 0, + "rotates": false + }, { + "id": ["shot_speedloader6", "shot_speedloader8"], + "fg": 25434, + "bg": 0, + "rotates": false + }, { + "id": ["mon_ungulate_mutant_unicorn"], + "fg": 25435, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_ungulate_mutant_unicorn"], + "fg": 25436, + "bg": 0, + "rotates": false + }, { + "id": ["mon_ungulate_mutant_brat"], + "fg": 25437, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_ungulate_mutant_brat"], + "fg": 25438, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_ungulate_mutant_brat"], + "fg": 25437, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_ungulate_mutant_brat"], + "fg": 25438, + "bg": 0, + "rotates": false + }, { + "id": ["mon_pig_sick_fly"], + "fg": 25439, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_pig_sick_fly"], + "fg": 25440, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_pig_sick_tumor"], + "fg": 25441, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_pig_sick_tumor"], + "fg": 25442, + "bg": 0, + "rotates": false + }, { + "id": ["mon_pig_mutant_rhino"], + "fg": 25443, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_pig_mutant_rhino"], + "fg": 25444, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_pig_piglet_mutant_rhino"], + "fg": 25445, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_pig_piglet_mutant_rhino"], + "fg": 25446, + "bg": 0, + "rotates": false + }, { + "id": ["mon_pig_mutant_quill"], + "fg": 25447, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_pig_mutant_quill"], + "fg": 25448, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_pig_piglet_mutant_quill"], + "fg": 25449, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_pig_piglet_mutant_quill"], + "fg": 25450, + "bg": 0, + "rotates": false + }, + { + "id": ["bile_spit", "fake_bilespit"], + "fg": 25451, + "bg": 0, + "rotates": false + }, + { + "id": ["egg_bird_mutant_elephant"], + "fg": 25452, + "bg": 0, + "rotates": false + }, + { + "id": ["egg_bird_mutant_ghoul"], + "fg": 25453, + "bg": 0, + "rotates": false + },{ + "id": ["egg_bird_mutant_iridescent"], + "fg": 25454, + "bg": 0, + "rotates": false + }, + { + "id": ["egg_bird_mutant_vultch"], + "fg": 25455, + "bg": 0, + "rotates": false + }, + { + "id": ["egg_songbird"], + "fg": 25456, + "bg": 0, + "rotates": false + }, + { + "id": ["mucus_spit"], + "fg": 25457, + "bg": 0, + "rotates": false + }, + { + "id": ["plut_slurry_free"], + "fg": 25458, + "bg": 0, + "rotates": false + },{ + "id": ["mon_small_bug"], + "fg": 25459, + "bg": 0, + "rotates": false + }, + { + "id": ["corpse_mon_small_bug"], + "fg": 25460, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_giant_beetle"], + "fg": 25463, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_giant_beetle"], + "fg": 25464, + "bg": 0, + "rotates": false + }, + { + "id": ["gelled_gasoline"], + "fg": 25465, + "bg": 0, + "rotates": false + }, + { + "id": ["shillelagh"], + "fg": 25466, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_wielded_shillelagh"], + "fg": 25467, + "bg": 0, + "rotates": false + }, { + "id": ["shillelagh_fake"], + "fg": 25468, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_wielded_shillelagh_fake"], + "fg": 25469, + "bg": 0, + "rotates": false + },{ + "id": ["shillelagh_weighted"], + "fg": 25470, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_wielded_shillelagh_weighted"], + "fg": 25471, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_large_beetle_larva"], + "fg": 25472, + "bg": 0, + "rotates": false + }, + { + "id": ["corpse_mon_large_beetle_larva"], + "fg": 25473, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_tame_large_beetle_larva"], + "fg": 25472, + "bg": 25461, + "rotates": false + }, + { + "id": ["corpse_mon_tame_large_beetle_larva"], + "fg": 25473, + "bg": 0, + "rotates": false + }, { + "id": ["mon_small_butterfly"], + "fg": 25474, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_small_butterfly"], + "fg": 25475, + "bg": 0, + "rotates": false + },{ + "id": ["mon_small_butterfly_chrysalis"], + "fg": 25476, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_small_butterfly_chrysalis"], + "fg": 25477, + "bg": 0, + "rotates": false + },{ + "id": ["mon_small_butterfly_larva"], + "fg": 25478, + "bg": 0, + "rotates": false + }, + { + "id": ["corpse_mon_small_butterfly_larva"], + "fg": 25479, + "bg": 0, + "rotates": false + },{ + "id": ["mon_large_centipede"], + "fg": 25480, + "bg": 0, + "rotates": false + }, + { + "id": ["corpse_mon_large_centipede"], + "fg": 25481, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_small_dragonfly"], + "fg": 25482, + "bg": 0, + "rotates": false + }, + { + "id": ["corpse_mon_small_dragonfly"], + "fg": 25483, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_tame_small_dragonfly"], + "fg": 25482, + "bg": 25461, + "rotates": false + }, + { + "id": ["corpse_mon_tame_small_dragonfly"], + "fg": 25483, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_large_dragonfly"], + "fg": 25484, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_large_dragonfly"], + "fg": 25485, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_small_firefly"], + "fg": 25486, + "bg": 0, + "rotates": false + }, + { + "id": ["corpse_mon_small_firefly"], + "fg": 25487, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_giant_fly"], + "fg": 25488, + "bg": 0, + "rotates": false + }, + { + "id": ["corpse_mon_giant_fly"], + "fg": 25489, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_small_fly_larva"], + "fg": 25490, + "bg": 0, + "rotates": false + }, + { + "id": ["corpse_mon_small_fly_larva"], + "fg": 25491, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_tame_small_fly_larva"], + "fg": 25490, + "bg": 25461, + "rotates": false + }, + { + "id": ["corpse_mon_tame_small_fly_larva"], + "fg": 25491, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_small_moth"], + "fg": 25492, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_small_moth"], + "fg": 25493, + "bg": 0, + "rotates": false + }, { + "id": ["mon_small_mosquito_larva"], + "fg": 25494, + "bg": 0, + "rotates": false + }, + { + "id": ["corpse_mon_small_mosquito_larva"], + "fg": 25495, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_small_spider"], + "fg": 25496, + "bg": 0, + "rotates": false + }, + { + "id": ["corpse_mon_small_spider"], + "fg": 25497, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_small_jumping_spider"], + "fg": 25498, + "bg": 0, + "rotates": false + }, + { + "id": ["corpse_mon_small_jumping_spider"], + "fg": 25499, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_tame_small_jumping_spider"], + "fg": 25498, + "bg": 25500, + "rotates": false + }, + { + "id": ["corpse_mon_tame_small_jumping_spider"], + "fg": 25499, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_giant_jumping_spider"], + "fg": 25501, + "bg": 0, + "rotates": false + }, + { + "id": ["corpse_mon_giant_jumping_spider"], + "fg": 25502, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_small_trapdoor_spider"], + "fg": 25503, + "bg": 0, + "rotates": false + }, + { + "id": ["corpse_mon_small_trapdoor_spider"], + "fg": 25504, + "bg": 0, + "rotates": false + }, { + "id": ["mon_tame_small_trapdoor_spider"], + "fg": 25503, + "bg": 25500, + "rotates": false + }, + { + "id": ["corpse_mon_tame_small_trapdoor_spider"], + "fg": 25504, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_large_trapdoor_spider"], + "fg": 25505, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_large_trapdoor_spider"], + "fg": 25506, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_large_web_spider"], + "fg": 25507, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_large_web_spider"], + "fg": 25508, + "bg": 0, + "rotates": false + }, { + "id": ["corpse_mon_mega_web_spider"], + "fg": 25509, + "bg": 0, + "rotates": false + }, { + "id": ["mon_small_wolf_spider"], + "fg": 25510, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_tame_small_wolf_spider"], + "fg": 25510, + "bg": 25500, + "rotates": false + }, + { + "id": ["corpse_mon_small_wolf_spider", "corpse_mon_tame_small_wolf_spider"], + "fg": 25511, + "bg": 0, + "rotates": false + }, + { + "id": ["mon_large_wolf_spider"], + "fg": 25512, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_large_wolf_spider"], + "fg": 25513, + "bg": 0, + "rotates": false + }, + { + "id": ["acid_free"], + "fg": 25514, + "bg": 0, + "rotates": false + }, + { + "id": ["egg_acid_ant", "egg_bee", "egg_beetle", "egg_blackwidow_spider", "egg_butterfly", "egg_cellar_spider", "egg_centipede", "egg_dragonfly", "egg_fly", "egg_jumping_spider", "egg_mosquito", "egg_queen_bee", "egg_tame_acid_ant", "egg_tame_ant", "egg_tame_bee", "egg_tame_beetle", "egg_tame_dragonfly", "egg_tame_fly", "egg_tame_jumping_spider", "egg_tame_trapdoor_spider", "egg_tame_wasp", "egg_tame_web_spider", "egg_tame_wolf_spider", "egg_trapdoor_spider", "egg_web_spider", "egg_wolf_spider"], + "fg": 25515, + "bg": 0, + "rotates": false + }, { + "id": ["animist_doll_zombie"], + "fg": 25516, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_wielded_animist_doll_zombie"], + "fg": 25517, + "bg": 0, + "rotates": false + }, { + "id": ["animist_doll_skeleton"], + "fg": 25518, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_wielded_animist_doll_skeleton"], + "fg": 25519, + "bg": 0, + "rotates": false + }, + { + "id": ["animist_doll_decayed_pouncer"], + "fg": 25520, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_wielded_animist_doll_decayed_pouncer"], + "fg": 25521, + "bg": 0, + "rotates": false + }, { + "id": ["necro_basic"], + "fg": 25522, + "bg": 0, + "rotates": false + }, + { + "id": ["twisted_restore_potion", "twisted_restore_potion_improved"], + "fg": 25523, + "bg": 0, + "rotates": false + }, { + "id": ["rune_animist_weapon"], + "fg": 25524, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_wielded_rune_animist_weapon"], + "fg": 25525, + "bg": 0, + "rotates": false + },{ + "id": ["rune_biomancer_weapon"], + "fg": 25526, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_wielded_rune_biomancer_weapon"], + "fg": 25527, + "bg": 0, + "rotates": false + },{ + "id": ["rune_druid_weapon"], + "fg": 25528, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_wielded_rune_druid_weapon"], + "fg": 25529, + "bg": 0, + "rotates": false + },{ + "id": ["rune_earthshaper_weapon"], + "fg": 25530, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_wielded_rune_earthshaper_weapon"], + "fg": 25531, + "bg": 0, + "rotates": false + },{ + "id": ["rune_kelvinist_weapon"], + "fg": 25532, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_wielded_rune_kelvinist_weapon"], + "fg": 25533, + "bg": 0, + "rotates": false + },{ + "id": ["rune_magus_weapon"], + "fg": 25534, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_wielded_rune_magus_weapon"], + "fg": 25535, + "bg": 0, + "rotates": false + },{ + "id": ["rune_stormshaper_weapon"], + "fg": 25536, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_wielded_rune_stormshaper_weapon"], + "fg": 25537, + "bg": 0, + "rotates": false + },{ + "id": ["rune_technomancer_weapon"], + "fg": 25538, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_wielded_rune_technomancer_weapon"], + "fg": 25539, + "bg": 0, + "rotates": false + },{ + "id": ["mon_mi_go_scout"], + "fg": 25540, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_mi_go_scout"], + "fg": 25541, + "bg": 0, + "rotates": false + }, + { + "id": ["migo_bio_gun"], + "fg": 25542, + "bg": 0, + "rotates": false + }, + { + "id": ["RPG-7_og7v"], + "fg": 25543, + "bg": 0, + "rotates": false + }, + { + "id": ["RPG-7_pg7vr"], + "fg": 25544, + "bg": 0, + "rotates": false + }, + { + "id": ["RPG-7_tbg7v"], + "fg": 25545, + "bg": 0, + "rotates": false + }, { + "id": ["blackjack", "makeshift_sap"], + "fg": 25546, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_wielded_blackjack", "overlay_wielded_makeshift_sap"], + "fg": 25547, + "bg": 0, + "rotates": false + }, + { + "id": ["sandwich_fairy"], + "fg": 25548, + "bg": 0, + "rotates": false + }, { + "id": ["sprinkles"], + "fg": 25549, + "bg": 0, + "rotates": false + }, + { + "id": ["wash_kit"], + "fg": 25550, + "bg": 0, + "rotates": false + }, + { + "id": ["t_metal_floor_no_roof"], + "fg": 25551, + "bg": 0, + "rotates": false + }, + { + "id": ["vp_ram_mattress"], + "fg": 25552, + "bg": 0, + "rotates": true + }, + { + "id": ["mon_zombie_gasbag_impaler"], + "fg": 25553, + "bg": 967, + "rotates": false + }, + { + "id": ["corpse_mon_zombie_gasbag_impaler"], + "fg": 25554, + "bg": 0, + "rotates": true + }, + { + "id": ["barb_launcher", "barb_paralysis"], + "fg": 25555, + "bg": 0, + "rotates": true + }, + { + "id": ["hollow_cane"], + "fg": 25556, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_wielded_hollow_cane"], + "fg": 25557, + "bg": 0, + "rotates": true + }, + { + "id": ["sword_cane"], + "fg": 25558, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_wielded_sword_cane"], + "fg": 25559, + "bg": 0, + "rotates": true + }, { + "id": ["cz75"], + "fg": 25560, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_wielded_cz75"], + "fg": 25561, + "bg": 0, + "rotates": true + }, + { + "id": ["cz75mag_12rd"], + "fg": 25562, + "bg": 0, + "rotates": true + }, + { + "id": ["cz75mag_20rd"], + "fg": 25563, + "bg": 0, + "rotates": true + },{ + "id": ["cz75mag_26rd"], + "fg": 25564, + "bg": 0, + "rotates": true + },{ + "id": ["hptc9"], + "fg": 25565, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_wielded_hptc9"], + "fg": 25566, + "bg": 0, + "rotates": true + }, { + "id": ["hptc9mag_8rd"], + "fg": 25567, + "bg": 0, + "rotates": true + }, + { + "id": ["hptc9mag_10rd"], + "fg": 25568, + "bg": 0, + "rotates": true + },{ + "id": ["hptc9mag_15rd"], + "fg": 25569, + "bg": 0, + "rotates": true + },{ + "id": ["hi_power_40"], + "fg": 25570, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_wielded_hi_power_40"], + "fg": 25571, + "bg": 0, + "rotates": true + }, + { + "id": ["bhp40mag"], + "fg": 25572, + "bg": 0, + "rotates": true + }, { + "id": ["hi_power_9mm"], + "fg": 25573, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_wielded_hi_power_9mm"], + "fg": 25574, + "bg": 0, + "rotates": true + }, + { + "id": ["bhp9mag_13rd", "bhp9mag_15rd"], + "fg": 25575, + "bg": 0, + "rotates": true + }, { + "id": ["hptcf380"], + "fg": 25576, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_wielded_hptcf380"], + "fg": 25577, + "bg": 0, + "rotates": true + }, + { + "id": ["hptcf380mag_10rd", "hptcf380mag_8rd"], + "fg": 25578, + "bg": 0, + "rotates": true + }, + { + "id": ["hptjcp"], + "fg": 25579, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_wielded_hptjcp"], + "fg": 25580, + "bg": 0, + "rotates": true + }, + { + "id": ["hptjcpmag"], + "fg": 25581, + "bg": 0, + "rotates": true + }, + { + "id": ["hptjhp"], + "fg": 25582, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_wielded_hptjhp"], + "fg": 25583, + "bg": 0, + "rotates": true + }, + { + "id": ["hptjhpmag"], + "fg": 25584, + "bg": 0, + "rotates": true + }, { + "id": ["walther_ccp"], + "fg": 25585, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_wielded_walther_ccp"], + "fg": 25586, + "bg": 0, + "rotates": true + }, + { + "id": ["ccpmag"], + "fg": 25587, + "bg": 0, + "rotates": true + }, { + "id": ["walther_p22"], + "fg": 25588, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_wielded_walther_p22"], + "fg": 25589, + "bg": 0, + "rotates": true + }, + { + "id": ["wp22mag"], + "fg": 25590, + "bg": 0, + "rotates": true + }, { + "id": ["walther_p38"], + "fg": 25591, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_wielded_walther_p38"], + "fg": 25592, + "bg": 0, + "rotates": true + }, + { + "id": ["p38mag"], + "fg": 25593, + "bg": 0, + "rotates": true + }, { + "id": ["walther_ppq_40"], + "fg": 25594, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_wielded_walther_ppq_40"], + "fg": 25595, + "bg": 0, + "rotates": true + }, + { + "id": ["ppq40mag_10rd", "ppq40mag_12rd", "ppq40mag_14rd"], + "fg": 25596, + "bg": 0, + "rotates": true + }, + { + "id": ["walther_ppq_45"], + "fg": 25597, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_wielded_walther_ppq_45"], + "fg": 25598, + "bg": 0, + "rotates": true + }, + { + "id": ["ppq45mag"], + "fg": 25599, + "bg": 0, + "rotates": true + }, + { + "id": ["walther_ppq_9mm"], + "fg": 25600, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_wielded_walther_ppq_9mm"], + "fg": 25601, + "bg": 0, + "rotates": true + }, + { + "id": ["ppq9mag_10rd"], + "fg": 25602, + "bg": 0, + "rotates": true + }, { + "id": ["ppq9mag_15rd", "ppq9mag_17rd"], + "fg": 25603, + "bg": 0, + "rotates": true + }, + { + "id": ["isherwood_herbal_remedies"], + "fg": 25604, + "bg": 0, + "rotates": true + }, + { + "id": ["survival_kit"], + "fg": 25605, + "bg": 0, + "rotates": true + }, + { + "id": ["survival_kit_box"], + "fg": 25606, + "bg": 0, + "rotates": true + }, + { + "id": ["f_rack_wood"], + "fg": 25607, + "bg": 0, + "rotates": false + }, + { + "id": ["manual_mma_panzer"], + "fg": 25608, + "bg": 0, + "rotates": true + }, + { + "id": ["f_arcane_candlestick"], + "fg": 25609, + "bg": 0, + "rotates": false + }, + { + "id": ["candle_warding"], + "fg": 25610, + "bg": 0, + "rotates": false + }, + { + "id": ["candle_warding_active"], + "fg": 25611, + "bg": 0, + "rotates": false + }, + { + "id": ["f_candle_barrier"], + "fg": 25612, + "bg": 0, + "rotates": false + }, + { + "id": ["f_candle_barrier_playermade"], + "fg": 25613, + "bg": 0, + "rotates": false + }, + + { + "id": ["candle_warding_special"], + "fg": 25614, + "bg": 0, + "rotates": false + }, + { + "id": ["cf_rep_trade_arrangement"], + "fg": 25615, + "bg": 0, + "rotates": false + }, + { + "id": ["cf_rep_trade_arrangement"], + "fg": 25615, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_male_worn_halo_elecresist", "overlay_male_worn_halo_dampening"], + "note": "light gray color", + "fg": 25616, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_female_worn_halo_elecresist", "overlay_female_worn_halo_dampening"], + "note": "light gray color", + "fg": 25617, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_male_worn_halo_clairvoyance"], + "note": "magenta color", + "fg": 25618, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_female_worn_halo_clairvoyance"], + "note": "magenta color", + "fg": 25619, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_male_worn_halo_shadowsnakes", "overlay_male_worn_halo_drainlife"], + "note": "dark gray color", + "fg": 25620, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_female_worn_halo_shadowsnakes", "overlay_female_worn_halo_drainlife"], + "note": "dark gray color", + "fg": 25621, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_male_worn_halo_light"], + "note": "white color", + "fg": 25622, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_female_worn_halo_light"], + "note": "white color", + "fg": 25623, + "bg": 0, + "rotates": false + }, + { + "id": ["index_bloodmagic"], + "fg": 25624, + "bg": 0, + "rotates": false + }, + { + "id": ["index_hexenhammer"], + "fg": 25625, + "bg": 0, + "rotates": false + }, + { + "id": ["index_potioncraft"], + "fg": 25626, + "bg": 0, + "rotates": false + }, + { + "id": ["index_sacrifice"], + "fg": 25627, + "bg": 0, + "rotates": false + }, + { + "id": ["index_scrollcraft"], + "fg": 25628, + "bg": 0, + "rotates": false + }, + { + "id": ["index_summoning"], + "fg": 25629, + "bg": 0, + "rotates": false + }, { + "id": ["index_syncretism"], + "fg": 25630, + "bg": 0, + "rotates": false + },{ + "id": ["psychic_crystal"], + "fg": 25631, + "bg": 0, + "rotates": false + }, + { + "id": ["corpse_mon_slasher_weak"], + "fg": 25632, + "bg": 0, + "rotates": false + }, + { + "id": ["m1911_MEU"], + "fg": 25633, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_wielded_m1911_MEU"], + "fg": 25634, + "bg": 0, + "rotates": true + }, + { + "id": ["mk23"], + "fg": 25635, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_wielded_mk23"], + "fg": 25636, + "bg": 0, + "rotates": true + }, + { + "id": ["afs_bag_of_holding"], + "fg": 25637, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_worn_afs_bag_of_holding"], + "fg": 25638, + "bg": 0, + "rotates": true + }, + { + "id": ["afs_basin"], + "fg": 25639, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_wielded_afs_basin"], + "fg": 25640, + "bg": 0, + "rotates": true + }, + { + "id": ["afs_bionic_power_mod"], + "fg": 25641, + "bg": 0, + "rotates": true + }, + { + "id": ["afs_bionic_rocket"], + "fg": 25642, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_wielded_afs_bionic_rocket"], + "fg": 25643, + "bg": 0, + "rotates": true + }, + { + "id": ["afs_blatant_half_life_reference"], + "fg": 25644, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_worn_afs_blatant_half_life_reference"], + "fg": 25645, + "bg": 0, + "rotates": true + }, { + "id": ["afs_hev_helmet"], + "fg": 25646, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_worn_afs_hev_helmet"], + "fg": 25647, + "bg": 0, + "rotates": true + }, { + "id": ["afs_hev_helmet_on"], + "fg": 25648, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_wielded_makeshift_crowbar"], + "fg": 25649, + "bg": 0, + "rotates": true + }, + { + "id": ["afs_boot_quiver"], + "fg": 25650, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_worn_afs_boot_quiver"], + "fg": 25651, + "bg": 0, + "rotates": true + }, + { + "id": ["afs_brigandine"], + "fg": 25652, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_worn_afs_brigandine"], + "fg": 25653, + "bg": 0, + "rotates": true + }, + { + "id": ["afs_brigandine_crafted"], + "fg": 25654, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_worn_afs_brigandine_crafted"], + "fg": 25655, + "bg": 0, + "rotates": true + }, + { + "id": ["afs_cake"], + "fg": 25656, + "bg": 0, + "rotates": true + }, + { + "id": ["afs_calorie_pill"], + "fg": 25657, + "bg": 0, + "rotates": true + }, { + "id": ["afs_chain_wrench"], + "fg": 25658, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_wielded_afs_chain_wrench"], + "fg": 25659, + "bg": 0, + "rotates": true + }, + { + "id": ["colander_steel"], + "fg": 25660, + "bg": 0, + "rotates": true + }, { + "id": ["sieve_steel"], + "fg": 25661, + "bg": 0, + "rotates": true + }, { + "id": ["splatter_guard"], + "fg": 25662, + "bg": 0, + "rotates": true + }, { + "id": ["afs_daypack", "daypack"], + "fg": 25663, + "bg": 0, + "rotates": true + }, { + "id": ["overlay_worn_afs_daypack", "overlay_worn_daypack"], + "fg": 25664, + "bg": 0, + "rotates": true + }, { + "id": ["afs_dough"], + "fg": 25665, + "bg": 0, + "rotates": true + }, { + "id": ["afs_energy_saber_off"], + "fg": 25666, + "bg": 0, + "rotates": true + }, { + "id": ["overlay_wielded_afs_energy_saber_off"], + "fg": 25667, + "bg": 0, + "rotates": true + }, { + "id": ["afs_energy_saber_on"], + "fg": 25668, + "bg": 0, + "rotates": true + }, { + "id": ["overlay_wielded_afs_energy_saber_on"], + "fg": 25669, + "bg": 0, + "rotates": true + }, +{ + "id": ["afs_fried_donut_holes", "donut_holes"], + "fg": 25670, + "bg": 0, + "rotates": true + }, +{ + "id": ["afs_hardlight_longbow"], + "fg": 25671, + "bg": 0, + "rotates": true + }, { + "id": ["overlay_wielded_afs_hardlight_longbow"], + "fg": 25672, + "bg": 0, + "rotates": true + }, +{ + "id": ["overlay_worn_afs_hardlight_longbow"], + "fg": 25673, + "bg": 0, + "rotates": true + }, + { + "id": ["human_flesh"], + "fg": 25674, + "bg": 0, + "rotates": true + }, + { + "id": ["large_storage_battery", "vp_large_storage_battery", "vp_large_storage_battery_removable"], + "fg": 25675, + "bg": 0, + "rotates": true + }, + { + "id": ["welding_mask_raised"], + "fg": 25676, + "bg": 0, + "rotates": true + }, + { + "id": ["welding_mask_crude_raised"], + "fg": 25677, + "bg": 0, + "rotates": true + },{ + "id": ["ski_jacket"], + "fg": 25678, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_worn_ski_jacket"], + "fg": 25679, + "bg": 0, + "rotates": true + },{ + "id": ["overlay_worn_woodgreatbow"], + "fg": 25680, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_worn_bullet_crossbow"], + "fg": 25681, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_worn_crossbow"], + "fg": 25682, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_worn_rep_crossbow"], + "fg": 25683, + "bg": 0, + "rotates": true + }, { + "id": ["overlay_worn_recurbow"], + "fg": 25684, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_worn_compcrossbow"], + "fg": 25685, + "bg": 0, + "rotates": true + }, { + "id": ["overlay_worn_reflexrecurvebow"], + "fg": 25686, + "bg": 0, + "rotates": true + }, + { + "id": ["overlay_worn_shortbow"], + "fg": 25687, + "bg": 0, + "rotates": true + }, + { + "id": ["t_ticket_vendor"], + "fg": 25688, + "bg": 5010, + "rotates": false + }, + { + "id": ["t_ticket_machine"], + "fg": 25689, + "bg": 5010, + "rotates": false + }, + { + "id": ["t_gate_metal_c"], + "fg": 25690, + "bg": 5010, + "rotates": false + }, + { + "id": ["t_gate_metal_o"], + "fg": 25691, + "bg": 5010, + "rotates": false + }, + { + "id": ["t_fence_metal"], + "fg": 25692, + "bg": 5010, + "rotates": false + }, + { + "id": ["afs_hydraulic_gauntlet"], + "fg": 25693, + "bg": 0, + "rotates": false + }, { + "id": ["overlay_wielded_afs_hydraulic_gauntlet"], + "fg": 25694, + "bg": 0, + "rotates": false + }, + { + "id": ["afs_power_cutter"], + "fg": 25695, + "bg": 0, + "rotates": false + }, { + "id": ["afs_power_cutter_on"], + "fg": 25696, + "bg": 0, + "rotates": false + }, { + "id": ["overlay_wielded_afs_power_cutter"], + "fg": 25697, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_wielded_afs_power_cutter_on"], + "fg": 25698, + "bg": 0, + "rotates": false + }, { + "id": ["afs_murdersaw"], + "fg": 25699, + "bg": 0, + "rotates": false + }, { + "id": ["afs_murdersaw_on"], + "fg": 25700, + "bg": 0, + "rotates": false + }, { + "id": ["overlay_wielded_afs_murdersaw"], + "fg": 25701, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_wielded_afs_murdersaw_on"], + "fg": 25702, + "bg": 0, + "rotates": false + }, + { + "id": "f_water_heater", + "fg": 25703, + "rotates": false + }, + { + "id": "reference_cooking", + "fg": 25704, + "rotates": false + }, + { + "id": "reference_fabrication1", + "fg": 25705, + "rotates": false + }, + { + "id": "reference_firstaid1", + "fg": 25706, + "rotates": false + }, + { + "id": "reference_firstaid2", + "fg": 25707, + "rotates": false + }, + { + "id": "wheel_mount_light", + "fg": 25708, + "rotates": false + }, { + "id": "wheel_mount_medium", + "fg": 25709, + "rotates": false + },{ + "id": "wheel_mount_heavy", + "fg": 25710, + "rotates": false + }, + { + "id": "coat_fur_sf", + "fg": 25711, + "rotates": false + }, + { + "id": "overlay_worn_coat_fur_sf", + "fg": 25712, + "rotates": false + }, + { + "id": ["vp_wheel_mount_light", "vp_wheel_mount_light_steerable"], + "fg": 25713, + "rotates": true + }, + { + "id": ["vp_wheel_mount_medium", "vp_wheel_mount_medium_steerable"], + "fg": 25714, + "rotates": true + }, + { + "id": ["vp_wheel_mount_heavy", "vp_wheel_mount_heavy_steerable"], + "fg": 25715, + "rotates": true + }, + { + "id": ["overlay_wielded_hat_hard", "overlay_wielded_hat_hard_hooded"], + "fg": 25716, + "rotates": true + }, + { + "id": "overlay_wielded_oxy_torch", + "fg": 25717, + "bg": 0, + "rotates": false + }, + { + "id": "overlay_wielded_scalpel", + "fg": 25718, + "bg": 0, + "rotates": false + }, + { + "id": "overlay_wielded_knife_butter", + "fg": 25719, + "bg": 0, + "rotates": false + }, + { + "id": "overlay_wielded_flashlight", + "fg": 25720, + "bg": 0, + "rotates": false + }, + { + "id": "overlay_wielded_flashlight_on", + "fg": 25721, + "bg": 0, + "rotates": false + }, + { + "id": "overlay_wielded_helmet_ball", + "fg": 25722, + "bg": 0, + "rotates": false + }, + { + "id": "overlay_wielded_soldering_iron", + "fg": 25723, + "bg": 0, + "rotates": false + }, + { + "id": "corpse_generic_male", + "fg": 25724, + "bg": 0, + "rotates": false + }, + { + "id": "corpse_generic_female", + "fg": 25725, + "bg": 0, + "rotates": false + }, { + "id": "corpse_generic_boy", + "fg": 25726, + "bg": 0, + "rotates": false + }, + { + "id": "corpse_generic_girl", + "fg": 25727, + "bg": 0, + "rotates": false + }, + { + "id": "corpse_child_calm", + "fg": 25728, + "bg": 0, + "rotates": false + }, + { + "id": "corpse_child_gunned", + "fg": 25729, + "bg": 0, + "rotates": false + }, + { + "id": "corpse_oldwoman_jewelry", + "fg": 25730, + "bg": 0, + "rotates": false + }, + { + "id": "corpse_bloody", + "fg": 25731, + "bg": 0, + "rotates": false + }, + { + "id": "corpse_painful", + "fg": 25732, + "bg": 0, + "rotates": false + }, { + "id": "corpse_scorched", + "fg": 25733, + "bg": 0, + "rotates": false + },{ + "id": "corpse_stabbed", + "fg": 25734, + "bg": 0, + "rotates": false + }, + { + "id": "corpse_gunned", + "fg": 25735, + "bg": 0, + "rotates": false + }, + { + "id": "corpse_halved_upper", + "fg": 25736, + "bg": 0, + "rotates": false + }, + { + "id": "corpse_half_beheaded", + "fg": 25737, + "bg": 0, + "rotates": false + }, + { + "id": "chem_manganese_dioxide", + "fg": 25738, + "bg": 0, + "rotates": false + },{ + "id": "chem_muriatic_acid", + "fg": 25739, + "bg": 0, + "rotates": false + },{ + "id": ["chem_potassium_chloride", "chem_zinc"], + "fg": 25740, + "bg": 0, + "rotates": false + },{ + "id": "chem_potassium_hydroxide", + "fg": 25741, + "bg": 0, + "rotates": false + },{ + "id": "material_rhodonite", + "fg": 25742, + "bg": 0, + "rotates": false + },{ + "id": "material_zincite", + "fg": 25743, + "bg": 0, + "rotates": false + }, + { + "id": "zinc_metal", + "fg": 25744, + "bg": 0, + "rotates": false + }, + { + "id": "vp_laser_cannon", + "fg": 25745, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_wielded_craft"], + "bg": 25746 + }, + { + "id": "t_water_cube", + "fg": 25747, + "bg": 0, + "rotates": false + }, { + "id": "t_lake_bed", + "fg": 25748, + "bg": 0, + "rotates": false + },{ + "id": "t_ocean_bed", + "fg": 25749, + "bg": 0, + "rotates": false + },{ + "id": "t_rock_roof", + "fg": 25750, + "bg": 0, + "rotates": false + }, + { + "id": "press_dowel", + "fg": 25751, + "bg": 0, + "rotates": false + }, { + "id": ["shot_paper_00", "shot_paper_bird", "shot_paper_dragon", "shot_paper_slug"], + "fg": 25752, + "bg": 0, + "rotates": false + },{ + "id": ["mon_black_pudding"], + "fg": 25753, + "bg": 0, + "rotates": false + }, + { + "id": ["belt_haste"], + "fg": 25754, + "bg": 0, + "rotates": false + }, { + "id": ["overlay_worn_belt_haste"], + "fg": 25755, + "bg": 0, + "rotates": false + }, { + "id": ["belt_str"], + "fg": 25756, + "bg": 0, + "rotates": false + }, { + "id": ["overlay_worn_belt_str"], + "fg": 25757, + "bg": 0, + "rotates": false + },{ + "id": ["dragon_blood"], + "fg": 25758, + "bg": 0, + "rotates": false + },{ + "id": ["tainted_blood"], + "fg": 25759, + "bg": 0, + "rotates": false + },{ + "id": ["f_still_mounds"], + "fg": 25760, + "bg": 0, + "rotates": false + }, + { + "id": ["f_pulley_lifter"], + "fg": 25761, + "bg": 0, + "rotates": false + }, + { + "id": ["f_barricade_windbreak"], + "fg": 25762, + "bg": 0, + "rotates": false + },{ + "id": ["bucket_log"], + "fg": 25763, + "bg": 0, + "rotates": false + }, { + "id": "bucket", + "fg": 25764 + },{ + "id": ["overlay_wielded_bucket_log"], + "fg": 25765, + "bg": 0, + "rotates": false + }, { + "id": "overlay_wielded_bucket", + "fg": 25766 + },{ + "id": ["cured_hide_small"], + "fg": 25767, + "bg": 0, + "rotates": false + }, { + "id": "cured_pelt_small", + "fg": 25768 + },{ + "id": ["tanning_hide_small"], + "fg": 25769, + "bg": 0, + "rotates": false + }, { + "id": "tanning_pelt_small", + "fg": 25770 + },{ + "id": "mound_distillation", + "fg": 25771 + },{ + "id": "posca", + "fg": 25772 + },{ + "id": "pot_canning_clay", + "fg": 25773 + },{ + "id": "pulley lifting", + "fg": 25774 + },{ + "id": "side_drum_makeshift", + "fg": 25775 + },{ + "id": "overlay_wielded_side_drum_makeshift", + "fg": 25776 + },{ + "id": "overlay_worn_side_drum_makeshift", + "fg": 25777 + }, + { + "id": "tr_raincatcher_leather", + "fg": 25778 + }, { + "id": "tarp_raincatcher_leather", + "fg": 25779 + }, + { + "id": "tarp_raincatcher", + "fg": 25780 + },{ + "id": ["mon_talon_m202a1"], + "fg": 25781, + "bg": 967, + "rotates": false + }, + { + "id": ["bot_talon_m202a1"], + "fg": 25782, + "bg": 0, + "rotates": false + }, + { + "id": ["broken_talon_m202a1"], + "fg": 25783, + "bg": 0, + "rotates": false + }, { + "id": ["m74_clip"], + "fg": 25784, + "bg": 0, + "rotates": false + }, + { + "id": ["tacvest"], + "fg": 25785, + "bg": 0, + "rotates": false + }, { + "id": ["overlay_worn_tacvest"], + "fg": 25786, + "bg": 0, + "rotates": false + }, + { + "id": "atlatl", "note": "before that i add all new items to the tileset! !!!NEW-ITEMS-HERE!!", + "fg": 1986, + "bg": 0, + "rotates": false + }, + { + "id": ["overlay_wielded_corpse", "overlay_wielded_rmi2_corpse"], + "fg": 1840, + "rotates": false + } + ] + }, + { + "file": "15_tiles-connected_variants_32x32_27565-32764.png", + "tiles": + [ + { + "id": "atlatl", + "fg": 1986, + "bg": 0, + "rotates": false + } + ] + }, + { + "file": "16_tiles_trees_64x80_32765-33164.png", + "sprite_width":64, + "sprite_height":80, + "sprite_offset_x":-16, + "sprite_offset_y":-48, + "tiles": + [ + { + "id": "t_tree_season_spring", + "fg": 32765, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_season_summer", "t_tree"], + "fg": 32766, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_season_autumn", + "fg": 32767, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_season_winter", + "fg": 32768, + "bg": 32978, + "rotates": false + }, + { + "id": ["t_tree_harvested_season_spring", "t_tree_oak_harvested_season_spring"], + "fg": 32769, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_harvested_season_summer", "t_tree_harvested", "t_tree_oak_harvested_season_summer", "t_tree_oak_harvested"], + "fg": 32770, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_harvested_season_autumn", "t_tree_oak_harvested_season_autumn"], + "fg": 32771, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_harvested_season_winter", "t_tree_oak_harvested_season_winter"], + "fg": 32772, + "bg": 32978, + "rotates": false + }, + { + "id": "t_tree_blackjack_season_spring", + "fg": 32773, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_blackjack_season_summer", "t_tree_blackjack"], + "fg": 32774, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_blackjack_season_autumn", + "fg": 32775, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_blackjack_season_winter", + "fg": 32776, + "bg": 32978, + "rotates": false + }, + { + "id": "t_tree_blackjack_harvested_season_spring", + "fg": 32777, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_blackjack_harvested_season_summer", "t_tree_blackjack_harvested"], + "fg": 32778, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_blackjack_harvested_season_autumn", + "fg": 32779, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_blackjack_harvested_season_winter", + "fg": 32780, + "bg": 32978, + "rotates": false + }, + { + "id": "t_tree_walnut_season_spring", + "fg": 32781, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_walnut_season_summer", "t_tree_walnut"], + "fg": 32782, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_walnut_season_autumn", + "fg": 32783, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_walnut_season_winter", + "fg": 32784, + "bg": 32978, + "rotates": false + }, + { + "id": "t_tree_walnut_harvested_season_spring", + "fg": 32785, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_walnut_harvested_season_summer", "t_tree_walnut_harvested"], + "fg": 32786, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_walnut_harvested_season_autumn", + "fg": 32787, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_walnut_harvested_season_winter", + "fg": 32788, + "bg": 32978, + "rotates": false + }, + { + "id": "t_tree_chestnut_season_spring", + "fg": 32789, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_chestnut_season_summer", "t_tree_chestnut"], + "fg": 32790, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_chestnut_season_autumn", + "fg": 32791, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_chestnut_season_winter", + "fg": 32792, + "bg": 32978, + "rotates": false + }, + { + "id": "t_tree_chestnut_harvested_season_spring", + "fg": 32793, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_chestnut_harvested_season_summer", "t_tree_chestnut_harvested"], + "fg": 32794, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_chestnut_harvested_season_autumn", + "fg": 32795, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_chestnut_harvested_season_winter", + "fg": 32796, + "bg": 32978, + "rotates": false + }, + { + "id": "t_tree_beech_season_spring", + "fg": 32797, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_beech_season_summer", "t_tree_beech"], + "fg": 32798, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_beech_season_autumn", + "fg": 32799, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_beech_season_winter", + "fg": 32800, + "bg": 32978, + "rotates": false + }, + { + "id": "t_tree_beech_harvested_season_spring", + "fg": 32801, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_beech_harvested_season_summer", "t_tree_beech_harvested"], + "fg": 32802, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_beech_harvested_season_autumn", + "fg": 32803, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_beech_harvested_season_winter", + "fg": 32804, + "bg": 32978, + "rotates": false + }, + { + "id": "t_tree_dead_season_spring", + "fg": 32805, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_dead_season_summer", "t_tree_dead_season_summer"], + "fg": 32806, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_dead_season_autumn", + "fg": 32807, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_dead_season_winter", + "fg": 32808, + "bg": 32978, + "rotates": false + }, + { + "id": "t_tree_pecan_season_spring", + "fg": 32809, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_pecan_season_summer", "t_tree_pecan"], + "fg": 32810, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_pecan_season_autumn", + "fg": 32811, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_pecan_season_winter", + "fg": 32812, + "bg": 32978, + "rotates": false + }, + { + "id": "t_tree_pecan_harvested_season_spring", + "fg": 32813, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_pecan_harvested_season_summer", "t_tree_pecan_harvested"], + "fg": 32814, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_pecan_harvested_season_autumn", + "fg": 32815, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_pecan_harvested_season_winter", + "fg": 32816, + "bg": 32978, + "rotates": false + }, + { + "id": "t_tree_hazelnut_season_spring", + "fg": 32817, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_hazelnut_season_summer", "t_tree_hazelnut"], + "fg": 32818, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_hazelnut_season_autumn", + "fg": 32819, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_hazelnut_season_winter", + "fg": 32820, + "bg": 32978, + "rotates": false + }, + { + "id": "t_tree_hazelnut_harvested_season_spring", + "fg": 32821, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_hazelnut_harvested_season_summer", "t_tree_hazelnut_harvested"], + "fg": 32822, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_hazelnut_harvested_season_autumn", + "fg": 32823, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_hazelnut_harvested_season_winter", + "fg": 32824, + "bg": 32978, + "rotates": false + }, + { + "id": "t_tree_almond_season_spring", + "fg": 32825, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_almond_season_summer", "t_tree_almond"], + "fg": 32826, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_almond_season_autumn", + "fg": 32827, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_almond_season_winter", + "fg": 32828, + "bg": 32978, + "rotates": false + }, + { + "id": "t_tree_almond_harvested_season_spring", + "fg": 32829, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_almond_harvested_season_summer", "t_tree_almond_harvested"], + "fg": 32830, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_almond_harvested_season_autumn", + "fg": 32831, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_almond_harvested_season_winter", + "fg": 32832, + "bg": 32978, + "rotates": false + }, + { + "id": "t_tree_pistachio_season_spring", + "fg": 32833, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_pistachio_season_summer", "t_tree_pistachio"], + "fg": 32834, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_pistachio_season_autumn", + "fg": 32835, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_pistachio_season_winter", + "fg": 32836, + "bg": 32978, + "rotates": false + }, + { + "id": "t_tree_pistachio_harvested_season_spring", + "fg": 32837, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_pistachio_harvested_season_summer", "t_tree_pistachio_harvested"], + "fg": 32838, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_pistachio_harvested_season_autumn", + "fg": 32839, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_pistachio_harvested_season_winter", + "fg": 32840, + "bg": 32978, + "rotates": false + }, + { + "id": "t_tree_mulberry_season_spring", + "fg": 32841, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_mulberry_season_summer", "t_tree_mulberry"], + "fg": 32842, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_mulberry_season_autumn", + "fg": 32843, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_mulberry_season_winter", + "fg": 32844, + "bg": 32978, + "rotates": false + }, + { + "id": "t_tree_mulberry_harvested_season_spring", + "fg": 32845, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_mulberry_harvested_season_summer", "t_tree_mulberry_harvested"], + "fg": 32846, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_mulberry_harvested_season_autumn", + "fg": 32847, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_mulberry_harvested_season_winter", + "fg": 32848, + "bg": 32978, + "rotates": false + }, + { + "id": "t_tree_elderberry_season_spring", + "fg": 32849, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_elderberry_season_summer", "t_tree_elderberry"], + "fg": 32850, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_elderberry_season_autumn", + "fg": 32851, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_elderberry_season_winter", + "fg": 32852, + "bg": 32978, + "rotates": false + }, + { + "id": ["t_tree_elderberry_harvested_season_spring"], + "fg": 32853, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_elderberry_harvested_season_summer", "t_tree_elderberry"], + "fg": 32854, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_elderberry_harvested_season_autumn", + "fg": 32855, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_elderberry_harvested_season_winter", + "fg": 32856, + "bg": 32978, + "rotates": false + }, + { + "id": "t_tree_cottonwood_season_spring", + "fg": 32857, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_cottonwood_season_summer", "t_tree_cottonwood"], + "fg": 32858, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_cottonwood_season_autumn", + "fg": 32859, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_cottonwood_season_winter", + "fg": 32860, + "bg": 32978, + "rotates": false + }, + { + "id": ["t_tree_elm_season_spring"], + "fg": 32861, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_elm_season_summer", "t_tree_elm"], + "fg": 32862, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_elm_season_autumn", + "fg": 32863, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_elm_season_winter", + "fg": 32864, + "bg": 32978, + "rotates": false + }, + { + "id": ["t_tree_apple_season_spring"], + "fg": 32865, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_apple_season_summer", "t_tree_apple"], + "fg": 32866, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_apple_season_autumn", + "fg": 32867, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_apple_season_winter", + "fg": 32868, + "bg": 32978, + "rotates": false + }, + { + "id": ["t_tree_apple_harvested_season_spring"], + "fg": 32869, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_apple_harvested_season_summer", "t_tree_apple_harvested"], + "fg": 32870, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_apple_harvested_season_autumn", + "fg": 32871, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_apple_harvested_season_winter", + "fg": 32872, + "bg": 32978, + "rotates": false + }, + { + "id": ["t_tree_pear_season_spring"], + "fg": 32873, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_pear_season_summer", "t_tree_pear"], + "fg": 32874, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_pear_season_autumn", + "fg": 32875, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_pear_season_winter", + "fg": 32876, + "bg": 32978, + "rotates": false + }, + { + "id": ["t_tree_pear_harvested_season_spring"], + "fg": 32877, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_pear_harvested_season_summer", "t_tree_pear_harvested"], + "fg": 32878, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_pear_harvested_season_autumn", + "fg": 32879, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_pear_harvested_season_winter", + "fg": 32880, + "bg": 32978, + "rotates": false + }, + { + "id": ["t_tree_cherry_season_spring"], + "fg": 32881, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_cherry_season_summer", "t_tree_cherry"], + "fg": 32882, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_cherry_season_autumn", + "fg": 32883, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_cherry_season_winter", + "fg": 32884, + "bg": 32978, + "rotates": false + }, + { + "id": ["t_tree_cherry_harvested_season_spring"], + "fg": 32885, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_cherry_harvested_season_summer", "t_tree_cherry_harvested"], + "fg": 32886, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_cherry_harvested_season_autumn", + "fg": 32887, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_cherry_harvested_season_winter", + "fg": 32888, + "bg": 32978, + "rotates": false + }, + { + "id": ["t_tree_peach_season_spring"], + "fg": 32889, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_peach_season_summer", "t_tree_peach"], + "fg": 32890, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_peach_season_autumn", + "fg": 32891, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_peach_season_winter", + "fg": 32892, + "bg": 32978, + "rotates": false + }, + { + "id": ["t_tree_peach_harvested_season_spring"], + "fg": 32893, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_peach_harvested_season_summer", "t_tree_peach_harvested"], + "fg": 32894, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_peach_harvested_season_autumn", + "fg": 32895, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_peach_harvested_season_winter", + "fg": 32896, + "bg": 32978, + "rotates": false + }, + { + "id": ["t_tree_apricot_season_spring"], + "fg": 32897, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_apricot_season_summer", "t_tree_apricot"], + "fg": 32898, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_apricot_season_autumn", + "fg": 32899, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_apricot_season_winter", + "fg": 32900, + "bg": 32978, + "rotates": false + }, + { + "id": ["t_tree_apricot_harvested_season_spring"], + "fg": 32901, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_apricot_harvested_season_summer", "t_tree_apricot_harvested"], + "fg": 32902, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_apricot_harvested_season_autumn", + "fg": 32903, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_apricot_harvested_season_winter", + "fg": 32904, + "bg": 32978, + "rotates": false + }, + { + "id": ["t_tree_plum_season_spring"], + "fg": 32905, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_plum_season_summer", "t_tree_plum"], + "fg": 32906, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_plum_season_autumn", + "fg": 32907, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_plum_season_winter", + "fg": 32908, + "bg": 32978, + "rotates": false + }, + { + "id": ["t_tree_plum_harvested_season_spring"], + "fg": 32909, + "bg": 32977, + "rotates": false + }, + { "id": ["t_tree_plum_harvested_season_summer", "t_tree_plum_harvested"], "fg": 32910, "bg": 32977, @@ -129484,6 +135216,54 @@ "fg": 32996, "bg": 32978, "rotates": false + }, + { + "id": ["t_tree_burnt_season_spring"], + "fg": 32997, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_burnt_season_summer", "t_tree_burnt"], + "fg": 32998, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_burnt_season_autumn", + "fg": 32999, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_burnt_season_winter", + "fg": 33000, + "bg": 32978, + "rotates": false + }, + { + "id": ["t_tree_pine_harvested_season_spring"], + "fg": 33001, + "bg": 32977, + "rotates": false + }, + { + "id": ["t_tree_pine_harvested_season_summer", "t_tree_pine_harvested"], + "fg": 33002, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_pine_harvested_season_autumn", + "fg": 33003, + "bg": 32977, + "rotates": false + }, + { + "id": "t_tree_pine_harvested_season_winter", + "fg": 33004, + "bg": 32978, + "rotates": false } ] }, @@ -129594,11 +135374,26 @@ "id": "overlay_worn_foodperson_mask_on", "fg": 33187, "rotates": false + }, + { + "id": "overlay_worn_veil_wedding", + "fg": 33188, + "rotates": false + }, + { + "id": "overlay_worn_welding_mask_raised", + "fg": 33189, + "rotates": false + }, + { + "id": "overlay_worn_welding_mask_crude_raised", + "fg": 33190, + "rotates": false } ] }, { - "file": "18_big_things_64x80_35757.png", + "file": "18_big_things_64x80_35757-36076.png", "sprite_width":64, "sprite_height":80, "sprite_offset_x":-16, @@ -130035,12 +135830,8 @@ "fg": 35833, "bg": 0, "rotates": false - },{ - "id": ["fd_fire"], - "fg": 35834, - "bg": 0, - "rotates": false - }, { + }, + { "id": "t_gutter_downspout", "fg": 35835, "bg": 35759, @@ -130100,12 +135891,368 @@ "id": "corpse_mon_bulette", "fg": 35846, "rotates": false - } - - - + }, + { + "id": "f_alien_tendril", + "fg": 35847, + "rotates": false + }, + { + "id": "f_alien_gasper", + "fg": 35848, + "rotates": false + }, + { + "id": "mon_demon_spider_queen", + "fg": 35849, + "rotates": false + }, + { + "id": "corpse_mon_demon_spider_queen", + "fg": 35850, + "rotates": false + }, + { + "id": "overlay_wielded_blade_crt", + "fg": 35851, + "rotates": false + }, + { + "id": "mon_gargoyle", + "fg": 35852, + "rotates": false + }, + { + "id": "corpse_mon_gargoyle", + "fg": 35853, + "rotates": false + }, + { + "id": "mon_jacked_rabbit", + "fg": 35854, + "rotates": false + }, + { + "id": "corpse_mon_jacked_rabbit", + "fg": 35855, + "rotates": false + }, + { + "id": "mon_aero_octopod", + "fg": 35856, + "rotates": false + }, + { + "id": "corpse_mon_aero_octopod", + "fg": 35857, + "rotates": false + }, + { + "id": "mon_bird_mutant_elephant", + "fg": 35858, + "rotates": false + }, + { + "id": "corpse_mon_bird_mutant_elephant", + "fg": 35859, + "rotates": false + }, + { + "id": "mon_mi_go_slaver", + "fg": 35860, + "rotates": false + }, { + "id": "corpse_mon_mi_go_slaver", + "fg": 35861, + "rotates": false + }, + { + "id": "mon_mi_go_surgeon", + "fg": 35862, + "rotates": false + }, { + "id": "corpse_mon_mi_go_surgeon", + "fg": 35863, + "rotates": false + }, + { + "id": "mon_mi_go_guard", + "fg": 35864, + "rotates": false + }, { + "id": "corpse_mon_mi_go_guard", + "fg": 35865, + "rotates": false + }, + { + "id": "mon_mi_go_myrmidon", + "fg": 35866, + "rotates": false + }, + { + "id": "corpse_mon_mi_go_myrmidon", + "fg": 35867, + "rotates": false + }, + { + "id": "mon_dog_mutant_worm", + "fg": 35868, + "rotates": false + }, + { + "id": "mon_dog_mutant_dire", + "fg": 35869, + "rotates": false + }, + { + "id": "corpse_mon_dog_mutant_dire", + "fg": 35870, + "rotates": false + }, + { + "id": "mon_fish_mutant_ghoul", + "fg": 35871, + "rotates": false + }, + { + "id": "corpse_mon_fish_mutant_ghoul", + "fg": 35872, + "rotates": false + }, + { + "id": "mon_fish_mutant_terror", + "fg": 35873, + "rotates": false + }, + { + "id": "corpse_mon_fish_mutant_terror", + "fg": 35874, + "rotates": false + }, + { + "id": "mon_skeleton_hulk_fungus", + "fg": 35875, + "rotates": false + }, + { + "id": "corpse_mon_skeleton_hulk_fungus", + "fg": 35876, + "rotates": false + }, + { + "id": "mon_dragon_black_young", + "fg": 35877, + "rotates": false + }, + { + "id": "corpse_mon_dragon_black_young", + "fg": 35878, + "rotates": false + }, { + "id": "mon_mech_lifter", + "fg": 35879, + "rotates": false + }, { + "id": "mon_mech_combat", + "fg": 35880, + "rotates": false + }, { + "id": "mon_mech_recon", + "fg": 35881, + "rotates": false + }, { + "id": "broken_mech_lifter", + "fg": 35882, + "rotates": false + }, { + "id": "broken_mech_combat", + "fg": 35883, + "rotates": false + }, { + "id": "broken_mech_recon", + "fg": 35884, + "rotates": false + }, + { + "id": "mon_gamma_toad", + "fg": 35885, + "rotates": false + }, { + "id": "corpse_mon_gamma_toad", + "fg": 35886, + "rotates": false + }, { + "id": "mon_zombie_gasbag_crawler", + "fg": 35887, + "rotates": false + }, { + "id": "mon_ungulate_mutant_screech", + "fg": 35888, + "rotates": false + }, { + "id": "corpse_mon_ungulate_mutant_screech", + "fg": 35889, + "rotates": false + },{ + "id": "mon_mega_acid_ant", + "fg": 35890, + "rotates": false + }, { + "id": "corpse_mon_mega_acid_ant", + "fg": 35891, + "rotates": false + },{ + "id": "mon_mega_ant", + "fg": 35892, + "rotates": false + }, { + "id": "corpse_mon_mega_ant", + "fg": 35893, + "rotates": false + },{ + "id": "mon_mega_beetle", + "fg": 35894, + "rotates": false + }, { + "id": "corpse_mon_mega_beetle", + "fg": 35895, + "rotates": false + },{ + "id": "mon_mega_dragonfly", + "fg": 35896, + "rotates": false + }, { + "id": "corpse_mon_mega_dragonfly", + "fg": 35897, + "rotates": false + },{ + "id": "mon_mega_fly", + "fg": 35898, + "rotates": false + }, { + "id": "corpse_mon_mega_fly", + "fg": 35899, + "rotates": false + },{ + "id": "mon_mega_wasp", + "fg": 35900, + "rotates": false + }, { + "id": "corpse_mon_mega_wasp", + "fg": 35901, + "rotates": false + },{ + "id": "mon_mega_jumping_spider", + "fg": 35902, + "rotates": false + }, { + "id": "corpse_mon_mega_jumping_spider", + "fg": 35903, + "rotates": false + },{ + "id": "mon_mega_trapdoor_spider", + "fg": 35904, + "rotates": false + }, { + "id": "corpse_mon_mega_trapdoor_spider", + "fg": 35905, + "rotates": false + }, + { + "id": "mon_mega_web_spider", + "fg": 35906, + "rotates": false + },{ + "id": "mon_mega_wolf_spider", + "fg": 35907, + "rotates": false + }, { + "id": "corpse_mon_mega_wolf_spider", + "fg": 35908, + "rotates": false + }, + { + "id": "mon_zombie_crushed_giant", + "fg": 35909, + "rotates": false + }, { + "id": "mon_zombie_living_wall", + "fg": 35910, + "rotates": false + }, { + "id": "corpse_mon_zombie_living_wall", + "fg": 35911, + "rotates": false + }, { + "id": "mon_slasher_weak", + "fg": 35912, + "rotates": false + }, { + "id": "overlay_worn_afs_hev_helmet_on", + "fg": 35913, + "rotates": false + }, { + "id": "f_fridge", + "fg": 35914, + "rotates": false + }, + { + "id": "vp_basketlg", + "fg": 35915, + "rotates": false + }, + { + "id": "t_tarptent_leather", + "fg": 35916, + "bg": 32977, + "rotates": false + },{ + "id": "tr_unfinished_construction", + "fg": 35917, + "bg": 0, + "rotates": false + }, + { + "id": ["fd_fire"], + "fg": 35834, + "bg": 0, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 35918, + "bg": 0 + }, + { + "id": "corner", + "fg": [35919, 35920, 35921, 35922], + "bg": 0 + }, + { + "id": "t_connection", + "fg": [35923, 35924, 35925, 35926], + "bg": 0 + }, + { + "id": "edge", + "fg": [35927, 35928], + "bg": 0 + }, + { + "id": "end_piece", + "fg": [35929, 35930, 35931, 35932], + "bg": 0 + }, + { + "id": "unconnected", + "fg": 35834, + "bg": 0 + } + ], + "rotates": true + } - ] - } + ] + } ] } diff --git a/lang/extract_json_strings.py b/lang/extract_json_strings.py index ef2a250c895e3..0ed6d4ee1c2d2 100755 --- a/lang/extract_json_strings.py +++ b/lang/extract_json_strings.py @@ -67,6 +67,7 @@ def warning_supressed(filename): "city_building", "colordef", "emit", + "enchantment", "EXTERNAL_OPTION", "GAME_OPTION", "ITEM_BLACKLIST", @@ -99,7 +100,8 @@ def warning_supressed(filename): "uncraft", "vehicle_group", "vehicle_placement", - "WORLD_OPTION" + "WORLD_OPTION", + "enchantment" } # these objects can have their strings automatically extracted. @@ -530,7 +532,7 @@ def extract_dynamic_line_optional(line, member, outfile): "u_male", "u_female", "npc_male", "npc_female", "has_no_assigned_mission", "has_assigned_mission", "has_many_assigned_missions", "has_no_available_mission", "has_available_mission", "has_many_available_missions", - "mission_complete", "mission_incomplete", + "mission_complete", "mission_incomplete", "mission_has_generic_rewards", "npc_available", "npc_following", "npc_friend", "npc_hostile", "npc_train_skills", "npc_train_styles", "at_safe_space", "is_day", "npc_has_activity", "is_outside", "u_has_camp", @@ -552,6 +554,14 @@ def extract_dynamic_line(line, outfile): elif type(line) == str: writestr(outfile, line) +def extract_talk_effects(effects, outfile): + if type(effects) != list: + effects = [effects] + for eff in effects: + if type(eff) == dict: + if "u_buy_monster" in eff and "name" in eff: + writestr(outfile, eff["name"], comment="Nickname for creature '{}'".format(eff["u_buy_monster"])) + def extract_talk_response(response, outfile): if "text" in response: writestr(outfile, response["text"]) @@ -559,6 +569,15 @@ def extract_talk_response(response, outfile): extract_talk_response(response["success"], outfile) if "failure" in response: extract_talk_response(response["failure"], outfile) + if "speaker_effect" in response: + speaker_effects = response["speaker_effect"] + if type(speaker_effects) != list: + speaker_effects = [speaker_effects] + for eff in speaker_effects: + if "effect" in eff: + extract_talk_effects(eff["effect"], outfile) + if "effect" in response: + extract_talk_effects(response["effect"], outfile) def extract_talk_topic(item): outfile = get_outfile("talk_topic") @@ -567,6 +586,8 @@ def extract_talk_topic(item): if "responses" in item: for r in item["responses"]: extract_talk_response(r, outfile) + if "effect" in item: + extract_talk_effects(item["effect"], outfile) def extract_trap(item): outfile = get_outfile("trap") @@ -580,6 +601,8 @@ def extract_missiondef(item): if item_name is None: raise WrongJSONItem("JSON item don't contain 'name' field", item) writestr(outfile, item_name) + if "description" in item: + writestr(outfile, item["description"], comment="Description for mission '{}'".format(item_name)) if "dialogue" in item: dialogue = item.get("dialogue") if "describe" in dialogue: @@ -600,6 +623,12 @@ def extract_missiondef(item): writestr(outfile, dialogue.get("success_lie")) if "failure" in dialogue: writestr(outfile, dialogue.get("failure")) + if "start" in item and "effect" in item["start"]: + extract_talk_effects(item["start"]["effect"], outfile) + if "end" in item and "effect" in item["end"]: + extract_talk_effects(item["end"]["effect"], outfile) + if "fail" in item and "effect" in item["fail"]: + extract_talk_effects(item["fail"]["effect"], outfile) def extract_mutation(item): outfile = get_outfile("mutation") @@ -713,6 +742,10 @@ def extract_ter_furn_transform_messages(item): for terrain in item.get("terrain"): writestr(outfile,terrain.get("message")) +def extract_skill_display_type(item): + outfile = get_outfile("skill_display_type") + writestr(outfile, item["display_string"], comment="display string for skill display type '{}'".format(item["ident"])) + # these objects need to have their strings specially extracted extract_specials = { "harvest" : extract_harvest, @@ -739,7 +772,8 @@ def extract_ter_furn_transform_messages(item): "gate": extract_gate, "vehicle_spawn": extract_vehspawn, "field_type": extract_field_type, - "ter_furn_transform": extract_ter_furn_transform_messages + "ter_furn_transform": extract_ter_furn_transform_messages, + "skill_display_type": extract_skill_display_type } @@ -876,6 +910,8 @@ def extract_use_action_msgs(outfile, use_action, it_name, kwargs): def extract(item, infilename): """Find any extractable strings in the given json object, and write them to the appropriate file.""" + if not "type" in item: + raise WrongJSONItem("ERROR: Object doesn't have a type: {}".format(infilename), item) object_type = item["type"] outfile = get_outfile(object_type) kwargs = {} @@ -959,6 +995,10 @@ def extract(item, infilename): if "text" in item: writestr(outfile, item["text"], **kwargs) wrote = True + if "message" in item: + writestr(outfile, item["message"], format_strings=True, + comment="Message for {} '{}'".format(object_type, name), **kwargs ) + wrote = True if "messages" in item: for message in item["messages"]: writestr(outfile, message, **kwargs) @@ -980,6 +1020,11 @@ def extract(item, infilename): if "description" in special_attack: writestr(outfile, special_attack["description"], **kwargs) wrote = True + if "monster_message" in special_attack: + writestr(outfile, special_attack["monster_message"], format_strings=True, + comment="Attack message of monster \"{}\"'s spell \"{}\"" + .format(name, special_attack.get("spell_id")), **kwargs) + wrote = True if "footsteps" in item: writestr(outfile, item["footsteps"], **kwargs) wrote = True diff --git a/lang/po/cataclysm-dda.pot b/lang/po/cataclysm-dda.pot index 49a768cafc321..cfa45667c1f95 100644 --- a/lang/po/cataclysm-dda.pot +++ b/lang/po/cataclysm-dda.pot @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.D\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-23 23:11+0800\n" +"POT-Creation-Date: 2019-09-06 23:37+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -282,12 +282,71 @@ msgid "An unfired, like-new .22 round casing, with the primer still intact." msgstr "" #: lang/json/AMMO_from_json.py -msgid "gunpowder" +msgid "mixed gunpowder" msgstr "" -#. ~ Description for gunpowder +#. ~ Description for mixed gunpowder #: lang/json/AMMO_from_json.py -msgid "Firearm-quality gunpowder." +msgid "" +"Firearm-quality gunpowder, mixed without concern for composition, burn rate " +"or shape. It has been slightly ground to make its properties more uniform. " +"Only the truly desperate would attempt to reload with this." +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid "smokeless shotgun powder" +msgstr "" + +#. ~ Description for smokeless shotgun powder +#: lang/json/AMMO_from_json.py +msgid "Firearm-quality gunpowder, intended for use in shotgun shells." +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid "smokeless pistol powder" +msgstr "" + +#. ~ Description for smokeless pistol powder +#: lang/json/AMMO_from_json.py +msgid "Firearm-quality gunpowder, intended for use in pistol ammunition." +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid "smokeless magnum powder" +msgstr "" + +#. ~ Description for smokeless magnum powder +#: lang/json/AMMO_from_json.py +msgid "Firearm-quality gunpowder intended for use in magnum pistol ammunition." +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid "smokeless rifle powder" +msgstr "" + +#. ~ Description for smokeless rifle powder +#: lang/json/AMMO_from_json.py +msgid "Firearm-quality gunpowder intended for use in rifle ammunition." +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid "smokeless overbore rifle powder" +msgstr "" + +#. ~ Description for smokeless overbore rifle powder +#: lang/json/AMMO_from_json.py +msgid "Firearm-quality gunpowder intended for use in large rifle ammunition." +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid "artillery propellant" +msgstr "" + +#. ~ Description for artillery propellant +#: lang/json/AMMO_from_json.py +msgid "" +"Single base smokeless gunpowder intended for use in artillery propelling " +"charges." msgstr "" #: lang/json/AMMO_from_json.py @@ -570,7 +629,9 @@ msgstr "" #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid "oxygen" -msgstr "" +msgid_plural "oxygen" +msgstr[0] "" +msgstr[1] "" #. ~ Description for oxygen #: lang/json/AMMO_from_json.py @@ -1040,6 +1101,62 @@ msgid "" "smokescreen. When treated with a strong acid, it will produce hydrogen." msgstr "" +#: lang/json/AMMO_from_json.py +msgid "zinc oxide" +msgid_plural "zinc oxide" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for zinc oxide +#: lang/json/AMMO_from_json.py +msgid "" +"A handful of zinc oxide. It can be reduced into zinc, or used for some other " +"reactions of its own." +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid "manganese dioxide" +msgid_plural "manganese dioxide" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for manganese dioxide +#: lang/json/AMMO_from_json.py +msgid "" +"A handful of manganese dioxide powder. Occurring naturally in the mineral " +"pyrolusite, it is used commercially in the production of alkaline and zinc-" +"carbon batteries." +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid "potassium chloride" +msgid_plural "potassium chloride" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for potassium chloride +#: lang/json/AMMO_from_json.py +msgid "" +"A handful of potassium chloride. Although it occurs naturally in the mineral " +"sylvite, it can be produced as a byproduct of the reaction of saltpeter and " +"hydrochloric acid. It can be used for making fertilizer, or potassium " +"hydroxide by way of electrolysis." +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid "potassium hydroxide" +msgid_plural "potassium hydroxide" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for potassium hydroxide +#: lang/json/AMMO_from_json.py +msgid "" +"A handful of potassium hydroxide. Commonly called caustic potash, it was " +"mainly used industrially for its caustic nature. It can be used as an " +"electrolyte in alkaline batteries, among other applications." +msgstr "" + #: lang/json/AMMO_from_json.py msgid "sulfuric acid" msgid_plural "sulfuric acid" @@ -1055,6 +1172,20 @@ msgid "" "application." msgstr "" +#: lang/json/AMMO_from_json.py +msgid "hydrochloric acid" +msgid_plural "hydrochloric acid" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for hydrochloric acid +#: lang/json/AMMO_from_json.py +msgid "" +"Hydrochloric acid, also known as muriatic acid. It is a strong acid that has " +"a distinctive smell, important and frequently used ever since its discovery. " +"It still has a vast multitude of uses." +msgstr "" + #: lang/json/AMMO_from_json.py msgid "acetone" msgid_plural "acetone" @@ -2190,6 +2321,10 @@ msgid "" "powerful as the .38 or the 9x19mm though." msgstr "" +#: lang/json/AMMO_from_json.py +msgid ".32 ACP blackpowder" +msgstr "" + #: lang/json/AMMO_from_json.py msgid "reloaded .32 ACP" msgstr "" @@ -2318,15 +2453,11 @@ msgid "reloaded .38 Super" msgstr "" #: lang/json/AMMO_from_json.py -msgid "blackpowder .38 Special" +msgid ".38 FMJ blackpowder" msgstr "" -#. ~ Description for blackpowder .38 Special #: lang/json/AMMO_from_json.py -msgid "" -"This .38 Special cartridge is loaded with a 200gr cast lead hollowpoint and " -"23gr of blackpowder. While it's much slower than a regular .38, it has " -"tremendous stopping power." +msgid ".38 Special blackpowder" msgstr "" #: lang/json/AMMO_from_json.py @@ -2368,6 +2499,14 @@ msgid "" "in 9x18mm Makarov or 9x19mm firearms." msgstr "" +#: lang/json/AMMO_from_json.py +msgid ".380 ACP FMJ blackpowder" +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid ".380 ACP JHP blackpowder" +msgstr "" + #: lang/json/AMMO_from_json.py msgid "reloaded .380 ACP FMJ" msgstr "" @@ -2420,6 +2559,14 @@ msgid "" "strengths while reducing recoil." msgstr "" +#: lang/json/AMMO_from_json.py +msgid ".40 S&W FMJ blackpowder" +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid ".40 S&W JHP blackpowder" +msgstr "" + #: lang/json/AMMO_from_json.py msgid "reloaded .40 S&W FMJ" msgstr "" @@ -2595,14 +2742,11 @@ msgid "reloaded .44 Magnum" msgstr "" #: lang/json/AMMO_from_json.py -msgid "blackpowder .44 Magnum" +msgid ".44 Magnum blackpowder" msgstr "" -#. ~ Description for blackpowder .44 Magnum #: lang/json/AMMO_from_json.py -msgid "" -"This .44 Magnum cartridge is loaded with 39gr of blackpowder and a 200gr " -"cast lead semi-wadcutter." +msgid ".44 Magnum FMJ blackpowder" msgstr "" #: lang/json/AMMO_from_json.py @@ -2651,6 +2795,14 @@ msgid "" "accuracy and recoil." msgstr "" +#: lang/json/AMMO_from_json.py +msgid ".45 ACP FMJ blackpowder" +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid ".45 ACP JHP blackpowder" +msgstr "" + #: lang/json/AMMO_from_json.py msgid "reloaded .45 FMJ" msgstr "" @@ -2682,14 +2834,7 @@ msgid "reloaded .454 Casull" msgstr "" #: lang/json/AMMO_from_json.py -msgid "blackpowder .454 Casull" -msgstr "" - -#. ~ Description for blackpowder .454 Casull -#: lang/json/AMMO_from_json.py -msgid "" -"This strange anachronism of a cartridge is loaded with 45gr of blackpowder " -"and a relatively light 190gr cast lead hollowpoint." +msgid ".454 Casull blackpowder" msgstr "" #: lang/json/AMMO_from_json.py @@ -2808,6 +2953,20 @@ msgid "" "It has low recoil and excellent armor penetration." msgstr "" +#: lang/json/AMMO_from_json.py +msgid "4.6x30mm blackpowder" +msgstr "" + +#. ~ Description for 4.6x30mm blackpowder +#. ~ Description for reloaded 4.6x30mm +#: lang/json/AMMO_from_json.py +msgid "" +"4.6x30mm ammunition with 31gr copper plated lead bullets. The 4.6x30mm " +"round was developed by H&K to compete with FN Herstal's 5.7x28mm cartridge. " +"It has low recoil, but no usual armor penetration due to using simple lead " +"bullets rather than proper factory-made penetrator projectiles." +msgstr "" + #: lang/json/AMMO_from_json.py msgid "reloaded 4.6x30mm" msgstr "" @@ -2837,6 +2996,14 @@ msgid "" "seated bullets to prevent ammunition mix-ups." msgstr "" +#: lang/json/AMMO_from_json.py +msgid ".460 Rowland FMJ blackpowder" +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid ".460 Rowland blackpowder" +msgstr "" + #: lang/json/AMMO_from_json.py msgid "reloaded .460 Rowland FMJ" msgstr "" @@ -2936,6 +3103,10 @@ msgid "" "with one hit. It has extremely high damage and recoil to match." msgstr "" +#: lang/json/AMMO_from_json.py +msgid ".500 S&W Magnum blackpowder" +msgstr "" + #: lang/json/AMMO_from_json.py msgid "reloaded .500 S&W Magnum" msgstr "" @@ -3001,6 +3172,23 @@ msgid "" "feature." msgstr "" +#: lang/json/AMMO_from_json.py +msgid "5.7x28mm blackpowder" +msgstr "" + +#. ~ Description for 5.7x28mm blackpowder +#. ~ Description for reloaded 5.7x28mm +#: lang/json/AMMO_from_json.py +msgid "" +"5.7x28mm ammunition with 31gr AP FMJ bullets. The 5.7x28mm cartridge was " +"designed by FN Herstal to replace the 9x19mm round in NATO use. Although " +"the project to replace 9x19mm Parabellum was effectively canceled the " +"5.7x28mm round has seen action in many conflicts and has proven to be " +"reliable. It has very low recoil but no usual armor penetration due to " +"using simple lead bullets rather than proper factory-made penetrator " +"projectiles." +msgstr "" + #: lang/json/AMMO_from_json.py msgid "reloaded 5.7x28mm" msgstr "" @@ -3153,6 +3341,10 @@ msgid "" "damage." msgstr "" +#: lang/json/AMMO_from_json.py +msgid "7.62x25mm FMJ blackpowder" +msgstr "" + #: lang/json/AMMO_from_json.py msgid "reloaded 7.62x25mm" msgstr "" @@ -3381,6 +3573,14 @@ msgid "" "hardened steel core to improve armor penetration." msgstr "" +#: lang/json/AMMO_from_json.py +msgid "9x18mm blackpowder" +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid "9x18mm FMJ blackpowder" +msgstr "" + #: lang/json/AMMO_from_json.py msgid "reloaded 9x18mm" msgstr "" @@ -3905,6 +4105,21 @@ msgid_plural "platinum" msgstr[0] "" msgstr[1] "" +#: lang/json/AMMO_from_json.py +msgid "zinc" +msgid_plural "zinc" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for zinc +#: lang/json/AMMO_from_json.py +msgid "" +"A slightly brittle metal. Apart from being an essential mineral that the " +"body needs, it reacts readily with acids, alkalis and other non-metals. It " +"can be crushed to make zinc powder, used in the production of batteries, " +"among other things." +msgstr "" + #: lang/json/AMMO_from_json.py msgid "lead" msgid_plural "lead" @@ -6518,6 +6733,19 @@ msgid "" "collection of plates provides decent but not the most convenient protection." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "daypack" +msgid_plural "daypacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for daypack +#: lang/json/ARMOR_from_json.py +msgid "" +"An ultralight nylon backpack intended for one-day hiking trips. Waterproof, " +"slim, and spacious." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "dinosaur suit" msgid_plural "dinosaur suits" @@ -9850,6 +10078,19 @@ msgstr[1] "" msgid "A skinny black and white checkered necktie." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "ski jacket" +msgid_plural "ski jackets" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for ski jacket +#: lang/json/ARMOR_from_json.py +msgid "" +"An insulated, breathable hoodie made for alpine skiing. Very warm, and with " +"sizable pockets." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "skirt" msgid_plural "skirts" @@ -11373,6 +11614,91 @@ msgid "" "Useful for improvised rain protection." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "welding mask" +msgid_plural "welding masks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Use action menu_text for welding mask. +#. ~ Use action menu_text for crude welding mask. +#: lang/json/ARMOR_from_json.py +msgid "Raise" +msgstr "" + +#. ~ Use action msg for welding mask. +#. ~ Use action msg for crude welding mask. +#: lang/json/ARMOR_from_json.py +#, no-python-format +msgid "You push your %s up your head." +msgstr "" + +#. ~ Description for welding mask +#: lang/json/ARMOR_from_json.py +msgid "" +"A plastic mask with a very dark visor, meant to protect the entire face " +"while welding. It also serves as somewhat good armor, but makes it hard to " +"see. Activate it to push it up your head." +msgstr "" + +#: lang/json/ARMOR_from_json.py +msgid "crude welding mask" +msgid_plural "crude welding masks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for crude welding mask +#: lang/json/ARMOR_from_json.py +msgid "" +"A crude welding mask made from shaped steel. It's less dark than a proper " +"welding mask, and therefore less difficult to see in, but also less " +"protective when welding. Activate it to push it up your head." +msgstr "" + +#: lang/json/ARMOR_from_json.py +msgid "crude welding mask (raised)" +msgid_plural "crude welding masks (raised)" +msgstr[0] "" +msgstr[1] "" + +#. ~ Use action menu_text for crude welding mask (raised). +#. ~ Use action menu_text for welding mask (raised). +#: lang/json/ARMOR_from_json.py +msgid "Lower" +msgstr "" + +#. ~ Use action msg for crude welding mask (raised). +#: lang/json/ARMOR_from_json.py +msgid "You lower your crude welding mask over your face." +msgstr "" + +#. ~ Description for crude welding mask (raised) +#: lang/json/ARMOR_from_json.py +msgid "" +"A crude welding mask made from shaped steel. It's less dark than a proper " +"welding mask, and therefore less difficult to see in, but also less " +"protective when welding. Activate it to lower it over your face." +msgstr "" + +#: lang/json/ARMOR_from_json.py +msgid "welding mask (raised)" +msgid_plural "welding masks (raised)" +msgstr[0] "" +msgstr[1] "" + +#. ~ Use action msg for welding mask (raised). +#: lang/json/ARMOR_from_json.py +msgid "You lower your welding mask over your face." +msgstr "" + +#. ~ Description for welding mask (raised) +#: lang/json/ARMOR_from_json.py +msgid "" +"A plastic mask with a very dark visor, meant to protect the entire face " +"while welding. It also serves as somewhat good armor, but makes it hard to " +"see. Activate it to lower it over your face." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "survivor utility belt" msgid_plural "survivor utility belts" @@ -13907,19 +14233,6 @@ msgid "" "into its side. It can hold 40 arrows or bolts for easy access." msgstr "" -#: lang/json/ARMOR_from_json.py -msgid "daypack" -msgid_plural "daypacks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for daypack -#: lang/json/ARMOR_from_json.py -msgid "" -"An ultralight, bright red nylon backpack intended for one-day hiking trips. " -"Waterproof, slim, and spacious." -msgstr "" - #: lang/json/ARMOR_from_json.py msgid "hazardous environment suit" msgid_plural "hazardous environment suits" @@ -13959,19 +14272,6 @@ msgstr[1] "" msgid "A huge, patchwork wool quilt. Very, very warm." msgstr "" -#: lang/json/ARMOR_from_json.py -msgid "ski jacket" -msgid_plural "ski jackets" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for ski jacket -#: lang/json/ARMOR_from_json.py -msgid "" -"An insulated, breathable hoodie made for alpine skiing. Very warm, and with " -"sizable pockets." -msgstr "" - #: lang/json/ARMOR_from_json.py msgid "survivor utility belt (holster)" msgid_plural "survivor utility belt (holster)s" @@ -13993,33 +14293,6 @@ msgid_plural "survivor utility belt (sheath)s" msgstr[0] "" msgstr[1] "" -#: lang/json/ARMOR_from_json.py -msgid "welding mask" -msgid_plural "welding masks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for welding mask -#: lang/json/ARMOR_from_json.py -msgid "" -"A metal mask with a very dark visor, meant to protect the entire face during " -"welding. It also serves as good armor, but makes it hard to see." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "makeshift welding mask" -msgid_plural "makeshift welding masks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for makeshift welding mask -#: lang/json/ARMOR_from_json.py -msgid "" -"A crude welding mask made from shaped metal, with dark cloth and tinted " -"glass to protect the eyes. It's extremely hard to see with, but with " -"nothing else available, it can protect your sight while welding." -msgstr "" - #: lang/json/ARMOR_from_json.py msgid "brigandine" msgid_plural "brigandines" @@ -14077,12 +14350,12 @@ msgid "" msgstr "" #: lang/json/ARMOR_from_json.py -msgid "C.R.I.T face mask" -msgid_plural "C.R.I.T face masks" +msgid "CRIT face mask" +msgid_plural "CRIT face masks" msgstr[0] "" msgstr[1] "" -#. ~ Description for C.R.I.T face mask +#. ~ Description for CRIT face mask #: lang/json/ARMOR_from_json.py msgid "" "This is the C.R.I.T standard issue face mask, lined with kevlar for extra " @@ -14091,12 +14364,12 @@ msgid "" msgstr "" #: lang/json/ARMOR_from_json.py -msgid "pair of C.R.I.T boots" -msgid_plural "pair of C.R.I.T bootss" +msgid "pair of CRIT boots" +msgid_plural "pair of CRIT bootss" msgstr[0] "" msgstr[1] "" -#. ~ Description for pair of C.R.I.T boots +#. ~ Description for pair of CRIT boots #: lang/json/ARMOR_from_json.py msgid "" "C.R.I.T standard-issue boots. Next-gen gels keep feet comfortable and " @@ -14106,12 +14379,12 @@ msgid "" msgstr "" #: lang/json/ARMOR_from_json.py -msgid "pair of C.R.I.T LA boots" -msgid_plural "pairs of C.R.I.T LA boots" +msgid "pair of CRIT LA boots" +msgid_plural "pairs of CRIT LA boots" msgstr[0] "" msgstr[1] "" -#. ~ Description for pair of C.R.I.T LA boots +#. ~ Description for pair of CRIT LA boots #: lang/json/ARMOR_from_json.py msgid "" "C.R.I.T skeletonized boots. Based off of C.R.I.T boots, the light-armor " @@ -14121,12 +14394,12 @@ msgid "" msgstr "" #: lang/json/ARMOR_from_json.py -msgid "pair of C.R.I.T fingertip-less gloves" -msgid_plural "pair of C.R.I.T fingertip-less glovess" +msgid "pair of CRIT fingertip-less gloves" +msgid_plural "pairs of CRIT fingertip-less gloves" msgstr[0] "" msgstr[1] "" -#. ~ Description for pair of C.R.I.T fingertip-less gloves +#. ~ Description for pair of CRIT fingertip-less gloves #: lang/json/ARMOR_from_json.py msgid "" "C.R.I.T standard-issue gloves. Made with superalloy mesh for those with gene-" @@ -14135,12 +14408,12 @@ msgid "" msgstr "" #: lang/json/ARMOR_from_json.py -msgid "pair of C.R.I.T fingertip-less liners" -msgid_plural "pair of C.R.I.T fingertip-less linerss" +msgid "pair of CRIT fingertip-less liners" +msgid_plural "pairs of CRIT fingertip-less liners" msgstr[0] "" msgstr[1] "" -#. ~ Description for pair of C.R.I.T fingertip-less liners +#. ~ Description for pair of CRIT fingertip-less liners #: lang/json/ARMOR_from_json.py msgid "" "C.R.I.T standard-issue glove liners. Made with neroprene and rubber mesh for " @@ -14149,12 +14422,12 @@ msgid "" msgstr "" #: lang/json/ARMOR_from_json.py -msgid "C.R.I.T backpack" -msgid_plural "C.R.I.T backpacks" +msgid "CRIT backpack" +msgid_plural "CRIT backpacks" msgstr[0] "" msgstr[1] "" -#. ~ Description for C.R.I.T backpack +#. ~ Description for CRIT backpack #: lang/json/ARMOR_from_json.py msgid "" "C.R.I.T standard-issue pack. Based on the MOLLE backpack's design, this " @@ -14164,25 +14437,25 @@ msgid "" msgstr "" #: lang/json/ARMOR_from_json.py -msgid "C.R.I.T chestrig" -msgid_plural "C.R.I.T chestrigs" +msgid "CRIT chestrig" +msgid_plural "CRIT chestrigs" msgstr[0] "" msgstr[1] "" -#. ~ Description for C.R.I.T chestrig +#. ~ Description for CRIT chestrig #: lang/json/ARMOR_from_json.py msgid "" "C.R.I.T standard-issue chestrig, has mesh and MOLLE loops for gear and slots " -"for light-armor padding." +"with light-armor padding." msgstr "" #: lang/json/ARMOR_from_json.py -msgid "C.R.I.T leg guards" -msgid_plural "C.R.I.T leg guardss" +msgid "pair of CRIT leg guards" +msgid_plural "pairs of CRIT leg guards" msgstr[0] "" msgstr[1] "" -#. ~ Description for C.R.I.T leg guards +#. ~ Description for pair of CRIT leg guards #: lang/json/ARMOR_from_json.py msgid "" "C.R.I.T standard-issue leg armor. Simple design and durable material allows " @@ -14191,12 +14464,12 @@ msgid "" msgstr "" #: lang/json/ARMOR_from_json.py -msgid "pair of C.R.I.T arm guards" +msgid "pair of CRIT arm guards" msgid_plural "pairs of C.R.I.T arm guards" msgstr[0] "" msgstr[1] "" -#. ~ Description for pair of C.R.I.T arm guards +#. ~ Description for pair of CRIT arm guards #: lang/json/ARMOR_from_json.py msgid "" "A pair of arm guards made from superalloy molded upon neoprene, and then " @@ -14205,12 +14478,12 @@ msgid "" msgstr "" #: lang/json/ARMOR_from_json.py -msgid "C.R.I.T web belt" -msgid_plural "C.R.I.T web belts" +msgid "CRIT web belt" +msgid_plural "CRIT web belts" msgstr[0] "" msgstr[1] "" -#. ~ Description for C.R.I.T web belt +#. ~ Description for CRIT web belt #: lang/json/ARMOR_from_json.py msgid "" "C.R.I.T standard-issue belt. Keeps your trousers up and your weapons on your " @@ -14218,26 +14491,26 @@ msgid "" msgstr "" #: lang/json/ARMOR_from_json.py -msgid "C.R.I.T infantry duster" -msgid_plural "C.R.I.T infantry dusters" +msgid "CRIT infantry duster" +msgid_plural "CRIT infantry dusters" msgstr[0] "" msgstr[1] "" -#. ~ Description for C.R.I.T infantry duster +#. ~ Description for CRIT infantry duster #: lang/json/ARMOR_from_json.py msgid "" -"A thick full-length duster coat with rubber insulation. Mildly encumbering, " -"but rather protective against any anti-infantry electrical discharges from " -"the robots. Has several pockets for storage." +"A thick full-length duster coat with rubber insulation. More than mildly " +"encumbering, but rather protective against any anti-infantry electrical " +"discharges from the robots. Has several pockets for storage." msgstr "" #: lang/json/ARMOR_from_json.py -msgid "R&D Engineering Suit" -msgid_plural "R&D Engineering Suits" +msgid "CRIT Engineering Suit" +msgid_plural "CRIT Engineering Suits" msgstr[0] "" msgstr[1] "" -#. ~ Description for R&D Engineering Suit +#. ~ Description for CRIT Engineering Suit #: lang/json/ARMOR_from_json.py msgid "" "An airtight, flexible suit of woven composite fibers complete with segmented " @@ -14247,12 +14520,12 @@ msgid "" msgstr "" #: lang/json/ARMOR_from_json.py -msgid "C.R.I.T Armored Anomaly Suit" -msgid_plural "C.R.I.T Armored Anomaly Suits" +msgid "CRIT Armored Anomaly Suit" +msgid_plural "CRIT Armored Anomaly Suits" msgstr[0] "" msgstr[1] "" -#. ~ Description for C.R.I.T Armored Anomaly Suit +#. ~ Description for CRIT Armored Anomaly Suit #: lang/json/ARMOR_from_json.py msgid "" "A relatively simple suit of armor. A suit of woven composite fibers combined " @@ -14262,12 +14535,12 @@ msgid "" msgstr "" #: lang/json/ARMOR_from_json.py -msgid "C.R.I.T drop leg pouch" +msgid "CRIT drop leg pouch" msgid_plural "C.R.I.T drop leg pouches" msgstr[0] "" msgstr[1] "" -#. ~ Description for C.R.I.T drop leg pouch +#. ~ Description for CRIT drop leg pouch #: lang/json/ARMOR_from_json.py msgid "" "A set of pouches that can be worn on the thighs using buckled straps. This " @@ -14275,12 +14548,12 @@ msgid "" msgstr "" #: lang/json/ARMOR_from_json.py -msgid "C.R.I.T Enforcer armor assembly" -msgid_plural "C.R.I.T Enforcer armor assemblys" +msgid "CRIT Enforcer armor assembly" +msgid_plural "CRIT Enforcer armor assemblys" msgstr[0] "" msgstr[1] "" -#. ~ Description for C.R.I.T Enforcer armor assembly +#. ~ Description for CRIT Enforcer armor assembly #: lang/json/ARMOR_from_json.py msgid "" "A series of plates, guards and buckles which assemble into a suit of sturdy " @@ -14293,12 +14566,12 @@ msgid "" msgstr "" #: lang/json/ARMOR_from_json.py -msgid "pair of C.R.I.T Enforcer docks" -msgid_plural "pairs of C.R.I.T Enforcer docks" +msgid "pair of CRIT Enforcer docks" +msgid_plural "pairs of CRIT Enforcer docks" msgstr[0] "" msgstr[1] "" -#. ~ Description for pair of C.R.I.T Enforcer docks +#. ~ Description for pair of CRIT Enforcer docks #: lang/json/ARMOR_from_json.py msgid "" "C.R.I.T Enforcer docks. Metal plates vaguely molded into the shape of " @@ -14309,12 +14582,12 @@ msgid "" msgstr "" #: lang/json/ARMOR_from_json.py -msgid "C.R.I.T Soldier Suit" -msgid_plural "C.R.I.T Soldier Suits" +msgid "CRIT Soldier Suit" +msgid_plural "CRIT Soldier Suits" msgstr[0] "" msgstr[1] "" -#. ~ Description for C.R.I.T Soldier Suit +#. ~ Description for CRIT Soldier Suit #: lang/json/ARMOR_from_json.py msgid "" "A suit of modern body-armor. Strategically placed superalloy plates keep the " @@ -14324,12 +14597,12 @@ msgid "" msgstr "" #: lang/json/ARMOR_from_json.py -msgid "C.R.I.T Lone Wolf Series Armor" -msgid_plural "C.R.I.T Lone Wolf Series Armors" +msgid "CRIT Lone Wolf Series Armor" +msgid_plural "CRIT Lone Wolf Series Armors" msgstr[0] "" msgstr[1] "" -#. ~ Description for C.R.I.T Lone Wolf Series Armor +#. ~ Description for CRIT Lone Wolf Series Armor #: lang/json/ARMOR_from_json.py msgid "" "A matte black suit of outdated and bulky looking plate armor fitted onto a " @@ -14409,6 +14682,12 @@ msgid "" "made with cotton with a neoprene lining for grip-pads and warmth. " msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "C.R.I.T web belt" +msgid_plural "C.R.I.T web belts" +msgstr[0] "" +msgstr[1] "" + #. ~ Description for C.R.I.T web belt #: lang/json/ARMOR_from_json.py msgid "" @@ -14445,18 +14724,31 @@ msgid "" msgstr "" #: lang/json/ARMOR_from_json.py -msgid "C.R.I.T canteen" -msgid_plural "C.R.I.T canteens" +msgid "CRIT canteen" +msgid_plural "CRIT canteens" msgstr[0] "" msgstr[1] "" -#. ~ Description for C.R.I.T canteen +#. ~ Description for CRIT canteen #: lang/json/ARMOR_from_json.py msgid "" "A simple, durable steel canteen that can heat up food with built in " "plutonium heating elements." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "wet bandana" +msgid_plural "wet bandanas" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for wet bandana +#: lang/json/ARMOR_from_json.py +msgid "" +"A dampened cotton bandana, worn over the mouth for a extra protection from " +"dust and other contaminants." +msgstr "" + #. ~ Description for pistol bandolier #: lang/json/ARMOR_from_json.py msgid "" @@ -14593,6 +14885,12 @@ msgid_plural "pairs of black dragonhide gloves" msgstr[0] "" msgstr[1] "" +#: lang/json/ARMOR_from_json.py +msgid "belt of strength +2" +msgid_plural "belts of strength +2" +msgstr[0] "" +msgstr[1] "" + #: lang/json/ARMOR_from_json.py lang/json/GENERIC_from_json.py msgid "pair of magical armored stone gauntlets" msgid_plural "pairs of armored gauntlets" @@ -16107,7 +16405,7 @@ msgstr "" #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "Squeaky Ankles" -msgid_plural "Squeaky Ankless" +msgid_plural "Squeaky Ankles" msgstr[0] "" msgstr[1] "" @@ -16118,7 +16416,7 @@ msgstr "" #: lang/json/BIONIC_ITEM_from_json.py msgid "Pieces Of Junk" -msgid_plural "Pieces Of Junks" +msgid_plural "Pieces of Junk" msgstr[0] "" msgstr[1] "" @@ -16289,7 +16587,7 @@ msgstr "" #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "Wire-Induced Stiffness" -msgid_plural "Wire-Induced Stiffnesss" +msgid_plural "Wire-Induced Stiffnesses" msgstr[0] "" msgstr[1] "" @@ -16300,7 +16598,7 @@ msgstr "" #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "Self-Locking Thumbs" -msgid_plural "Self-Locking Thumbss" +msgid_plural "Self-Locking Thumbs" msgstr[0] "" msgstr[1] "" @@ -16972,6 +17270,20 @@ msgid "" "subjects' bodies." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "CRC-Merck handbook, 4th edition" +msgid_plural "copies of the CRC-Merck handbook, 4th edition" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for CRC-Merck handbook, 4th edition +#: lang/json/BOOK_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "Ye Scots Beuk o Cuikery" msgid_plural "copies of Ye Scots Beuk o Cuikery" @@ -17853,6 +18165,22 @@ msgstr[1] "" msgid "A textbook on civil engineering and construction." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "Machinery's Handbook" +msgid_plural "copies of Machinery's Handbook" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for Machinery's Handbook +#: lang/json/BOOK_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "Guide to Advanced Emergency Care" msgid_plural "Guides to Advanced Emergency Care" @@ -17926,6 +18254,41 @@ msgstr[1] "" msgid "Illustrated how-to guide for your first aid kit." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "Physicians' Desk Reference" +msgid_plural "copies of the Physicians' Desk Reference" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for Physicians' Desk Reference +#: lang/json/BOOK_from_json.py +msgid "" +"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." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "Merck Veterinary Manual" +msgid_plural "copies of The Merck Veterinary Manual" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for Merck Veterinary Manual +#: lang/json/BOOK_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "Guns n Ammo" msgid_plural "Guns n Ammo" @@ -18041,6 +18404,21 @@ msgstr[1] "" msgid "An advanced mechanics manual, covering all sorts of topics." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "lab journal-Curie" +msgid_plural "lab journals-Curie" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for lab journal-Curie +#: lang/json/BOOK_from_json.py +msgid "" +"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..." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "Biodiesel: Renewable Fuel Resource" msgid_plural "Biodiesel: Renewable Fuel Resource" @@ -18711,6 +19089,320 @@ msgstr[1] "" msgid "Aliens, ray guns, and space ships." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Gibson's \"Neuromancer\". Written in the eighties, it was " +"surprisingly accurate in predicting much of modern society... Until " +"recently." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Stars My Destination\" by Alfred Bester. \n" +"\n" +"Tyger, Tyger, Burning bright, \n" +"In the forests of the night: \n" +"What immortal hand or eye, \n" +"Dare frame thy fearful symmetry?" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Lathe of Heaven\" by Ursula Le Guin. Dirty finger-" +"stains have smudged the occasional word." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Dispossessed\" by Ursula Le Guin." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This copy of Ray Bradbury's \"Fahrenheit 451\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a well-worn copy of \"The Hitchhikers Guide to the Galaxy\" by " +"Douglas Adams." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Hyperion\" by Dan Simmons." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Endymion\" by Dan Simmons. It opens with a poem by D.H. " +"Lawrence:\n" +"\n" +"Give us gods. Oh give them us! \n" +"Give us gods. \n" +"We are so tired of men \n" +"And motor-power." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Philip K. Dick's \"Do Androids Dream of Electric Sheep?\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a dog-eared copy of \"Nova Express\" by William Burroughs." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Foundation\" by Isaac Asimov. The back cover has been " +"ripped off." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a dog-eared copy of \"Dune\" by Frank Herbert. It has sand between " +"some of its pages. Weird." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Trial\" by Franz Kafka. This book is rather worn." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Handmaid's Tale\" by Margaret Atwood." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Windup Girl\" by Paolo Bacigalupi. The blurb makes " +"you wonder how Thailand fared the end of the world." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Islands in the Net\" by Bruce Sterling." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Foundation and Empire\" by Isaac Asimov. The back page " +"contains a hand-written grocery list." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is an almost new copy of \"A Scanner Darkly\" by Philip K. Dick. It " +"still has the smell of new books within it's pages." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Mirrorshades: A Cyberpunk Anthology\" compiled by Bruce " +"Sterling. The cover has rings of coffee stains over it." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The World of Null-A\" by A. E. van Vogt. This copy " +"looks to have been used to press flowers." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Altered Carbon\" by Richard Morgan." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Mary Shelly's \"Frankenstein\". Wasn't that the name of " +"the monster?" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Wasp\" by Eric Frank Russel. The futuristic terrorists " +"handbook." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"I Am Legend\" by Richard Matheson. The sleeve is " +"covered in dried blood." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Roadside Picnic\" by Arkady and Boris Strugatsky." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Forever War\" by Joe Haldeman. This copy looks as " +"if it's been slightly chewed by a dog or other large animal." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Moon Is a Harsh Mistress\" by Robert A. Heinlein." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Cat's Cradle\" by Kurt Vonnegut. You notice there is a " +"typo in the authors name on the spine of the book." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Samuel R. Delany's \"Nova\". The cover reads \"Review " +"Copy. Not for re-sale.\"" +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Vonnegut's \"The Sirens of Titan\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Grass\" by Sheri S. Tepper. A child has scribbled over " +"the first pages in crayon." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of William Gibson's \"Count Zero\". The spine is stamped " +"with 'Library Copy'. And a sticker reading 'Science Fiction'." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Fifth Season\" by N.K. Jemsin. It smells faintly of " +"dirt." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Weapon Makers\" by A. E. van Vogt." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Record of a Spaceborn Few\" by Becky Chambers. It looks " +"almost brand new." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Use of Weapons\" by Ian M. Banks. The spine is cracked " +"and worn, some pages appear to be loose." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Jean-Baptiste Cousin de Grainville's \"Le Dernier Homme\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Orwells \"Nineteen Eighty-Four\". The pages are loose and " +"thin. You should probably be careful with this copy." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Heinlein's \"Stranger in a Strange Land\". The cover is " +"dog-eared and worn." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Orson Scott Card's \"Ender's Game\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a weather worn copy of \"Brave New World\" by Aldous Huxley." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Lost World\" by Arthur Conan Doyle." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Islands in the Sky\" by Arthur C. Clarke." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of H. G. Wells' \"The Island of Doctor Moreau\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Stanislaw Lem's \"His Masters Voice\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Fred Hoyle's \"The Black Cloud\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Last and First Men\" by Olaf Stapeldon." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Stanislaw Lem's \"Solaris\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of Theodore Sturgeon's \"More Than Human\"." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Vurt\" by Jeff Noon." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"A Canticle for Leibowitz\" by Walter M. Miller Jr." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The War of The Worlds\" by H.G Wells." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Iron Sunrise\" by Charles Stross." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Hunger Games\" by Suzanne Collins. Reading the " +"blurb reminds you of a Japanese movie you think you once caught on the " +"television late at night." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Day of the Triffids\" by John Wyndham." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"A Clockwork Orange\" by Anthony Burges." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Man Who Fell to Earth\" by Walter Tevis." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"Simulacron-3\" by Daniel F. Galouye." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "This is a copy of \"The Glass Bees\" by Ernst Jünger." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Journey to The Center of the Earth\" by Jules Verne." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of Larry Niven's \"Ringworld\". There are a couple of pages " +"missing from the end of the book. Luckily only mail-order advertisements." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "sports novel" msgid_plural "sports novels" @@ -18854,8 +19546,8 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"A collection of texts and essays by Jacques Derrida. It's pages loose and " -"yellowed, you should probably handle it with care." +"A collection of texts and essays by Jacques Derrida. Its pages are loose " +"and yellowed - you should probably handle it with care." msgstr "" #: lang/json/BOOK_from_json.py @@ -19788,6 +20480,19 @@ msgid "" "wild, aimed at the experienced backpacker." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "Natural Remedies of New England" +msgid_plural "copies of Natural Remedies of New England" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for Natural Remedies of New England +#: lang/json/BOOK_from_json.py +msgid "" +"A leather bound manuscript, it features native herbal remedies with hand " +"colored illustrations of each plant." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "Swim Planet" msgid_plural "Swim Planet" @@ -20051,24 +20756,6 @@ msgid "" "it lets you forget the horrors of the Cataclysm, if only for a moment." msgstr "" -#: lang/json/BOOK_from_json.py -msgid "lab journal-Curie" -msgid_plural "lab journals-Curie" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for lab journal-Curie -#: lang/json/BOOK_from_json.py -msgid "" -"This lab notebook is filled with the collective discoveries and refinements " -"of a research team dedicated to nuclear energy. It mostly pertains to " -"fission power, but there's also blueprints for recycling plutonium, " -"adaptation of nuclear power into everyday batteries, early specs for several " -"Rivtech products, and... schematics for a nuclear warhead. You don't think " -"you're ready to start a second Cataclysm, but the details about the " -"miniaturized handheld version on the next page might be useful..." -msgstr "" - #: lang/json/BOOK_from_json.py msgid "USMC M1014 technical manual" msgid_plural "USMC M1014 technical manuals" @@ -20140,7 +20827,7 @@ msgstr[1] "" #: lang/json/BOOK_from_json.py msgid "" "A book detailing the workings of state of the art atomic technology, and the " -"physics behind it" +"physics behind it." msgstr "" #: lang/json/BOOK_from_json.py @@ -21344,6 +22031,19 @@ msgid "" "Prohibition era." msgstr "" +#: lang/json/COMESTIBLE_from_json.py +msgid "donut holes" +msgid_plural "donut holes" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for donut holes +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"These balls of dough have been cut into shape, covered with sugar, and " +"cooked to a crisp. A staple of fairgrounds everywhere." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "sourdough bread" msgstr "" @@ -25667,7 +26367,9 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "antibiotics" -msgstr "" +msgid_plural "antibiotics" +msgstr[0] "" +msgstr[1] "" #. ~ Description for antibiotics #: lang/json/COMESTIBLE_from_json.py @@ -31154,17 +31856,6 @@ msgstr "" msgid "A powerful hallucinogen with low risk of addiction." msgstr "" -#: lang/json/COMESTIBLE_from_json.py -msgid "plain cake" -msgstr "" - -#. ~ Description for plain cake -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"A modest chocolate cake with no icing added. Nothing special, but some of " -"the best you can get nowadays. Besides, cake is cake!" -msgstr "" - #: lang/json/COMESTIBLE_from_json.py msgid "nutriment" msgstr "" @@ -31199,19 +31890,6 @@ msgid "" "to bake bread more efficiently than with just flour." msgstr "" -#: lang/json/COMESTIBLE_from_json.py -msgid "fried donut holes" -msgid_plural "fried donut holes" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for fried donut holes -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"These balls of dough have been cut into shape, covered with sugar, and " -"cooked to a crisp. A staple of fairgrounds everywhere." -msgstr "" - #: lang/json/COMESTIBLE_from_json.py msgid "sundew" msgstr "" @@ -32946,6 +33624,19 @@ msgid "" "easily sealed." msgstr "" +#: lang/json/CONTAINER_from_json.py +msgid "survival kit box" +msgid_plural "survival kit boxs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for survival kit box +#: lang/json/CONTAINER_from_json.py +msgid "" +"An aluminum box that used to contain a small survival kit. Can hold 1 liter " +"of liquid." +msgstr "" + #: lang/json/CONTAINER_from_json.py msgid "blood draw kit" msgid_plural "blood draw kits" @@ -33464,6 +34155,32 @@ msgstr[1] "" msgid "A handful of rock salt crystals. Could be refined into table salt." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "rhodonite" +msgid_plural "rhodonite" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for rhodonite +#: lang/json/GENERIC_from_json.py +msgid "" +"A chunk of rhodonite. It has manganese dioxide covering and going through it " +"in veins, which can be obtained using a chisel." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "zincite" +msgid_plural "zincite" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for zincite +#: lang/json/GENERIC_from_json.py +msgid "" +"A chunk of zincite. Could be refined into zinc oxide, then into zinc by " +"reduction with a source of carbon." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "hickory root" msgid_plural "hickory roots" @@ -36089,6 +36806,19 @@ msgstr[1] "" msgid "A reinforced brick designed to withstand intense heat." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "survival kit" +msgid_plural "survival kits" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for survival kit +#: lang/json/GENERIC_from_json.py +msgid "" +"A small box filled with tools and items to help you survive in case of an " +"emergency. Disassemble to get its content." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "canister grenade" msgid_plural "canister grenades" @@ -37205,6 +37935,20 @@ msgid "" "metallic pill makes you feel uncomfortable." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "integrated circuit datasheet archives" +msgid_plural "misc software" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for integrated circuit datasheet archives +#: lang/json/GENERIC_from_json.py +msgid "" +"Huge archives of numerous IC circuit datasheets from several major " +"manufacturers. Probably valuable to the right person, as it would be hard " +"to salvage and reuse these components without them." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "atomic coffee maker" msgid_plural "atomic coffee makers" @@ -37277,7 +38021,7 @@ msgid "" "to open the cover and show the light." msgstr "" -#: lang/json/GENERIC_from_json.py lang/json/TOOL_from_json.py +#: lang/json/GENERIC_from_json.py msgid "atomic reading light" msgid_plural "atomic reading lights" msgstr[0] "" @@ -37348,6 +38092,22 @@ msgid "" "cans." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "sieve" +msgid_plural "sieves" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for sieve +#: lang/json/GENERIC_from_json.py +msgid "" +"This is no mere strainer for noodles; it's a sieve used to separate " +"particles of certain sizes. You could use this to do a really good job " +"sifting flour, remove dust and soil from grain, or perhaps conduct " +"gradiation tests for any civil engineers you might know. This one has been " +"constructed from steel mesh." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "carding paddles" msgid_plural "pairs of carding paddles" @@ -40208,6 +40968,32 @@ msgstr[1] "" msgid "A stovetop kettle for boiling water." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "mesh colander" +msgid_plural "mesh colanders" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for mesh colander +#: lang/json/GENERIC_from_json.py +msgid "" +"A stainless steel mesh colander, for washing rice, vegetables or straining " +"liquid off from noodles or other foods." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "splatter guard" +msgid_plural "splatter guards" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for splatter guard +#: lang/json/GENERIC_from_json.py +msgid "" +"A stainless steel mesh screen for preventing flying oil from getting all " +"over your nice counters (or you) when frying." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "cutting board" msgid_plural "cutting boards" @@ -43361,6 +44147,42 @@ msgstr[1] "" msgid "A very small dishwasher designed for use in vehicles." msgstr "" +#: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py +msgid "light wheel mount" +msgid_plural "light wheel mounts" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for light wheel mount +#: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py +msgid "A piece of metal with holes suitable for a bike or motorbike wheel." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "medium hub assembly" +msgid_plural "medium hub assemblys" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for medium hub assembly +#: lang/json/GENERIC_from_json.py +msgid "" +"A metal assembly that allows bolting a wheel on a car. Fit for a car wheel." +msgstr "" + +#: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py +msgid "heavy hub assembly" +msgid_plural "heavy hub assemblys" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for heavy hub assembly +#: lang/json/GENERIC_from_json.py +msgid "" +"A heavy metal assembly that allows bolting a wheel on a car. Fit for a large " +"car wheel." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "Dana's family sourdough starter" msgid_plural "Dana's family sourdough starters" @@ -43490,11 +44312,6 @@ msgid "" "power." msgstr "" -#. ~ Description for rolling pin -#: lang/json/GENERIC_from_json.py -msgid "A light wooden rolling pin used to flatten dough." -msgstr "" - #: lang/json/GENERIC_from_json.py msgid "scrap titanium" msgid_plural "scrap titanium" @@ -43939,12 +44756,12 @@ msgid "A bundle of plant matter" msgstr "" #: lang/json/GENERIC_from_json.py -msgid "C.R.I.T hatchet" -msgid_plural "C.R.I.T hatchets" +msgid "CRIT hatchet" +msgid_plural "CRIT hatchets" msgstr[0] "" msgstr[1] "" -#. ~ Description for C.R.I.T hatchet +#. ~ Description for CRIT hatchet #: lang/json/GENERIC_from_json.py msgid "" "An incredibly sharp, heavy duty, one-handed hatchet. Makes a great melee " @@ -45294,6 +46111,19 @@ msgid_plural "Spell Scrolls" msgstr[0] "" msgstr[1] "" +#: lang/json/GENERIC_from_json.py +msgid "Scroll of Dark Sight" +msgid_plural "Scroll of Dark Sights" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for Scroll of Dark Sight +#: lang/json/GENERIC_from_json.py +msgid "" +"The darkness holds no secrets for the arcane. Adjust your sight to see in " +"perfect darkness!" +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "Scroll of Smite" msgid_plural "Scroll of Smites" @@ -46193,12 +47023,12 @@ msgid "" msgstr "" #: lang/json/GENERIC_from_json.py -msgid "Scroll of Laze" -msgid_plural "Scroll of Lazes" +msgid "Scroll of Synaptic Stimulation" +msgid_plural "Scroll of Synaptic Stimulations" msgstr[0] "" msgstr[1] "" -#. ~ Description for Scroll of Laze +#. ~ Description for Scroll of Synaptic Stimulation #. ~ Description for Synaptic Stimulation #: lang/json/GENERIC_from_json.py lang/json/SPELL_from_json.py msgid "" @@ -46207,6 +47037,12 @@ msgid "" "enhancing your reflexes, speed, and raw intellectual power. Use responsibly!" msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "Scroll of Laze" +msgid_plural "Scroll of Lazes" +msgstr[0] "" +msgstr[1] "" + #. ~ Description for Scroll of Laze #. ~ Description for Laze #: lang/json/GENERIC_from_json.py lang/json/SPELL_from_json.py @@ -48492,18 +49328,6 @@ msgid "" "magazine to fit flush with the bottom of the stock." msgstr "" -#: lang/json/MAGAZINE_from_json.py -msgid "makeshift .22 30-round magazine" -msgstr "" - -#. ~ Description for makeshift .22 30-round magazine -#: lang/json/MAGAZINE_from_json.py -msgid "" -"A makeshift 30-round single-column steel magazine which fits Ruger 10/22 " -"rifle, but may fit some makeshift magazine-fed weapons as well. Don't " -"expect much reliability." -msgstr "" - #: lang/json/MAGAZINE_from_json.py msgid "S&W 22A magazine" msgstr "" @@ -48855,18 +49679,6 @@ msgstr "" msgid "A 14 round double stack box magazine for the SIG Sauer P320." msgstr "" -#: lang/json/MAGAZINE_from_json.py -msgid "makeshift .38 25-round magazine" -msgstr "" - -#. ~ Description for makeshift .38 25-round magazine -#: lang/json/MAGAZINE_from_json.py -msgid "" -"A makeshift 25-round single-column steel magazine which fits Taurus Pro .38 " -"pistol, but may fit some makeshift magazine-fed firearms as well. Don't " -"expect much reliability." -msgstr "" - #: lang/json/MAGAZINE_from_json.py msgid "Taurus .38 magazine" msgstr "" @@ -49007,9 +49819,9 @@ msgstr "" #. ~ Description for makeshift .40 20-round magazine #: lang/json/MAGAZINE_from_json.py msgid "" -"A makeshift 20-round single-column steel magazine which fits Glock 22 " -"pistol, but may fit some makeshift magazine-fed firearms as well. Don't " -"expect much reliability." +"An improvised magazine that is mostly compatible with a homemade 'Luty' " +"submachinegun, with a simplified feed system. It looks like it might feed " +"20 rounds of .40S&W." msgstr "" #: lang/json/MAGAZINE_from_json.py @@ -49137,9 +49949,9 @@ msgstr "" #. ~ Description for makeshift .45 20-round magazine #: lang/json/MAGAZINE_from_json.py msgid "" -"A makeshift 20-round single-column steel magazine which fits MAC-10, but may " -"fit some makeshift magazine-fed firearms as well. Don't expect much " -"reliability." +"An improvised magazine that is mostly compatible with a homemade 'Luty' " +"submachinegun, with a simplified feed system. It looks like it might feed " +"20 rounds of .45 ACP." msgstr "" #: lang/json/MAGAZINE_from_json.py @@ -49224,8 +50036,8 @@ msgstr "" #. ~ Description for .454 5-round speedloader #: lang/json/MAGAZINE_from_json.py msgid "" -"This speedloader can hold 5 rounds of .454 and quickly reload a compatible " -"revolver." +"This speedloader can hold 5 rounds of .454 or .45 Colt and quickly reload a " +"compatible revolver." msgstr "" #: lang/json/MAGAZINE_from_json.py @@ -49632,7 +50444,7 @@ msgstr "" #. ~ Description for makeshift STEN magazine #: lang/json/MAGAZINE_from_json.py msgid "" -"An improvised magazine designed to be compatible with the STEN submachine " +"An improvised magazine that is mostly compatible with the STEN submachine " "gun, with a simplified feed system." msgstr "" @@ -49982,6 +50794,20 @@ msgid "" "systems." msgstr "" +#: lang/json/MAGAZINE_from_json.py lang/json/vehicle_part_from_json.py +msgid "large storage battery" +msgid_plural "large storage batteries" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for large storage battery +#: lang/json/MAGAZINE_from_json.py +msgid "" +"A huge storage battery containing many lithium ion cells. Holds a " +"tremendous amount of energy. Could be installed into a storage battery case " +"for easy removal from a vehicle, or just welded straight in." +msgstr "" + #: lang/json/MAGAZINE_from_json.py lang/json/vehicle_part_from_json.py msgid "medium storage battery" msgid_plural "medium storage batteries" @@ -50020,20 +50846,6 @@ msgid "" "just welded straight in." msgstr "" -#: lang/json/MAGAZINE_from_json.py -#: lang/json/vehicle_part_from_json.py -msgid "large storage battery" -msgid_plural "large storage batteries" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for large storage battery -#: lang/json/MAGAZINE_from_json.py -msgid "" -"A huge lithium ion storage battery, weighing easily 600 pounds. Holds a " -"tremendous amount of energy." -msgstr "" - #: lang/json/MAGAZINE_from_json.py msgid "ultra-light battery cell" msgstr "" @@ -50486,8 +51298,9 @@ msgstr "" #. ~ Description for C.R.I.T Expansion Mod #: lang/json/MOD_INFO_from_json.py msgid "" -"Adds new professions, guns, gunmods, enemies, materials, martial arts, " -"melees/tools and weapon techniques." +"Adds a plethora of content: professions, guns/mods, WIP enemies, mutations, " +"martial arts, melee weapons, and some QOL changes such as plants fromm " +"cutting grass." msgstr "" #: lang/json/MOD_INFO_from_json.py @@ -51442,19 +52255,6 @@ msgid "" "on a set of hydraulic treads and is armed with a 9x19mm SMG." msgstr "" -#: lang/json/MONSTER_from_json.py -msgid "turret" -msgstr "" - -#. ~ Description for turret -#: lang/json/MONSTER_from_json.py -msgid "" -"The General Atomics TX-1 Guardian, a small, pill-shaped automated gun turret " -"using state of the art ATR systems to dynamically reorient itself to new " -"friends and enemies alike. The two SMG barrels can swivel a full 360 " -"degrees." -msgstr "" - #: lang/json/MONSTER_from_json.py msgid "skitterbot" msgstr "" @@ -53348,42 +54148,6 @@ msgstr "" msgid "The mi-go scout fires its weapon!" msgstr "" -#: lang/json/MONSTER_from_json.py -msgid "laser turret" -msgstr "" - -#. ~ Description for laser turret -#: lang/json/MONSTER_from_json.py -msgid "" -"The TX-5LR Cerberus is an upgrade to its predecessors. It features a state " -"of the art revolving laser cannon system with three barrels that charge from " -"solar cells embedded in its hull." -msgstr "" - -#: lang/json/MONSTER_from_json.py -msgid "antimateriel turret" -msgstr "" - -#. ~ Description for antimateriel turret -#: lang/json/MONSTER_from_json.py -msgid "" -"Leadworks LLC's T-107A1 Interdictor, an automated .50BMG antimateriel " -"rifle. Credited with forestalling countless car-bombing attempts, it has " -"always been kept under extremely tight control, so as to itself maintain " -"extremely tight control of its area. And then the Cataclysm struck." -msgstr "" - -#: lang/json/MONSTER_from_json.py -msgid "milspec turret" -msgstr "" - -#. ~ Description for milspec turret -#: lang/json/MONSTER_from_json.py -msgid "" -"Leadworks LLC's T-4A1 Sentry. It features improved firmware over General " -"Atomics' TX-1 9x19mm model and an automated 5.56mm carbine." -msgstr "" - #: lang/json/MONSTER_from_json.py msgid "debug monster" msgstr "" @@ -55510,6 +56274,57 @@ msgid "" "of vascular tissue reach out to the surrounding root walls." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "improvised MP5 turret" +msgstr "" + +#. ~ Description for improvised MP5 turret +#: lang/json/MONSTER_from_json.py +msgid "" +"An MP5 attached to a motorized chassis with basic autonomous software " +"control. There is no mechanism to reload the weapon when its magazine is " +"empty and the fire control system is only designed for semi automatic fire." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "laser turret" +msgstr "" + +#. ~ Description for laser turret +#: lang/json/MONSTER_from_json.py +msgid "" +"The TX-5LR Cerberus is an upgrade to its predecessors. It features a state " +"of the art revolving laser cannon system with three barrels that charge from " +"solar cells embedded in its hull." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "M2HB autonomous CROWS II" +msgstr "" + +#. ~ Description for M2HB autonomous CROWS II +#: lang/json/MONSTER_from_json.py +msgid "" +"A remote weapon system derived from the M153 CROWS II and enhanced with " +"autonomous operation software. Thousands of these were deployed by the US " +"military before the cataclysm and they were valued for their use in engaging " +"anything up to light vehicles at long range without exposing the operator. " +"This one is fitted with a M2HB." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "M249 autonomous CROWS II" +msgstr "" + +#. ~ Description for M249 autonomous CROWS II +#: lang/json/MONSTER_from_json.py +msgid "" +"A remote weapon system derived from the M153 CROWS II and enhanced with " +"autonomous operation software. Thousands of these were deployed by the US " +"military before the cataclysm and they were valued for their use in engaging " +"infantry without exposing the operator. This one is fitted with a M249." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "anklebiter" msgstr "" @@ -56119,9 +56934,22 @@ msgstr "" #. ~ Description for Slasher Necromorph #: lang/json/MONSTER_from_json.py msgid "" -"A horrifically twisted human body. Two massive blades have burst through its " -"hands which are poised above its head endlessly as it stalks about with " -"terrifying purpose." +"A horrifically twisted human body. Two massive, bladed appendages have burst " +"through its shoulders where they are poised above its head as it stalks " +"about with terrifying purpose." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "Weak Slasher Necromorph" +msgstr "" + +#. ~ Description for Weak Slasher Necromorph +#: lang/json/MONSTER_from_json.py +msgid "" +"A horrifically mutilated human body. Two scrawny blades have freshly bursted " +"through its hand to deal with prey and the haunting visage of a jawless maw " +"and a gaping wound in its forehead sends chills down your spine. The awkward " +"steps it takes slows it down greatly." msgstr "" #: lang/json/MONSTER_from_json.py @@ -56521,6 +57349,11 @@ msgid "" "intelligence and unnerving malevolence." msgstr "" +#. ~ Attack message of monster "nothic"'s spell "necrotic_gaze" +#: lang/json/MONSTER_from_json.py +msgid "The nothic gazes at %3$s!" +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "owlbear cub" msgstr "" @@ -57970,7 +58803,7 @@ msgid "" "Industries. You could put this on a friendly horse." msgstr "" -#: lang/json/SPELL_from_json.py src/avatar.cpp +#: lang/json/SPELL_from_json.py src/memorial_logger.cpp #: src/player_display.cpp msgid "Pain" msgstr "" @@ -58096,6 +58929,22 @@ msgid "" "rune as a catalyst for recipes." msgstr "" +#: lang/json/SPELL_from_json.py lang/json/effects_from_json.py +msgid "Dark Sight" +msgstr "" + +#. ~ Description for Dark Sight +#: lang/json/SPELL_from_json.py +msgid "Gives you the power to see in the dark" +msgstr "" + +#. ~ Message for SPELL 'Dark Sight' +#: lang/json/SPELL_from_json.py +msgid "" +"Your eyes glow green for a moment. Now your sight can pierce the darkest " +"shadows." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Megablast" msgstr "" @@ -58134,6 +58983,12 @@ msgstr "" msgid "This is a template to show off all the available values" msgstr "" +#. ~ Message for SPELL 'Template Spell' +#: lang/json/SPELL_from_json.py +#, python-format +msgid "As you cast %s, your ears pops!" +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Spawn Debug Monsters" msgstr "" @@ -58143,6 +58998,19 @@ msgstr "" msgid "Set level to number of monsters spawned." msgstr "" +#. ~ Message for SPELL 'Spawn Debug Monsters' +#. ~ Message for SPELL 'Debug Fatigue Spell' +#. ~ Message for SPELL 'Debug HP Spell' +#. ~ Message for SPELL 'Debug Bionic Spell' +#. ~ Message for SPELL 'Debug effect spell' +#. ~ Message for SPELL 'Test Area Pull' +#. ~ Message for SPELL 'Test Area Pull (Field)' +#. ~ Message for SPELL 'Test Area Push' +#: lang/json/SPELL_from_json.py +#, python-format +msgid "Debug spell %s cast." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Debug Stamina Spell" msgstr "" @@ -58152,6 +59020,12 @@ msgstr "" msgid "Uses a little stamina" msgstr "" +#. ~ Message for SPELL 'Debug Stamina Spell' +#: lang/json/SPELL_from_json.py +#, python-format +msgid "Debug spell [ %s ] has no effect. Debug warning is expected." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Debug Fatigue Spell" msgstr "" @@ -58716,7 +59590,7 @@ msgstr "" #. ~ Use action need_charges_msg for mining helmet. #. ~ Use action need_charges_msg for hazardous environment helmet. -#. ~ Use action need_charges_msg for C.R.I.T helmet (off). +#. ~ Use action need_charges_msg for CRIT helmet (off). #: lang/json/TOOL_ARMOR_from_json.py msgid "The helmet's batteries are dead." msgstr "" @@ -58751,7 +59625,7 @@ msgstr[1] "" #. ~ Use action menu_text for thermal electric outfit (on). #. ~ Use action menu_text for shooter's earmuffs. #. ~ Use action menu_text for hazardous environment helmet (on). -#. ~ Use action menu_text for C.R.I.T gasmask (on). +#. ~ Use action menu_text for CRIT gasmask (on). #. ~ Use action menu_text for cellphone - Flashlight. #. ~ Use action menu_text for gasoline lantern (on). #. ~ Use action menu_text for oil lamp. @@ -58764,12 +59638,12 @@ msgstr[1] "" #. ~ Use action menu_text for flashlight (on). #. ~ Use action menu_text for heavy duty flashlight (on). #. ~ Use action menu_text for acetylene lamp (on). -#. ~ Use action menu_text for atomic reading light (on). #. ~ Use action menu_text for power cutter (on). #. ~ Use action menu_text for murdersaw (on). #: lang/json/TOOL_ARMOR_from_json.py #: lang/json/TOOL_ARMOR_from_json.py lang/json/TOOL_from_json.py #: lang/json/TOOL_from_json.py +#: lang/json/TOOL_from_json.py lang/json/item_action_from_json.py #: lang/json/item_action_from_json.py #: lang/json/item_action_from_json.py src/iuse.cpp msgid "Turn off" @@ -60345,12 +61219,12 @@ msgid "" msgstr "" #: lang/json/TOOL_ARMOR_from_json.py -msgid "C.R.I.T S-I G.E.A.R" -msgid_plural "C.R.I.T S-I G.E.A.Rs" +msgid "CRIT S-I G.E.A.R" +msgid_plural "CRIT S-I G.E.A.Rs" msgstr[0] "" msgstr[1] "" -#. ~ Description for C.R.I.T S-I G.E.A.R +#. ~ Description for CRIT S-I G.E.A.R #: lang/json/TOOL_ARMOR_from_json.py msgid "" "C.R.I.T standard issue General Engineering Assistance Rig. Plugged into your " @@ -60359,22 +61233,22 @@ msgid "" msgstr "" #: lang/json/TOOL_ARMOR_from_json.py -msgid "C.R.I.T gasmask (off)" -msgid_plural "C.R.I.T gasmask (off)s" +msgid "CRIT gasmask (off)" +msgid_plural "CRIT gasmask (off)s" msgstr[0] "" msgstr[1] "" -#. ~ Use action msg for C.R.I.T gasmask (off). +#. ~ Use action msg for CRIT gasmask (off). #: lang/json/TOOL_ARMOR_from_json.py msgid "C.R.T HUD booting up..." msgstr "" -#. ~ Use action need_charges_msg for C.R.I.T gasmask (off). +#. ~ Use action need_charges_msg for CRIT gasmask (off). #: lang/json/TOOL_ARMOR_from_json.py msgid "Power levels too low for safe boot up" msgstr "" -#. ~ Description for C.R.I.T gasmask (off) +#. ~ Description for CRIT gasmask (off) #: lang/json/TOOL_ARMOR_from_json.py msgid "" "This is the C.R.I.T Spec Ops modified gasmask, fitted with top-of-the-line " @@ -60385,17 +61259,17 @@ msgid "" msgstr "" #: lang/json/TOOL_ARMOR_from_json.py -msgid "C.R.I.T gasmask (on)" -msgid_plural "C.R.I.T gasmask (on)s" +msgid "CRIT gasmask (on)" +msgid_plural "CRIT gasmask (on)s" msgstr[0] "" msgstr[1] "" -#. ~ Use action msg for C.R.I.T gasmask (on). +#. ~ Use action msg for CRIT gasmask (on). #: lang/json/TOOL_ARMOR_from_json.py msgid "C.R.T HUD deactivating." msgstr "" -#. ~ Description for C.R.I.T gasmask (on) +#. ~ Description for CRIT gasmask (on) #: lang/json/TOOL_ARMOR_from_json.py msgid "" "This is the C.R.I.T Spec Ops modified gasmask. It is currently on and " @@ -60404,70 +61278,70 @@ msgid "" msgstr "" #: lang/json/TOOL_ARMOR_from_json.py -msgid "C.R.I.T EM vest (off)" -msgid_plural "C.R.I.T EM vest (off)s" +msgid "CRIT EM vest (off)" +msgid_plural "CRIT EM vest (off)s" msgstr[0] "" msgstr[1] "" -#. ~ Use action msg for C.R.I.T EM vest (off). +#. ~ Use action msg for CRIT EM vest (off). #: lang/json/TOOL_ARMOR_from_json.py msgid "C.R.I.T EM booting up..." msgstr "" -#. ~ Use action need_charges_msg for C.R.I.T EM vest (off). +#. ~ Use action need_charges_msg for CRIT EM vest (off). #: lang/json/TOOL_ARMOR_from_json.py msgid "Power levels too low for safe bootup..." msgstr "" -#. ~ Description for C.R.I.T EM vest (off) +#. ~ Description for CRIT EM vest (off) #: lang/json/TOOL_ARMOR_from_json.py msgid "" "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 extra protection " -"and movement." +"Ops for its ease of use and manuverability. Turn it on for suit mode, extra " +"protection and movement." msgstr "" #: lang/json/TOOL_ARMOR_from_json.py -msgid "C.R.I.T EM vest (on)" -msgid_plural "C.R.I.T EM vest (on)s" +msgid "CRIT EM vest (on)" +msgid_plural "CRIT EM vest (on)s" msgstr[0] "" msgstr[1] "" -#. ~ Use action menu_text for C.R.I.T EM vest (on). +#. ~ Use action menu_text for CRIT EM vest (on). #: lang/json/TOOL_ARMOR_from_json.py msgid "Turn off armor" msgstr "" -#. ~ Use action msg for C.R.I.T EM vest (on). +#. ~ Use action msg for CRIT EM vest (on). #: lang/json/TOOL_ARMOR_from_json.py msgid "C.R.I.T E.M powering off..." msgstr "" -#. ~ Description for C.R.I.T EM vest (on) +#. ~ Description for CRIT EM vest (on) #: lang/json/TOOL_ARMOR_from_json.py msgid "" "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 " -"high power usage. It is commonly worn by C.R.I.T Spec Ops. This vest is " +"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." msgstr "" #: lang/json/TOOL_ARMOR_from_json.py -msgid "C.R.I.T helmet (off)" -msgid_plural "C.R.I.T helmet (off)s" +msgid "CRIT helmet (off)" +msgid_plural "CRIT helmet (off)s" msgstr[0] "" msgstr[1] "" -#. ~ Use action msg for C.R.I.T helmet (off). +#. ~ Use action msg for CRIT helmet (off). #: lang/json/TOOL_ARMOR_from_json.py #, no-python-format msgid "You turn the %s on." msgstr "" -#. ~ Description for C.R.I.T helmet (off) +#. ~ Description for CRIT helmet (off) #: lang/json/TOOL_ARMOR_from_json.py msgid "" "C.R.T standard-issue helmet. Protects the noggin and has a stretch of " @@ -60475,18 +61349,18 @@ msgid "" msgstr "" #: lang/json/TOOL_ARMOR_from_json.py -msgid "C.R.I.T helmet (on)" -msgid_plural "C.R.I.T helmet (on)s" +msgid "CRIT helmet (on)" +msgid_plural "CRIT helmet (on)s" msgstr[0] "" msgstr[1] "" -#. ~ Use action msg for C.R.I.T helmet (on). +#. ~ Use action msg for CRIT helmet (on). #: lang/json/TOOL_ARMOR_from_json.py #, no-python-format msgid "You turn the %s off." msgstr "" -#. ~ Description for C.R.I.T helmet (on) +#. ~ Description for CRIT helmet (on) #: lang/json/TOOL_ARMOR_from_json.py msgid "" "C.R.I.T standard-issue helmet. Protects the noggin and has a stretch of " @@ -61113,7 +61987,8 @@ msgstr "" msgid "" "This is a unified power supply, or UPS. It is a device developed jointly by " "military and scientific interests for use in combat and the field. The UPS " -"is designed to power armor and some guns, but drains batteries quickly." +"is designed to power bionics, armor and some guns, but drains batteries " +"quickly." msgstr "" #: lang/json/TOOL_from_json.py @@ -64199,7 +65074,6 @@ msgstr[0] "" msgstr[1] "" #. ~ Use action msg for reading light. -#. ~ Use action msg for atomic reading light. #: lang/json/TOOL_from_json.py msgid "You switch on the reading light." msgstr "" @@ -64982,9 +65856,7 @@ msgstr[1] "" #. ~ Use action menu_text for small space heater. #. ~ Use action menu_text for large space heater. -#. ~ Use action menu_text for atomic reading light. #: lang/json/TOOL_from_json.py -#: lang/json/TOOL_from_json.py lang/json/item_action_from_json.py #: lang/json/item_action_from_json.py #: lang/json/item_action_from_json.py src/iuse.cpp msgid "Turn on" @@ -66211,9 +67083,9 @@ msgid "" "This is an inactive turret. Using this item involves loading the unit with " "the factory-loaded 9x19mm rounds in your inventory (if you wish to divide " "your ammunition, set aside whatever 9x19mm you do NOT want to give the " -"turret) turning it on, and placing it on the ground, where it will attach " -"itself. If reprogrammed and rewired successfully the turret will then " -"identify you as a friendly, and attack all enemies with a built-in SMG." +"turret) turning it on, and placing it on the ground. If reprogrammed and " +"rewired successfully the turret will then identify you as a friendly, and " +"attack all enemies with its SMG." msgstr "" #: lang/json/TOOL_from_json.py @@ -68564,8 +69436,8 @@ msgstr[1] "" #: lang/json/TOOL_from_json.py msgid "" "A jumper cable, like you've seen many times before: it's a short multi-" -"stranded copper cable with power leads on either end, whose purpose is to " -"share power between vehicles." +"stranded copper cable with power leads on either end, whose main purpose is " +"to share power between vehicles, but can also link other electrical systems." msgstr "" #: lang/json/TOOL_from_json.py lang/json/vehicle_part_from_json.py @@ -68579,7 +69451,8 @@ msgstr[1] "" msgid "" "A long, thick, heavy-duty cable with power leads on either end. It looks " "like you could use it to hook up two vehicles to each other, though you " -"expect the power loss would be noticeable." +"expect the power loss would be noticeable. Can also link other electrical " +"systems." msgstr "" #: lang/json/TOOL_from_json.py lang/json/vehicle_part_from_json.py @@ -68678,36 +69551,6 @@ msgid_plural "atomic smartphones - Flashlight" msgstr[0] "" msgstr[1] "" -#. ~ Description for atomic reading light -#: lang/json/TOOL_from_json.py -msgid "" -"Rated for almost 100 million years of operation, the Rivtech atomic reading " -"light clips onto any book, anytime, anywhere! Following after their " -"obsession with making household gadgets powered with plutonium cells, it's " -"bulky for a reading light, but can provide a small, steady light with no " -"fear of ever running out of batteries." -msgstr "" - -#: lang/json/TOOL_from_json.py -msgid "atomic reading light (on)" -msgid_plural "atomic reading lights (on)" -msgstr[0] "" -msgstr[1] "" - -#. ~ Use action msg for atomic reading light (on). -#: lang/json/TOOL_from_json.py -msgid "You switch off the light." -msgstr "" - -#. ~ Description for atomic reading light (on) -#: lang/json/TOOL_from_json.py -msgid "" -"Rated for almost 200 million years of operation, the Rivtech atomic reading " -"light clips onto any book, anytime, anywhere! Its blue-tinted lens sheds a " -"pleasing Cherenkov glow in a small circle onto anything you might need to " -"read." -msgstr "" - #: lang/json/TOOL_from_json.py msgid "atompot" msgid_plural "atompots" @@ -68875,57 +69718,57 @@ msgid "" msgstr "" #: lang/json/TOOL_from_json.py -msgid "C.R.I.T mess kit" -msgid_plural "C.R.I.T mess kits" +msgid "CRIT mess kit" +msgid_plural "CRIT mess kits" msgstr[0] "" msgstr[1] "" -#. ~ Description for C.R.I.T mess kit +#. ~ Description for CRIT mess kit #: lang/json/TOOL_from_json.py msgid "" "C.R.I.T standard-issue mess kit designed for ease of transport. Based off of " "the normal military mess kit, but made to be telescopic, the parts are made " "from a thin sheet of a stainless superalloy composite and are insulated with " "ceramic. Sadly, this compact reimagining loses much of its battery life but " -"does have a rather small solar panel installed. Also comes with an absurdly " -"small integrated fpoon and knife spatula set!" +"does have a rather small (useless) solar panel installed. Also comes with an " +"absurdly small integrated fpoon and knife spatula set!" msgstr "" #: lang/json/TOOL_from_json.py -msgid "C.R.I.T service knife" -msgid_plural "C.R.I.T service knifes" +msgid "CRIT service knife" +msgid_plural "CRIT service knifes" msgstr[0] "" msgstr[1] "" -#. ~ Description for C.R.I.T service knife +#. ~ Description for CRIT service knife #: lang/json/TOOL_from_json.py msgid "" "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 pretty decent " -"reach as well. Something makes you feel... connected to the knife." +"allows for light-armor penetration. Blade length allows for decent reach." msgstr "" #: lang/json/TOOL_from_json.py -msgid "C.R.I.T Knuckledusters" -msgid_plural "C.R.I.T Knuckledusterss" +msgid "CRIT Knuckledusters" +msgid_plural "CRIT Knuckledusterss" msgstr[0] "" msgstr[1] "" -#. ~ Description for C.R.I.T Knuckledusters +#. ~ Description for CRIT Knuckledusters #: lang/json/TOOL_from_json.py msgid "" -"C.R.I.T CQB knuckledusters. Not too different from any normal pair, but the ." +"C.R.I.T CQB knuckledusters. Not too different from any normal pair other " +"than weight." msgstr "" #: lang/json/TOOL_from_json.py -msgid "C.R.I.T Reso-blade" -msgid_plural "C.R.I.T Reso-blades" +msgid "CRIT Reso-blade" +msgid_plural "CRIT Reso-blades" msgstr[0] "" msgstr[1] "" -#. ~ Description for C.R.I.T Reso-blade +#. ~ Description for CRIT Reso-blade #: lang/json/TOOL_from_json.py msgid "" "C.R.I.T melee weapon. Alien runes adorn the carbon steel blade. The blade " @@ -68950,12 +69793,12 @@ msgid "" msgstr "" #: lang/json/TOOL_from_json.py -msgid "C.R.I.T entrenching tool" -msgid_plural "C.R.I.T entrenching tools" +msgid "CRIT entrenching tool" +msgid_plural "CRIT entrenching tools" msgstr[0] "" msgstr[1] "" -#. ~ Description for C.R.I.T entrenching tool +#. ~ Description for CRIT entrenching tool #: lang/json/TOOL_from_json.py msgid "" "C.R.I.T standard-issue collapsible spade. A built in vibration system that " @@ -68964,17 +69807,16 @@ msgid "" msgstr "" #: lang/json/TOOL_from_json.py -msgid "C.R.I.T night stick" -msgid_plural "C.R.I.T night sticks" +msgid "CRIT night stick" +msgid_plural "CRIT night sticks" msgstr[0] "" msgstr[1] "" -#. ~ Description for C.R.I.T night stick +#. ~ Description for CRIT night stick #: lang/json/TOOL_from_json.py msgid "" "C.R.I.T standard issue guard tonfa. The length allows for great reach and " -"the domed tip allows for greater impact than a cylinder style baton. Blood " -"seems to soak into the length..." +"the domed tip allows for greater impact than a cylinder style baton." msgstr "" #: lang/json/TOOL_from_json.py @@ -71260,6 +72102,10 @@ msgstr "" msgid "reloading" msgstr "" +#: lang/json/activity_type_from_json.py +msgid "finding a mount" +msgstr "" + #: lang/json/activity_type_from_json.py msgid "reading" msgstr "" @@ -71269,24 +72115,45 @@ msgid "constructing" msgstr "" #: lang/json/activity_type_from_json.py -msgid "playing" +msgid "tidying up" msgstr "" #: lang/json/activity_type_from_json.py -msgid "waiting" +msgid "deconstructing a vehicle" msgstr "" #: lang/json/activity_type_from_json.py -msgid "crafting" +msgid "chopping logs" msgstr "" #: lang/json/activity_type_from_json.py -msgid "disassembly" +#: lang/json/tool_quality_from_json.py +msgid "butchering" +msgstr "" + +#: lang/json/activity_type_from_json.py +msgid "chopping trees" msgstr "" #: lang/json/activity_type_from_json.py #: lang/json/tool_quality_from_json.py -msgid "butchering" +msgid "fishing" +msgstr "" + +#: lang/json/activity_type_from_json.py +msgid "playing" +msgstr "" + +#: lang/json/activity_type_from_json.py +msgid "waiting" +msgstr "" + +#: lang/json/activity_type_from_json.py +msgid "crafting" +msgstr "" + +#: lang/json/activity_type_from_json.py +msgid "disassembly" msgstr "" #: lang/json/activity_type_from_json.py @@ -71333,10 +72200,6 @@ msgstr "" msgid "using first aid" msgstr "" -#: lang/json/activity_type_from_json.py -msgid "fishing" -msgstr "" - #: lang/json/activity_type_from_json.py msgid "mining" msgstr "" @@ -71393,6 +72256,14 @@ msgstr "" msgid "tilling the farm plot" msgstr "" +#: lang/json/activity_type_from_json.py +msgid "fetching components" +msgstr "" + +#: lang/json/activity_type_from_json.py +msgid "farming" +msgstr "" + #: lang/json/activity_type_from_json.py msgid "planting seeds" msgstr "" @@ -71491,7 +72362,11 @@ msgid "cutting the metal" msgstr "" #: lang/json/activity_type_from_json.py -msgid "chopping down" +msgid "chopping down a tree" +msgstr "" + +#: lang/json/activity_type_from_json.py +msgid "chopping a log" msgstr "" #: lang/json/activity_type_from_json.py @@ -71503,6 +72378,10 @@ msgstr "" msgid "drilling" msgstr "" +#: lang/json/activity_type_from_json.py +msgid "churning earth" +msgstr "" + #: lang/json/activity_type_from_json.py #: lang/json/tool_quality_from_json.py msgid "digging" @@ -72100,7 +72979,7 @@ msgstr "" #: lang/json/bionic_from_json.py msgid "" "You have a complex port surgically mounted above your hip. While active, it " -"will recharge bionic power when connected to a battery via jumper cable." +"will recharge bionic power when connected to a power source via jumper cable." msgstr "" #: lang/json/bionic_from_json.py @@ -74028,6 +74907,10 @@ msgstr "" msgid "Build Locker" msgstr "" +#: lang/json/construction_from_json.py +msgid "Build Wooden Rack" +msgstr "" + #: lang/json/construction_from_json.py msgid "Build Metal Rack" msgstr "" @@ -77596,6 +78479,21 @@ msgstr "" msgid "The wind at your back dies down." msgstr "" +#. ~ Description of effect 'Dark Sight'. +#: lang/json/effects_from_json.py +msgid "You can see in the dark." +msgstr "" + +#. ~ Apply message for effect(s) 'Dark Sight'. +#: lang/json/effects_from_json.py +msgid "Your sight adjusts to the darkness." +msgstr "" + +#. ~ Remove message for effect(s) 'Dark Sight'. +#: lang/json/effects_from_json.py +msgid "The darkness loses its shape." +msgstr "" + #: lang/json/effects_from_json.py msgid "Ethereal Hold" msgstr "" @@ -78370,6 +79268,15 @@ msgid "" "preaching human survival through symbiosis with fungaloids." msgstr "" +#: lang/json/faction_from_json.py +msgid "No Faction" +msgstr "" + +#. ~ Description for No Faction +#: lang/json/faction_from_json.py +msgid "A lone wolf, not aligned with any faction." +msgstr "" + #: lang/json/faction_from_json.py src/game.cpp msgid "The Wasteland Scavengers" msgstr "" @@ -78473,6 +79380,17 @@ msgid "" "if left uncleaned, leads to rust." msgstr "" +#: lang/json/fault_from_json.py +msgid "spent casing in chamber" +msgstr "" + +#. ~ Description for spent casing in chamber +#: lang/json/fault_from_json.py +msgid "" +"This gun currently has an empty casing chambered. It will have to be " +"removed before firing." +msgstr "" + #: lang/json/fault_from_json.py msgid "clogging" msgstr "" @@ -78562,7 +79480,7 @@ msgstr "" #: lang/json/field_type_from_json.py lang/json/overmap_terrain_from_json.py #: lang/json/overmap_terrain_from_json.py src/mapdata.cpp -#: src/mapdata.cpp +#: src/mapdata.cpp src/skill.cpp msgid "nothing" msgstr "" @@ -79007,6 +79925,832 @@ msgstr "" msgid "smoke vent" msgstr "" +#: lang/json/furniture_from_json.py +msgid "mutated cactus" +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "cooling unit" +msgstr "" + +#. ~ Description for cooling unit +#: lang/json/furniture_from_json.py +msgid "A big, blocky metal device for refrigerating large areas." +msgstr "" + +#: lang/json/furniture_from_json.py +#: lang/json/furniture_from_json.py lang/json/terrain_from_json.py +#: lang/json/terrain_from_json.py +msgid "metal screeching!" +msgstr "" + +#: lang/json/furniture_from_json.py +#: lang/json/furniture_from_json.py lang/json/terrain_from_json.py +#: lang/json/terrain_from_json.py +msgid "clang!" +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "central air filter" +msgstr "" + +#. ~ Description for central air filter +#: lang/json/furniture_from_json.py +msgid "Cleans out dust mites, smoke particles, and more!" +msgstr "" + +#. ~ Description for dishwasher +#: lang/json/furniture_from_json.py +msgid "" +"This metal box used to spray hot water and soap at dirty dishes to make them " +"clean and to save people an unpleasant chore. Now, with the power gone and " +"it sitting for a while, it's starting to smell a bit off." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "dryer" +msgstr "" + +#. ~ Description for dryer +#: lang/json/furniture_from_json.py +msgid "'Dry your clothes!' would be what you'd do if electricity was running." +msgstr "" + +#: lang/json/furniture_from_json.py lang/json/vehicle_part_from_json.py +msgid "refrigerator" +msgstr "" + +#. ~ Description for refrigerator +#: lang/json/furniture_from_json.py +msgid "" +"Freeze your food with the amazing science of electricity! Oh wait, none is " +"flowing. Well, as long as you don't open it, maybe it'll stay cool for " +"awhile." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "glass door fridge" +msgstr "" + +#. ~ Description for glass door fridge +#: lang/json/furniture_from_json.py +msgid "" +"Wow! See INTO your fridge before you open it and discover it's not working!" +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "furnace" +msgstr "" + +#. ~ Description for furnace +#: lang/json/furniture_from_json.py +msgid "" +"A gas-powered forced-air central heating unit, with an internal fan to push " +"the air through a building's air ducts and keep it warm." +msgstr "" + +#. ~ Description for washing machine +#: lang/json/furniture_from_json.py +msgid "You could wash your dirty clothes if electricity was running." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "oven" +msgstr "" + +#. ~ Description for oven +#: lang/json/furniture_from_json.py +msgid "" +"Used for heating and cooking food with electricity. Doesn't look like it's " +"working, although it still has parts. It might be safe to light a fire " +"inside of it, if you had to." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "road barricade" +msgstr "" + +#. ~ Description for road barricade +#: lang/json/furniture_from_json.py +msgid "A road barricade. For barricading roads." +msgstr "" + +#: lang/json/furniture_from_json.py +#: lang/json/terrain_from_json.py +#: src/map.cpp src/mapdata.cpp +msgid "smash!" +msgstr "" + +#: lang/json/furniture_from_json.py +#: lang/json/terrain_from_json.py +msgid "whump." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "earthbag barricade" +msgstr "" + +#. ~ Description for earthbag barricade +#: lang/json/furniture_from_json.py +msgid "An earthbag barricade, typically used for blocking bullets." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "rrrip!" +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "earthbag wall" +msgstr "" + +#. ~ Description for earthbag wall +#: lang/json/furniture_from_json.py +msgid "An earthbag wall." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "lane guard" +msgstr "" + +#. ~ Description for lane guard +#: lang/json/furniture_from_json.py +msgid "Used to be used for keeping traffic." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "sandbag barricade" +msgstr "" + +#. ~ Description for sandbag barricade +#: lang/json/furniture_from_json.py +msgid "A sandbag barricade, typically used for blocking bullets." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "sandbag wall" +msgstr "" + +#. ~ Description for sandbag wall +#: lang/json/furniture_from_json.py +msgid "A sandbag wall." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "indoor plant" +msgstr "" + +#. ~ Description for indoor plant +#: lang/json/furniture_from_json.py +msgid "A variety of plant, used for decoration." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "yellow indoor plant" +msgstr "" + +#. ~ Description for yellow indoor plant +#: lang/json/furniture_from_json.py +msgid "A variety of plant for decoration. It's yellow." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "harvestable plant" +msgstr "" + +#. ~ Description for harvestable plant +#: lang/json/furniture_from_json.py +msgid "" +"This plant is ready for harvest. Examine it more closely to identify how to " +"harvest the plant appropriately." +msgstr "" + +#: lang/json/furniture_from_json.py +#: lang/json/furniture_from_json.py lang/json/terrain_from_json.py +#: lang/json/terrain_from_json.py +msgid "crunch." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "whish." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "mature plant" +msgstr "" + +#. ~ Description for mature plant +#: lang/json/furniture_from_json.py +msgid "This plant has matured." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "seed" +msgstr "" + +#. ~ Description for seed +#: lang/json/furniture_from_json.py +msgid "" +"A humble planted seed. Actions are the seed of fate deeds grow into destiny." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "seedling" +msgstr "" + +#. ~ Description for seedling +#: lang/json/furniture_from_json.py +msgid "This plant is just getting started." +msgstr "" + +#: lang/json/furniture_from_json.py src/vehicle_use.cpp +msgid "planter" +msgstr "" + +#. ~ Description for planter +#: lang/json/furniture_from_json.py +msgid "" +"A garden planter full of soil and slatted to allow adequate drainage. Can " +"be used for planting crops." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "planter with harvestable plant" +msgstr "" + +#. ~ Description for planter with harvestable plant +#. ~ Description for planter with mature plant +#. ~ Description for planter with seed +#: lang/json/furniture_from_json.py +msgid "" +"A garden planter full of soil and slatted to allow adequate drainage. Can " +"be used for planting crops. This one contains a planted seed" +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "planter with mature plant" +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "planter with seed" +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "planter with seedling" +msgstr "" + +#. ~ Description for planter with seedling +#: lang/json/furniture_from_json.py +msgid "" +"A garden planter full of soil and slatted to allow adequate drainage. Can " +"be used for planting crops. This one contains a planted seedling" +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "fireplace" +msgstr "" + +#. ~ Description for fireplace +#: lang/json/furniture_from_json.py +msgid "" +"Ah. The relaxation of sitting in front of a fire as the world around you " +"crumbles. Towards the End, you could also get this service on your " +"television." +msgstr "" + +#: lang/json/furniture_from_json.py +#: lang/json/terrain_from_json.py +#: lang/json/terrain_from_json.py src/map.cpp +#: src/map.cpp +msgid "crash!" +msgstr "" + +#: lang/json/furniture_from_json.py +#: lang/json/terrain_from_json.py +msgid "whump!" +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "wood stove" +msgstr "" + +#. ~ Description for wood stove +#: lang/json/furniture_from_json.py +msgid "" +"Wood stove for heating and cooking. Much more efficient than an open flame." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "bathtub" +msgstr "" + +#. ~ Description for bathtub +#: lang/json/furniture_from_json.py +msgid "" +"You could lay in and take a soothing bath, if there were running water. The " +"plug is intact, so you could use it to store liquids." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "porcelain breaking!" +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "whunk!" +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "shower" +msgstr "" + +#. ~ Description for shower +#: lang/json/furniture_from_json.py +msgid "You would be able to clean yourself if water was running." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "sink" +msgstr "" + +#. ~ Description for sink +#: lang/json/furniture_from_json.py +msgid "" +"Emergency relief provider. Water isn't running, so it's basically useless." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "toilet" +msgstr "" + +#. ~ Description for toilet +#: lang/json/furniture_from_json.py +msgid "" +"A porcelain throne. Emergency water source, from the tank, and provider of " +"relief." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "water heater" +msgstr "" + +#. ~ Description for water heater +#: lang/json/furniture_from_json.py +msgid "" +"An insulated metal tank that holds water, kept to a temperature by a small " +"gas flame." +msgstr "" + +#. ~ Description for water purifier +#: lang/json/furniture_from_json.py +msgid "" +"This removes ions dissolved in the water, making it pretty clean, if you " +"care about that kind of thing." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "hay" +msgstr "" + +#. ~ Description for hay +#: lang/json/furniture_from_json.py +msgid "A bale of hay. You could sleep on it, if desperate." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "whish!" +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "pile of woodchips" +msgstr "" + +#. ~ Description for pile of woodchips +#: lang/json/furniture_from_json.py +msgid "Pile of chipped wood pieces. You can move it with a shovel." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "bench" +msgstr "" + +#. ~ Description for bench +#: lang/json/furniture_from_json.py +msgid "Hobo bed. Airy. Use at your own risk." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "arm chair" +msgstr "" + +#. ~ Description for arm chair +#: lang/json/furniture_from_json.py +msgid "A more comfortable way of sitting down." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "airplane seat" +msgstr "" + +#. ~ Description for airplane seat +#: lang/json/furniture_from_json.py +msgid "An airplane seat with a seatbelt." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "chair" +msgstr "" + +#. ~ Description for chair +#. ~ Description for stool +#: lang/json/furniture_from_json.py +msgid "Sit down, have a drink." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "sofa" +msgstr "" + +#. ~ Description for sofa +#: lang/json/furniture_from_json.py +msgid "Lie down OR sit down! Perfect!" +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "stool" +msgstr "" + +#: lang/json/furniture_from_json.py lang/json/vehicle_part_from_json.py +msgid "bed" +msgstr "" + +#. ~ Description for bed +#: lang/json/furniture_from_json.py +msgid "" +"This is a bed. A luxury in these times. Quite comfortable to sleep in." +msgstr "" + +#: lang/json/furniture_from_json.py +#: lang/json/terrain_from_json.py +#: src/iuse.cpp +msgid "crunch!" +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "bed frame" +msgstr "" + +#. ~ Description for bed frame +#: lang/json/furniture_from_json.py +msgid "" +"This is an empty bed frame. With a mattress on it, it would be a nice place " +"to sleep. Sleeping on it right now wouldn't be great." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "whack." +msgstr "" + +#. ~ Description for mattress +#: lang/json/furniture_from_json.py +msgid "" +"A comfortable mattress has been tossed on the floor for sleeping here. It's " +"not quite as comfy as a real bed, but it's pretty close." +msgstr "" + +#: lang/json/furniture_from_json.py +#: lang/json/furniture_from_json.py lang/json/terrain_from_json.py +#: lang/json/terrain_from_json.py +#: src/map.cpp +msgid "rrrrip!" +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "makeshift bed" +msgstr "" + +#. ~ Description for makeshift bed +#: lang/json/furniture_from_json.py +msgid "Not as comfortable as a real bed, but it will suffice." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "straw bed" +msgstr "" + +#. ~ Description for straw bed +#: lang/json/furniture_from_json.py +msgid "Kinda itches when you lay on it." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "bookcase" +msgstr "" + +#. ~ Description for bookcase +#: lang/json/furniture_from_json.py +msgid "Stores books. Y'know, those things. Who reads books anymore?" +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "coffin" +msgstr "" + +#. ~ Description for coffin +#: lang/json/furniture_from_json.py +msgid "Holds the bodies of the countless killed in the Cataclysm." +msgstr "" + +#: lang/json/furniture_from_json.py +#: lang/json/terrain_from_json.py +msgid "wham!" +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "open coffin" +msgstr "" + +#. ~ Description for open coffin +#: lang/json/furniture_from_json.py +msgid "" +"You can only hope you'll look good enough for one of these, when the time " +"comes." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "crate" +msgstr "" + +#. ~ Description for crate +#: lang/json/furniture_from_json.py +msgid "" +"What's inside? Pry it open to find out! Or just smash it, but you might " +"break the contents." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "open crate" +msgstr "" + +#. ~ Description for open crate +#: lang/json/furniture_from_json.py +msgid "What's inside? Look in it!" +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "cupboard" +msgstr "" + +#. ~ Description for cupboard +#: lang/json/furniture_from_json.py +msgid "Store your cups." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "dresser" +msgstr "" + +#. ~ Description for dresser +#: lang/json/furniture_from_json.py +msgid "Dress yourself for the zombie prom, or other occasions." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "glass front cabinet" +msgstr "" + +#. ~ Description for glass front cabinet +#: lang/json/furniture_from_json.py +msgid "A tall storage cabinet with a clear glass window." +msgstr "" + +#: lang/json/furniture_from_json.py +#: lang/json/terrain_from_json.py +#: lang/json/terrain_from_json.py src/ballistics.cpp src/iuse.cpp +#: src/map.cpp +msgid "glass breaking!" +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "gun safe" +msgstr "" + +#. ~ Description for gun safe +#: lang/json/furniture_from_json.py +msgid "Oooooohhhh. Shiny." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "screeching metal!" +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "jammed gun safe" +msgstr "" + +#. ~ Description for jammed gun safe +#: lang/json/furniture_from_json.py +msgid "Does it have guns in it? You won't find out. It's jammed." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "electronic gun safe" +msgstr "" + +#. ~ Description for electronic gun safe +#: lang/json/furniture_from_json.py +msgid "Can you hack it open to get the firearms?" +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "locker" +msgstr "" + +#. ~ Description for locker +#: lang/json/furniture_from_json.py +msgid "Usually used for storing equipment or items." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "mailbox" +msgstr "" + +#. ~ Description for mailbox +#: lang/json/furniture_from_json.py +msgid "" +"A metal box attached to the top of a wooden post. Mail delivery hasn't come " +"for awhile. Doesn't look like it's coming again anytime soon." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "display rack" +msgstr "" + +#. ~ Description for display rack +#: lang/json/furniture_from_json.py +msgid "Display your items." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "wooden rack" +msgstr "" + +#. ~ Description for wooden rack +#: lang/json/furniture_from_json.py +msgid "A simple wooden rack. Display your items on it." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "coat rack" +msgstr "" + +#. ~ Description for coat rack +#: lang/json/furniture_from_json.py +msgid "A hooked rack for hanging jackets and hats." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "recycle bin" +msgstr "" + +#. ~ Description for recycle bin +#: lang/json/furniture_from_json.py +msgid "Stores items for recycling." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "safe" +msgstr "" + +#. ~ Description for safe +#: lang/json/furniture_from_json.py +msgid "Holds items. Securely." +msgstr "" + +#. ~ Description for safe +#: lang/json/furniture_from_json.py +msgid "What needs protection like this?" +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "open safe" +msgstr "" + +#. ~ Description for open safe +#: lang/json/furniture_from_json.py +msgid "Grab the firearms!" +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "trash can" +msgstr "" + +#. ~ Description for trash can +#: lang/json/furniture_from_json.py +msgid "One man's trash is another man's dinner." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "utility shelf" +msgstr "" + +#. ~ Description for utility shelf +#: lang/json/furniture_from_json.py +msgid "A simple heavy-duty plastic and metal shelving unit." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "wooden keg" +msgstr "" + +#. ~ Description for wooden keg +#: lang/json/furniture_from_json.py +msgid "A keg made mostly of wood. Holds liquids, preferably alcoholic." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "counter" +msgstr "" + +#. ~ Description for counter +#: lang/json/furniture_from_json.py +msgid "Affixed to the wall or found in kitchens or stores." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "closed counter gate" +msgstr "" + +#. ~ Description for closed counter gate +#. ~ Description for open counter gate +#: lang/json/furniture_from_json.py +msgid "" +"A commercial quality swinging door made of wood that allows passage behind " +"counters." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "open counter gate" +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "desk" +msgstr "" + +#. ~ Description for desk +#: lang/json/furniture_from_json.py +msgid "Sit down at it or work on it." +msgstr "" + +#. ~ Description for leather tarp +#: lang/json/furniture_from_json.py +msgid "" +"A large sheet of sewn leather that can be used instead of a picnic blanket, " +"but it's more valuable as a butchery appliance as it does not soak in blood." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "plastic groundsheet" +msgstr "" + +#. ~ Description for plastic groundsheet +#: lang/json/furniture_from_json.py +msgid "" +"A large sheet of thick plastic has been tossed on the ground here. It would " +"be a useful place to do some butchery, perhaps." +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "whuff!" +msgstr "" + +#: lang/json/furniture_from_json.py +msgid "crinkle." +msgstr "" + +#. ~ Description for fiber mat +#: lang/json/furniture_from_json.py +msgid "" +"A large mat woven from fibrous material that can be used instead of a picnic " +"blanket, but it's more valuable as a butchery appliance. Too thin to be a " +"comfortable sleeping place." +msgstr "" + +#. ~ Description for tourist table +#: lang/json/furniture_from_json.py +msgid "" +"Small metal folding table, ideal for off-road trips into the wild. Can be " +"used as a workbench in a pinch." +msgstr "" + +#: lang/json/furniture_from_json.py +#: lang/json/vehicle_part_from_json.py +msgid "table" +msgstr "" + +#. ~ Description for table +#: lang/json/furniture_from_json.py +msgid "Sit down when you eat!" +msgstr "" + #: lang/json/furniture_from_json.py msgid "pile of rubble" msgstr "" @@ -79066,18 +80810,6 @@ msgid "" "notes for other survivors to read." msgstr "" -#: lang/json/furniture_from_json.py -#: lang/json/terrain_from_json.py -#: src/iuse.cpp -msgid "crunch!" -msgstr "" - -#: lang/json/furniture_from_json.py -#: lang/json/furniture_from_json.py lang/json/terrain_from_json.py -#: lang/json/terrain_from_json.py -msgid "whump." -msgstr "" - #: lang/json/furniture_from_json.py msgid "exercise machine" msgstr "" @@ -79089,18 +80821,6 @@ msgid "" "running for your life." msgstr "" -#: lang/json/furniture_from_json.py -#: lang/json/furniture_from_json.py lang/json/terrain_from_json.py -#: lang/json/terrain_from_json.py -msgid "metal screeching!" -msgstr "" - -#: lang/json/furniture_from_json.py -#: lang/json/furniture_from_json.py lang/json/terrain_from_json.py -#: lang/json/terrain_from_json.py -msgid "clang!" -msgstr "" - #: lang/json/furniture_from_json.py msgid "ball machine" msgstr "" @@ -79122,13 +80842,6 @@ msgstr "" msgid "Read it. Warnings ahead." msgstr "" -#: lang/json/furniture_from_json.py -#: lang/json/furniture_from_json.py lang/json/terrain_from_json.py -#: lang/json/terrain_from_json.py -#: src/map.cpp -msgid "smash!" -msgstr "" - #: lang/json/furniture_from_json.py msgid "pile of leaves" msgstr "" @@ -79140,34 +80853,6 @@ msgid "" "comfort or warmth." msgstr "" -#: lang/json/furniture_from_json.py -msgid "bench" -msgstr "" - -#. ~ Description for bench -#: lang/json/furniture_from_json.py -msgid "Hobo bed. Airy. Use at your own risk." -msgstr "" - -#: lang/json/furniture_from_json.py -#: lang/json/vehicle_part_from_json.py -msgid "table" -msgstr "" - -#. ~ Description for table -#: lang/json/furniture_from_json.py -msgid "Sit down when you eat!" -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "coat rack" -msgstr "" - -#. ~ Description for coat rack -#: lang/json/furniture_from_json.py -msgid "A hooked rack for hanging jackets and hats." -msgstr "" - #: lang/json/furniture_from_json.py msgid "warning sign" msgstr "" @@ -79226,13 +80911,6 @@ msgstr "" msgid "Buy stuff with a cash card." msgstr "" -#: lang/json/furniture_from_json.py -#: lang/json/terrain_from_json.py -#: lang/json/terrain_from_json.py src/ballistics.cpp src/iuse.cpp -#: src/map.cpp -msgid "glass breaking!" -msgstr "" - #: lang/json/furniture_from_json.py msgid "broken vending machine" msgstr "" @@ -79271,13 +80949,6 @@ msgstr "" msgid "A wall made of stretched, waterproof cloth." msgstr "" -#: lang/json/furniture_from_json.py -#: lang/json/furniture_from_json.py lang/json/terrain_from_json.py -#: lang/json/terrain_from_json.py -#: src/map.cpp -msgid "rrrrip!" -msgstr "" - #: lang/json/furniture_from_json.py #: lang/json/terrain_from_json.py msgid "slap!" @@ -79387,16 +81058,6 @@ msgid "" "that makes you feel sleepy." msgstr "" -#: lang/json/furniture_from_json.py -#: lang/json/furniture_from_json.py lang/json/terrain_from_json.py -#: lang/json/terrain_from_json.py -msgid "crunch." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "whish." -msgstr "" - #. ~ Description for fungal flower #: lang/json/furniture_from_json.py msgid "" @@ -79518,11 +81179,6 @@ msgstr "" msgid "The top of a chimney, it looks sooty." msgstr "" -#: lang/json/furniture_from_json.py -#: lang/json/terrain_from_json.py -msgid "whump!" -msgstr "" - #: lang/json/furniture_from_json.py msgid "TV antenna" msgstr "" @@ -79781,7 +81437,7 @@ msgstr "" #: lang/json/furniture_from_json.py #: lang/json/furniture_from_json.py lang/json/terrain_from_json.py -#: lang/json/terrain_from_json.py src/map.cpp +#: lang/json/terrain_from_json.py src/map.cpp src/mapdata.cpp msgid "thump!" msgstr "" @@ -79857,13 +81513,6 @@ msgid "" "absence of oxygen." msgstr "" -#: lang/json/furniture_from_json.py -#: lang/json/terrain_from_json.py -#: lang/json/terrain_from_json.py src/map.cpp -#: src/map.cpp -msgid "crash!" -msgstr "" - #: lang/json/furniture_from_json.py msgid "metal charcoal kiln" msgstr "" @@ -80895,731 +82544,6 @@ msgstr "" msgid "Seeing this is a bug. If seen, please report and destroy." msgstr "" -#: lang/json/furniture_from_json.py -msgid "mutated cactus" -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "cooling unit" -msgstr "" - -#. ~ Description for cooling unit -#: lang/json/furniture_from_json.py -msgid "A big, blocky metal device for refrigerating large areas." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "central air filter" -msgstr "" - -#. ~ Description for central air filter -#: lang/json/furniture_from_json.py -msgid "Cleans out dust mites, smoke particles, and more!" -msgstr "" - -#. ~ Description for dishwasher -#: lang/json/furniture_from_json.py -msgid "" -"This metal box used to spray hot water and soap at dirty dishes to make them " -"clean and to save people an unpleasant chore. Now, with the power gone and " -"it sitting for a while, it's starting to smell a bit off." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "dryer" -msgstr "" - -#. ~ Description for dryer -#: lang/json/furniture_from_json.py -msgid "'Dry your clothes!' would be what you'd do if electricity was running." -msgstr "" - -#: lang/json/furniture_from_json.py lang/json/vehicle_part_from_json.py -msgid "refrigerator" -msgstr "" - -#. ~ Description for refrigerator -#: lang/json/furniture_from_json.py -msgid "" -"Freeze your food with the amazing science of electricity! Oh wait, none is " -"flowing. Well, as long as you don't open it, maybe it'll stay cool for " -"awhile." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "glass door fridge" -msgstr "" - -#. ~ Description for glass door fridge -#: lang/json/furniture_from_json.py -msgid "" -"Wow! See INTO your fridge before you open it and discover it's not working!" -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "furnace" -msgstr "" - -#. ~ Description for furnace -#: lang/json/furniture_from_json.py -msgid "" -"A gas-powered forced-air central heating unit, with an internal fan to push " -"the air through a building's air ducts and keep it warm." -msgstr "" - -#. ~ Description for washing machine -#: lang/json/furniture_from_json.py -msgid "You could wash your dirty clothes if electricity was running." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "oven" -msgstr "" - -#. ~ Description for oven -#: lang/json/furniture_from_json.py -msgid "" -"Used for heating and cooking food with electricity. Doesn't look like it's " -"working, although it still has parts. It might be safe to light a fire " -"inside of it, if you had to." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "road barricade" -msgstr "" - -#. ~ Description for road barricade -#: lang/json/furniture_from_json.py -msgid "A road barricade. For barricading roads." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "earthbag barricade" -msgstr "" - -#. ~ Description for earthbag barricade -#: lang/json/furniture_from_json.py -msgid "An earthbag barricade, typically used for blocking bullets." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "rrrip!" -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "earthbag wall" -msgstr "" - -#. ~ Description for earthbag wall -#: lang/json/furniture_from_json.py -msgid "An earthbag wall." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "lane guard" -msgstr "" - -#. ~ Description for lane guard -#: lang/json/furniture_from_json.py -msgid "Used to be used for keeping traffic." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "sandbag barricade" -msgstr "" - -#. ~ Description for sandbag barricade -#: lang/json/furniture_from_json.py -msgid "A sandbag barricade, typically used for blocking bullets." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "sandbag wall" -msgstr "" - -#. ~ Description for sandbag wall -#: lang/json/furniture_from_json.py -msgid "A sandbag wall." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "indoor plant" -msgstr "" - -#. ~ Description for indoor plant -#: lang/json/furniture_from_json.py -msgid "A variety of plant, used for decoration." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "yellow indoor plant" -msgstr "" - -#. ~ Description for yellow indoor plant -#: lang/json/furniture_from_json.py -msgid "A variety of plant for decoration. It's yellow." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "harvestable plant" -msgstr "" - -#. ~ Description for harvestable plant -#: lang/json/furniture_from_json.py -msgid "" -"This plant is ready for harvest. Examine it more closely to identify how to " -"harvest the plant appropriately." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "mature plant" -msgstr "" - -#. ~ Description for mature plant -#: lang/json/furniture_from_json.py -msgid "This plant has matured." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "seed" -msgstr "" - -#. ~ Description for seed -#: lang/json/furniture_from_json.py -msgid "" -"A humble planted seed. Actions are the seed of fate deeds grow into destiny." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "seedling" -msgstr "" - -#. ~ Description for seedling -#: lang/json/furniture_from_json.py -msgid "This plant is just getting started." -msgstr "" - -#: lang/json/furniture_from_json.py src/vehicle_use.cpp -msgid "planter" -msgstr "" - -#. ~ Description for planter -#: lang/json/furniture_from_json.py -msgid "" -"A garden planter full of soil and slatted to allow adequate drainage. Can " -"be used for planting crops." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "planter with harvestable plant" -msgstr "" - -#. ~ Description for planter with harvestable plant -#. ~ Description for planter with mature plant -#. ~ Description for planter with seed -#: lang/json/furniture_from_json.py -msgid "" -"A garden planter full of soil and slatted to allow adequate drainage. Can " -"be used for planting crops. This one contains a planted seed" -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "planter with mature plant" -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "planter with seed" -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "planter with seedling" -msgstr "" - -#. ~ Description for planter with seedling -#: lang/json/furniture_from_json.py -msgid "" -"A garden planter full of soil and slatted to allow adequate drainage. Can " -"be used for planting crops. This one contains a planted seedling" -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "fireplace" -msgstr "" - -#. ~ Description for fireplace -#: lang/json/furniture_from_json.py -msgid "" -"Ah. The relaxation of sitting in front of a fire as the world around you " -"crumbles. Towards the End, you could also get this service on your " -"television." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "wood stove" -msgstr "" - -#. ~ Description for wood stove -#: lang/json/furniture_from_json.py -msgid "" -"Wood stove for heating and cooking. Much more efficient than an open flame." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "bathtub" -msgstr "" - -#. ~ Description for bathtub -#: lang/json/furniture_from_json.py -msgid "" -"You could lay in and take a soothing bath, if there were running water. The " -"plug is intact, so you could use it to store liquids." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "porcelain breaking!" -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "whunk!" -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "shower" -msgstr "" - -#. ~ Description for shower -#: lang/json/furniture_from_json.py -msgid "You would be able to clean yourself if water was running." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "sink" -msgstr "" - -#. ~ Description for sink -#: lang/json/furniture_from_json.py -msgid "" -"Emergency relief provider. Water isn't running, so it's basically useless." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "toilet" -msgstr "" - -#. ~ Description for toilet -#: lang/json/furniture_from_json.py -msgid "" -"A porcelain throne. Emergency water source, from the tank, and provider of " -"relief." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "water heater" -msgstr "" - -#. ~ Description for water heater -#: lang/json/furniture_from_json.py -msgid "" -"An insulated metal tank that holds water, kept to a temperature by a small " -"gas flame." -msgstr "" - -#. ~ Description for water purifier -#: lang/json/furniture_from_json.py -msgid "" -"This removes ions dissolved in the water, making it pretty clean, if you " -"care about that kind of thing." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "hay" -msgstr "" - -#. ~ Description for hay -#: lang/json/furniture_from_json.py -msgid "A bale of hay. You could sleep on it, if desperate." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "whish!" -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "pile of woodchips" -msgstr "" - -#. ~ Description for pile of woodchips -#: lang/json/furniture_from_json.py -msgid "Pile of chipped wood pieces. You can move it with a shovel." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "arm chair" -msgstr "" - -#. ~ Description for arm chair -#: lang/json/furniture_from_json.py -msgid "A more comfortable way of sitting down." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "airplane seat" -msgstr "" - -#. ~ Description for airplane seat -#: lang/json/furniture_from_json.py -msgid "An airplane seat with a seatbelt." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "chair" -msgstr "" - -#. ~ Description for chair -#. ~ Description for stool -#: lang/json/furniture_from_json.py -msgid "Sit down, have a drink." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "sofa" -msgstr "" - -#. ~ Description for sofa -#: lang/json/furniture_from_json.py -msgid "Lie down OR sit down! Perfect!" -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "stool" -msgstr "" - -#: lang/json/furniture_from_json.py -#: lang/json/vehicle_part_from_json.py -msgid "bed" -msgstr "" - -#. ~ Description for bed -#: lang/json/furniture_from_json.py -msgid "" -"This is a bed. A luxury in these times. Quite comfortable to sleep in." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "bed frame" -msgstr "" - -#. ~ Description for bed frame -#: lang/json/furniture_from_json.py -msgid "" -"This is an empty bed frame. With a mattress on it, it would be a nice place " -"to sleep. Sleeping on it right now wouldn't be great." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "whack." -msgstr "" - -#. ~ Description for mattress -#: lang/json/furniture_from_json.py -msgid "" -"A comfortable mattress has been tossed on the floor for sleeping here. It's " -"not quite as comfy as a real bed, but it's pretty close." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "makeshift bed" -msgstr "" - -#. ~ Description for makeshift bed -#: lang/json/furniture_from_json.py -msgid "Not as comfortable as a real bed, but it will suffice." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "straw bed" -msgstr "" - -#. ~ Description for straw bed -#: lang/json/furniture_from_json.py -msgid "Kinda itches when you lay on it." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "bookcase" -msgstr "" - -#. ~ Description for bookcase -#: lang/json/furniture_from_json.py -msgid "Stores books. Y'know, those things. Who reads books anymore?" -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "coffin" -msgstr "" - -#. ~ Description for coffin -#: lang/json/furniture_from_json.py -msgid "Holds the bodies of the countless killed in the Cataclysm." -msgstr "" - -#: lang/json/furniture_from_json.py -#: lang/json/terrain_from_json.py -msgid "wham!" -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "open coffin" -msgstr "" - -#. ~ Description for open coffin -#: lang/json/furniture_from_json.py -msgid "" -"You can only hope you'll look good enough for one of these, when the time " -"comes." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "crate" -msgstr "" - -#. ~ Description for crate -#: lang/json/furniture_from_json.py -msgid "" -"What's inside? Pry it open to find out! Or just smash it, but you might " -"break the contents." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "open crate" -msgstr "" - -#. ~ Description for open crate -#: lang/json/furniture_from_json.py -msgid "What's inside? Look in it!" -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "cupboard" -msgstr "" - -#. ~ Description for cupboard -#: lang/json/furniture_from_json.py -msgid "Store your cups." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "dresser" -msgstr "" - -#. ~ Description for dresser -#: lang/json/furniture_from_json.py -msgid "Dress yourself for the zombie prom, or other occasions." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "glass front cabinet" -msgstr "" - -#. ~ Description for glass front cabinet -#: lang/json/furniture_from_json.py -msgid "A tall storage cabinet with a clear glass window." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "gun safe" -msgstr "" - -#. ~ Description for gun safe -#: lang/json/furniture_from_json.py -msgid "Oooooohhhh. Shiny." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "screeching metal!" -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "jammed gun safe" -msgstr "" - -#. ~ Description for jammed gun safe -#: lang/json/furniture_from_json.py -msgid "Does it have guns in it? You won't find out. It's jammed." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "electronic gun safe" -msgstr "" - -#. ~ Description for electronic gun safe -#: lang/json/furniture_from_json.py -msgid "Can you hack it open to get the firearms?" -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "locker" -msgstr "" - -#. ~ Description for locker -#: lang/json/furniture_from_json.py -msgid "Usually used for storing equipment or items." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "mailbox" -msgstr "" - -#. ~ Description for mailbox -#: lang/json/furniture_from_json.py -msgid "" -"A metal box attached to the top of a wooden post. Mail delivery hasn't come " -"for awhile. Doesn't look like it's coming again anytime soon." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "display rack" -msgstr "" - -#. ~ Description for display rack -#: lang/json/furniture_from_json.py -msgid "Display your items." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "recycle bin" -msgstr "" - -#. ~ Description for recycle bin -#: lang/json/furniture_from_json.py -msgid "Stores items for recycling." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "safe" -msgstr "" - -#. ~ Description for safe -#: lang/json/furniture_from_json.py -msgid "Holds items. Securely." -msgstr "" - -#. ~ Description for safe -#: lang/json/furniture_from_json.py -msgid "What needs protection like this?" -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "open safe" -msgstr "" - -#. ~ Description for open safe -#: lang/json/furniture_from_json.py -msgid "Grab the firearms!" -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "trash can" -msgstr "" - -#. ~ Description for trash can -#: lang/json/furniture_from_json.py -msgid "One man's trash is another man's dinner." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "utility shelf" -msgstr "" - -#. ~ Description for utility shelf -#: lang/json/furniture_from_json.py -msgid "A simple heavy-duty plastic and metal shelving unit." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "wooden keg" -msgstr "" - -#. ~ Description for wooden keg -#: lang/json/furniture_from_json.py -msgid "A keg made mostly of wood. Holds liquids, preferably alcoholic." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "counter" -msgstr "" - -#. ~ Description for counter -#: lang/json/furniture_from_json.py -msgid "Affixed to the wall or found in kitchens or stores." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "closed counter gate" -msgstr "" - -#. ~ Description for closed counter gate -#. ~ Description for open counter gate -#: lang/json/furniture_from_json.py -msgid "" -"A commercial quality swinging door made of wood that allows passage behind " -"counters." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "open counter gate" -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "desk" -msgstr "" - -#. ~ Description for desk -#: lang/json/furniture_from_json.py -msgid "Sit down at it or work on it." -msgstr "" - -#. ~ Description for leather tarp -#: lang/json/furniture_from_json.py -msgid "" -"A large sheet of sewn leather that can be used instead of a picnic blanket, " -"but it's more valuable as a butchery appliance as it does not soak in blood." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "plastic groundsheet" -msgstr "" - -#. ~ Description for plastic groundsheet -#: lang/json/furniture_from_json.py -msgid "" -"A large sheet of thick plastic has been tossed on the ground here. It would " -"be a useful place to do some butchery, perhaps." -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "whuff!" -msgstr "" - -#: lang/json/furniture_from_json.py -msgid "crinkle." -msgstr "" - -#. ~ Description for fiber mat -#: lang/json/furniture_from_json.py -msgid "" -"A large mat woven from fibrous material that can be used instead of a picnic " -"blanket, but it's more valuable as a butchery appliance. Too thin to be a " -"comfortable sleeping place." -msgstr "" - -#. ~ Description for tourist table -#: lang/json/furniture_from_json.py -msgid "" -"Small metal folding table, ideal for off-road trips into the wild. Can be " -"used as a workbench in a pinch." -msgstr "" - #. ~ Description for vehicle refrigerator #: lang/json/furniture_from_json.py msgid "" @@ -81934,6 +82858,7 @@ msgid "auto" msgstr "" #: lang/json/gun_from_json.py +#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py #: lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "rifle" @@ -82241,7 +83166,6 @@ msgid "" msgstr "" #: lang/json/gun_from_json.py -#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py #: lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "smg" @@ -82301,6 +83225,19 @@ msgid "" "more than capable of igniting terrain and monsters alike." msgstr "" +#: lang/json/gun_from_json.py +msgid "homemade laser pistol" +msgid_plural "homemade laser pistols" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"This laser pistol was based on the V29 laser pistol designed in the mid-21st " +"century. While little more than duct tape and electronics, it runs on a " +"standard UPS." +msgstr "" + #: lang/json/gun_from_json.py msgid "BB gun" msgid_plural "BB guns" @@ -82854,22 +83791,6 @@ msgid "" "rail." msgstr "" -#: lang/json/gun_from_json.py -msgid "Luty SMG: .22" -msgid_plural "Luty SMGs: .22" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/gun_from_json.py -msgid "" -"A Luty pattern makeshift smoothbore SMG crudely constructed out of various " -"steel parts using some of the more advanced powered hand tools; likely one " -"of the most complex guns that are feasible to make outside of a machine " -"shop, but still very unreliable. This one is chambered for .22 LR " -"cartridges and accepts Ruger 10/22 magazines, or alternatively custom-made " -"makeshift ones." -msgstr "" - #: lang/json/gun_from_json.py msgid "S&W 22A" msgid_plural "S&W 22A" @@ -82991,7 +83912,7 @@ msgid "" msgstr "" #: lang/json/gun_from_json.py -#: src/item_factory.cpp +#: lang/json/gun_from_json.py src/item_factory.cpp msgid "semi-auto" msgstr "" @@ -83675,22 +84596,6 @@ msgid "" "stainless steel cylinder and aluminum frame." msgstr "" -#: lang/json/gun_from_json.py -msgid "Luty SMG: .38 Special" -msgid_plural "Luty SMGs: .38 Special" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/gun_from_json.py -msgid "" -"A Luty pattern makeshift smoothbore SMG crudely constructed out of various " -"steel parts using some of the more advanced powered hand tools; likely one " -"of the most complex guns that are feasible to make outside of a machine " -"shop, but still very unreliable. This one is chambered for .38 Special " -"cartridges and accepts Taurus Pro .38 pistol magazines, or alternatively " -"custom-made makeshift ones." -msgstr "" - #: lang/json/gun_from_json.py msgid "S&W 619" msgid_plural "S&W 619" @@ -84139,6 +85044,22 @@ msgid "" "Century. It remains one of the most popular .45 pistols today." msgstr "" +#: lang/json/gun_from_json.py +msgid "M45A1" +msgid_plural "M45A1s" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The M45A1 supplanted earlier M45 MEUSOC pistols in use by Force Recon " +"elements of Marine Expeditionary Units. Where the original M45 pistols were " +"gutted M1911A1's hand-fitted by USMC armorers, the updated M45A1's are " +"hardly different from any other commercial 1911 design save for their dual " +"recoil springs. Most were replaced in 2016 with Glock 19's due to logistics " +"issues." +msgstr "" + #: lang/json/gun_from_json.py msgid "MAC-10" msgid_plural "MAC-10s" @@ -84208,6 +85129,23 @@ msgid_plural "USP .45s" msgstr[0] "" msgstr[1] "" +#: lang/json/gun_from_json.py +msgid "MK 23 MOD 0" +msgid_plural "MK 23 MOD 0s" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "Walther PPQ .45 ACP" msgid_plural "Walther PPQ .45 ACPs" @@ -84379,8 +85317,8 @@ msgid "" msgstr "" #: lang/json/gun_from_json.py -msgid "M2 Browning HMG" -msgid_plural "M2 Browning HMG" +msgid "M2HB Browning HMG" +msgid_plural "M2HB Browning HMG" msgstr[0] "" msgstr[1] "" @@ -85674,19 +86612,6 @@ msgid "" "but displays no recoil whatsoever." msgstr "" -#: lang/json/gun_from_json.py -msgid "homemade laser pistol" -msgid_plural "homemade laser pistols" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/gun_from_json.py -msgid "" -"This laser pistol was based on the V29 laser pistol designed in the mid-21st " -"century. While little more than duct tape and electronics, it runs on a " -"standard UPS." -msgstr "" - #: lang/json/gun_from_json.py msgid "sawn-off shotgun" msgid_plural "sawn-off shotguns" @@ -85777,22 +86702,22 @@ msgid "" msgstr "" #: lang/json/gun_from_json.py -msgid "C.R.I.T .5 LP" -msgid_plural "C.R.I.T .5 LPs" +msgid "CRIT .5 LP" +msgid_plural "CRIT .5 LPs" msgstr[0] "" msgstr[1] "" #: lang/json/gun_from_json.py msgid "" "Experimental low power sidearm under development in C.R.I.T R&D, the .5 LP " -"is a relatively weak but accurate laser pistol. The double-barrel design " +"is a relatively weak but accurate laser pistol. The double-barrel design " "compensates for the lack of raw power and yet the gun manages to be " "relatively easy to aim and lightweight due to the superalloy construction." msgstr "" #: lang/json/gun_from_json.py -msgid "C.R.I.T Chain Laser" -msgid_plural "C.R.I.T Chain Lasers" +msgid "CRIT Chain Laser" +msgid_plural "CRIT Chain Lasers" msgstr[0] "" msgstr[1] "" @@ -85800,8 +86725,8 @@ msgstr[1] "" msgid "" "A tried and true favorite from the bowels of R&D hell. Based off of a " "researcher's video on three taped-together .5 LPs on a hand held power " -"drill, this gun is a relatively light weapon for the amount of UPS and " -"destruction it can cause." +"drill, this gun is a relatively light weapon for the amount of UPS it eats " +"and destruction it can cause." msgstr "" #: lang/json/gun_from_json.py @@ -85809,20 +86734,48 @@ msgid "burst" msgstr "" #: lang/json/gun_from_json.py -msgid "C.R.I.T Laser Carbine" -msgid_plural "C.R.I.T Laser Carbines" +msgid "CRIT Laser Carbine" +msgid_plural "CRIT Laser Carbines" msgstr[0] "" msgstr[1] "" #: lang/json/gun_from_json.py msgid "" -"A lightweight laser gun developed by C.R.I.T R&D. Mainly developed to test " -"out a new breakthrough in laser weapons." +"A short-barrel lightweight laser gun developed by C.R.I.T R&D. Mainly " +"developed to test out a new breakthrough in laser weapons." msgstr "" #: lang/json/gun_from_json.py -msgid "C.R.I.T Fire Glove" -msgid_plural "C.R.I.T Fire Gloves" +msgid "CRIT Energy Rifle" +msgid_plural "CRIT Energy Rifles" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"A heavy energy gun developed by C.R.I.T R&D. Mainly developed to test out a " +"new breakthrough in hybrid weaponry." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "CRIT CQB Standard Issue" +msgid_plural "CRIT CQB Standard Issues" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"A simple combination gun. This military-grade semi-auto carbine couples the " +"mid-range versatility of the 9mm with the power of the 12 gauge shotgun. To " +"further compliment the CQB aspect, the stock is built to amplify the user's " +"force and the rugged construction with tonfa-like grip can handle bashing in " +"enemy heads. An integrated magazine makes it a pain to reload, but keeps " +"your clip from ejecting accidently." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "CRIT Fire Glove" +msgid_plural "CRIT Fire Gloves" msgstr[0] "" msgstr[1] "" @@ -85843,7 +86796,7 @@ msgstr[1] "" #: lang/json/gun_from_json.py msgid "" "A surprisingly powerful airgun that can reliably hunt small game. The small " -"lead or alloy pellets that can be chambered provide it decent powet in every " +"lead or alloy pellets that can be chambered provide it decent power in every " "shot. It's fairly accurate and can be somewhat as damaging as a .22 short, " "but the break action charging system requires some arm strength to load a " "pellet." @@ -89049,6 +90002,18 @@ msgid "" "position, it has lower accuracy compared to an actual flaregun." msgstr "" +#: lang/json/gunmod_from_json.py +msgid "CQB SI shotgun" +msgid_plural "CQB SI shotguns" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gunmod_from_json.py +msgid "" +"The integrated underbarrel shotgun of this gun which holds a single shot. " +"It's irremovable." +msgstr "" + #: lang/json/gunmod_from_json.py msgid "butt hook stock" msgid_plural "butt hook stocks" @@ -92180,12 +93145,12 @@ msgid "You can craft here." msgstr "" #: lang/json/keybinding_from_json.py -#: lang/json/keybinding_from_json.py src/input.cpp src/messages.cpp +#: src/input.cpp src/messages.cpp msgid "Scroll up" msgstr "" #: lang/json/keybinding_from_json.py -#: lang/json/keybinding_from_json.py src/input.cpp src/messages.cpp +#: src/input.cpp src/messages.cpp msgid "Scroll down" msgstr "" @@ -92269,6 +93234,18 @@ msgstr "" msgid "Mark selected item" msgstr "" +#: lang/json/keybinding_from_json.py +msgid "Enable auto note for map extra" +msgstr "" + +#: lang/json/keybinding_from_json.py +msgid "Toggle auto notes option" +msgstr "" + +#: lang/json/keybinding_from_json.py +msgid "Disable auto note for map extra" +msgstr "" + #: lang/json/keybinding_from_json.py msgid "Add rule" msgstr "" @@ -92758,7 +93735,7 @@ msgid "Resize" msgstr "" #: lang/json/keybinding_from_json.py -msgid "Select shape" +msgid "To start" msgstr "" #: lang/json/keybinding_from_json.py @@ -92782,7 +93759,11 @@ msgid "Edit fields" msgstr "" #: lang/json/keybinding_from_json.py -msgid "Edit terrain / furniture" +msgid "Edit terrain" +msgstr "" + +#: lang/json/keybinding_from_json.py +msgid "Edit furniture" msgstr "" #: lang/json/keybinding_from_json.py @@ -93234,6 +94215,10 @@ msgstr "" msgid "Autopickup manager" msgstr "" +#: lang/json/keybinding_from_json.py +msgid "Autonotes manager" +msgstr "" + #: lang/json/keybinding_from_json.py msgid "Safe Mode manager" msgstr "" @@ -93490,12 +94475,17 @@ msgid "Load color template" msgstr "" #: lang/json/keybinding_from_json.py -#: src/veh_interact.cpp +#: lang/json/keybinding_from_json.py src/editmap.cpp +#: src/editmap.cpp +#: src/editmap.cpp src/veh_interact.cpp msgid "Yes" msgstr "" #: lang/json/keybinding_from_json.py -#: src/options.cpp src/veh_interact.cpp +#: lang/json/keybinding_from_json.py src/editmap.cpp +#: src/editmap.cpp +#: src/editmap.cpp src/options.cpp +#: src/veh_interact.cpp msgid "No" msgstr "" @@ -93503,6 +94493,16 @@ msgstr "" msgid "Ignore further distractions and finish" msgstr "" +#: lang/json/keybinding_from_json.py src/options.cpp +#: src/options.cpp +msgid "Always" +msgstr "" + +#: lang/json/keybinding_from_json.py src/options.cpp +#: src/options.cpp +msgid "Never" +msgstr "" + #: lang/json/keybinding_from_json.py msgid "Cancel popup" msgstr "" @@ -93932,6 +94932,24 @@ msgstr "" msgid "Several spent casings are here." msgstr "" +#: lang/json/map_extra_from_json.py +msgid "Looters" +msgstr "" + +#. ~ Description for Looters +#: lang/json/map_extra_from_json.py +msgid "Some looters gathering everything not nailed down." +msgstr "" + +#: lang/json/map_extra_from_json.py +msgid "Corpses" +msgstr "" + +#. ~ Description for Corpses +#: lang/json/map_extra_from_json.py +msgid "Some unfortunates from the billions lost in the cataclysm." +msgstr "" + #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Consolidated Computerized Bank of the Treasury" @@ -95058,6 +96076,22 @@ msgstr "" msgid "View Subway Routes" msgstr "" +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "Surgery room computer" +msgstr "" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Open Storage Chambers" +msgstr "" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py src/mapgen.cpp +#: src/mapgen.cpp +msgid "Manifest" +msgstr "" + #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Vehicle Testing Track" @@ -95453,59 +96487,67 @@ msgid "" msgstr "" #: lang/json/martial_art_from_json.py -msgid "Karate" +msgid "Judo" msgstr "" -#. ~ Description for martial art 'Karate' +#. ~ Description for martial art 'Judo' #: lang/json/martial_art_from_json.py msgid "" -"Karate is a popular martial art, originating from Japan. It focuses on " -"rapid, precise attacks, blocks, and fluid movement. A successful hit allows " -"you an extra dodge and two extra blocks on the following round." +"Judo is a martial art that focuses on grabs and throws, both defensive and " +"offensive. You are resistant to most effects that can knock you down and " +"can counter grab and takedown attacks with strong judo throw." msgstr "" #: lang/json/martial_art_from_json.py -msgid "Karate Hit" +msgid "Judo Stance" msgstr "" -#. ~ Description of buff 'Karate Hit' for martial art 'Karate' +#. ~ Description of buff 'Judo Stance' for martial art 'Judo' #: lang/json/martial_art_from_json.py -msgid "+1 Dodges, +2 Blocks" +msgid "" +"Your knowledge of grappling allows you to recover from knock down effects " +"instantly.\n" +"In addition, you can counter grabs and takedown attacks with a judo throw." msgstr "" #: lang/json/martial_art_from_json.py -msgid "Judo" +msgid "Karate" msgstr "" -#. ~ Description for martial art 'Judo' +#. ~ Description for martial art 'Karate' #: lang/json/martial_art_from_json.py msgid "" -"Judo is a martial art that focuses on grabs and throws, both defensive and " -"offensive. It also focuses on recovering from throws; while using judo, you " -"will not lose any turns to being thrown or knocked down." +"Karate is a popular martial art, originating from Japan. It focuses on " +"rapid, precise attacks, blocks, and fluid movement. A successful hit allows " +"you an extra dodge and two extra blocks on the following round." msgstr "" -#. ~ Description of buff for martial art 'Judo' #: lang/json/martial_art_from_json.py -msgid "Immune to throws and knockdowns." +msgid "Karate Strike" msgstr "" +#. ~ Description of buff 'Karate Strike' for martial art 'Karate' #: lang/json/martial_art_from_json.py -msgid "Tai Chi" +#, no-python-format +msgid "" +"Landing a hit allows you to perfectly position yourself for maximum defense " +"against multiple opponents.\n" +"\n" +"+2 Block attempts, +1 Dodges attempts, blocked damge reduced by 50%% of " +"Strength.\n" +"Lasts 2 turns." msgstr "" -#. ~ Description for martial art 'Tai Chi' #: lang/json/martial_art_from_json.py -msgid "" -"Though Tai Chi is often seen as a form of mental and physical exercise, it " -"is a legitimate martial art, focused on self-defense. Its ability to absorb " -"the force of an attack makes your Perception decrease damage further on a " -"block." +msgid "Karate Stance" msgstr "" -#. ~ Description of buff for martial art 'Tai Chi' +#. ~ Description of buff 'Karate Stance' for martial art 'Karate' #: lang/json/martial_art_from_json.py -msgid "+1 Block. Perception decreases damage when blocking." +msgid "" +"Your no nonsense stance allows you hit more accurately.\n" +"\n" +"+2 Accuracy." msgstr "" #: lang/json/martial_art_from_json.py @@ -95521,21 +96563,33 @@ msgid "" msgstr "" #: lang/json/martial_art_from_json.py -msgid "Krav Maga Hand-to-Hand" +msgid "Krav Maga Stance" msgstr "" -#. ~ Description of buff 'Krav Maga Hand-to-Hand' for martial art 'Krav Maga' +#. ~ Description of buff 'Krav Maga Stance' for martial art 'Krav Maga' #: lang/json/martial_art_from_json.py -msgid "Increased unarmed power." +msgid "" +"Your training makes it easier to land hits and fight multiple opponents.\n" +"\n" +"+1 Accuracy, +1 Block attempts." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Tai Chi" msgstr "" +#. ~ Description for martial art 'Tai Chi' #: lang/json/martial_art_from_json.py -msgid "Krav Maga Edged" +msgid "" +"Though Tai Chi is often seen as a form of mental and physical exercise, it " +"is a legitimate martial art, focused on self-defense. Its ability to absorb " +"the force of an attack makes your Perception decrease damage further on a " +"block." msgstr "" -#. ~ Description of buff 'Krav Maga Edged' for martial art 'Krav Maga' +#. ~ Description of buff for martial art 'Tai Chi' #: lang/json/martial_art_from_json.py -msgid "Increased stabbing damage." +msgid "+1 Block. Perception decreases damage when blocking." msgstr "" #: lang/json/martial_art_from_json.py @@ -96058,7 +97112,7 @@ msgstr "" #: lang/json/martial_art_from_json.py msgid "" "An offensive style that is centered around rapid slashes and prodding. Each " -"attack landed increases your speed by 3 and offers other combat bonuses" +"attack landed increases combat ability" msgstr "" #: lang/json/martial_art_from_json.py @@ -96067,9 +97121,7 @@ msgstr "" #. ~ Description of buff 'C.R.I.T Intensity' for martial art 'C.R.I.T Blade-work' #: lang/json/martial_art_from_json.py -msgid "" -"+3 Atk Speed and other small bonuses per stack. Bash damage decreases by 10 " -"percent per stack. Max of 10 stacks" +msgid "Additional DMG, and Arpen per stack. Max of 5 stacks" msgstr "" #: lang/json/martial_art_from_json.py @@ -96079,7 +97131,7 @@ msgstr "" #. ~ Description of buff 'C.R.I.T Calculation' for martial art 'C.R.I.T Blade-work' #: lang/json/martial_art_from_json.py msgid "" -"DEX provides accuracy and minor cut and stab damage with slight piercing " +"Increased accuracy along with minor cut and stab damage with piercing " "capability." msgstr "" @@ -96096,13 +97148,12 @@ msgid "" msgstr "" #: lang/json/martial_art_from_json.py -msgid "C.R.I.T Endurance" +msgid "C.R.I.T Buildup" msgstr "" -#. ~ Description of buff 'C.R.I.T Endurance' for martial art 'C.R.I.T Enforcement' +#. ~ Description of buff 'C.R.I.T Buildup' for martial art 'C.R.I.T Enforcement' #: lang/json/martial_art_from_json.py -msgid "" -"+0.05 armor, +0.1 bash and other small bonuses per stack. Max of 10 stacks" +msgid "+0.05 armor and other small bonuses per stack. Max of 10 stacks" msgstr "" #: lang/json/martial_art_from_json.py @@ -96111,7 +97162,7 @@ msgstr "" #. ~ Description of buff 'C.R.I.T Guard' for martial art 'C.R.I.T Enforcement' #: lang/json/martial_art_from_json.py -msgid "+1 armor. STR provides accuracy and minor bash damage and arpen." +msgid "+1 armor. STR provides accuracy and minor bash arpen." msgstr "" #: lang/json/martial_art_from_json.py @@ -96121,9 +97172,8 @@ msgstr "" #. ~ Description for martial art 'C.R.I.T CQB' #: lang/json/martial_art_from_json.py msgid "" -"A defensive style centered around rapid paralyzing strikes and piercing " -"jabs. Each attack landed increases your speed by 0.5 along with a slew of " -"combat bonuses. 25 percent bash damage." +"A style centered around rapid strikes and piercing jabs. Each attack landed " +"adds a plethora of combat bonuses. 25 percent bash damage." msgstr "" #: lang/json/martial_art_from_json.py @@ -96133,8 +97183,7 @@ msgstr "" #. ~ Description of buff 'C.R.I.T Tenacity' for martial art 'C.R.I.T CQB' #: lang/json/martial_art_from_json.py msgid "" -"+0.5 Atk Speed and other small bonuses based on DEX per stack. Max of 100 " -"stacks" +"+Atk Speed and other small bonuses based on DEX per stack. Max of 5 stacks" msgstr "" #: lang/json/martial_art_from_json.py @@ -96144,9 +97193,8 @@ msgstr "" #. ~ Description of buff 'C.R.I.T Initiative' for martial art 'C.R.I.T CQB' #: lang/json/martial_art_from_json.py msgid "" -"DEX provides dodge ability, accuracy and minor cut /stab damage with slight " -"piercing capability. 25 Percent Bash Damage that slightly increases per hit " -"stack." +"DEX provides dodge ability, accuracy and minor cut / stab damage with slight " +"piercing capability. 50 Percent Bash Damage." msgstr "" #: lang/json/martial_art_from_json.py @@ -97817,6 +98865,100 @@ msgstr "" msgid "I'm not quite sure how you failed to survive AND are talking to me." msgstr "" +#: lang/json/mission_def_from_json.py +msgid "Gather cattail stalks to create cattail jelly" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Medical services are a little sparse following , but people " +"have been surviving using their wits and the bounty of Mother Nature for a " +"long time. Care to learn a little?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Did you know that cattails are a source of a jelly that works as an " +"antiseptic and analgesic? Something like that is likely to be mighty " +"helpful out here. I want you to take this bag, head to the nearest swamp, " +"collect 80 cattail stalks, and bring them back here. In exchange, I'll show " +"you how to harvest the jelly." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Great! This bag should be big enough to hold all of the stalks we'll need. " +"Don't forget to bring it back." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Your loss." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "The cattails grow in the fresh water in swamps. You can't miss them." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Got those cattail stalks yet? Don't forget to bring back my bag and improve " +"your survival skill to at least 1 as well." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Great! Hand them over and I'll show you how this works." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "OK, then hand them over." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Well, that's a shame." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Return Barry to Eddie at the dairy." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "I just want to go home." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "I can't believe you are here, please take me back to the ranch." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Thank you, I thought I was dead." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Please god no!" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "We shouldn't stay here too long, more might show up." +msgstr "" + +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py +msgid "How much further?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Thanks, we'll never be able to repay you, Here's a token of my gratitude, I " +"made these suits for my family and always keep a few extra around." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "I don't feel saved..." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Tell my family that I love them..." +msgstr "" + #: lang/json/mission_def_from_json.py msgid "Find an anvil" msgstr "" @@ -97848,7 +98990,7 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" "I appreciate it, this will really make a difference, here's some horse armor " -"I've been working on, eventually I'll have the whole herd outfitted." +"I've been working on. Eventually I'll have the whole herd outfitted." msgstr "" #: lang/json/mission_def_from_json.py @@ -97860,7 +99002,9 @@ msgid "Find Chris Isherwood" msgstr "" #: lang/json/mission_def_from_json.py -msgid "Our son still isn't back, I'm getting concerned." +msgid "" +"Chris hasn't come back from his latest search for Barry, I'm getting " +"concerned." msgstr "" #: lang/json/mission_def_from_json.py @@ -97878,7 +99022,7 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" -"He should be on the property somewhere, maybe by that old cabin near the " +"He might be on the property somewhere, maybe by that old cabin near the " "entrance, sometimes he camps there." msgstr "" @@ -97887,7 +99031,9 @@ msgid "How is the search going?" msgstr "" #: lang/json/mission_def_from_json.py -msgid "Thanks, I was getting ready to go look myself." +msgid "" +"Thanks, I was getting ready to go look myself. Now that I have the anvil, " +"I've been working on new armor for the horses, take this prototype I made." msgstr "" #: lang/json/mission_def_from_json.py @@ -97895,15 +99041,17 @@ msgid "I hope he didn't meet Barry's fate..." msgstr "" #: lang/json/mission_def_from_json.py -msgid "Find mysterious structure" +msgid "Free Barry from the mysterious structure" msgstr "" #: lang/json/mission_def_from_json.py -msgid "We need to investigate the alien encampment." +msgid "" +"We need to investigate the alien encampment and try to find out what " +"happened to Barry." msgstr "" #: lang/json/mission_def_from_json.py -msgid "I can take you to the structure those things were building." +msgid "I can take you to the structure, I tracked them to it." msgstr "" #: lang/json/mission_def_from_json.py @@ -97911,7 +99059,7 @@ msgid "Awesome, I want some answers!" msgstr "" #: lang/json/mission_def_from_json.py -msgid "Thanks anyway, I'll keep my eye on it." +msgid "Thanks anyway, I'll keep my eye on it, maybe I'll find a way one day." msgstr "" #: lang/json/mission_def_from_json.py @@ -97926,9 +99074,9 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" -"It's even bigger then I remember, we should explore some. I left a note for " -"my family before we left. If we survive, the cabin should be fixed up and " -"ready for you to move in if you want to stay." +"It's taller then I remember, we should look for prisoners. I left a note " +"for my family before we left. If we survive, the cabin should be fixed up " +"and ready for you to move in if you want to stay." msgstr "" #: lang/json/mission_def_from_json.py @@ -98004,6 +99152,53 @@ msgstr "" msgid "I'll have to find someone more at home in the forest..." msgstr "" +#: lang/json/mission_def_from_json.py +msgid "Find and capture a cat" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "I could use a barn cat to keep the mice down." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"I saw some feral cats out by the old cabin. Can you capture one for me?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Thank you! Please hurry back! Take this cage so you have a chance of " +"capturing one." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "I did't want to use chemicals on these rats." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Take this pet carrier; if you can get close to a cat, you can put it " +"inside. If you're having problems, try befriending it with cat food." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Have you found a cat?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Thank you so much, I want you to have this copy of my natural remedy " +"journal. I'll name this handsome fellow Joshua." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "What?! You're lying, I can tell! Did you even bring back my cage?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Oh no! I guess they are too nimble for you..." +msgstr "" + #: lang/json/mission_def_from_json.py msgid "Gather 120 Stones" msgstr "" @@ -98046,7 +99241,7 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" -"Now that the kilns are set up, we could use 2000 units of sand to get " +"Now that the forge is set up, we could use 2000 units of sand to get " "production going." msgstr "" @@ -98061,7 +99256,7 @@ msgid "" msgstr "" #: lang/json/mission_def_from_json.py -msgid "Thanks, now Luke can get started." +msgid "Thanks, now Luke can get started. Here's a token of my thanks." msgstr "" #: lang/json/mission_def_from_json.py @@ -98078,7 +99273,7 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" -"Now that the kilns are set up, we could use 1000 units of clay to get " +"Now that the clay kiln is set up, we could use 1000 units of clay to get " "production going." msgstr "" @@ -98089,8 +99284,13 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" -"Thanks, now Luke can get started making jugs, We'd like to give you a cow if " -"you want it. Here's a rope an some fodder, feel free to pick one out." +"Thanks, now Luke can get started making jugs, We'd like to give you a cow, " +"Here's Daisy, take good care of her and she'll provide you with milk." +msgstr "" + +#. ~ Nickname for creature 'mon_cow' +#: lang/json/mission_def_from_json.py +msgid "Daisy" msgstr "" #: lang/json/mission_def_from_json.py @@ -98158,17 +99358,17 @@ msgid "Kill monster" msgstr "" #: lang/json/mission_def_from_json.py -msgid "We could use some help killing some monsters." +msgid "We could use some help killing some wolves." msgstr "" #: lang/json/mission_def_from_json.py msgid "" -"I don't know what it is, but it is very fast, I'm willing to outfit you with " -"a horse if you succeed." +"There's been some wolves that keep scaring our chickens and horses, I'd be " +"grateful if you can kill them." msgstr "" #: lang/json/mission_def_from_json.py -msgid "Be ready for anything." +msgid "Wonderful, let me know when it is done." msgstr "" #: lang/json/mission_def_from_json.py @@ -98185,12 +99385,38 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" -"I appreciate it, this will help keep our animals safe, here's an extra " -"saddle for you. Take this fodder and choose a horse for your bravery." +"I appreciate it, I've got this old saddle I want you to have. I'll be happy " +"to put a horse under it if you want to do some more heroics." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Show me the bodies." msgstr "" #: lang/json/mission_def_from_json.py -msgid "Show me the body." +msgid "We could use some help killing some monsters." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"We could use some help killing a pack of monsters. I don't know what they " +"are, but they're very fast, I'm willing to outfit you with a horse if you " +"succeed." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Be ready for anything." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"I appreciate it, this will help keep our animals safe. This is, Steve, he's " +"a good, steady horse. You should talk to Carlos about some armor for him." +msgstr "" + +#. ~ Nickname for creature 'mon_horse' +#: lang/json/mission_def_from_json.py +msgid "Steve" msgstr "" #: lang/json/mission_def_from_json.py @@ -98236,7 +99462,7 @@ msgid "At least you escaped with your life..." msgstr "" #: lang/json/mission_def_from_json.py -msgid "Find a cooy of DIY Compendium" +msgid "Find a copy of DIY Compendium" msgstr "" #: lang/json/mission_def_from_json.py @@ -99121,7 +100347,9 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" "With this we'll be able to convince others to invest in the commune. Thank " -"you, here's your money." +"you, here's your money. We also managed to get a manual crank hooked up to " +"the garage in the back, so feel free to make use of that - you've been a " +"great help to us." msgstr "" #: lang/json/mission_def_from_json.py @@ -100823,7 +102051,6 @@ msgid "Hoarder" msgstr "" #: lang/json/morale_type_from_json.py lang/json/mutation_from_json.py -#: lang/json/mutation_from_json.py msgid "Stylish" msgstr "" @@ -101573,8 +102800,8 @@ msgstr "" #. ~ Mutation class: Vampire iv_message #: lang/json/mutation_category_from_json.py msgid "" -"You twitch and pant randomly as your desire to slake your thirst becomes " -"overwhelming." +"You twitch and pant randomly as your desire to slake your inhuman thirst " +"becomes overwhelming." msgstr "" #. ~ Mutation class: Vampire Male memorial messsage @@ -101631,6 +102858,17 @@ msgid "" "venoms: Centipede, Viper, Scorpion, Lizard, or Toad." msgstr "" +#: lang/json/mutation_from_json.py +msgid "Inconspicuous" +msgstr "" + +#. ~ Description for Inconspicuous +#: lang/json/mutation_from_json.py +msgid "" +"While sleeping or staying still, it is less likely that monsters will wander " +"close to you." +msgstr "" + #: lang/json/mutation_from_json.py msgid "Hair: black, crew-cut" msgstr "" @@ -102744,17 +103982,6 @@ msgid "" "having a vague idea of whether you're in good condition or not." msgstr "" -#: lang/json/mutation_from_json.py -msgid "Inconspicuous" -msgstr "" - -#. ~ Description for Inconspicuous -#: lang/json/mutation_from_json.py -msgid "" -"While sleeping or staying still, it is less likely that monsters will wander " -"close to you." -msgstr "" - #: lang/json/mutation_from_json.py msgid "Masochist" msgstr "" @@ -105255,7 +106482,6 @@ msgid "" "fates upon them." msgstr "" -#: lang/json/mutation_from_json.py #: lang/json/mutation_from_json.py lang/json/npc_class_from_json.py #: lang/json/npc_from_json.py msgid "Hunter" @@ -108225,8 +109451,8 @@ msgstr "" #. ~ Description for C.R.I.T Melee Training #: lang/json/mutation_from_json.py msgid "" -"You have received some defensive training. For every hit you land, gain " -"various miniscule combat bonuses that scale off of your stats." +"You have received defensive training. For every hit you land, gain various " +"miniscule combat bonuses that scale off of your stats." msgstr "" #: lang/json/mutation_from_json.py @@ -108272,105 +109498,6 @@ msgid "" "Emerge from the grave of the old world, and become the night once again." msgstr "" -#. ~ Description for Jittery -#: lang/json/mutation_from_json.py -msgid "" -"During moments of great stress or under the effects of stimulants, you may " -"find your hands shaking uncontrollably, severely reducing your dexterity." -msgstr "" - -#. ~ Description for Good Memory -#: lang/json/mutation_from_json.py -msgid "" -"You have a an exceptional memory, and find it easy to remember things. Your " -"skills will erode slightly slower than usual, and you can remember more " -"terrain." -msgstr "" - -#. ~ Description for Near-Sighted -#: lang/json/mutation_from_json.py -msgid "" -"Without your glasses, your seeing radius is severely reduced! However, " -"while wearing glasses this trait has no effect, and you are guaranteed to " -"start with a pair." -msgstr "" - -#. ~ Description for Pretty -#: lang/json/mutation_from_json.py -msgid "" -"You are a sight to behold. NPCs who care about such thing will react more " -"kindly to you." -msgstr "" - -#. ~ Description for Glorious -#: lang/json/mutation_from_json.py -msgid "" -"You are incredibly beautiful. People cannot help themselves for your " -"charms, and will do whatever they can to please you." -msgstr "" - -#: lang/json/mutation_from_json.py -msgid "Silent Movement" -msgstr "" - -#. ~ Description for Silent Movement -#: lang/json/mutation_from_json.py -msgid "You know how to move completely silently." -msgstr "" - -#. ~ Description for Poor Healer -#: lang/json/mutation_from_json.py -msgid "" -"Your health recovery through sleeping is severely impaired and causes you to " -"recover only a third of usual HP over time." -msgstr "" - -#. ~ Description for Prey Animal -#: lang/json/mutation_from_json.py -msgid "" -"Natural animals like dogs and wolves see you as prey or a threat, and are " -"liable to attack you on sight." -msgstr "" - -#. ~ Description for Fast Healer -#: lang/json/mutation_from_json.py -msgid "" -"You heal faster when sleeping and will even recover small amount of HP when " -"not sleeping." -msgstr "" - -#. ~ Description for Culler -#: lang/json/mutation_from_json.py -msgid "" -"You've had a revelation: by killing the weaker creatures, who would only die " -"anyway, you preserve resources for those better able to survive. You are " -"less bothered by death of others: their own weakness invited these fates " -"upon them." -msgstr "" - -#. ~ Description for Hunter -#: lang/json/mutation_from_json.py -msgid "" -"Your brain has a lot more in common with predatory animal than a human, " -"making it easier to control misplaced reactions to death of your prey. " -"Additionally, combat skills, which you use to hunt, are easier to learn and " -"maintain." -msgstr "" - -#. ~ Description for Deformed -#: lang/json/mutation_from_json.py -msgid "" -"You're minorly deformed. Some people will react badly to your appearance." -msgstr "" - -#. ~ Description for Albino -#: lang/json/mutation_from_json.py -msgid "" -"You lack skin pigmentation due to a genetic problem. You sunburn extremely " -"easily, and typically use an umbrella and a sunglasses when going out in the " -"sun." -msgstr "" - #: lang/json/mutation_from_json.py msgid "Forest Guardian" msgstr "" @@ -108392,6 +109519,14 @@ msgid "" "detect." msgstr "" +#. ~ Description for Animal Kinship +#: lang/json/mutation_from_json.py +msgid "" +"Something about your presence is calming to animals, and they will treat you " +"with innate trust. This only applies to natural animals such as woodland " +"creatures." +msgstr "" + #: lang/json/mutation_from_json.py msgid "Slashers" msgstr "" @@ -108871,6 +110006,14 @@ msgstr "" msgid "I used to be a police officer, but I'm just a survivor now." msgstr "" +#: lang/json/npc_class_from_json.py lang/json/npc_from_json.py +msgid "Barry Isherwood" +msgstr "" + +#: lang/json/npc_class_from_json.py +msgid "Missing member of the Isherwood family." +msgstr "" + #: lang/json/npc_class_from_json.py lang/json/npc_from_json.py msgid "Carlos Isherwood" msgstr "" @@ -111073,6 +112216,14 @@ msgstr "" msgid "storage units roof" msgstr "" +#: lang/json/overmap_terrain_from_json.py +msgid "steel mill" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "steel mill depot" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "science lab" msgstr "" @@ -111177,6 +112328,18 @@ msgstr "" msgid "mi-go landing platform" msgstr "" +#: lang/json/overmap_terrain_from_json.py +msgid "mi-go scout tower" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "subway station?" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "lab" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "fema camp" msgstr "" @@ -116863,306 +118026,300 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_male" -msgid "C.R.I.T ROTC Member" +msgid "CRIT ROTC Member" msgstr "" -#. ~ Profession (male C.R.I.T ROTC Member) description +#. ~ Profession (male CRIT ROTC Member) description #: lang/json/professions_from_json.py msgctxt "prof_desc_male" msgid "" "You were training ahead of time to become a C.R.I.T officer in the upcoming " "war. Your call to arms arrived dead on arrival and already plastered in the " -"all-too vibrant gore of your squadmates. In the midst of panic, you snatched " -"up what you could and bugged out before you joined the still-moving remnants " -"of your friends. Now it's up to your wits and years of training to keep you " -"alive in this Cataclysm." +"all-too vibrant gore of your squadmates. In the midst of panic, you bugged " +"out lest you join the remnants of your friends. Now it's up to your wits and " +"short years of training to keep you alive in this Cataclysm." msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_female" -msgid "C.R.I.T ROTC Member" +msgid "CRIT ROTC Member" msgstr "" -#. ~ Profession (female C.R.I.T ROTC Member) description +#. ~ Profession (female CRIT ROTC Member) description #: lang/json/professions_from_json.py msgctxt "prof_desc_female" msgid "" "You were training ahead of time to become a C.R.I.T officer in the upcoming " "war. Your call to arms arrived dead on arrival and already plastered in the " -"all-too vibrant gore of your squadmates. In the midst of panic, you snatched " -"up what you could and bugged out before you joined the still-moving remnants " -"of your friends. Now it's up to your wits and years of training to keep you " -"alive in this Cataclysm." +"all-too vibrant gore of your squadmates. In the midst of panic, you bugged " +"out lest you join the remnants of your friends. Now it's up to your wits and " +"short years of training to keep you alive in this Cataclysm." msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_male" -msgid "C.R.I.T Janitor" +msgid "CRIT Janitor" msgstr "" -#. ~ Profession (male C.R.I.T Janitor) description +#. ~ Profession (male CRIT Janitor) description #: lang/json/professions_from_json.py msgctxt "prof_desc_male" msgid "" "*Sigh* Your life has been a wreck. Hopping place to place you finally found " -"a job at C.R.I.T... as a janitor of sorts. The pay was good and you at least " -"got to see some pretty cool stuff. After all non essential personel were " -"purged (as in you, because you merely cleaned stuff or were the errand boy " -"and were not privy to anything remotely important) you found yourself stuck " -"with nothing but the uniform they gave you and your equipment." +"a job at C.R.I.T... as a janitor of sorts. The pay was good and you got some " +"sneak-peeks on some pretty cool stuff. After all non-essential personel were " +"purged you found yourself stuck with nothing but the uniform they gave you " +"and your job's sign-bonus equipment." msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_female" -msgid "C.R.I.T Janitor" +msgid "CRIT Janitor" msgstr "" -#. ~ Profession (female C.R.I.T Janitor) description +#. ~ Profession (female CRIT Janitor) description #: lang/json/professions_from_json.py msgctxt "prof_desc_female" msgid "" "*Sigh* Your life has been a wreck. Hopping place to place you finally found " -"a job at C.R.I.T... as a janitor of sorts. The pay was good and you at least " -"got to see some pretty cool stuff. After all non essential personel were " -"purged (as in you, because you merely cleaned stuff or were the errand boy " -"and were not privy to anything remotely important) you found yourself stuck " -"with nothing but the uniform they gave you and your equipment." +"a job at C.R.I.T... as a janitor of sorts. The pay was good and you got some " +"sneak-peeks on some pretty cool stuff. After all non-essential personel were " +"purged you found yourself stuck with nothing but the uniform they gave you " +"and your job's sign-bonus equipment." msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_male" -msgid "C.R.I.T NCO" +msgid "CRIT NCO" msgstr "" -#. ~ Profession (male C.R.I.T NCO) description +#. ~ Profession (male CRIT NCO) description #: lang/json/professions_from_json.py msgctxt "prof_desc_male" msgid "" "You were a senior NCO, relaying orders to your squad was an everyday task. " "When the cataclysm struck, your expertise helped save everyone time and time " -"again until it all fell to chaos." +"again until it all fell apart." msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_female" -msgid "C.R.I.T NCO" +msgid "CRIT NCO" msgstr "" -#. ~ Profession (female C.R.I.T NCO) description +#. ~ Profession (female CRIT NCO) description #: lang/json/professions_from_json.py msgctxt "prof_desc_female" msgid "" "You were a senior NCO, relaying orders to your squad was an everyday task. " "When the cataclysm struck, your expertise helped save everyone time and time " -"again until it all fell to chaos." +"again until it all fell apart." msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_male" -msgid "C.R.I.T Grunt" +msgid "CRIT Grunt" msgstr "" -#. ~ Profession (male C.R.I.T Grunt) description +#. ~ Profession (male CRIT Grunt) description #: lang/json/professions_from_json.py msgctxt "prof_desc_male" msgid "" -"You were part of the infantry; first to hit the ground running, clear a " -"forward operating base for use and then come back to relax peacefully with " -"your squadmates. Those days ended when the cataclysm reared its ugly head. " -"The infected tore through your lines like wet paper when the otherworldy " -"abominations arived. Now alone and fleeing, will you have what it takes to " -"survive or is this hellish landcape just a macabre metaphor of death's row?" +"You were part of the infantry; first to hit the ground running, clear a FOB " +"and then come back to relax with your squad. Those days ended when the " +"cataclysm reared its ugly head. Your lines were torn through like wet paper " +"when the otherworldy abominations arived. Now fleeing for your life, will " +"you have what it takes to survive or is this hellish landcape your resting " +"place?" msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_female" -msgid "C.R.I.T Grunt" +msgid "CRIT Grunt" msgstr "" -#. ~ Profession (female C.R.I.T Grunt) description +#. ~ Profession (female CRIT Grunt) description #: lang/json/professions_from_json.py msgctxt "prof_desc_female" msgid "" -"You were part of the infantry; first to hit the ground running, clear a " -"forward operating base for use and then come back to relax peacefully with " -"your squadmates. Those days ended when the cataclysm reared its ugly head. " -"The infected tore through your lines like wet paper when the otherworldy " -"abominations arived. Now alone and fleeing, will you have what it takes to " -"survive or is this hellish landcape just a macabre metaphor of death's row?" +"You were part of the infantry; first to hit the ground running, clear a FOB " +"and then come back to relax with your squad. Those days ended when the " +"cataclysm reared its ugly head. Your lines were torn through like wet paper " +"when the otherworldy abominations arived. Now fleeing for your life, will " +"you have what it takes to survive or is this hellish landcape your resting " +"place?" msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_male" -msgid "C.R.I.T Combat Medic" +msgid "CRIT Combat Medic" msgstr "" -#. ~ Profession (male C.R.I.T Combat Medic) description +#. ~ Profession (male CRIT Combat Medic) description #: lang/json/professions_from_json.py msgctxt "prof_desc_male" msgid "" -"You were a combat medic taught how to engage an anomaly. However, your main " -"focus was the burden that was keeping your squadmates in one piece. For " -"weeks, you crossed through hell and back to ensure this true mission was " -"fufilled. During a one-sided firefight between the undead and the rogue ai " -"that has now run rampant through government robots, you were singled out and " -"overtaken. Forced to flee without your comrades in tow, will you have what " -"it takes to survive or will your unforgivable sin come back to haunt you?" +"You were the team nerd. A combat medic taught on how to engage strange " +"anomalies. However, your main focus was keeping your squadmates in one " +"piece. For weeks, you slogged through hell and back and ensured that " +"everyone made it. Caught in between a tide of the undead and the crossfire " +"of apparently rogue government robots, you were left stranded as a " +"distraction. Forced to flee, will you have what it takes to survive or will " +"you join the horde to haunt them for their cardinal sin?" msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_female" -msgid "C.R.I.T Combat Medic" +msgid "CRIT Combat Medic" msgstr "" -#. ~ Profession (female C.R.I.T Combat Medic) description +#. ~ Profession (female CRIT Combat Medic) description #: lang/json/professions_from_json.py msgctxt "prof_desc_female" msgid "" -"You were a combat medic taught how to engage an anomaly. However, your main " -"focus was the burden that was keeping your squadmates in one piece. For " -"weeks, you crossed through hell and back to ensure this true mission was " -"fufilled. During a one-sided firefight between the undead and the rogue ai " -"that has now run rampant through government robots, you were singled out and " -"overtaken. Forced to flee without your comrades in tow, will you have what " -"it takes to survive or will your unforgivable sin come back to haunt you?" +"You were the team nerd. A combat medic taught on how to engage strange " +"anomalies. However, your main focus was keeping your squadmates in one " +"piece. For weeks, you slogged through hell and back and ensured that " +"everyone made it. Caught in between a tide of the undead and the crossfire " +"of apparently rogue government robots, you were left stranded as a " +"distraction. Forced to flee, will you have what it takes to survive or will " +"you join the horde to haunt them for their cardinal sin?" msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_male" -msgid "C.R.I.T Automatic Rifleman" +msgid "CRIT Automatic Rifleman" msgstr "" -#. ~ Profession (male C.R.I.T Automatic Rifleman) description +#. ~ Profession (male CRIT Automatic Rifleman) description #: lang/json/professions_from_json.py msgctxt "prof_desc_male" msgid "" "You were assigned the billet of specializing in creating dead zones and " -"providing supressing fire. When the cataclysm struck, your trusty m240 " -"couldn't keep the veritable tide of undead from overtaking your squad. Now " -"alone and fleeing, will you have what it takes to survive or is this hellish " -"landcape something you just can't suppress?" +"providing support fire. When the cataclysm struck, your trusty LMG couldn't " +"keep the veritable tide of undead from overtaking your squad. Now running " +"with all the strength your body can muster, will you have what it takes to " +"survive or is this hellish landcape something you just can't suppress?" msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_female" -msgid "C.R.I.T Automatic Rifleman" +msgid "CRIT Automatic Rifleman" msgstr "" -#. ~ Profession (female C.R.I.T Automatic Rifleman) description +#. ~ Profession (female CRIT Automatic Rifleman) description #: lang/json/professions_from_json.py msgctxt "prof_desc_female" msgid "" "You were assigned the billet of specializing in creating dead zones and " -"providing supressing fire. When the cataclysm struck, your trusty m240 " -"couldn't keep the veritable tide of undead from overtaking your squad. Now " -"alone and fleeing, will you have what it takes to survive or is this hellish " -"landcape something you just can't suppress?" +"providing support fire. When the cataclysm struck, your trusty LMG couldn't " +"keep the veritable tide of undead from overtaking your squad. Now running " +"with all the strength your body can muster, will you have what it takes to " +"survive or is this hellish landcape something you just can't suppress?" msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_male" -msgid "C.R.I.T Commanding Officer" +msgid "CRIT Commanding Officer" msgstr "" -#. ~ Profession (male C.R.I.T Commanding Officer) description +#. ~ Profession (male CRIT Commanding Officer) description #: lang/json/professions_from_json.py msgctxt "prof_desc_male" msgid "" "As a top-ranking CO, you didn't see much in the way of combat other than " -"when you felt like it. but your charisma and sharp intellect helped you " -"climb up the ranks and provide support to allies in need. Now that " -"everything went down the drain, will it help you again?" +"when you felt like it. Your charisma and sharp intellect helped you climb up " +"the ranks and provided support to allies in need. Now that everything went " +"down the drain, will it help you again?" msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_female" -msgid "C.R.I.T Commanding Officer" +msgid "CRIT Commanding Officer" msgstr "" -#. ~ Profession (female C.R.I.T Commanding Officer) description +#. ~ Profession (female CRIT Commanding Officer) description #: lang/json/professions_from_json.py msgctxt "prof_desc_female" msgid "" "As a top-ranking CO, you didn't see much in the way of combat other than " -"when you felt like it. but your charisma and sharp intellect helped you " -"climb up the ranks and provide support to allies in need. Now that " -"everything went down the drain, will it help you again?" +"when you felt like it. Your charisma and sharp intellect helped you climb up " +"the ranks and provided support to allies in need. Now that everything went " +"down the drain, will it help you again?" msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_male" -msgid "C.R.I.T Enforcer" +msgid "CRIT Enforcer" msgstr "" -#. ~ Profession (male C.R.I.T Enforcer) description +#. ~ Profession (male CRIT Enforcer) description #: lang/json/professions_from_json.py msgctxt "prof_desc_male" msgid "" -"STR 12 recommended. You were a guard granted the authority of a U.S Marshal. " -"Others ribbed at you and joked about you being nothing more than a mall cop " -"with a fancy badge. Knowingly, you laughed it off as they were merely " -"jealous of what you could do and have been doing undercover as your double " -"stood in at base. While you mainly spent time at base, you honed your skills " -"and got special implants to do your job easier at the low low cost of " -"serving as a \"guard\" forever. Time to do your job, albeit mission " -"parameters look like they've expanded quite a bit." +"STR 10 recommended. You were a granted the authority of a U.S Marshal. As a " +"guard, others joked that you were nothing more than a mall cop with a fancy " +"badge. Knowingly, you laughed it off as the you donned on your equipment and " +"deployed. While you mainly spent time at base, you honed your skills and " +"recieved special implants to do your job easier at the low low cost of " +"serving as a \"guard\" forever. Time to do your job, mission parameters look " +"like they've expanded quite a bit though." msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_female" -msgid "C.R.I.T Enforcer" +msgid "CRIT Enforcer" msgstr "" -#. ~ Profession (female C.R.I.T Enforcer) description +#. ~ Profession (female CRIT Enforcer) description #: lang/json/professions_from_json.py msgctxt "prof_desc_female" msgid "" -"STR 12 recommended. You were a guard granted the authority of a U.S Marshal. " -"Others ribbed at you and joked about you being nothing more than a mall cop " -"with a fancy badge. Knowingly, you laughed it off as they were merely " -"jealous of what you could do and have been doing undercover as your double " -"stood in at base. While you mainly spent time at base, you honed your skills " -"and got special implants to do your job easier at the low low cost of " -"serving as a \"guard\" forever. Time to do your job, albeit mission " -"parameters look like they've expanded quite a bit." +"STR 10 recommended. You were a granted the authority of a U.S Marshal. As a " +"guard, others joked that you were nothing more than a mall cop with a fancy " +"badge. Knowingly, you laughed it off as the you donned on your equipment and " +"deployed. While you mainly spent time at base, you honed your skills and " +"recieved special implants to do your job easier at the low low cost of " +"serving as a \"guard\" forever. Time to do your job, mission parameters look " +"like they've expanded quite a bit though." msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_male" -msgid "C.R.I.T Lone Wolf" +msgid "CRIT Lone Wolf" msgstr "" -#. ~ Profession (male C.R.I.T Lone Wolf) description +#. ~ Profession (male CRIT Lone Wolf) description #: lang/json/professions_from_json.py msgctxt "prof_desc_male" msgid "" -"STR 14 recommended. You are fully armored badass granted the full authority " -"of a U.S Marshal. Sent in as the one man army capable of handling anything, " -"you stalked into a warzone and laid out entire battalions by yourself, be it " -"through cunning strategy or brute force. Time to hang them all." +"STR 10 recommended. You are fully armored badass granted the full authority " +"of a U.S Marshal. Sent in as the one man army capable of handling anything. " +"Dropped into warzones, you singlehandedly laid out entire battalions by " +"yourself. Time to hang them all." msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_female" -msgid "C.R.I.T Lone Wolf" +msgid "CRIT Lone Wolf" msgstr "" -#. ~ Profession (female C.R.I.T Lone Wolf) description +#. ~ Profession (female CRIT Lone Wolf) description #: lang/json/professions_from_json.py msgctxt "prof_desc_female" msgid "" -"STR 14 recommended. You are fully armored badass granted the full authority " -"of a U.S Marshal. Sent in as the one man army capable of handling anything, " -"you stalked into a warzone and laid out entire battalions by yourself, be it " -"through cunning strategy or brute force. Time to hang them all." +"STR 10 recommended. You are fully armored badass granted the full authority " +"of a U.S Marshal. Sent in as the one man army capable of handling anything. " +"Dropped into warzones, you singlehandedly laid out entire battalions by " +"yourself. Time to hang them all." msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_male" -msgid "C.R.I.T Spec Ops" +msgid "CRIT Spec Ops" msgstr "" -#. ~ Profession (male C.R.I.T Spec Ops) description +#. ~ Profession (male CRIT Spec Ops) description #: lang/json/professions_from_json.py msgctxt "prof_desc_male" msgid "" @@ -117176,10 +118333,10 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_female" -msgid "C.R.I.T Spec Ops" +msgid "CRIT Spec Ops" msgstr "" -#. ~ Profession (female C.R.I.T Spec Ops) description +#. ~ Profession (female CRIT Spec Ops) description #: lang/json/professions_from_json.py msgctxt "prof_desc_female" msgid "" @@ -117193,10 +118350,10 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_male" -msgid "C.R.I.T Survivalist" +msgid "CRIT Survivalist" msgstr "" -#. ~ Profession (male C.R.I.T Survivalist) description +#. ~ Profession (male CRIT Survivalist) description #: lang/json/professions_from_json.py msgctxt "prof_desc_male" msgid "" @@ -117215,10 +118372,10 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_female" -msgid "C.R.I.T Survivalist" +msgid "CRIT Survivalist" msgstr "" -#. ~ Profession (female C.R.I.T Survivalist) description +#. ~ Profession (female CRIT Survivalist) description #: lang/json/professions_from_json.py msgctxt "prof_desc_female" msgid "" @@ -117237,10 +118394,10 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_male" -msgid "C.R.I.T Recruit" +msgid "CRIT Recruit" msgstr "" -#. ~ Profession (male C.R.I.T Recruit) description +#. ~ Profession (male CRIT Recruit) description #: lang/json/professions_from_json.py msgctxt "prof_desc_male" msgid "" @@ -117253,10 +118410,10 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_female" -msgid "C.R.I.T Recruit" +msgid "CRIT Recruit" msgstr "" -#. ~ Profession (female C.R.I.T Recruit) description +#. ~ Profession (female CRIT Recruit) description #: lang/json/professions_from_json.py msgctxt "prof_desc_female" msgid "" @@ -117269,10 +118426,10 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_male" -msgid "C.R.I.T Employee" +msgid "CRIT Employee" msgstr "" -#. ~ Profession (male C.R.I.T Employee) description +#. ~ Profession (male CRIT Employee) description #: lang/json/professions_from_json.py msgctxt "prof_desc_male" msgid "" @@ -117288,10 +118445,10 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_female" -msgid "C.R.I.T Employee" +msgid "CRIT Employee" msgstr "" -#. ~ Profession (female C.R.I.T Employee) description +#. ~ Profession (female CRIT Employee) description #: lang/json/professions_from_json.py msgctxt "prof_desc_female" msgid "" @@ -117307,10 +118464,10 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_male" -msgid "C.R.I.T Engineer" +msgid "CRIT Engineer" msgstr "" -#. ~ Profession (male C.R.I.T Engineer) description +#. ~ Profession (male CRIT Engineer) description #: lang/json/professions_from_json.py msgctxt "prof_desc_male" msgid "" @@ -117322,10 +118479,10 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_female" -msgid "C.R.I.T Engineer" +msgid "CRIT Engineer" msgstr "" -#. ~ Profession (female C.R.I.T Engineer) description +#. ~ Profession (female CRIT Engineer) description #: lang/json/professions_from_json.py msgctxt "prof_desc_female" msgid "" @@ -117337,10 +118494,10 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_male" -msgid "C.R.I.T Night Walker" +msgid "CRIT Night Walker" msgstr "" -#. ~ Profession (male C.R.I.T Night Walker) description +#. ~ Profession (male CRIT Night Walker) description #: lang/json/professions_from_json.py msgctxt "prof_desc_male" msgid "" @@ -117353,10 +118510,10 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_female" -msgid "C.R.I.T Night Walker" +msgid "CRIT Night Walker" msgstr "" -#. ~ Profession (female C.R.I.T Night Walker) description +#. ~ Profession (female CRIT Night Walker) description #: lang/json/professions_from_json.py msgctxt "prof_desc_female" msgid "" @@ -121489,70 +122646,64 @@ msgctxt "start_name" msgid "Intended Crime Scene" msgstr "" -#: lang/json/skill_from_json.py -msgid "bartering" +#. ~ display string for skill display type 'display_melee' +#: lang/json/skill_display_type_from_json.py +msgid "Melee skills" msgstr "" -#. ~ Description for bartering -#: lang/json/skill_from_json.py -msgid "" -"Your skill in bargaining, haggling, and trading with others. Higher levels " -"increase the odds of getting the better end of a deal, and might even see " -"you convincing others to give you free stuff." +#. ~ display string for skill display type 'display_ranged' +#: lang/json/skill_display_type_from_json.py +msgid "Ranged skills" msgstr "" -#: lang/json/skill_from_json.py -msgid "computers" +#. ~ display string for skill display type 'display_crafting' +#: lang/json/skill_display_type_from_json.py +msgid "Crafting skills" msgstr "" -#. ~ Description for computers -#: lang/json/skill_from_json.py -msgid "" -"Your skill in accessing and manipulating computers. Higher levels can allow " -"a user to navigate complex software systems and even bypass their security." +#. ~ display string for skill display type 'display_interaction' +#: lang/json/skill_display_type_from_json.py +msgid "Interaction skills" msgstr "" -#: lang/json/skill_from_json.py src/crafting_gui.cpp -msgid "cooking" +#. ~ display string for skill display type 'display_social' +#: lang/json/skill_display_type_from_json.py +msgid "Social skills" msgstr "" -#. ~ Description for cooking #: lang/json/skill_from_json.py -msgid "" -"Your skill in combining food ingredients to make other, tastier food items. " -"It may also be used in certain chemical mixtures and other, more esoteric " -"tasks." +msgid "bartering" msgstr "" -#. ~ Description for driving +#. ~ Description for bartering #: lang/json/skill_from_json.py msgid "" -"Your skill in operating and steering a vehicle in motion. A higher level " -"allows greater control over vehicles at higher speeds, and reduces the " -"penalty of shooting while driving." +"Your skill in bargaining, haggling, and trading with others. Higher levels " +"increase the odds of getting the better end of a deal, and might even see " +"you convincing others to give you free stuff." msgstr "" #: lang/json/skill_from_json.py -msgid "electronics" +msgid "speaking" msgstr "" -#. ~ Description for electronics +#. ~ Description for speaking #: lang/json/skill_from_json.py msgid "" -"Your skill in dealing with electrical systems, used in the craft and repair " -"of objects with electrical components. This skill is an important part of " -"installing and managing bionic implants." +"Your skill in speaking to other people. Covers ability in boasting, " +"flattery, threats, persuasion, lies, and other facets of interpersonal " +"communication. Works best in conjunction with a high level of intelligence." msgstr "" #: lang/json/skill_from_json.py -msgid "fabrication" +msgid "computers" msgstr "" -#. ~ Description for fabrication +#. ~ Description for computers #: lang/json/skill_from_json.py msgid "" -"Your skill in working with raw materials and shaping them into useful " -"objects. This skill plays an important role in the crafting of many objects." +"Your skill in accessing and manipulating computers. Higher levels can allow " +"a user to navigate complex software systems and even bypass their security." msgstr "" #: lang/json/skill_from_json.py @@ -121580,27 +122731,23 @@ msgid "" msgstr "" #: lang/json/skill_from_json.py -msgid "speaking" +msgid "trapping" msgstr "" -#. ~ Description for speaking +#. ~ Description for trapping #: lang/json/skill_from_json.py msgid "" -"Your skill in speaking to other people. Covers ability in boasting, " -"flattery, threats, persuasion, lies, and other facets of interpersonal " -"communication. Works best in conjunction with a high level of intelligence." -msgstr "" - -#: lang/json/skill_from_json.py -msgid "survival" +"Your skill in creating, setting, finding and disarming traps safely and " +"effectively. This skill does not affect the evasion of traps that are " +"triggered." msgstr "" -#. ~ Description for survival +#. ~ Description for driving #: lang/json/skill_from_json.py msgid "" -"Your skill in surviving the wilderness, and in crafting various basic " -"survival items. This also covers your ability to skin and butcher animals " -"for meat and hides." +"Your skill in operating and steering a vehicle in motion. A higher level " +"allows greater control over vehicles at higher speeds, and reduces the " +"penalty of shooting while driving." msgstr "" #: lang/json/skill_from_json.py @@ -121615,77 +122762,75 @@ msgid "" "water, and determines the detriment of swimming with heavier gear." msgstr "" -#: lang/json/skill_from_json.py src/crafting_gui.cpp -msgid "tailoring" +#: lang/json/skill_from_json.py +msgid "fabrication" msgstr "" -#. ~ Description for tailoring +#. ~ Description for fabrication #: lang/json/skill_from_json.py msgid "" -"Your skill in the craft and repair of clothing, bags, blankets and other " -"textiles. Affects knitting, sewing, stitching, weaving, and nearly anything " -"else involving a needle and thread." +"Your skill in working with raw materials and shaping them into useful " +"objects. This skill plays an important role in the crafting of many objects." msgstr "" -#: lang/json/skill_from_json.py -msgid "trapping" +#: lang/json/skill_from_json.py src/crafting_gui.cpp +msgid "cooking" msgstr "" -#. ~ Description for trapping +#. ~ Description for cooking #: lang/json/skill_from_json.py msgid "" -"Your skill in creating, setting, finding and disarming traps safely and " -"effectively. This skill does not affect the evasion of traps that are " -"triggered." +"Your skill in combining food ingredients to make other, tastier food items. " +"It may also be used in certain chemical mixtures and other, more esoteric " +"tasks." msgstr "" -#: lang/json/skill_from_json.py -msgid "archery" +#: lang/json/skill_from_json.py src/crafting_gui.cpp +msgid "tailoring" msgstr "" -#. ~ Description for archery +#. ~ Description for tailoring #: lang/json/skill_from_json.py msgid "" -"Your skill in using bow weapons, from hand-carved self bows to complex " -"compound bows. Quiet and effective, they require strength of body and sight " -"to wield, and are not terribly accurate over a long distance." +"Your skill in the craft and repair of clothing, bags, blankets and other " +"textiles. Affects knitting, sewing, stitching, weaving, and nearly anything " +"else involving a needle and thread." msgstr "" #: lang/json/skill_from_json.py -msgid "bashing weapons" +msgid "survival" msgstr "" -#. ~ Description for bashing weapons +#. ~ Description for survival #: lang/json/skill_from_json.py msgid "" -"Your skill in fighting with blunt weaponry, from rocks and sticks to " -"baseball bats and the butts of rifles. Skill increases damage, and higher " -"levels will improve the accuracy of an attack." +"Your skill in surviving the wilderness, and in crafting various basic " +"survival items. This also covers your ability to skin and butcher animals " +"for meat and hides." msgstr "" #: lang/json/skill_from_json.py -msgid "cutting weapons" +msgid "electronics" msgstr "" -#. ~ Description for cutting weapons +#. ~ Description for electronics #: lang/json/skill_from_json.py msgid "" -"Your skill in fighting with weaponry designed to cut, hack and slash an " -"opponent. Lower levels of skill increase accuracy and damage, while higher " -"levels will help to bypass heavy armor and thick hides." +"Your skill in dealing with electrical systems, used in the craft and repair " +"of objects with electrical components. This skill is an important part of " +"installing and managing bionic implants." msgstr "" #: lang/json/skill_from_json.py -msgid "dodging" +msgid "archery" msgstr "" -#. ~ Description for dodging +#. ~ Description for archery #: lang/json/skill_from_json.py msgid "" -"Your ability to dodge an oncoming threat, be it an enemy's attack, a " -"triggered trap, or a falling rock. This skill is also used in attempts to " -"fall gracefully, and for other acrobatic feats. The first number shown " -"includes modifiers, and the second does not." +"Your skill in using bow weapons, from hand-carved self bows to complex " +"compound bows. Quiet and effective, they require strength of body and sight " +"to wield, and are not terribly accurate over a long distance." msgstr "" #: lang/json/skill_from_json.py @@ -121712,28 +122857,53 @@ msgid "" "immense destructive power, but they are cumbersome and hard to manage." msgstr "" -#: lang/json/skill_from_json.py src/item_factory.cpp -msgid "melee" +#: lang/json/skill_from_json.py +msgid "handguns" msgstr "" -#. ~ Description for melee +#. ~ Description for handguns #: lang/json/skill_from_json.py msgid "" -"Your skill and finesse in personal combat, both with and without a weapon. " -"Higher levels can significantly increase the accuracy and effectiveness of " -"your physical attacks." +"Handguns have poor accuracy compared to rifles, but are usually quick to " +"fire and reload faster than other guns. They are very effective at close " +"quarters, though unsuited for long range engagement." msgstr "" #: lang/json/skill_from_json.py -msgid "piercing weapons" +msgid "rifles" msgstr "" -#. ~ Description for piercing weapons +#. ~ Description for rifles #: lang/json/skill_from_json.py msgid "" -"Your skill in fighting with knives, spears and other such stabbing " -"implements. Skill increases attack accuracy as well as the chance of " -"inflicting a deadly and critical blow." +"Rifles have terrific range and accuracy compared to other firearms, but may " +"be slow to fire and reload, and can prove difficult to use in close " +"quarters. Fully automatic rifles can fire rapidly, but are harder to handle " +"properly." +msgstr "" + +#: lang/json/skill_from_json.py +msgid "shotguns" +msgstr "" + +#. ~ Description for shotguns +#: lang/json/skill_from_json.py +msgid "" +"Shotguns are easy to shoot and can inflict massive damage, but their " +"effectiveness and accuracy decline rapidly with range. Slugs can be loaded " +"into shotguns to provide greater range, though they are somewhat inaccurate." +msgstr "" + +#: lang/json/skill_from_json.py +msgid "submachine guns" +msgstr "" + +#. ~ Description for submachine guns +#: lang/json/skill_from_json.py +msgid "" +"Comprised of an automatic rifle carbine designed to fire a pistol cartridge, " +"submachine guns can reload and fire quickly, sometimes in bursts, but they " +"are relatively inaccurate and may be prone to mechanical failures." msgstr "" #: lang/json/skill_from_json.py @@ -121747,65 +122917,77 @@ msgid "" "and at higher levels, the range of a throw." msgstr "" +#: lang/json/skill_from_json.py src/item_factory.cpp +msgid "melee" +msgstr "" + +#. ~ Description for melee #: lang/json/skill_from_json.py -msgid "unarmed combat" +msgid "" +"Your skill and finesse in personal combat, both with and without a weapon. " +"Higher levels can significantly increase the accuracy and effectiveness of " +"your physical attacks." msgstr "" -#. ~ Description for unarmed combat +#: lang/json/skill_from_json.py +msgid "bashing weapons" +msgstr "" + +#. ~ Description for bashing weapons #: lang/json/skill_from_json.py msgid "" -"Your skill in hand-to-hand fighting. For the unskilled, it's a good way to " -"get hurt, but those with enough practice can perform special blows and " -"techniques to quickly dispatch enemies." +"Your skill in fighting with blunt weaponry, from rocks and sticks to " +"baseball bats and the butts of rifles. Skill increases damage, and higher " +"levels will improve the accuracy of an attack." msgstr "" #: lang/json/skill_from_json.py -msgid "handguns" +msgid "cutting weapons" msgstr "" -#. ~ Description for handguns +#. ~ Description for cutting weapons #: lang/json/skill_from_json.py msgid "" -"Handguns have poor accuracy compared to rifles, but are usually quick to " -"fire and reload faster than other guns. They are very effective at close " -"quarters, though unsuited for long range engagement." +"Your skill in fighting with weaponry designed to cut, hack and slash an " +"opponent. Lower levels of skill increase accuracy and damage, while higher " +"levels will help to bypass heavy armor and thick hides." msgstr "" #: lang/json/skill_from_json.py -msgid "rifles" +msgid "dodging" msgstr "" -#. ~ Description for rifles +#. ~ Description for dodging #: lang/json/skill_from_json.py msgid "" -"Rifles have terrific range and accuracy compared to other firearms, but may " -"be slow to fire and reload, and can prove difficult to use in close " -"quarters. Fully automatic rifles can fire rapidly, but are harder to handle " -"properly." +"Your ability to dodge an oncoming threat, be it an enemy's attack, a " +"triggered trap, or a falling rock. This skill is also used in attempts to " +"fall gracefully, and for other acrobatic feats. The first number shown " +"includes modifiers, and the second does not." msgstr "" #: lang/json/skill_from_json.py -msgid "shotguns" +msgid "piercing weapons" msgstr "" -#. ~ Description for shotguns +#. ~ Description for piercing weapons #: lang/json/skill_from_json.py msgid "" -"Shotguns are easy to shoot and can inflict massive damage, but their " -"effectiveness and accuracy decline rapidly with range. Slugs can be loaded " -"into shotguns to provide greater range, though they are somewhat inaccurate." +"Your skill in fighting with knives, spears and other such stabbing " +"implements. Skill increases attack accuracy as well as the chance of " +"inflicting a deadly and critical blow." msgstr "" #: lang/json/skill_from_json.py -msgid "submachine guns" +msgid "unarmed combat" msgstr "" -#. ~ Description for submachine guns +#. ~ Description for unarmed combat #: lang/json/skill_from_json.py msgid "" -"Comprised of an automatic rifle carbine designed to fire a pistol cartridge, " -"submachine guns can reload and fire quickly, sometimes in bursts, but they " -"are relatively inaccurate and may be prone to mechanical failures." +"Your skill in hand-to-hand fighting. For the unskilled, it's a good way to " +"get hurt, but those with enough practice can perform special blows and " +"techniques to quickly dispatch enemies." msgstr "" #: lang/json/skill_from_json.py @@ -123283,6 +124465,11 @@ msgstr "" msgid "Thorazine... That's what 'they' use to keep you tame." msgstr "" +#: lang/json/snippet_from_json.py +msgid "" +"Don't. This thorazine seriously clouds your mind. You need to stay sharp." +msgstr "" + #: lang/json/snippet_from_json.py msgid "Pink tablets! I love those!" msgstr "" @@ -123307,6 +124494,14 @@ msgstr "" msgid "You know what would make all this more bearable? Pink Tablets!" msgstr "" +#: lang/json/snippet_from_json.py +msgid "An odd pink tablet from the ground? I don't see why not!" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Finally, something to take the edge off." +msgstr "" + #: lang/json/snippet_from_json.py src/npctalk.cpp msgid "No thanks, I'm good." msgstr "" @@ -123331,6 +124526,14 @@ msgstr "" msgid "How about no?" msgstr "" +#: lang/json/snippet_from_json.py +msgid "I'm sorry . I'm afraid I can't do that." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Wish I could, ." +msgstr "" + #: lang/json/snippet_from_json.py msgid "No thanks, I really don't feel like it." msgstr "" @@ -123355,6 +124558,10 @@ msgstr "" msgid "Great idea! Call me when you find SOMEONE ELSE to do it." msgstr "" +#: lang/json/snippet_from_json.py +msgid "Not exactly the settlin' type." +msgstr "" + #: lang/json/snippet_from_json.py msgid " " msgstr "" @@ -123547,6 +124754,26 @@ msgstr "" msgid "shithead" msgstr "" +#: lang/json/snippet_from_json.py +msgid "fuck-trumpet" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "pillock" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "bellend" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "-looking " +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "oxygen-wasting " +msgstr "" + #: lang/json/snippet_from_json.py msgid " if I won't get some water soon." msgstr "" @@ -123611,6 +124838,10 @@ msgstr "" msgid "Did you know that lack of water kills faster than lack of rest?" msgstr "" +#: lang/json/snippet_from_json.py +msgid "I'd kill for a sip of water right now." +msgstr "" + #: lang/json/snippet_from_json.py msgid "" "Yeah sure, can't help but notice you got beer with you! Let's crack a cold " @@ -123628,6 +124859,18 @@ msgid "" "like! Only joking, what's up ?" msgstr "" +#: lang/json/snippet_from_json.py +msgid "" +"Hey , I bet a chat would be all the sweeter with a nice, cold beer " +"in hand. How's it going?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"While we chat, what say you we open a beer and just... pretend the world " +"isn't ending, just for a while?" +msgstr "" + #: lang/json/snippet_from_json.py msgid "Hey, sure thing, , I need a break anyway, how are you?" msgstr "" @@ -123672,6 +124915,18 @@ msgstr "" msgid "Definitely, I'm game. How you holding up?" msgstr "" +#: lang/json/snippet_from_json.py +msgid "Good idea . Let's forget the world for a while. How you doin'?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Ah, what the heck. How's life been treating you?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Sure. So, how about that weather ey?" +msgstr "" + #: lang/json/snippet_from_json.py msgid "darn" msgstr "" @@ -123725,19 +124980,31 @@ msgid "Oh sugar!" msgstr "" #: lang/json/snippet_from_json.py -msgid "sad" +msgid "bloody hell" msgstr "" #: lang/json/snippet_from_json.py -msgid "bummed" +msgid "fuck's sake" msgstr "" #: lang/json/snippet_from_json.py -msgid "depressed" +msgid "bollocks" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "goodness" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "sad" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "bummed" msgstr "" #: lang/json/snippet_from_json.py -msgid "pissed" +msgid "depressed" msgstr "" #: lang/json/snippet_from_json.py @@ -123760,6 +125027,22 @@ msgstr "" msgid "glum" msgstr "" +#: lang/json/snippet_from_json.py src/color.cpp src/item.cpp +msgid "blue" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "dismal" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "sorrowful" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "despondent" +msgstr "" + #: lang/json/snippet_from_json.py msgid "Hey ." msgstr "" @@ -123801,10 +125084,22 @@ msgid "Hi " msgstr "" #: lang/json/snippet_from_json.py -msgid "never" +msgid "Well met!" +msgstr "" + +#: lang/json/snippet_from_json.py lang/json/talk_topic_from_json.py +msgid "Howdy." msgstr "" #: lang/json/snippet_from_json.py +msgid "." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "never" +msgstr "" + +#: lang/json/snippet_from_json.py src/auto_note.cpp src/editmap.cpp msgid "no" msgstr "" @@ -123864,6 +125159,14 @@ msgstr "" msgid "fat chance" msgstr "" +#: lang/json/snippet_from_json.py +msgid "bananope" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "when hell freezes over" +msgstr "" + #: lang/json/snippet_from_json.py msgid "Goodbye, !" msgstr "" @@ -123888,6 +125191,18 @@ msgstr "" msgid "Bye bye, !" msgstr "" +#: lang/json/snippet_from_json.py +msgid "See you later, alligator." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Our paths must part, for now at least." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "There's something I gotta do on my own. Sorry." +msgstr "" + #: lang/json/snippet_from_json.py msgid "consider yourself dead" msgstr "" @@ -123948,6 +125263,38 @@ msgstr "" msgid ", " msgstr "" +#: lang/json/snippet_from_json.py +msgid "only one of us is leaving here alive," +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "prepare thyself for punishment," +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "make peace with your gods," +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "if you worship any gods, now is a good time to start praying" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "your life is now forfeit," +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "when I'm through with you, there won't be enough left to identify" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I'm gonna beat you so bad, even the people who look like you will hurt" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "come closer, I can't beat the shit out of you from a distance" +msgstr "" + #: lang/json/snippet_from_json.py msgid "I'm not gonna last much longer" msgstr "" @@ -123992,6 +125339,22 @@ msgstr "" msgid ", I'm sorry" msgstr "" +#: lang/json/snippet_from_json.py +msgid "didn't think it would end like this." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "so, this is how it ends, huh?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I don't wanna go" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "bury me somewhere nice, if I don't make it" +msgstr "" + #: lang/json/snippet_from_json.py msgid "Can you wait?" msgstr "" @@ -124040,6 +125403,10 @@ msgstr "" msgid "Hey, I'm over here!" msgstr "" +#: lang/json/snippet_from_json.py +msgid "Hold up a second, will ya?" +msgstr "" + #: lang/json/snippet_from_json.py msgid "I'm unaffiliated." msgstr "" @@ -124080,6 +125447,10 @@ msgstr "" msgid "I don't belong to a faction, ." msgstr "" +#: lang/json/snippet_from_json.py +msgid "I'm currently not under any contract. Why, you hiring?" +msgstr "" + #: lang/json/snippet_from_json.py msgid "amigo" msgstr "" @@ -124089,7 +125460,7 @@ msgid "comrade" msgstr "" #: lang/json/snippet_from_json.py -msgid "fellow" +msgid "my good fellow" msgstr "" #: lang/json/snippet_from_json.py @@ -124101,7 +125472,7 @@ msgid "mate" msgstr "" #: lang/json/snippet_from_json.py -msgid "nomad" +msgid "my fellow nomad" msgstr "" #: lang/json/snippet_from_json.py @@ -124109,11 +125480,7 @@ msgid "partner" msgstr "" #: lang/json/snippet_from_json.py -msgid "stranger" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "survivor" +msgid "fellow survivor" msgstr "" #: lang/json/snippet_from_json.py @@ -124121,11 +125488,7 @@ msgid "friend" msgstr "" #: lang/json/snippet_from_json.py -msgid "pilgrim" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "traveler" +msgid "fellow traveler" msgstr "" #: lang/json/snippet_from_json.py @@ -124137,19 +125500,19 @@ msgid "fella" msgstr "" #: lang/json/snippet_from_json.py -msgid "you" +msgid "my dude" msgstr "" #: lang/json/snippet_from_json.py -msgid "dude" +msgid "buddy" msgstr "" #: lang/json/snippet_from_json.py -msgid "buddy" +msgid "chum" msgstr "" #: lang/json/snippet_from_json.py -msgid "man" +msgid "bruv" msgstr "" #: lang/json/snippet_from_json.py @@ -124276,6 +125639,18 @@ msgstr "" msgid "I'll just go to sleep, ?" msgstr "" +#: lang/json/snippet_from_json.py +msgid "I just...gotta close my eyes for a bit, okay?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Can't remember the last time I had a proper kip." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I can't keep going for long . I need some rest, bad." +msgstr "" + #: lang/json/snippet_from_json.py msgid "I'm going to sleep now." msgstr "" @@ -124300,6 +125675,10 @@ msgstr "" msgid "Good night! Wake me if you need me." msgstr "" +#: lang/json/snippet_from_json.py +msgid "Calling it a night for now. You get some rest too, okay?." +msgstr "" + #: lang/json/snippet_from_json.py msgid "extremely" msgstr "" @@ -124364,6 +125743,38 @@ msgstr "" msgid " " msgstr "" +#: lang/json/snippet_from_json.py +msgid "severely" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "extraordinarily" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "unusually" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "tremendously" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "vastly" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "palpably" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "inordinately" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "staggeringly" +msgstr "" + #: lang/json/snippet_from_json.py src/iuse.cpp msgid "fine" msgstr "" @@ -124404,6 +125815,10 @@ msgstr "" msgid "that clear" msgstr "" +#: lang/json/snippet_from_json.py +msgid "capiche" +msgstr "" + #: lang/json/snippet_from_json.py msgid "seriously" msgstr "" @@ -124484,6 +125899,10 @@ msgstr "" msgid "You need to move, , ?" msgstr "" +#: lang/json/snippet_from_json.py +msgid "Coming through!" +msgstr "" + #: lang/json/snippet_from_json.py msgid "Thanks for the cash, !" msgstr "" @@ -124512,6 +125931,18 @@ msgstr "" msgid "Thanks, !" msgstr "" +#: lang/json/snippet_from_json.py +msgid "Pleasure doing business with you." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Now beat it, you ." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Good haul. See you around" +msgstr "" + #: lang/json/snippet_from_json.py msgid "Hey! I saw you take that ! Drop it. Now." msgstr "" @@ -124549,6 +125980,18 @@ msgstr "" msgid "You think I'm blind ? Don't touch our stuff." msgstr "" +#: lang/json/snippet_from_json.py +msgid "You have one chance to put it back." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Return the stolen goods. You have to the count of three to comply." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "You're not leaving here with stolen goods, ." +msgstr "" + #: lang/json/snippet_from_json.py msgid "content" msgstr "" @@ -124597,6 +126040,14 @@ msgstr "" msgid "pumped" msgstr "" +#: lang/json/snippet_from_json.py +msgid "joyful" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "merry" +msgstr "" + #: lang/json/snippet_from_json.py msgid "Drop your weapon!" msgstr "" @@ -124637,6 +126088,15 @@ msgstr "" msgid "Alright, drop the !" msgstr "" +#: lang/json/snippet_from_json.py +msgid "" +"Please put down your weapon. I'll give you to the count of three. One..." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Let's take it easy now, okay? Put the weapon down." +msgstr "" + #: lang/json/snippet_from_json.py msgid "motherfucking" msgstr "" @@ -124661,6 +126121,18 @@ msgstr "" msgid "mafuckin'" msgstr "" +#: lang/json/snippet_from_json.py +msgid "bloody" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "god-forsaken" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "cursed" +msgstr "" + #: lang/json/snippet_from_json.py msgid "Wait up, let's talk!" msgstr "" @@ -124701,6 +126173,10 @@ msgstr "" msgid "Look, let's talk!" msgstr "" +#: lang/json/snippet_from_json.py +msgid "Hey, what's the rush? Let's chat a tad." +msgstr "" + #: lang/json/snippet_from_json.py msgid "Put your hands up!" msgstr "" @@ -124741,6 +126217,18 @@ msgstr "" msgid "Hands in the air, !" msgstr "" +#: lang/json/snippet_from_json.py +msgid "Hands up, no sudden movements and we're gravy, okay?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Take it easy and put your hands up now, ." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Why don't you put your hands up for me ." +msgstr "" + #: lang/json/snippet_from_json.py src/martialarts.cpp msgid "Move" msgstr "" @@ -124781,6 +126269,10 @@ msgstr "" msgid "Get out of my line of fire" msgstr "" +#: lang/json/snippet_from_json.py +msgid "Move, move, move" +msgstr "" + #: lang/json/snippet_from_json.py msgid "I almost want to eat my now." msgstr "" @@ -124829,6 +126321,14 @@ msgstr "" msgid "Did you know that lack of food kills faster than chain smoking?" msgstr "" +#: lang/json/snippet_from_json.py +msgid "Can't remember the last time I got a proper meal." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I could eat a horse." +msgstr "" + #: lang/json/snippet_from_json.py msgid "fuck you" msgstr "" @@ -124853,6 +126353,28 @@ msgstr "" msgid "" msgstr "" +#: lang/json/snippet_from_json.py +msgid "you can fuck right off, you " +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I've had enough of you, begone." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "you're a poster child for abortions" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"how the fuck you've survived this far is beyond me, you " +"" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "you're the reason the gene pool needs a lifeguard" +msgstr "" + #: lang/json/snippet_from_json.py msgid "Can I get out and walk? This vehicle is too small." msgstr "" @@ -124882,15 +126404,19 @@ msgid "I don't like being a mutant crammed into your tiny little vehicle." msgstr "" #: lang/json/snippet_from_json.py -msgid " Fire in the hole!" +msgid "Getting awfully cramped in here." msgstr "" #: lang/json/snippet_from_json.py -msgid " Get cover!" +msgid "I don't think this vehicle was designed for someone like me." msgstr "" #: lang/json/snippet_from_json.py -msgid "Marines! We are leaving!" +msgid " Fire in the hole!" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid " Get cover!" msgstr "" #: lang/json/snippet_from_json.py @@ -124921,6 +126447,14 @@ msgstr "" msgid "Fire in the hole, motherfuckers!" msgstr "" +#: lang/json/snippet_from_json.py +msgid "Heads up, ." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Watch out for shrapnel!" +msgstr "" + #: lang/json/snippet_from_json.py msgid "Fire in the hole!" msgstr "" @@ -124938,11 +126472,23 @@ msgid "Hit the dirt!" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm getting my ass out of here! You'd better do the same, !" +msgid "Fire in the hole, motherfuckers!" msgstr "" #: lang/json/snippet_from_json.py -msgid "Fire in the hole, motherfuckers!" +msgid "Bombs away!" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Shrapnel, incoming! Watch it!" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Making some noise!" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Hit the deck!" msgstr "" #: lang/json/snippet_from_json.py @@ -124969,6 +126515,18 @@ msgstr "" msgid ", here comes a " msgstr "" +#: lang/json/snippet_from_json.py +msgid "Incoming!" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Prepare yourself! We have a" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +msgstr "" + #: lang/json/snippet_from_json.py msgid "Look out for that" msgstr "" @@ -124993,6 +126551,10 @@ msgstr "" msgid "Look out! A" msgstr "" +#: lang/json/snippet_from_json.py +msgid "Keep an eye on that" +msgstr "" + #: lang/json/snippet_from_json.py msgid "Look sharp! Things are heating up." msgstr "" @@ -125033,6 +126595,22 @@ msgstr "" msgid "" msgstr "" +#: lang/json/snippet_from_json.py +msgid "Fight or flight?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Weapons hot!" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Lock and load!" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "We've got incoming!" +msgstr "" + #: lang/json/snippet_from_json.py msgid " look sharp! Things are heating up." msgstr "" @@ -125162,7 +126740,35 @@ msgid "I'd kill for a coke." msgstr "" #: lang/json/snippet_from_json.py -msgid "" +msgid "Weapons check everyone. There may be more." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "That's that, then." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "That's the last of them for now." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Clearing the world, one at a time" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Well, that got the blood pumping." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "We're clear, but stay frosty." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid " beautiful work." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Getting really good at this." msgstr "" #: lang/json/snippet_from_json.py @@ -125230,7 +126836,27 @@ msgid "I'm your huckleberry," msgstr "" #: lang/json/snippet_from_json.py -msgid "Sorry, but you have to do down," +msgid "Sorry, but you have to go down," +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "End of the line," +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "You have it coming" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Let's dance," +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "You and me," +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I will kill you to death" msgstr "" #: lang/json/snippet_from_json.py @@ -125305,6 +126931,36 @@ msgstr "" msgid "Please, I don't want to die. C'mon, bandages!" msgstr "" +#: lang/json/snippet_from_json.py +msgid "Wait a spell, patching myself up!" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Applying first aid!" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "These bandages ain't much, but they will do for now." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Hold up, gotta plug this hole in me." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Watch my back while I stitch my arm back on ." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Gotta bandage this or I'll bleed out. Give me a sec." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I ain't got time to ble-wait, that's a lot of blood. Give me a second while " +"I patch this." +msgstr "" + #: lang/json/snippet_from_json.py msgid "Quiet down over there!" msgstr "" @@ -125317,6 +126973,10 @@ msgstr "" msgid "Who said that?" msgstr "" +#: lang/json/snippet_from_json.py +msgid "Who goes there?" +msgstr "" + #: lang/json/snippet_from_json.py msgid "That sounds bad." msgstr "" @@ -125337,6 +126997,10 @@ msgstr "" msgid "Is something over there?" msgstr "" +#: lang/json/snippet_from_json.py +msgid "What was that?" +msgstr "" + #: lang/json/snippet_from_json.py msgid "I hear something moving - sounded like" msgstr "" @@ -125357,6 +127021,10 @@ msgstr "" msgid "What is making that sound? I can hear the" msgstr "" +#: lang/json/snippet_from_json.py +msgid "I could swear I heard" +msgstr "" + #: lang/json/snippet_from_json.py msgid "Got it!" msgstr "" @@ -125397,6 +127065,31 @@ msgstr "" msgid "Can do." msgstr "" +#: lang/json/snippet_from_json.py lang/json/talk_topic_from_json.py +#: lang/json/talk_topic_from_json.py +msgid "Affirmative." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Roger that." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Capiche." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "You got it." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Aye aye." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Aye." +msgstr "" + #: lang/json/snippet_from_json.py msgid "Whew... smells like skunk!" msgstr "" @@ -125437,6 +127130,10 @@ msgstr "" msgid "Are you sure it's a good idea to smoke that now?" msgstr "" +#: lang/json/snippet_from_json.py +msgid "Is that the devil's lettuce I smell?" +msgstr "" + #: lang/json/snippet_from_json.py msgid "I don't know... should you really be smoking that stuff?" msgstr "" @@ -125457,6 +127154,22 @@ msgstr "" msgid "Oh, wow, that smell... Can I have some?" msgstr "" +#: lang/json/snippet_from_json.py +msgid "I smell heresy." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Seriously? You're smoking that?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Well that's one way to guarantee the zombies don't kill you." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Come on , you're better than this." +msgstr "" + #: lang/json/snippet_from_json.py msgid "Ew, smells like burning rubber!" msgstr "" @@ -125481,6 +127194,22 @@ msgstr "" msgid "Hey, , can I get some batteries here? I need to recharge." msgstr "" +#: lang/json/snippet_from_json.py +msgid "" +"Internal batteries running low. How many batteries can you spare right now?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I can do a lot more for you if you pass me a couple batteries to recharge." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"All these implants I got are going to turn to useless scrap real soon if I " +"don't get some batteries to recharge." +msgstr "" + #: lang/json/snippet_from_json.py msgid "Pass me a beer, I need to power my ethanol burner." msgstr "" @@ -125495,6 +127224,22 @@ msgstr "" msgid "Waiter! I need a refill, my ethanol burner is running out of charge!" msgstr "" +#: lang/json/snippet_from_json.py +msgid "" +"I require ethanol-based drinks for my internal power supply. Anything on you?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Got any alcohol to spare? Need to recharge my drives. Mead, if you have any." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This ethanol-burning power supply is the best implant I ever got. Speaking " +"of which, got some booze to top me off?" +msgstr "" + #: lang/json/snippet_from_json.py msgid "I need some junk to power my internal furnace." msgstr "" @@ -125553,6 +127298,12 @@ msgid "" "recharge my CBMs!" msgstr "" +#: lang/json/snippet_from_json.py +msgid "" +"I sure could use a highly radioactive slurry shake for my power supply right " +"now." +msgstr "" + #: lang/json/snippet_from_json.py msgid "Tell me about how you survived the cataclysm." msgstr "" @@ -125565,6 +127316,18 @@ msgstr "" msgid "What was the cataclysm like for you?" msgstr "" +#: lang/json/snippet_from_json.py +msgid "How did you make it through the initial chaos?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Tell me how you survived the initial wave of the Cataclysm." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Was it rough surviving thus far?" +msgstr "" + #: lang/json/snippet_from_json.py lang/json/talk_topic_from_json.py #: lang/json/talk_topic_from_json.py msgid "Let's talk about something else." @@ -125578,6 +127341,14 @@ msgstr "" msgid "I'd like to ask you about something else." msgstr "" +#: lang/json/snippet_from_json.py +msgid "Moving on..." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Anyway..." +msgstr "" + #: lang/json/snippet_from_json.py msgid "We should probably get going." msgstr "" @@ -125590,6 +127361,30 @@ msgstr "" msgid "Let's head out." msgstr "" +#: lang/json/snippet_from_json.py +msgid "Time's a-wasting. Let's head out." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Come on. We got stuff to do." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Let's hit the road." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "We'll pick this up another time. Let's go." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Let's put a pin in this chat for now." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Talk to you later." +msgstr "" + #: lang/json/snippet_from_json.py msgid "shitty" msgstr "" @@ -125635,6 +127430,10 @@ msgstr "" msgid "fucked-up" msgstr "" +#: lang/json/snippet_from_json.py +msgid "deplorable" +msgstr "" + #: lang/json/snippet_from_json.py msgid "stupid" msgstr "" @@ -125663,6 +127462,10 @@ msgstr "" msgid "shit-for-brains" msgstr "" +#: lang/json/snippet_from_json.py +msgid "imbecilic" +msgstr "" + #: lang/json/snippet_from_json.py msgid "Z" msgstr "" @@ -125692,7 +127495,11 @@ msgid "undead" msgstr "" #: lang/json/snippet_from_json.py -msgid "living dead" +msgid "a living corpse" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "zed" msgstr "" #: lang/json/snippet_from_json.py @@ -125707,6 +127514,14 @@ msgstr "" msgid " " msgstr "" +#: lang/json/snippet_from_json.py +msgid "living dead" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "zeds" +msgstr "" + #: lang/json/snippet_from_json.py msgid "monster" msgstr "" @@ -125747,6 +127562,18 @@ msgstr "" msgid "thing right out of a scary movie" msgstr "" +#: lang/json/snippet_from_json.py +msgid " thing" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "whatever-the-fuck that is" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "eldritch horror" +msgstr "" + #: lang/json/snippet_from_json.py msgid "the cataclysm" msgstr "" @@ -125815,6 +127642,22 @@ msgstr "" msgid "!" msgstr "" +#: lang/json/snippet_from_json.py +msgid "Retreat! Retreat!" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Book it!" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Leg it!" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Thank fuck for all the cardio!d" +msgstr "" + #: lang/json/snippet_from_json.py msgid "I can't outrun it! I'm going to kill it!" msgstr "" @@ -125824,7 +127667,11 @@ msgid "! Die, you ! I want to live!" msgstr "" #: lang/json/snippet_from_json.py -msgid "My feet failed me! Arms don't fail me!" +msgid "My feet failed me! Arms, don't fail me!" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "If I die, I'm taking you all with me!" msgstr "" #: lang/json/snippet_from_json.py @@ -125843,6 +127690,18 @@ msgstr "" msgid "Fire bad! !" msgstr "" +#: lang/json/snippet_from_json.py +msgid "Fire, fire, FIRE!" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Get an extinguisher!" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Danger hot!" +msgstr "" + #: lang/json/snippet_from_json.py msgid "child" msgstr "" @@ -125859,6 +127718,10 @@ msgstr "" msgid "my dear" msgstr "" +#: lang/json/snippet_from_json.py +msgid "survivor" +msgstr "" + #: lang/json/snippet_from_json.py msgid " will use ranged weapons." msgstr "" @@ -126823,16 +128686,6 @@ msgid "" "caption reads: \"Free Plastic Surgery While You Wait!\"" msgstr "" -#: lang/json/snippet_from_json.py -msgid "" -"This is an advertisement for Sybil's Cyber Boutique. It shows a picture of " -"several bikini-clad nurses giving liquid medicine to a delighted patient, " -"who uses a fingertip needle to suck it in into his veins. Outside the " -"window two shadow figures using the same fingertip needles to absorb " -"something less resembling medicine. The caption reads: \"Why use old IV " -"when you can have Intravenous Needle CBM!\"" -msgstr "" - #: lang/json/snippet_from_json.py msgid "" "This is an advertisement for Sybil's Cyber Boutique. It shows a picture of " @@ -126841,16 +128694,6 @@ msgid "" "up. The caption reads: \"Holiday sales! Get the package deals!\"" msgstr "" -#: lang/json/snippet_from_json.py -#, no-python-format -msgid "" -"This is an advertisement for Sybil's Cyber Boutique. It shows a picture of " -"a man flexing shiny cybernetic arms in front of a mirror. He is flanked by " -"two scantily clad nurses who hold bloody chainsaws and give approving thumbs " -"up. In the background feral dogs gnaw on the man's discarded former limbs. " -"The caption reads: \"Spring Cleaning Sale! 20% off!\"" -msgstr "" - #: lang/json/snippet_from_json.py msgid "" "This is an advertisement for Sybil's Cyber Boutique. It shows a picture of " @@ -126986,32 +128829,54 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "" "This is a public notice from the Centers for Disease Control. Its message, " -"repeated in several languages, reads: Due to the rising threat of so-called " -"\"Green Fever\" the CDC would like to remind the public to cover your nose " +"repeated in several languages, reads: Due to the recent outbreak of the A " +"H3N2 flu strain, the CDC would like to remind the public to cover your nose " "and mouth with a tissue when you cough or sneeze and wash your hands " -"frequently with soap and water. In light of recent events, the CDC also " -"recommends an annual flu vaccine for everyone 6 months of age and older." +"frequently with soap and water. The CDC also recommends an annual flu " +"vaccine for everyone 6 months of age and older, which can be found at your " +"local doctor's office or pharmacy." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a public alert from the Centers for Disease Control. Its message, " +"repeated in several languages, reads: PUBLIC HEALTH ALERT: Due to recent " +"events, the CDC is issuing a warning to avoid public areas and spaces. An " +"unknown biological contaminant is suspected to be affecting citizens, " +"possibly an unexpected mutation in the A H3N2 flu strain. The CDC would like " +"to remind the public to cover your nose and mouth when sneezing, wash your " +"hands frequently, and recieve an up-to-date flu shot if possible. Boiling " +"water is recommended until further notice." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is a public alert from the Federal Emergency Management Agency. Its " +"message, repeated in several languages, reads: STAY IN YOUR HOMES! All " +"residents of the New England Disaster Area are advised to shelter in place " +"wherever possible. The United States Armed Forces are working to contain the " +"area. If there is a nearby evacuation shelter you can get to safely, you are " +"recommended to do so. Otherwise, stay in your homes until authorized " +"personnel evacuate you to a secured facility. Thank you for your compliance." msgstr "" #: lang/json/snippet_from_json.py msgid "" -"This is a public message from the Federal Emergency Management Agency. Its " -"message, repeated in several languages, reads: STAY IN YOUR HOMES! The US " -"government is taking steps to halt the current epidemic of \"Green Fever\" " -"and help is currently on its way to afflicted areas. In the name of public " -"safety you are hereby ordered to remain in your homes until evacuated to a " -"treatment camp by authorized agents of the United States military. Thank " -"you for your compliance." +"This is a public alert from the Federal Emergency Management Agency. Its " +"message, repeated in several languages, consists of a list of towns serving " +"as major evacuation points from the New England Disaster Area. Someone has " +"scribbled off most of the town names, and scrawled \"OVERRUN\" next to each " +"one, with the exception of the Tacoma evacuation point." msgstr "" #: lang/json/snippet_from_json.py msgid "" "This is a public warning from an unnamed source. Its rambling message, " "poorly-photocopied onto both sides of the page, reads: Don't believe the " -"lies! The Army is rounding up people in death camps while the Green Fever " -"spreads like wildfire. Do not believe what the mainstream news-media is " -"reporting. All official evacuation points are death-traps. Secure supplies " -"and escape the cities while there is still time." +"lies! The Army is rounding up people in death camps and executing them at " +"mass graves. They cannot stop this. Do not believe what the mainstream news-" +"media is reporting. All official evacuation points are death-traps. Secure " +"supplies and escape the cities while there is still time." msgstr "" #: lang/json/snippet_from_json.py @@ -127025,12 +128890,14 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "" -"This is a public warning from the United States Army. Its brief message, " +"This is a public warning from the Federal Government. Its brief message, " "repeated in several languages, reads: The President of the United States " -"has declared unilateral martial law affecting the entire nation. Shelter in " +"has declared unilateral martial law to be in effect for the 48 contiguous " +"states in response to the ongoing national crisis. Continue to shelter in " "place until evacuated to an appropriate emergency management camp by " -"authorized military personnel. This curfew will remain in effect until " -"further notice. Stay indoors. Violators will be shot on sight." +"authorized military personnel. A 24-hour curfew has been established. This " +"curfew will remain in effect until further notice. Stay indoors. Violators " +"will be shot on sight." msgstr "" #: lang/json/snippet_from_json.py @@ -127177,14 +129044,6 @@ msgid "" "'Jersey Shore Blues'. Starring Jenifer Languiz as 'Snookie'!\"" msgstr "" -#: lang/json/snippet_from_json.py -msgid "" -"\"Have you found (y)our savior today? Atom is here for you, it is inside " -"you!\" This flier marked the rising popularity of the Atom Cult, a religion " -"in which the essence of life is discovered through meticulous inward study " -"and pious donations." -msgstr "" - #: lang/json/snippet_from_json.py msgid "" "\"Joe's Diner; 1/2 pound of meat, 3 toppings, 'your choice', all with a side " @@ -127281,12 +129140,6 @@ msgid "" "be the next big leader. WHERES MY CHANCE!??\"" msgstr "" -#: lang/json/snippet_from_json.py -msgid "" -"\"You know they got a machine that can change the weather now? You put in a " -"bunch o'numbers and the whole thing funks around!\"" -msgstr "" - #: lang/json/snippet_from_json.py msgid "" "\"A man in a black robe came up to me, said he wanted to make a deal...\"" @@ -127307,9 +129160,10 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "" -"\"Save the cyborg! Please whoever read this you must help them! Knock them " -"out or inactivate them I don't care! But bring them on that Autodoc and " -"remove the chip messing up their brain.\"" +"\"Save the cyborgs! Please, whoever reads this, you must help them! Knock " +"them out or deactivate them, I don't care how you do it. But put their " +"unconscious body on that Autodoc and remove the chip that is messing up " +"their brain!\"" msgstr "" #: lang/json/snippet_from_json.py @@ -127337,13 +129191,7 @@ msgid "" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"You want my advice? Smoke Crack, It gets shit done.\"" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "" -"\"The raindrops keep falling on my head, the acid ensured my eyes would soon " -"be bleedin red...\"" +msgid "\"You want my advice? Smoke crack, it gets shit done.\"" msgstr "" #: lang/json/snippet_from_json.py @@ -127374,24 +129222,12 @@ msgid "" "\"This isn't real this is a test to turn you into a Manchurian Candidate!\"" msgstr "" -#: lang/json/snippet_from_json.py -msgid "\"Real Men do it with STYLE. SUPASTYLIN.\"" -msgstr "" - #: lang/json/snippet_from_json.py msgid "" "\"They're all hiding on an oil rig, I heard it myself over the AM airwaves. " "They think they're the nobles of the 21st century, the prigs.\"" msgstr "" -#: lang/json/snippet_from_json.py -msgid "" -"The Green Fever shall purge the land for His Chosen children. I have seen " -"His black fire shining in the eyes of the afflicted and eagerly await the " -"day He shall consume us all. Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl " -"fhtagn." -msgstr "" - #: lang/json/snippet_from_json.py msgid "" "\"Some of 'em are big. Real big. Don't stick around, I saw my mate get " @@ -127408,10 +129244,6 @@ msgid "" "they're docile now. Please fucking tell me.\"" msgstr "" -#: lang/json/snippet_from_json.py -msgid "\"Swamp water tastes good! An\"" -msgstr "" - #: lang/json/snippet_from_json.py msgid "\"Why are all the lawnmowers broken?!\"" msgstr "" @@ -127452,10 +129284,6 @@ msgid "" "\"I get air conditioners, but... this whole laboratory is frozen to ice!\"" msgstr "" -#: lang/json/snippet_from_json.py -msgid "\"Fuck aerodynamics, I want another engine!\"" -msgstr "" - #: lang/json/snippet_from_json.py msgid "" "\"A wood ax works pretty well against them. So does a machete, but you " @@ -127527,10 +129355,6 @@ msgstr "" msgid "\"Don't keep your goddamn casings! They'll just weigh you down.\"" msgstr "" -#: lang/json/snippet_from_json.py -msgid "There is a splotch of blood on it. \"blood of the zombie king\"" -msgstr "" - #: lang/json/snippet_from_json.py msgid "" "\"Local auto shop is full of the things. And to think I worked with them on " @@ -127547,6 +129371,12 @@ msgid "" "along akin to a snail and I shed my feathers every day.\"" msgstr "" +#: lang/json/snippet_from_json.py +msgid "" +"\"Killed a giant worm thing, but now I'm only three feet tall. Should've " +"just left the damn worm alone, now none of my clothes fit!\"" +msgstr "" + #: lang/json/snippet_from_json.py msgid "\"I don't have enough time to double tap. You don't either.\"" msgstr "" @@ -127567,10 +129397,6 @@ msgstr "" msgid "\"tHE Portal it's so COld\"" msgstr "" -#: lang/json/snippet_from_json.py -msgid "\"I can wear three backpacks! Fuck, I'm good.\"" -msgstr "" - #: lang/json/snippet_from_json.py msgid "" "\"They build modern bullets fuckin crazy. Set some on fire and they all " @@ -127616,10 +129442,6 @@ msgid "" "Run for your life.\"" msgstr "" -#: lang/json/snippet_from_json.py -msgid "\"Don't fall down a nuclear silo, they left 'em all open\"" -msgstr "" - #: lang/json/snippet_from_json.py msgid "\"DINT ATE THE MUSHROM\"" msgstr "" @@ -127655,10 +129477,6 @@ msgid "" "alright.\"" msgstr "" -#: lang/json/snippet_from_json.py -msgid "\"This apocalypse will be good for the US financial crisis\"" -msgstr "" - #: lang/json/snippet_from_json.py msgid "\"THEY DON'T feel ANYTHING\"" msgstr "" @@ -127677,10 +129495,6 @@ msgstr "" msgid "\"THE MARLEY WAS RIGHT\"" msgstr "" -#: lang/json/snippet_from_json.py -msgid "\"I... I just put a muffler onto a... nail gun.\"" -msgstr "" - #: lang/json/snippet_from_json.py msgid "" "\"Squeeze some ammonia into zombie flesh and hold it tight. You smell like " @@ -127702,10 +129516,6 @@ msgid "" "\"Don't let the ember go out please don't go out I need you precious fire.\"" msgstr "" -#: lang/json/snippet_from_json.py -msgid "\"What's with these pits... with, like, sli\"" -msgstr "" - #: lang/json/snippet_from_json.py msgid "" "\"Everyone used their gas to get to another town... but it's the same story " @@ -127713,19 +129523,17 @@ msgid "" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"The gas the gas the green gas spreads forever\"" +msgid "\"There's still an evacuation point at Concord, spread the word.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Most things can be taken out with a shotgun. More things can be taken out " -"with a grenade. Imagine what a mini-nuke does.\"" +msgid "\"STAY AWAY FROM CONCORD\"" msgstr "" #: lang/json/snippet_from_json.py msgid "" -"\"My friend gave me lit dynamite, but it hasn't exploded yet... I don't " -"think that's supposed to happen. God help us.\"" +"\"Most things can be taken out with a shotgun. More things can be taken out " +"with a grenade. Imagine what a mini-nuke does.\"" msgstr "" #: lang/json/snippet_from_json.py @@ -127772,12 +129580,6 @@ msgid "" "Did I miss any?\"" msgstr "" -#: lang/json/snippet_from_json.py -msgid "" -"\"I left a stash of rechargeable batteries in my safe and apparently the " -"goddamn zombie Tooth Fairy has taken them all.\"" -msgstr "" - #: lang/json/snippet_from_json.py msgid "" "\"All I've got is this keg of beer and an appetite. Come at me, apocalypse!" @@ -127794,10 +129596,6 @@ msgstr "" msgid "\"SWAMPS RUN SWAMPS NO SWAMPS RUN\"" msgstr "" -#: lang/json/snippet_from_json.py -msgid "\"dog bit off my legs, magical hospital make all better\"" -msgstr "" - #: lang/json/snippet_from_json.py msgid "" "\"They said a walking cane was a useless weapon... but then I hit one of " @@ -127828,12 +129626,6 @@ msgstr "" msgid "\"I propose a new currency: 9mm.\"" msgstr "" -#: lang/json/snippet_from_json.py -msgid "" -"\"Something wrong, with cars..., ram, and,. my speedometer read six " -"hundred.,.thousand can't feel lungs,\"" -msgstr "" - #: lang/json/snippet_from_json.py msgid "" "\"My skin is crawling and I teleport every few minutes... what is going o\"" @@ -127863,16 +129655,6 @@ msgid "" "prisoners inside\"" msgstr "" -#: lang/json/snippet_from_json.py -msgid "" -"\"Shopping carts become a lot more efficient when you plate-weld a trunk to " -"them. Crate on wheels!\"" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "\"telportfd itont wall, amr gone\"" -msgstr "" - #: lang/json/snippet_from_json.py msgid "" "\"This thing isn't a car any more. It's just a fucking mountain of metal on " @@ -127885,10 +129667,6 @@ msgid "" "they're normal.\"" msgstr "" -#: lang/json/snippet_from_json.py -msgid "\"BOSTON IS FUNGUS DON'T GO THERE\"" -msgstr "" - #: lang/json/snippet_from_json.py msgid "" "\"big z threw me on top of the building, legs broken but at least im safe " @@ -127907,12 +129685,6 @@ msgid "" "ceramics, sheets, strings, and more\"" msgstr "" -#: lang/json/snippet_from_json.py -msgid "" -"\"there was a giant shell in my backyard for a few weeks. one day a squid " -"guy popped out of it and said his name was steve\"" -msgstr "" - #: lang/json/snippet_from_json.py msgid "\"FUCK FAUX-MUTANTS, BEING 'EXTREMELY THIRSTY' DOES NOT COUNT\"" msgstr "" @@ -127951,17 +129723,6 @@ msgstr "" msgid "\"dont try to leave they will shoot you\"" msgstr "" -#: lang/json/snippet_from_json.py -msgid "" -"\"herbs + salt + cooking oil + coffee powder + ammonia = a meal, right?\"" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "" -"\"HA! YOU THOUGHT I WOULD LEAVE A USEFUL NOTE?! SCREW YOU! GO DIE IN A " -"BLOB PIT!\"" -msgstr "" - #: lang/json/snippet_from_json.py msgid "" "\"I'd like to thank my high-school culinary arts class for teaching me how " @@ -127988,12 +129749,6 @@ msgid "" "giving her the serum, and I saved her life! That's fair, right?\"" msgstr "" -#: lang/json/snippet_from_json.py -msgid "" -"\"what's a resonance cascade? can't be that bad, maybe i'll get some cool " -"l##/###\"" -msgstr "" - #: lang/json/snippet_from_json.py msgid "\"I've never been very confident, is that why my shots keep missing?\"" msgstr "" @@ -128008,6 +129763,10 @@ msgid "" "Hundreds of people, defense, food and shelter... let's go raid it, guys!\"" msgstr "" +#: lang/json/snippet_from_json.py +msgid "\"KASHWAK: NO-FO\"" +msgstr "" + #: lang/json/snippet_from_json.py msgid "" "\"The whispering fog is taking me in like a blanket. I'm warm now. I'm " @@ -128055,10 +129814,6 @@ msgid "" "that\"" msgstr "" -#: lang/json/snippet_from_json.py -msgid "\"Wow, this sinkhole is really comfortable!\"" -msgstr "" - #: lang/json/snippet_from_json.py msgid "\"DOG NOT REAL DOG\"" msgstr "" @@ -128089,10 +129844,6 @@ msgid "" "shell.\"" msgstr "" -#: lang/json/snippet_from_json.py -msgid "\"Wow, I haven't had to piss in weeks!\"" -msgstr "" - #: lang/json/snippet_from_json.py msgid "\"MY GLITTERING SNAKE COMPELS YOU! OBEY!\"" msgstr "" @@ -128138,12 +129889,6 @@ msgid "" "SOURCE) that it was NOT the scientists' fault.\"" msgstr "" -#: lang/json/snippet_from_json.py -msgid "" -"\"traveled with a few friends after the thing started. mostly stuck to bike " -"paths and eaten fruit and mushroomdhfhghghhhh\"" -msgstr "" - #: lang/json/snippet_from_json.py msgid "" "\"We're the eagle-eyes in the sky! Just two mutant avians in our " @@ -128151,13 +129896,6 @@ msgid "" "\"" msgstr "" -#: lang/json/snippet_from_json.py -msgid "" -"\"My friend was getting eaten. Started ranting about how he had 70 HP on " -"his head, and that the zombie shouldn't penetrate his armor... poor guy. " -"Bad die roll, I guess.\"" -msgstr "" - #: lang/json/snippet_from_json.py msgid "\"WE'RE GOING TO SAIL TO CANADA, BITCHES!\"" msgstr "" @@ -128186,12 +129924,6 @@ msgid "" "forgnottedn ples dont forntget me y nrmmy name is h@@hbhbh\"" msgstr "" -#: lang/json/snippet_from_json.py -msgid "" -"\"It wasn't Russia or China, guys. It was me. This whole apocalypse is my " -"fault. You can just call me... Darkling.\"" -msgstr "" - #: lang/json/snippet_from_json.py msgid "\"all it takes to seal a wound is a sawblade and a match! trust me\"" msgstr "" @@ -128208,8 +129940,14 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "" -"\"Got my legs dissected. It's OK, at least I have my dog! Her legs were " -"also dissected, but that's OK, we're gonna be OK...\"" +"\"WBLF 970 went off-air three days ago. There's nobody left on the radio. " +"Might as well throw this thing away...\"" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"\"I've heard it's safer across the Mississippi. Going to start driving " +"today. If you're reading this, pray for me\"" msgstr "" #: lang/json/snippet_from_json.py @@ -128269,10 +130007,6 @@ msgid "" "the fields, running with my wings buzzing, and more.\"" msgstr "" -#: lang/json/snippet_from_json.py -msgid "\"lotta dead mothers\"" -msgstr "" - #: lang/json/snippet_from_json.py msgid "\"FLAMING SWORD HUMANE. CAUTERIZES WOUNDS. SURGICAL.\"" msgstr "" @@ -128305,7 +130039,10 @@ msgid "" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"I am nothing without my supertank and storage megastructure.\"" +msgid "" +"\"This has to be China's fault. Seriously, why is nobody suspecting the " +"people we're having a cold war with! This is an invasion! These aren't " +"zombies, it's just camoflauge! WAKE UP, SHEEPLE!\"" msgstr "" #: lang/json/snippet_from_json.py @@ -128327,12 +130064,6 @@ msgid "" "approached.\"" msgstr "" -#: lang/json/snippet_from_json.py -msgid "" -"\"I hope I don't leave this note in a pawn shop, bank vault, or library... " -"'cus that would mean I'm dead.\"" -msgstr "" - #: lang/json/snippet_from_json.py msgid "\"ENGLAND DID THIS\"" msgstr "" @@ -128369,12 +130100,6 @@ msgid "" "Several thousand! I'm planning way ahead.\"" msgstr "" -#: lang/json/snippet_from_json.py -msgid "" -"\"We're the eagle-eyes in the sky! We're gonna fly our bird 'copter! " -"Northward! And bomb the military checkpoint! Wish us luck!\"" -msgstr "" - #: lang/json/snippet_from_json.py msgid "" "\"Heard recently of some radio op who lives in a skyscraper, announcing " @@ -128407,16 +130132,6 @@ msgid "" "pyroteknik I heear!\"" msgstr "" -#: lang/json/snippet_from_json.py -msgid "" -"\"Christian, but have no bible-- the Flying Spaghetti Monster is my god " -"now. For morale's sake...\"" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "\"THE GRANADE DEBUGGED MY SPIDER FRIEND WHERE IS SHE\"" -msgstr "" - #: lang/json/snippet_from_json.py msgid "" "\"Got my mortar and pestle. Now if I could just find some avocados...\"" @@ -128516,47 +130231,59 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "" -"LABS BOMBED: In further invasion proof (discounting earlier suggestion of a " -"riot drug) most of New England's scientific labs were bombed simultaneously " -"yesterday. No word yet from the military about who the aggressors are." +"\"Don't mix powders, them books said. Do Not Mix powders. Didn't listen " +"did I. Blew my goddamn pinky off, near lost my right eye.\"" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"\"followed what toby wrote down. shells looked like theyd hold more, I put " +"in some more. traded most to h raiders for crank. shot my 38 today and it " +"fuckn exploded. low on crank, good as dead, no gun, no toby. headed to " +"montreal real sorry bout the bullets\"" msgstr "" #: lang/json/snippet_from_json.py msgid "" -"CHINA INVADES?: Communications were muddled by a large influx of aggressive " -"armed individuals. \"We have this,\" says a local Police Chief. \"We are " -"authorizing our robotic security drones to use lethal force on combative " -"humans.\"" +"LABS BOMBED: In an apparent foreign attack (contradicting earlier Department " +"of Defense denials of the disaster being caused by Chinese aggression) most " +"of New England's scientific labs were bombed simultaneously yesterday. A " +"statement from the Pentagon has been issued, stating the strikes were the " +"result of Chinese opportunism during the national crisis, and assured that " +"action would be taken in kind against the aggressors." msgstr "" #: lang/json/snippet_from_json.py msgid "" -"INVADERS NOT HUMAN?: An earlier command by the Police Chief has backfired. " -"\"The invaders don't register as human. The securibots turned on us when we " -"tried to fight them. We don't have enough people left to reprogram them.\"" +"RIOTS GROWING?: Communications were muddled by a large influx of aggressive " +"armed individuals. \"We have this under control,\" says a local police " +"chief. \"We are authorizing our robotic security drones to use lethal force " +"on combative humans.\"" msgstr "" #: lang/json/snippet_from_json.py msgid "" -"INVASION IS GM TROOPS: Reports of invasion by as yet unknown soldiers have " -"been confirmed, and this paper has gained first hand footage proving genetic " -"modification, with examples of extreme strength, speed and natural armor." +"RIOTERS NOT HUMAN?: An earlier command by regional police has backfired. " +"\"The hooligans don't register as human.\" says a local police chief. \"The " +"securibots turned on us when we tried to fight them. We don't have enough " +"people left to reprogram them.\"" msgstr "" #: lang/json/snippet_from_json.py msgid "" -"INVADERS ARE SUPER SOLDIERS: Further proof of mutation, in addition to " -"strength, speed & toughness, we now have reports of foreign enemies who are " -"somehow firing lightning fields, spitting acid and reports of soldiers " -"hidden in mobile clouds of smoke." +"GENETIC MODIFICATIONS?: Eyewitnesses from the New England Disaster Area have " +"claimed that the infected are displaying inhuman qualities. \"I swear to " +"God, one of them was the size of a tree!\", said one panicked survivor. " +"There are also reports of infected with acidic and/or electric properties." msgstr "" #: lang/json/snippet_from_json.py msgid "" -"MILITARY HAS GM TOO - GENERAL: \"We want to reassure the people, these " -"invaders are not the only super-soldiers. Our genemods are more advanced " -"than China's. We were safety-testing, which China obviously skipped " -"disastrously.\"" +"SUPER-SOLDIERS DEPLOYED: General Westinghouse released a statement today " +"that elite troops equipped with top-of-the-line experimental combat bionics " +"have been deployed via helicopter into the New England Disaster Area. " +"\"Through the strength of American technology and American soldiers, we will " +"fix this disaster!\"" msgstr "" #: lang/json/snippet_from_json.py @@ -128571,38 +130298,38 @@ msgstr "" msgid "" "PUBLIC SERVICE ANNOUNCEMENT: \"New England Cut Off\". New England has been " "quarantined for the safety of the rest of the USA. No rescue attempts will " -"be funded, it is assumed there are no survivors in the area." +"be funded; it is assumed there are no survivors in the area." msgstr "" #: lang/json/snippet_from_json.py msgid "" -"LEAVE TO THE EXPERTS -- GENERAL: \"Do not attempt to deal with invaders " +"LEAVE TO THE EXPERTS -- GENERAL: \"Do not attempt to deal with infected " "yourself, our troops have the technology and the training for military " -"action. Loud gunfire may attract more enemy attention than you have ammo!\"" +"action. Loud gunfire may attract more hostile attention than you have ammo!" +"\"" msgstr "" #: lang/json/snippet_from_json.py msgid "" "TOWNS OCCUPIED TERRITORY: FEMA officials said today \"Do not try to defend " -"your property in towns: invaders use advanced tracking, perhaps scent. " +"your property in towns: hostiles use advanced tracking, perhaps scent. " "Please retreat to your nearest evacuation center outside town and await " "extraction.\"" msgstr "" #: lang/json/snippet_from_json.py msgid "" -"PUBLIC SERVICE ANNOUNCEMENT: \"Beware Acid Rain\". Several caustic " -"chemicals in the air react with rain clouds to cause deadly acid rain. No " -"word yet on if this is a deliberate tactic or a side effect of the earlier " -"bombings." +"EDITOR SAYS \"DESTROY THE DEAD\". Recognizable dead left lying in the " +"street may be dangerous! If you kill a hostile, smash or butcher with a " +"knife until unrecognizable! The Geneva Conventions don't apply to civilians!" msgstr "" #: lang/json/snippet_from_json.py msgid "" -"EDITOR SAYS \"DESTROY THE DEAD\". Recognizable enemy dead left lying in the " -"street may give away militia positions! If you kill an enemy combatant, " -"smash or butcher with a knife until unrecognizable! Screw Geneva! Protect " -"our troops!" +"THEY'RE NOT RIOTS!: According to head officials at the Centers for Disease " +"Control, autopsies of rioters in New England have shown massive pathological " +"infection, possibly causing hyper-aggression, disregard for personal harm, " +"and a severely-impaired ability for higher reasoning." msgstr "" #: lang/json/snippet_from_json.py @@ -128624,18 +130351,10 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "" -"QUANTUM LEAP: An undisclosed project has yielded results in the form of " -"theoretical teleportation. \"This is just the tip of the iceberg,\" said a " -"source. \"I can't disclose, but this development is the LEAST in this " -"exciting vein!\"" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "" -"HE WILL BLOW YOUR WORLD: Scientist Kevin Granade reveals potential \"Reality " -"Grenade\", loosely related to teleport-tech. He claims could be used to " -"weaken enemies or improve our own troops. \"We're still in Alpha testing,\" " -"says Kevin, \"It really needs a Bugfix\"." +"QUANTUM LEAP: An undisclosed DARPA project has yielded results in the form " +"of theoretical teleportation. \"This is just the tip of the iceberg,\" said " +"an anonymous source. \"I can't disclose, but this development is the LEAST " +"in this exciting vein!\"" msgstr "" #: lang/json/snippet_from_json.py @@ -128663,16 +130382,16 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "" "US IGNORES UN DEMANDS: The US ambassador to the UN today turned down UN " -"requests to begin nuclear disarmament by China, the US and North Korea. " -"\"We have a right to defend ourselves,\" insisted the ambassador. \"We'll " -"back down when they do\"." +"requests to begin mutual nuclear disarmament of China, the US and North " +"Korea. \"We have a right to defend ourselves,\" insisted the ambassador. " +"\"We'll back down when they do\"." msgstr "" #: lang/json/snippet_from_json.py msgid "" "A WHOLE NEW YOU! Augment your world with CBMs! This ad features a man " -"covered in solar panels with a miniature flashlight in the middle of his " -"head." +"covered in glowing tattoos with a miniature flashlight in the middle of his " +"head. He's waving at the reader; all of his fingertips are Allen wrenches." msgstr "" #: lang/json/snippet_from_json.py @@ -128691,8 +130410,8 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "" -"POPULAR MECHANICS: People say mechanics is boring. We say, Prove them " -"Wrong! We've got all the articles that make it interesting to talk about, " +"POPULAR MECHANICS: People say mechanics is boring. We say, prove them " +"wrong! We've got all the articles that make it interesting to talk about, " "so you can \"Make Mechanics Popular\"!" msgstr "" @@ -128705,17 +130424,17 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "" -"UNDERGROUND BUNKER? Sources in the government suggest that an underground " -"bunker is being built in a secret location in case of enemy attack. We were " -"unable to get the exact location as our sources mysteriously disappeared " -"shortly after revealing this information." +"UNDERGROUND BUNKER? Sources in the government suggest that underground " +"bunkers are being built in a secret location in case of enemy attack. We " +"were unable to get the exact location as our sources mysteriously " +"disappeared shortly after revealing this information." msgstr "" #: lang/json/snippet_from_json.py msgid "" "STUDENT MISSING: A high school student vanished yesterday evening in the " "forest near Wayland. The 17-year-old international student from China (who " -"adopted the anglicized nickname \"Brett\" due to Americans' difficulty " +"adopted the anglicized nickname \"Brett\" due to his classmates' difficulty " "pronouncing his given name) was last seen with his friends in the camp. " "\"Brett said that he was gonna get some firewood but he never came back,\" " "said his classmate, Jianxiang Wang. The search is underway." @@ -128733,20 +130452,11 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "" -"RUMORS DENIED: Allegations that the military had been conducting " -"teleportation experiments in secret just outside Wayland were put to rest " -"during a press conference earlier today. \"I have to clarify that not only " -"have we never done such research,\" said the officer on the press " -"conference, \"teleportation only exists in sci-fi films.\"" -msgstr "" - -#: lang/json/snippet_from_json.py -msgid "" -"GRANADE SEEKS FUNDING FOR GRANADE: This paper has been investigating rumors " -"disgraced former scientist Kevin Granade seeks public funding for so-called " -"reality-warping weapon \"the Granade\", which \"[...]works by patching " -"reality\". Apparently it will be crowdsourced via Kickstarter as \"Project " -"Cataclysm\" " +"RUMORS DENIED: Allegations that DARPA had been conducting teleportation " +"experiments in secret just outside Wayland were put to rest during a press " +"conference earlier today. \"I have to clarify that not only have we never " +"done such research,\" said the officer on the press conference, " +"\"teleportation only exists in sci-fi films.\"" msgstr "" #: lang/json/snippet_from_json.py @@ -128812,8 +130522,8 @@ msgstr "" msgid "" "TECHWORLD NEWS: Toy company at the origin of the successful talking doll " "rebrands and becomes Uncanny. Uncanny plans to bring their expertise to the " -"field of androids. Unconfirmed rumors suggest that Uncanny already got a " -"pretty big command from the government." +"field of androids. Unconfirmed rumors suggest that Uncanny has already " +"recieved large orders from the government." msgstr "" #: lang/json/snippet_from_json.py @@ -128826,8 +130536,10 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "" "MUTANT COLD: A new cold virus has emerged in the New England area. \"There " -"don't appear to be complications, but many sufferers are developing large " -"amounts of benign tumorous tissue, A pound or more,\" said a doctor" +"don't appear to be complications, but many sufferers are dealing with sudden " +"muscle weakness and a greater-than-normal amount of lethargy from this virus," +"\" said a doctor. \"In addition, it's been documented to last up to ten days." +"\"" msgstr "" #: lang/json/snippet_from_json.py @@ -128841,8 +130553,8 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "" "SPACE TELEPORTATION - TRUTH OR FICTION? Scientists addressed a growing " -"conspiracy theory today \"The plutonium consumed is massive. We cannot use " -"teleportation to reach aliens, unless they live on some kind of parallel " +"conspiracy theory today \"The plutonium consumed is massive. We could never " +"use teleportation to reach aliens, unless they live on some kind of parallel " "world.\"" msgstr "" @@ -128856,10 +130568,10 @@ msgstr "" #: lang/json/snippet_from_json.py #, no-python-format msgid "" -"DRUG USE ON THE RISE: Recent statistic suggest drug use has climbed more " -"than 40% in the last two years. \"People are scared for their jobs, their " -"country, even their life... of course some will turn to drugs,\" said an " -"expert." +"DRUG USE ON THE RISE: Recent statistic suggest drug use in New England has " +"climbed more than 20% in the last two years. \"People are scared for their " +"jobs, their country, even their life... of course some will turn to drugs," +"\" said an expert." msgstr "" #: lang/json/snippet_from_json.py @@ -128886,10 +130598,20 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "" -"SUPPORT THE COUNTRY THAT SUPPORTS YOU - PRESIDENT: Unexpectedly and " -"unpopularly, the president today instituted a peacetime draft in response to " -"China massing troops. \"We must pray for the best while preparing for the " -"worst.\"" +"NEW LAB OPENS: The H.R. Bennett Research Facility has been officially opened " +"by the Department of Energy. According to Deputy Secretary of Energy Randall " +"Balakrishnan , \"This facility is one of the most state-of-the-art in the " +"world. With the opening of the H.R. Bennett research complex, New England's " +"future is looking brighter than ever.\"" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"SUPPORT THE COUNTRIES THAT SUPPORT YOURS - PRESIDENT: Unexpectedly and " +"unpopularly, the president today suggested the possible institution of a " +"peacetime draft in response to increasing Chinese aggression towards Taiwan " +"and the Philippines. \"We must pray for the best while preparing for the " +"worst. We cannot abandon key allies in the face of Chinese bullying.\"" msgstr "" #: lang/json/snippet_from_json.py @@ -128918,8 +130640,9 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "" "TIME TRAVEL: TRUTH OR FICTION? Leaked federal documents describe the " -"formation of a new federal agency XEDRA, to oversee \"4th Axis technology\" " -"already in use. Expert opinion suggests time-travel or parallel worlds." +"formation of a new federal agency called XEDRA, to oversee \"4th Axis " +"technology\" already in use. Our expert's opinion suggests time-travel or " +"parallel worlds. The meaning of the acronym is currently unknown." msgstr "" #: lang/json/snippet_from_json.py @@ -128939,33 +130662,34 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "" -"BEWARE UNDEAD PROPAGANDA: Stories about the dead \"rising\" may abet the " -"enemy, a general said today. \"These stories have been tracked to communist " -"sources tied in with the presumably Chinese invasion.\"" +"MYTH DEBUNKED: DEAD ARE STAYING DEAD: Stories about the dead rising \"are " +"completely unfounded.\", a general said today. \"It's an obvious hoax by " +"people just looking for five minutes of fame, or to scare people in these " +"uncertain times. After all, remember the clown thing a few years ago?\"" msgstr "" #: lang/json/snippet_from_json.py msgid "" "GENERAL SAYS AVOID BUNKERS: Do not attempt to flee to your nearest military " -"bunker! Understaffed bunkers are defended by turrets, which shoot those " -"without proper registration. Please seek military personnel if you need " -"access." +"bunker! Understaffed bunkers are defended by turrets, which will shoot " +"those without proper registration. Please seek military personnel if you " +"need access." msgstr "" #: lang/json/snippet_from_json.py msgid "" -"RIOTS CAUSED BY \"NEW DRUG\": Rumors of riots were quelled today. \"These " -"are isolated incidents\" said a local police chief. \"The violence is " -"random and senseless, our current theory is a street drug gone terribly wrong" -"\"" +"VIOLENCE OUTBREAKS CAUSED BY \"NEW DRUG\": Rumors of riots were quelled " +"today. \"These are isolated incidents\" said a local police chief. \"The " +"violence is random and senseless, our current theory is contamination in a " +"new street drug.\"" msgstr "" #: lang/json/snippet_from_json.py msgid "" -"ZOMBIE DRUG: TRUTH OR FICTION? A blogger suggests recent riots are a " -"chemical attack by China. \"They are jealous of our cybernetic superiority, " -"they teamed up with Haiti to put hoodoo drugs in the water making people " -"zombies.\"" +"ZOMBIE DRUG? A controversial blogger suggested the recent riots are a " +"chemical attack by China in her latest podcast. \"They're jealous of our " +"cybernetic superiority, so they teamed up with Haiti to put hoodoo drugs in " +"the water making people zombies!\"" msgstr "" #: lang/json/snippet_from_json.py @@ -129422,17 +131146,6 @@ msgid "" "transfer no further than 30 meters." msgstr "" -#: lang/json/snippet_from_json.py -msgid "" -"Dr. Heisenstein told us today that director of teleportation department put " -"our competitors - he couldn't exactly remember their names, something like " -"\"Hole Science\" and something related to black mountains - as an example. " -"He said we have reliable information that they both have working " -"teleportation devices, and that they are much more advanced than ours. We " -"should continue our teleportation research no matter the cost if we don't " -"want to be fired." -msgstr "" - #: lang/json/snippet_from_json.py msgid "" "I don't know how it happened, but a janitor managed to activate the portal " @@ -129452,10 +131165,10 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "" -"An incident occurred in the teleportation lab, wherein a subject managed to " -"teleport into another subject. The latter was completely destroyed from the " -"inside out, while the former sustained little damage. I would like to " -"explore the phenomenon further, but subjects are expensive." +"An incident occurred in the secondary teleportation lab, wherein a subject " +"managed to teleport into another subject. The latter was completely " +"destroyed from the inside out, while the former sustained little damage. I " +"would like to explore the phenomenon further, but subjects are expensive." msgstr "" #: lang/json/snippet_from_json.py @@ -129959,17 +131672,6 @@ msgid "" "have food and water for at least one week. Repeat. Seek immediate shelter." msgstr "" -#: lang/json/snippet_from_json.py -msgid "" -"Hello American patriots! This is the national guard, calling you to use " -"your God-Given second amendment rights and buy a firearm! It is obvious " -"that the Chinese, a scourge upon the face of the earth and the stopper of " -"freedom and prosperity, are in a state of aggression. Therefore, we suggest " -"that with the new gun laws introduced, YOU must help in the defense of this " -"bastion of freedom and prosperity. Go to your local gun store and prepare " -"to defend yourself against the red scourge in every way you can!" -msgstr "" - #: lang/json/snippet_from_json.py msgid "" "zzzzchzzzzchurzzz Are you tired of always losing your dumpy old sunglasses? " @@ -130386,6 +132088,10 @@ msgstr "" msgid "STILL ALIVE. for now." msgstr "" +#: lang/json/snippet_from_json.py +msgid "man" +msgstr "" + #: lang/json/snippet_from_json.py msgid "kiddo" msgstr "" @@ -130406,10 +132112,6 @@ msgstr "" msgid "junior" msgstr "" -#: lang/json/snippet_from_json.py -msgid "chum" -msgstr "" - #: lang/json/snippet_from_json.py msgid "hombre" msgstr "" @@ -130434,10 +132136,6 @@ msgstr "" msgid "chief" msgstr "" -#: lang/json/snippet_from_json.py -msgid "my dude" -msgstr "" - #: lang/json/snippet_from_json.py msgid "" "\"Shoot elfy mutants. Carve more bolts outta their bones. Rinse and repeat." @@ -133806,11 +135504,11 @@ msgid "Go back to sleep." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "What is it, friend?" +msgid " *pshhhttt* I'm reading you boss, over." msgstr "" #: lang/json/talk_topic_from_json.py -msgid " *pshhhttt* I'm reading you boss, over." +msgid "What is it, friend?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -133849,6 +135547,14 @@ msgstr "" msgid "Miscellaneous rules..." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "Mount up!." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Dismount, please." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "I'm going to go my own way for a while." msgstr "" @@ -133907,7 +135613,7 @@ msgstr "" #: src/iuse_actor.cpp #: src/monexamine.cpp src/pickup.cpp #: src/player.cpp -#: src/veh_interact.cpp +#: src/veh_interact.cpp src/vehicle_use.cpp msgid "Never mind." msgstr "" @@ -134076,20 +135782,35 @@ msgid "Please sort out some of these items nearby." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "" -"Please work on any unfinished construction task that you know how to finish." +msgid "Please do any construction work that you can." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Please work on any contruction blueprint zones nearby." +msgid "Please start deconstructing any vehicles in a deconstruction zone." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "*pssshht* ten-four, I'll make my way there, over." +msgid "Please chop logs into planks." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Affirmative." +msgid "Please butcher any corpses that you can." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Please chop any trees in the designated areas." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Please go catch some fish." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Please do some farming work." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "*pssshht* ten-four, I'll make my way there, over." msgstr "" #: lang/json/talk_topic_from_json.py @@ -134129,14 +135850,14 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"OK, let's take a moment, oh, and thanks for helping me with that thing, " -"so... what's up?" +"Definitely, by the way, thanks for helping me so much with my tasks! " +"Anyway, you coping OK, ? " msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Definitely, by the way, thanks for helping me so much with my tasks! " -"Anyway, you coping OK, ? " +"OK, let's take a moment, oh, and thanks for helping me with that thing, " +"so... what's up?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -134212,11 +135933,11 @@ msgid "Keep your distance!" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "This is my territory, ." +msgid "" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "" +msgid "This is my territory, ." msgstr "" #: lang/json/talk_topic_from_json.py @@ -134272,27 +135993,27 @@ msgid "I don't care." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I have other jobs for you. Want to hear about them?" +msgid "I don't have any jobs for you." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I have more jobs for you. Want to hear about them?" +msgid "I don't have any more jobs for you." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I just have one job for you. Want to hear about it?" +msgid "I have other jobs for you. Want to hear about them?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I have another job for you. Want to hear about it?" +msgid "I have more jobs for you. Want to hear about them?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I don't have any more jobs for you." +msgid "I have another job for you. Want to hear about it?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I don't have any jobs for you." +msgid "I just have one job for you. Want to hear about it?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -134305,7 +136026,7 @@ msgid "Never mind, I'm not interested." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "What about it?" +msgid "You're not working on anything for me now." msgstr "" #: lang/json/talk_topic_from_json.py @@ -134313,7 +136034,7 @@ msgid "Which job?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "You're not working on anything for me now." +msgid "What about it?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -134438,6 +136159,14 @@ msgstr "" msgid "Glad to help. I need no payment. Bye!" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "Glad to help." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Glad to help. Bye!" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Well, um, sorry." msgstr "" @@ -134512,10 +136241,6 @@ msgstr "" msgid "Hmm, okay." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "Focus on the road, mate!" -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "I must focus on the road!" msgstr "" @@ -134540,6 +136265,10 @@ msgstr "" msgid "I have some reason for not telling you." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "Focus on the road, mate!" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Ah, okay." msgstr "" @@ -134600,10 +136329,6 @@ msgstr "" msgid "What is it?" msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "How much further?" -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "I'd like to lead for a while." msgstr "" @@ -134652,10 +136377,6 @@ msgstr "" msgid "On second thought, never mind." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "I can't train you properly while you're operating a vehicle!" -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "I can't train you properly while I'm operating a vehicle!" msgstr "" @@ -134668,6 +136389,10 @@ msgstr "" msgid "I have some reason for denying you training." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "I can't train you properly while you're operating a vehicle!" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Not a bloody chance, I'm going to get left behind!" msgstr "" @@ -135673,6 +137398,70 @@ msgstr "" msgid "This is a npc_has_var, npc_remove_var test response." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "This is a u_adjust_var test response that increments by 1." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "This is a u_adjust_var test response that decrements by 1." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "This is a npc_adjust_var test response that increments by 1." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "This is a npc_adjust_var test response that decrements by 1." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "This is a u_compare_var test response for == 0." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "This is a u_compare_var test response for != 0." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "This is a u_compare_var test response for <= 0." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "This is a u_compare_var test response for >= 0." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "This is a u_compare_var test response for < 0." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "This is a u_compare_var test response for > 0." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "This is a npc_compare_var test response for == 0." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "This is a npc_compare_var test response for != 0." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "This is a npc_compare_var test response for <= 0." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "This is a npc_compare_var test response for >= 0." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "This is a npc_compare_var test response for < 0." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "This is a npc_compare_var test response for > 0." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "This is a u_has_bionics bio_ads test response." msgstr "" @@ -138692,6 +140481,36 @@ msgstr "" msgid "What were you saying before that?" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "Hey, ." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I can't believe my eyes. Please get my outta here..." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I've come to take you home, lets go." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Hey buddy, feel like talking about what you saw in that tower?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I'd better get going." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Yeah, I think we need to talk about it, but I'm not ready yet. Let me " +"reclaim my life for a while. " +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Sounds good, Barry." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "I see that badge, I think you need ot keep on walking, straight off this " @@ -138718,10 +140537,6 @@ msgstr "" msgid "Hi, Jack and Claire suggested I come talk to you about a job." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "I'd better get going." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "" "It is coming together. I want to make our own tools, repair our items and " @@ -138733,14 +140548,25 @@ msgid "What do you need?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I heard about Barry, can you tell me what killed him?" +msgid "I heard about Barry, can you tell me what captured him?" msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "It was pink and really fast, it had lots of limbs, definitly not human. It " -"easily kept up with us when we tried to escape, horrifying stuff. We burned " -"the corpse to be safe." +"easily kept up with us when we tried to escape, horrifying stuff. Barry " +"just dropped to the ground, and the thing swept him away." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You all just gonna leave him out there to his fate?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"We tracked it for a while, but lost the trail. Right now we don't have the " +"resources to try to rescue him. Chris has been trying to pick up the trail " +"again and figure out a rescue plan." msgstr "" #: lang/json/talk_topic_from_json.py @@ -138781,13 +140607,15 @@ msgid "Hi, what's up?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Hi, Your dad asked me to come find you." +msgid "" +"Hi, Your dad asked me to come find you, said you've been looking for your " +"Uncle." msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "I was talking to Luke earlier, said you had some interesting ideas about the " -"world ending." +"world ending. Is it tied to Barry's abduction?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -138805,6 +140633,12 @@ msgstr "" msgid "What sort of changes have you seen?" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"I was talking to Luke earlier, said you had some interesting ideas about the " +"world ending." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "My family is convinced that if we stay here, we'll be able to weather this " @@ -138815,10 +140649,10 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"In one of my longer trips I saw something out in a field, I didn't get close " -"but I swear unbelievable monsters were coming out of it. It kinda " -"shimmered, almost like it wasn't quite there. I followed the monsters for a " -"while..." +"In one of my longer trips looking for Barry, I saw something out in a field. " +"I didn't get close but I swear unbelievable monsters were coming out of it. " +"It kinda shimmered, almost like it wasn't quite there. I've been tracking " +"those monsters for a while..." msgstr "" #: lang/json/talk_topic_from_json.py @@ -138827,22 +140661,16 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"They made their way to this weird structure, I've never seen anything like " -"it, it glistened in the sun like something organic..." -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "If you join up with me, we can go check it out." +"They made their way to this weird spire like structure, I've never seen " +"anything like it, it glistened in the sun like something organic. I think " +"they could be holding Barry there, I've seen them arrive and leave with " +"other humans." msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Yeah, I'll join with you, I hope we can come back and check on my family " -"some occasionally. Getting some information is more important now though." -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "What is this place we are going to?" +"If you join up with me, we can go check it out, I want to see what they are " +"doing." msgstr "" #: lang/json/talk_topic_from_json.py @@ -138858,7 +140686,8 @@ msgid "You should leave before my family sees you." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Your dad asked me to come find you." +msgid "" +"Your dad asked me to come find you, said you've been looking for your Uncle." msgstr "" #: lang/json/talk_topic_from_json.py @@ -139022,8 +140851,8 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "Barry and Carlos went to hunt down something that killed our livestock, they " -"tracked it into the forest. It tore Barry apart, Carlos might be willing to " -"tell you the story, he survived it." +"tracked it into the forest. It grabbed Barry and ran off, Carlos might be " +"willing to tell you the story, he managed to allude it." msgstr "" #: lang/json/talk_topic_from_json.py @@ -139148,8 +140977,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "Eddie's dairy is at the end of the road. It's just him and his son since " -"Barry died to that thing in the woods, we tracked it down and burned the " -"corpse." +"Barry was taken by that thing in the woods." msgstr "" #: lang/json/talk_topic_from_json.py @@ -139212,10 +141040,9 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"We can't wait for someone else to fix things, we need to take care of " -"ourselves. Horses make good all around companions. They can get places " -"that cars can't and also help when all the engines fail. They become very " -"trusting if you feed them some nice fodder." +"Horses make good all around companions. They can get places that cars can't " +"and also help when all the engines fail. They become very trusting if you " +"feed them some nice fodder." msgstr "" #: lang/json/talk_topic_from_json.py @@ -139359,7 +141186,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Things have been tough for my dad since the hunting incident. He works till " +"Things have been tough for my dad since Barry was captured. He works till " "he falls asleep most nights.." msgstr "" @@ -139800,7 +141627,7 @@ msgid "All right! Let's get going." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Have I told you about cardboard, friend? Do you have any?" +msgid "We've done it! We've solved the list!" msgstr "" #: lang/json/talk_topic_from_json.py @@ -139809,7 +141636,7 @@ msgid "" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "We've done it! We've solved the list!" +msgid "Have I told you about cardboard, friend? Do you have any?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -144302,10 +146129,6 @@ msgstr "" msgid "I'll talk to him then..." msgstr "" -#: lang/json/talk_topic_from_json.py -msgid "Howdy." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "" "I was among one of the first groups of immigrants sent here to fortify the " @@ -145314,13 +147137,13 @@ msgid " feints at %s." msgstr "" #: lang/json/technique_from_json.py -#: lang/json/technique_from_json.py src/monattack.cpp +#: src/monattack.cpp #, c-format, python-format msgid "The %s tries to grab you, but you break its grab!" msgstr "" #: lang/json/technique_from_json.py -#: lang/json/technique_from_json.py src/monattack.cpp +#: src/monattack.cpp #, c-format, python-format msgid "The %s tries to grab , but they break its grab!" msgstr "" @@ -145928,31 +147751,201 @@ msgid " swings down hard and executes %s" msgstr "" #: lang/json/technique_from_json.py -msgid "quick punch" +msgid "Throw" msgstr "" #: lang/json/technique_from_json.py #, python-format -msgid "You quickly punch %s" +msgid "You throw %s to the ground" msgstr "" #: lang/json/technique_from_json.py #, python-format -msgid " quickly punches %s" +msgid " throws %s to the ground" msgstr "" #: lang/json/technique_from_json.py -msgid "karate chop" +msgid "Disarming Throw" msgstr "" #: lang/json/technique_from_json.py #, python-format -msgid "You karate chop %s" +msgid "You disarm and throw %s" msgstr "" #: lang/json/technique_from_json.py #, python-format -msgid " karate chops %s" +msgid " disarms and throws %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Back Throw" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You flip %s head over heels" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " flips %s head over heels" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab you, but you break their feeble grapple!" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab , but they break its feeble grapple!" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Counter Throw" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You evade and toss %s to the ground" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " evades and tosses %s to the ground" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Karate Counter" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You counterattack %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " counterattacks %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Knifehand Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You hit %s with a knifehand strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " hits %s with a knifehand strike" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Backfist Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You quickly strike %s with the back of your fist" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " quickly strikes %s with the back of their fist" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Roundhouse Kick" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You roundhouse kick %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " roundhouse kicks %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You jab at %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " jabs at %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Cheapshot" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You hit %s where it hurts" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " hits %s with a cheapshot" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Takedown" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You force %s to the ground" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " forces %s to the ground" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Bone Breaker" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "*CRACK!* You brutally maim %s's arm" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "*CRACK!* brutally maims %s's arm" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab you, but you wrestle free!" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab , but they wrestle free!" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Counter" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You block and counter %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " blocks and counters %s" msgstr "" #: lang/json/technique_from_json.py @@ -146029,10 +148022,6 @@ msgstr "" msgid " puts %s in a chokehold" msgstr "" -#: lang/json/technique_from_json.py -msgid "grab" -msgstr "" - #: lang/json/technique_from_json.py #, python-format msgid "You disarm %s" @@ -146095,25 +148084,6 @@ msgstr "" msgid " flying knees %s" msgstr "" -#: lang/json/technique_from_json.py -msgid "feint at" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You feint at %s" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You jab %s" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid " jabs %s" -msgstr "" - #: lang/json/technique_from_json.py msgid "surprise attack" msgstr "" @@ -146417,6 +148387,15 @@ msgstr "" msgid " strikes %s's weaknesses" msgstr "" +#: lang/json/technique_from_json.py +msgid "feint at" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You feint at %s" +msgstr "" + #: lang/json/technique_from_json.py msgid "slow strike" msgstr "" @@ -146647,7 +148626,7 @@ msgstr "" #: lang/json/technique_from_json.py #, python-format -msgid "You release a blinding slash at %s" +msgid "You release a blindingly fast slash at %s" msgstr "" #: lang/json/technique_from_json.py @@ -146661,12 +148640,12 @@ msgstr "" #: lang/json/technique_from_json.py #, python-format -msgid "You swiftly jab your weapon into %s joints" +msgid "You swiftly jab your weapon at %s" msgstr "" #: lang/json/technique_from_json.py #, python-format -msgid " swiftly jabs their weapon into %s" +msgid " swiftly jabs their weapon at %s" msgstr "" #: lang/json/technique_from_json.py @@ -146675,12 +148654,12 @@ msgstr "" #: lang/json/technique_from_json.py #, python-format -msgid "You steady your hand and release a piercing jab at %s" +msgid "You release a debilitating swipe at %s" msgstr "" #: lang/json/technique_from_json.py #, python-format -msgid " releases a piercing jab at %s" +msgid " releases a debilitating swipe at %s" msgstr "" #: lang/json/technique_from_json.py @@ -146700,12 +148679,12 @@ msgid " lands a piercing blow on %s's face" msgstr "" #: lang/json/technique_from_json.py -msgid "Blindside" +msgid "Harsh Reprimand" msgstr "" #: lang/json/technique_from_json.py #, python-format -msgid "You thwap %s's face" +msgid "You clock %s's in a weak spot to knock em down" msgstr "" #: lang/json/technique_from_json.py @@ -146714,7 +148693,7 @@ msgid " smashes in %s's face" msgstr "" #: lang/json/technique_from_json.py -msgid "Unrelenting Smackos" +msgid "Forced Compliance" msgstr "" #: lang/json/technique_from_json.py @@ -146722,6 +148701,11 @@ msgstr "" msgid "You swiftly swipe your weapon's tip at %s" msgstr "" +#: lang/json/technique_from_json.py +#, python-format +msgid " swiftly jabs their weapon into %s" +msgstr "" + #: lang/json/technique_from_json.py msgid "Roomsweeper" msgstr "" @@ -146742,12 +148726,12 @@ msgstr "" #: lang/json/technique_from_json.py #, python-format -msgid "You quickly batter %s" +msgid "You quickly dig your fingers into %s" msgstr "" -#: lang/json/technique_from_json.py src/melee.cpp -#, c-format, python-format -msgid " batters %s" +#: lang/json/technique_from_json.py +#, python-format +msgid " digs their fingers into %s" msgstr "" #: lang/json/technique_from_json.py @@ -146764,10 +148748,34 @@ msgstr "" msgid " swiftly impales their fingers into %s" msgstr "" +#: lang/json/technique_from_json.py +msgid "Joint Pain" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You explosively jab your weapon at %s joints" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " explosively jabs at %s" +msgstr "" + #: lang/json/technique_from_json.py msgid "Rapid Jab" msgstr "" +#: lang/json/technique_from_json.py +#, python-format +msgid "You steady your hand and release a piercing jab at %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " releases a piercing jab at %s" +msgstr "" + #: lang/json/technique_from_json.py msgid "Calculated Pierce" msgstr "" @@ -146775,8 +148783,50 @@ msgstr "" #: lang/json/technique_from_json.py #, python-format msgid "" -"You envision a tempest in your hand and then land a piercing blow on %s's " -"top half" +"You envision a gathering tempest in and then release it's energy on %s's top " +"half" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "HOOK" +msgstr "" + +#. ~ Description for HOOK +#: lang/json/technique_from_json.py +msgid "" +"95% moves, 88% Bash, 66% Cut, 66% Stab, Down two turns, STR (C) greatly " +"reduces action cost" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "Your pistol whip sends %s careening" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " smacks %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Crowd Control" +msgstr "" + +#. ~ Description for Crowd Control +#: lang/json/technique_from_json.py +msgid "" +"60% moves, 50% damage, wide arc, STR (S) dramatically reduces action cost, " +"and adds a (C) damage bonus, min 4 melee" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "Your swing the stock of your weapon at %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " strikes at %s" msgstr "" #: lang/json/technique_from_json.py @@ -146843,10 +148893,6 @@ msgstr "" msgid " chops %s" msgstr "" -#: lang/json/technique_from_json.py -msgid "HOOK" -msgstr "" - #. ~ Description for HOOK #: lang/json/technique_from_json.py msgid "" @@ -146870,6 +148916,11 @@ msgid "" "and adds a (C) damage bonus, min 4 melee" msgstr "" +#: lang/json/technique_from_json.py +#, python-format +msgid "Your momentum causes your weapon to glance off of %s" +msgstr "" + #: lang/json/technique_from_json.py msgid "CHOP" msgstr "" @@ -146877,8 +148928,8 @@ msgstr "" #. ~ Description for CHOP #: lang/json/technique_from_json.py msgid "" -"Crit only, 115% move cost, 105% Bash, 105% Stab, 125% Cut, DEX (D) and PER " -"(E) reduces action cost and increases overall (B) damage, min 2 melee" +"Crit only, 118% move cost, 105% Bash and Stab, 125% Cut, DEX (D) and PER (E) " +"reduces action cost and increases overall (B) damage, min 2 melee" msgstr "" #: lang/json/technique_from_json.py @@ -146925,7 +148976,7 @@ msgstr "" #: lang/json/technique_from_json.py #, python-format -msgid " swings upwards with all their weight %s" +msgid " swings upwards with all their weight at %s" msgstr "" #: lang/json/technique_from_json.py @@ -146956,7 +149007,7 @@ msgstr "" #. ~ Description for SHIELDED SHOVE #: lang/json/technique_from_json.py msgid "" -"65% moves, no cut damage, 110% Bash and Stab damage, knockback 2 tiles, STR " +"75% moves, no cut damage, 110% Bash and Stab damage, knockback 2 tiles, STR " "(B) and DEX (C) reduce action cost, min melee 1" msgstr "" @@ -146996,7 +149047,7 @@ msgstr "" #: lang/json/technique_from_json.py #, python-format -msgid "You lean forward and stab at %s" +msgid "You step forward and stab at %s" msgstr "" #: lang/json/technique_from_json.py @@ -147977,6 +150028,24 @@ msgstr "" msgid "open wooden split rail gate" msgstr "" +#: lang/json/terrain_from_json.py +msgid "metal fence" +msgstr "" + +#. ~ Description for metal fence +#: lang/json/terrain_from_json.py +msgid "A simple metal fence." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "closed metal gate" +msgstr "" + +#. ~ Description for closed metal gate +#: lang/json/terrain_from_json.py +msgid "A closed metal gate." +msgstr "" + #: lang/json/terrain_from_json.py msgid "wooden privacy fence" msgstr "" @@ -149679,6 +151748,28 @@ msgstr "" msgid "Critical failure imminent, self destruct activated. Have a nice day!" msgstr "" +#: lang/json/terrain_from_json.py +msgid "ticket vendor" +msgstr "" + +#. ~ Description for ticket vendor +#: lang/json/terrain_from_json.py +msgid "" +"This machine has a little screen, and slots intended to take your money and " +"provide you with a ticket." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "ticket machine" +msgstr "" + +#. ~ Description for ticket machine +#: lang/json/terrain_from_json.py +msgid "" +"This machine will provide you access to whatever is beyond it - for the " +"price of a ticket, of course." +msgstr "" + #: lang/json/terrain_from_json.py msgid "broken generator" msgstr "" @@ -151707,9 +153798,9 @@ msgstr "" #. ~ Description for stick wall #: lang/json/terrain_from_json.py msgid "" -"A cheap wall of planks and sticks with a log pillar to keep it together. It " -"is capable of supporting an upper level or roof. Dirt and stones make the " -"wall secure. Somewhat flammable." +"A cheap mish mash of planks and sticks with a log pillar that keeps it " +"together. It is capable of supporting an upper level or roof. Dirt and " +"stones make the wall secure. Somewhat flammable." msgstr "" #: lang/json/terrain_from_json.py @@ -152065,10 +154156,26 @@ msgstr "" msgid "mana weaving" msgstr "" +#. ~ Adjective in "You block of the damage with your . +#: lang/json/trap_from_json.py src/advanced_inv.cpp src/magic.cpp +#: src/melee.cpp src/recipe.cpp +msgid "none" +msgstr "" + +#. ~ Trap-vehicle collision message for trap 'bubble wrap' +#: lang/json/trap_from_json.py src/trapfunc.cpp +msgid "Pop!" +msgstr "" + #: lang/json/trap_from_json.py msgid "glass shards" msgstr "" +#. ~ Trap-vehicle collision message for trap 'glass shards' +#: lang/json/trap_from_json.py +msgid "Crunch!" +msgstr "" + #: lang/json/trap_from_json.py msgid "roll mat" msgstr "" @@ -152077,6 +154184,13 @@ msgstr "" msgid "fur roll mat" msgstr "" +#. ~ Trap-vehicle collision message for trap 'bear trap' +#. ~ Trap-vehicle collision message for trap 'buried bear trap' +#: lang/json/trap_from_json.py +#: src/trapfunc.cpp +msgid "SNAP!" +msgstr "" + #: lang/json/trap_from_json.py msgid "buried bear trap" msgstr "" @@ -152097,6 +154211,18 @@ msgstr "" msgid "tripwire" msgstr "" +#. ~ Trap-vehicle collision message for trap 'crossbow trap' +#: lang/json/trap_from_json.py +msgid "Clank!" +msgstr "" + +#. ~ Trap-vehicle collision message for trap 'shotgun trap' +#: lang/json/trap_from_json.py +#: lang/json/trap_from_json.py src/iuse.cpp +#: src/iuse.cpp src/ranged.cpp +msgid "Bang!" +msgstr "" + #: lang/json/trap_from_json.py msgid "spinning blade engine" msgstr "" @@ -152105,6 +154231,11 @@ msgstr "" msgid "spinning blade" msgstr "" +#. ~ Trap-vehicle collision message for trap 'spinning blade' +#: lang/json/trap_from_json.py +msgid "Swinnng!" +msgstr "" + #: lang/json/trap_from_json.py msgid "buried land mine" msgstr "" @@ -152117,6 +154248,12 @@ msgstr "" msgid "dissector" msgstr "" +#. ~ the sound of a dissector dissecting +#. ~ Trap-vehicle collision message for trap 'dissector' +#: lang/json/trap_from_json.py src/trapfunc.cpp +msgid "BRZZZAP!" +msgstr "" + #: lang/json/trap_from_json.py msgid "sinkhole" msgstr "" @@ -153000,6 +155137,52 @@ msgstr "" msgid "mounted fusion gun" msgstr "" +#: lang/json/vehicle_part_from_json.py +msgid "wheel (steerable)" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "racing slick (steerable)" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "armored wheel (steerable)" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "bicycle wheel (steerable)" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "off-road bicycle wheel (steerable)" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "motorbike wheel (steerable)" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "off-road motorbike wheel (steerable)" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "small wheel (steerable)" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "wide wheel (steerable)" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "off-road wide wheel (steerable)" +msgstr "" + +#. ~ Description for metal wheel +#. ~ Description for roller drum +#: lang/json/vehicle_part_from_json.py +msgid "A strong metal wheel." +msgstr "" + #: lang/json/vehicle_part_from_json.py msgid "rebar reinforcement" msgstr "" @@ -153020,7 +155203,6 @@ msgstr "" #. ~ Description for car battery #. ~ Description for storage battery -#. ~ Description for large storage battery #: lang/json/vehicle_part_from_json.py msgid "" "A battery for storing electrical power, and discharging it to power " @@ -153032,9 +155214,10 @@ msgid "motorbike battery, small" msgstr "" #: lang/json/vehicle_part_from_json.py -msgid "swappable storage battery" +msgid "swappable large storage battery" msgstr "" +#. ~ Description for swappable large storage battery #. ~ Description for swappable storage battery #: lang/json/vehicle_part_from_json.py msgid "" @@ -153044,6 +155227,10 @@ msgid "" "so much that a lifting tool of some kind is necessary for most people." msgstr "" +#: lang/json/vehicle_part_from_json.py +msgid "swappable storage battery" +msgstr "" + #: lang/json/vehicle_part_from_json.py msgid "board" msgstr "" @@ -153624,6 +155811,10 @@ msgstr "" msgid "mounted A7 laser rifle" msgstr "" +#: lang/json/vehicle_part_from_json.py +msgid "mounted Cerberus laser cannon" +msgstr "" + #: lang/json/vehicle_part_from_json.py msgid "mounted M249" msgstr "" @@ -154602,10 +156793,34 @@ msgid "" "stand next to a turret mount and 'f'ire the weapon by selecting the tile." msgstr "" -#. ~ Description for metal wheel -#. ~ Description for roller drum #: lang/json/vehicle_part_from_json.py -msgid "A strong metal wheel." +msgid "light wheel mount (steerable)" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "hub assembly" +msgstr "" + +#. ~ Description for hub assembly +#: lang/json/vehicle_part_from_json.py +msgid "" +"Connection where wheels can be connected on. This particular one is fit for " +"normal car wheels." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "hub assembly (steerable)" +msgstr "" + +#. ~ Description for heavy hub assembly +#: lang/json/vehicle_part_from_json.py +msgid "" +"Connection where wheels can be connected on. This particular one is fit for " +"large car wheels." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "heavy hub assembly (steerable)" msgstr "" #. ~ Description for rail wheel @@ -154628,27 +156843,15 @@ msgstr "" msgid "A wheel." msgstr "" -#: lang/json/vehicle_part_from_json.py -msgid "wheel (steerable)" -msgstr "" - #: lang/json/vehicle_part_from_json.py msgid "racing slick" msgstr "" -#: lang/json/vehicle_part_from_json.py -msgid "racing slick (steerable)" -msgstr "" - #. ~ Description for armored wheel #: lang/json/vehicle_part_from_json.py msgid "A very strong, armored metal wheel." msgstr "" -#: lang/json/vehicle_part_from_json.py -msgid "armored wheel (steerable)" -msgstr "" - #. ~ Description for wheelbarrow wheel #. ~ Description for small wheel #. ~ Description for unicycle wheel @@ -154661,14 +156864,6 @@ msgstr "" msgid "A thin bicycle wheel." msgstr "" -#: lang/json/vehicle_part_from_json.py -msgid "bicycle wheel (steerable)" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "off-road bicycle wheel (steerable)" -msgstr "" - #: lang/json/vehicle_part_from_json.py msgid "casters" msgstr "" @@ -154685,18 +156880,6 @@ msgstr "" msgid "A small wheel from a motorcycle." msgstr "" -#: lang/json/vehicle_part_from_json.py -msgid "motorbike wheel (steerable)" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "off-road motorbike wheel (steerable)" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "small wheel (steerable)" -msgstr "" - #: lang/json/vehicle_part_from_json.py msgid "tricycle wheels" msgstr "" @@ -154727,14 +156910,6 @@ msgid "" "A wide wheel that provides more traction and better off-road performance." msgstr "" -#: lang/json/vehicle_part_from_json.py -msgid "wide wheel (steerable)" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "off-road wide wheel (steerable)" -msgstr "" - #. ~ Description for wooden cart wheel #: lang/json/vehicle_part_from_json.py msgid "A wooden wheel." @@ -156536,10 +158711,6 @@ msgid "" "scalpels." msgstr "" -#: src/activity_handlers.cpp -msgid "You need a cutting tool to perform a full butchery." -msgstr "" - #: src/activity_handlers.cpp msgid "" "You need to suspend this corpse to butcher it. While you have a rope to lift " @@ -156933,22 +159104,9 @@ msgstr "" msgid "You finish training %s to level %d." msgstr "" -#. ~ %s is skill name. %d is skill level -#: src/activity_handlers.cpp src/avatar.cpp -#, c-format -msgctxt "memorial_male" -msgid "Reached skill level %1$d in %2$s." -msgstr "" - -#: src/activity_handlers.cpp src/avatar.cpp -#, c-format -msgctxt "memorial_female" -msgid "Reached skill level %1$d in %2$s." -msgstr "" - #: src/activity_handlers.cpp #, c-format -msgid "You finish training %s." +msgid "You get some training in %s." msgstr "" #: src/activity_handlers.cpp @@ -156956,19 +159114,6 @@ msgstr "" msgid "You learn %s." msgstr "" -#. ~ %s is martial art -#: src/activity_handlers.cpp -#, c-format -msgctxt "memorial_male" -msgid "Learned %s." -msgstr "" - -#: src/activity_handlers.cpp -#, c-format -msgctxt "memorial_female" -msgid "Learned %s." -msgstr "" - #: src/activity_handlers.cpp msgid "You've charged the battery completely." msgstr "" @@ -157005,6 +159150,11 @@ msgid_plural "Some of the %s's engines start up." msgstr[0] "" msgstr[1] "" +#: src/activity_handlers.cpp +#, c-format +msgid "The %s is ready for movement." +msgstr "" + #: src/activity_handlers.cpp #, c-format msgid "The %s's engine fails to start." @@ -157303,18 +159453,17 @@ msgid "The operation is a failure." msgstr "" #: src/activity_handlers.cpp -#, c-format -msgid "%s did not find an unfinished construction at the activity spot." +msgid "You finish churning up the earth here." msgstr "" #: src/activity_handlers.cpp #, c-format -msgid "%s can't work on this construction anymore." +msgid "%s did not find an unfinished construction at the activity spot." msgstr "" #: src/activity_handlers.cpp #, c-format -msgid "%s can't reach the source tile to construct" +msgid "%s can't work on this construction anymore." msgstr "" #: src/activity_handlers.cpp @@ -157392,16 +159541,6 @@ msgstr "" msgid "Something crawls out of the coffin!" msgstr "" -#: src/activity_handlers.cpp -msgctxt "memorial_male" -msgid "Exhumed a grave." -msgstr "" - -#: src/activity_handlers.cpp -msgctxt "memorial_female" -msgid "Exhumed a grave." -msgstr "" - #: src/activity_handlers.cpp msgid "You finish exhuming a grave." msgstr "" @@ -157448,10 +159587,6 @@ msgstr "" msgid "You harvested all the plots you could." msgstr "" -#: src/activity_handlers.cpp src/iuse.cpp -msgid "You churn up the earth here." -msgstr "" - #: src/activity_handlers.cpp msgid "You tilled every tile you could." msgstr "" @@ -157544,18 +159679,6 @@ msgstr "" msgid "The nearby doors slide into the floor." msgstr "" -#: src/activity_handlers.cpp src/computer.cpp src/iexamine.cpp -#: src/iuse.cpp src/map.cpp -msgctxt "memorial_male" -msgid "Set off an alarm." -msgstr "" - -#: src/activity_handlers.cpp src/computer.cpp src/iexamine.cpp -#: src/iuse.cpp src/map.cpp -msgctxt "memorial_female" -msgid "Set off an alarm." -msgstr "" - #: src/activity_handlers.cpp src/computer.cpp #: src/computer.cpp src/iexamine.cpp #: src/iuse.cpp src/iuse_actor.cpp src/map.cpp @@ -157585,11 +159708,6 @@ msgstr "" msgid "cast a spell" msgstr "" -#: src/activity_handlers.cpp -#, c-format -msgid "You cast %s!" -msgstr "" - #: src/activity_handlers.cpp msgid "Something about how this spell works just clicked! You gained a level!" msgstr "" @@ -157783,13 +159901,18 @@ msgstr "" msgid "The pet has moved somewhere else." msgstr "" -#: src/activity_item_handling.cpp +#: src/activity_item_handling.cpp src/npcmove.cpp #, c-format -msgid "%s can't reach the source tile to construct." +msgid "%1$s picks up a %2$s." msgstr "" -#: src/activity_item_handling.cpp -msgid "It is too dark to construct anything." +#: src/activity_item_handling.cpp src/npcmove.cpp +#, c-format +msgid "%s picks up several items." +msgstr "" + +#: src/activity_item_handling.cpp src/iuse.cpp +msgid "You cut the log into planks." msgstr "" #: src/activity_item_handling.cpp @@ -157802,6 +159925,18 @@ msgstr "" msgid "%s sorted out every item possible." msgstr "" +#: src/activity_item_handling.cpp +msgid "You don't have the skill for this task." +msgstr "" + +#: src/activity_item_handling.cpp +msgid "There is something blocking the location for this task." +msgstr "" + +#: src/activity_item_handling.cpp +msgid "The required items are not available to complete this task." +msgstr "" + #: src/activity_type.cpp #, c-format msgid "Stop %s?" @@ -158171,12 +160306,6 @@ msgstr "" msgid "Worn Items" msgstr "" -#. ~ Adjective in "You block of the damage with your . -#: src/advanced_inv.cpp src/magic.cpp src/melee.cpp -#: src/recipe.cpp -msgid "none" -msgstr "" - #: src/advanced_inv.cpp src/newcharacter.cpp msgid "name" msgstr "" @@ -159322,6 +161451,69 @@ msgstr "" msgid "artifact file" msgstr "" +#: src/auto_note.cpp +msgid "auto notes configuration" +msgstr "" + +#: src/auto_note.cpp +msgid " AUTO NOTES MANAGER " +msgstr "" + +#: src/auto_note.cpp src/auto_pickup.cpp src/game.cpp +#: src/safemode_ui.cpp +msgid "nable" +msgstr "" + +#: src/auto_note.cpp src/auto_pickup.cpp src/game.cpp +#: src/safemode_ui.cpp +msgid "isable" +msgstr "" + +#: src/auto_note.cpp +msgid " - Toggle" +msgstr "" + +#: src/auto_note.cpp +msgid "Map Extra" +msgstr "" + +#: src/auto_note.cpp src/options.cpp +msgid "Enabled" +msgstr "" + +#: src/auto_note.cpp +msgid "Auto notes enabled:" +msgstr "" + +#: src/auto_note.cpp src/auto_pickup.cpp src/options.cpp +#: src/options.cpp src/safemode_ui.cpp +msgid "False" +msgstr "" + +#: src/auto_note.cpp src/auto_pickup.cpp src/options.cpp +#: src/safemode_ui.cpp +msgid "True" +msgstr "" + +#: src/auto_note.cpp +msgid "witch " +msgstr "" + +#: src/auto_note.cpp +msgid "Discover more special encounters to populate this list" +msgstr "" + +#: src/auto_note.cpp src/crafting_gui.cpp +#: src/crafting_gui.cpp src/editmap.cpp +msgid "yes" +msgstr "" + +#: src/auto_note.cpp src/auto_pickup.cpp src/color.cpp +#: src/game.cpp src/input.cpp src/options.cpp +#: src/safemode_ui.cpp +msgid "Save changes?" +msgstr "" + #: src/auto_pickup.cpp src/game.cpp src/safemode_ui.cpp msgid "dd" msgstr "" @@ -159338,14 +161530,6 @@ msgstr "" msgid "ove" msgstr "" -#: src/auto_pickup.cpp src/game.cpp src/safemode_ui.cpp -msgid "nable" -msgstr "" - -#: src/auto_pickup.cpp src/game.cpp src/safemode_ui.cpp -msgid "isable" -msgstr "" - #: src/auto_pickup.cpp src/safemode_ui.cpp msgid "est" msgstr "" @@ -159375,15 +161559,6 @@ msgstr "" msgid "Auto pickup enabled:" msgstr "" -#: src/auto_pickup.cpp src/options.cpp -#: src/safemode_ui.cpp -msgid "False" -msgstr "" - -#: src/auto_pickup.cpp src/options.cpp src/safemode_ui.cpp -msgid "True" -msgstr "" - #: src/auto_pickup.cpp src/safemode_ui.cpp msgid "witch" msgstr "" @@ -159420,11 +161595,6 @@ msgstr "" msgid "Pickup Rule:" msgstr "" -#: src/auto_pickup.cpp src/color.cpp src/game.cpp -#: src/input.cpp src/options.cpp src/safemode_ui.cpp -msgid "Save changes?" -msgstr "" - #: src/auto_pickup.cpp msgid " AUTO PICKUP MANAGER " msgstr "" @@ -159461,227 +161631,6 @@ msgstr "" msgid "Pickup rules for %s" msgstr "" -#: src/avatar.cpp src/iuse.cpp -msgid "He" -msgstr "" - -#: src/avatar.cpp src/iuse.cpp -msgid "She" -msgstr "" - -#: src/avatar.cpp -msgid "an unemployed male" -msgstr "" - -#: src/avatar.cpp -msgid "an unemployed female" -msgstr "" - -#: src/avatar.cpp -#, c-format -msgid "a %s" -msgstr "" - -#. ~ First parameter is a pronoun ("He"/"She"), second parameter is a description -#. that designates the location relative to its surroundings. -#: src/avatar.cpp -#, c-format -msgid "%1$s was killed in a %2$s." -msgstr "" - -#: src/avatar.cpp -#, c-format -msgid "Cataclysm - Dark Days Ahead version %s memorial file" -msgstr "" - -#: src/avatar.cpp -#, c-format -msgid "In memory of: %s" -msgstr "" - -#. ~ The "%s" will be replaced by an epitaph as displayed in the memorial files. Replace the quotation marks as appropriate for your language. -#: src/avatar.cpp -#, c-format -msgctxt "epitaph" -msgid "\"%s\"" -msgstr "" - -#. ~ First parameter: Pronoun, second parameter: a profession name (with article) -#: src/avatar.cpp -#, c-format -msgid "%1$s was %2$s when the apocalypse began." -msgstr "" - -#: src/avatar.cpp -#, c-format -msgid "%1$s died on %2$s." -msgstr "" - -#: src/avatar.cpp -#, c-format -msgid "Cash on hand: %s" -msgstr "" - -#: src/avatar.cpp -msgid "Final HP:" -msgstr "" - -#: src/avatar.cpp -#, c-format -msgid " Head: %d/%d" -msgstr "" - -#: src/avatar.cpp -#, c-format -msgid "Torso: %d/%d" -msgstr "" - -#: src/avatar.cpp -#, c-format -msgid "L Arm: %d/%d" -msgstr "" - -#: src/avatar.cpp -#, c-format -msgid "R Arm: %d/%d" -msgstr "" - -#: src/avatar.cpp -#, c-format -msgid "L Leg: %d/%d" -msgstr "" - -#: src/avatar.cpp -#, c-format -msgid "R Leg: %d/%d" -msgstr "" - -#: src/avatar.cpp -msgid "Final Stats:" -msgstr "" - -#: src/avatar.cpp -#, c-format -msgid "Str %d" -msgstr "" - -#: src/avatar.cpp -#, c-format -msgid "Dex %d" -msgstr "" - -#: src/avatar.cpp -#, c-format -msgid "Int %d" -msgstr "" - -#: src/avatar.cpp -#, c-format -msgid "Per %d" -msgstr "" - -#: src/avatar.cpp -msgid "Base Stats:" -msgstr "" - -#: src/avatar.cpp -msgid "Final Messages:" -msgstr "" - -#: src/avatar.cpp src/game.cpp -msgid "Kills:" -msgstr "" - -#: src/avatar.cpp -msgid "No monsters were killed." -msgstr "" - -#: src/avatar.cpp -#, c-format -msgid "Total kills: %d" -msgstr "" - -#: src/avatar.cpp src/newcharacter.cpp -#: src/newcharacter.cpp -msgid "Skills:" -msgstr "" - -#. ~ 1. skill name, 2. skill level, 3. exercise percentage to next level -#: src/avatar.cpp -#, c-format -msgid "%s: %d (%d %%)" -msgstr "" - -#: src/avatar.cpp -msgid "Traits:" -msgstr "" - -#: src/avatar.cpp -msgid "(None)" -msgstr "" - -#: src/avatar.cpp -msgid "Ongoing Effects:" -msgstr "" - -#: src/avatar.cpp -msgid "Bionics:" -msgstr "" - -#: src/avatar.cpp -msgid "No bionics were installed." -msgstr "" - -#: src/avatar.cpp -#, c-format -msgid "Total bionics: %d" -msgstr "" - -#: src/avatar.cpp -#, c-format -msgid "Bionic Power: %d/%d" -msgstr "" - -#: src/avatar.cpp -msgid "Weapon:" -msgstr "" - -#: src/avatar.cpp -msgid "Equipment:" -msgstr "" - -#: src/avatar.cpp -msgid "Inventory:" -msgstr "" - -#: src/avatar.cpp -msgid "Lifetime Stats" -msgstr "" - -#: src/avatar.cpp -#, c-format -msgid "Distance walked: %d squares" -msgstr "" - -#: src/avatar.cpp -#, c-format -msgid "Damage taken: %d damage" -msgstr "" - -#: src/avatar.cpp -#, c-format -msgid "Damage healed: %d damage" -msgstr "" - -#: src/avatar.cpp -#, c-format -msgid "Headshots: %d" -msgstr "" - -#: src/avatar.cpp -msgid "Game History" -msgstr "" - #: src/avatar.cpp #, c-format msgid "Mission \"%s\" is failed." @@ -160447,6 +162396,10 @@ msgstr "" msgid "VRRRRMP!" msgstr "" +#: src/bionics.cpp +msgid "You cannot activate that while mounted." +msgstr "" + #: src/bionics.cpp msgid "Your speed suddenly increases!" msgstr "" @@ -160650,23 +162603,48 @@ msgid "" msgstr "" #: src/bionics.cpp -msgid "You need a jumper cable connected to a vehicle to drain power from it." +msgid "" +"You need a jumper cable connected to a power source to drain power from it." +msgstr "" + +#: src/bionics.cpp +msgid "" +"Cable is plugged-in to the CBM but it has to be also connected to the power " +"source." +msgstr "" + +#: src/bionics.cpp +msgid "" +"You are plugged to the vehicle. It will charge you if it has some juice in " +"it." +msgstr "" + +#: src/bionics.cpp +msgid "" +"You are plugged to a solar pack. It will charge you if it's unfolded and in " +"sunlight." msgstr "" #: src/bionics.cpp -msgid "Your plugged-in solar pack is now able to charge your system." +msgid "" +"You are plugged to a UPS. It will charge you if it has some juice in it." msgstr "" #: src/bionics.cpp msgid "" -"You need to connect the cable to yourself and the solar pack before your " -"solar pack can charge your system." +"You have a cable plugged to a portable power source, but you need to plug it " +"in to the CBM." msgstr "" #: src/bionics.cpp msgid "" -"You might plug in your solar pack to the cable charging system, if you " -"unfold it." +"You have a cable plugged to a vehicle, but you need to plug it in to the CBM." +msgstr "" + +#: src/bionics.cpp +msgid "" +"You have at least one free cable in your inventory that you could use to " +"plug yourself in." msgstr "" #: src/bionics.cpp @@ -160849,18 +162827,6 @@ msgid "" "anyway?" msgstr "" -#: src/bionics.cpp -#, c-format -msgctxt "memorial_male" -msgid "Removed bionic: %s." -msgstr "" - -#: src/bionics.cpp -#, c-format -msgctxt "memorial_female" -msgid "Removed bionic: %s." -msgstr "" - #: src/bionics.cpp msgid "Your parts are jiggled back into their familiar places." msgstr "" @@ -160874,18 +162840,6 @@ msgstr "" msgid "Successfully removed %s." msgstr "" -#: src/bionics.cpp -#, c-format -msgctxt "memorial_male" -msgid "Failed to remove bionic: %s." -msgstr "" - -#: src/bionics.cpp -#, c-format -msgctxt "memorial_female" -msgid "Failed to remove bionic: %s." -msgstr "" - #: src/bionics.cpp #, c-format msgid "The %s's anesthesia kit looks empty." @@ -160943,18 +162897,6 @@ msgid "" "faulty installation! Continue anyway?" msgstr "" -#: src/bionics.cpp -#, c-format -msgctxt "memorial_male" -msgid "Installed bionic: %s." -msgstr "" - -#: src/bionics.cpp -#, c-format -msgctxt "memorial_female" -msgid "Installed bionic: %s." -msgstr "" - #. ~ %1$s - name of the bionic to be upgraded (inferior), %2$s - name of the upgraded bionic (superior). #: src/bionics.cpp #, c-format @@ -160967,18 +162909,6 @@ msgstr "" msgid "Successfully installed %s." msgstr "" -#: src/bionics.cpp -#, c-format -msgctxt "memorial_male" -msgid "Failed install of bionic: %s." -msgstr "" - -#: src/bionics.cpp -#, c-format -msgctxt "memorial_female" -msgid "Failed install of bionic: %s." -msgstr "" - #: src/bionics.cpp msgid "The installation is a failure." msgstr "" @@ -161014,18 +162944,6 @@ msgctxt "memorial_female" msgid "Lost %d units of power capacity." msgstr "" -#: src/bionics.cpp -#, c-format -msgctxt "memorial_male" -msgid "Installed bad bionic: %s." -msgstr "" - -#: src/bionics.cpp -#, c-format -msgctxt "memorial_female" -msgid "Installed bad bionic: %s." -msgstr "" - #. ~ ( slots); #: src/bionics.cpp #, c-format @@ -162089,16 +164007,6 @@ msgstr "" msgid "The sound of your voice is significantly muffled!" msgstr "" -#: src/character.cpp -msgctxt "memorial_male" -msgid "Threw up." -msgstr "" - -#: src/character.cpp -msgctxt "memorial_female" -msgid "Threw up." -msgstr "" - #: src/character.cpp msgid " throws up heavily!" msgstr "" @@ -162355,6 +164263,14 @@ msgstr "" msgid "Destination for artifacts" msgstr "" +#: src/clzones.cpp +msgid "Loot: Corpses" +msgstr "" + +#: src/clzones.cpp +msgid "Destination for corpses" +msgstr "" + #: src/clzones.cpp msgid "Loot: Armor" msgstr "" @@ -162397,6 +164313,17 @@ msgstr "" msgid "Items inside of this zone are ignored by \"sort out loot\" zone-action." msgstr "" +#: src/clzones.cpp +msgid "Source: Firewood" +msgstr "" + +#: src/clzones.cpp +msgid "" +"Source for firewood or other flammable materials in this zone may be used to " +"automatically refuel fires. This will be done to maintain light during long-" +"running tasks such as crafting, reading or waiting." +msgstr "" + #: src/clzones.cpp msgid "Construction: Blueprint" msgstr "" @@ -162413,6 +164340,30 @@ msgstr "" msgid "Designate a farm plot for tilling and planting." msgstr "" +#: src/clzones.cpp +msgid "Chop Trees" +msgstr "" + +#: src/clzones.cpp +msgid "Designate an area to chop down trees." +msgstr "" + +#: src/clzones.cpp +msgid "Fishing Spot" +msgstr "" + +#: src/clzones.cpp +msgid "Designate an area to fish from." +msgstr "" + +#: src/clzones.cpp +msgid "Vehicle Deconstruct Zone" +msgstr "" + +#: src/clzones.cpp +msgid "Any vehicles in this area are marked for deconstruction." +msgstr "" + #: src/clzones.cpp msgid "Basecamp: Food" msgstr "" @@ -162525,10 +164476,6 @@ msgstr "" msgid "light blue" msgstr "" -#: src/color.cpp src/item.cpp -msgid "blue" -msgstr "" - #: src/color.cpp msgid "white" msgstr "" @@ -162659,58 +164606,18 @@ msgstr "" msgid "Bohm... Bohm... Bohm..." msgstr "" -#: src/computer.cpp -msgctxt "memorial_male" -msgid "Released subspace specimens." -msgstr "" - -#: src/computer.cpp -msgctxt "memorial_female" -msgid "Released subspace specimens." -msgstr "" - #: src/computer.cpp msgid "Containment shields opened. Press any key..." msgstr "" -#: src/computer.cpp -msgctxt "memorial_male" -msgid "Terminated subspace specimens." -msgstr "" - -#: src/computer.cpp -msgctxt "memorial_female" -msgid "Terminated subspace specimens." -msgstr "" - #: src/computer.cpp msgid "Subjects terminated. Press any key..." msgstr "" -#: src/computer.cpp -msgctxt "memorial_male" -msgid "Opened a portal." -msgstr "" - -#: src/computer.cpp -msgctxt "memorial_female" -msgid "Opened a portal." -msgstr "" - #: src/computer.cpp msgid "WARNING: Resonance cascade carries severe risk! Continue?" msgstr "" -#: src/computer.cpp -msgctxt "memorial_male" -msgid "Caused a resonance cascade." -msgstr "" - -#: src/computer.cpp -msgctxt "memorial_female" -msgid "Caused a resonance cascade." -msgstr "" - #: src/computer.cpp msgid "No data found." msgstr "" @@ -162763,33 +164670,10 @@ msgstr "" msgid "Nuclear missile launch aborted." msgstr "" -#. ~ %s is terrain name -#: src/computer.cpp -#, c-format -msgctxt "memorial_male" -msgid "Launched a nuke at a %s." -msgstr "" - -#: src/computer.cpp -#, c-format -msgctxt "memorial_female" -msgid "Launched a nuke at a %s." -msgstr "" - #: src/computer.cpp msgid "Disarm missile." msgstr "" -#: src/computer.cpp -msgctxt "memorial_male" -msgid "Disarmed a nuclear missile." -msgstr "" - -#: src/computer.cpp -msgctxt "memorial_female" -msgid "Disarmed a nuclear missile." -msgstr "" - #: src/computer.cpp msgid "Nuclear missile disarmed!" msgstr "" @@ -163165,16 +165049,6 @@ msgid "" " \n" msgstr "" -#: src/computer.cpp -msgctxt "memorial_male" -msgid "Sealed a Hazardous Material Sarcophagus." -msgstr "" - -#: src/computer.cpp -msgctxt "memorial_female" -msgid "Sealed a Hazardous Material Sarcophagus." -msgstr "" - #: src/computer.cpp msgid "Charges Detonated" msgstr "" @@ -163591,16 +165465,6 @@ msgstr "" msgid "You just tunneled into lava!" msgstr "" -#: src/construction.cpp -msgctxt "memorial_male" -msgid "Dug a shaft into lava." -msgstr "" - -#: src/construction.cpp -msgctxt "memorial_female" -msgid "Dug a shaft into lava." -msgstr "" - #: src/construction.cpp msgid "You dig into a preexisting space, and improvise a ladder." msgstr "" @@ -163750,16 +165614,6 @@ msgstr "" msgid "Consume your %s anyway?" msgstr "" -#: src/consumption.cpp -msgctxt "memorial_male" -msgid "Began preparing for hibernation." -msgstr "" - -#: src/consumption.cpp -msgctxt "memorial_female" -msgid "Began preparing for hibernation." -msgstr "" - #: src/consumption.cpp msgid "" "You've begun stockpiling calories and liquid for hibernation. You get the " @@ -164095,7 +165949,7 @@ msgid_plural " load %i charges of %s in their %s." msgstr[0] "" msgstr[1] "" -#: src/craft_command.cpp src/crafting.cpp src/veh_interact.cpp +#: src/craft_command.cpp src/crafting.cpp msgid " (nearby)" msgstr "" @@ -164629,10 +166483,6 @@ msgstr "" msgid "recipes which are memorized or not" msgstr "" -#: src/crafting_gui.cpp -msgid "yes" -msgstr "" - #: src/crafting_gui.cpp msgid "" "The default is to search result names. Some single-character prefixes can " @@ -165163,7 +167013,8 @@ msgstr "" msgid "You teleport to overmap (%d,%d,%d)." msgstr "" -#: src/debug_menu.cpp src/npctrade.cpp +#: src/debug_menu.cpp src/iuse.cpp +#: src/npctrade.cpp msgid "You" msgstr "" @@ -166381,18 +168232,29 @@ msgid "dump to save/jtest-*.txt" msgstr "" #: src/editmap.cpp -msgctxt "map editor" -msgid "[t]rap, [f]ield, [HJKL] move++, [v] showall" +#, c-format +msgctxt "keybinding descriptions" +msgid "%s, %s, [%s,%s,%s,%s] fast scroll, %s, %s, %s, %s, %s, %s" msgstr "" #: src/editmap.cpp -msgctxt "map editor" -msgid "[g] terrain/furn, [o] mapgen, [i]tems, [q]uit" +msgctxt "map editor state" +msgid "Looking around" msgstr "" #: src/editmap.cpp -msgctxt "map editor state" -msgid "Looking around" +msgctxt "vehicle" +msgid "no" +msgstr "" + +#: src/editmap.cpp +msgctxt "vehicle" +msgid "in" +msgstr "" + +#: src/editmap.cpp +msgctxt "vehicle" +msgid "out" msgstr "" #: src/editmap.cpp @@ -166407,7 +168269,7 @@ msgstr "" #: src/editmap.cpp #, c-format -msgid "dist: %d u_see: %d v_in: %d scent: %d" +msgid "dist: %d u_see: %s veh: %s scent: %d" msgstr "" #: src/editmap.cpp @@ -166485,78 +168347,71 @@ msgid "Inscription: %s" msgstr "" #: src/editmap.cpp -#, c-format -msgid "movecost %d" -msgstr "" - -#: src/editmap.cpp -msgid "[indoors] " -msgstr "" - -#: src/editmap.cpp -msgid "[roof] " -msgstr "" - -#: src/editmap.cpp -msgctxt "Map editor: terrain/furniture shortkeys" -msgid "[s/tab] shape select, [m]ove, [<>^v] select" +msgctxt "map editor state" +msgid "Terrain" msgstr "" #: src/editmap.cpp -msgctxt "Map editor: terrain/furniture shortkeys" -msgid "[enter] change, [g] change/quit, [q]uit, [v] showall" +msgctxt "map editor state" +msgid "Furniture" msgstr "" #: src/editmap.cpp -msgctxt "Map editor: terrain/furniture editing menu" -msgid "Terrain / Furniture" +msgctxt "map editor: traps editing" +msgid "Traps" msgstr "" #: src/editmap.cpp -msgctxt "Map editor: Field effects shortkeys" -msgid "[s/tab] shape select, [m]ove, [<,>] intensity" +#, c-format +msgid "" +"Move cost: %d\n" +"Indoors: %s\n" +"Roof: %s" msgstr "" #: src/editmap.cpp -msgctxt "Map editor: Field effects shortkeys" -msgid "[enter] edit, [q]uit, [v] showall" +#, c-format +msgid "" +"Visible: %d\n" +"Avoidance: %d\n" +"Difficulty: %d\n" +"Benign: %s" msgstr "" #: src/editmap.cpp -msgctxt "Map editor: Editing field effects" -msgid "Field effects" +#, c-format +msgctxt "map feature id" +msgid "(%s)" msgstr "" #: src/editmap.cpp -msgctxt "map editor: used to describe a clean field (e.g. without blood)" -msgid "-clear-" +#, c-format +msgctxt "map feature name and id" +msgid "%s (%s)" msgstr "" #: src/editmap.cpp -msgctxt "map editor: traps shortkeys" -msgid "[s/tab] shape select, [m]ove, [v] showall" +#, c-format +msgctxt "keybinding descriptions" +msgid "%s, %s, %s, %s, %s" msgstr "" #: src/editmap.cpp -msgctxt "map editor: traps shortkeys" -msgid "[enter] change, [t] change/quit, [q]uit" +#, c-format +msgctxt "keybinding descriptions" +msgid "%s, %s, [%s,%s] intensity, %s, %s, %s" msgstr "" #: src/editmap.cpp -msgctxt "map editor: traps editing" -msgid "Traps" +msgctxt "Map editor: Editing field effects" +msgid "Field effects" msgstr "" #: src/editmap.cpp +msgctxt "map editor: used to describe a clean field (e.g. without blood)" msgid "-clear-" msgstr "" -#. ~ trap editor list entry. 1st string is display name, 2nd string is internal name of trap -#: src/editmap.cpp src/veh_interact.cpp -#, c-format -msgid "%s (%s)" -msgstr "" - #: src/editmap.cpp msgid "Add item" msgstr "" @@ -166595,19 +168450,13 @@ msgid "Add item" msgstr "" #: src/editmap.cpp -msgid "[s] resize, [y] swap" -msgstr "" - -#: src/editmap.cpp -msgid "[m]move, [s]hape, [y] swap, [z] to start" -msgstr "" - -#: src/editmap.cpp -msgid "[enter] accept, [q] abort, [v] showall" +msgid "Moving selection" msgstr "" #: src/editmap.cpp -msgid "Moving selection" +#, c-format +msgctxt "keybinding descriptions" +msgid "%s, %s, %s, %s, %s, %s, %s" msgstr "" #: src/editmap.cpp @@ -166643,6 +168492,11 @@ msgctxt "shape" msgid "Point" msgstr "" +#: src/editmap.cpp +msgctxt "map editor state" +msgid "Select a shape" +msgstr "" + #: src/editmap.cpp msgctxt "map generator" msgid "Regenerate" @@ -166664,11 +168518,15 @@ msgid "Change Overmap (Doesn't Apply)" msgstr "" #: src/editmap.cpp -msgid "[pgup/pgdn]: prev/next oter type" +#, c-format +msgctxt "keybinding descriptions" +msgid "[%s,%s] prev/next oter type, [%s,%s] select, %s, %s" msgstr "" #: src/editmap.cpp -msgid "[up/dn] select, [enter] accept, [q] abort" +#, c-format +msgctxt "map editor state" +msgid "Mapgen: %s" msgstr "" #: src/editmap.cpp @@ -166685,8 +168543,9 @@ msgid "Select the Vehicle" msgstr "" #: src/editmap.cpp -msgctxt "map generator" -msgid "[enter] accept, [q] abort" +#, c-format +msgctxt "keybinding descriptions" +msgid "%s, %s" msgstr "" #: src/editmap.cpp @@ -166695,13 +168554,9 @@ msgid "Mapgen: Moving target" msgstr "" #: src/editmap.cpp -msgctxt "map generator" -msgid "[m]ove" -msgstr "" - -#: src/editmap.cpp -msgctxt "map generator" -msgid "[enter] change, [q]uit" +#, c-format +msgctxt "keybinding descriptions" +msgid "%s, %s, %s" msgstr "" #: src/editmap.cpp @@ -168995,21 +170850,12 @@ msgstr "" msgid "Please wait as we build your world" msgstr "" -#. ~ %s is player name #: src/game.cpp -#, c-format -msgctxt "memorial_male" -msgid "%s began their journey into the Cataclysm." -msgstr "" - -#: src/game.cpp -#, c-format -msgctxt "memorial_female" -msgid "%s began their journey into the Cataclysm." +msgid "Survived:" msgstr "" -#: src/game.cpp -msgid "Survived:" +#: src/game.cpp src/memorial_logger.cpp +msgid "Kills:" msgstr "" #: src/game.cpp @@ -169020,42 +170866,6 @@ msgstr "" msgid "Last Words:" msgstr "" -#: src/game.cpp -#, c-format -msgctxt "memorial_male" -msgid "%s committed suicide." -msgstr "" - -#: src/game.cpp -#, c-format -msgctxt "memorial_female" -msgid "%s committed suicide." -msgstr "" - -#: src/game.cpp -#, c-format -msgctxt "memorial_male" -msgid "%s was killed." -msgstr "" - -#: src/game.cpp -#, c-format -msgctxt "memorial_female" -msgid "%s was killed." -msgstr "" - -#: src/game.cpp -#, c-format -msgctxt "memorial_male" -msgid "Last words: %s" -msgstr "" - -#: src/game.cpp -#, c-format -msgctxt "memorial_female" -msgid "Last words: %s" -msgstr "" - #: src/game.cpp msgid "Keep world" msgstr "" @@ -169782,6 +171592,9 @@ msgid "Without extra fuel it will burn for between %s to %s." msgstr "" #: src/game.cpp +#: src/game.cpp src/iuse.cpp +#: src/iuse.cpp +#: src/iuse_actor.cpp msgid "You cannot do that while mounted." msgstr "" @@ -170411,7 +172224,7 @@ msgstr "" msgid "Your %s refuses to move over that ledge!" msgstr "" -#: src/game.cpp src/monexamine.cpp src/player.cpp +#: src/game.cpp src/player.cpp #: src/player.cpp msgid "You let go of the grabbed object." msgstr "" @@ -170514,6 +172327,11 @@ msgstr "" msgid "You displace the %s." msgstr "" +#: src/game.cpp +#, c-format +msgid "You cannot move the %s out of the way." +msgstr "" + #: src/game.cpp msgid "There's something here, but you can't see what it is." msgstr "" @@ -170868,35 +172686,11 @@ msgstr "" msgid "You teleport into the middle of a %s!" msgstr "" -#: src/game.cpp -#, c-format -msgctxt "memorial_male" -msgid "Teleported into a %s." -msgstr "" - -#: src/game.cpp -#, c-format -msgctxt "memorial_female" -msgid "Teleported into a %s." -msgstr "" - #: src/game.cpp #, c-format msgid "%1$s teleports into the middle of a %2$s!" msgstr "" -#: src/game.cpp -#, c-format -msgctxt "memorial_male" -msgid "Telefragged a %s." -msgstr "" - -#: src/game.cpp -#, c-format -msgctxt "memorial_female" -msgid "Telefragged a %s." -msgstr "" - #: src/game.cpp msgid "Set the Scent Map sensitivity to (0 to cancel)?" msgstr "" @@ -171949,7 +173743,7 @@ msgid "Set alarm for dawn" msgstr "" #: src/handle_action.cpp -msgid "Wait till dawn" +msgid "Wait till daylight" msgstr "" #: src/handle_action.cpp @@ -171965,7 +173759,7 @@ msgid "Set alarm for dusk" msgstr "" #: src/handle_action.cpp -msgid "Wait till dusk" +msgid "Wait till night" msgstr "" #: src/handle_action.cpp @@ -172005,6 +173799,10 @@ msgstr "" msgid "You set your alarm." msgstr "" +#: src/handle_action.cpp +msgid "You cannot sleep while mounted." +msgstr "" + #: src/handle_action.cpp msgid "Are you sure you want to sleep?" msgstr "" @@ -172127,6 +173925,14 @@ msgstr "" msgid "Work on any nearby Blueprint: construction zones" msgstr "" +#: src/handle_action.cpp +msgid "Farm Plots" +msgstr "" + +#: src/handle_action.cpp +msgid "till and plant on any nearby farm plots - auto-fetch seeds and tools" +msgstr "" + #: src/handle_action.cpp msgid "You need a tool to dig with." msgstr "" @@ -172423,6 +174229,23 @@ msgstr "" msgid "%s is now %s." msgstr "" +#: src/handle_action.cpp +msgid "You will not pick up other peoples belongings." +msgstr "" + +#: src/handle_action.cpp +msgid "You will pick up also those things that belong to others!" +msgstr "" + +#: src/handle_action.cpp +msgid "You will be reminded not to steal." +msgstr "" + +#: src/handle_action.cpp +#, c-format +msgid "THIEF_MODE CONTAINED BAD VALUE [ %s ]!" +msgstr "" + #: src/handle_action.cpp msgid "Debug mode ON!" msgstr "" @@ -172911,16 +174734,6 @@ msgid "" "shape, but with long, twisted, distended limbs." msgstr "" -#: src/iexamine.cpp -msgctxt "memorial_male" -msgid "Awoke a group of dark wyrms!" -msgstr "" - -#: src/iexamine.cpp -msgctxt "memorial_female" -msgid "Awoke a group of dark wyrms!" -msgstr "" - #: src/iexamine.cpp msgid "The pedestal sinks into the ground..." msgstr "" @@ -173080,7 +174893,12 @@ msgstr "" #: src/iexamine.cpp #, c-format -msgid "Planted %s." +msgid " plants some %s." +msgstr "" + +#: src/iexamine.cpp +#, c-format +msgid "You plant some %s." msgstr "" #: src/iexamine.cpp @@ -173745,7 +175563,7 @@ msgstr "" msgid "Tear down the curtains." msgstr "" -#: src/iexamine.cpp +#: src/iexamine.cpp src/vehicle_use.cpp msgid "You carefully peek through the curtains." msgstr "" @@ -174695,6 +176513,197 @@ msgstr "" msgid "key bindings configuration" msgstr "" +#: src/input.cpp +msgctxt "key name" +msgid "TAB" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "BACKTAB" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "SPACE" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "UP" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "DOWN" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "LEFT" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "RIGHT" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "NPAGE" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "PPAGE" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "ESC" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "BACKSPACE" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "HOME" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "BREAK" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "END" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "RETURN" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "JOY_LEFT" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "JOY_RIGHT" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "JOY_UP" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "JOY_DOWN" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "JOY_LEFTUP" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "JOY_LEFTDOWN" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "JOY_RIGHTUP" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "JOY_RIGHTDOWN" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "JOY_0" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "JOY_1" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "JOY_2" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "JOY_3" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "JOY_4" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "JOY_5" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "JOY_6" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "JOY_7" +msgstr "" + +#: src/input.cpp +#, c-format +msgctxt "function key name" +msgid "F%d" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "MOUSE_LEFT" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "MOUSE_RIGHT" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "SCROLL_UP" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "SCROLL_DOWN" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "MOUSE_MOVE" +msgstr "" + +#: src/input.cpp +msgctxt "key name" +msgid "UNKNOWN" +msgstr "" + #: src/input.cpp #, c-format msgid "unknown key %ld" @@ -174722,21 +176731,21 @@ msgstr "" #: src/input.cpp #, c-format msgctxt "keybinding" -msgid "[any] %s" +msgid "[any] %s" msgstr "" #. ~ keybinding description for unbound or disabled keys #: src/input.cpp #, c-format msgctxt "keybinding" -msgid "[n/a] %s" +msgid "[n/a] %s" msgstr "" #. ~ keybinding description for bound keys #: src/input.cpp #, c-format msgctxt "keybinding" -msgid "[%s] %s" +msgid "[%s] %s" msgstr "" #: src/input.cpp @@ -175067,6 +177076,32 @@ msgstr "" msgid "age (hours): " msgstr "" +#: src/item.cpp +msgid "charges: " +msgstr "" + +#: src/item.cpp +msgid "damage: " +msgstr "" + +#: src/item.cpp +msgid "active: " +msgstr "" + +#: src/item.cpp +msgid "burn: " +msgstr "" + +#: src/item.cpp +#, c-format +msgid "tags: %s" +msgstr "" + +#: src/item.cpp +#, c-format +msgid "item var: %s, %s" +msgstr "" + #: src/item.cpp msgid "age (turns): " msgstr "" @@ -175076,15 +177111,15 @@ msgid "rot (turns): " msgstr "" #: src/item.cpp -msgid "last rot: " +msgid "max rot (turns): " msgstr "" #: src/item.cpp -msgid "last temp: " +msgid "last rot: " msgstr "" #: src/item.cpp -msgid "max rot (turns): " +msgid "last temp: " msgstr "" #: src/item.cpp @@ -175111,10 +177146,6 @@ msgstr "" msgid "Freeze point: " msgstr "" -#: src/item.cpp -msgid "burn: " -msgstr "" - #: src/item.cpp msgid "Quench: " msgstr "" @@ -176364,6 +178395,10 @@ msgstr "" msgid " (lit)" msgstr "" +#: src/item.cpp +msgid " (plugged in)" +msgstr "" + #: src/item.cpp msgid " (active)" msgstr "" @@ -176577,19 +178612,6 @@ msgstr "" msgid "A nearby corpse rises and moves towards you!" msgstr "" -#. ~ %s is corpse name -#: src/item.cpp -#, c-format -msgctxt "memorial_male" -msgid "Had a %s revive while carrying it." -msgstr "" - -#: src/item.cpp -#, c-format -msgctxt "memorial_female" -msgid "Had a %s revive while carrying it." -msgstr "" - #: src/item.cpp msgid "Oh dear god, a robot you're carrying has started moving!" msgstr "" @@ -176808,16 +178830,6 @@ msgstr "" msgid "Are you sure you want to drink... this?" msgstr "" -#: src/iuse.cpp -msgctxt "memorial_male" -msgid "Ate a sewage sample." -msgstr "" - -#: src/iuse.cpp -msgctxt "memorial_female" -msgid "Ate a sewage sample." -msgstr "" - #: src/iuse.cpp #, c-format msgid "You take some %s." @@ -177078,26 +179090,6 @@ msgstr "" msgid "You feel a slight itching inside, but it passes." msgstr "" -#: src/iuse.cpp -msgctxt "memorial_male" -msgid "Consumed purifier." -msgstr "" - -#: src/iuse.cpp -msgctxt "memorial_female" -msgid "Consumed purifier." -msgstr "" - -#: src/iuse.cpp -msgctxt "memorial_male" -msgid "Injected purifier." -msgstr "" - -#: src/iuse.cpp -msgctxt "memorial_female" -msgid "Injected purifier." -msgstr "" - #: src/iuse.cpp msgid "You feel a distinct burning inside, but it passes." msgstr "" @@ -177106,16 +179098,6 @@ msgstr "" msgid "Feels like you're on fire, but you're OK." msgstr "" -#: src/iuse.cpp -msgctxt "memorial_male" -msgid "Injected smart purifier." -msgstr "" - -#: src/iuse.cpp -msgctxt "memorial_female" -msgid "Injected smart purifier." -msgstr "" - #: src/iuse.cpp msgid "You don't have any mutations to purify." msgstr "" @@ -177179,16 +179161,6 @@ msgid "" "you convulse and collapse to the ground..." msgstr "" -#: src/iuse.cpp -msgctxt "memorial_male" -msgid "Opened the Marloss Gateway." -msgstr "" - -#: src/iuse.cpp -msgctxt "memorial_female" -msgid "Opened the Marloss Gateway." -msgstr "" - #: src/iuse.cpp src/monattack.cpp msgid "" "You wake up in a marloss bush. Almost *cradled* in it, actually, as though " @@ -177215,51 +179187,11 @@ msgstr "" msgid "We no longer require this scaffolding. We reserve it for other uses." msgstr "" -#: src/iuse.cpp -msgctxt "memorial_male" -msgid "Consumed a marloss product." -msgstr "" - -#: src/iuse.cpp -msgctxt "memorial_female" -msgid "Consumed a marloss product." -msgstr "" - #: src/iuse.cpp #, c-format msgid "Sure you want to eat the %s? You could plant it in a mound of dirt." msgstr "" -#: src/iuse.cpp -msgctxt "memorial_male" -msgid "Consumed a marloss seed." -msgstr "" - -#: src/iuse.cpp -msgctxt "memorial_female" -msgid "Consumed a marloss seed." -msgstr "" - -#: src/iuse.cpp -msgctxt "memorial_male" -msgid "Consumed some marloss jelly." -msgstr "" - -#: src/iuse.cpp -msgctxt "memorial_female" -msgid "Consumed some marloss jelly." -msgstr "" - -#: src/iuse.cpp -msgctxt "memorial_male" -msgid "Became one with the Mycus." -msgstr "" - -#: src/iuse.cpp -msgctxt "memorial_female" -msgid "Became one with the Mycus." -msgstr "" - #: src/iuse.cpp msgid "It tastes amazing, and you finish it quickly." msgstr "" @@ -177435,10 +179367,6 @@ msgstr "" msgid "You doubt you will have much luck catching fish here" msgstr "" -#: src/iuse.cpp -msgid "Fish where?" -msgstr "" - #: src/iuse.cpp msgid "You can't fish there!" msgstr "" @@ -177690,6 +179618,10 @@ msgstr "" msgid "But you can't touch this." msgstr "" +#: src/iuse.cpp +msgid "You can't pry that." +msgstr "" + #: src/iuse.cpp msgid "" "You attempt to pry open your wallet but alas. You are just too miserly." @@ -177739,10 +179671,6 @@ msgstr "" msgid "You pry, but cannot pry open the window." msgstr "" -#: src/iuse.cpp -msgid "You can't pry that." -msgstr "" - #: src/iuse.cpp #, c-format msgid "You can't get sufficient leverage to open that with your %s." @@ -177760,6 +179688,10 @@ msgstr "" msgid "You think about jumping on a shovel, but then change up your mind." msgstr "" +#: src/iuse.cpp +msgid "You start churning up the earth here." +msgstr "" + #: src/iuse.cpp msgid "You can't churn up this ground." msgstr "" @@ -178169,10 +180101,6 @@ msgstr "" msgid "You light the pack of firecrackers." msgstr "" -#: src/iuse.cpp src/ranged.cpp -msgid "Bang!" -msgstr "" - #: src/iuse.cpp msgid "You light the firecracker." msgstr "" @@ -178186,16 +180114,6 @@ msgstr "" msgid "You set the timer to %s." msgstr "" -#: src/iuse.cpp -msgctxt "memorial_male" -msgid "Activated a mininuke." -msgstr "" - -#: src/iuse.cpp -msgctxt "memorial_female" -msgid "Activated a mininuke." -msgstr "" - #: src/iuse.cpp msgid "You squeeze the pheromone ball..." msgstr "" @@ -178478,6 +180396,10 @@ msgstr "" msgid "You need a rechargeable battery cell to charge." msgstr "" +#: src/iuse.cpp +msgid "You cannot do... that while mounted." +msgstr "" + #: src/iuse.cpp msgid "It's waterproof, but oxygen maybe?" msgstr "" @@ -178565,10 +180487,6 @@ msgstr "" msgid "There's nothing to use the %s on here." msgstr "" -#: src/iuse.cpp -msgid "You cut the log into planks." -msgstr "" - #: src/iuse.cpp msgid "Chop down which tree?" msgstr "" @@ -178643,29 +180561,16 @@ msgstr "" msgid "The universe implodes and reforms around you." msgstr "" -#: src/iuse.cpp -msgid "You move the mop around, unsure whether it's doing any good." -msgstr "" - -#: src/iuse.cpp -msgid "You mop up the spill." -msgstr "" - #: src/iuse.cpp msgid "There's nothing to mop there." msgstr "" -#. ~ %s is artifact name #: src/iuse.cpp -#, c-format -msgctxt "memorial_male" -msgid "Activated the %s." +msgid "You move the mop around, unsure whether it's doing any good." msgstr "" #: src/iuse.cpp -#, c-format -msgctxt "memorial_female" -msgid "Activated the %s." +msgid "You mop up the spill." msgstr "" #: src/iuse.cpp @@ -179324,7 +181229,7 @@ msgstr "" #: src/iuse.cpp #, c-format -msgid " in %s cloud" +msgid " in %s" msgstr "" #: src/iuse.cpp @@ -179515,6 +181420,14 @@ msgstr "" msgid "stands" msgstr "" +#: src/iuse.cpp src/memorial_logger.cpp +msgid "He" +msgstr "" + +#: src/iuse.cpp src/memorial_logger.cpp +msgid "She" +msgstr "" + #: src/iuse.cpp msgctxt "Pronoun" msgid "It" @@ -180122,17 +182035,69 @@ msgid "Attach cable to solar pack" msgstr "" #: src/iuse.cpp -msgid "Attach cable to vehicle where?" +msgid "Attach cable to UPS" +msgstr "" + +#: src/iuse.cpp +msgid "You attach the cable to your Cable Charger System." +msgstr "" + +#: src/iuse.cpp +msgid "You attach the cable to the solar pack." +msgstr "" + +#: src/iuse.cpp +msgid "Choose UPS:" +msgstr "" + +#: src/iuse.cpp +msgid "You don't have any UPS." msgstr "" #: src/iuse.cpp -msgid "Attach loose end of the cable" +msgid "You attach the cable to the UPS." +msgstr "" + +#: src/iuse.cpp +msgid "Attach cable to vehicle where?" msgstr "" #: src/iuse.cpp msgid "Detach and re-spool the cable" msgstr "" +#: src/iuse.cpp +msgid "Attach loose end to vehicle" +msgstr "" + +#: src/iuse.cpp +msgid "Attach loose end to self" +msgstr "" + +#: src/iuse.cpp +msgid "Attach loose end to solar pack" +msgstr "" + +#: src/iuse.cpp +msgid "Attach loose end to UPS" +msgstr "" + +#: src/iuse.cpp +msgid "You attach the cable to the Cable Charger System." +msgstr "" + +#: src/iuse.cpp +msgid "You are now plugged to the solar backpack." +msgstr "" + +#: src/iuse.cpp +msgid "You are now plugged to the UPS." +msgstr "" + +#: src/iuse.cpp +msgid "You are now plugged to the vehicle." +msgstr "" + #: src/iuse.cpp #, c-format msgid "The %s already has access to its own electric system!" @@ -180185,6 +182150,10 @@ msgstr "" msgid "%s holding %s" msgstr "" +#: src/iuse.cpp +msgid "You cannot capture a creature mounted." +msgstr "" + #: src/iuse.cpp #, c-format msgid "There is no place to put the %s." @@ -180535,10 +182504,6 @@ msgstr "" msgid "There is also a certain bionic that helps with this kind of armor." msgstr "" -#: src/iuse_actor.cpp -msgid "No lock to pick." -msgstr "" - #: src/iuse_actor.cpp msgid "Use your lockpick where?" msgstr "" @@ -180555,23 +182520,23 @@ msgid "" msgstr "" #: src/iuse_actor.cpp -msgid "With a satisfying click, the chain-link gate opens." +msgid "That door isn't locked." msgstr "" #: src/iuse_actor.cpp -msgid "With a satisfying click, the lock on the door opens." +msgid "That cannot be picked." msgstr "" #: src/iuse_actor.cpp -msgid "The door swings open..." +msgid "With a satisfying click, the chain-link gate opens." msgstr "" #: src/iuse_actor.cpp -msgid "That door isn't locked." +msgid "With a satisfying click, the lock on the door opens." msgstr "" #: src/iuse_actor.cpp -msgid "That cannot be picked." +msgid "The door swings open..." msgstr "" #: src/iuse_actor.cpp @@ -180831,6 +182796,10 @@ msgstr "" msgid "It itches a little." msgstr "" +#: src/iuse_actor.cpp +msgid "You cannot cauterize while mounted." +msgstr "" + #: src/iuse_actor.cpp msgid "" "You need a source of flame (4 charges worth) before you can cauterize " @@ -180878,6 +182847,14 @@ msgstr "" msgid "Hsss" msgstr "" +#: src/iuse_actor.cpp +msgid "You can't play music while mounted." +msgstr "" + +#: src/iuse_actor.cpp +msgid " can't play music while mounted." +msgstr "" + #: src/iuse_actor.cpp msgid "You can't play music underwater" msgstr "" @@ -180940,6 +182917,10 @@ msgstr "" msgid "%s produces an annoying sound" msgstr "" +#: src/iuse_actor.cpp +msgid "You can't do that while mounted." +msgstr "" + #: src/iuse_actor.cpp msgid "This can teach you a spell." msgstr "" @@ -181123,6 +183104,10 @@ msgstr "" msgid "Insufficient ammunition to assemble %s" msgstr "" +#: src/iuse_actor.cpp +msgid " can't do that while mounted." +msgstr "" + #: src/iuse_actor.cpp msgid "Your tool does not have enough charges to do that." msgstr "" @@ -181407,6 +183392,10 @@ msgstr "" msgid "Can't saw off modified barrels." msgstr "" +#: src/iuse_actor.cpp +msgid "You can't install bionics while mounted." +msgstr "" + #: src/iuse_actor.cpp msgid "You can't self-install bionics." msgstr "" @@ -181439,16 +183428,6 @@ msgstr "" msgid "Has to be taken off first." msgstr "" -#: src/iuse_actor.cpp -msgctxt "memorial_male" -msgid "Consumed mutagen." -msgstr "" - -#: src/iuse_actor.cpp -msgctxt "memorial_female" -msgid "Consumed mutagen." -msgstr "" - #: src/iuse_actor.cpp msgid "You suddenly feel dizzy, and collapse to the ground." msgstr "" @@ -181457,16 +183436,6 @@ msgstr "" msgid " suddenly collapses to the ground!" msgstr "" -#: src/iuse_actor.cpp -msgctxt "memorial_male" -msgid "Injected mutagen." -msgstr "" - -#: src/iuse_actor.cpp -msgctxt "memorial_female" -msgid "Injected mutagen." -msgstr "" - #: src/iuse_actor.cpp #, c-format msgid "Put up the %s where (%dx%d clear area)?" @@ -181500,6 +183469,10 @@ msgstr "" msgid "Use this item to weigh yourself. Includes everything you are wearing." msgstr "" +#: src/iuse_actor.cpp +msgid "You cannot weigh yourself while mounted." +msgstr "" + #: src/iuse_actor.cpp #, c-format msgid "ERROR: Max weight of %.0f %s exceeded" @@ -182810,6 +184783,11 @@ msgstr "" msgid "ERROR: Invalid damage type string. Defaulting to none" msgstr "" +#: src/magic.cpp +#, c-format +msgid "You cast %s!" +msgstr "" + #: src/magic.cpp msgid "Too Difficult!" msgstr "" @@ -183669,10 +185647,6 @@ msgstr "" msgid "Bionic access" msgstr "" -#: src/mapgen.cpp -msgid "Manifest" -msgstr "" - #: src/mapgen.cpp msgid "Open Chambers" msgstr "" @@ -183907,6 +185881,10 @@ msgstr "" msgid "* Will only activate on a crit" msgstr "" +#: src/martialarts.cpp +msgid "* Moves target behind you" +msgstr "" + #: src/martialarts.cpp msgid "* Only works on a downed target" msgstr "" @@ -184059,6 +186037,11 @@ msgstr "" msgid "The %s leaps!" msgstr "" +#: src/mattack_actors.cpp +#, c-format +msgid "%s casts %s at %s!" +msgstr "" + #: src/mattack_actors.cpp src/monattack.cpp #, c-format msgid "The %s lunges at you, but you dodge!" @@ -184514,6 +186497,11 @@ msgstr "" msgid " thrashes %s" msgstr "" +#: src/melee.cpp +#, c-format +msgid " batters %s" +msgstr "" + #: src/melee.cpp #, c-format msgid " hits %s" @@ -184620,6 +186608,1227 @@ msgstr "" msgid "You failed to steal %1$s from %2$s." msgstr "" +#: src/memorial_logger.cpp +msgid "an unemployed male" +msgstr "" + +#: src/memorial_logger.cpp +msgid "an unemployed female" +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgid "a %s" +msgstr "" + +#. ~ First parameter is a pronoun ("He"/"She"), second parameter is a description +#. that designates the location relative to its surroundings. +#: src/memorial_logger.cpp +#, c-format +msgid "%1$s was killed in a %2$s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgid "Cataclysm - Dark Days Ahead version %s memorial file" +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgid "In memory of: %s" +msgstr "" + +#. ~ The "%s" will be replaced by an epitaph as displayed in the memorial files. Replace the quotation marks as appropriate for your language. +#: src/memorial_logger.cpp +#, c-format +msgctxt "epitaph" +msgid "\"%s\"" +msgstr "" + +#. ~ First parameter: Pronoun, second parameter: a profession name (with article) +#: src/memorial_logger.cpp +#, c-format +msgid "%1$s was %2$s when the apocalypse began." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgid "%1$s died on %2$s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgid "Cash on hand: %s" +msgstr "" + +#: src/memorial_logger.cpp +msgid "Final HP:" +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgid " Head: %d/%d" +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgid "Torso: %d/%d" +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgid "L Arm: %d/%d" +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgid "R Arm: %d/%d" +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgid "L Leg: %d/%d" +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgid "R Leg: %d/%d" +msgstr "" + +#: src/memorial_logger.cpp +msgid "Final Stats:" +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgid "Str %d" +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgid "Dex %d" +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgid "Int %d" +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgid "Per %d" +msgstr "" + +#: src/memorial_logger.cpp +msgid "Base Stats:" +msgstr "" + +#: src/memorial_logger.cpp +msgid "Final Messages:" +msgstr "" + +#: src/memorial_logger.cpp +msgid "No monsters were killed." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgid "Total kills: %d" +msgstr "" + +#: src/memorial_logger.cpp src/newcharacter.cpp +#: src/newcharacter.cpp +msgid "Skills:" +msgstr "" + +#. ~ 1. skill name, 2. skill level, 3. exercise percentage to next level +#: src/memorial_logger.cpp +#, c-format +msgid "%s: %d (%d %%)" +msgstr "" + +#: src/memorial_logger.cpp +msgid "Traits:" +msgstr "" + +#: src/memorial_logger.cpp +msgid "(None)" +msgstr "" + +#: src/memorial_logger.cpp +msgid "Ongoing Effects:" +msgstr "" + +#: src/memorial_logger.cpp +msgid "Bionics:" +msgstr "" + +#: src/memorial_logger.cpp +msgid "No bionics were installed." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgid "Bionic Power: %d/%d" +msgstr "" + +#: src/memorial_logger.cpp +msgid "Weapon:" +msgstr "" + +#: src/memorial_logger.cpp +msgid "Equipment:" +msgstr "" + +#: src/memorial_logger.cpp +msgid "Inventory:" +msgstr "" + +#: src/memorial_logger.cpp +msgid "Lifetime Stats" +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgid "Distance walked: %d squares" +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgid "Damage taken: %d damage" +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgid "Damage healed: %d damage" +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgid "Headshots: %d" +msgstr "" + +#: src/memorial_logger.cpp +msgid "Game History" +msgstr "" + +#. ~ %s is artifact name +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Activated the %s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Activated the %s." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Activated a mininuke." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Activated a mininuke." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Consumed mutagen." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Consumed mutagen." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Injected mutagen." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Injected mutagen." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Consumed purifier." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Consumed purifier." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Injected purifier." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Injected purifier." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Injected smart purifier." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Injected smart purifier." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Angered a group of amigara horrors!" +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Angered a group of amigara horrors!" +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Awoke a group of dark wyrms!" +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Awoke a group of dark wyrms!" +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Became wanted by the police!" +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Became wanted by the police!" +msgstr "" + +#. ~ %s is bodypart +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Broken %s began to mend." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Broken %s began to mend." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "You buried an unknown victim of the Cataclysm." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "You buried an unknown victim of The Cataclysm." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "You buried %s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "You buried %s." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Caused a resonance cascade." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Caused a resonance cascade." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Caught and killed an ape. Prey doesn't have a name." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Caught and killed an ape. Prey doesn't have a name." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Killed a delicious-looking innocent, %s, in cold blood." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Killed a delicious-looking innocent, %s, in cold blood." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Killed an innocent, %s, in cold blood. They were weak." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Killed an innocent, %s, in cold blood. They were weak." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Killed an innocent, %s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Killed an innocent, %s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "" +"Killed an innocent person, %s, in cold blood and felt terrible afterwards." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "" +"Killed an innocent person, %s, in cold blood and felt terrible afterwards." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Killed a %s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Killed a %s." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Stepped on bubble wrap." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Stepped on bubble wrap." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Stepped on glass." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Stepped on glass." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Caught by a beartrap." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Caught by a beartrap." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Stepped on a spiked board." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Stepped on a spiked board." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Stepped on a caltrop." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Stepped on a caltrop." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Stepped on a glass caltrop." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Stepped on a glass caltrop." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Tripped on a tripwire." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Tripped on a tripwire." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Triggered a crossbow trap." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Triggered a crossbow trap." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Triggered a shotgun trap." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Triggered a shotgun trap." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Triggered a blade trap." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Triggered a blade trap." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Triggered a light snare." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Triggered a light snare." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Triggered a heavy snare." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Triggered a heavy snare." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Stepped on a land mine." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Stepped on a land mine." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Triggered a booby trap." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Triggered a booby trap." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Triggered a teleport trap." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Triggered a teleport trap." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Stepped into thick goo." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Stepped into thick goo." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Stepped into a dissector." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Stepped into a dissector." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Fell in a pit." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Fell in a pit." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Fell into a spiked pit." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Fell into a spiked pit." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Fell into a pit filled with glass shards." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Fell into a pit filled with glass shards." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Stepped into lava." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Stepped into lava." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Stepped into a sinkhole." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Stepped into a sinkhole." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Fell down a ledge." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Fell down a ledge." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Triggered a flood trap." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Triggered a flood trap." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Triggered a shadow trap." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Triggered a shadow trap." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Triggered a life-draining trap." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Triggered a life-draining trap." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Triggered a shadow snake trap." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Triggered a shadow snake trap." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Consumed a %s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Consumed a %s." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Opened the Marloss Gateway." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Opened the Marloss Gateway." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Became one with the Mycus." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Became one with the Mycus." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Dermatik eggs hatched." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Dermatik eggs hatched." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Injected with dermatik eggs." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Injected with dermatik eggs." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Destroyed a triffid grove." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Destroyed a triffid grove." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Succumbed to an asthma attack." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Succumbed to an asthma attack." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Died of datura overdose." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Died of datura overdose." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Died of a healing stimulant overdose." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Died of a healing stimulant overdose." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Died of adrenaline overdose." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Died of adrenaline overdose." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Died of an alcohol overdose." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Died of an alcohol overdose." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Died of a drug overdose." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Died of a drug overdose." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Succumbed to the infection." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Succumbed to the infection." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Died of starvation." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Died of starvation." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Died of thirst." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Died of thirst." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Dug a shaft into lava." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Dug a shaft into lava." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Disarmed a nuclear missile." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Disarmed a nuclear missile." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Ate a sewage sample." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Ate a sewage sample." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "'%s' mutation turned into '%s'" +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "'%s' mutation turned into '%s'" +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Exhumed a grave." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Exhumed a grave." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Failed install of bionic: %s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Failed install of bionic: %s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Failed to remove bionic: %s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Failed to remove bionic: %s." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Succumbed to lack of sleep." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Succumbed to lack of sleep." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "The fuel tank of the %s exploded!" +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "The fuel tank of the %s exploded!" +msgstr "" + +#. ~ %s is addiction name +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Became addicted to %s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Became addicted to %s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Gained the mutation '%s'." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Gained the mutation '%s'." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Reached skill level %1$d in %2$s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Reached skill level %1$d in %2$s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "%s committed suicide." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "%s committed suicide." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "%s was killed." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "%s was killed." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Last words: %s" +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Last words: %s" +msgstr "" + +#. ~ %s is player name +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "%s began their journey into the Cataclysm." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "%s began their journey into the Cataclysm." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Installed bionic: %s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Installed bionic: %s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Installed bad bionic: %s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Installed bad bionic: %s." +msgstr "" + +#. ~ %s is terrain name +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Launched a nuke at a %s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Launched a nuke at a %s." +msgstr "" + +#. ~ %s is martial art +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Learned %s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Learned %s." +msgstr "" + +#. ~ %s is addiction name +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Overcame addiction to %s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Overcame addiction to %s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "%s became hostile." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "%s became hostile." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Opened a portal." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Opened a portal." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Opened a strange temple." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Opened a strange temple." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Released subspace specimens." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Released subspace specimens." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Removed bionic: %s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Removed bionic: %s." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Sealed a Hazardous Material Sarcophagus." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Sealed a Hazardous Material Sarcophagus." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Telefragged a %s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Telefragged a %s." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Spontaneous teleport." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Spontaneous teleport." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_male" +msgid "Teleported into a %s." +msgstr "" + +#: src/memorial_logger.cpp +#, c-format +msgctxt "memorial_female" +msgid "Teleported into a %s." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Terminated subspace specimens." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Terminated subspace specimens." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Threw up." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Threw up." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_male" +msgid "Set off an alarm." +msgstr "" + +#: src/memorial_logger.cpp +msgctxt "memorial_female" +msgid "Set off an alarm." +msgstr "" + #. ~ Message %s on the message log was repeated %d times, e.g. "You hear a whack! x 12" #: src/messages.cpp #, c-format @@ -186073,16 +189282,6 @@ msgstr "" msgid "The %1$s sinks its ovipositor into your %2$s!" msgstr "" -#: src/monattack.cpp -msgctxt "memorial_male" -msgid "Injected with dermatik eggs." -msgstr "" - -#: src/monattack.cpp -msgctxt "memorial_female" -msgid "Injected with dermatik eggs." -msgstr "" - #: src/monattack.cpp #, c-format msgid "The %s dermatik larva grows into an adult!" @@ -186209,6 +189408,11 @@ msgstr "" msgid "The %s tries to grab you as well, but you bat it away!" msgstr "" +#: src/monattack.cpp +#, c-format +msgid "The %s tries to grab you..." +msgstr "" + #: src/monattack.cpp #, c-format msgid "The %s grabs !" @@ -187391,21 +190595,6 @@ msgstr "" msgid "You do not have the required ID card to activate this mech." msgstr "" -#: src/monexamine.cpp -#, c-format -msgid "You remove the %s's harness." -msgstr "" - -#: src/monexamine.cpp -#, c-format -msgid "You climb on the %s." -msgstr "" - -#: src/monexamine.cpp -#, c-format -msgid "You hear your %s whir to life." -msgstr "" - #: src/monexamine.cpp #, c-format msgid "You swap positions with your %s." @@ -187700,6 +190889,15 @@ msgstr "" msgid " Difficulty " msgstr "" +#: src/monster.cpp src/npc.cpp +msgid "Aware of your presence!" +msgstr "" + +#: src/monster.cpp +#, c-format +msgid "Rider: %s" +msgstr "" + #: src/monster.cpp msgid "Difficulty " msgstr "" @@ -187869,6 +191067,11 @@ msgstr "" msgid "The %1$s hits your %2$s." msgstr "" +#: src/monster.cpp +#, c-format +msgid "Your %s hits %s for %d damage!" +msgstr "" + #. ~ 1$s is attacker name, 2$s is target name, 3$s is bodypart name in accusative. #: src/monster.cpp #, c-format @@ -188009,18 +191212,6 @@ msgstr "" msgid "VMMMMMMMMM!" msgstr "" -#: src/monster.cpp -#, c-format -msgctxt "memorial_male" -msgid "Killed a %s." -msgstr "" - -#: src/monster.cpp -#, c-format -msgctxt "memorial_female" -msgid "Killed a %s." -msgstr "" - #: src/monster.cpp #, c-format msgid "Your %s emits a beeping noise as its batteries start to get low." @@ -188176,18 +191367,6 @@ msgstr "" msgid "'s %1$s mutation turns into %2$s!" msgstr "" -#: src/mutation.cpp -#, c-format -msgctxt "memorial_male" -msgid "'%s' mutation turned into '%s'" -msgstr "" - -#: src/mutation.cpp -#, c-format -msgctxt "memorial_female" -msgid "'%s' mutation turned into '%s'" -msgstr "" - #: src/mutation.cpp #, c-format msgid "Your innate %1$s trait turns into %2$s!" @@ -188208,18 +191387,6 @@ msgstr "" msgid " gains a mutation called %s!" msgstr "" -#: src/mutation.cpp -#, c-format -msgctxt "memorial_male" -msgid "Gained the mutation '%s'." -msgstr "" - -#: src/mutation.cpp -#, c-format -msgctxt "memorial_female" -msgid "Gained the mutation '%s'." -msgstr "" - #: src/mutation.cpp #, c-format msgid "Your %1$s mutation turns into %2$s." @@ -189266,66 +192433,6 @@ msgstr "" msgid "%s dies!" msgstr "" -#: src/npc.cpp -msgctxt "memorial_male" -msgid "Caught and killed an ape. Prey doesn't have a name." -msgstr "" - -#: src/npc.cpp -msgctxt "memorial_female" -msgid "Caught and killed an ape. Prey doesn't have a name." -msgstr "" - -#: src/npc.cpp -#, c-format -msgctxt "memorial_male" -msgid "Killed a delicious-looking innocent, %s, in cold blood." -msgstr "" - -#: src/npc.cpp -#, c-format -msgctxt "memorial_female" -msgid "Killed a delicious-looking innocent, %s, in cold blood." -msgstr "" - -#: src/npc.cpp -#, c-format -msgctxt "memorial_male" -msgid "Killed an innocent, %s, in cold blood. They were weak." -msgstr "" - -#: src/npc.cpp -#, c-format -msgctxt "memorial_female" -msgid "Killed an innocent, %s, in cold blood. They were weak." -msgstr "" - -#: src/npc.cpp -#, c-format -msgctxt "memorial_male" -msgid "Killed an innocent, %s." -msgstr "" - -#: src/npc.cpp -#, c-format -msgctxt "memorial_female" -msgid "Killed an innocent, %s." -msgstr "" - -#: src/npc.cpp -#, c-format -msgctxt "memorial_male" -msgid "" -"Killed an innocent person, %s, in cold blood and felt terrible afterwards." -msgstr "" - -#: src/npc.cpp -#, c-format -msgctxt "memorial_female" -msgid "" -"Killed an innocent person, %s, in cold blood and felt terrible afterwards." -msgstr "" - #: src/npc.cpp msgid "Ignoring" msgstr "" @@ -189483,21 +192590,11 @@ msgstr "" msgid "Hold on, I want to pick up that %s." msgstr "" -#: src/npcmove.cpp -#, c-format -msgid "%1$s picks up a %2$s." -msgstr "" - #: src/npcmove.cpp #, c-format msgid "%1$s picks up a %2$s and a %3$s." msgstr "" -#: src/npcmove.cpp -#, c-format -msgid "%s picks up several items." -msgstr "" - #: src/npcmove.cpp #, c-format msgid "%s looks around nervously, as if searching for something." @@ -189524,11 +192621,6 @@ msgstr "" msgid "Hold on, I want to pulp that %s." msgstr "" -#: src/npcmove.cpp -#, c-format -msgid "%s completed the assigned task." -msgstr "" - #: src/npcmove.cpp #, c-format msgid "%1$s throws a %2$s." @@ -189734,6 +192826,14 @@ msgstr "" msgid "Yell a sentence" msgstr "" +#: src/npctalk.cpp +msgid "Whistle at your animals pulling vehicles to follow you." +msgstr "" + +#: src/npctalk.cpp +msgid "Whistle at your animals pulling vehicles to stop following you." +msgstr "" + #: src/npctalk.cpp #, c-format msgid "Tell %s to follow" @@ -189756,6 +192856,14 @@ msgstr "" msgid "Tell everyone on your team to wake up" msgstr "" +#: src/npctalk.cpp +msgid "Tell everyone on your team to mount up" +msgstr "" + +#: src/npctalk.cpp +msgid "Tell everyone on your team to dismount" +msgstr "" + #: src/npctalk.cpp msgid "Tell everyone on your team to prepare for danger" msgstr "" @@ -189810,6 +192918,14 @@ msgstr "" msgid "Stay awake!" msgstr "" +#: src/npctalk.cpp +msgid "Mount up!" +msgstr "" + +#: src/npctalk.cpp +msgid "Dismount!" +msgstr "" + #: src/npctalk.cpp msgid "" "We're in danger. Stay awake, stay close, don't go wandering off, and don't " @@ -190000,10 +193116,10 @@ msgstr "" msgid "%s ( cost $%d )" msgstr "" -#. ~Skill name: current level (exercise) -> next level (cost in dollars) +#. ~Skill name: current level (exercise) -> next level (exercise) (cost in dollars) #: src/npctalk.cpp #, c-format -msgid "%s: %d (%d%%) -> %d (cost $%d)" +msgid "%s: %d (%d%%) -> %d (%d%%) (cost $%d)" msgstr "" #: src/npctalk.cpp @@ -190141,6 +193257,11 @@ msgstr "" msgid "%1$s gives you %2$s." msgstr "" +#: src/npctalk.cpp +#, c-format +msgid "You learn how to craft %s." +msgstr "" + #: src/npctalk.cpp msgid "I don't trust you enough to eat THIS..." msgstr "" @@ -190351,18 +193472,6 @@ msgstr "" msgid "%s turns hostile!" msgstr "" -#: src/npctalk_funcs.cpp -#, c-format -msgctxt "memorial_male" -msgid "%s became hostile." -msgstr "" - -#: src/npctalk_funcs.cpp -#, c-format -msgctxt "memorial_female" -msgid "%s became hostile." -msgstr "" - #: src/npctalk_funcs.cpp #, c-format msgid "%s turns to flee!" @@ -190854,14 +193963,6 @@ msgid "" "deathcam." msgstr "" -#: src/options.cpp -msgid "Always" -msgstr "" - -#: src/options.cpp -msgid "Never" -msgstr "" - #: src/options.cpp msgid "Sound Enabled" msgstr "" @@ -191294,10 +194395,6 @@ msgstr "" msgid "Disabled" msgstr "" -#: src/options.cpp -msgid "Enabled" -msgstr "" - #: src/options.cpp msgid "Favorites" msgstr "" @@ -192675,7 +195772,7 @@ msgstr "" msgid "$%.2f" msgstr "" -#: src/overmap.cpp +#: src/overmap.cpp src/skill.cpp msgid "invalid" msgstr "" @@ -193451,6 +196548,10 @@ msgstr "" msgid "Spill %s, then pick up %s" msgstr "" +#: src/pickup.cpp +msgid "Picking up this item will be considered stealing, continue?" +msgstr "" + #: src/pickup.cpp #, c-format msgid "The %s is too heavy!" @@ -193719,7 +196820,7 @@ msgstr "" msgid "Your ground sonar detected a %1$s to the %2$s!" msgstr "" -#: src/player.cpp +#: src/player.cpp src/vehicle_move.cpp #, c-format msgid "You've spotted a %1$s to the %2$s!" msgstr "" @@ -193926,16 +197027,6 @@ msgstr "" msgid "You have a sudden heart attack!" msgstr "" -#: src/player.cpp -msgctxt "memorial_male" -msgid "Died of a drug overdose." -msgstr "" - -#: src/player.cpp -msgctxt "memorial_female" -msgid "Died of a drug overdose." -msgstr "" - #: src/player.cpp msgid "Your breathing stops completely." msgstr "" @@ -193948,54 +197039,14 @@ msgstr "" msgid "Your heart spasms and stops." msgstr "" -#: src/player.cpp -msgctxt "memorial_male" -msgid "Died of a healing stimulant overdose." -msgstr "" - -#: src/player.cpp -msgctxt "memorial_female" -msgid "Died of a healing stimulant overdose." -msgstr "" - -#: src/player.cpp -msgctxt "memorial_male" -msgid "Died of adrenaline overdose." -msgstr "" - -#: src/player.cpp -msgctxt "memorial_female" -msgid "Died of adrenaline overdose." -msgstr "" - #: src/player.cpp msgid "Your breathing slows down to a stop." msgstr "" -#: src/player.cpp -msgctxt "memorial_male" -msgid "Died of an alcohol overdose." -msgstr "" - -#: src/player.cpp -msgctxt "memorial_female" -msgid "Died of an alcohol overdose." -msgstr "" - #: src/player.cpp msgid "You have starved to death." msgstr "" -#: src/player.cpp -msgctxt "memorial_male" -msgid "Died of starvation." -msgstr "" - -#: src/player.cpp -msgctxt "memorial_female" -msgid "Died of starvation." -msgstr "" - #: src/player.cpp msgid "Food..." msgstr "" @@ -194016,16 +197067,6 @@ msgstr "" msgid "You have died of dehydration." msgstr "" -#: src/player.cpp -msgctxt "memorial_male" -msgid "Died of thirst." -msgstr "" - -#: src/player.cpp -msgctxt "memorial_female" -msgid "Died of thirst." -msgstr "" - #: src/player.cpp msgid "Even your eyes feel dry..." msgstr "" @@ -194042,16 +197083,6 @@ msgstr "" msgid "Survivor sleep now." msgstr "" -#: src/player.cpp -msgctxt "memorial_male" -msgid "Succumbed to lack of sleep." -msgstr "" - -#: src/player.cpp -msgctxt "memorial_female" -msgid "Succumbed to lack of sleep." -msgstr "" - #: src/player.cpp msgid "Anywhere would be a good place to sleep..." msgstr "" @@ -194128,31 +197159,6 @@ msgstr "" msgid "Disinfected wounds on your %s was healed." msgstr "" -#: src/player.cpp -#, c-format -msgctxt "memorial_male" -msgid "Became addicted to %s." -msgstr "" - -#: src/player.cpp -#, c-format -msgctxt "memorial_female" -msgid "Became addicted to %s." -msgstr "" - -#. ~ %s is addiction name -#: src/player.cpp -#, c-format -msgctxt "memorial_male" -msgid "Overcame addiction to %s." -msgstr "" - -#: src/player.cpp -#, c-format -msgctxt "memorial_female" -msgid "Overcame addiction to %s." -msgstr "" - #: src/player.cpp #, c-format msgid "There is not enough %s left to siphon it." @@ -194885,19 +197891,6 @@ msgstr "" msgid "Your radiation badge changes from %1$s to %2$s!" msgstr "" -#. ~ %s is bodypart -#: src/player.cpp -#, c-format -msgctxt "memorial_male" -msgid "Broken %s began to mend." -msgstr "" - -#: src/player.cpp -#, c-format -msgctxt "memorial_female" -msgid "Broken %s began to mend." -msgstr "" - #. ~ %s is bodypart #: src/player.cpp #, c-format @@ -195632,14 +198625,37 @@ msgstr "" msgid "Your body strains under the weight!" msgstr "" +#: src/player.cpp +#, c-format +msgid "You remove the %s's harness." +msgstr "" + +#: src/player.cpp +#, c-format +msgid "You climb on the %s." +msgstr "" + +#: src/player.cpp +#, c-format +msgid "You hear your %s whir to life." +msgstr "" + #: src/player.cpp msgid "You are ejected from your mech!" msgstr "" +#: src/player.cpp +msgid " is ejected from their mech!" +msgstr "" + #: src/player.cpp msgid "You fall off your mount!" msgstr "" +#: src/player.cpp +msgid " falls off their mount!" +msgstr "" + #: src/player.cpp src/trapfunc.cpp msgid "You hurt yourself!" msgstr "" @@ -196320,16 +199336,6 @@ msgstr "" msgid "Insects begin to emerge from 's skin!" msgstr "" -#: src/player_hardcoded_effects.cpp -msgctxt "memorial_male" -msgid "Dermatik eggs hatched." -msgstr "" - -#: src/player_hardcoded_effects.cpp -msgctxt "memorial_female" -msgid "Dermatik eggs hatched." -msgstr "" - #. ~ %s is bodypart in accusative. #: src/player_hardcoded_effects.cpp #, c-format @@ -196382,16 +199388,6 @@ msgstr "" msgid "Glowing lights surround you, and you teleport." msgstr "" -#: src/player_hardcoded_effects.cpp -msgctxt "memorial_male" -msgid "Spontaneous teleport." -msgstr "" - -#: src/player_hardcoded_effects.cpp -msgctxt "memorial_female" -msgid "Spontaneous teleport." -msgstr "" - #: src/player_hardcoded_effects.cpp msgid "You pass out." msgstr "" @@ -196422,16 +199418,6 @@ msgid "" "You asphyxiate." msgstr "" -#: src/player_hardcoded_effects.cpp -msgctxt "memorial_male" -msgid "Succumbed to an asthma attack." -msgstr "" - -#: src/player_hardcoded_effects.cpp -msgctxt "memorial_female" -msgid "Succumbed to an asthma attack." -msgstr "" - #: src/player_hardcoded_effects.cpp msgid "You wheeze and gasp for air." msgstr "" @@ -196515,16 +199501,6 @@ msgid "" "nebulae and you are no more." msgstr "" -#: src/player_hardcoded_effects.cpp -msgctxt "memorial_male" -msgid "Died of datura overdose." -msgstr "" - -#: src/player_hardcoded_effects.cpp -msgctxt "memorial_female" -msgid "Died of datura overdose." -msgstr "" - #. ~ %s is bodypart name. #: src/player_hardcoded_effects.cpp #, c-format @@ -196535,16 +199511,6 @@ msgstr "" msgid "You succumb to the infection." msgstr "" -#: src/player_hardcoded_effects.cpp -msgctxt "memorial_male" -msgid "Succumbed to the infection." -msgstr "" - -#: src/player_hardcoded_effects.cpp -msgctxt "memorial_female" -msgid "Succumbed to the infection." -msgstr "" - #: src/player_hardcoded_effects.cpp msgid "You feel well rested." msgstr "" @@ -196682,22 +199648,22 @@ msgstr "" #: src/ranged.cpp #, c-format -msgid "Your %s is clogged up with blackpowder fouling!" +msgid "Your %s fails to cycle!" msgstr "" #: src/ranged.cpp #, c-format -msgid "'s %s is clogged up with blackpowder fouling!" +msgid "'s %s fails to cycle!" msgstr "" #: src/ranged.cpp #, c-format -msgid "Your %s fails to cycle!" +msgid "Your %s is clogged up with blackpowder fouling!" msgstr "" #: src/ranged.cpp #, c-format -msgid "'s %s fails to cycle!" +msgid "'s %s is clogged up with blackpowder fouling!" msgstr "" #: src/ranged.cpp @@ -196710,6 +199676,11 @@ msgstr "" msgid "You hear %s." msgstr "" +#: src/ranged.cpp +#, c-format +msgid "You cycle your %s manually." +msgstr "" + #: src/ranged.cpp #, c-format msgid "You feel a surge of euphoria as flames roar out of the %s!" @@ -197232,6 +200203,10 @@ msgid "" "Sets which video display will be used to show the game. Requires restart." msgstr "" +#: src/skill.cpp +msgid "The zen-most skill there is." +msgstr "" + #: src/sounds.cpp msgid "Your eardrums suddenly ache!" msgstr "" @@ -197284,16 +200259,6 @@ msgstr "" msgid "d: delete history" msgstr "" -#: src/timed_event.cpp -msgctxt "memorial_male" -msgid "Became wanted by the police!" -msgstr "" - -#: src/timed_event.cpp -msgctxt "memorial_female" -msgid "Became wanted by the police!" -msgstr "" - #: src/timed_event.cpp msgctxt "memorial_male" msgid "Drew the attention of more dark wyrms!" @@ -197312,36 +200277,6 @@ msgstr "" msgid "The eye you're carrying lets out a tortured scream!" msgstr "" -#: src/timed_event.cpp -msgctxt "memorial_male" -msgid "Angered a group of amigara horrors!" -msgstr "" - -#: src/timed_event.cpp -msgctxt "memorial_female" -msgid "Angered a group of amigara horrors!" -msgstr "" - -#: src/timed_event.cpp -msgctxt "memorial_male" -msgid "Destroyed a triffid grove." -msgstr "" - -#: src/timed_event.cpp -msgctxt "memorial_female" -msgid "Destroyed a triffid grove." -msgstr "" - -#: src/timed_event.cpp -msgctxt "memorial_male" -msgid "Opened a strange temple." -msgstr "" - -#: src/timed_event.cpp -msgctxt "memorial_female" -msgid "Opened a strange temple." -msgstr "" - #: src/timed_event.cpp msgid "The nearby grates open to reveal a staircase!" msgstr "" @@ -197418,25 +200353,11 @@ msgstr "" msgid " steps on some bubble wrap!" msgstr "" -#: src/trapfunc.cpp -msgctxt "memorial_male" -msgid "Stepped on bubble wrap." -msgstr "" - -#: src/trapfunc.cpp -msgctxt "memorial_female" -msgid "Stepped on bubble wrap." -msgstr "" - #: src/trapfunc.cpp #, c-format msgid "Your %s steps on some bubble wrap!" msgstr "" -#: src/trapfunc.cpp -msgid "Pop!" -msgstr "" - #: src/trapfunc.cpp msgid "You step on some glass!" msgstr "" @@ -197445,16 +200366,6 @@ msgstr "" msgid " steps on some glass!" msgstr "" -#: src/trapfunc.cpp -msgctxt "memorial_male" -msgid "Stepped on glass." -msgstr "" - -#: src/trapfunc.cpp -msgctxt "memorial_female" -msgid "Stepped on glass." -msgstr "" - #: src/trapfunc.cpp msgid "glass cracking!" msgstr "" @@ -197464,20 +200375,6 @@ msgstr "" msgid "The %s stumbles over the cot" msgstr "" -#: src/trapfunc.cpp -msgid "SNAP!" -msgstr "" - -#: src/trapfunc.cpp -msgctxt "memorial_male" -msgid "Caught by a beartrap." -msgstr "" - -#: src/trapfunc.cpp -msgctxt "memorial_female" -msgid "Caught by a beartrap." -msgstr "" - #: src/trapfunc.cpp msgid "A bear trap closes on your foot!" msgstr "" @@ -197491,16 +200388,6 @@ msgstr "" msgid "Your %s is caught by a beartrap!" msgstr "" -#: src/trapfunc.cpp -msgctxt "memorial_male" -msgid "Stepped on a spiked board." -msgstr "" - -#: src/trapfunc.cpp -msgctxt "memorial_female" -msgid "Stepped on a spiked board." -msgstr "" - #: src/trapfunc.cpp msgid "You step on a spiked board!" msgstr "" @@ -197514,16 +200401,6 @@ msgstr "" msgid "Your %s stepped on a spiked board!" msgstr "" -#: src/trapfunc.cpp -msgctxt "memorial_male" -msgid "Stepped on a caltrop." -msgstr "" - -#: src/trapfunc.cpp -msgctxt "memorial_female" -msgid "Stepped on a caltrop." -msgstr "" - #: src/trapfunc.cpp msgid "You step on a sharp metal caltrop!" msgstr "" @@ -197537,16 +200414,6 @@ msgstr "" msgid "Your %s steps on a sharp metal caltrop!" msgstr "" -#: src/trapfunc.cpp -msgctxt "memorial_male" -msgid "Stepped on a glass caltrop." -msgstr "" - -#: src/trapfunc.cpp -msgctxt "memorial_female" -msgid "Stepped on a glass caltrop." -msgstr "" - #: src/trapfunc.cpp msgid "You step on a sharp glass caltrop!" msgstr "" @@ -197559,16 +200426,6 @@ msgstr "" msgid "The shards shatter!" msgstr "" -#: src/trapfunc.cpp -msgctxt "memorial_male" -msgid "Tripped on a tripwire." -msgstr "" - -#: src/trapfunc.cpp -msgctxt "memorial_female" -msgid "Tripped on a tripwire." -msgstr "" - #: src/trapfunc.cpp msgid "You trip over a tripwire!" msgstr "" @@ -197595,16 +200452,6 @@ msgstr "" msgid " triggers a crossbow trap!" msgstr "" -#: src/trapfunc.cpp -msgctxt "memorial_male" -msgid "Triggered a crossbow trap." -msgstr "" - -#: src/trapfunc.cpp -msgctxt "memorial_female" -msgid "Triggered a crossbow trap." -msgstr "" - #. ~ %s is bodypart #: src/trapfunc.cpp #, c-format @@ -197646,16 +200493,6 @@ msgstr "" msgid " triggers a shotgun trap!" msgstr "" -#: src/trapfunc.cpp -msgctxt "memorial_male" -msgid "Triggered a shotgun trap." -msgstr "" - -#: src/trapfunc.cpp -msgctxt "memorial_female" -msgid "Triggered a shotgun trap." -msgstr "" - #: src/trapfunc.cpp #, c-format msgid "A shotgun fires and hits the %s!" @@ -197674,16 +200511,6 @@ msgstr "" msgid "A blade swings out and hacks s torso!" msgstr "" -#: src/trapfunc.cpp -msgctxt "memorial_male" -msgid "Triggered a blade trap." -msgstr "" - -#: src/trapfunc.cpp -msgctxt "memorial_female" -msgid "Triggered a blade trap." -msgstr "" - #: src/trapfunc.cpp msgid "Snap!" msgstr "" @@ -197701,16 +200528,6 @@ msgstr "" msgid "A snare closes on s leg." msgstr "" -#: src/trapfunc.cpp -msgctxt "memorial_male" -msgid "Triggered a light snare." -msgstr "" - -#: src/trapfunc.cpp -msgctxt "memorial_female" -msgid "Triggered a light snare." -msgstr "" - #: src/trapfunc.cpp #, c-format msgid "A snare closes on your %s's leg" @@ -197726,16 +200543,6 @@ msgstr "" msgid "A snare closes on s %s." msgstr "" -#: src/trapfunc.cpp -msgctxt "memorial_male" -msgid "Triggered a heavy snare." -msgstr "" - -#: src/trapfunc.cpp -msgctxt "memorial_female" -msgid "Triggered a heavy snare." -msgstr "" - #: src/trapfunc.cpp msgid "You trigger a land mine!" msgstr "" @@ -197744,16 +200551,6 @@ msgstr "" msgid " triggers a land mine!" msgstr "" -#: src/trapfunc.cpp -msgctxt "memorial_male" -msgid "Stepped on a land mine." -msgstr "" - -#: src/trapfunc.cpp -msgctxt "memorial_female" -msgid "Stepped on a land mine." -msgstr "" - #: src/trapfunc.cpp msgid "You trigger a booby trap!" msgstr "" @@ -197762,16 +200559,6 @@ msgstr "" msgid " triggers a booby trap!" msgstr "" -#: src/trapfunc.cpp -msgctxt "memorial_male" -msgid "Triggered a booby trap." -msgstr "" - -#: src/trapfunc.cpp -msgctxt "memorial_female" -msgid "Triggered a booby trap." -msgstr "" - #. ~ the sound of a telepad functioning #: src/trapfunc.cpp msgid "vvrrrRRMM*POP!*" @@ -197781,16 +200568,6 @@ msgstr "" msgid "The air shimmers around you..." msgstr "" -#: src/trapfunc.cpp -msgctxt "memorial_male" -msgid "Triggered a teleport trap." -msgstr "" - -#: src/trapfunc.cpp -msgctxt "memorial_female" -msgid "Triggered a teleport trap." -msgstr "" - #: src/trapfunc.cpp #, c-format msgid "The air shimmers around the %s..." @@ -197804,16 +200581,6 @@ msgstr "" msgid " steps in a puddle of thick goo." msgstr "" -#: src/trapfunc.cpp -msgctxt "memorial_male" -msgid "Stepped into thick goo." -msgstr "" - -#: src/trapfunc.cpp -msgctxt "memorial_female" -msgid "Stepped into thick goo." -msgstr "" - #: src/trapfunc.cpp msgid "The acidic goo eats away at your feet." msgstr "" @@ -197826,11 +200593,6 @@ msgstr "" msgid "The dissector lights up, and shuts down." msgstr "" -#. ~ the sound of a dissector dissecting -#: src/trapfunc.cpp -msgid "BRZZZAP!" -msgstr "" - #: src/trapfunc.cpp msgid "Electrical beams emit from the floor and slice your flesh!" msgstr "" @@ -197839,16 +200601,6 @@ msgstr "" msgid "Electrical beams emit from the floor and slice s flesh!" msgstr "" -#: src/trapfunc.cpp -msgctxt "memorial_male" -msgid "Stepped into a dissector." -msgstr "" - -#: src/trapfunc.cpp -msgctxt "memorial_female" -msgid "Stepped into a dissector." -msgstr "" - #: src/trapfunc.cpp #, c-format msgid "Electrical beams emit from the floor and slice your %s!" @@ -197862,16 +200614,6 @@ msgstr "" msgid "You fall in a pit!" msgstr "" -#: src/trapfunc.cpp -msgctxt "memorial_male" -msgid "Fell in a pit." -msgstr "" - -#: src/trapfunc.cpp -msgctxt "memorial_female" -msgid "Fell in a pit." -msgstr "" - #: src/trapfunc.cpp msgid "You flap your wings and flutter down gracefully." msgstr "" @@ -197899,16 +200641,6 @@ msgstr "" msgid " falls in a spiked pit!" msgstr "" -#: src/trapfunc.cpp -msgctxt "memorial_male" -msgid "Fell into a spiked pit." -msgstr "" - -#: src/trapfunc.cpp -msgctxt "memorial_female" -msgid "Fell into a spiked pit." -msgstr "" - #: src/trapfunc.cpp msgid "You avoid the spikes within." msgstr "" @@ -197930,16 +200662,6 @@ msgstr "" msgid " falls in pit filled with glass shards!" msgstr "" -#: src/trapfunc.cpp -msgctxt "memorial_male" -msgid "Fell into a pit filled with glass shards." -msgstr "" - -#: src/trapfunc.cpp -msgctxt "memorial_female" -msgid "Fell into a pit filled with glass shards." -msgstr "" - #: src/trapfunc.cpp msgid "You avoid the glass shards within." msgstr "" @@ -197959,16 +200681,6 @@ msgstr "" msgid "The %s burns you horribly!" msgstr "" -#: src/trapfunc.cpp -msgctxt "memorial_male" -msgid "Stepped into lava." -msgstr "" - -#: src/trapfunc.cpp -msgctxt "memorial_female" -msgid "Stepped into lava." -msgstr "" - #: src/trapfunc.cpp #, c-format msgid "Your %s is burned by the lava!" @@ -197996,16 +200708,6 @@ msgstr "" msgid "Your %s falls into a sinkhole!" msgstr "" -#: src/trapfunc.cpp -msgctxt "memorial_male" -msgid "Stepped into a sinkhole." -msgstr "" - -#: src/trapfunc.cpp -msgctxt "memorial_female" -msgid "Stepped into a sinkhole." -msgstr "" - #: src/trapfunc.cpp msgid "" "You step into a sinkhole! Throw your grappling hook out to try to catch " @@ -198042,16 +200744,6 @@ msgstr "" msgid "You fall down a level!" msgstr "" -#: src/trapfunc.cpp -msgctxt "memorial_male" -msgid "Fell down a ledge." -msgstr "" - -#: src/trapfunc.cpp -msgctxt "memorial_female" -msgid "Fell down a ledge." -msgstr "" - #: src/trapfunc.cpp msgid " falls down a level!" msgstr "" @@ -198069,16 +200761,6 @@ msgstr "" msgid "You step on a loose tile, and water starts to flood the room!" msgstr "" -#: src/trapfunc.cpp -msgctxt "memorial_male" -msgid "Triggered a flood trap." -msgstr "" - -#: src/trapfunc.cpp -msgctxt "memorial_female" -msgid "Triggered a flood trap." -msgstr "" - #: src/trapfunc.cpp msgid "You hear the grinding of shifting rock." msgstr "" @@ -198115,45 +200797,15 @@ msgstr "" msgid "VRMMMMMM" msgstr "" -#: src/trapfunc.cpp -msgctxt "memorial_male" -msgid "Triggered a shadow trap." -msgstr "" - -#: src/trapfunc.cpp -msgctxt "memorial_female" -msgid "Triggered a shadow trap." -msgstr "" - #: src/trapfunc.cpp msgid "You feel your life force sapping away." msgstr "" -#: src/trapfunc.cpp -msgctxt "memorial_male" -msgid "Triggered a life-draining trap." -msgstr "" - -#: src/trapfunc.cpp -msgctxt "memorial_female" -msgid "Triggered a life-draining trap." -msgstr "" - #. ~ the sound a snake makes #: src/trapfunc.cpp msgid "ssssssss" msgstr "" -#: src/trapfunc.cpp -msgctxt "memorial_male" -msgid "Triggered a shadow snake trap." -msgstr "" - -#: src/trapfunc.cpp -msgctxt "memorial_female" -msgid "Triggered a shadow snake trap." -msgstr "" - #: src/trapfunc.cpp msgid "A shadowy snake forms nearby." msgstr "" @@ -198785,6 +201437,11 @@ msgstr "" msgid "Yours" msgstr "" +#: src/veh_interact.cpp +#, c-format +msgid "%s (%s)" +msgstr "" + #: src/veh_interact.cpp msgid "not owned" msgstr "" @@ -198817,10 +201474,6 @@ msgstr "" msgid "unloa" msgstr "" -#: src/veh_interact.cpp -msgid "hange tire" -msgstr "" - #: src/veh_interact.cpp msgid "cre" msgstr "" @@ -198960,10 +201613,6 @@ msgstr "" msgid "wrecked" msgstr "" -#: src/veh_interact.cpp -msgid "Use which gizmo?" -msgstr "" - #: src/veh_interact.cpp msgid "Select tank to siphon:" msgstr "" @@ -199016,27 +201665,27 @@ msgstr "" #: src/veh_interact.cpp #, c-format -msgid "You don't meet the requirements to remove the %s." +msgid "The %s has already been removed by someone else." msgstr "" #: src/veh_interact.cpp #, c-format -msgid "You remove the broken %1$s from the %2$s." +msgid "You don't meet the requirements to remove the %s." msgstr "" #: src/veh_interact.cpp #, c-format -msgid "You remove the %1$s from the %2$s." +msgid "You remove the broken %1$s from the %2$s." msgstr "" #: src/veh_interact.cpp #, c-format -msgid "You completely dismantle the %s." +msgid "You remove the %1$s from the %2$s." msgstr "" #: src/veh_interact.cpp #, c-format -msgid "You replace one of the %1$s's tires with a %2$s." +msgid "You completely dismantle the %s." msgstr "" #: src/veh_type.cpp @@ -199084,30 +201733,6 @@ msgstr "" msgid "a loud BANG! from the %s" msgstr "" -#: src/vehicle.cpp -msgid "Remove attached alternator first." -msgstr "" - -#: src/vehicle.cpp -msgid "Remove attached seatbelt first." -msgstr "" - -#: src/vehicle.cpp -msgid "Remove attached curtains first." -msgstr "" - -#: src/vehicle.cpp -msgid "Remove attached part first." -msgstr "" - -#: src/vehicle.cpp -msgid "Remove battery from mount first." -msgstr "" - -#: src/vehicle.cpp -msgid "Remove attached mounted weapon first." -msgstr "" - #: src/vehicle.cpp msgid "Remove carried animal first." msgstr "" @@ -199248,18 +201873,6 @@ msgstr "" msgid "The %1$s's %2$s is destroyed!" msgstr "" -#: src/vehicle.cpp -#, c-format -msgctxt "memorial_male" -msgid "The fuel tank of the %s exploded!" -msgstr "" - -#: src/vehicle.cpp -#, c-format -msgctxt "memorial_female" -msgid "The fuel tank of the %s exploded!" -msgstr "" - #: src/vehicle_display.cpp msgid "More parts here..." msgstr "" @@ -200041,17 +202654,15 @@ msgid "" msgstr "" #: src/vehicle_use.cpp -msgid "Where is the creature to harness?" +msgid "The harness is blocked." msgstr "" #: src/vehicle_use.cpp -#, c-format -msgid "You harness your %s to the %s." +msgid "Where is the creature to harness?" msgstr "" #: src/vehicle_use.cpp -#, c-format -msgid "You untie your %s." +msgid "No creature there." msgstr "" #: src/vehicle_use.cpp @@ -200063,11 +202674,13 @@ msgid "This creature cannot be harnessed." msgstr "" #: src/vehicle_use.cpp -msgid "The harness is blocked." +#, c-format +msgid "You harness your %s to the %s." msgstr "" #: src/vehicle_use.cpp -msgid "No creature there." +#, c-format +msgid "You untie your %s." msgstr "" #: src/vehicle_use.cpp @@ -200098,6 +202711,10 @@ msgstr "" msgid "Activate the dishwasher (1.5 hours)" msgstr "" +#: src/vehicle_use.cpp +msgid "Peek through the closed curtains" +msgstr "" + #: src/vehicle_use.cpp msgid "Use the hotplate" msgstr "" diff --git a/lang/po/de.po b/lang/po/de.po index be55b05f4e6d7..0d1e759a9e821 100644 --- a/lang/po/de.po +++ b/lang/po/de.po @@ -3,10 +3,10 @@ # Nico Brandt , 2018 # Enrico Grunitz, 2018 # OzoneH3 , 2018 -# Kitty M , 2018 # Robert Boettcher , 2018 -# Nipaporn P. , 2018 +# Kitty M , 2018 # Mark Bies, 2018 +# Nipaporn P. , 2018 # - - , 2018 # Tarnath , 2018 # Phil Mait , 2018 @@ -15,17 +15,17 @@ # Pupsi , 2019 # paraDiXson, 2019 # Sam Doe , 2019 -# Brett Dong , 2019 # Xtrem532 , 2019 # Wuzzy , 2019 # Vlasov Vitaly , 2019 +# Brett Dong , 2019 # kurtice087 , 2019 # msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.D\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-16 17:39+0800\n" +"POT-Creation-Date: 2019-08-23 23:11+0800\n" "PO-Revision-Date: 2018-04-26 14:47+0000\n" "Last-Translator: kurtice087 , 2019\n" "Language-Team: German (https://www.transifex.com/cataclysm-dda-translators/teams/2217/de/)\n" @@ -455,27 +455,6 @@ msgstr "" "Kupferfetzen. Könnten benutzt werden, um etwas zu fertigen, zum Beispiel " "selbstgemachte Flintenhülsen." -#: lang/json/AMMO_from_json.py -msgid "solder" -msgstr "Lötzinn" - -#. ~ Description for solder -#: lang/json/AMMO_from_json.py -msgid "" -"A small spool of solder, able to be used in ammunition and electronics." -msgstr "" -"Eine kleine Spule mit Lötzinn, verwendungsfertig für Munition und " -"Elektronik." - -#: lang/json/AMMO_from_json.py -msgid "tin" -msgstr "Zinn" - -#. ~ Description for tin -#: lang/json/AMMO_from_json.py -msgid "Tin and pewter scraps. Usable in making ammo." -msgstr "Zinn- und Hartzinnstücke. Nützlich für die Munitionsherstellung." - #: lang/json/AMMO_from_json.py msgid "medical tape" msgstr "medizinisches Band" @@ -494,6 +473,34 @@ msgstr "PG-7VL-93mm-Rakete" msgid "93mm single-stage high-explosive ammunition for the RPG-7." msgstr "93mm-Einstufen-Hochexplosiv-Munition für die RPG-7." +#: lang/json/AMMO_from_json.py +msgid "PG-7VR 64mm/105mm rocket" +msgstr "PG-7VR 64mm/105mm Rakete" + +#. ~ Description for PG-7VR 64mm/105mm rocket +#: lang/json/AMMO_from_json.py +msgid "64mm/105mm high-explosive tandem ammunition for the RPG-7." +msgstr "64mm/105mm Hochexplosive - Tandemmunition für den RPG-7." + +#: lang/json/AMMO_from_json.py +msgid "TBG-7V 105mm rocket" +msgstr "TBG-7V 105mm Rakete" + +#. ~ Description for TBG-7V 105mm rocket +#: lang/json/AMMO_from_json.py +msgid "105mm thermobaric ammunition for the RPG-7." +msgstr "105mm thermobarische Munition für den RPG-7." + +#: lang/json/AMMO_from_json.py +msgid "OG-7V 40mm rocket" +msgstr "OG-7V 40mm Rakete" + +#. ~ Description for OG-7V 40mm rocket +#: lang/json/AMMO_from_json.py +msgid "" +"40mm high-explosive fragmentation antipersonnel ammunition for the RPG-7." +msgstr "Hochexplosive 40mm Antiperson-Splittermunition für den RPG-7." + #: lang/json/AMMO_from_json.py msgid "M235 66mm TPA rocket" msgstr "M235-66mm-TPA-Rakete" @@ -1980,6 +1987,9 @@ msgid "" "roughly similar in properties to napalm b. It's meant to be used with a " "flamethrower." msgstr "" +"Ein entflammbares Gel, gemischt aus Benzin und aufgelösten Spänen aus " +"Styropor, das sehr ähnliche Eigenschaften wie Napalm B aufweist. Es ist für " +"den Einsatz mit einem Flammenwerfer vorgesehen." #: lang/json/AMMO_from_json.py msgid "flamethrower fuel" @@ -1994,6 +2004,10 @@ msgid "" "properties make it unfit for applications where you would use any of them " "separately, but it can be used to feed a flamethrower." msgstr "" +"Eine Mischung aus Benzin und Dieselöl zu gleichen Teilen. Die " +"Verbrennungseigenschaften machen es ungeeignet für die Anwendung in " +"Bereichen, in denen du einen der Bestandteile separat nutzen würdest. Dafür " +"kann man es verwenden um einen Flammenwerfer zu füllen." #: lang/json/AMMO_from_json.py msgid "autoclave pouch" @@ -2566,34 +2580,20 @@ msgstr ".300 AAC Blackout" #. ~ Description for .300 AAC Blackout #: lang/json/AMMO_from_json.py msgid "" -".300 AAC Blackout is an intermediate cartridge that achieves ballistics " -"similar to the 7.62x39 but allows use on the AR-15 platform. The round is " -"necked-up from the 5.56mm NATO, but feeds from a STANAG magazine. It " -"requires a specific barrel, so will not work in a standard M4 or similar " -"carbine. This loading is supersonic." +"A .300 AAC Blackout round with a 125gr open tip match bullet. 300 BLK is an" +" intermediate cartridge necked up from 5.56x45mm, designed to achieve " +"similar ballistics to 7.62x39mm. It is compatible with standard AR-15 lower" +" receivers and will feed from STANAG magazines." msgstr "" -"Das .300 AAC Blackout ist eine mittlere Patrone, welche dem 7,62x39 sehr " -"ähnlich, aber kompatibel mit dem AR-15 ist. Die Kugel hat einen engeren Hals" -" als das 5,56mm Nato, wird aber in einem STANAG Magazin geladen. Da für die " -"Munition ein spezieller Lauf gebraucht wird, funktioniert sie nicht mit " -"einem Standard M4 oder ähnlichem Karabiner. Diese Patrone fliegt mit " -"Überschall." #. ~ Description for .300 AAC Blackout #: lang/json/AMMO_from_json.py msgid "" -".300 AAC Blackout is an intermediate cartridge that achieves ballistics " -"similar to the 7.62x39 but allows use on the AR-15 platform. The round is " -"necked-up from the 5.56mm NATO, but feeds from a STANAG magazine. It " -"requires a specific barrel, so will not work in a standard M4 or similar " -"carbine. This loading is subsonic." +"A subsonic .300 AAC Blackout round with a 220gr open tip match bullet. 300 " +"BLK is an intermediate cartridge necked up from 5.56x45mm, designed to " +"achieve similar ballistics to 7.62x39mm. It is compatible with standard " +"AR-15 lower receivers and will feed from STANAG magazines." msgstr "" -"Das .300 AAC Blackout ist eine mittlere Patrone, welche dem 7,62x39 sehr " -"ähnlich, aber kompatibel mit dem AR-15 ist. Die Kugel hat einen engeren Hals" -" als das 5,56mm Nato, wird aber in einem STANAG Magazin geladen. Da für die " -"Munition ein spezieller Lauf gebraucht wird, funktioniert sie nicht mit " -"einem Standard M4 oder ähnlichem Karabiner. Diese Patrone fliegt mit " -"Unterschall." #: lang/json/AMMO_from_json.py msgid "reloaded .300 AAC Blackout" @@ -4213,6 +4213,17 @@ msgid "" " tube. Designed to be highly effective against vehicles and structures." msgstr "" +#: lang/json/AMMO_from_json.py +msgid "paralyzing barb" +msgstr "" + +#. ~ Description for paralyzing barb +#: lang/json/AMMO_from_json.py +msgid "" +"Tiny droplets of venom trickle out of the sponge-like tissue of this sharp " +"barb." +msgstr "" + #: lang/json/AMMO_from_json.py msgid "sprayable toxic gas" msgstr "sprühbares Giftgas" @@ -4822,6 +4833,29 @@ msgid "" "making doors." msgstr "" +#: lang/json/AMMO_from_json.py +msgid "tin powder" +msgstr "" + +#. ~ Description for tin powder +#: lang/json/AMMO_from_json.py +msgid "" +"A fine gray powder composed of tin, usable for making solder and lining " +"containers to prevent corrosion." +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid "solder" +msgstr "Lötzinn" + +#. ~ Description for solder +#: lang/json/AMMO_from_json.py +msgid "" +"A small spool of solder, able to be used in ammunition and electronics." +msgstr "" +"Eine kleine Spule mit Lötzinn, verwendungsfertig für Munition und " +"Elektronik." + #: lang/json/AMMO_from_json.py msgid "incendiary" msgid_plural "incendiaries" @@ -6628,48 +6662,6 @@ msgstr[1] "Basketball-Shorts" msgid "A pair of basketball shorts. Comfortable and light." msgstr "Eine Basketball-Shorts. Bequem und leicht." -#: lang/json/ARMOR_from_json.py -msgid "backpack" -msgid_plural "backpacks" -msgstr[0] "Rucksack" -msgstr[1] "Rucksäcke" - -#. ~ Description for backpack -#: lang/json/ARMOR_from_json.py -msgid "A small backpack. Good storage for a little encumbrance." -msgstr "" -"Ein kleiner Rucksack, der anständigen Lagerplatz bietet und dabei nur eine " -"geringe Hinderung aufweist." - -#: lang/json/ARMOR_from_json.py -msgid "giant novelty backpack" -msgid_plural "giant novelty backpacks" -msgstr[0] "Riesiger Novelty Rucksack" -msgstr[1] "Riesige Novelty Rucksäcke" - -#. ~ Description for giant novelty backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A huge fabric backpack made mostly as a joke before the cataclysm. Now, " -"it's still rather silly, but it can store a lot of stuff." -msgstr "" -"Ein riesiger Stoffrucksack, der vor der Apokalypse meist als Witz gedacht " -"war. Jetzt ist er noch immer ziemlich albern, aber er kann eine Menge Sachen" -" aufnehmen." - -#: lang/json/ARMOR_from_json.py -msgid "leather backpack" -msgid_plural "leather backpacks" -msgstr[0] "Lederrucksack" -msgstr[1] "Lederrucksäcke" - -#. ~ Description for leather backpack -#: lang/json/ARMOR_from_json.py -msgid "A small leather backpack. Good storage for a little encumbrance." -msgstr "" -"Ein kleiner Lederrucksack, der anständigen Lagerplatz bietet und dabei nur " -"eine geringe Hinderung aufweist." - #: lang/json/ARMOR_from_json.py msgid "balaclava" msgid_plural "balaclavas" @@ -6693,8 +6685,8 @@ msgstr[1] "Wehrgehänge" #. ~ Use action holster_msg for scabbard. #. ~ Use action holster_msg for sheath. #. ~ Use action holster_msg for survivor belt. -#. ~ Use action holster_msg for hiking backpack. #. ~ Use action holster_msg for survivor utility belt. +#. ~ Use action holster_msg for hiking backpack. #. ~ Use action holster_msg for pair of boots. #. ~ Use action holster_msg for pair of bone armor boots. #. ~ Use action holster_msg for pair of turnout boots. @@ -6719,7 +6711,8 @@ msgstr[1] "Wehrgehänge" #. ~ Use action holster_msg for pair of rollerblades. #. ~ Use action holster_msg for pair of rollerskates. #. ~ Use action holster_msg for C.R.I.T web belt. -#: lang/json/ARMOR_from_json.py +#. ~ Use action holster_msg for hollow cane. +#: lang/json/ARMOR_from_json.py lang/json/GENERIC_from_json.py #, no-python-format msgid "You sheath your %s" msgstr "Du steckst %s in die Scheide." @@ -6727,7 +6720,9 @@ msgstr "Du steckst %s in die Scheide." #. ~ Use action holster_prompt for baldric. #. ~ Use action holster_prompt for back scabbard. #. ~ Use action holster_prompt for scabbard. -#: lang/json/ARMOR_from_json.py +#. ~ Use action holster_prompt for hollow cane. +#: lang/json/ARMOR_from_json.py lang/json/ARMOR_from_json.py +#: lang/json/GENERIC_from_json.py msgid "Sheath sword" msgstr "Schwert einstecken" @@ -7771,19 +7766,6 @@ msgstr "" "Ein Ganzkörperkostüm in der Form eines menschenähnlichen Dinosauriers. Er " "ist ziemlich hindernd und hat wenig Lagerplatz, aber ist sehr warm." -#: lang/json/ARMOR_from_json.py -msgid "dive bag" -msgid_plural "dive bags" -msgstr[0] "Taucherrucksack" -msgstr[1] "Taucherrucksäcke" - -#. ~ Description for dive bag -#: lang/json/ARMOR_from_json.py -msgid "A lightweight mesh backpack, commonly worn by swimmers and divers." -msgstr "" -"Ein leichter Maschenrucksack, üblicherweise von Schwimmern und Tauchern " -"getragen." - #: lang/json/ARMOR_from_json.py msgid "down-filled blanket" msgid_plural "down-filled blankets" @@ -7867,19 +7849,6 @@ msgstr[1] "Hochzeitskleider" msgid "A beautiful white wedding dress. What good will it be now?" msgstr "Ein wunderschönes weißes Hochzeitskleid. Wozu wird das nun gut sein?" -#: lang/json/ARMOR_from_json.py -msgid "duffel bag" -msgid_plural "duffel bags" -msgstr[0] "Reisetasche" -msgstr[1] "Reisetaschen" - -#. ~ Description for duffel bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A huge duffel bag. Provides plenty of storage, but is severely encumbering." -msgstr "" -"Eine riesige Reisetasche. Bietet viel Lagerplatz, ist aber sehr hinderlich." - #: lang/json/ARMOR_from_json.py msgid "tactical dump pouch" msgid_plural "tactical dump pouches" @@ -9869,19 +9838,6 @@ msgstr "" "Eine lange, fließende Robe. Einfach und angenehm zu tragen. Bevor du Feinde " "bekämpfst, solltest du sie dramatisch abreißen!" -#: lang/json/ARMOR_from_json.py -msgid "jerrypack" -msgid_plural "jerrypacks" -msgstr[0] "Rucksackkanister" -msgstr[1] "Rucksackkanister" - -#. ~ Description for jerrypack -#: lang/json/ARMOR_from_json.py -msgid "A jerrycan modified to be worn in a similar manner to a backpack." -msgstr "" -"Ein Kanister, der so modifiziert wurde, dass er wie ein Rucksack getragen " -"werden kann." - #: lang/json/ARMOR_from_json.py msgid "sports jersey" msgid_plural "sports jerseys" @@ -10800,35 +10756,6 @@ msgstr[1] "Französische-Magd-Hüte" msgid "A frilly white headpiece." msgstr "Eine mit Rüschen besetzte Kopfbedeckung." -#: lang/json/ARMOR_from_json.py -msgid "makeshift knapsack" -msgid_plural "makeshift knapsacks" -msgstr[0] "behelfsmäßiger Rucksack" -msgstr[1] "behelfsmäßige Rucksäcke" - -#. ~ Description for makeshift knapsack -#: lang/json/ARMOR_from_json.py -msgid "" -"A pair of pants with the bottom ends tied with string, and then passed " -"through the belt loops so the knapsack can be carried on the back." -msgstr "" -"Eine Hose, deren untere Enden mit Schnur zusammengebunden und welche dann " -"durch die Gürtelschlaufen geführt wurden, so dass die Hose wie ein Rucksack " -"getragen werden kann." - -#: lang/json/ARMOR_from_json.py -msgid "makeshift sling" -msgid_plural "makeshift slings" -msgstr[0] "selbstgemachtes Tragetuch" -msgstr[1] "selbstgemachte Tragetücher" - -#. ~ Description for makeshift sling -#: lang/json/ARMOR_from_json.py -msgid "A large sheet tied into a crude, over-the-shoulder sling." -msgstr "" -"Ein großes Laken, das zu ein grobes, über der Schulter geworfenes Tragetuch " -"zusammengebunden wurde." - #: lang/json/ARMOR_from_json.py msgid "ballistic mask" msgid_plural "ballistic masks" @@ -10901,19 +10828,6 @@ msgstr "" "sind. Sie werden üblicherweise von Randalierern getragen, um ihre Identität " "zu verbergen." -#: lang/json/ARMOR_from_json.py -msgid "messenger bag" -msgid_plural "messenger bags" -msgstr[0] "Kuriertasche" -msgstr[1] "Kuriertaschen" - -#. ~ Description for messenger bag -#: lang/json/ARMOR_from_json.py -msgid "Light and easy to wear, but doesn't offer much storage." -msgstr "" -"Leicht im Gewicht und leicht zu tragen, aber es bietet nicht gerade viel " -"Platz. Im Deutschen auch als »Bodybag« bekannt." - #: lang/json/ARMOR_from_json.py msgid "pair of mittens" msgid_plural "pairs of mittens" @@ -10925,24 +10839,6 @@ msgstr[1] "Paar Fäustlinge" msgid "A pair of warm mittens. They are extremely cumbersome." msgstr "Ein Paar Fäustlinge. Sie sind extrem hinderlich." -#: lang/json/ARMOR_from_json.py -msgid "MOLLE pack" -msgid_plural "MOLLE packs" -msgstr[0] "MOLLE-Rucksack" -msgstr[1] "MOLLE-Rucksäcke" - -#. ~ Description for MOLLE pack -#: lang/json/ARMOR_from_json.py -msgid "" -"The Modular Lightweight Load-carrying Equipment is an advanced military " -"backpack. Covered with pockets and straps, it strikes a fine balance " -"between storage space and encumbrance." -msgstr "" -"Der MOLLE (Abkürzung für »Modular Lightweight Load-carrying Equipment«, " -"deutsch: »Modulare leichtgewichtige Trageausrüstung«) ist ein " -"fortgeschrittener Militärrucksack. Es ist voller Taschen und Riemen und " -"bietet einen guten Ausgleich zwischen Lagerplatz und Hinderung." - #: lang/json/ARMOR_from_json.py msgid "motorcycle armor" msgid_plural "motorcycle armors" @@ -11409,17 +11305,6 @@ msgstr "" "Ein Helm aus einem Suppentopf. Er ist kein sehr guter Schutz, aber er ist " "besser als nichts." -#: lang/json/ARMOR_from_json.py -msgid "purse" -msgid_plural "purses" -msgstr[0] "Handtasche" -msgstr[1] "Handtaschen" - -#. ~ Description for purse -#: lang/json/ARMOR_from_json.py -msgid "A bit cumbersome to wear, but provides some storage." -msgstr "Ein bisschen hinderlich zum Tragen, aber bietet etwas Lagerplatz." - #: lang/json/ARMOR_from_json.py msgid "quiver" msgid_plural "quivers" @@ -11514,33 +11399,6 @@ msgstr "" "Ein locker sitzendes aüßeres Bekleidungsstück mit Ärmeln, und einer " "mysteriösen Anzahl an gut versteckten Taschen." -#: lang/json/ARMOR_from_json.py -msgid "military rucksack" -msgid_plural "military rucksacks" -msgstr[0] "Militärrucksack" -msgstr[1] "Militärrucksäcke" - -#. ~ Description for military rucksack -#: lang/json/ARMOR_from_json.py -msgid "A huge military rucksack, provides a lot of storage." -msgstr "Ein riesiger Militärrucksack, bietet viel Lagerplatz." - -#: lang/json/ARMOR_from_json.py -msgid "runner pack" -msgid_plural "runner packs" -msgstr[0] "Läuferrucksack" -msgstr[1] "Läuferrucksäcke" - -#. ~ Description for runner pack -#: lang/json/ARMOR_from_json.py -msgid "" -"The obvious choice for outdoor athletes, this ergonomic backpack is light " -"and easy to wear, ensuring comfort when carrying heavy and bulky items." -msgstr "" -"Die offensichtliche Wahl für Athleten; dieser ergnomische Rucksack ist " -"leichtgewichtig und leicht zu tragen und stellt den Komfort beim Tragen von " -"schweren und klobigen Gegenständen sicher." - #: lang/json/ARMOR_from_json.py msgid "scabbard" msgid_plural "scabbards" @@ -11959,22 +11817,6 @@ msgid "A sleeveless cloth garment that covers the torso and legs." msgstr "" "Ein ärmelloses Stoffkleidungsstück, das den Torso und die Beine bedeckt." -#: lang/json/ARMOR_from_json.py -msgid "sling pack" -msgid_plural "sling packs" -msgstr[0] "Schlingsack" -msgstr[1] "Schlingsäcke" - -#. ~ Description for sling pack -#: lang/json/ARMOR_from_json.py -msgid "" -"A simple single-sling backpack. Easier to access than a normal backpack, " -"but can't comfortably hold as much." -msgstr "" -"Ein einfacher Rucksack mit nur einer Schlinge. Man kommt leichter an den " -"Inhalt als mit einem normalen Rucksack heran, aber er kann nicht auf bequeme" -" Weise so viel enthalten." - #: lang/json/ARMOR_from_json.py msgid "snuggie" msgid_plural "snuggies" @@ -12276,8 +12118,8 @@ msgstr[0] "Überlebendengürtel" msgstr[1] "Überlebendengürtel" #. ~ Use action holster_prompt for survivor belt. -#. ~ Use action holster_prompt for hiking backpack. #. ~ Use action holster_prompt for survivor utility belt. +#. ~ Use action holster_prompt for hiking backpack. #. ~ Use action holster_prompt for C.R.I.T web belt. #: lang/json/ARMOR_from_json.py msgid "Sheath blade" @@ -12295,21 +12137,6 @@ msgstr "" "Langlebig und sorgfältig so angefertigt, dass er bequem zu tragen ist. " "Aktiere ihn, um eine Waffe zu ziehen / wieder einzustecken." -#: lang/json/ARMOR_from_json.py -msgid "survivor duffel bag" -msgid_plural "survivor duffel bags" -msgstr[0] "Überlebendenreisetasche" -msgstr[1] "Überlebendenreisetaschen" - -#. ~ Description for survivor duffel bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built heavy duffel bag. Durable and carefully crafted to hold as " -"much stuff as possible." -msgstr "" -"Eine selbstgefertigte schwere Reisetasche. Widerstandsfähig und sorgfältig " -"so angefertigt, dass sie so viele Sachen wie möglich beinhalten kann." - #: lang/json/ARMOR_from_json.py msgid "survivor goggles" msgid_plural "pairs of survivor goggles" @@ -12325,52 +12152,6 @@ msgstr "" "Eine selbstgebaute gepanzerte Brille mit getönten Linsen. Sie ist bequem, " "widerstandsfähig, und bietet ausgezeichneten Schutz vor Umweltgefahren." -#: lang/json/ARMOR_from_json.py -msgid "survivor backpack" -msgid_plural "survivor backpacks" -msgstr[0] "Überlebendenrucksack" -msgstr[1] "Überlebendenrucksäcke" - -#. ~ Description for survivor backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built backpack. Durable and carefully crafted to hold as much " -"stuff as possible." -msgstr "" -"Ein selbstgefertigter Rucksack. Widerstandsfähig und sorgfältig so " -"angefertigt, dass er so viele Sachen wie möglich beinhalten kann." - -#: lang/json/ARMOR_from_json.py -msgid "survivor rucksack" -msgid_plural "survivor rucksacks" -msgstr[0] "Überlebendenrucksack" -msgstr[1] "Überlebendenrucksäcke" - -#. ~ Description for survivor rucksack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built heavy backpack. Durable and carefully crafted to hold as " -"much stuff as possible." -msgstr "" -"Ein selbstgefertigter schwerer Rucksack. Widerstandsfähig und sorgfältig so " -"angefertigt, dass er so viele Sachen wie möglich beinhalten kann." - -#: lang/json/ARMOR_from_json.py -msgid "survivor runner pack" -msgid_plural "survivor runner packs" -msgstr[0] "Überlebendenläuferrucksack" -msgstr[1] "Überlebendenläuferrucksäcke" - -#. ~ Description for survivor runner pack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built lightweight runner pack. Durable and carefully crafted to " -"hold as much stuff as possible." -msgstr "" -"Ein selbstgefertigter leichtgewichtiger Läuferrucksack. Widerstandsfähig und" -" sorgfältig so angefertigt, dass er so viele Sachen wie möglich beinhalten " -"kann." - #: lang/json/ARMOR_from_json.py msgid "survivor suit" msgid_plural "survivor suits" @@ -13356,32 +13137,6 @@ msgstr "" "Du bist dir eigentlich nicht sicher, ob man dies eine Golfmütze nennt, aber " "es ist die stereotypische Mütze, die Golfer tragen." -#: lang/json/ARMOR_from_json.py -msgid "golf bag" -msgid_plural "golf bags" -msgstr[0] "Golftasche" -msgstr[1] "Golftaschen" - -#. ~ Use action holster_msg for golf bag. -#: lang/json/ARMOR_from_json.py -#, no-python-format -msgid "You awkwardly sheath your %s" -msgstr "Umständlich steckst du %s ein." - -#. ~ Use action holster_prompt for golf bag. -#: lang/json/ARMOR_from_json.py -msgid "Sheath golf club" -msgstr "Golfschläger einstecken" - -#. ~ Description for golf bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A tall canvas and plastic bag with fold-out legs used for golfing. It even " -"has straps to be worn on the back." -msgstr "" -"Ein großes Tuch mit Plastiktasche mit ausgeklappten Beinen, benutzt zum " -"Golfen. Es hat sogar Riemen, damit man es am Rücken tragen kann." - #: lang/json/ARMOR_from_json.py msgid "javelin bag" msgid_plural "javelin bags" @@ -13490,67 +13245,6 @@ msgstr "" "Ein Plastiklaken mit mehreren Ösen, um ihn mit Seil oder Kordel zu sichern. " "Nützlich für improvisierten Regenschutz." -#: lang/json/ARMOR_from_json.py -msgid "high-volume rucksack" -msgid_plural "high-volume rucksacks" -msgstr[0] "extra-großer Rucksack" -msgstr[1] "extra-große Rucksäcke" - -#. ~ Description for high-volume rucksack -#: lang/json/ARMOR_from_json.py -msgid "" -"Also know as a \"bigpack\", this rucksack is prized by pack rats but may " -"lead to a bad back." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "hiking backpack" -msgid_plural "hiking backpacks" -msgstr[0] "Wanderrucksack" -msgstr[1] "Wanderrucksäcke" - -#. ~ Description for hiking backpack -#: lang/json/ARMOR_from_json.py -msgid "A large sized hiking backpack with plenty of storage space." -msgstr "Ein großer Wanderrucksack mit reichlich Stauvolumen." - -#: lang/json/ARMOR_from_json.py -msgid "petpack" -msgid_plural "petpacks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for petpack -#: lang/json/ARMOR_from_json.py -msgid "" -"Before the Cataclysm this would allow your four-legged friend to see the " -"world, now it's used to shield them from the world." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "large tactical backpack" -msgid_plural "large tactical backpacks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for large tactical backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A large tactical multi-compartment backpack that has great lower back " -"support." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "travelpack" -msgid_plural "travelpacks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for travelpack -#: lang/json/ARMOR_from_json.py -msgid "A hiking pack used for short trips." -msgstr "Ein Wanderrucksack für kurze Trips." - #: lang/json/ARMOR_from_json.py msgid "survivor utility belt" msgid_plural "survivor utility belts" @@ -13794,6 +13488,349 @@ msgid "" "resistant vests. It has four pouches capable of carrying magazines." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "backpack" +msgid_plural "backpacks" +msgstr[0] "Rucksack" +msgstr[1] "Rucksäcke" + +#. ~ Description for backpack +#: lang/json/ARMOR_from_json.py +msgid "A small backpack. Good storage for a little encumbrance." +msgstr "" +"Ein kleiner Rucksack, der anständigen Lagerplatz bietet und dabei nur eine " +"geringe Hinderung aufweist." + +#: lang/json/ARMOR_from_json.py +msgid "hiking backpack" +msgid_plural "hiking backpacks" +msgstr[0] "Wanderrucksack" +msgstr[1] "Wanderrucksäcke" + +#. ~ Description for hiking backpack +#: lang/json/ARMOR_from_json.py +msgid "A large sized hiking backpack with plenty of storage space." +msgstr "Ein großer Wanderrucksack mit reichlich Stauvolumen." + +#: lang/json/ARMOR_from_json.py +msgid "giant novelty backpack" +msgid_plural "giant novelty backpacks" +msgstr[0] "Riesiger Novelty Rucksack" +msgstr[1] "Riesige Novelty Rucksäcke" + +#. ~ Description for giant novelty backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A huge fabric backpack made mostly as a joke before the cataclysm. Now, " +"it's still rather silly, but it can store a lot of stuff." +msgstr "" +"Ein riesiger Stoffrucksack, der vor der Apokalypse meist als Witz gedacht " +"war. Jetzt ist er noch immer ziemlich albern, aber er kann eine Menge Sachen" +" aufnehmen." + +#: lang/json/ARMOR_from_json.py +msgid "leather backpack" +msgid_plural "leather backpacks" +msgstr[0] "Lederrucksack" +msgstr[1] "Lederrucksäcke" + +#. ~ Description for leather backpack +#: lang/json/ARMOR_from_json.py +msgid "A small leather backpack. Good storage for a little encumbrance." +msgstr "" +"Ein kleiner Lederrucksack, der anständigen Lagerplatz bietet und dabei nur " +"eine geringe Hinderung aufweist." + +#: lang/json/ARMOR_from_json.py +msgid "large tactical backpack" +msgid_plural "large tactical backpacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for large tactical backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A large tactical multi-compartment backpack that has great lower back " +"support." +msgstr "" + +#: lang/json/ARMOR_from_json.py +msgid "high-volume rucksack" +msgid_plural "high-volume rucksacks" +msgstr[0] "extra-großer Rucksack" +msgstr[1] "extra-große Rucksäcke" + +#. ~ Description for high-volume rucksack +#: lang/json/ARMOR_from_json.py +msgid "" +"Also know as a \"bigpack\", this rucksack is prized by pack rats but may " +"lead to a bad back." +msgstr "" + +#: lang/json/ARMOR_from_json.py +msgid "dive bag" +msgid_plural "dive bags" +msgstr[0] "Taucherrucksack" +msgstr[1] "Taucherrucksäcke" + +#. ~ Description for dive bag +#: lang/json/ARMOR_from_json.py +msgid "A lightweight mesh backpack, commonly worn by swimmers and divers." +msgstr "" +"Ein leichter Maschenrucksack, üblicherweise von Schwimmern und Tauchern " +"getragen." + +#: lang/json/ARMOR_from_json.py +msgid "duffel bag" +msgid_plural "duffel bags" +msgstr[0] "Reisetasche" +msgstr[1] "Reisetaschen" + +#. ~ Description for duffel bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A huge duffel bag. Provides plenty of storage, but is severely encumbering." +msgstr "" +"Eine riesige Reisetasche. Bietet viel Lagerplatz, ist aber sehr hinderlich." + +#: lang/json/ARMOR_from_json.py +msgid "petpack" +msgid_plural "petpacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for petpack +#: lang/json/ARMOR_from_json.py +msgid "" +"Before the Cataclysm this would allow your four-legged friend to see the " +"world, now it's used to shield them from the world." +msgstr "" + +#: lang/json/ARMOR_from_json.py +msgid "jerrypack" +msgid_plural "jerrypacks" +msgstr[0] "Rucksackkanister" +msgstr[1] "Rucksackkanister" + +#. ~ Description for jerrypack +#: lang/json/ARMOR_from_json.py +msgid "A jerrycan modified to be worn in a similar manner to a backpack." +msgstr "" +"Ein Kanister, der so modifiziert wurde, dass er wie ein Rucksack getragen " +"werden kann." + +#: lang/json/ARMOR_from_json.py +msgid "makeshift knapsack" +msgid_plural "makeshift knapsacks" +msgstr[0] "behelfsmäßiger Rucksack" +msgstr[1] "behelfsmäßige Rucksäcke" + +#. ~ Description for makeshift knapsack +#: lang/json/ARMOR_from_json.py +msgid "" +"A pair of pants with the bottom ends tied with string, and then passed " +"through the belt loops so the knapsack can be carried on the back." +msgstr "" +"Eine Hose, deren untere Enden mit Schnur zusammengebunden und welche dann " +"durch die Gürtelschlaufen geführt wurden, so dass die Hose wie ein Rucksack " +"getragen werden kann." + +#: lang/json/ARMOR_from_json.py +msgid "makeshift sling" +msgid_plural "makeshift slings" +msgstr[0] "selbstgemachtes Tragetuch" +msgstr[1] "selbstgemachte Tragetücher" + +#. ~ Description for makeshift sling +#: lang/json/ARMOR_from_json.py +msgid "A large sheet tied into a crude, over-the-shoulder sling." +msgstr "" +"Ein großes Laken, das zu ein grobes, über der Schulter geworfenes Tragetuch " +"zusammengebunden wurde." + +#: lang/json/ARMOR_from_json.py +msgid "messenger bag" +msgid_plural "messenger bags" +msgstr[0] "Kuriertasche" +msgstr[1] "Kuriertaschen" + +#. ~ Description for messenger bag +#: lang/json/ARMOR_from_json.py +msgid "Light and easy to wear, but doesn't offer much storage." +msgstr "" +"Leicht im Gewicht und leicht zu tragen, aber es bietet nicht gerade viel " +"Platz. Im Deutschen auch als »Bodybag« bekannt." + +#: lang/json/ARMOR_from_json.py +msgid "MOLLE pack" +msgid_plural "MOLLE packs" +msgstr[0] "MOLLE-Rucksack" +msgstr[1] "MOLLE-Rucksäcke" + +#. ~ Description for MOLLE pack +#: lang/json/ARMOR_from_json.py +msgid "" +"The Modular Lightweight Load-carrying Equipment is an advanced military " +"backpack. Covered with pockets and straps, it strikes a fine balance " +"between storage space and encumbrance." +msgstr "" +"Der MOLLE (Abkürzung für »Modular Lightweight Load-carrying Equipment«, " +"deutsch: »Modulare leichtgewichtige Trageausrüstung«) ist ein " +"fortgeschrittener Militärrucksack. Es ist voller Taschen und Riemen und " +"bietet einen guten Ausgleich zwischen Lagerplatz und Hinderung." + +#: lang/json/ARMOR_from_json.py +msgid "purse" +msgid_plural "purses" +msgstr[0] "Handtasche" +msgstr[1] "Handtaschen" + +#. ~ Description for purse +#: lang/json/ARMOR_from_json.py +msgid "A bit cumbersome to wear, but provides some storage." +msgstr "Ein bisschen hinderlich zum Tragen, aber bietet etwas Lagerplatz." + +#: lang/json/ARMOR_from_json.py +msgid "military rucksack" +msgid_plural "military rucksacks" +msgstr[0] "Militärrucksack" +msgstr[1] "Militärrucksäcke" + +#. ~ Description for military rucksack +#: lang/json/ARMOR_from_json.py +msgid "A huge military rucksack, provides a lot of storage." +msgstr "Ein riesiger Militärrucksack, bietet viel Lagerplatz." + +#: lang/json/ARMOR_from_json.py +msgid "runner pack" +msgid_plural "runner packs" +msgstr[0] "Läuferrucksack" +msgstr[1] "Läuferrucksäcke" + +#. ~ Description for runner pack +#: lang/json/ARMOR_from_json.py +msgid "" +"The obvious choice for outdoor athletes, this ergonomic backpack is light " +"and easy to wear, ensuring comfort when carrying heavy and bulky items." +msgstr "" +"Die offensichtliche Wahl für Athleten; dieser ergnomische Rucksack ist " +"leichtgewichtig und leicht zu tragen und stellt den Komfort beim Tragen von " +"schweren und klobigen Gegenständen sicher." + +#: lang/json/ARMOR_from_json.py +msgid "sling pack" +msgid_plural "sling packs" +msgstr[0] "Schlingsack" +msgstr[1] "Schlingsäcke" + +#. ~ Description for sling pack +#: lang/json/ARMOR_from_json.py +msgid "" +"A simple single-sling backpack. Easier to access than a normal backpack, " +"but can't comfortably hold as much." +msgstr "" +"Ein einfacher Rucksack mit nur einer Schlinge. Man kommt leichter an den " +"Inhalt als mit einem normalen Rucksack heran, aber er kann nicht auf bequeme" +" Weise so viel enthalten." + +#: lang/json/ARMOR_from_json.py +msgid "survivor duffel bag" +msgid_plural "survivor duffel bags" +msgstr[0] "Überlebendenreisetasche" +msgstr[1] "Überlebendenreisetaschen" + +#. ~ Description for survivor duffel bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built heavy duffel bag. Durable and carefully crafted to hold as " +"much stuff as possible." +msgstr "" +"Eine selbstgefertigte schwere Reisetasche. Widerstandsfähig und sorgfältig " +"so angefertigt, dass sie so viele Sachen wie möglich beinhalten kann." + +#: lang/json/ARMOR_from_json.py +msgid "survivor backpack" +msgid_plural "survivor backpacks" +msgstr[0] "Überlebendenrucksack" +msgstr[1] "Überlebendenrucksäcke" + +#. ~ Description for survivor backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built backpack. Durable and carefully crafted to hold as much " +"stuff as possible." +msgstr "" +"Ein selbstgefertigter Rucksack. Widerstandsfähig und sorgfältig so " +"angefertigt, dass er so viele Sachen wie möglich beinhalten kann." + +#: lang/json/ARMOR_from_json.py +msgid "survivor rucksack" +msgid_plural "survivor rucksacks" +msgstr[0] "Überlebendenrucksack" +msgstr[1] "Überlebendenrucksäcke" + +#. ~ Description for survivor rucksack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built heavy backpack. Durable and carefully crafted to hold as " +"much stuff as possible." +msgstr "" +"Ein selbstgefertigter schwerer Rucksack. Widerstandsfähig und sorgfältig so " +"angefertigt, dass er so viele Sachen wie möglich beinhalten kann." + +#: lang/json/ARMOR_from_json.py +msgid "survivor runner pack" +msgid_plural "survivor runner packs" +msgstr[0] "Überlebendenläuferrucksack" +msgstr[1] "Überlebendenläuferrucksäcke" + +#. ~ Description for survivor runner pack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built lightweight runner pack. Durable and carefully crafted to " +"hold as much stuff as possible." +msgstr "" +"Ein selbstgefertigter leichtgewichtiger Läuferrucksack. Widerstandsfähig und" +" sorgfältig so angefertigt, dass er so viele Sachen wie möglich beinhalten " +"kann." + +#: lang/json/ARMOR_from_json.py +msgid "golf bag" +msgid_plural "golf bags" +msgstr[0] "Golftasche" +msgstr[1] "Golftaschen" + +#. ~ Use action holster_msg for golf bag. +#: lang/json/ARMOR_from_json.py +#, no-python-format +msgid "You awkwardly sheath your %s" +msgstr "Umständlich steckst du %s ein." + +#. ~ Use action holster_prompt for golf bag. +#: lang/json/ARMOR_from_json.py +msgid "Sheath golf club" +msgstr "Golfschläger einstecken" + +#. ~ Description for golf bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A tall canvas and plastic bag with fold-out legs used for golfing. It even " +"has straps to be worn on the back." +msgstr "" +"Ein großes Tuch mit Plastiktasche mit ausgeklappten Beinen, benutzt zum " +"Golfen. Es hat sogar Riemen, damit man es am Rücken tragen kann." + +#: lang/json/ARMOR_from_json.py +msgid "travelpack" +msgid_plural "travelpacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for travelpack +#: lang/json/ARMOR_from_json.py +msgid "A hiking pack used for short trips." +msgstr "Ein Wanderrucksack für kurze Trips." + #: lang/json/ARMOR_from_json.py msgid "pistol bandolier" msgid_plural "pistol bandoliers" @@ -17039,19 +17076,6 @@ msgid "" " turn more often than massive objects." msgstr "" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Advanced Microreactor CBM" -msgid_plural "Advanced Microreactor CBMs" -msgstr[0] "Fortgeschrittener-Mikroreaktor-KBM" -msgstr[1] "Fortgeschrittener-Mikroreaktor-KBMs" - -#. ~ Description for Advanced Microreactor CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"This module upgrades a pre-installed microreactor with enhanced maximum " -"yield and limited automatic radiation scrubbing capabilities." -msgstr "" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Alarm System CBM" msgid_plural "Alarm System CBMs" @@ -17810,19 +17834,6 @@ msgid "" "cause delayed reaction times and drowsiness." msgstr "" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Plutonium Filter CBM" -msgid_plural "Plutonium Filter CBMs" -msgstr[0] "Plutoniumfilter-KBM" -msgstr[1] "Plutoniumfilter-KBMs" - -#. ~ Description for Plutonium Filter CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A system of tanks and filters that are connected to a microreactor to " -"extract plutonium from radioactive slurry." -msgstr "" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Power Armor Interface CBM" msgid_plural "Power Armor Interface CBMs" @@ -17950,33 +17961,6 @@ msgid "" "unarmed slashing damage whenever the user's fingertips are uncovered." msgstr "" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Internal Microreactor CBM" -msgid_plural "Internal Microreactor CBMs" -msgstr[0] "Interner-Mikroreaktor-KBM" -msgstr[1] "Interner-Mikroreaktor-KBMs" - -#. ~ Description for Internal Microreactor CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"This stripped down mini-reactor will generate impressive amounts of bionic " -"power, but may not be the safest thing to install. Once active, it cannot " -"be shut down and will slowly contaminate the user's body with radiation." -msgstr "" - -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Microreactor Upgrade CBM" -msgid_plural "Microreactor Upgrade CBMs" -msgstr[0] "Mikroreaktor-Aufrüstungs-KBM" -msgstr[1] "Mikroreaktor-Aufrüstungs-KBMs" - -#. ~ Description for Microreactor Upgrade CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A kit for upgrading a pre-installed microreactor with enhanced maximum yield" -" and limited automatic radiation scrubbing capabilities." -msgstr "" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Recycler Unit CBM" msgid_plural "Recycler Unit CBMs" @@ -18618,6 +18602,59 @@ msgstr "" "Der Platz in deiner Brusthöhle wurde zum Lagerplatz umfunktioniert. Du " "kannst 2 Liter mehr tragen." +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Advanced Microreactor CBM" +msgid_plural "Advanced Microreactor CBMs" +msgstr[0] "Fortgeschrittener-Mikroreaktor-KBM" +msgstr[1] "Fortgeschrittener-Mikroreaktor-KBMs" + +#. ~ Description for Advanced Microreactor CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"This module upgrades a pre-installed microreactor with enhanced maximum " +"yield and limited automatic radiation scrubbing capabilities." +msgstr "" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Plutonium Filter CBM" +msgid_plural "Plutonium Filter CBMs" +msgstr[0] "Plutoniumfilter-KBM" +msgstr[1] "Plutoniumfilter-KBMs" + +#. ~ Description for Plutonium Filter CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A system of tanks and filters that are connected to a microreactor to " +"extract plutonium from radioactive slurry." +msgstr "" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Internal Microreactor CBM" +msgid_plural "Internal Microreactor CBMs" +msgstr[0] "Interner-Mikroreaktor-KBM" +msgstr[1] "Interner-Mikroreaktor-KBMs" + +#. ~ Description for Internal Microreactor CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"This stripped down mini-reactor will generate impressive amounts of bionic " +"power, but may not be the safest thing to install. Once active, it cannot " +"be shut down and will slowly contaminate the user's body with radiation." +msgstr "" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Microreactor Upgrade CBM" +msgid_plural "Microreactor Upgrade CBMs" +msgstr[0] "Mikroreaktor-Aufrüstungs-KBM" +msgstr[1] "Mikroreaktor-Aufrüstungs-KBMs" + +#. ~ Description for Microreactor Upgrade CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A kit for upgrading a pre-installed microreactor with enhanced maximum yield" +" and limited automatic radiation scrubbing capabilities." +msgstr "" + #. ~ Description for Solar Panels CBM #: lang/json/BIONIC_ITEM_from_json.py msgid "" @@ -21388,26 +21425,26 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Nietzsche's \"Beyond Good and Evil\". Its cover is dog-" +"This is a copy of Nietzsche's \"Beyond Good and Evil\". Its cover is dog-" "eared and creased." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"The Unique and Its Property\" by Max Stirner. A modern " +"This is a copy of \"The Unique and Its Property\" by Max Stirner. A modern " "translation by Wolfi Landstreicher." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Jean-Paul Sartre's \"Being and Nothingness\". A key work " +"This is a copy of Jean-Paul Sartre's \"Being and Nothingness\". A key work " "in the existentialist tradition." msgstr "" #: lang/json/BOOK_from_json.py msgid "" "A large, extended version of \"Madness and Civilisation\" by Michel " -"Foucault. The cover features a striking image of a Panopticonic Prison." +"Foucault. The cover features a striking image of a Panopticonic Prison." msgstr "" #: lang/json/BOOK_from_json.py @@ -21418,13 +21455,13 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"A collection of texts and essays by Jacques Derrida. It's pages loose and " +"A collection of texts and essays by Jacques Derrida. It's pages loose and " "yellowed, you should probably handle it with care." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Society of the Spectacle\" by Guy Debord. Its cover " +"This is a copy of \"Society of the Spectacle\" by Guy Debord. Its cover " "shows rows of adults staring placidly into a screen." msgstr "" @@ -21436,36 +21473,36 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Baudrillard's \"Simulation and Simulacra\". The cover " +"This is a copy of Baudrillard's \"Simulation and Simulacra\". The cover " "contains an image of a man holding a colored pill in each hand, with the " -"caption \"Welcome to the Desert of the Real.\". You think you've seen this " +"caption \"Welcome to the Desert of the Real.\". You think you've seen this " "movie." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a small, pocket version of Sartre's \"Existentialism and Humanism.\"" -" It looks to have been used as a coaster in a past life." +"This is a small, pocket version of Sartre's \"Existentialism and Humanism\"." +" It looks to have been used as a coaster in a past life." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Practical Ethics\" by Peter Singer. From the local " +"This is a copy of \"Practical Ethics\" by Peter Singer. From the local " "university press." msgstr "" #: lang/json/BOOK_from_json.py msgid "" "This is a photocopied spiral-bound copy of \"Industrial Society and Its " -"Future\" by 'Freedom Club'. The original looks to have been written on a " +"Future\" by 'Freedom Club'. The original looks to have been written on a " "typewriter before being copied." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Industrial Society and Its Future\" by Ted Kaczynski. " +"This is a copy of \"Industrial Society and Its Future\" by Ted Kaczynski. " "Its cover is an image of a hand-crafted wooden box filled with wiring and an" -" ominous looking metal tube. Provocative." +" ominous looking metal tube. Provocative." msgstr "" #: lang/json/BOOK_from_json.py @@ -21474,23 +21511,23 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"The State and Revolution\" by Vladimir Lenin. In " +"This is a copy of \"The State and Revolution\" by Vladimir Lenin. In " "English, thankfully." msgstr "" #: lang/json/BOOK_from_json.py -msgid "This is a copy of \"In Defence of Terrorism\" by Leon Trotsky." +msgid "This is a copy of \"In Defense of Marxism\" by Leon Trotsky." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Steal This Book\" by Abbie Hoffman. There is a security " -"tag on the back cover. It appears to still be active." +"This is a copy of \"Steal This Book\" by Abbie Hoffman. There is a security" +" tag on the back cover. It appears to still be active." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Walden: Or Life In The Woods\" by Henry David Thoreau. " +"This is a copy of \"Walden: Or Life In The Woods\" by Henry David Thoreau. " "It contains a dried and pressed leaf as a bookmark." msgstr "" @@ -21511,7 +21548,7 @@ msgid "" msgstr "" #: lang/json/BOOK_from_json.py -msgid "This is a copy of Machiavelli's \"The Prince\". With intro by Q. Skinner." +msgid "This is a copy of Machiavelli's \"The Prince\". With intro by Q. Skinner." msgstr "" #: lang/json/BOOK_from_json.py @@ -21521,12 +21558,12 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a pocket copy of \"An Essay on Liberation\" by Herbert Marcuse. The " -"cover contains an image of a pelican." +"This is a pocket copy of \"An Essay on Liberation\" by Herbert Marcuse. The" +" cover contains an image of a pelican." msgstr "" #: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Either-Or\" by Sören Kierkegaard." +msgid "This is a copy of \"Either-Or\" by Søren Kierkegaard." msgstr "" #: lang/json/BOOK_from_json.py @@ -21551,6 +21588,69 @@ msgid "" "Science\" by Friederich Nietzsche." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Myth of Sisyphus\", and other essays, by Albert " +"Camus. The cover depicts a bare-chested man and a large boulder." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Sickness Unto Death\" by Søren Kierkegaard. The " +"pages are dotted with post-it notes." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Defence of Terrorism\" by Leon Trotsky. Despite the" +" title, it does not actually appear to be defending terrorism." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Enquiry Concerning Political Justice\" by William " +"Godwin. This thick book is filled with antiquated phrases." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Abolition of Work and Other Essays\" by Bob Black. " +"It is likely that \"The Abolition of Work\" is the most famous essay in this" +" book." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"What is Property?\" by Pierre-Joseph Proudhon. It looks" +" like this book has a surprisingly long track record of owners." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Conquest of Bread\" by Peter Kropotkin. There is a " +"picture of an old philosopher with magnificent beard, instead of bread, on " +"the cover." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Trouble with Being Born\" by Emil Cioran. This book" +" might have been printed decades before the cataclysm since the cover is " +"quite weathered." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The World as Will and Representation\" by Arthur " +"Schopenhauer. It contains a few undecipherable notes and scribbles." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Up-Wingers: A Futurist Manifesto\" by FM-2030. It seems" +" that the author's real name is Fereidoun M. Esfandiary." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "phone book" msgid_plural "phone books" @@ -23409,8 +23509,8 @@ msgstr[1] "" msgid "" "This useful stuff is a potent solvent and has a wide range of reactive " "applications. It can be used to make a huge number of plastics and " -"polymers, it can be a disinfectant, it can strip paint and break down epoxy," -" and it can burn your skin away like tissue paper under a heat gun. Wear " +"polymers, it can be an antiseptic, it can strip paint and break down epoxy, " +"and it can burn your skin away like tissue paper under a heat gun. Wear " "gloves." msgstr "" @@ -29168,11 +29268,9 @@ msgstr[1] "antiseptische Pulver" #. ~ Description for antiseptic powder #: lang/json/COMESTIBLE_from_json.py msgid "" -"A powdered form of chemical disinfectant, this bismuth formic iodide cleans " +"A powdered form of chemical antiseptic, this bismuth formic iodide cleans " "wounds quickly and painlessly." msgstr "" -"Ein chemisches Desinfektionsmittel in Pulverform. Dieses Jodid reinigt " -"Wunden kurz und schmerzlos." #: lang/json/COMESTIBLE_from_json.py msgid "caffeinated chewing gum" @@ -29225,13 +29323,10 @@ msgstr[1] "Wasserstoffperoxid" #. ~ Description for hydrogen peroxide #: lang/json/COMESTIBLE_from_json.py msgid "" -"Dilute hydrogen peroxide, for use as a disinfectant and for bleaching hair " -"or textiles. Foams a little when in contact with organic matter, but " +"Dilute hydrogen peroxide, for use as an antiseptic and for bleaching hair or" +" textiles. Foams a little when in contact with organic matter, but " "otherwise harmless." msgstr "" -"Verdünntes Wasserstoffperoxid, für die Verwendung als Desinfektionsmittel " -"und für die Aufhellung von Haar oder Textilien. Schäumt ein bisschen, wenn " -"es in Kontakt mit organischer Materie kommt, aber ansonsten ist es harmlos." #: lang/json/COMESTIBLE_from_json.py lang/json/GENERIC_from_json.py msgid "cigarette" @@ -29402,27 +29497,23 @@ msgstr "" "brauchst immer noch viel Flüssigkeit und Schlaf." #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant" -msgstr "Desinfektionsmittel" +msgid "antiseptic" +msgstr "" -#. ~ Description for disinfectant +#. ~ Description for antiseptic #: lang/json/COMESTIBLE_from_json.py -msgid "A powerful disinfectant commonly used for contaminated wounds." +msgid "A powerful antiseptic commonly used for contaminated wounds." msgstr "" -"Ein starkes Desinfektionsmittel, das üblicherweise für kontaminierte Wunden " -"gebraucht wird." #: lang/json/COMESTIBLE_from_json.py -msgid "makeshift disinfectant" -msgstr "behelfsmäßiges Desinfektionsmittel" +msgid "makeshift antiseptic" +msgstr "" -#. ~ Description for makeshift disinfectant +#. ~ Description for makeshift antiseptic #: lang/json/COMESTIBLE_from_json.py msgid "" -"Makeshift disinfectant made from ethanol. Can be used to disinfect a wound." +"Makeshift antiseptic made from ethanol. Can be used to disinfect a wound." msgstr "" -"Behelfsmäßiges Desinfektionsmittel aus Ethanol. Kann benutzt werden, um eine" -" Wunde zu desinfizieren." #: lang/json/COMESTIBLE_from_json.py src/addiction.cpp msgid "diazepam" @@ -29826,10 +29917,8 @@ msgstr "Thymianöl" #: lang/json/COMESTIBLE_from_json.py msgid "" "Some essential oil made from thyme, which can act as a mildly irritating " -"disinfectant." +"antiseptic." msgstr "" -"Etwas ätherisches Öl aus Thymian, welches als etwas hautreizendes " -"Desinfektionsmittel verwendet werden kann." #: lang/json/COMESTIBLE_from_json.py msgid "rolling tobacco" @@ -30042,28 +30131,28 @@ msgstr "" "generische Name ist Alprazolam." #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant soaked rag" -msgid_plural "disinfectant soaked rags" -msgstr[0] "desinfektionsmittelgetränkter Lumpen" -msgstr[1] "desinfektionsmittelgetränkte Lumpen" +msgid "antiseptic soaked rag" +msgid_plural "antiseptic soaked rags" +msgstr[0] "" +msgstr[1] "" -#. ~ Description for disinfectant soaked rag +#. ~ Description for antiseptic soaked rag #: lang/json/COMESTIBLE_from_json.py msgid "" -"A rag soaked in disinfectant. Useful for light wounds, probaby won't help " -"with deep bites." +"A rag soaked in antiseptic. Useful for light wounds, probaby won't help with" +" deep bites." msgstr "" #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant soaked cotton balls" -msgid_plural "disinfectant soaked cotton balls" -msgstr[0] "desinfektionsmittelgetränktes Wattebällchen" -msgstr[1] "desinfektionsmittelgetränkte Wattebällchen" +msgid "antiseptic soaked cotton balls" +msgid_plural "antiseptic soaked cotton balls" +msgstr[0] "" +msgstr[1] "" -#. ~ Description for disinfectant soaked cotton balls +#. ~ Description for antiseptic soaked cotton balls #: lang/json/COMESTIBLE_from_json.py msgid "" -"Fluffy balls of clean white cotton. Now soaked with disinfectant, they are " +"Fluffy balls of clean white cotton. Now soaked with antiseptic, they are " "somewhat useful to disinfect a wound." msgstr "" @@ -32888,6 +32977,20 @@ msgstr[1] "Marmeladenbrote" msgid "A delicious jam sandwich." msgstr "Ein leckeres Marmeladenbrot." +#: lang/json/COMESTIBLE_from_json.py +msgid "fairy bread" +msgid_plural "fairy bread" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for fairy bread +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"An 'open-faced sandwich' consisting of sliced white bread, a healthy crust-" +"to-crust slathering of butter, and sprinkles. Supposedly a staple of " +"birthday parties in Australia." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "honey sandwich" msgid_plural "honey sandwiches" @@ -34146,6 +34249,21 @@ msgstr "" "Süßer süßer Zucker. Schlecht für deine Zähne und überraschenderweise nicht " "sehr lecker für sich alleine genommen." +#: lang/json/COMESTIBLE_from_json.py +msgid "sprinkles" +msgid_plural "sprinkles" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for sprinkles +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Known as nonpareils, sprinkles, jimmies, sugar strands or 'hundreds-and-" +"thousands', these colorful balls, rods or flakes of sugar and starch are " +"intended for use decorating soft surfaces of sweets. Like sugar, they are " +"bad for your teeth and surprisingly not very tasty on their own." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "wild herbs" msgid_plural "wild herbs" @@ -37572,8 +37690,8 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "throwing axe" msgid_plural "throwing axes" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Wurfaxt" +msgstr[1] "Wurfäxte" #. ~ Description for throwing axe #: lang/json/GENERIC_from_json.py @@ -39115,6 +39233,21 @@ msgstr "" "Glastafel enthält ein Miniaturmuster mit allen Anweisungen, die erforderlich" " sind, um einen Gegenstand mittels eines Nanofabrikators zu erzeugen." +#: lang/json/GENERIC_from_json.py +msgid "nanofabricator template (silicon photonics)" +msgid_plural "nanofabricator template (silicon photonics)s" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for nanofabricator template (silicon photonics) +#: lang/json/GENERIC_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "antenna" msgid_plural "antennas" @@ -44162,7 +44295,7 @@ msgstr[1] "" #. ~ Description for .300BLK casing #: lang/json/GENERIC_from_json.py -msgid "An empty casing from a .300BLK round." +msgid "An empty casing from a .300 AAC Blackout round." msgstr "" #: lang/json/GENERIC_from_json.py @@ -45889,6 +46022,36 @@ msgid "" "had fake black soot painted on." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "blackjack" +msgid_plural "blackjacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for blackjack +#: lang/json/GENERIC_from_json.py +msgid "" +"This is a short, easily concealed bludgeoning weapon consisting of a weight " +"embedded at the end of a short leather shaft. Formerly used by law " +"enforcement, this weapon is meant to stun or knock out the subject, although" +" head strikes have a high risk of causing a permanent, disabling brain " +"injury or being fatal." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "makeshift sap" +msgid_plural "makeshift saps" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for makeshift sap +#: lang/json/GENERIC_from_json.py +msgid "" +"This is an improvised sap, also known as a cosh, slapjack and slapper. A " +"short and flat bludgeoning weapon consisting of a weight embedded between " +"two patches of leather." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "pointy stick" msgid_plural "pointy sticks" @@ -46432,6 +46595,30 @@ msgstr "" " Fechtsäbel ist geringfügig kürzer als Florett oder Degen, aber nicht " "weniger effektiv." +#: lang/json/GENERIC_from_json.py +msgid "hollow cane" +msgid_plural "hollow canes" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for hollow cane +#: lang/json/GENERIC_from_json.py +msgid "" +"A cane designed to conceal blade. This was a popular fashion accessory for " +"the wealthy during the 18th and 19th centuries." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "sword cane" +msgid_plural "sword canes" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for sword cane +#: lang/json/GENERIC_from_json.py +msgid "A sword with a thin blade designed to be hidden inside an hollow cane." +msgstr "" + #: lang/json/GENERIC_from_json.py lang/json/TOOL_from_json.py #: lang/json/TOOL_from_json.py msgid "cutlass" @@ -48515,8 +48702,8 @@ msgstr "Ein ungehobelter Holztisch." #: lang/json/vehicle_part_from_json.py msgid "workbench" msgid_plural "workbenchs" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Werkbank" +msgstr[1] "Werkbänke" #. ~ Description for workbench #: lang/json/GENERIC_from_json.py lang/json/furniture_from_json.py @@ -54053,6 +54240,15 @@ msgstr "" msgid "A cheap 6-round steel box magazine for the Jennings J-22." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "Walther P22 magazine" +msgstr "" + +#. ~ Description for Walther P22 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round box magazine for the Walther P22." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "LW-5 speedloader" msgstr "" @@ -54497,6 +54693,20 @@ msgstr "" msgid "A cheap 32-round steel box magazine for use with the MAC-11 SMG." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "CF-380 magazine" +msgstr "" + +#. ~ Description for CF-380 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Hi-Point CF-380." +msgstr "" + +#. ~ Description for CF-380 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point CF-380." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "M1911 .38 Super magazine" msgstr "" @@ -54562,6 +54772,43 @@ msgid "" "expect much reliability." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "Hi-Power magazine .40 S&W" +msgstr "" + +#. ~ Description for Hi-Power magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Browning Hi-Power .40 S&W." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine .40 S&W" +msgstr "" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 12 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 14 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "Model JCP magazine" +msgstr "" + +#. ~ Description for Model JCP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point Model JCP." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "grenade belt" msgstr "Granatengürtel" @@ -54587,6 +54834,8 @@ msgid "" "A removable plastic box magazine for the Saiga-410 shotgun. Holds 10 " "shells." msgstr "" +"Ein abnehmbares Kastenmagazin aus Plastik für die Saiga-12-Flinte. Fasst 10 " +"Schuss." #: lang/json/MAGAZINE_from_json.py msgid "Saiga-410 drum magazine" @@ -54598,10 +54847,12 @@ msgid "" "A removable plastic drum magazine for the Saiga-410 shotgun. Holds 30 " "shells." msgstr "" +"Ein abnehmbares Trommelmagazin aus Plastik für die Saiga-12-Flinte. Fasst 30" +" Schuss." #: lang/json/MAGAZINE_from_json.py msgid ".44 6-round speedloader" -msgstr "" +msgstr ".44 6-Patronen Schnelllader" #. ~ Description for .44 6-round speedloader #: lang/json/MAGAZINE_from_json.py @@ -54609,6 +54860,8 @@ msgid "" "This speedloader can hold 6 rounds of .44 and quickly reload a compatible " "revolver." msgstr "" +"Dieser Schnelllader kann 6 Patronen vom Kaliber .44 halten und rasch einen " +"kompatiblen Revolver nachladen." #: lang/json/MAGAZINE_from_json.py msgid "Desert Eagle magazine" @@ -54657,7 +54910,7 @@ msgstr "" #: lang/json/MAGAZINE_from_json.py msgid "makeshift .45 20-round magazine" -msgstr "" +msgstr "selbstgemachtes .45 20-Patronen-Magazin" #. ~ Description for makeshift .45 20-round magazine #: lang/json/MAGAZINE_from_json.py @@ -54731,6 +54984,24 @@ msgstr "" "Ein Magazin mit Standardkapazität zur Verwendung mit der H&K-USP-" "Handfeuerwaffe." +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine .45 ACP" +msgstr "" + +#. ~ Description for PPQ magazine .45 ACP +#: lang/json/MAGAZINE_from_json.py +msgid "A 12 round steel box magazine for the Walther PPQ .45 ACP." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "Model JHP magazine" +msgstr "" + +#. ~ Description for Model JHP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 9-round steel box magazine for use with the Hi-Point Model JHP." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid ".454 5-round speedloader" msgstr "" @@ -55264,6 +55535,95 @@ msgstr "" msgid "A 17 round double stack box magazine for the SIG Sauer P320." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "Hi-Power magazine 9x19mm" +msgstr "" + +#. ~ Description for Hi-Power magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 13 round steel box magazine for the Browning Hi-Power 9x19mm." +msgstr "" + +#. ~ Description for Hi-Power magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 15 round steel box magazine for the Browning Hi-Power 9x19mm." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "P38 magazine" +msgstr "" + +#. ~ Description for P38 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8 round steel box magazine for the Walther P38." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine 9x19mm" +msgstr "" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Walther PPQ 9mm." +msgstr "" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 15 round steel box magazine for the Walther PPQ 9mm." +msgstr "" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 17 round steel box magazine for the Walther PPQ 9mm." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "C-9 magazine" +msgstr "" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Hi-Point C-9." +msgstr "" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point C-9." +msgstr "" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 15-round steel box magazine for use with the Hi-Point C-9." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "CZ 75 magazine" +msgstr "" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 12-round steel box magazine for use with the CZ 75." +msgstr "" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 20-round steel box magazine for use with the CZ 75." +msgstr "" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 26-round steel box magazine for use with the CZ 75." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "CCP magazine" +msgstr "" + +#. ~ Description for CCP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Walther CCP." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "Makarov PM magazine" msgstr "Makarov-PM-Magazin" @@ -59304,11 +59664,8 @@ msgstr "Milspec-Geschützturm" #: lang/json/MONSTER_from_json.py msgid "" "Leadworks LLC's T-4A1 Sentry. It features improved firmware over General " -"Atomics' TX-1 9x19mm model and an automated M4 carbine." +"Atomics' TX-1 9x19mm model and an automated 5.56mm carbine." msgstr "" -"Die T-4A1 Sentry von Leadworks LLC. Sie hat gegenüber General Atomics’ Model" -" »TX-1 9×19mm« eine verbesserte Firmware und einen automatisierten " -"M4-Karabiner." #: lang/json/MONSTER_from_json.py msgid "debug monster" @@ -60931,6 +61288,47 @@ msgid "" "between walls and ceiling with limbs grown from its own disjointed ribs." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "gangrenous impaler" +msgstr "" + +#. ~ Description for gangrenous impaler +#: lang/json/MONSTER_from_json.py +msgid "" +"A corpse hideously twisted into an insect-like form. A hollow tendril " +"reaches out from its open thorax." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "The impaler launches a barb!" +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "trapped tendril" +msgstr "" + +#. ~ Description for trapped tendril +#: lang/json/MONSTER_from_json.py +msgid "" +"A great tendril of mutated flesh and sharpened bone. Emergent from a " +"crevice in the ruined floor, hundreds of human limbs seek freedom and writhe" +" incessantly from underneath its grotesque carapace. As enormous as it may " +"already be, you feel certain that this is just part of a creature much " +"bigger, for when it moves, you can feel this whole ruin tremble, as if an " +"unseen giant struggled against the weight of its concrete tomb." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "flesh wall" +msgstr "" + +#. ~ Description for flesh wall +#: lang/json/MONSTER_from_json.py +msgid "" +"A great lump of mutated flesh. It resembles the innards of some gigantic " +"creature and is covered in a grid of diminutive veins." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "bloated fungal zombie" msgstr "" @@ -64839,6 +65237,24 @@ msgid "" "effect. Starts very short range, increases rapidly with level." msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Summon Gangrenous Crawlers" +msgstr "" + +#. ~ Description for Summon Gangrenous Crawlers +#: lang/json/SPELL_from_json.py +msgid "Summons 2 permanent gangrenous crawlers." +msgstr "" + +#: lang/json/SPELL_from_json.py +msgid "Summon Gangrenous Monsters" +msgstr "" + +#. ~ Description for Summon Gangrenous Monsters +#: lang/json/SPELL_from_json.py +msgid "Summons 2 permanent gangrenous impalers." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Smite" msgstr "" @@ -71869,6 +72285,19 @@ msgid "" "used for cleaning impervious surfaces." msgstr "" +#: lang/json/TOOL_from_json.py +msgid "washing kit" +msgid_plural "washing kits" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for washing kit +#: lang/json/TOOL_from_json.py +msgid "" +"A combination kit of a washboard and a sponge. Everything you need to clean" +" items after the apocalypse." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "reading light" msgid_plural "reading lights" @@ -80359,6 +80788,10 @@ msgstr "" msgid "nails" msgstr "Nägel" +#: lang/json/ammunition_type_from_json.py +msgid "barb" +msgstr "" + #: lang/json/ammunition_type_from_json.py msgid "BBs" msgstr "BBs" @@ -80567,8 +81000,8 @@ msgid "components" msgstr "Komponenten" #: lang/json/ammunition_type_from_json.py -msgid "93mm RPG-7" -msgstr "93mm RPG-7" +msgid "RPG-7 rocket" +msgstr "" #: lang/json/ammunition_type_from_json.py msgid "rebreather filter" @@ -80702,18 +81135,6 @@ msgid "" "those in turn more often than massive objects." msgstr "" -#: lang/json/bionic_from_json.py -msgid "Advanced Microreactor System" -msgstr "Fortgeschrittenes Mikroreaktorsystem" - -#. ~ Description for Advanced Microreactor System -#: lang/json/bionic_from_json.py -msgid "" -"This stripped down mini-reactor is more efficient and safer than the base " -"model due to integrated radiation cleansers. There is no way to shut it " -"down once active, but you can toggle additional fuel intake." -msgstr "" - #: lang/json/bionic_from_json.py msgid "Alarm System" msgstr "Alarmanlage" @@ -81600,28 +82021,6 @@ msgstr "" "kannst. Allerdings kann die Verwendung dieses Systems eine erhöhte " "Reaktionszeit und Trägheit zur Folge haben." -#: lang/json/bionic_from_json.py -msgid "Plutonium Filter" -msgstr "Plutoniumfilter" - -#. ~ Description for Plutonium Filter -#: lang/json/bionic_from_json.py -msgid "" -"This set of tanks and filters allows you to extract plutonium from " -"radioactive slurry." -msgstr "" - -#: lang/json/bionic_from_json.py -msgid "Plutonium Purger" -msgstr "Plutoniumauswurf" - -#. ~ Description for Plutonium Purger -#: lang/json/bionic_from_json.py -msgid "" -"Triggers an emergency reactor fuel purge that ejects all fuel from your " -"reactor." -msgstr "" - #. ~ Description for Bionic Visual Impairment #: lang/json/bionic_from_json.py msgid "" @@ -81757,18 +82156,6 @@ msgid "" "amount of unarmed slashing damage whenever your fingertips are uncovered." msgstr "" -#: lang/json/bionic_from_json.py -msgid "Microreactor System" -msgstr "Mikroreaktorsystem" - -#. ~ Description for Microreactor System -#: lang/json/bionic_from_json.py -msgid "" -"This stripped down mini-reactor generates impressive amounts of bionic " -"power. There is no way to shut it down, but you can toggle additional fuel " -"intake. Irradiates your body when active." -msgstr "" - #: lang/json/bionic_from_json.py msgid "Recycler Unit" msgstr "Wiederverwertungseinheit" @@ -82242,6 +82629,52 @@ msgid "" "artificial but effective sensation of fatigue." msgstr "" +#: lang/json/bionic_from_json.py +msgid "Advanced Microreactor System" +msgstr "Fortgeschrittenes Mikroreaktorsystem" + +#. ~ Description for Advanced Microreactor System +#: lang/json/bionic_from_json.py +msgid "" +"This stripped down mini-reactor is more efficient and safer than the base " +"model due to integrated radiation cleansers. There is no way to shut it " +"down once active, but you can toggle additional fuel intake." +msgstr "" + +#: lang/json/bionic_from_json.py +msgid "Plutonium Filter" +msgstr "Plutoniumfilter" + +#. ~ Description for Plutonium Filter +#: lang/json/bionic_from_json.py +msgid "" +"This set of tanks and filters allows you to extract plutonium from " +"radioactive slurry." +msgstr "" + +#: lang/json/bionic_from_json.py +msgid "Plutonium Purger" +msgstr "Plutoniumauswurf" + +#. ~ Description for Plutonium Purger +#: lang/json/bionic_from_json.py +msgid "" +"Triggers an emergency reactor fuel purge that ejects all fuel from your " +"reactor." +msgstr "" + +#: lang/json/bionic_from_json.py +msgid "Microreactor System" +msgstr "Mikroreaktorsystem" + +#. ~ Description for Microreactor System +#: lang/json/bionic_from_json.py +msgid "" +"This stripped down mini-reactor generates impressive amounts of bionic " +"power. There is no way to shut it down, but you can toggle additional fuel " +"intake. Irradiates your body when active." +msgstr "" + #: lang/json/bionic_from_json.py msgid "Internal Furnace" msgstr "Interner Ofen" @@ -82376,9 +82809,7 @@ msgstr "Das Ausweichen und der Nahkampf werden entsprechend beeinträchtigt." #: lang/json/bodypart_from_json.py src/armor_layers.cpp src/character.cpp #: src/debug_menu.cpp msgid "Torso" -msgid_plural "Torso" -msgstr[0] "Torso" -msgstr[1] "Torso" +msgstr "Torso" #. ~ Crafting recipes subcategory of 'ARMOR' category #: lang/json/bodypart_from_json.py lang/json/recipe_category_from_json.py @@ -82397,9 +82828,7 @@ msgstr "Kopf" #: lang/json/bodypart_from_json.py src/armor_layers.cpp src/character.cpp #: src/debug_menu.cpp msgid "Head" -msgid_plural "Head" -msgstr[0] "Kopf" -msgstr[1] "Kopf" +msgstr "Kopf" #. ~ Crafting recipes subcategory of 'ARMOR' category #: lang/json/bodypart_from_json.py lang/json/recipe_category_from_json.py @@ -82421,9 +82850,7 @@ msgstr "Der Fernkampf wird entsprechend beeinträchtigt." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "Eyes" -msgid_plural "Eyes" -msgstr[0] "Augen" -msgstr[1] "Augen" +msgstr "Augen" #: lang/json/bodypart_from_json.py msgid "mouth" @@ -82440,9 +82867,7 @@ msgstr "Das Rennen wird entsprechend verlangsamt." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "Mouth" -msgid_plural "Mouth" -msgstr[0] "Mund" -msgstr[1] "Mund" +msgstr "Mund" #: lang/json/bodypart_from_json.py msgid "left arm" @@ -82453,15 +82878,26 @@ msgctxt "bodypart_accusative" msgid "left arm" msgstr "linker Arm" +#: lang/json/bodypart_from_json.py +msgid "arms" +msgstr "Arme" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "arms" +msgstr "Arme" + #: lang/json/bodypart_from_json.py msgid "Melee and ranged combat is hampered." msgstr "Der Nah- und der Fernkampf werden entsprechend beeinträchtigt." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Arm" -msgid_plural "Arms" -msgstr[0] "L. Arm" -msgstr[1] "Arme" +msgstr "L. Arm" + +#: lang/json/bodypart_from_json.py +msgid "Arms" +msgstr "Arme" #: lang/json/bodypart_from_json.py msgid "L ARM" @@ -82478,9 +82914,7 @@ msgstr "rechter Arm" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Arm" -msgid_plural "Arms" -msgstr[0] "R. Arm" -msgstr[1] "Arme" +msgstr "R. Arm" #: lang/json/bodypart_from_json.py msgid "R ARM" @@ -82495,15 +82929,26 @@ msgctxt "bodypart_accusative" msgid "left hand" msgstr "linke Hand" +#: lang/json/bodypart_from_json.py +msgid "hands" +msgstr "Hände" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "hands" +msgstr "Hände" + #: lang/json/bodypart_from_json.py msgid "Manual tasks are slowed." msgstr "Das Arbeiten mit den Händen wird entsprechend verlangsamt." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Hand" -msgid_plural "Hands" -msgstr[0] "L. Hand" -msgstr[1] "Hände" +msgstr "L. Hand" + +#: lang/json/bodypart_from_json.py +msgid "Hands" +msgstr "Hände" #: lang/json/bodypart_from_json.py msgid "right hand" @@ -82516,9 +82961,7 @@ msgstr "rechte Hand" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Hand" -msgid_plural "Hands" -msgstr[0] "R. Hand" -msgstr[1] "Hände" +msgstr "R. Hand" #: lang/json/bodypart_from_json.py msgid "left leg" @@ -82529,15 +82972,26 @@ msgctxt "bodypart_accusative" msgid "left leg" msgstr "linkes Bein" +#: lang/json/bodypart_from_json.py +msgid "legs" +msgstr "Beine" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "legs" +msgstr "Beine" + #: lang/json/bodypart_from_json.py msgid "Running and swimming are slowed." msgstr "Das Laufen und Schwimmen werden entsprechend verlangsamt." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Leg" -msgid_plural "Legs" -msgstr[0] "L. Bein" -msgstr[1] "Beine" +msgstr "L. Bein" + +#: lang/json/bodypart_from_json.py +msgid "Legs" +msgstr "Beine" #: lang/json/bodypart_from_json.py msgid "L LEG" @@ -82554,9 +83008,7 @@ msgstr "rechtes Bein" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Leg" -msgid_plural "Legs" -msgstr[0] "R. Bein" -msgstr[1] "Beine" +msgstr "R. Bein" #: lang/json/bodypart_from_json.py msgid "R LEG" @@ -82571,11 +83023,22 @@ msgctxt "bodypart_accusative" msgid "left foot" msgstr "linker Fuß" +#: lang/json/bodypart_from_json.py +msgid "feet" +msgstr "Füße" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "feet" +msgstr "Füße" + #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Foot" -msgid_plural "Feet" -msgstr[0] "L. Fuß" -msgstr[1] "Füße" +msgstr "L. Fuß" + +#: lang/json/bodypart_from_json.py +msgid "Feet" +msgstr "Füße" #: lang/json/bodypart_from_json.py msgid "right foot" @@ -82588,15 +83051,11 @@ msgstr "rechter Fuß" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Foot" -msgid_plural "Feet" -msgstr[0] "R. Fuß" -msgstr[1] "Füße" +msgstr "R. Fuß" #: lang/json/bodypart_from_json.py msgid "appendix" -msgid_plural "Appendices" -msgstr[0] "Blinddarm" -msgstr[1] "Blinddärme" +msgstr "Blinddarm" #: lang/json/bodypart_from_json.py msgctxt "bodypart_accusative" @@ -82607,6 +83066,10 @@ msgstr "Blinddarm" msgid "It's inflamed." msgstr "Ist entzündet." +#: lang/json/bodypart_from_json.py +msgid "Appendices" +msgstr "Blinddärme" + #: lang/json/clothing_mod_from_json.py msgid "Pad with leather" msgstr "Mit Leder auspolstern" @@ -82846,7 +83309,7 @@ msgstr "" #: lang/json/construction_from_json.py msgid "Build Wooden Floor" -msgstr "" +msgstr "Holzfußboden bauen" #: lang/json/construction_from_json.py msgid "Build Simple Concrete Wall" @@ -91892,7 +92355,9 @@ msgstr "" "ist. Von dieser Waffe abgefeuerte Bolzen haben eine gute Chance, für die " "Wiederverwendung intakt zu bleiben." -#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py src/item.cpp +#: lang/json/gun_from_json.py lang/json/gun_from_json.py +#: lang/json/gunmod_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gunmod_from_json.py src/item.cpp msgctxt "gun_type_type" msgid "pistol" msgstr "Pistole" @@ -92035,6 +92500,21 @@ msgstr "" "ermöglicht eine Druckablassung, allerdings benötigt dieser Vorgang einige " "wenige Minuten." +#: lang/json/gun_from_json.py +msgid "simple flamethrower" +msgid_plural "simple flamethrowers" +msgstr[0] "einfacher Flammenwerfer" +msgstr[1] "einfache Flammenwerfer" + +#: lang/json/gun_from_json.py +msgid "" +"A simple, home-made flamethrower. While its capacity is not superb, it is " +"more than capable of igniting terrain and monsters alike." +msgstr "" +"Ein einfacher, selbstgebauter Flammenwerfer. Wobei seine Kapazität nicht " +"grandios ist, ist es vollkommen fähig dazu, Gelände und Monster " +"gleichermaßen anzuzünden." + #: lang/json/gun_from_json.py msgid "BB gun" msgid_plural "BB guns" @@ -92723,6 +93203,19 @@ msgid "" "safety issues." msgstr "" +#: lang/json/gun_from_json.py +msgid "Walther P22" +msgid_plural "Walther P22s" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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" +msgstr "" + #: lang/json/gun_from_json.py msgid "Remington ACR" msgid_plural "Remington ACRs" @@ -93772,6 +94265,20 @@ msgid "" " make for a moderately poor handling pistol." msgstr "" +#: lang/json/gun_from_json.py +msgid "Hi-Point CF-380" +msgid_plural "Hi-Point CF-380s" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "M1911A1" msgid_plural "M1911A1s" @@ -93865,6 +94372,47 @@ msgstr "" "Die Smith and Wesson 610 ist ein klassischer 6-schüssiger Revolver für 10mm-" "Patronen oder für S&Ws eigene .40-Patronen." +#: lang/json/gun_from_json.py +msgid "Browning Hi-Power .40 S&W" +msgid_plural "Browning Hi-Power .40 S&Ws" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Browning Hi-Power is a semi-automatic handgun developed shortly before " +"the second world war. Widely issued since then, it remains in use by India, " +"Canada and Australia. This is a commercial variant produced by Browning Arms" +" in .40 S&W." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther PPQ .40 S&W" +msgid_plural "Walther PPQ .40 S&Ws" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in .40 S&W." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Hi-Point Model JCP" +msgid_plural "Hi-Point Model JCPs" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "tube 40mm launcher" msgid_plural "tube 40mm launchers" @@ -94234,6 +94782,33 @@ msgid_plural "USP .45s" msgstr[0] "USP .45" msgstr[1] "USP .45s" +#: lang/json/gun_from_json.py +msgid "Walther PPQ .45 ACP" +msgid_plural "Walther PPQ .45 ACPs" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in .45 ACP." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Hi-Point Model JHP" +msgid_plural "Hi-Point Model JHPs" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "Taurus Raging Bull" msgid_plural "Taurus Raging Bull" @@ -95275,6 +95850,94 @@ msgid "" "SIG Sauer P320." msgstr "" +#: lang/json/gun_from_json.py +msgid "Browning Hi-Power 9x19mm" +msgid_plural "Browning Hi-Power 9x19mms" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Browning Hi-Power is a semi-automatic handgun developed shortly before " +"the second world war. Widely issued since then, it remains in use by India, " +"Canada and Australia. This is a commercial variant produced by Browning Arms" +" in 9x19mm Parabellum." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther P38" +msgid_plural "Walther P38s" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther PPQ 9mm" +msgid_plural "Walther PPQ 9mms" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in 9x19mm Parabellum." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Hi-Point C-9" +msgid_plural "Hi-Point C-9s" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "CZ-75" +msgid_plural "CZ-75s" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The CZ-75 is a semi-automatic pistol developed in Czechoslovakia, and is one" +" of the original wonder nines. Though designed for export to western " +"countries, it was declared a state secret; lack of international patent " +"protection meant that many clones and variants were produced and distributed" +" around the world, with Česká zbrojovka only joining in the 90's. This " +"pistol remains wildly popular among competition shooters." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther CCP" +msgid_plural "Walther CCPs" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "Makarov PM" msgid_plural "Makarov PMs" @@ -95381,21 +96044,6 @@ msgstr "" "Ein großer Flammenwerfer mit beträchtlichen Gasreserven. Sehr bedrohlich und" " tödlich." -#: lang/json/gun_from_json.py -msgid "simple flamethrower" -msgid_plural "simple flamethrowers" -msgstr[0] "einfacher Flammenwerfer" -msgstr[1] "einfache Flammenwerfer" - -#: lang/json/gun_from_json.py -msgid "" -"A simple, home-made flamethrower. While its capacity is not superb, it is " -"more than capable of igniting terrain and monsters alike." -msgstr "" -"Ein einfacher, selbstgebauter Flammenwerfer. Wobei seine Kapazität nicht " -"grandios ist, ist es vollkommen fähig dazu, Gelände und Monster " -"gleichermaßen anzuzünden." - #: lang/json/gun_from_json.py msgid "RM451 flamethrower" msgid_plural "RM451 flamethrowers" @@ -95525,6 +96173,16 @@ msgstr "" "elektromagnetischer Induktion generiert wird, zur Selbstentzündung gebracht " "wird. Das Gewehr wird mit einer Esz. betrieben." +#: lang/json/gun_from_json.py +msgid "barb launching organ" +msgid_plural "barb launching organs" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "A mutated organ capable of launching bony barbs at great speed." +msgstr "" + #: lang/json/gun_from_json.py msgid "coilgun" msgid_plural "coilguns" @@ -96187,6 +96845,19 @@ msgstr "" "Ziele durchdringt. Das Ionenprojektil entzündet Sauerstoff, was Feuer bei " "der Bewegung und eine Explosion beim Einschlag verursacht." +#: lang/json/gun_from_json.py +msgid "Yeet Cannon" +msgid_plural "Yeet Cannons" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"You can YEET all the bullets with this baby. YEET them right into all of the" +" zombies in your path, all the hulks, the spiders, and those damned mole " +"rats." +msgstr "" + #: lang/json/gun_from_json.py msgid "SVS-24" msgid_plural "SVS-24" @@ -98180,27 +98851,6 @@ msgstr "" "-Casull-Patrone benutzt. Er ist in der Lage, .410-Schrotpatronen und .45" "-Long-Colt-Patronen zu feuern." -#: lang/json/gunmod_from_json.py -msgid ".300 AAC Blackout caliber conversion kit" -msgid_plural ".300 AAC Blackout caliber conversion kits" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/gunmod_from_json.py -msgid "" -"This kit is used to convert an AR-15 .223/5.56mm rifle to the new .300BLK " -"caliber." -msgstr "" - -#: lang/json/gunmod_from_json.py -msgid "bore" -msgstr "Kaliber" - -#: lang/json/gunmod_from_json.py -msgctxt "gun_type_type" -msgid "ar15" -msgstr "AR15" - #: lang/json/gunmod_from_json.py msgid "barrel extension" msgid_plural "barrel extensions" @@ -98301,6 +98951,10 @@ msgstr "" "zu einer .22-Feuerwaffe um. Der Umbau resultiert in einer leicht geringeren " "Treffergenauigkeit." +#: lang/json/gunmod_from_json.py +msgid "bore" +msgstr "Kaliber" + #: lang/json/gunmod_from_json.py msgid ".223 caliber conversion kit" msgid_plural ".223 caliber conversion kits" @@ -98669,6 +99323,36 @@ msgstr "" "Ein Beutel, der an der Seite deiner Waffe hängt und abgeschossene " "Patronenhülsen auffängt, um sie später nicht per Hand einsammeln zu müssen." +#: lang/json/gunmod_from_json.py +msgid ".300 AAC Blackout AR-15 conversion kit" +msgid_plural ".300 AAC Blackout AR-15 conversion kits" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gunmod_from_json.py +msgid "A complete AR-15 upper assembly with a .300 AAC Blackout barrel." +msgstr "" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "ar15" +msgstr "AR15" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "m4a1" +msgstr "" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "h&k416a5" +msgstr "" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "m27iar" +msgstr "" + #: lang/json/gunmod_from_json.py msgid "lightweight replacement furniture" msgid_plural "lightweight replacement furnitures" @@ -100949,11 +101633,11 @@ msgstr "" #: lang/json/help_from_json.py msgid "" -"While magazines are often firearm-specific, on some occasions a magazine is compatible with several other firearms. The firearms in the game often reflect real-world prototypes in terms of caliber and compatibility. Below are some examples of interchangeable ammo:\n" -".308 = 7.62x51mm,\n" -".223 = 5.56 NATO,\n" -".270 = .30-06,\n" -".40 S&W = 10mm." +"While magazines and clips are often firearm-specific, on some occasions a magazine/speedloader is compatible with several other firearms or calibers. Below are some examples of calibers that might share magazines or speedloaders:\n" +".380 ACP and 9mm Luger,\n" +" .40 S&W and 10mm Auto 3\n" +".45 ACP and .460 Rowland,\n" +".45 Colt and .454 Casull." msgstr "" #: lang/json/help_from_json.py @@ -102078,8 +102762,9 @@ msgid "Measure radiation" msgstr "Strahlung messen" #: lang/json/item_action_from_json.py lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py #: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py -#: lang/json/talk_topic_from_json.py src/game_inventory.cpp +#: src/game_inventory.cpp msgid "..." msgstr "…" @@ -102141,11 +102826,15 @@ msgid "Well, you know" msgstr "Naja, du weißt schon" #: lang/json/item_action_from_json.py -msgid "Wash clothes" -msgstr "Kleidung waschen" +msgid "Wash soft items" +msgstr "" #: lang/json/item_action_from_json.py -msgid "Wash CBMs" +msgid "Wash hard items" +msgstr "" + +#: lang/json/item_action_from_json.py +msgid "Wash items" msgstr "" #: lang/json/item_action_from_json.py @@ -105855,6 +106544,41 @@ msgid "the name is gone but a slogan remains: 'We'll repair you all the way'" msgstr "" "Der Name fehlt, aber ein Slogan bleibt: »Wir reparieren einfach alles!«." +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "EnviroCom OS v2.03 - Basement Access" +msgstr "" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Unlock stairs" +msgstr "Treppen entsperren" + +#. ~ Sign +#: lang/json/mapgen_from_json.py +msgid "Authorized personnel only" +msgstr "" + +#. ~ Sign +#: lang/json/mapgen_from_json.py +msgid " sewage treatment plant" +msgstr "" + +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "EnviroCom OS v2.03" +msgstr "UmweltKom-BeSy v2.03" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Download Sewer Maps" +msgstr "Abwasserkanalkarten herunterladen" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Divert sample" +msgstr "Probe ableiten" + #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Evac shelter computer" @@ -106469,6 +107193,43 @@ msgid "" "Blocked damage reduced by 50%% of Dexterity." msgstr "" +#. ~ Description for martial art 'Fior Di Battaglia' +#: lang/json/martial_art_from_json.py +msgid "" +"Medieval Europe's martial techniques for fighting with polearms. The " +"\"Flower of Battle\" places great focus on countering one's opponent and " +"knocking them down before landing a killing blow" +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stand Your Ground" +msgstr "" + +#. ~ Description of buff 'Stand Your Ground' for martial art 'Fior Di +#. Battaglia' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You stalwart and will not budge against any threat.\n" +"\n" +"+2 Block attempts, -1.0 Dodge skill, blocked damage reduced by 50%% of Strength." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Tactical Retreat" +msgstr "" + +#. ~ Description of buff 'Tactical Retreat' for martial art 'Fior Di +#. Battaglia' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You moved and nullified the effects of Stand Your Ground!\n" +"\n" +"-2 Block attempts, +1.0 Dodge skill, blocked damaged increased by 50%% of Strength.\n" +"Lasts 1 turn." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Karate" msgstr "Karate" @@ -106968,35 +107729,6 @@ msgstr "" msgid "Perception increases dodging ability, +1 dodges per turn" msgstr "" -#. ~ Description for martial art 'Fior Di Battaglia' -#: lang/json/martial_art_from_json.py -msgid "" -"Medieval Europe's martial techniques for fighting with polearms, great focus" -" is given in countering one's opponent and knocking them down before landing" -" a killing blow" -msgstr "" - -#: lang/json/martial_art_from_json.py -msgid "Stand Your Ground" -msgstr "" - -#. ~ Description of buff 'Stand Your Ground' for martial art 'Fior Di -#. Battaglia' -#: lang/json/martial_art_from_json.py -msgid "" -"+2 blocks -1 dodge, halves your dodge and damage is reduced by your strength" -" when blocking" -msgstr "" - -#: lang/json/martial_art_from_json.py -msgid "You moved" -msgstr "" - -#. ~ Description of buff 'You moved' for martial art 'Fior Di Battaglia' -#: lang/json/martial_art_from_json.py -msgid "Nullifies Stand Your Ground, don't move, stand there and counter!" -msgstr "" - #: lang/json/martial_art_from_json.py msgid "Medieval Swordsmanship" msgstr "Mittelalterliche Schwertkunst" @@ -109100,39 +109832,6 @@ msgstr "Danke sehr dafür, dass du ihn gefunden hast!" msgid "Oh no! My poor puppy..." msgstr "Oh nein! Mein armes Hündchen …" -#: lang/json/mission_def_from_json.py -msgid "Find 100 Cigarettes" -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "Come on man, I just need a smoke." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "" -"With all that's been going on, it's been more and more difficult to find a " -"smoke. My stash has been running low for a while now. Think you could help" -" me out here? A few packs is all I need." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "Thanks, it's great to see someone willing to help a guy out." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "" -"Plenty of smokers in towns. Gotta be some left over cigs in some of them " -"houses." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "Got the smokes?" -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "Thanks! I'll be sure to put in a good word for you around the center." -msgstr "" - #: lang/json/mission_def_from_json.py msgid "Break into armory to retrieve family photo" msgstr "" @@ -110495,7 +111194,7 @@ msgid "" msgstr "" #: lang/json/mission_def_from_json.py -msgid "Find 50 3L jars" +msgid "In a Pickle Pt. 2" msgstr "" #: lang/json/mission_def_from_json.py @@ -110524,6 +111223,39 @@ msgid "" "payment." msgstr "" +#: lang/json/mission_def_from_json.py +msgid "Smokes, let's go." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Come on man, I just need a smoke." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"With all that's been going on, it's been more and more difficult to find a " +"smoke. My stash has been running low for a while now. Think you could help" +" me out here? A few packs is all I need." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Thanks, it's great to see someone willing to help a guy out." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Plenty of smokers in towns. Gotta be some left over cigs in some of them " +"houses." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Got the smokes?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Thanks! I'll be sure to put in a good word for you around the center." +msgstr "" + #: lang/json/mission_def_from_json.py msgid "Clear Back Bay" msgstr "Hinterhof säubern" @@ -110644,7 +111376,7 @@ msgid "" msgstr "" #: lang/json/mission_def_from_json.py -msgid "Find 10 solar panels" +msgid "Solar Power" msgstr "" #: lang/json/mission_def_from_json.py @@ -110676,7 +111408,7 @@ msgstr "" "ausbreiten können dank deiner Hilfe." #: lang/json/mission_def_from_json.py -msgid "Find 100 canning jars" +msgid "In a Pickle" msgstr "" #: lang/json/mission_def_from_json.py @@ -110998,8 +111730,8 @@ msgstr "" "Erklärungen kümmern." #: lang/json/mission_def_from_json.py -msgid "Kill ???" -msgstr "Töte ???" +msgid "Secure Trade Route" +msgstr "" #: lang/json/mission_def_from_json.py msgid "" @@ -111033,8 +111765,8 @@ msgstr "" "Gute Arbeit! Ich war mir nicht sicher, zu was ich dich geschickt habe." #: lang/json/mission_def_from_json.py -msgid "Kill Raider Leader" -msgstr "Räuberführer töten" +msgid "Assassinate Raider Leader" +msgstr "" #: lang/json/mission_def_from_json.py msgid "" @@ -111169,8 +111901,8 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" -"Remember, do extraction /exactly/ as specified, otherwise the bionic will " -"self-destruct." +"Remember, perform the extraction /exactly/ as specified, otherwise the " +"bionic will self-destruct." msgstr "" #: lang/json/mission_def_from_json.py @@ -111194,6 +111926,37 @@ msgstr "" msgid "You have our thanks and payment." msgstr "" +#: lang/json/mission_def_from_json.py +msgid "Light retrieval" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Our facility once sourced advanced photonic circuitry from a nearby robotics manufacturer. Their building suffered major damage during the portal storms, and collapsed almost entirely. However, preliminary scouting reveals that the basement prototyping lab likely remains intact.\n" +"\n" +"the intercom: We ask you to investigate the ruins, and if possible, retrieve a template for the fabrication of said photonic circuitry." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "We expect your success, mercenary." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Return if you change your mind." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"The scout drone also revealed extensive heat signatures and high " +"concentrations of toxic compounds within the ruins, plan accordingly. We " +"are willing to sell you some protective gear at a discount, if you require " +"it." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Have you retrieved the blueprints?" +msgstr "" + #: lang/json/mission_def_from_json.py msgid "Make 2 Stills" msgstr "2 Destillationsapparate herstellen" @@ -123223,6 +123986,10 @@ msgstr "Zuckerhaus" msgid "sugar house roof" msgstr "" +#: lang/json/overmap_terrain_from_json.py +msgid "rural road" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "farm field" msgstr "Bauernhof" @@ -125047,8 +125814,16 @@ msgid "parking garage" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "sewage treatment" -msgstr "Abwasserkläranlage" +msgid "sewage treatment plant" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment plant roof" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment plant - underground" +msgstr "" #: lang/json/overmap_terrain_from_json.py msgid "toxic waste dump" @@ -125355,6 +126130,10 @@ msgstr "" msgid "mechanics garage" msgstr "Mechanikergarage" +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment" +msgstr "Abwasserkläranlage" + #: lang/json/overmap_terrain_from_json.py msgid "mechanic garage" msgstr "Mechanikergarage" @@ -126378,6 +127157,34 @@ msgstr "" "runter und das Einzige, was dir durch den Kopf geht ist die Frage, woher du " "deinen nächsten Kick bekommst." +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Pillhead" +msgstr "" + +#. ~ Profession (male Pillhead) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"After an accident in your youth, you got addicted to the opiates treating " +"your pain. With the pharmacies shut down and dealers turned undead, " +"satisfying your fix just got a lot more difficult." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Pillhead" +msgstr "" + +#. ~ Profession (female Pillhead) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"After an accident in your youth, you got addicted to the opiates treating " +"your pain. With the pharmacies shut down and dealers turned undead, " +"satisfying your fix just got a lot more difficult." +msgstr "" + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "K9 Officer" @@ -133026,7 +133833,6 @@ msgid "WEAPON" msgstr "WAFFE" #. ~ Crafting recipes subcategory all -#. ~ Crafting recipes subcategory of 'ENCHANTED' category #: lang/json/recipe_category_from_json.py #: lang/json/recipe_category_from_json.py src/crafting_gui.cpp msgid "ALL" @@ -136489,10 +137295,8 @@ msgstr "" "was du gerade brauchst." #: lang/json/snippet_from_json.py -msgid "Wounds heal over time. Bandages and disinfectant speeds that up." +msgid "Wounds heal over time. Bandages and antiseptic speeds that up." msgstr "" -"Wunden heilen im Laufe der Zeit. Bandagen und Desinfektionsmittel können den" -" Heilungsprozess zudem beschleunigen." #: lang/json/snippet_from_json.py msgid "Don't get grabbed by zombies. Their bites can be infectious." @@ -137440,8 +138244,8 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "" -"If you have extra disinfectant, use it to disinfect your wounds, even if " -"they aren't infected. They will recover faster that way." +"If you have extra antiseptic, use it to disinfect your wounds, even if they " +"aren't infected. They will recover faster that way." msgstr "" #: lang/json/snippet_from_json.py @@ -144684,17 +145488,6 @@ msgstr "" " »Die Leute haben Angst um ihre Berufe, ihr Land, sogar um ihr Leben … " "Natürlich greifen einige von ihnen zu Drogen.« sagte ein Experte." -#: lang/json/snippet_from_json.py -msgid "" -"WAR ON DRUGS DEAD: The government has finally reacted to long accumulated " -"evidence that suggests that decriminalized drugs cause fewer health problems" -" and are generally better managed while providing valuable tax revenues." -msgstr "" -"DROGENKRIEG BEENDET: Die Regierung hat endlich auf die lang angesammelten " -"Beweise reagiert, welche darauf hindeuteten, dass entkriminalisierte Drogen " -"weniger Gesundheitsprobleme verursachen und grundsätzlich besser gehandhabt " -"weden sollten, während sie wertvolle Steuereinnahmen bieten." - #: lang/json/snippet_from_json.py msgid "" "FEELING BLUE? Try \"Greens\" for Magazines! Your local Supermarket! " @@ -149870,8 +150663,7 @@ msgid "" "Bionics are augmentation packages, right? They come in these installable Compact Bionic Modules or CBMs, and I can use some CBMs - if you examine a CBM, it will tell you if I can use it.\n" " Find a programmable surgical installer or autodoc, position me on the couch, and activate it, and you can install a suitable CBM to me - or if I think I'll do a better job, I'll do. I'll take over installing CBMs into you if I'm better at it.\n" " I can use almost all passive bionics and some active bionics. If I have any active bionics, I'll try to use them sensibly, but if we're in danger, I'm going to activate anything that might give me an edge. I'll use any weapon bionics if they're better than the weapons you gave me, but if you think I should reserve my bionic energy for my defensive and healing bionics, you can tell me how much to reserve. I'll try to keep my bionic energy topped off, but if we're running low on supplies, you can tell me to stop recharging when I'm not full.\n" -" I'll tell you if I'm low on bionic energy and can't recharge, and what fuel I need.\n" -" Sothere are some internal atomic reactor bionics - I can use those, but I can only recharge them with plutonium slurry. That stuff is radioactive, so do us both a favor and don't give me an internal reactor unless you really like glowing in the dark." +" I'll tell you if I'm low on bionic energy and can't recharge, and what fuel I need." msgstr "" #: lang/json/talk_topic_from_json.py @@ -150051,11 +150843,11 @@ msgid "Go back to sleep." msgstr "Leg dich wieder schlafen." #: lang/json/talk_topic_from_json.py -msgid " *pshhhttt* I'm reading you boss, over." +msgid "What is it, friend?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "What is it, friend?" +msgid " *pshhhttt* I'm reading you boss, over." msgstr "" #: lang/json/talk_topic_from_json.py @@ -150295,11 +151087,11 @@ msgid "Show me what needs to be done at the camp." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I'm currently ." +msgid "I'm not doing much currently." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I'm not doing much currently." +msgid "I'm currently ." msgstr "" #: lang/json/talk_topic_from_json.py @@ -150358,13 +151150,13 @@ msgstr "" "Was ist los?" #: lang/json/talk_topic_from_json.py -msgid "" -"Well, it's the time of day for a quick break surely! How are you holding " -"up?" +msgid "Man it's dark out isn't it? what's up?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Man it's dark out isn't it? what's up?" +msgid "" +"Well, it's the time of day for a quick break surely! How are you holding " +"up?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -150373,14 +151165,14 @@ msgstr "Nun, ich fühle mich ziemlich krank ... geht es dir wenigstens gut?" #: lang/json/talk_topic_from_json.py msgid "" -"Definitely, by the way, thanks for helping me so much with my tasks! " -"Anyway, you coping OK, ? " +"OK, let's take a moment, oh, and thanks for helping me with that thing, " +"so... what's up?" msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"OK, let's take a moment, oh, and thanks for helping me with that thing, " -"so... what's up?" +"Definitely, by the way, thanks for helping me so much with my tasks! " +"Anyway, you coping OK, ? " msgstr "" #: lang/json/talk_topic_from_json.py @@ -150457,14 +151249,14 @@ msgstr "Okay, keine plötzlichen Bewegungen!" msgid "Keep your distance!" msgstr "Bleib fern!" -#: lang/json/talk_topic_from_json.py -msgid "" -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "This is my territory, ." msgstr "Das ist mein Gebiet, ." +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Calm down. I'm not going to hurt you." msgstr "Ruhig Blut. Ich habe nicht vor, dich zu verletzen." @@ -150517,14 +151309,6 @@ msgstr "Worum geht’s?" msgid "I don't care." msgstr "Ist mir egal." -#: lang/json/talk_topic_from_json.py -msgid "I don't have any jobs for you." -msgstr "Ich hab nichts für dich zu tun." - -#: lang/json/talk_topic_from_json.py -msgid "I don't have any more jobs for you." -msgstr "Ich hab nichts weiteres für dich zu tun." - #: lang/json/talk_topic_from_json.py msgid "I have other jobs for you. Want to hear about them?" msgstr "" @@ -150533,13 +151317,21 @@ msgstr "" msgid "I have more jobs for you. Want to hear about them?" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "I just have one job for you. Want to hear about it?" +msgstr "Ich hab nur eine Aufgabe für dich. Willst du sie hören?" + #: lang/json/talk_topic_from_json.py msgid "I have another job for you. Want to hear about it?" msgstr "Ich habe noch eine Aufgabe für dich. Willst du sie hören?" #: lang/json/talk_topic_from_json.py -msgid "I just have one job for you. Want to hear about it?" -msgstr "Ich hab nur eine Aufgabe für dich. Willst du sie hören?" +msgid "I don't have any more jobs for you." +msgstr "Ich hab nichts weiteres für dich zu tun." + +#: lang/json/talk_topic_from_json.py +msgid "I don't have any jobs for you." +msgstr "Ich hab nichts für dich zu tun." #: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py #: src/npctalk.cpp @@ -150551,16 +151343,16 @@ msgid "Never mind, I'm not interested." msgstr "Vergiss es, ich bin nicht interessiert." #: lang/json/talk_topic_from_json.py -msgid "You're not working on anything for me now." -msgstr "" +msgid "What about it?" +msgstr "Wie wär’s?" #: lang/json/talk_topic_from_json.py msgid "Which job?" msgstr "Welche Aufgabe?" #: lang/json/talk_topic_from_json.py -msgid "What about it?" -msgstr "Wie wär’s?" +msgid "You're not working on anything for me now." +msgstr "" #: lang/json/talk_topic_from_json.py msgid "I'll do it!" @@ -157390,8 +158182,9 @@ msgid "All right! Let's get going." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "We've done it! We've solved the list!" +msgid "Have I told you about cardboard, friend? Do you have any?" msgstr "" +"Hab ich dir was über Pappkarton erzählt, mein Freund? Hast du welchen?" #: lang/json/talk_topic_from_json.py msgid "" @@ -157399,9 +158192,8 @@ msgid "" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Have I told you about cardboard, friend? Do you have any?" +msgid "We've done it! We've solved the list!" msgstr "" -"Hab ich dir was über Pappkarton erzählt, mein Freund? Hast du welchen?" #: lang/json/talk_topic_from_json.py msgid "About that shopping list of yours..." @@ -162019,6 +162811,10 @@ msgstr "" msgid "What the hell were you testing out there?" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "So, about that protective gear?" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "No. Now leave." msgstr "" @@ -162034,6 +162830,21 @@ msgid "" "Shame about what happened, with the evisceration and all..." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"Given the current context, we are willing to sell you a set of our protective gear: gas mask, suit and gear, at a considerable discount. We will sell it for two of our coins.\n" +"\n" +"the intercom: Hmm wait, we might not have your size..." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "[ 2 Hub 01 Gold Coins ] Deal!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I have to give it a thought." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Just leave." msgstr "" @@ -163873,6 +164684,86 @@ msgstr "" msgid " delivers a perfect riposte to %s" msgstr "" +#: lang/json/technique_from_json.py +msgid "Displace and Hook" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You parry and hook %s down" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " parries and hooks %s down" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "High Round Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You swing high and strike at %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " swings high and strikes %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "High Round Feint" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You fake a high round strike at %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " feints at %s" +msgstr " täuscht %s" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab you, but you push away!" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab , but they push away!" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Hook and Drag" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You hook and drag %s down" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " hooks and drags %s down" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Colpo di Grazia" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You swing down hard and execute %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " swings down hard and executes %s" +msgstr "" + #: lang/json/technique_from_json.py msgid "quick punch" msgstr "schneller Schlag" @@ -164050,11 +164941,6 @@ msgstr "Täuschungsmanöver" msgid "You feint at %s" msgstr "Du täuschst %s" -#: lang/json/technique_from_json.py -#, python-format -msgid " feints at %s" -msgstr " täuscht %s" - #: lang/json/technique_from_json.py #, python-format msgid "You jab %s" @@ -164506,57 +165392,6 @@ msgstr "" msgid " receives %s's attack, and counters" msgstr "" -#: lang/json/technique_from_json.py -msgid "Displace and Hook" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You parry %s attack and hook them down" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid " parries %s attack and hooks them down" -msgstr "" - -#: lang/json/technique_from_json.py -msgid "High Round Strike" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You swing high and strike at %s" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid " swings high and strikes %s" -msgstr "" - -#: lang/json/technique_from_json.py -msgid "High Round Feint" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You fake a high round strike at %s" -msgstr "" - -#: lang/json/technique_from_json.py -msgid "High Round Stab" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You quickly stab %s" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid " quickly stabs %s" -msgstr "" - #: lang/json/technique_from_json.py msgid "grab and pommel strike" msgstr "" @@ -166385,7 +167220,7 @@ msgstr "" #: lang/json/terrain_from_json.py msgid "wooden floor" -msgstr "" +msgstr "Holzfußboden" #. ~ Description for wooden floor #: lang/json/terrain_from_json.py @@ -166398,6 +167233,16 @@ msgstr "" msgid "SMASH!" msgstr "»SCHEPPER!«." +#: lang/json/terrain_from_json.py +msgid "metal floor" +msgstr "Metallboden" + +#. ~ Description for metal floor +#: lang/json/terrain_from_json.py +msgid "" +"High-quality and tough checkered flooring to reduce risk of slips and falls." +msgstr "" + #: lang/json/terrain_from_json.py msgid "linoleum tile" msgstr "Linoleum-Kachel" @@ -166511,10 +167356,6 @@ msgstr "" "Boden ist noch nicht geebnet und die Decke ist noch nicht vollständig " "gefüllt." -#: lang/json/terrain_from_json.py -msgid "metal floor" -msgstr "Metallboden" - #. ~ Description for metal floor #: lang/json/terrain_from_json.py msgid "" @@ -172425,6 +173266,16 @@ msgstr "Chitinrammbock" msgid "biosilicfied chitin ram" msgstr "Biosilifizierter-Chitinrammbock" +#: lang/json/vehicle_part_from_json.py +msgid "tied mattress" +msgstr "" + +#. ~ Description for tied mattress +#: lang/json/vehicle_part_from_json.py +msgid "" +"A mattress, strapped onto the vehicle. It could serve to blunt any impact." +msgstr "" + #. ~ Description for shredder #: lang/json/vehicle_part_from_json.py msgid "" @@ -177085,6 +177936,10 @@ msgstr "" msgid "Stop %s?" msgstr "" +#: src/activity_type.h +msgid "THIS IS A BUG" +msgstr "" + #: src/addiction.cpp msgid "You need some nicotine." msgstr "Du brauchst etwas Nikotin." @@ -178666,10 +179521,6 @@ msgstr "%1$s der %2$s" msgid "artifact file" msgstr "Artefaktdatei" -#: src/auto_pickup.cpp -msgid " AUTO PICKUP MANAGER " -msgstr " VERWALTUNG DES AUTOMATISCHEN AUFHEBENS " - #: src/auto_pickup.cpp src/game.cpp src/safemode_ui.cpp msgid "dd" msgstr ":Neu" @@ -178718,14 +179569,6 @@ msgstr "Regeln" msgid "I/E" msgstr "E/A" -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "[]" -msgstr "[]" - -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "[]" -msgstr "[]" - #: src/auto_pickup.cpp msgid "Auto pickup enabled:" msgstr "Auto-Aufheben aktiv:" @@ -178742,10 +179585,6 @@ msgstr "Wahr" msgid "witch" msgstr "Umchalten" -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "Please load a character first to use this page!" -msgstr "Bitte lade zuerst eine Person, bevor du diese Seite benutzt!" - #: src/auto_pickup.cpp src/safemode_ui.cpp msgid "" msgstr "" @@ -178795,6 +179634,18 @@ msgstr "Aufhebe-Regel:" msgid "Save changes?" msgstr "Änderungen speichern?" +#: src/auto_pickup.cpp +msgid " AUTO PICKUP MANAGER " +msgstr " VERWALTUNG DES AUTOMATISCHEN AUFHEBENS " + +#: src/auto_pickup.cpp src/safemode_ui.cpp +msgid "[]" +msgstr "[]" + +#: src/auto_pickup.cpp src/safemode_ui.cpp +msgid "[]" +msgstr "[]" + #: src/auto_pickup.cpp #, c-format msgid "%1$d item matches: %2$s" @@ -178814,6 +179665,11 @@ msgstr "Auto-Aufheben ist in den Optionen nicht aktiviert. Jetzt aktivieren?" msgid "autopickup configuration" msgstr "Auto-Aufheben konfigurieren" +#: src/auto_pickup.cpp +#, c-format +msgid "Pickup rules for %s" +msgstr "Aufheberegeln für %s" + #: src/avatar.cpp src/iuse.cpp msgid "He" msgstr "Er" @@ -180075,7 +180931,37 @@ msgstr "Du ziehst %s." #: src/bionics.cpp #, c-format -msgid "%s withdraws %s %s." +msgid " withdraws %s %s." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Your %s does not have enought fuel to start." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "'s %s does not have enought fuel to start." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Your %s turns off to not waste fuel." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "'s %s turns off to not waste fuel." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Your %s runs out of fuel and turn off." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "'s %s runs out of fuel and turn off." msgstr "" #: src/bionics.cpp @@ -180469,6 +181355,10 @@ msgstr "" "Während dein Bewusstsein schwindet, fühlst du Bedauern, dass du nicht in der" " Lage sein wirst, die Operation zu genießen." +#: src/bionics_ui.cpp +msgid "Available Fuel: " +msgstr "" + #: src/bionics_ui.cpp #, c-format msgid "" @@ -183160,7 +184050,7 @@ msgstr "%s sieht dir bei der Arbeit zu." #: src/construction.cpp #, c-format msgid "%s finished construction: %s." -msgstr "%s fertigst die Konstruktion von %s ." +msgstr "%s fertigst die Konstruktion %s ." #: src/construction.cpp msgid "" @@ -183744,6 +184634,20 @@ msgid_plural " digests a %s and recharges %d points of energy." msgstr[0] "1 verdaut %s und erhält %d Energiepunkt." msgstr[1] " verdaut %s und erhält %d Energiepunkte." +#: src/consumption.cpp +#, c-format +msgid "You load %i charge of %s in your %s." +msgid_plural "You load %i charges of %s in your %s." +msgstr[0] "" +msgstr[1] "" + +#: src/consumption.cpp +#, c-format +msgid " load %i charge of %s in their %s." +msgid_plural " load %i charges of %s in their %s." +msgstr[0] "" +msgstr[1] "" + #: src/craft_command.cpp src/crafting.cpp src/veh_interact.cpp msgid " (nearby)" msgstr " (nah)" @@ -183827,8 +184731,10 @@ msgstr "Du kannst nicht noch mehr davon anfertigen!" #: src/crafting.cpp #, c-format -msgid "You don't have anything to store %s in!" -msgstr "Du hast nichts, um %s zu lagern!" +msgid "" +"You don't have anything in which to store %s and may have to pour it out or " +"consume it as soon as it is prepared! Proceed?" +msgstr "" #: src/crafting.cpp src/pickup.cpp #, c-format @@ -184425,6 +185331,10 @@ msgstr "Guter Treffer!" msgid "Grazing hit." msgstr "Streiftreffer." +#: src/creature.cpp +msgid "You feel poison coursing through your body!" +msgstr "" + #: src/creature.cpp msgid "The shot misses!" msgstr "Der Schuss verfehlt das Ziel." @@ -185997,21 +186907,21 @@ msgid "You can't see the terrain here." msgstr "Hier kannst du das Gelände nicht sehen." #: src/descriptions.cpp +#, c-format msgid "" "\n" -"Sign: ???" +"Sign: %s" msgstr "" "\n" -"Schild: ???" +"Schild: %s" #: src/descriptions.cpp -#, c-format msgid "" "\n" -"Sign: %s" +"Sign: ???" msgstr "" "\n" -"Schild: %s" +"Schild: ???" #: src/descriptions.cpp src/iexamine.cpp #, c-format @@ -189257,20 +190167,6 @@ msgstr "uistate-Daten" msgid "Failed to save game data" msgstr "Spieldaten konnten nicht gespeichert werden" -#: src/game.cpp -msgid "You haven't killed any monsters yet!" -msgstr "Du hast bisher keine Monster getötet!" - -#: src/game.cpp -#, c-format -msgid "KILL COUNT: %d" -msgstr "TODESZÄHLER: %d" - -#: src/game.cpp -#, c-format -msgid "Experience: %d (%d points available)" -msgstr "" - #: src/game.cpp msgid " You are forgotten among the billions lost in the cataclysm..." msgstr "" @@ -191364,6 +192260,11 @@ msgstr "Verschüttete Flüssigkeiten können nicht getrunken werden" msgid "You're fully charged" msgstr "Du bist voll aufgeladen" +#: src/game_inventory.cpp +#, c-format +msgid "No space to store more %s" +msgstr "" + #: src/game_inventory.cpp msgid "soon!" msgstr "bald!" @@ -191396,6 +192297,18 @@ msgstr "alt" msgid "rotten" msgstr "verdorben" +#: src/game_inventory.cpp src/panels.cpp +msgid "Food :" +msgstr "" + +#: src/game_inventory.cpp src/panels.cpp +msgid "Drink:" +msgstr "" + +#: src/game_inventory.cpp src/panels.cpp +msgid "Pain :" +msgstr "" + #: src/game_inventory.cpp msgid "Consume item" msgstr "Gegenstand konsumieren" @@ -194210,6 +195123,14 @@ msgstr "Installiertes Bionik zum Deinstallieren wählen." msgid "ERROR NO SPACE AVAILABLE. Operation impossible. Exiting." msgstr "" +#: src/iexamine.cpp +msgid "Personality_Override" +msgstr "" + +#: src/iexamine.cpp +msgid "C0RR#PTED?D#TA" +msgstr "" + #: src/iexamine.cpp msgid "Choose bionic to uninstall" msgstr "Bionik zum Deinstallieren wählen" @@ -195510,8 +196431,8 @@ msgid "Capacity: " msgstr "Kapazität: " #: src/item.cpp -msgid " per round" -msgstr " pro Schuss" +msgid " moves per round" +msgstr "" #: src/item.cpp msgid "Reload time: " @@ -195609,8 +196530,8 @@ msgid "" msgstr "" #: src/item.cpp -msgid " seconds" -msgstr " Sekunden" +msgid " moves " +msgstr "" #: src/item.cpp msgid "Time to reach aim level: " @@ -195644,10 +196565,6 @@ msgstr "Effektiver Rückstoß: " msgid "Recommended strength (burst): " msgstr "Empfohlene Stärke (Feuerstoß): " -#: src/item.cpp -msgid " seconds per round" -msgstr " Sekunden pro Schuss" - #: src/item.cpp msgid "Fire modes: " msgstr "Feuermodi: " @@ -195920,6 +196837,14 @@ msgstr "" "Die Schutzwerte sind bei Beschädigung reduziert. Du könntest die " "Werte verbessern, indem du diesen Gegenstand reparierst." +#: src/item.cpp +msgid "Weight capacity modifier: " +msgstr "" + +#: src/item.cpp +msgid "Weight capacity bonus: " +msgstr "" + #: src/item.cpp msgid "Just for fun." msgstr "Nur zum Spaß." @@ -196380,6 +197305,14 @@ msgstr "" msgid "This bionic is installed in the following body part(s):" msgstr "Dieses Bionik wurde in den folgenden Körperteil(en) installiert:" +#: src/item.cpp +msgid "Encumbrance: " +msgstr "" + +#: src/item.cpp +msgid "Environmental Protection: " +msgstr "" + #: src/item.cpp msgid "* This weapon needs two free hands to fire." msgstr "* Diese Waffe benötigt zwei freie Hände zum Feuern." @@ -199753,6 +200686,11 @@ msgstr "" msgid " illuminated by %s" msgstr "" +#: src/iuse.cpp +#, c-format +msgid " in %s cloud" +msgstr "" + #: src/iuse.cpp #, c-format msgid " with graffiti \"%s\"" @@ -201005,6 +201943,10 @@ msgstr "" "Es gibt außerdem ein bestimmtes Bionik, das dir mit dieser Art Rüstung " "hilft." +#: src/iuse_actor.cpp +msgid "No lock to pick." +msgstr "" + #: src/iuse_actor.cpp msgid "Use your lockpick where?" msgstr "Wo willst du den Dietrich anwenden?" @@ -203152,6 +204094,20 @@ msgstr "<-> vorheriger" msgid "ndo move" msgstr " rückgängig" +#: src/kill_tracker.cpp +msgid "You haven't killed any monsters yet!" +msgstr "Du hast bisher keine Monster getötet!" + +#: src/kill_tracker.cpp +#, c-format +msgid "KILL COUNT: %d" +msgstr "TODESZÄHLER: %d" + +#: src/kill_tracker.cpp +#, c-format +msgid "Experience: %d (%d points available)" +msgstr "" + #. ~ abbreviated direction names and long direction names #: src/line.cpp msgid "N " @@ -203421,6 +204377,16 @@ msgstr "" msgid "an explosion" msgstr "" +#: src/magic.cpp +#, c-format +msgid "%s and %s" +msgstr "%s und %s" + +#: src/magic.cpp src/player.cpp +#, c-format +msgid "%s, %s" +msgstr "%s, %s" + #: src/magic.cpp #, c-format msgid "" @@ -203457,6 +204423,11 @@ msgstr "" msgid "Popup Distractions" msgstr "" +#: src/magic.cpp +#, c-format +msgid "%d moves" +msgstr "" + #: src/magic.cpp msgid "requires concentration" msgstr "" @@ -203983,7 +204954,7 @@ msgstr "" #: src/map.cpp #, c-format -msgid "The autoclave in the %s has finished washing." +msgid "The autoclave in the %s has finished its cycle." msgstr "" #: src/map.cpp @@ -204250,22 +205221,6 @@ msgstr "Kammern öffnen" msgid "Missile Controls" msgstr "Raketensteuerung" -#: src/mapgen.cpp -msgid "EnviroCom OS v2.03" -msgstr "UmweltKom-BeSy v2.03" - -#: src/mapgen.cpp -msgid "Unlock stairs" -msgstr "Treppen entsperren" - -#: src/mapgen.cpp -msgid "Download Sewer Maps" -msgstr "Abwasserkanalkarten herunterladen" - -#: src/mapgen.cpp -msgid "Divert sample" -msgstr "Probe ableiten" - #: src/mapgen.cpp msgid "NEPowerOS" msgstr "NEStromBeSy" @@ -206955,6 +207910,11 @@ msgstr "" msgid "The %1$s's arms fly out and pull and grab %2$s!" msgstr "Die Arme von %1$s schnellen hinaus und greifen %2$s!" +#: src/monattack.cpp +#, c-format +msgid "The %1$s reaches out and pulls %2$s!" +msgstr "" + #: src/monattack.cpp #, c-format msgid "The %s gropes at you, but you dodge!" @@ -207721,6 +208681,19 @@ msgstr "»Leeren Sie Ihre Hände und bleiben Sie stehen, Bürger!«" msgid "fzzzzzt" msgstr "»Fzzzzzzt«" +#: src/monattack.cpp +msgid "The floor trembles underneath your feet." +msgstr "" + +#: src/monattack.cpp +msgid "a deafening roar!" +msgstr "" + +#: src/monattack.cpp +#, c-format +msgid "A %s struggles to pull itself free from the %s!" +msgstr "" + #: src/monattack.cpp #, c-format msgid "The %1$s mechanically grabs at %2$s!" @@ -210430,6 +211403,11 @@ msgstr "%1$s lässt 1 %2$s fallen." msgid "Hold on, I want to pulp that %s." msgstr "Warte, ich will %s zermalmen." +#: src/npcmove.cpp +#, c-format +msgid "%s completed the assigned task." +msgstr "" + #: src/npcmove.cpp #, c-format msgid "%1$s throws a %2$s." @@ -210947,6 +211925,10 @@ msgstr "Fäuste" msgid "BADAMMO" msgstr "BADAMMO" +#: src/npctalk.cpp +msgid "doing this and that" +msgstr "" + #: src/npctalk.cpp msgctxt "punctuation" msgid "." @@ -211050,6 +212032,11 @@ msgstr "" msgid "%1$s doesn't have a %2$s!" msgstr "" +#: src/npctalk.cpp +#, c-format +msgid "%1$s gives you %2$s." +msgstr "" + #: src/npctalk.cpp msgid "I don't trust you enough to eat THIS..." msgstr "Ich vertraue dir nicht genug, um DAS zu essen." @@ -211305,11 +212292,6 @@ msgstr "Bezahlen:" msgid "Select a follower" msgstr "Wähle einen Gefährten" -#: src/npctalk_funcs.cpp -#, c-format -msgid "Pickup rules for %s" -msgstr "Aufheberegeln für %s" - #: src/npctrade.cpp #, c-format msgid "Volume: %s %s, Weight: %.1f %s" @@ -214275,10 +215257,6 @@ msgstr "" msgid "Freezing!" msgstr "" -#: src/panels.cpp -msgid "Pain " -msgstr "" - #: src/panels.cpp msgid "Bad" msgstr "" @@ -214446,22 +215424,10 @@ msgstr "" msgid "Style:" msgstr "" -#: src/panels.cpp -msgid "Food :" -msgstr "" - -#: src/panels.cpp -msgid "Drink:" -msgstr "" - #: src/panels.cpp msgid "Rest :" msgstr "" -#: src/panels.cpp -msgid "Pain :" -msgstr "" - #: src/panels.cpp msgid "Heat :" msgstr "" @@ -216240,11 +217206,6 @@ msgstr "%s (%d)" msgid "%s with %s (%d)" msgstr "%s mit %s (%d)" -#: src/player.cpp -#, c-format -msgid "%s, %s" -msgstr "%s, %s" - #: src/player.cpp msgid "| Location " msgstr "| Ort " @@ -217016,6 +217977,10 @@ msgstr "Sehr hungrig" msgid "Peckish" msgstr "Hungrig" +#: src/player.cpp +msgid "Pain " +msgstr "" + #: src/player_activity.cpp msgid "You pause for a moment to catch your breath." msgstr "" @@ -218490,6 +219455,10 @@ msgstr "A/W" msgid "Safe Mode enabled:" msgstr "Sicherheitsmodus aktiv:" +#: src/safemode_ui.cpp +msgid "Please load a character first to use this page!" +msgstr "Bitte lade zuerst eine Person, bevor du diese Seite benutzt!" + #: src/safemode_ui.cpp msgid "Safe Mode manager currently inactive." msgstr "Sicherheitsmodus-Verwaltung derzeit inaktiv." @@ -221362,6 +222331,10 @@ msgid "" "door." msgstr "" +#: src/vehicle_use.cpp +msgid "The autoclave is empty, there's no point in starting it." +msgstr "" + #: src/vehicle_use.cpp #, c-format msgid "" @@ -221390,6 +222363,10 @@ msgstr "" "Du schaltest die Waschmaschine aus, bevor sie ihr Programm abschließen " "konnte, und öffnest ihre Klappe." +#: src/vehicle_use.cpp +msgid "The washing machine is empty, there's no point in starting it." +msgstr "" + #: src/vehicle_use.cpp #, c-format msgid "" @@ -221435,6 +222412,10 @@ msgid "" "lid." msgstr "" +#: src/vehicle_use.cpp +msgid "The dishwasher is empty, there's no point in starting it." +msgstr "" + #: src/vehicle_use.cpp #, c-format msgid "" diff --git a/lang/po/es_AR.po b/lang/po/es_AR.po index ee1ce26bf86ca..28e4eead2b867 100644 --- a/lang/po/es_AR.po +++ b/lang/po/es_AR.po @@ -1,13 +1,13 @@ # Translators: -# Brett Dong , 2019 # Vlasov Vitaly , 2019 +# Brett Dong , 2019 # Noctivagante , 2019 # msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.D\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-16 17:39+0800\n" +"POT-Creation-Date: 2019-08-23 23:11+0800\n" "PO-Revision-Date: 2018-04-26 14:47+0000\n" "Last-Translator: Noctivagante , 2019\n" "Language-Team: Spanish (Argentina) (https://www.transifex.com/cataclysm-dda-translators/teams/2217/es_AR/)\n" @@ -433,26 +433,6 @@ msgstr "" "Son pedazos de cobre. Se puede usar para fabricar algo, como unos cartuchos " "de escopeta improvisados." -#: lang/json/AMMO_from_json.py -msgid "solder" -msgstr "estaño" - -#. ~ Description for solder -#: lang/json/AMMO_from_json.py -msgid "" -"A small spool of solder, able to be used in ammunition and electronics." -msgstr "" -"Es un rollito de estaño, puede ser usado para municiones o en electrónica." - -#: lang/json/AMMO_from_json.py -msgid "tin" -msgstr "estaño" - -#. ~ Description for tin -#: lang/json/AMMO_from_json.py -msgid "Tin and pewter scraps. Usable in making ammo." -msgstr "Son pedazos de estaño y peltre. Útiles para hacer munición." - #: lang/json/AMMO_from_json.py msgid "medical tape" msgstr "cinta médica" @@ -471,6 +451,34 @@ msgstr "misil PG-7VL 93mm" msgid "93mm single-stage high-explosive ammunition for the RPG-7." msgstr "Es munición 93mm monoetapa de alta explosividad para el RPG-7." +#: lang/json/AMMO_from_json.py +msgid "PG-7VR 64mm/105mm rocket" +msgstr "misil PG-7VR 64mm/105mm" + +#. ~ Description for PG-7VR 64mm/105mm rocket +#: lang/json/AMMO_from_json.py +msgid "64mm/105mm high-explosive tandem ammunition for the RPG-7." +msgstr "Es munición 64mm/105mm de alta explosividad para el RPG-7." + +#: lang/json/AMMO_from_json.py +msgid "TBG-7V 105mm rocket" +msgstr "misil TBG-7V 105mm" + +#. ~ Description for TBG-7V 105mm rocket +#: lang/json/AMMO_from_json.py +msgid "105mm thermobaric ammunition for the RPG-7." +msgstr "Es munición termobárica 105mm para el RPG-7." + +#: lang/json/AMMO_from_json.py +msgid "OG-7V 40mm rocket" +msgstr "misil OG-7V 40mm" + +#. ~ Description for OG-7V 40mm rocket +#: lang/json/AMMO_from_json.py +msgid "" +"40mm high-explosive fragmentation antipersonnel ammunition for the RPG-7." +msgstr "Es munición antipersonal 40mm de alta explosividad para el RPG-7." + #: lang/json/AMMO_from_json.py msgid "M235 66mm TPA rocket" msgstr "misil M235 66mm TPA" @@ -2513,32 +2521,28 @@ msgstr ".300 AAC Blackout" #. ~ Description for .300 AAC Blackout #: lang/json/AMMO_from_json.py msgid "" -".300 AAC Blackout is an intermediate cartridge that achieves ballistics " -"similar to the 7.62x39 but allows use on the AR-15 platform. The round is " -"necked-up from the 5.56mm NATO, but feeds from a STANAG magazine. It " -"requires a specific barrel, so will not work in a standard M4 or similar " -"carbine. This loading is supersonic." +"A .300 AAC Blackout round with a 125gr open tip match bullet. 300 BLK is an" +" intermediate cartridge necked up from 5.56x45mm, designed to achieve " +"similar ballistics to 7.62x39mm. It is compatible with standard AR-15 lower" +" receivers and will feed from STANAG magazines." msgstr "" -"El .300 AAC Blackout es un cartucho mediano que posee una balística similar " -"al 7.62x39 pero permite usarse en la plataforma AR-15. La bala está basada " -"en la 5.56mm NATO, pero se alimenta con un cartucho STANAG. Requiere un " -"cañón específico, así que no funcionará en el estándar M4 o carabinas " -"similares. Esta munición es supersónica." +"Es una bala .300 AAC Blackout de 125gr punta abierta. La .300 BLK es un " +"cartucho intermedio basado en la 5.56x45mm, diseñado para tener una " +"balística similar al 7.62x39mm. Es compatible con los receptores AR-15 " +"estándar y funciona con cartuchos STANAG." #. ~ Description for .300 AAC Blackout #: lang/json/AMMO_from_json.py msgid "" -".300 AAC Blackout is an intermediate cartridge that achieves ballistics " -"similar to the 7.62x39 but allows use on the AR-15 platform. The round is " -"necked-up from the 5.56mm NATO, but feeds from a STANAG magazine. It " -"requires a specific barrel, so will not work in a standard M4 or similar " -"carbine. This loading is subsonic." +"A subsonic .300 AAC Blackout round with a 220gr open tip match bullet. 300 " +"BLK is an intermediate cartridge necked up from 5.56x45mm, designed to " +"achieve similar ballistics to 7.62x39mm. It is compatible with standard " +"AR-15 lower receivers and will feed from STANAG magazines." msgstr "" -"El .300 AAC Blackout es un cartucho mediano que posee una balística similar " -"al 7.62x39 pero permite usarse en la plataforma AR-15. La bala está basada " -"en la 5.56mm NATO, pero se alimenta con un cartucho STANAG. Requiere un " -"cañón específico, así que no funcionará en el estándar M4 o carabinas " -"similares. Esta munición es subsónica." +"Es una bala subsónica .300 AAC Blackout de 220gr punta abierta. La .300 BLK " +"es un cartucho intermedio basado en la 5.56x45mm, diseñado para tener una " +"balística similar al 7.62x39mm. Es compatible con los receptores AR-15 " +"estándar y funciona con cartuchos STANAG." #: lang/json/AMMO_from_json.py msgid "reloaded .300 AAC Blackout" @@ -4129,6 +4133,19 @@ msgstr "" "tubo, dentro de otro tubo de acero. Diseñado para ser altamente eficaz " "contra vehículos y estructuras." +#: lang/json/AMMO_from_json.py +msgid "paralyzing barb" +msgstr "pincho paralizante" + +#. ~ Description for paralyzing barb +#: lang/json/AMMO_from_json.py +msgid "" +"Tiny droplets of venom trickle out of the sponge-like tissue of this sharp " +"barb." +msgstr "" +"Unas gotas pequeñas de veneno caen de este pincho afilado, parecido a una " +"esponja." + #: lang/json/AMMO_from_json.py msgid "sprayable toxic gas" msgstr "aerosol de gas tóxico" @@ -4751,6 +4768,30 @@ msgstr "" "Es una pequeña bisagra de metal con dos pedazos con agujeros para tornillos." " Se usa para hacer puertas." +#: lang/json/AMMO_from_json.py +msgid "tin powder" +msgstr "polvo de estaño" + +#. ~ Description for tin powder +#: lang/json/AMMO_from_json.py +msgid "" +"A fine gray powder composed of tin, usable for making solder and lining " +"containers to prevent corrosion." +msgstr "" +"Es un polvo fino y gris compuesto de estaño, útil para soldaduras y revestir" +" contenedores para evitar la corrosión." + +#: lang/json/AMMO_from_json.py +msgid "solder" +msgstr "estaño" + +#. ~ Description for solder +#: lang/json/AMMO_from_json.py +msgid "" +"A small spool of solder, able to be used in ammunition and electronics." +msgstr "" +"Es un rollito de estaño, puede ser usado para municiones o en electrónica." + #: lang/json/AMMO_from_json.py msgid "incendiary" msgid_plural "incendiaries" @@ -6563,44 +6604,6 @@ msgstr[1] "pantalones cortos de básquet" msgid "A pair of basketball shorts. Comfortable and light." msgstr "Un par de pantalones cortos de básquet. Cómodos y livianos." -#: lang/json/ARMOR_from_json.py -msgid "backpack" -msgid_plural "backpacks" -msgstr[0] "mochila" -msgstr[1] "mochilas" - -#. ~ Description for backpack -#: lang/json/ARMOR_from_json.py -msgid "A small backpack. Good storage for a little encumbrance." -msgstr "Es una mochila pequeña. Buena capacidad y poca incomodidad." - -#: lang/json/ARMOR_from_json.py -msgid "giant novelty backpack" -msgid_plural "giant novelty backpacks" -msgstr[0] "mochila adornada gigante" -msgstr[1] "mochilas adornadas gigantes" - -#. ~ Description for giant novelty backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A huge fabric backpack made mostly as a joke before the cataclysm. Now, " -"it's still rather silly, but it can store a lot of stuff." -msgstr "" -"Es una enorme mochila de tela hecha más que nada como chiste antes del " -"cataclismo. Ahora, sigue siendo un poco tonta, pero puede almacenar muchas " -"cosas." - -#: lang/json/ARMOR_from_json.py -msgid "leather backpack" -msgid_plural "leather backpacks" -msgstr[0] "mochila de cuero" -msgstr[1] "mochilas de cuero" - -#. ~ Description for leather backpack -#: lang/json/ARMOR_from_json.py -msgid "A small leather backpack. Good storage for a little encumbrance." -msgstr "Es una mochila pequeña de cuero. Buena capacidad y poca incomodidad." - #: lang/json/ARMOR_from_json.py msgid "balaclava" msgid_plural "balaclavas" @@ -6624,8 +6627,8 @@ msgstr[1] "tahalís" #. ~ Use action holster_msg for scabbard. #. ~ Use action holster_msg for sheath. #. ~ Use action holster_msg for survivor belt. -#. ~ Use action holster_msg for hiking backpack. #. ~ Use action holster_msg for survivor utility belt. +#. ~ Use action holster_msg for hiking backpack. #. ~ Use action holster_msg for pair of boots. #. ~ Use action holster_msg for pair of bone armor boots. #. ~ Use action holster_msg for pair of turnout boots. @@ -6650,7 +6653,8 @@ msgstr[1] "tahalís" #. ~ Use action holster_msg for pair of rollerblades. #. ~ Use action holster_msg for pair of rollerskates. #. ~ Use action holster_msg for C.R.I.T web belt. -#: lang/json/ARMOR_from_json.py +#. ~ Use action holster_msg for hollow cane. +#: lang/json/ARMOR_from_json.py lang/json/GENERIC_from_json.py #, no-python-format msgid "You sheath your %s" msgstr "Enfundás tu %s." @@ -6658,7 +6662,9 @@ msgstr "Enfundás tu %s." #. ~ Use action holster_prompt for baldric. #. ~ Use action holster_prompt for back scabbard. #. ~ Use action holster_prompt for scabbard. -#: lang/json/ARMOR_from_json.py +#. ~ Use action holster_prompt for hollow cane. +#: lang/json/ARMOR_from_json.py lang/json/ARMOR_from_json.py +#: lang/json/GENERIC_from_json.py msgid "Sheath sword" msgstr "Enfundar espada" @@ -7714,17 +7720,6 @@ msgstr "" "bastante incómodo de usar y tiene poca capacidad de almacenamiento, pero es " "muy calentito." -#: lang/json/ARMOR_from_json.py -msgid "dive bag" -msgid_plural "dive bags" -msgstr[0] "bolsa de buceo" -msgstr[1] "bolsas de buceo" - -#. ~ Description for dive bag -#: lang/json/ARMOR_from_json.py -msgid "A lightweight mesh backpack, commonly worn by swimmers and divers." -msgstr "Una bolsa de red liviana, muy usada por los nadadores y los buzos." - #: lang/json/ARMOR_from_json.py msgid "down-filled blanket" msgid_plural "down-filled blankets" @@ -7812,20 +7807,6 @@ msgid "A beautiful white wedding dress. What good will it be now?" msgstr "" "Un vestido de casamiento blanco y hermoso. ¿Para qué puede servir ahora?" -#: lang/json/ARMOR_from_json.py -msgid "duffel bag" -msgid_plural "duffel bags" -msgstr[0] "bolso de viaje" -msgstr[1] "bolsos de viaje" - -#. ~ Description for duffel bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A huge duffel bag. Provides plenty of storage, but is severely encumbering." -msgstr "" -"Es un enorme bolso de viaje. Tiene mucha capacidad de almacenamiento pero es" -" muy incómodo." - #: lang/json/ARMOR_from_json.py msgid "tactical dump pouch" msgid_plural "tactical dump pouches" @@ -9814,19 +9795,6 @@ msgstr "" "Es una capa larga y flameante. Es sencilla y cómoda. ¡Pero asegurate de " "arrancártela teatralmente antes de pelearte con alguien!" -#: lang/json/ARMOR_from_json.py -msgid "jerrypack" -msgid_plural "jerrypacks" -msgstr[0] "bidón-chila" -msgstr[1] "bidón-chilas" - -#. ~ Description for jerrypack -#: lang/json/ARMOR_from_json.py -msgid "A jerrycan modified to be worn in a similar manner to a backpack." -msgstr "" -"Es un bidón modificado para poder ser llevado en la espalda, como una " -"mochila." - #: lang/json/ARMOR_from_json.py msgid "sports jersey" msgid_plural "sports jerseys" @@ -10757,32 +10725,6 @@ msgstr "" "Una cinta blanca con volados para usar en la cabeza. Parte de la ropa de " "sirvienta francesa." -#: lang/json/ARMOR_from_json.py -msgid "makeshift knapsack" -msgid_plural "makeshift knapsacks" -msgstr[0] "alforja improvisada" -msgstr[1] "alforjas improvisadas" - -#. ~ Description for makeshift knapsack -#: lang/json/ARMOR_from_json.py -msgid "" -"A pair of pants with the bottom ends tied with string, and then passed " -"through the belt loops so the knapsack can be carried on the back." -msgstr "" -"Es un par de pantalones con las dos mangas atadas con hilo y que pasan por " -"donde va el cinturón para que la alforja pueda ser colgada en la espalda." - -#: lang/json/ARMOR_from_json.py -msgid "makeshift sling" -msgid_plural "makeshift slings" -msgstr[0] "cabestrillo improvisado" -msgstr[1] "cabestrillos improvisados" - -#. ~ Description for makeshift sling -#: lang/json/ARMOR_from_json.py -msgid "A large sheet tied into a crude, over-the-shoulder sling." -msgstr "Es un pedazo de tela atado a un cabestrillo." - #: lang/json/ARMOR_from_json.py msgid "ballistic mask" msgid_plural "ballistic masks" @@ -10856,19 +10798,6 @@ msgstr "" "Usualmente la utilizan los piqueteros u otros alborotadores que quieren " "cubrir su identidad. Con esto estás listo para cortar calles y quemar gomas." -#: lang/json/ARMOR_from_json.py -msgid "messenger bag" -msgid_plural "messenger bags" -msgstr[0] "bolso de cartero" -msgstr[1] "bolsos de cartero" - -#. ~ Description for messenger bag -#: lang/json/ARMOR_from_json.py -msgid "Light and easy to wear, but doesn't offer much storage." -msgstr "" -"Es liviano y fácil de llevar pero no tiene mucha capacidad de " -"almacenamiento." - #: lang/json/ARMOR_from_json.py msgid "pair of mittens" msgid_plural "pairs of mittens" @@ -10880,24 +10809,6 @@ msgstr[1] "pares de manoplas" msgid "A pair of warm mittens. They are extremely cumbersome." msgstr "Un par de manoplas abrigadas. Son extremadamente incómodas." -#: lang/json/ARMOR_from_json.py -msgid "MOLLE pack" -msgid_plural "MOLLE packs" -msgstr[0] "mochila MOLLE" -msgstr[1] "mochilas MOLLE" - -#. ~ Description for MOLLE pack -#: lang/json/ARMOR_from_json.py -msgid "" -"The Modular Lightweight Load-carrying Equipment is an advanced military " -"backpack. Covered with pockets and straps, it strikes a fine balance " -"between storage space and encumbrance." -msgstr "" -"Es una mochila militar. Su nombre viene del acrónimo en inglés \"Modular " -"Lightweight Load-carrying Equipment\". Está cubierta de bolsillos y bolsas. " -"Tiene un equilibrio perfecto entre la capacidad de almacenamiento y su " -"incomodidad." - #: lang/json/ARMOR_from_json.py msgid "motorcycle armor" msgid_plural "motorcycle armors" @@ -11374,19 +11285,6 @@ msgstr "" "Es un casco que en realidad es una olla para sopa. No protege mucho que " "digamos, pero es mejor que nada." -#: lang/json/ARMOR_from_json.py -msgid "purse" -msgid_plural "purses" -msgstr[0] "monedero" -msgstr[1] "monederos" - -#. ~ Description for purse -#: lang/json/ARMOR_from_json.py -msgid "A bit cumbersome to wear, but provides some storage." -msgstr "" -"Aunque tiene buena capacidad de almacenamiento, es un poco incómodo de " -"llevar." - #: lang/json/ARMOR_from_json.py msgid "quiver" msgid_plural "quivers" @@ -11482,33 +11380,6 @@ msgstr "" "Es una prenda externa suelta, con mangas y una misteriosa cantidad de " "bolsillos ocultos." -#: lang/json/ARMOR_from_json.py -msgid "military rucksack" -msgid_plural "military rucksacks" -msgstr[0] "mochilón militar" -msgstr[1] "mochilones militares" - -#. ~ Description for military rucksack -#: lang/json/ARMOR_from_json.py -msgid "A huge military rucksack, provides a lot of storage." -msgstr "" -"Es una mochila militar enorme. Tiene mucha capacidad de almacenamiento." - -#: lang/json/ARMOR_from_json.py -msgid "runner pack" -msgid_plural "runner packs" -msgstr[0] "cartuchera de corredor" -msgstr[1] "cartucheras de corredor" - -#. ~ Description for runner pack -#: lang/json/ARMOR_from_json.py -msgid "" -"The obvious choice for outdoor athletes, this ergonomic backpack is light " -"and easy to wear, ensuring comfort when carrying heavy and bulky items." -msgstr "" -"La elección lógica para los atletas, esta mochila ergonómica es ligera y " -"fácil de llevar, pudiendo transportar objetos pesados cómodamente." - #: lang/json/ARMOR_from_json.py msgid "scabbard" msgid_plural "scabbards" @@ -11929,22 +11800,6 @@ msgstr[1] "túnicas sin mangas" msgid "A sleeveless cloth garment that covers the torso and legs." msgstr "Una prenda de tela sin mangas que cubre el torso y las piernas." -#: lang/json/ARMOR_from_json.py -msgid "sling pack" -msgid_plural "sling packs" -msgstr[0] "mochila cruzada" -msgstr[1] "mochilas cruzadas" - -#. ~ Description for sling pack -#: lang/json/ARMOR_from_json.py -msgid "" -"A simple single-sling backpack. Easier to access than a normal backpack, " -"but can't comfortably hold as much." -msgstr "" -"Es una simple mochila con una correa cruzada al cuerpo. Más fácil para " -"acceder a su contenido que una mochila normal, pero no puede cargar " -"cómodamente tanto." - #: lang/json/ARMOR_from_json.py msgid "snuggie" msgid_plural "snuggies" @@ -12247,8 +12102,8 @@ msgstr[0] "cinturón de supervivencia" msgstr[1] "cinturones de supervivencia" #. ~ Use action holster_prompt for survivor belt. -#. ~ Use action holster_prompt for hiking backpack. #. ~ Use action holster_prompt for survivor utility belt. +#. ~ Use action holster_prompt for hiking backpack. #. ~ Use action holster_prompt for C.R.I.T web belt. #: lang/json/ARMOR_from_json.py msgid "Sheath blade" @@ -12265,21 +12120,6 @@ msgstr "" "llevar una cuchilla pequeña. Duradero y diseñado para ser cómodo. Hay que " "usarlo para enfundar y desenfundar el arma." -#: lang/json/ARMOR_from_json.py -msgid "survivor duffel bag" -msgid_plural "survivor duffel bags" -msgstr[0] "bolso de viaje de supervivencia" -msgstr[1] "bolsos de viaje de supervivencia" - -#. ~ Description for survivor duffel bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built heavy duffel bag. Durable and carefully crafted to hold as " -"much stuff as possible." -msgstr "" -"Un bolso de viaje pesado. Duradera y diseñado cuidadosamente para tener la " -"mayor capacidad posible." - #: lang/json/ARMOR_from_json.py msgid "survivor goggles" msgid_plural "pairs of survivor goggles" @@ -12295,50 +12135,6 @@ msgstr "" "Es un par de anteojos blindados con los lentes polarizados. Son cómodos y " "duraderos, brindan una excelente protección contra los peligros ambientales." -#: lang/json/ARMOR_from_json.py -msgid "survivor backpack" -msgid_plural "survivor backpacks" -msgstr[0] "mochila de supervivencia" -msgstr[1] "mochilas de supervivencia" - -#. ~ Description for survivor backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built backpack. Durable and carefully crafted to hold as much " -"stuff as possible." -msgstr "" -"Una mochila. Duradera y diseñada para tener la mayor capacidad posible." - -#: lang/json/ARMOR_from_json.py -msgid "survivor rucksack" -msgid_plural "survivor rucksacks" -msgstr[0] "mochilón de supervivencia" -msgstr[1] "mochilones de supervivencia" - -#. ~ Description for survivor rucksack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built heavy backpack. Durable and carefully crafted to hold as " -"much stuff as possible." -msgstr "" -"Una mochila pesada de supervivencia. Duradera y diseñada para tener la mayor" -" capacidad posible." - -#: lang/json/ARMOR_from_json.py -msgid "survivor runner pack" -msgid_plural "survivor runner packs" -msgstr[0] "cartuchera de supervivencia de corredor" -msgstr[1] "cartucheras de supervivencia de corredor" - -#. ~ Description for survivor runner pack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built lightweight runner pack. Durable and carefully crafted to " -"hold as much stuff as possible." -msgstr "" -"Una cartuchera ligera que se utiliza para llevar cosas mientras corrés. " -"Duradera y diseñada para tener la mayor capacidad posible." - #: lang/json/ARMOR_from_json.py msgid "survivor suit" msgid_plural "survivor suits" @@ -13362,32 +13158,6 @@ msgstr "" "No estás seguro/a de que a esto se lo llame gorra de golf, pero es la " "gorrita típica que usan los golfistas." -#: lang/json/ARMOR_from_json.py -msgid "golf bag" -msgid_plural "golf bags" -msgstr[0] "bolso de golf" -msgstr[1] "bolsos de golf" - -#. ~ Use action holster_msg for golf bag. -#: lang/json/ARMOR_from_json.py -#, no-python-format -msgid "You awkwardly sheath your %s" -msgstr "Envainás torpemente tu %s" - -#. ~ Use action holster_prompt for golf bag. -#: lang/json/ARMOR_from_json.py -msgid "Sheath golf club" -msgstr "Envainar palo de golf" - -#. ~ Description for golf bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A tall canvas and plastic bag with fold-out legs used for golfing. It even " -"has straps to be worn on the back." -msgstr "" -"Es un bolso grande de tela y plástico con patas plegables que se usa para el" -" golf. También tiene correas para colgarlo en la espalda." - #: lang/json/ARMOR_from_json.py msgid "javelin bag" msgid_plural "javelin bags" @@ -13498,75 +13268,6 @@ msgstr "" "Una tela plástica con varias arandelas para poder atarla con una soga o una " "cuerda. Es útil para improvisar un techo durante la lluvia." -#: lang/json/ARMOR_from_json.py -msgid "high-volume rucksack" -msgid_plural "high-volume rucksacks" -msgstr[0] "mochilón amplio" -msgstr[1] "mochilones amplios" - -#. ~ Description for high-volume rucksack -#: lang/json/ARMOR_from_json.py -msgid "" -"Also know as a \"bigpack\", this rucksack is prized by pack rats but may " -"lead to a bad back." -msgstr "" -"Es también conocido como \"paquete grande\", este mochilón es el favorito de" -" los disposofóbicos pero puede causarte problemas en la espalda." - -#: lang/json/ARMOR_from_json.py -msgid "hiking backpack" -msgid_plural "hiking backpacks" -msgstr[0] "mochila de excursión" -msgstr[1] "mochilas de excursión" - -#. ~ Description for hiking backpack -#: lang/json/ARMOR_from_json.py -msgid "A large sized hiking backpack with plenty of storage space." -msgstr "" -"Es una mochila grande para excursiones, con mucha capacidad de " -"almacenamiento." - -#: lang/json/ARMOR_from_json.py -msgid "petpack" -msgid_plural "petpacks" -msgstr[0] "mochila para perro" -msgstr[1] "mochilas para perro" - -#. ~ Description for petpack -#: lang/json/ARMOR_from_json.py -msgid "" -"Before the Cataclysm this would allow your four-legged friend to see the " -"world, now it's used to shield them from the world." -msgstr "" -"Antes del Cataclismo, esto podría permitirle a tu amiguito de cuatro patas " -"ver el mundo, pero ahora se usa para protegerlos del mundo." - -#: lang/json/ARMOR_from_json.py -msgid "large tactical backpack" -msgid_plural "large tactical backpacks" -msgstr[0] "mochila táctica grande" -msgstr[1] "mochilas tácticas grandes" - -#. ~ Description for large tactical backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A large tactical multi-compartment backpack that has great lower back " -"support." -msgstr "" -"Es una mochila táctica grande con muchos compartimentos que tiene un " -"excelente apoyo para la espalda." - -#: lang/json/ARMOR_from_json.py -msgid "travelpack" -msgid_plural "travelpacks" -msgstr[0] "bolso de viaje" -msgstr[1] "bolsos de viaje" - -#. ~ Description for travelpack -#: lang/json/ARMOR_from_json.py -msgid "A hiking pack used for short trips." -msgstr "Es un bolso usado comúnmente para viajes cortos." - #: lang/json/ARMOR_from_json.py msgid "survivor utility belt" msgid_plural "survivor utility belts" @@ -13811,6 +13512,349 @@ msgstr "" "Es un chaleco de kevlar enorme hecho a mano, basado en el diseño de otros " "chalecos antibalas existentes. Tiene cuatro bolsas para llevar cargadores." +#: lang/json/ARMOR_from_json.py +msgid "backpack" +msgid_plural "backpacks" +msgstr[0] "mochila" +msgstr[1] "mochilas" + +#. ~ Description for backpack +#: lang/json/ARMOR_from_json.py +msgid "A small backpack. Good storage for a little encumbrance." +msgstr "Es una mochila pequeña. Buena capacidad y poca incomodidad." + +#: lang/json/ARMOR_from_json.py +msgid "hiking backpack" +msgid_plural "hiking backpacks" +msgstr[0] "mochila de excursión" +msgstr[1] "mochilas de excursión" + +#. ~ Description for hiking backpack +#: lang/json/ARMOR_from_json.py +msgid "A large sized hiking backpack with plenty of storage space." +msgstr "" +"Es una mochila grande para excursiones, con mucha capacidad de " +"almacenamiento." + +#: lang/json/ARMOR_from_json.py +msgid "giant novelty backpack" +msgid_plural "giant novelty backpacks" +msgstr[0] "mochila adornada gigante" +msgstr[1] "mochilas adornadas gigantes" + +#. ~ Description for giant novelty backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A huge fabric backpack made mostly as a joke before the cataclysm. Now, " +"it's still rather silly, but it can store a lot of stuff." +msgstr "" +"Es una enorme mochila de tela hecha más que nada como chiste antes del " +"cataclismo. Ahora, sigue siendo un poco tonta, pero puede almacenar muchas " +"cosas." + +#: lang/json/ARMOR_from_json.py +msgid "leather backpack" +msgid_plural "leather backpacks" +msgstr[0] "mochila de cuero" +msgstr[1] "mochilas de cuero" + +#. ~ Description for leather backpack +#: lang/json/ARMOR_from_json.py +msgid "A small leather backpack. Good storage for a little encumbrance." +msgstr "Es una mochila pequeña de cuero. Buena capacidad y poca incomodidad." + +#: lang/json/ARMOR_from_json.py +msgid "large tactical backpack" +msgid_plural "large tactical backpacks" +msgstr[0] "mochila táctica grande" +msgstr[1] "mochilas tácticas grandes" + +#. ~ Description for large tactical backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A large tactical multi-compartment backpack that has great lower back " +"support." +msgstr "" +"Es una mochila táctica grande con muchos compartimentos que tiene un " +"excelente apoyo para la espalda." + +#: lang/json/ARMOR_from_json.py +msgid "high-volume rucksack" +msgid_plural "high-volume rucksacks" +msgstr[0] "mochilón amplio" +msgstr[1] "mochilones amplios" + +#. ~ Description for high-volume rucksack +#: lang/json/ARMOR_from_json.py +msgid "" +"Also know as a \"bigpack\", this rucksack is prized by pack rats but may " +"lead to a bad back." +msgstr "" +"Es también conocido como \"paquete grande\", este mochilón es el favorito de" +" los disposofóbicos pero puede causarte problemas en la espalda." + +#: lang/json/ARMOR_from_json.py +msgid "dive bag" +msgid_plural "dive bags" +msgstr[0] "bolsa de buceo" +msgstr[1] "bolsas de buceo" + +#. ~ Description for dive bag +#: lang/json/ARMOR_from_json.py +msgid "A lightweight mesh backpack, commonly worn by swimmers and divers." +msgstr "Una bolsa de red liviana, muy usada por los nadadores y los buzos." + +#: lang/json/ARMOR_from_json.py +msgid "duffel bag" +msgid_plural "duffel bags" +msgstr[0] "bolso de viaje" +msgstr[1] "bolsos de viaje" + +#. ~ Description for duffel bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A huge duffel bag. Provides plenty of storage, but is severely encumbering." +msgstr "" +"Es un enorme bolso de viaje. Tiene mucha capacidad de almacenamiento pero es" +" muy incómodo." + +#: lang/json/ARMOR_from_json.py +msgid "petpack" +msgid_plural "petpacks" +msgstr[0] "mochila para perro" +msgstr[1] "mochilas para perro" + +#. ~ Description for petpack +#: lang/json/ARMOR_from_json.py +msgid "" +"Before the Cataclysm this would allow your four-legged friend to see the " +"world, now it's used to shield them from the world." +msgstr "" +"Antes del Cataclismo, esto podría permitirle a tu amiguito de cuatro patas " +"ver el mundo, pero ahora se usa para protegerlos del mundo." + +#: lang/json/ARMOR_from_json.py +msgid "jerrypack" +msgid_plural "jerrypacks" +msgstr[0] "bidón-chila" +msgstr[1] "bidón-chilas" + +#. ~ Description for jerrypack +#: lang/json/ARMOR_from_json.py +msgid "A jerrycan modified to be worn in a similar manner to a backpack." +msgstr "" +"Es un bidón modificado para poder ser llevado en la espalda, como una " +"mochila." + +#: lang/json/ARMOR_from_json.py +msgid "makeshift knapsack" +msgid_plural "makeshift knapsacks" +msgstr[0] "alforja improvisada" +msgstr[1] "alforjas improvisadas" + +#. ~ Description for makeshift knapsack +#: lang/json/ARMOR_from_json.py +msgid "" +"A pair of pants with the bottom ends tied with string, and then passed " +"through the belt loops so the knapsack can be carried on the back." +msgstr "" +"Es un par de pantalones con las dos mangas atadas con hilo y que pasan por " +"donde va el cinturón para que la alforja pueda ser colgada en la espalda." + +#: lang/json/ARMOR_from_json.py +msgid "makeshift sling" +msgid_plural "makeshift slings" +msgstr[0] "cabestrillo improvisado" +msgstr[1] "cabestrillos improvisados" + +#. ~ Description for makeshift sling +#: lang/json/ARMOR_from_json.py +msgid "A large sheet tied into a crude, over-the-shoulder sling." +msgstr "Es un pedazo de tela atado a un cabestrillo." + +#: lang/json/ARMOR_from_json.py +msgid "messenger bag" +msgid_plural "messenger bags" +msgstr[0] "bolso de cartero" +msgstr[1] "bolsos de cartero" + +#. ~ Description for messenger bag +#: lang/json/ARMOR_from_json.py +msgid "Light and easy to wear, but doesn't offer much storage." +msgstr "" +"Es liviano y fácil de llevar pero no tiene mucha capacidad de " +"almacenamiento." + +#: lang/json/ARMOR_from_json.py +msgid "MOLLE pack" +msgid_plural "MOLLE packs" +msgstr[0] "mochila MOLLE" +msgstr[1] "mochilas MOLLE" + +#. ~ Description for MOLLE pack +#: lang/json/ARMOR_from_json.py +msgid "" +"The Modular Lightweight Load-carrying Equipment is an advanced military " +"backpack. Covered with pockets and straps, it strikes a fine balance " +"between storage space and encumbrance." +msgstr "" +"Es una mochila militar. Su nombre viene del acrónimo en inglés \"Modular " +"Lightweight Load-carrying Equipment\". Está cubierta de bolsillos y bolsas. " +"Tiene un equilibrio perfecto entre la capacidad de almacenamiento y su " +"incomodidad." + +#: lang/json/ARMOR_from_json.py +msgid "purse" +msgid_plural "purses" +msgstr[0] "monedero" +msgstr[1] "monederos" + +#. ~ Description for purse +#: lang/json/ARMOR_from_json.py +msgid "A bit cumbersome to wear, but provides some storage." +msgstr "" +"Aunque tiene buena capacidad de almacenamiento, es un poco incómodo de " +"llevar." + +#: lang/json/ARMOR_from_json.py +msgid "military rucksack" +msgid_plural "military rucksacks" +msgstr[0] "mochilón militar" +msgstr[1] "mochilones militares" + +#. ~ Description for military rucksack +#: lang/json/ARMOR_from_json.py +msgid "A huge military rucksack, provides a lot of storage." +msgstr "" +"Es una mochila militar enorme. Tiene mucha capacidad de almacenamiento." + +#: lang/json/ARMOR_from_json.py +msgid "runner pack" +msgid_plural "runner packs" +msgstr[0] "cartuchera de corredor" +msgstr[1] "cartucheras de corredor" + +#. ~ Description for runner pack +#: lang/json/ARMOR_from_json.py +msgid "" +"The obvious choice for outdoor athletes, this ergonomic backpack is light " +"and easy to wear, ensuring comfort when carrying heavy and bulky items." +msgstr "" +"La elección lógica para los atletas, esta mochila ergonómica es ligera y " +"fácil de llevar, pudiendo transportar objetos pesados cómodamente." + +#: lang/json/ARMOR_from_json.py +msgid "sling pack" +msgid_plural "sling packs" +msgstr[0] "mochila cruzada" +msgstr[1] "mochilas cruzadas" + +#. ~ Description for sling pack +#: lang/json/ARMOR_from_json.py +msgid "" +"A simple single-sling backpack. Easier to access than a normal backpack, " +"but can't comfortably hold as much." +msgstr "" +"Es una simple mochila con una correa cruzada al cuerpo. Más fácil para " +"acceder a su contenido que una mochila normal, pero no puede cargar " +"cómodamente tanto." + +#: lang/json/ARMOR_from_json.py +msgid "survivor duffel bag" +msgid_plural "survivor duffel bags" +msgstr[0] "bolso de viaje de supervivencia" +msgstr[1] "bolsos de viaje de supervivencia" + +#. ~ Description for survivor duffel bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built heavy duffel bag. Durable and carefully crafted to hold as " +"much stuff as possible." +msgstr "" +"Un bolso de viaje pesado. Duradera y diseñado cuidadosamente para tener la " +"mayor capacidad posible." + +#: lang/json/ARMOR_from_json.py +msgid "survivor backpack" +msgid_plural "survivor backpacks" +msgstr[0] "mochila de supervivencia" +msgstr[1] "mochilas de supervivencia" + +#. ~ Description for survivor backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built backpack. Durable and carefully crafted to hold as much " +"stuff as possible." +msgstr "" +"Una mochila. Duradera y diseñada para tener la mayor capacidad posible." + +#: lang/json/ARMOR_from_json.py +msgid "survivor rucksack" +msgid_plural "survivor rucksacks" +msgstr[0] "mochilón de supervivencia" +msgstr[1] "mochilones de supervivencia" + +#. ~ Description for survivor rucksack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built heavy backpack. Durable and carefully crafted to hold as " +"much stuff as possible." +msgstr "" +"Una mochila pesada de supervivencia. Duradera y diseñada para tener la mayor" +" capacidad posible." + +#: lang/json/ARMOR_from_json.py +msgid "survivor runner pack" +msgid_plural "survivor runner packs" +msgstr[0] "cartuchera de supervivencia de corredor" +msgstr[1] "cartucheras de supervivencia de corredor" + +#. ~ Description for survivor runner pack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built lightweight runner pack. Durable and carefully crafted to " +"hold as much stuff as possible." +msgstr "" +"Una cartuchera ligera que se utiliza para llevar cosas mientras corrés. " +"Duradera y diseñada para tener la mayor capacidad posible." + +#: lang/json/ARMOR_from_json.py +msgid "golf bag" +msgid_plural "golf bags" +msgstr[0] "bolso de golf" +msgstr[1] "bolsos de golf" + +#. ~ Use action holster_msg for golf bag. +#: lang/json/ARMOR_from_json.py +#, no-python-format +msgid "You awkwardly sheath your %s" +msgstr "Envainás torpemente tu %s" + +#. ~ Use action holster_prompt for golf bag. +#: lang/json/ARMOR_from_json.py +msgid "Sheath golf club" +msgstr "Envainar palo de golf" + +#. ~ Description for golf bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A tall canvas and plastic bag with fold-out legs used for golfing. It even " +"has straps to be worn on the back." +msgstr "" +"Es un bolso grande de tela y plástico con patas plegables que se usa para el" +" golf. También tiene correas para colgarlo en la espalda." + +#: lang/json/ARMOR_from_json.py +msgid "travelpack" +msgid_plural "travelpacks" +msgstr[0] "bolso de viaje" +msgstr[1] "bolsos de viaje" + +#. ~ Description for travelpack +#: lang/json/ARMOR_from_json.py +msgid "A hiking pack used for short trips." +msgstr "Es un bolso usado comúnmente para viajes cortos." + #: lang/json/ARMOR_from_json.py msgid "pistol bandolier" msgid_plural "pistol bandoliers" @@ -17326,22 +17370,6 @@ msgstr "" "de energía. Las balas serán detenidas con más frecuencia que las espadas, y " "las espadas más que los objetos grandes." -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Advanced Microreactor CBM" -msgid_plural "Advanced Microreactor CBMs" -msgstr[0] "MCB Microreactor Mejorado" -msgstr[1] "MCB Microreactor Mejorado" - -#. ~ Description for Advanced Microreactor CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"This module upgrades a pre-installed microreactor with enhanced maximum " -"yield and limited automatic radiation scrubbing capabilities." -msgstr "" -"Este módulo mejora un microreactor previamente instalado con una producción " -"máxima incrementada y capacidades limitadas de limpieza automática de " -"radiación." - #: lang/json/BIONIC_ITEM_from_json.py msgid "Alarm System CBM" msgid_plural "Alarm System CBMs" @@ -18200,19 +18228,6 @@ msgid "" "cause delayed reaction times and drowsiness." msgstr "" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Plutonium Filter CBM" -msgid_plural "Plutonium Filter CBMs" -msgstr[0] "MCB Filtro de Plutonio" -msgstr[1] "MCB Filtro de Plutonio" - -#. ~ Description for Plutonium Filter CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A system of tanks and filters that are connected to a microreactor to " -"extract plutonium from radioactive slurry." -msgstr "" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Power Armor Interface CBM" msgid_plural "Power Armor Interface CBMs" @@ -18340,33 +18355,6 @@ msgid "" "unarmed slashing damage whenever the user's fingertips are uncovered." msgstr "" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Internal Microreactor CBM" -msgid_plural "Internal Microreactor CBMs" -msgstr[0] "MCB Microreactor Interno" -msgstr[1] "MCB Microreactor Interno" - -#. ~ Description for Internal Microreactor CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"This stripped down mini-reactor will generate impressive amounts of bionic " -"power, but may not be the safest thing to install. Once active, it cannot " -"be shut down and will slowly contaminate the user's body with radiation." -msgstr "" - -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Microreactor Upgrade CBM" -msgid_plural "Microreactor Upgrade CBMs" -msgstr[0] "MCB Mejora de Microreactor" -msgstr[1] "MCB Mejora de Microreactor" - -#. ~ Description for Microreactor Upgrade CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A kit for upgrading a pre-installed microreactor with enhanced maximum yield" -" and limited automatic radiation scrubbing capabilities." -msgstr "" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Recycler Unit CBM" msgid_plural "Recycler Unit CBMs" @@ -19017,6 +19005,62 @@ msgstr "" "El espacio dentro de la cavidad de tu pecho ha sido convertido en un lugar " "de almacenamiento. Tu volumen de carga se incrementará en 2 litros." +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Advanced Microreactor CBM" +msgid_plural "Advanced Microreactor CBMs" +msgstr[0] "MCB Microreactor Mejorado" +msgstr[1] "MCB Microreactor Mejorado" + +#. ~ Description for Advanced Microreactor CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"This module upgrades a pre-installed microreactor with enhanced maximum " +"yield and limited automatic radiation scrubbing capabilities." +msgstr "" +"Este módulo mejora un microreactor previamente instalado con una producción " +"máxima incrementada y capacidades limitadas de limpieza automática de " +"radiación." + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Plutonium Filter CBM" +msgid_plural "Plutonium Filter CBMs" +msgstr[0] "MCB Filtro de Plutonio" +msgstr[1] "MCB Filtro de Plutonio" + +#. ~ Description for Plutonium Filter CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A system of tanks and filters that are connected to a microreactor to " +"extract plutonium from radioactive slurry." +msgstr "" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Internal Microreactor CBM" +msgid_plural "Internal Microreactor CBMs" +msgstr[0] "MCB Microreactor Interno" +msgstr[1] "MCB Microreactor Interno" + +#. ~ Description for Internal Microreactor CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"This stripped down mini-reactor will generate impressive amounts of bionic " +"power, but may not be the safest thing to install. Once active, it cannot " +"be shut down and will slowly contaminate the user's body with radiation." +msgstr "" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Microreactor Upgrade CBM" +msgid_plural "Microreactor Upgrade CBMs" +msgstr[0] "MCB Mejora de Microreactor" +msgstr[1] "MCB Mejora de Microreactor" + +#. ~ Description for Microreactor Upgrade CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A kit for upgrading a pre-installed microreactor with enhanced maximum yield" +" and limited automatic radiation scrubbing capabilities." +msgstr "" + #. ~ Description for Solar Panels CBM #: lang/json/BIONIC_ITEM_from_json.py msgid "" @@ -21827,26 +21871,26 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Nietzsche's \"Beyond Good and Evil\". Its cover is dog-" +"This is a copy of Nietzsche's \"Beyond Good and Evil\". Its cover is dog-" "eared and creased." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"The Unique and Its Property\" by Max Stirner. A modern " +"This is a copy of \"The Unique and Its Property\" by Max Stirner. A modern " "translation by Wolfi Landstreicher." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Jean-Paul Sartre's \"Being and Nothingness\". A key work " +"This is a copy of Jean-Paul Sartre's \"Being and Nothingness\". A key work " "in the existentialist tradition." msgstr "" #: lang/json/BOOK_from_json.py msgid "" "A large, extended version of \"Madness and Civilisation\" by Michel " -"Foucault. The cover features a striking image of a Panopticonic Prison." +"Foucault. The cover features a striking image of a Panopticonic Prison." msgstr "" #: lang/json/BOOK_from_json.py @@ -21857,13 +21901,13 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"A collection of texts and essays by Jacques Derrida. It's pages loose and " +"A collection of texts and essays by Jacques Derrida. It's pages loose and " "yellowed, you should probably handle it with care." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Society of the Spectacle\" by Guy Debord. Its cover " +"This is a copy of \"Society of the Spectacle\" by Guy Debord. Its cover " "shows rows of adults staring placidly into a screen." msgstr "" @@ -21875,36 +21919,36 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Baudrillard's \"Simulation and Simulacra\". The cover " +"This is a copy of Baudrillard's \"Simulation and Simulacra\". The cover " "contains an image of a man holding a colored pill in each hand, with the " -"caption \"Welcome to the Desert of the Real.\". You think you've seen this " +"caption \"Welcome to the Desert of the Real.\". You think you've seen this " "movie." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a small, pocket version of Sartre's \"Existentialism and Humanism.\"" -" It looks to have been used as a coaster in a past life." +"This is a small, pocket version of Sartre's \"Existentialism and Humanism\"." +" It looks to have been used as a coaster in a past life." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Practical Ethics\" by Peter Singer. From the local " +"This is a copy of \"Practical Ethics\" by Peter Singer. From the local " "university press." msgstr "" #: lang/json/BOOK_from_json.py msgid "" "This is a photocopied spiral-bound copy of \"Industrial Society and Its " -"Future\" by 'Freedom Club'. The original looks to have been written on a " +"Future\" by 'Freedom Club'. The original looks to have been written on a " "typewriter before being copied." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Industrial Society and Its Future\" by Ted Kaczynski. " +"This is a copy of \"Industrial Society and Its Future\" by Ted Kaczynski. " "Its cover is an image of a hand-crafted wooden box filled with wiring and an" -" ominous looking metal tube. Provocative." +" ominous looking metal tube. Provocative." msgstr "" #: lang/json/BOOK_from_json.py @@ -21913,23 +21957,23 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"The State and Revolution\" by Vladimir Lenin. In " +"This is a copy of \"The State and Revolution\" by Vladimir Lenin. In " "English, thankfully." msgstr "" #: lang/json/BOOK_from_json.py -msgid "This is a copy of \"In Defence of Terrorism\" by Leon Trotsky." +msgid "This is a copy of \"In Defense of Marxism\" by Leon Trotsky." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Steal This Book\" by Abbie Hoffman. There is a security " -"tag on the back cover. It appears to still be active." +"This is a copy of \"Steal This Book\" by Abbie Hoffman. There is a security" +" tag on the back cover. It appears to still be active." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Walden: Or Life In The Woods\" by Henry David Thoreau. " +"This is a copy of \"Walden: Or Life In The Woods\" by Henry David Thoreau. " "It contains a dried and pressed leaf as a bookmark." msgstr "" @@ -21950,7 +21994,7 @@ msgid "" msgstr "" #: lang/json/BOOK_from_json.py -msgid "This is a copy of Machiavelli's \"The Prince\". With intro by Q. Skinner." +msgid "This is a copy of Machiavelli's \"The Prince\". With intro by Q. Skinner." msgstr "" #: lang/json/BOOK_from_json.py @@ -21960,12 +22004,12 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a pocket copy of \"An Essay on Liberation\" by Herbert Marcuse. The " -"cover contains an image of a pelican." +"This is a pocket copy of \"An Essay on Liberation\" by Herbert Marcuse. The" +" cover contains an image of a pelican." msgstr "" #: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Either-Or\" by Sören Kierkegaard." +msgid "This is a copy of \"Either-Or\" by Søren Kierkegaard." msgstr "" #: lang/json/BOOK_from_json.py @@ -21990,6 +22034,69 @@ msgid "" "Science\" by Friederich Nietzsche." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Myth of Sisyphus\", and other essays, by Albert " +"Camus. The cover depicts a bare-chested man and a large boulder." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Sickness Unto Death\" by Søren Kierkegaard. The " +"pages are dotted with post-it notes." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Defence of Terrorism\" by Leon Trotsky. Despite the" +" title, it does not actually appear to be defending terrorism." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Enquiry Concerning Political Justice\" by William " +"Godwin. This thick book is filled with antiquated phrases." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Abolition of Work and Other Essays\" by Bob Black. " +"It is likely that \"The Abolition of Work\" is the most famous essay in this" +" book." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"What is Property?\" by Pierre-Joseph Proudhon. It looks" +" like this book has a surprisingly long track record of owners." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Conquest of Bread\" by Peter Kropotkin. There is a " +"picture of an old philosopher with magnificent beard, instead of bread, on " +"the cover." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Trouble with Being Born\" by Emil Cioran. This book" +" might have been printed decades before the cataclysm since the cover is " +"quite weathered." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The World as Will and Representation\" by Arthur " +"Schopenhauer. It contains a few undecipherable notes and scribbles." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Up-Wingers: A Futurist Manifesto\" by FM-2030. It seems" +" that the author's real name is Fereidoun M. Esfandiary." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "phone book" msgid_plural "phone books" @@ -23965,14 +24072,10 @@ msgstr[1] "fenol" msgid "" "This useful stuff is a potent solvent and has a wide range of reactive " "applications. It can be used to make a huge number of plastics and " -"polymers, it can be a disinfectant, it can strip paint and break down epoxy," -" and it can burn your skin away like tissue paper under a heat gun. Wear " +"polymers, it can be an antiseptic, it can strip paint and break down epoxy, " +"and it can burn your skin away like tissue paper under a heat gun. Wear " "gloves." msgstr "" -"Esta útil cosa es un potente solvente y tiene un amplio rango de " -"aplicaciones. Puede ser usado para hacer una enorme cantidad de plásticos y " -"polímeros, puede ser un desinfectante, puede quitar pintar y romper epoxy, y" -" puede quemarte la piel como si fuera papel bajo el fuego. Usá guantes." #: lang/json/COMESTIBLE_from_json.py msgid "glycerol" @@ -29707,11 +29810,9 @@ msgstr[1] "polvo antiséptico" #. ~ Description for antiseptic powder #: lang/json/COMESTIBLE_from_json.py msgid "" -"A powdered form of chemical disinfectant, this bismuth formic iodide cleans " +"A powdered form of chemical antiseptic, this bismuth formic iodide cleans " "wounds quickly and painlessly." msgstr "" -"Es un desinfectante químico en forma de polvo. Este yoduro de bismuto " -"fórmico limpia las heridas de manera rápida y sin dolor." #: lang/json/COMESTIBLE_from_json.py msgid "caffeinated chewing gum" @@ -29763,13 +29864,10 @@ msgstr[1] "peróxido de hidrógeno" #. ~ Description for hydrogen peroxide #: lang/json/COMESTIBLE_from_json.py msgid "" -"Dilute hydrogen peroxide, for use as a disinfectant and for bleaching hair " -"or textiles. Foams a little when in contact with organic matter, but " +"Dilute hydrogen peroxide, for use as an antiseptic and for bleaching hair or" +" textiles. Foams a little when in contact with organic matter, but " "otherwise harmless." msgstr "" -"Es peróxido de hidrógeno diluido, para usar como desinfectante o blanqueador" -" de pelo o telas. Hace un poco de espuma cuando está en contacto con materia" -" orgánica, pero si no es inofensivo." #: lang/json/COMESTIBLE_from_json.py lang/json/GENERIC_from_json.py msgid "cigarette" @@ -29936,27 +30034,23 @@ msgstr "" "Igual, vas a necesitar descanso y mucho líquido." #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant" -msgstr "desinfectante" +msgid "antiseptic" +msgstr "" -#. ~ Description for disinfectant +#. ~ Description for antiseptic #: lang/json/COMESTIBLE_from_json.py -msgid "A powerful disinfectant commonly used for contaminated wounds." +msgid "A powerful antiseptic commonly used for contaminated wounds." msgstr "" -"Es un desinfectante poderoso comúnmente usado para limpiar heridas " -"contaminadas." #: lang/json/COMESTIBLE_from_json.py -msgid "makeshift disinfectant" -msgstr "desinfectante improvisado" +msgid "makeshift antiseptic" +msgstr "" -#. ~ Description for makeshift disinfectant +#. ~ Description for makeshift antiseptic #: lang/json/COMESTIBLE_from_json.py msgid "" -"Makeshift disinfectant made from ethanol. Can be used to disinfect a wound." +"Makeshift antiseptic made from ethanol. Can be used to disinfect a wound." msgstr "" -"Es un desinfectante improvisado, hecho con etanol. Puede ser utilizado para " -"desinfectar una herida." #: lang/json/COMESTIBLE_from_json.py src/addiction.cpp msgid "diazepam" @@ -30361,10 +30455,8 @@ msgstr "aceite de tomillo" #: lang/json/COMESTIBLE_from_json.py msgid "" "Some essential oil made from thyme, which can act as a mildly irritating " -"disinfectant." +"antiseptic." msgstr "" -"Es un poco de aceite esencial hecho con tomillo, que puede servir como un " -"leve desinfectante irritante." #: lang/json/COMESTIBLE_from_json.py msgid "rolling tobacco" @@ -30576,28 +30668,28 @@ msgstr "" "alprazolam." #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant soaked rag" -msgid_plural "disinfectant soaked rags" -msgstr[0] "trapo empapado de desinfectante" -msgstr[1] "trapos empapados de desinfectante" +msgid "antiseptic soaked rag" +msgid_plural "antiseptic soaked rags" +msgstr[0] "" +msgstr[1] "" -#. ~ Description for disinfectant soaked rag +#. ~ Description for antiseptic soaked rag #: lang/json/COMESTIBLE_from_json.py msgid "" -"A rag soaked in disinfectant. Useful for light wounds, probaby won't help " -"with deep bites." +"A rag soaked in antiseptic. Useful for light wounds, probaby won't help with" +" deep bites." msgstr "" #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant soaked cotton balls" -msgid_plural "disinfectant soaked cotton balls" -msgstr[0] "pelota de algodón empapada de desinfectante" -msgstr[1] "pelotas de algodón empapadas de desinfectante" +msgid "antiseptic soaked cotton balls" +msgid_plural "antiseptic soaked cotton balls" +msgstr[0] "" +msgstr[1] "" -#. ~ Description for disinfectant soaked cotton balls +#. ~ Description for antiseptic soaked cotton balls #: lang/json/COMESTIBLE_from_json.py msgid "" -"Fluffy balls of clean white cotton. Now soaked with disinfectant, they are " +"Fluffy balls of clean white cotton. Now soaked with antiseptic, they are " "somewhat useful to disinfect a wound." msgstr "" @@ -33458,6 +33550,20 @@ msgstr[1] "sánguches de mermelada" msgid "A delicious jam sandwich." msgstr "Es un delicioso sánguche de mermelada." +#: lang/json/COMESTIBLE_from_json.py +msgid "fairy bread" +msgid_plural "fairy bread" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for fairy bread +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"An 'open-faced sandwich' consisting of sliced white bread, a healthy crust-" +"to-crust slathering of butter, and sprinkles. Supposedly a staple of " +"birthday parties in Australia." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "honey sandwich" msgid_plural "honey sandwiches" @@ -34710,6 +34816,21 @@ msgstr "" "Dulce, dulce azúcar. Malo para tus dientes y sorprendentemente no es muy " "sabrosa sola." +#: lang/json/COMESTIBLE_from_json.py +msgid "sprinkles" +msgid_plural "sprinkles" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for sprinkles +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Known as nonpareils, sprinkles, jimmies, sugar strands or 'hundreds-and-" +"thousands', these colorful balls, rods or flakes of sugar and starch are " +"intended for use decorating soft surfaces of sweets. Like sugar, they are " +"bad for your teeth and surprisingly not very tasty on their own." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "wild herbs" msgid_plural "wild herbs" @@ -39650,6 +39771,21 @@ msgstr "" "pizarra de vidrio transparente tiene inscriptas en un patrón miniatura, las " "instrucciones para crear un objeto con el nanofabricador." +#: lang/json/GENERIC_from_json.py +msgid "nanofabricator template (silicon photonics)" +msgid_plural "nanofabricator template (silicon photonics)s" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for nanofabricator template (silicon photonics) +#: lang/json/GENERIC_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "antenna" msgid_plural "antennas" @@ -44663,7 +44799,7 @@ msgstr[1] "" #. ~ Description for .300BLK casing #: lang/json/GENERIC_from_json.py -msgid "An empty casing from a .300BLK round." +msgid "An empty casing from a .300 AAC Blackout round." msgstr "" #: lang/json/GENERIC_from_json.py @@ -46385,6 +46521,36 @@ msgid "" "had fake black soot painted on." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "blackjack" +msgid_plural "blackjacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for blackjack +#: lang/json/GENERIC_from_json.py +msgid "" +"This is a short, easily concealed bludgeoning weapon consisting of a weight " +"embedded at the end of a short leather shaft. Formerly used by law " +"enforcement, this weapon is meant to stun or knock out the subject, although" +" head strikes have a high risk of causing a permanent, disabling brain " +"injury or being fatal." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "makeshift sap" +msgid_plural "makeshift saps" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for makeshift sap +#: lang/json/GENERIC_from_json.py +msgid "" +"This is an improvised sap, also known as a cosh, slapjack and slapper. A " +"short and flat bludgeoning weapon consisting of a weight embedded between " +"two patches of leather." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "pointy stick" msgid_plural "pointy sticks" @@ -46920,6 +47086,30 @@ msgstr "" "sable es bastante más corto que el florete y la espada de esgrima, pero no " "es menos eficaz." +#: lang/json/GENERIC_from_json.py +msgid "hollow cane" +msgid_plural "hollow canes" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for hollow cane +#: lang/json/GENERIC_from_json.py +msgid "" +"A cane designed to conceal blade. This was a popular fashion accessory for " +"the wealthy during the 18th and 19th centuries." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "sword cane" +msgid_plural "sword canes" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for sword cane +#: lang/json/GENERIC_from_json.py +msgid "A sword with a thin blade designed to be hidden inside an hollow cane." +msgstr "" + #: lang/json/GENERIC_from_json.py lang/json/TOOL_from_json.py #: lang/json/TOOL_from_json.py msgid "cutlass" @@ -54483,6 +54673,15 @@ msgstr "" msgid "A cheap 6-round steel box magazine for the Jennings J-22." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "Walther P22 magazine" +msgstr "" + +#. ~ Description for Walther P22 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round box magazine for the Walther P22." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "LW-5 speedloader" msgstr "" @@ -54923,6 +55122,20 @@ msgstr "" msgid "A cheap 32-round steel box magazine for use with the MAC-11 SMG." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "CF-380 magazine" +msgstr "" + +#. ~ Description for CF-380 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Hi-Point CF-380." +msgstr "" + +#. ~ Description for CF-380 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point CF-380." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "M1911 .38 Super magazine" msgstr "" @@ -54987,6 +55200,43 @@ msgid "" "expect much reliability." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "Hi-Power magazine .40 S&W" +msgstr "" + +#. ~ Description for Hi-Power magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Browning Hi-Power .40 S&W." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine .40 S&W" +msgstr "" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 12 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 14 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "Model JCP magazine" +msgstr "" + +#. ~ Description for Model JCP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point Model JCP." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "grenade belt" msgstr "cinta de granadas" @@ -55151,6 +55401,24 @@ msgstr "" "Es un cargador de capacidad estándar para usar con las armas de mano H&K " "USP." +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine .45 ACP" +msgstr "" + +#. ~ Description for PPQ magazine .45 ACP +#: lang/json/MAGAZINE_from_json.py +msgid "A 12 round steel box magazine for the Walther PPQ .45 ACP." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "Model JHP magazine" +msgstr "" + +#. ~ Description for Model JHP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 9-round steel box magazine for use with the Hi-Point Model JHP." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid ".454 5-round speedloader" msgstr "" @@ -55682,6 +55950,95 @@ msgstr "" msgid "A 17 round double stack box magazine for the SIG Sauer P320." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "Hi-Power magazine 9x19mm" +msgstr "" + +#. ~ Description for Hi-Power magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 13 round steel box magazine for the Browning Hi-Power 9x19mm." +msgstr "" + +#. ~ Description for Hi-Power magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 15 round steel box magazine for the Browning Hi-Power 9x19mm." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "P38 magazine" +msgstr "" + +#. ~ Description for P38 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8 round steel box magazine for the Walther P38." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine 9x19mm" +msgstr "" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Walther PPQ 9mm." +msgstr "" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 15 round steel box magazine for the Walther PPQ 9mm." +msgstr "" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 17 round steel box magazine for the Walther PPQ 9mm." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "C-9 magazine" +msgstr "" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Hi-Point C-9." +msgstr "" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point C-9." +msgstr "" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 15-round steel box magazine for use with the Hi-Point C-9." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "CZ 75 magazine" +msgstr "" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 12-round steel box magazine for use with the CZ 75." +msgstr "" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 20-round steel box magazine for use with the CZ 75." +msgstr "" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 26-round steel box magazine for use with the CZ 75." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "CCP magazine" +msgstr "" + +#. ~ Description for CCP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Walther CCP." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "Makarov PM magazine" msgstr "cargador Makarov PM" @@ -59696,10 +60053,8 @@ msgstr "torreta milspec" #: lang/json/MONSTER_from_json.py msgid "" "Leadworks LLC's T-4A1 Sentry. It features improved firmware over General " -"Atomics' TX-1 9x19mm model and an automated M4 carbine." +"Atomics' TX-1 9x19mm model and an automated 5.56mm carbine." msgstr "" -"La T-4A1 Sentry de Leadworks SRL. Posee un firmware mejorado del modelo TX-1" -" 9x19mm de General Atomic, y una carabina M4 automatizada." #: lang/json/MONSTER_from_json.py msgid "debug monster" @@ -61297,6 +61652,47 @@ msgid "" "between walls and ceiling with limbs grown from its own disjointed ribs." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "gangrenous impaler" +msgstr "" + +#. ~ Description for gangrenous impaler +#: lang/json/MONSTER_from_json.py +msgid "" +"A corpse hideously twisted into an insect-like form. A hollow tendril " +"reaches out from its open thorax." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "The impaler launches a barb!" +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "trapped tendril" +msgstr "" + +#. ~ Description for trapped tendril +#: lang/json/MONSTER_from_json.py +msgid "" +"A great tendril of mutated flesh and sharpened bone. Emergent from a " +"crevice in the ruined floor, hundreds of human limbs seek freedom and writhe" +" incessantly from underneath its grotesque carapace. As enormous as it may " +"already be, you feel certain that this is just part of a creature much " +"bigger, for when it moves, you can feel this whole ruin tremble, as if an " +"unseen giant struggled against the weight of its concrete tomb." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "flesh wall" +msgstr "" + +#. ~ Description for flesh wall +#: lang/json/MONSTER_from_json.py +msgid "" +"A great lump of mutated flesh. It resembles the innards of some gigantic " +"creature and is covered in a grid of diminutive veins." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "bloated fungal zombie" msgstr "" @@ -65126,6 +65522,24 @@ msgid "" "effect. Starts very short range, increases rapidly with level." msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Summon Gangrenous Crawlers" +msgstr "" + +#. ~ Description for Summon Gangrenous Crawlers +#: lang/json/SPELL_from_json.py +msgid "Summons 2 permanent gangrenous crawlers." +msgstr "" + +#: lang/json/SPELL_from_json.py +msgid "Summon Gangrenous Monsters" +msgstr "" + +#. ~ Description for Summon Gangrenous Monsters +#: lang/json/SPELL_from_json.py +msgid "Summons 2 permanent gangrenous impalers." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Smite" msgstr "" @@ -72048,6 +72462,19 @@ msgid "" "used for cleaning impervious surfaces." msgstr "" +#: lang/json/TOOL_from_json.py +msgid "washing kit" +msgid_plural "washing kits" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for washing kit +#: lang/json/TOOL_from_json.py +msgid "" +"A combination kit of a washboard and a sponge. Everything you need to clean" +" items after the apocalypse." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "reading light" msgid_plural "reading lights" @@ -80393,6 +80820,10 @@ msgstr "" msgid "nails" msgstr "clavos" +#: lang/json/ammunition_type_from_json.py +msgid "barb" +msgstr "" + #: lang/json/ammunition_type_from_json.py msgid "BBs" msgstr "balines" @@ -80601,8 +81032,8 @@ msgid "components" msgstr "componentes" #: lang/json/ammunition_type_from_json.py -msgid "93mm RPG-7" -msgstr "93mm RPG-7" +msgid "RPG-7 rocket" +msgstr "" #: lang/json/ammunition_type_from_json.py msgid "rebreather filter" @@ -80736,18 +81167,6 @@ msgid "" "those in turn more often than massive objects." msgstr "" -#: lang/json/bionic_from_json.py -msgid "Advanced Microreactor System" -msgstr "Sistema Mejorado de Microreactor" - -#. ~ Description for Advanced Microreactor System -#: lang/json/bionic_from_json.py -msgid "" -"This stripped down mini-reactor is more efficient and safer than the base " -"model due to integrated radiation cleansers. There is no way to shut it " -"down once active, but you can toggle additional fuel intake." -msgstr "" - #: lang/json/bionic_from_json.py msgid "Alarm System" msgstr "Sistema de Alarma" @@ -81624,28 +82043,6 @@ msgstr "" " te permite dormir tus sentidos cuando quieras. Sin embargo, la utilización " "de este sistema puede causar que tus reacciones sean lentas y somnolencia." -#: lang/json/bionic_from_json.py -msgid "Plutonium Filter" -msgstr "Filtro de Plutonio" - -#. ~ Description for Plutonium Filter -#: lang/json/bionic_from_json.py -msgid "" -"This set of tanks and filters allows you to extract plutonium from " -"radioactive slurry." -msgstr "" - -#: lang/json/bionic_from_json.py -msgid "Plutonium Purger" -msgstr "Purificador de Plutonio" - -#. ~ Description for Plutonium Purger -#: lang/json/bionic_from_json.py -msgid "" -"Triggers an emergency reactor fuel purge that ejects all fuel from your " -"reactor." -msgstr "" - #. ~ Description for Bionic Visual Impairment #: lang/json/bionic_from_json.py msgid "" @@ -81780,18 +82177,6 @@ msgid "" "amount of unarmed slashing damage whenever your fingertips are uncovered." msgstr "" -#: lang/json/bionic_from_json.py -msgid "Microreactor System" -msgstr "Sistema de Microreactor" - -#. ~ Description for Microreactor System -#: lang/json/bionic_from_json.py -msgid "" -"This stripped down mini-reactor generates impressive amounts of bionic " -"power. There is no way to shut it down, but you can toggle additional fuel " -"intake. Irradiates your body when active." -msgstr "" - #: lang/json/bionic_from_json.py msgid "Recycler Unit" msgstr "Unidad de Reciclado" @@ -82264,6 +82649,52 @@ msgid "" "artificial but effective sensation of fatigue." msgstr "" +#: lang/json/bionic_from_json.py +msgid "Advanced Microreactor System" +msgstr "Sistema Mejorado de Microreactor" + +#. ~ Description for Advanced Microreactor System +#: lang/json/bionic_from_json.py +msgid "" +"This stripped down mini-reactor is more efficient and safer than the base " +"model due to integrated radiation cleansers. There is no way to shut it " +"down once active, but you can toggle additional fuel intake." +msgstr "" + +#: lang/json/bionic_from_json.py +msgid "Plutonium Filter" +msgstr "Filtro de Plutonio" + +#. ~ Description for Plutonium Filter +#: lang/json/bionic_from_json.py +msgid "" +"This set of tanks and filters allows you to extract plutonium from " +"radioactive slurry." +msgstr "" + +#: lang/json/bionic_from_json.py +msgid "Plutonium Purger" +msgstr "Purificador de Plutonio" + +#. ~ Description for Plutonium Purger +#: lang/json/bionic_from_json.py +msgid "" +"Triggers an emergency reactor fuel purge that ejects all fuel from your " +"reactor." +msgstr "" + +#: lang/json/bionic_from_json.py +msgid "Microreactor System" +msgstr "Sistema de Microreactor" + +#. ~ Description for Microreactor System +#: lang/json/bionic_from_json.py +msgid "" +"This stripped down mini-reactor generates impressive amounts of bionic " +"power. There is no way to shut it down, but you can toggle additional fuel " +"intake. Irradiates your body when active." +msgstr "" + #: lang/json/bionic_from_json.py msgid "Internal Furnace" msgstr "Horno Interno" @@ -82397,9 +82828,7 @@ msgstr "Te cuesta más esquivar y combatir cuerpo a cuerpo." #: lang/json/bodypart_from_json.py src/armor_layers.cpp src/character.cpp #: src/debug_menu.cpp msgid "Torso" -msgid_plural "Torso" -msgstr[0] "Torso" -msgstr[1] "Torso" +msgstr "Torso" #. ~ Crafting recipes subcategory of 'ARMOR' category #: lang/json/bodypart_from_json.py lang/json/recipe_category_from_json.py @@ -82418,9 +82847,7 @@ msgstr "cabeza" #: lang/json/bodypart_from_json.py src/armor_layers.cpp src/character.cpp #: src/debug_menu.cpp msgid "Head" -msgid_plural "Head" -msgstr[0] "Cabeza" -msgstr[1] "Cabeza" +msgstr "Cabeza" #. ~ Crafting recipes subcategory of 'ARMOR' category #: lang/json/bodypart_from_json.py lang/json/recipe_category_from_json.py @@ -82442,9 +82869,7 @@ msgstr "Te cuesta más el combate a distancia." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "Eyes" -msgid_plural "Eyes" -msgstr[0] "Ojos" -msgstr[1] "Ojos" +msgstr "Ojos" #: lang/json/bodypart_from_json.py msgid "mouth" @@ -82461,9 +82886,7 @@ msgstr "Corrés más lento." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "Mouth" -msgid_plural "Mouth" -msgstr[0] "Boca" -msgstr[1] "Boca" +msgstr "Boca" #: lang/json/bodypart_from_json.py msgid "left arm" @@ -82474,15 +82897,26 @@ msgctxt "bodypart_accusative" msgid "left arm" msgstr "brazo izquierdo" +#: lang/json/bodypart_from_json.py +msgid "arms" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "arms" +msgstr "" + #: lang/json/bodypart_from_json.py msgid "Melee and ranged combat is hampered." msgstr "Te cuesta más el combate a distancia y cuerpo a cuerpo." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Arm" -msgid_plural "Arms" -msgstr[0] "Brazo Izq." -msgstr[1] "Brazos" +msgstr "BrazIzq" + +#: lang/json/bodypart_from_json.py +msgid "Arms" +msgstr "Brazos" #: lang/json/bodypart_from_json.py msgid "L ARM" @@ -82499,9 +82933,7 @@ msgstr "brazo derecho" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Arm" -msgid_plural "Arms" -msgstr[0] "Brazo Der." -msgstr[1] "Brazos" +msgstr "BrazDer" #: lang/json/bodypart_from_json.py msgid "R ARM" @@ -82516,15 +82948,26 @@ msgctxt "bodypart_accusative" msgid "left hand" msgstr "mano izquierda" +#: lang/json/bodypart_from_json.py +msgid "hands" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "hands" +msgstr "" + #: lang/json/bodypart_from_json.py msgid "Manual tasks are slowed." msgstr "Las tareas manuales serán más lentas." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Hand" -msgid_plural "Hands" -msgstr[0] "Mano Izq." -msgstr[1] "Manos" +msgstr "ManoIzq" + +#: lang/json/bodypart_from_json.py +msgid "Hands" +msgstr "Manos" #: lang/json/bodypart_from_json.py msgid "right hand" @@ -82537,9 +82980,7 @@ msgstr "mano derecha" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Hand" -msgid_plural "Hands" -msgstr[0] "Mano Der." -msgstr[1] "Manos" +msgstr "ManoDer" #: lang/json/bodypart_from_json.py msgid "left leg" @@ -82550,15 +82991,26 @@ msgctxt "bodypart_accusative" msgid "left leg" msgstr "pierna izquierda" +#: lang/json/bodypart_from_json.py +msgid "legs" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "legs" +msgstr "" + #: lang/json/bodypart_from_json.py msgid "Running and swimming are slowed." msgstr "Nadás y corrés más lento." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Leg" -msgid_plural "Legs" -msgstr[0] "Pierna Izq." -msgstr[1] "Piernas" +msgstr "PrnaIzq" + +#: lang/json/bodypart_from_json.py +msgid "Legs" +msgstr "Piernas" #: lang/json/bodypart_from_json.py msgid "L LEG" @@ -82575,9 +83027,7 @@ msgstr "pierna derecha" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Leg" -msgid_plural "Legs" -msgstr[0] "Pierna Der." -msgstr[1] "Piernas" +msgstr "PrnaDer" #: lang/json/bodypart_from_json.py msgid "R LEG" @@ -82592,11 +83042,22 @@ msgctxt "bodypart_accusative" msgid "left foot" msgstr "pie izquierdo" +#: lang/json/bodypart_from_json.py +msgid "feet" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "feet" +msgstr "" + #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Foot" -msgid_plural "Feet" -msgstr[0] "Pie Izq." -msgstr[1] "Pies" +msgstr "Pie Izq" + +#: lang/json/bodypart_from_json.py +msgid "Feet" +msgstr "Pies" #: lang/json/bodypart_from_json.py msgid "right foot" @@ -82609,15 +83070,11 @@ msgstr "pie derecho" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Foot" -msgid_plural "Feet" -msgstr[0] "Pie Der." -msgstr[1] "Pies" +msgstr "Pie Der" #: lang/json/bodypart_from_json.py msgid "appendix" -msgid_plural "Appendices" -msgstr[0] "Apéndices" -msgstr[1] "Apéndices" +msgstr "apéndice" #: lang/json/bodypart_from_json.py msgctxt "bodypart_accusative" @@ -82628,6 +83085,10 @@ msgstr "apéndice" msgid "It's inflamed." msgstr "Está inflamado." +#: lang/json/bodypart_from_json.py +msgid "Appendices" +msgstr "Apéndices" + #: lang/json/clothing_mod_from_json.py msgid "Pad with leather" msgstr "Rellenar con cuero" @@ -91796,7 +92257,9 @@ msgstr "" "debido a su tamaño pequeño y corto tensado. Los pernos disparados con esta " "arma tienen una gran probabilidad de no romperse." -#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py src/item.cpp +#: lang/json/gun_from_json.py lang/json/gun_from_json.py +#: lang/json/gunmod_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gunmod_from_json.py src/item.cpp msgctxt "gun_type_type" msgid "pistol" msgstr "pistola" @@ -91936,6 +92399,20 @@ msgstr "" "pequeña bomba al costado le permite represurizarlo, aunque este proceso " "tarda unos minutos." +#: lang/json/gun_from_json.py +msgid "simple flamethrower" +msgid_plural "simple flamethrowers" +msgstr[0] "lanzallamas simple" +msgstr[1] "lanzallamas simples" + +#: lang/json/gun_from_json.py +msgid "" +"A simple, home-made flamethrower. While its capacity is not superb, it is " +"more than capable of igniting terrain and monsters alike." +msgstr "" +"Un lanzallamas simple, hecho en casa. Aunque su capacidad no es muy buena, " +"es más que capaz de prender fuego el terreno y los monstruos." + #: lang/json/gun_from_json.py msgid "BB gun" msgid_plural "BB guns" @@ -92618,6 +93095,19 @@ msgid "" "safety issues." msgstr "" +#: lang/json/gun_from_json.py +msgid "Walther P22" +msgid_plural "Walther P22s" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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" +msgstr "" + #: lang/json/gun_from_json.py msgid "Remington ACR" msgid_plural "Remington ACRs" @@ -93644,6 +94134,20 @@ msgid "" " make for a moderately poor handling pistol." msgstr "" +#: lang/json/gun_from_json.py +msgid "Hi-Point CF-380" +msgid_plural "Hi-Point CF-380s" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "M1911A1" msgid_plural "M1911A1s" @@ -93737,6 +94241,47 @@ msgstr "" "La Smith & Wesson 610 es un revólver clásico de seis disparos para balas " "calibre 10mm, o para las propias de la marca S$W, el calibre .40." +#: lang/json/gun_from_json.py +msgid "Browning Hi-Power .40 S&W" +msgid_plural "Browning Hi-Power .40 S&Ws" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Browning Hi-Power is a semi-automatic handgun developed shortly before " +"the second world war. Widely issued since then, it remains in use by India, " +"Canada and Australia. This is a commercial variant produced by Browning Arms" +" in .40 S&W." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther PPQ .40 S&W" +msgid_plural "Walther PPQ .40 S&Ws" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in .40 S&W." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Hi-Point Model JCP" +msgid_plural "Hi-Point Model JCPs" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "tube 40mm launcher" msgid_plural "tube 40mm launchers" @@ -94098,6 +94643,33 @@ msgid_plural "USP .45s" msgstr[0] "USP .45" msgstr[1] "USP .45" +#: lang/json/gun_from_json.py +msgid "Walther PPQ .45 ACP" +msgid_plural "Walther PPQ .45 ACPs" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in .45 ACP." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Hi-Point Model JHP" +msgid_plural "Hi-Point Model JHPs" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "Taurus Raging Bull" msgid_plural "Taurus Raging Bull" @@ -95118,6 +95690,94 @@ msgid "" "SIG Sauer P320." msgstr "" +#: lang/json/gun_from_json.py +msgid "Browning Hi-Power 9x19mm" +msgid_plural "Browning Hi-Power 9x19mms" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Browning Hi-Power is a semi-automatic handgun developed shortly before " +"the second world war. Widely issued since then, it remains in use by India, " +"Canada and Australia. This is a commercial variant produced by Browning Arms" +" in 9x19mm Parabellum." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther P38" +msgid_plural "Walther P38s" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther PPQ 9mm" +msgid_plural "Walther PPQ 9mms" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in 9x19mm Parabellum." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Hi-Point C-9" +msgid_plural "Hi-Point C-9s" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "CZ-75" +msgid_plural "CZ-75s" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The CZ-75 is a semi-automatic pistol developed in Czechoslovakia, and is one" +" of the original wonder nines. Though designed for export to western " +"countries, it was declared a state secret; lack of international patent " +"protection meant that many clones and variants were produced and distributed" +" around the world, with Česká zbrojovka only joining in the 90's. This " +"pistol remains wildly popular among competition shooters." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther CCP" +msgid_plural "Walther CCPs" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "Makarov PM" msgid_plural "Makarov PMs" @@ -95222,20 +95882,6 @@ msgstr "" "Un lanzallamas grande con grandes reservas de combustible. Muy amenazante y " "mortal." -#: lang/json/gun_from_json.py -msgid "simple flamethrower" -msgid_plural "simple flamethrowers" -msgstr[0] "lanzallamas simple" -msgstr[1] "lanzallamas simples" - -#: lang/json/gun_from_json.py -msgid "" -"A simple, home-made flamethrower. While its capacity is not superb, it is " -"more than capable of igniting terrain and monsters alike." -msgstr "" -"Un lanzallamas simple, hecho en casa. Aunque su capacidad no es muy buena, " -"es más que capaz de prender fuego el terreno y los monstruos." - #: lang/json/gun_from_json.py msgid "RM451 flamethrower" msgid_plural "RM451 flamethrowers" @@ -95364,6 +96010,16 @@ msgstr "" "fuerza de Lorentz generada por la inducción electromagnética. Se alimenta " "con un UPS normal." +#: lang/json/gun_from_json.py +msgid "barb launching organ" +msgid_plural "barb launching organs" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "A mutated organ capable of launching bony barbs at great speed." +msgstr "" + #: lang/json/gun_from_json.py msgid "coilgun" msgid_plural "coilguns" @@ -96017,6 +96673,19 @@ msgstr "" "objetivos. La energía disparada incendia el oxígeno creando fuego mientras " "se va moviendo y explotando al impactar." +#: lang/json/gun_from_json.py +msgid "Yeet Cannon" +msgid_plural "Yeet Cannons" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"You can YEET all the bullets with this baby. YEET them right into all of the" +" zombies in your path, all the hulks, the spiders, and those damned mole " +"rats." +msgstr "" + #: lang/json/gun_from_json.py msgid "SVS-24" msgid_plural "SVS-24" @@ -97969,27 +98638,6 @@ msgstr "" "El Taurus Raging Judge Magnum es un revólver de 5 disparos para la .454. " "Casull. Puede disparar cartuchos .410 y .45 Long Colt." -#: lang/json/gunmod_from_json.py -msgid ".300 AAC Blackout caliber conversion kit" -msgid_plural ".300 AAC Blackout caliber conversion kits" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/gunmod_from_json.py -msgid "" -"This kit is used to convert an AR-15 .223/5.56mm rifle to the new .300BLK " -"caliber." -msgstr "" - -#: lang/json/gunmod_from_json.py -msgid "bore" -msgstr "calibre" - -#: lang/json/gunmod_from_json.py -msgctxt "gun_type_type" -msgid "ar15" -msgstr "ar15" - #: lang/json/gunmod_from_json.py msgid "barrel extension" msgid_plural "barrel extensions" @@ -98089,6 +98737,10 @@ msgstr "" ".40, 5.7mm, 4.6mm, 7.62x39mm o .223, lo convierte en un .22. Esta conversión" " reduce un poco la precisión." +#: lang/json/gunmod_from_json.py +msgid "bore" +msgstr "calibre" + #: lang/json/gunmod_from_json.py msgid ".223 caliber conversion kit" msgid_plural ".223 caliber conversion kits" @@ -98452,6 +99104,36 @@ msgstr "" "Es una bolsa que cuelga a un costado del arma y recolecta las vainas " "eyectadas, así no tenés que levantarlas vos." +#: lang/json/gunmod_from_json.py +msgid ".300 AAC Blackout AR-15 conversion kit" +msgid_plural ".300 AAC Blackout AR-15 conversion kits" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gunmod_from_json.py +msgid "A complete AR-15 upper assembly with a .300 AAC Blackout barrel." +msgstr "" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "ar15" +msgstr "ar15" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "m4a1" +msgstr "" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "h&k416a5" +msgstr "" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "m27iar" +msgstr "" + #: lang/json/gunmod_from_json.py msgid "lightweight replacement furniture" msgid_plural "lightweight replacement furnitures" @@ -100711,11 +101393,11 @@ msgstr "" #: lang/json/help_from_json.py msgid "" -"While magazines are often firearm-specific, on some occasions a magazine is compatible with several other firearms. The firearms in the game often reflect real-world prototypes in terms of caliber and compatibility. Below are some examples of interchangeable ammo:\n" -".308 = 7.62x51mm,\n" -".223 = 5.56 NATO,\n" -".270 = .30-06,\n" -".40 S&W = 10mm." +"While magazines and clips are often firearm-specific, on some occasions a magazine/speedloader is compatible with several other firearms or calibers. Below are some examples of calibers that might share magazines or speedloaders:\n" +".380 ACP and 9mm Luger,\n" +" .40 S&W and 10mm Auto 3\n" +".45 ACP and .460 Rowland,\n" +".45 Colt and .454 Casull." msgstr "" #: lang/json/help_from_json.py @@ -101838,8 +102520,9 @@ msgid "Measure radiation" msgstr "Medir radiación" #: lang/json/item_action_from_json.py lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py #: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py -#: lang/json/talk_topic_from_json.py src/game_inventory.cpp +#: src/game_inventory.cpp msgid "..." msgstr "..." @@ -101901,11 +102584,15 @@ msgid "Well, you know" msgstr "Bueno, ya sabés" #: lang/json/item_action_from_json.py -msgid "Wash clothes" -msgstr "Limpiar ropa" +msgid "Wash soft items" +msgstr "" #: lang/json/item_action_from_json.py -msgid "Wash CBMs" +msgid "Wash hard items" +msgstr "" + +#: lang/json/item_action_from_json.py +msgid "Wash items" msgstr "" #: lang/json/item_action_from_json.py @@ -105572,6 +106259,41 @@ msgstr "¡Amplia variedad de baterías de almacenamiento! ¡Descuentos!" msgid "the name is gone but a slogan remains: 'We'll repair you all the way'" msgstr "el nombre ya no está pero quedó el slogan: 'Te vamos a reparar todo'" +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "EnviroCom OS v2.03 - Basement Access" +msgstr "" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Unlock stairs" +msgstr "Abrir escaleras" + +#. ~ Sign +#: lang/json/mapgen_from_json.py +msgid "Authorized personnel only" +msgstr "" + +#. ~ Sign +#: lang/json/mapgen_from_json.py +msgid " sewage treatment plant" +msgstr "" + +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "EnviroCom OS v2.03" +msgstr "EnviroCom OS v2.03" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Download Sewer Maps" +msgstr "Descargar Mapas de Cloacas" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Divert sample" +msgstr "Desviar muestra" + #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Evac shelter computer" @@ -106187,6 +106909,43 @@ msgid "" "Blocked damage reduced by 50%% of Dexterity." msgstr "" +#. ~ Description for martial art 'Fior Di Battaglia' +#: lang/json/martial_art_from_json.py +msgid "" +"Medieval Europe's martial techniques for fighting with polearms. The " +"\"Flower of Battle\" places great focus on countering one's opponent and " +"knocking them down before landing a killing blow" +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stand Your Ground" +msgstr "" + +#. ~ Description of buff 'Stand Your Ground' for martial art 'Fior Di +#. Battaglia' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You stalwart and will not budge against any threat.\n" +"\n" +"+2 Block attempts, -1.0 Dodge skill, blocked damage reduced by 50%% of Strength." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Tactical Retreat" +msgstr "" + +#. ~ Description of buff 'Tactical Retreat' for martial art 'Fior Di +#. Battaglia' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You moved and nullified the effects of Stand Your Ground!\n" +"\n" +"-2 Block attempts, +1.0 Dodge skill, blocked damaged increased by 50%% of Strength.\n" +"Lasts 1 turn." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Karate" msgstr "Karate" @@ -106678,35 +107437,6 @@ msgstr "" msgid "Perception increases dodging ability, +1 dodges per turn" msgstr "" -#. ~ Description for martial art 'Fior Di Battaglia' -#: lang/json/martial_art_from_json.py -msgid "" -"Medieval Europe's martial techniques for fighting with polearms, great focus" -" is given in countering one's opponent and knocking them down before landing" -" a killing blow" -msgstr "" - -#: lang/json/martial_art_from_json.py -msgid "Stand Your Ground" -msgstr "" - -#. ~ Description of buff 'Stand Your Ground' for martial art 'Fior Di -#. Battaglia' -#: lang/json/martial_art_from_json.py -msgid "" -"+2 blocks -1 dodge, halves your dodge and damage is reduced by your strength" -" when blocking" -msgstr "" - -#: lang/json/martial_art_from_json.py -msgid "You moved" -msgstr "" - -#. ~ Description of buff 'You moved' for martial art 'Fior Di Battaglia' -#: lang/json/martial_art_from_json.py -msgid "Nullifies Stand Your Ground, don't move, stand there and counter!" -msgstr "" - #: lang/json/martial_art_from_json.py msgid "Medieval Swordsmanship" msgstr "Manejo de Espada Medieval" @@ -108772,39 +109502,6 @@ msgstr "¡Muchas gracias por encontrarlo!" msgid "Oh no! My poor puppy..." msgstr "¡Oh no! Mi pobre cachorrito..." -#: lang/json/mission_def_from_json.py -msgid "Find 100 Cigarettes" -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "Come on man, I just need a smoke." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "" -"With all that's been going on, it's been more and more difficult to find a " -"smoke. My stash has been running low for a while now. Think you could help" -" me out here? A few packs is all I need." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "Thanks, it's great to see someone willing to help a guy out." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "" -"Plenty of smokers in towns. Gotta be some left over cigs in some of them " -"houses." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "Got the smokes?" -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "Thanks! I'll be sure to put in a good word for you around the center." -msgstr "" - #: lang/json/mission_def_from_json.py msgid "Break into armory to retrieve family photo" msgstr "" @@ -110156,7 +110853,7 @@ msgid "" msgstr "" #: lang/json/mission_def_from_json.py -msgid "Find 50 3L jars" +msgid "In a Pickle Pt. 2" msgstr "" #: lang/json/mission_def_from_json.py @@ -110185,6 +110882,39 @@ msgid "" "payment." msgstr "" +#: lang/json/mission_def_from_json.py +msgid "Smokes, let's go." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Come on man, I just need a smoke." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"With all that's been going on, it's been more and more difficult to find a " +"smoke. My stash has been running low for a while now. Think you could help" +" me out here? A few packs is all I need." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Thanks, it's great to see someone willing to help a guy out." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Plenty of smokers in towns. Gotta be some left over cigs in some of them " +"houses." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Got the smokes?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Thanks! I'll be sure to put in a good word for you around the center." +msgstr "" + #: lang/json/mission_def_from_json.py msgid "Clear Back Bay" msgstr "Limpiar Plataforma de Atrás" @@ -110301,7 +111031,7 @@ msgid "" msgstr "" #: lang/json/mission_def_from_json.py -msgid "Find 10 solar panels" +msgid "Solar Power" msgstr "" #: lang/json/mission_def_from_json.py @@ -110333,7 +111063,7 @@ msgstr "" " tu ayuda." #: lang/json/mission_def_from_json.py -msgid "Find 100 canning jars" +msgid "In a Pickle" msgstr "" #: lang/json/mission_def_from_json.py @@ -110637,8 +111367,8 @@ msgid "Thank you, I'll do the explaining if anyone else asks about it." msgstr "Gracias, yo voy a explicar todo si alguien pregunta." #: lang/json/mission_def_from_json.py -msgid "Kill ???" -msgstr "Matar ???" +msgid "Secure Trade Route" +msgstr "" #: lang/json/mission_def_from_json.py msgid "" @@ -110670,8 +111400,8 @@ msgid "Great work, wasn't sure what I was sending you after." msgstr "Buen trabajo, no estaba seguro de a qué te estaba mandando. " #: lang/json/mission_def_from_json.py -msgid "Kill Raider Leader" -msgstr "Matar Líder Pirata" +msgid "Assassinate Raider Leader" +msgstr "" #: lang/json/mission_def_from_json.py msgid "" @@ -110812,8 +111542,8 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" -"Remember, do extraction /exactly/ as specified, otherwise the bionic will " -"self-destruct." +"Remember, perform the extraction /exactly/ as specified, otherwise the " +"bionic will self-destruct." msgstr "" #: lang/json/mission_def_from_json.py @@ -110837,6 +111567,37 @@ msgstr "" msgid "You have our thanks and payment." msgstr "" +#: lang/json/mission_def_from_json.py +msgid "Light retrieval" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Our facility once sourced advanced photonic circuitry from a nearby robotics manufacturer. Their building suffered major damage during the portal storms, and collapsed almost entirely. However, preliminary scouting reveals that the basement prototyping lab likely remains intact.\n" +"\n" +"the intercom: We ask you to investigate the ruins, and if possible, retrieve a template for the fabrication of said photonic circuitry." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "We expect your success, mercenary." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Return if you change your mind." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"The scout drone also revealed extensive heat signatures and high " +"concentrations of toxic compounds within the ruins, plan accordingly. We " +"are willing to sell you some protective gear at a discount, if you require " +"it." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Have you retrieved the blueprints?" +msgstr "" + #: lang/json/mission_def_from_json.py msgid "Make 2 Stills" msgstr "Hacer 2 Destiladores" @@ -122735,6 +123496,10 @@ msgstr "casa de azúcar" msgid "sugar house roof" msgstr "" +#: lang/json/overmap_terrain_from_json.py +msgid "rural road" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "farm field" msgstr "sembradío" @@ -124559,8 +125324,16 @@ msgid "parking garage" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "sewage treatment" -msgstr "tratamiento de aguas cloacales" +msgid "sewage treatment plant" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment plant roof" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment plant - underground" +msgstr "" #: lang/json/overmap_terrain_from_json.py msgid "toxic waste dump" @@ -124867,6 +125640,10 @@ msgstr "" msgid "mechanics garage" msgstr "taller mecánico" +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment" +msgstr "tratamiento de aguas cloacales" + #: lang/json/overmap_terrain_from_json.py msgid "mechanic garage" msgstr "taller mecánico" @@ -125877,6 +126654,34 @@ msgstr "" "No estás muy segura de lo que pasó, pero todo se fue a la mierda y la única " "cosa que se te pasa por la cabeza es dónde conseguir una pitada más." +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Pillhead" +msgstr "" + +#. ~ Profession (male Pillhead) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"After an accident in your youth, you got addicted to the opiates treating " +"your pain. With the pharmacies shut down and dealers turned undead, " +"satisfying your fix just got a lot more difficult." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Pillhead" +msgstr "" + +#. ~ Profession (female Pillhead) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"After an accident in your youth, you got addicted to the opiates treating " +"your pain. With the pharmacies shut down and dealers turned undead, " +"satisfying your fix just got a lot more difficult." +msgstr "" + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "K9 Officer" @@ -132475,7 +133280,6 @@ msgid "WEAPON" msgstr "ARMA" #. ~ Crafting recipes subcategory all -#. ~ Crafting recipes subcategory of 'ENCHANTED' category #: lang/json/recipe_category_from_json.py #: lang/json/recipe_category_from_json.py src/crafting_gui.cpp msgid "ALL" @@ -135919,10 +136723,8 @@ msgstr "" "necesitás." #: lang/json/snippet_from_json.py -msgid "Wounds heal over time. Bandages and disinfectant speeds that up." +msgid "Wounds heal over time. Bandages and antiseptic speeds that up." msgstr "" -"Las heridas sanan con el tiempo. Las vendas y el desinfectante aceleran el " -"proceso." #: lang/json/snippet_from_json.py msgid "Don't get grabbed by zombies. Their bites can be infectious." @@ -136855,8 +137657,8 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "" -"If you have extra disinfectant, use it to disinfect your wounds, even if " -"they aren't infected. They will recover faster that way." +"If you have extra antiseptic, use it to disinfect your wounds, even if they " +"aren't infected. They will recover faster that way." msgstr "" #: lang/json/snippet_from_json.py @@ -144022,17 +144824,6 @@ msgstr "" "sus trabajos, su país, incluso su vida... claro que algunos van a recurrir a" " las drogas,\" dijo un experto." -#: lang/json/snippet_from_json.py -msgid "" -"WAR ON DRUGS DEAD: The government has finally reacted to long accumulated " -"evidence that suggests that decriminalized drugs cause fewer health problems" -" and are generally better managed while providing valuable tax revenues." -msgstr "" -"TERMINÓ LA GUERRA CONTRA LAS DROGAS: El gobierno ha reaccionado finalmente a" -" la evidencia acumulada por mucho tiempo que sugiere que las drogas " -"despenalizadas causan menos problemas de salud y son generalmente mejor " -"manejadas a la vez que proveen ganancias a través de los impuestos." - #: lang/json/snippet_from_json.py msgid "" "FEELING BLUE? Try \"Greens\" for Magazines! Your local Supermarket! " @@ -149169,8 +149960,7 @@ msgid "" "Bionics are augmentation packages, right? They come in these installable Compact Bionic Modules or CBMs, and I can use some CBMs - if you examine a CBM, it will tell you if I can use it.\n" " Find a programmable surgical installer or autodoc, position me on the couch, and activate it, and you can install a suitable CBM to me - or if I think I'll do a better job, I'll do. I'll take over installing CBMs into you if I'm better at it.\n" " I can use almost all passive bionics and some active bionics. If I have any active bionics, I'll try to use them sensibly, but if we're in danger, I'm going to activate anything that might give me an edge. I'll use any weapon bionics if they're better than the weapons you gave me, but if you think I should reserve my bionic energy for my defensive and healing bionics, you can tell me how much to reserve. I'll try to keep my bionic energy topped off, but if we're running low on supplies, you can tell me to stop recharging when I'm not full.\n" -" I'll tell you if I'm low on bionic energy and can't recharge, and what fuel I need.\n" -" Sothere are some internal atomic reactor bionics - I can use those, but I can only recharge them with plutonium slurry. That stuff is radioactive, so do us both a favor and don't give me an internal reactor unless you really like glowing in the dark." +" I'll tell you if I'm low on bionic energy and can't recharge, and what fuel I need." msgstr "" #: lang/json/talk_topic_from_json.py @@ -149350,11 +150140,11 @@ msgid "Go back to sleep." msgstr "Volvete a dormir." #: lang/json/talk_topic_from_json.py -msgid " *pshhhttt* I'm reading you boss, over." +msgid "What is it, friend?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "What is it, friend?" +msgid " *pshhhttt* I'm reading you boss, over." msgstr "" #: lang/json/talk_topic_from_json.py @@ -149593,11 +150383,11 @@ msgid "Show me what needs to be done at the camp." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I'm currently ." +msgid "I'm not doing much currently." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I'm not doing much currently." +msgid "I'm currently ." msgstr "" #: lang/json/talk_topic_from_json.py @@ -149654,13 +150444,13 @@ msgid "OK, maybe it'll stop me from freezing in this weather, what's up?" msgstr "OK, así dejo de cagarme de frío un rato. ¿Cómo va?" #: lang/json/talk_topic_from_json.py -msgid "" -"Well, it's the time of day for a quick break surely! How are you holding " -"up?" +msgid "Man it's dark out isn't it? what's up?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Man it's dark out isn't it? what's up?" +msgid "" +"Well, it's the time of day for a quick break surely! How are you holding " +"up?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -149669,14 +150459,14 @@ msgstr "Bueno, me siento un poco enfermo... ¿vos andás bien?" #: lang/json/talk_topic_from_json.py msgid "" -"Definitely, by the way, thanks for helping me so much with my tasks! " -"Anyway, you coping OK, ? " +"OK, let's take a moment, oh, and thanks for helping me with that thing, " +"so... what's up?" msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"OK, let's take a moment, oh, and thanks for helping me with that thing, " -"so... what's up?" +"Definitely, by the way, thanks for helping me so much with my tasks! " +"Anyway, you coping OK, ? " msgstr "" #: lang/json/talk_topic_from_json.py @@ -149752,14 +150542,14 @@ msgstr "Bueno, sin hacer movimientos repentinos..." msgid "Keep your distance!" msgstr "¡Quedate lejos!" -#: lang/json/talk_topic_from_json.py -msgid "" -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "This is my territory, ." msgstr "Este es mi territorio, ." +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Calm down. I'm not going to hurt you." msgstr "Calmate. No te voy a lastimar." @@ -149812,14 +150602,6 @@ msgstr "¿Qué pasa?" msgid "I don't care." msgstr "No me importa." -#: lang/json/talk_topic_from_json.py -msgid "I don't have any jobs for you." -msgstr "No tengo ningún trabajo para vos." - -#: lang/json/talk_topic_from_json.py -msgid "I don't have any more jobs for you." -msgstr "No tengo ningún otro trabajo para vos." - #: lang/json/talk_topic_from_json.py msgid "I have other jobs for you. Want to hear about them?" msgstr "" @@ -149828,13 +150610,21 @@ msgstr "" msgid "I have more jobs for you. Want to hear about them?" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "I just have one job for you. Want to hear about it?" +msgstr "Tengo un trabajo para vos. ¿Querés que te cuente?" + #: lang/json/talk_topic_from_json.py msgid "I have another job for you. Want to hear about it?" msgstr "Tengo otro trabajo para vos. ¿Querés que te cuente?" #: lang/json/talk_topic_from_json.py -msgid "I just have one job for you. Want to hear about it?" -msgstr "Tengo un trabajo para vos. ¿Querés que te cuente?" +msgid "I don't have any more jobs for you." +msgstr "No tengo ningún otro trabajo para vos." + +#: lang/json/talk_topic_from_json.py +msgid "I don't have any jobs for you." +msgstr "No tengo ningún trabajo para vos." #: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py #: src/npctalk.cpp @@ -149846,16 +150636,16 @@ msgid "Never mind, I'm not interested." msgstr "No importa, no estoy interesado." #: lang/json/talk_topic_from_json.py -msgid "You're not working on anything for me now." -msgstr "" +msgid "What about it?" +msgstr "¿Qué te parece?" #: lang/json/talk_topic_from_json.py msgid "Which job?" msgstr "¿Cuál trabajo?" #: lang/json/talk_topic_from_json.py -msgid "What about it?" -msgstr "¿Qué te parece?" +msgid "You're not working on anything for me now." +msgstr "" #: lang/json/talk_topic_from_json.py msgid "I'll do it!" @@ -156450,8 +157240,8 @@ msgid "All right! Let's get going." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "We've done it! We've solved the list!" -msgstr "" +msgid "Have I told you about cardboard, friend? Do you have any?" +msgstr "¿Te conté sobre el cartón, amigo? ¿Tenés un poco?" #: lang/json/talk_topic_from_json.py msgid "" @@ -156459,8 +157249,8 @@ msgid "" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Have I told you about cardboard, friend? Do you have any?" -msgstr "¿Te conté sobre el cartón, amigo? ¿Tenés un poco?" +msgid "We've done it! We've solved the list!" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "About that shopping list of yours..." @@ -160922,6 +161712,10 @@ msgstr "" msgid "What the hell were you testing out there?" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "So, about that protective gear?" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "No. Now leave." msgstr "" @@ -160937,6 +161731,21 @@ msgid "" "Shame about what happened, with the evisceration and all..." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"Given the current context, we are willing to sell you a set of our protective gear: gas mask, suit and gear, at a considerable discount. We will sell it for two of our coins.\n" +"\n" +"the intercom: Hmm wait, we might not have your size..." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "[ 2 Hub 01 Gold Coins ] Deal!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I have to give it a thought." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Just leave." msgstr "" @@ -162756,6 +163565,86 @@ msgstr "" msgid " delivers a perfect riposte to %s" msgstr "" +#: lang/json/technique_from_json.py +msgid "Displace and Hook" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You parry and hook %s down" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " parries and hooks %s down" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "High Round Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You swing high and strike at %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " swings high and strikes %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "High Round Feint" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You fake a high round strike at %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " feints at %s" +msgstr " le amaga al %s" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab you, but you push away!" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab , but they push away!" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Hook and Drag" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You hook and drag %s down" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " hooks and drags %s down" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Colpo di Grazia" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You swing down hard and execute %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " swings down hard and executes %s" +msgstr "" + #: lang/json/technique_from_json.py msgid "quick punch" msgstr "piña rápida" @@ -162933,11 +163822,6 @@ msgstr "amagar a" msgid "You feint at %s" msgstr "Le amagás al %s" -#: lang/json/technique_from_json.py -#, python-format -msgid " feints at %s" -msgstr " le amaga al %s" - #: lang/json/technique_from_json.py #, python-format msgid "You jab %s" @@ -163386,57 +164270,6 @@ msgstr "" msgid " receives %s's attack, and counters" msgstr "" -#: lang/json/technique_from_json.py -msgid "Displace and Hook" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You parry %s attack and hook them down" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid " parries %s attack and hooks them down" -msgstr "" - -#: lang/json/technique_from_json.py -msgid "High Round Strike" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You swing high and strike at %s" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid " swings high and strikes %s" -msgstr "" - -#: lang/json/technique_from_json.py -msgid "High Round Feint" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You fake a high round strike at %s" -msgstr "" - -#: lang/json/technique_from_json.py -msgid "High Round Stab" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You quickly stab %s" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid " quickly stabs %s" -msgstr "" - #: lang/json/technique_from_json.py msgid "grab and pommel strike" msgstr "" @@ -165270,6 +166103,16 @@ msgstr "" msgid "SMASH!" msgstr "¡SMASH!" +#: lang/json/terrain_from_json.py +msgid "metal floor" +msgstr "suelo de metal" + +#. ~ Description for metal floor +#: lang/json/terrain_from_json.py +msgid "" +"High-quality and tough checkered flooring to reduce risk of slips and falls." +msgstr "" + #: lang/json/terrain_from_json.py msgid "linoleum tile" msgstr "baldosa de linóleo" @@ -165383,10 +166226,6 @@ msgstr "" "terminado. Al piso todavía no lo emparejaron y el techo todavía no está " "completamente lleno." -#: lang/json/terrain_from_json.py -msgid "metal floor" -msgstr "suelo de metal" - #. ~ Description for metal floor #: lang/json/terrain_from_json.py msgid "" @@ -171246,6 +172085,16 @@ msgstr "ariete de quitina" msgid "biosilicfied chitin ram" msgstr "ariete de quitina biosilicificada" +#: lang/json/vehicle_part_from_json.py +msgid "tied mattress" +msgstr "" + +#. ~ Description for tied mattress +#: lang/json/vehicle_part_from_json.py +msgid "" +"A mattress, strapped onto the vehicle. It could serve to blunt any impact." +msgstr "" + #. ~ Description for shredder #: lang/json/vehicle_part_from_json.py msgid "" @@ -175862,6 +176711,10 @@ msgstr "" msgid "Stop %s?" msgstr "" +#: src/activity_type.h +msgid "THIS IS A BUG" +msgstr "" + #: src/addiction.cpp msgid "You need some nicotine." msgstr "Necesitás nicotina." @@ -177436,10 +178289,6 @@ msgstr "%1$s de %2$s" msgid "artifact file" msgstr "archivo de artefactos" -#: src/auto_pickup.cpp -msgid " AUTO PICKUP MANAGER " -msgstr "CONFIGURACIÓN DE AUTO-AGARRAR" - #: src/auto_pickup.cpp src/game.cpp src/safemode_ui.cpp msgid "dd" msgstr "gregar" @@ -177488,14 +178337,6 @@ msgstr "Reglas" msgid "I/E" msgstr "I/E" -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "[]" -msgstr "[]" - -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "[]" -msgstr "[]" - #: src/auto_pickup.cpp msgid "Auto pickup enabled:" msgstr "Auto-agarrar activado:" @@ -177512,10 +178353,6 @@ msgstr "Sí" msgid "witch" msgstr "-Cambiar" -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "Please load a character first to use this page!" -msgstr "¡Primero cargá un personaje antes de usar esto!" - #: src/auto_pickup.cpp src/safemode_ui.cpp msgid "" msgstr "" @@ -177565,6 +178402,18 @@ msgstr "Regla de Agarrar:" msgid "Save changes?" msgstr "¿Guardar cambios?" +#: src/auto_pickup.cpp +msgid " AUTO PICKUP MANAGER " +msgstr "CONFIGURACIÓN DE AUTO-AGARRAR" + +#: src/auto_pickup.cpp src/safemode_ui.cpp +msgid "[]" +msgstr "[]" + +#: src/auto_pickup.cpp src/safemode_ui.cpp +msgid "[]" +msgstr "[]" + #: src/auto_pickup.cpp #, c-format msgid "%1$d item matches: %2$s" @@ -177585,6 +178434,11 @@ msgstr "" msgid "autopickup configuration" msgstr "configuración de autoagarrar" +#: src/auto_pickup.cpp +#, c-format +msgid "Pickup rules for %s" +msgstr "Reglas de agarrar para %s" + #: src/avatar.cpp src/iuse.cpp msgid "He" msgstr "Él" @@ -178836,7 +179690,37 @@ msgstr "Retraés tu %s." #: src/bionics.cpp #, c-format -msgid "%s withdraws %s %s." +msgid " withdraws %s %s." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Your %s does not have enought fuel to start." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "'s %s does not have enought fuel to start." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Your %s turns off to not waste fuel." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "'s %s turns off to not waste fuel." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Your %s runs out of fuel and turn off." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "'s %s runs out of fuel and turn off." msgstr "" #: src/bionics.cpp @@ -179220,6 +180104,10 @@ msgid "" "enjoy the operation." msgstr "" +#: src/bionics_ui.cpp +msgid "Available Fuel: " +msgstr "" + #: src/bionics_ui.cpp #, c-format msgid "" @@ -182466,6 +183354,20 @@ msgid_plural " digests a %s and recharges %d points of energy." msgstr[0] " digiere un/a %s y recarga %d punto de energía." msgstr[1] " digiere un/a %s y recarga %d puntos de energía." +#: src/consumption.cpp +#, c-format +msgid "You load %i charge of %s in your %s." +msgid_plural "You load %i charges of %s in your %s." +msgstr[0] "" +msgstr[1] "" + +#: src/consumption.cpp +#, c-format +msgid " load %i charge of %s in their %s." +msgid_plural " load %i charges of %s in their %s." +msgstr[0] "" +msgstr[1] "" + #: src/craft_command.cpp src/crafting.cpp src/veh_interact.cpp msgid " (nearby)" msgstr "(cercano)" @@ -182551,8 +183453,10 @@ msgstr "¡Ya no podés fabricar eso!" #: src/crafting.cpp #, c-format -msgid "You don't have anything to store %s in!" -msgstr "¡No tenés nada para poder guardar el/a %s!" +msgid "" +"You don't have anything in which to store %s and may have to pour it out or " +"consume it as soon as it is prepared! Proceed?" +msgstr "" #: src/crafting.cpp src/pickup.cpp #, c-format @@ -183149,6 +184053,10 @@ msgstr "Buen golpe!" msgid "Grazing hit." msgstr "Rozado." +#: src/creature.cpp +msgid "You feel poison coursing through your body!" +msgstr "" + #: src/creature.cpp msgid "The shot misses!" msgstr "¡Fallaste el disparo!" @@ -184723,21 +185631,21 @@ msgid "You can't see the terrain here." msgstr "No podés ver el terreno acá." #: src/descriptions.cpp +#, c-format msgid "" "\n" -"Sign: ???" +"Sign: %s" msgstr "" "\n" -"Firmado: ???" +"Firma: %s" #: src/descriptions.cpp -#, c-format msgid "" "\n" -"Sign: %s" +"Sign: ???" msgstr "" "\n" -"Firma: %s" +"Firmado: ???" #: src/descriptions.cpp src/iexamine.cpp #, c-format @@ -187955,20 +188863,6 @@ msgstr "información de uistate" msgid "Failed to save game data" msgstr "No se pudo guardar la información del juego" -#: src/game.cpp -msgid "You haven't killed any monsters yet!" -msgstr "¡No mataste a ningún monstruo!" - -#: src/game.cpp -#, c-format -msgid "KILL COUNT: %d" -msgstr "TOTAL DE MUERTES: %d" - -#: src/game.cpp -#, c-format -msgid "Experience: %d (%d points available)" -msgstr "" - #: src/game.cpp msgid " You are forgotten among the billions lost in the cataclysm..." msgstr "" @@ -190027,6 +190921,11 @@ msgstr "No podés tomar líquidos derramados" msgid "You're fully charged" msgstr "Ya estás completamente cargado/a" +#: src/game_inventory.cpp +#, c-format +msgid "No space to store more %s" +msgstr "" + #: src/game_inventory.cpp msgid "soon!" msgstr "pronto!" @@ -190059,6 +190958,18 @@ msgstr "old" msgid "rotten" msgstr "podrido" +#: src/game_inventory.cpp src/panels.cpp +msgid "Food :" +msgstr "" + +#: src/game_inventory.cpp src/panels.cpp +msgid "Drink:" +msgstr "" + +#: src/game_inventory.cpp src/panels.cpp +msgid "Pain :" +msgstr "" + #: src/game_inventory.cpp msgid "Consume item" msgstr "Consumir objeto" @@ -192851,6 +193762,14 @@ msgstr "Elegir biónico instalado para desinstalar." msgid "ERROR NO SPACE AVAILABLE. Operation impossible. Exiting." msgstr "" +#: src/iexamine.cpp +msgid "Personality_Override" +msgstr "" + +#: src/iexamine.cpp +msgid "C0RR#PTED?D#TA" +msgstr "" + #: src/iexamine.cpp msgid "Choose bionic to uninstall" msgstr "Elegir biónico para desinstalar" @@ -194134,8 +195053,8 @@ msgid "Capacity: " msgstr "Capacidad:" #: src/item.cpp -msgid " per round" -msgstr " por bala" +msgid " moves per round" +msgstr "" #: src/item.cpp msgid "Reload time: " @@ -194234,8 +195153,8 @@ msgid "" msgstr "" #: src/item.cpp -msgid " seconds" -msgstr " segundos" +msgid " moves " +msgstr "" #: src/item.cpp msgid "Time to reach aim level: " @@ -194269,10 +195188,6 @@ msgstr "Retroceso efectivo:" msgid "Recommended strength (burst): " msgstr "Fuerza recomendada (ráfaga):" -#: src/item.cpp -msgid " seconds per round" -msgstr " segundos por bala" - #: src/item.cpp msgid "Fire modes: " msgstr "Modo de disparo: " @@ -194545,6 +195460,14 @@ msgstr "" "La protección está disminuida por el daño y tal vez puedas " "mejorarla reparándola." +#: src/item.cpp +msgid "Weight capacity modifier: " +msgstr "" + +#: src/item.cpp +msgid "Weight capacity bonus: " +msgstr "" + #: src/item.cpp msgid "Just for fun." msgstr "Solo para divertirse." @@ -195004,6 +195927,14 @@ msgstr "" msgid "This bionic is installed in the following body part(s):" msgstr "Este biónico se instala en las siguientes partes del cuerpo:" +#: src/item.cpp +msgid "Encumbrance: " +msgstr "" + +#: src/item.cpp +msgid "Environmental Protection: " +msgstr "" + #: src/item.cpp msgid "* This weapon needs two free hands to fire." msgstr "" @@ -198352,6 +199283,11 @@ msgstr "" msgid " illuminated by %s" msgstr "" +#: src/iuse.cpp +#, c-format +msgid " in %s cloud" +msgstr "" + #: src/iuse.cpp #, c-format msgid " with graffiti \"%s\"" @@ -199602,6 +200538,10 @@ msgstr "Necesitás alguna fuente de energía para tu %s (un UPS común, sirve)." msgid "There is also a certain bionic that helps with this kind of armor." msgstr "También existe un biónico que te ayuda con esta clase de armadura." +#: src/iuse_actor.cpp +msgid "No lock to pick." +msgstr "" + #: src/iuse_actor.cpp msgid "Use your lockpick where?" msgstr "¿Dónde querés usar tu ganzúa?" @@ -201720,6 +202660,20 @@ msgstr "<-> anterior" msgid "ndo move" msgstr " deshacer movimiento" +#: src/kill_tracker.cpp +msgid "You haven't killed any monsters yet!" +msgstr "¡No mataste a ningún monstruo!" + +#: src/kill_tracker.cpp +#, c-format +msgid "KILL COUNT: %d" +msgstr "TOTAL DE MUERTES: %d" + +#: src/kill_tracker.cpp +#, c-format +msgid "Experience: %d (%d points available)" +msgstr "" + #. ~ abbreviated direction names and long direction names #: src/line.cpp msgid "N " @@ -201989,6 +202943,16 @@ msgstr "" msgid "an explosion" msgstr "" +#: src/magic.cpp +#, c-format +msgid "%s and %s" +msgstr "%s y %s" + +#: src/magic.cpp src/player.cpp +#, c-format +msgid "%s, %s" +msgstr "%s, %s" + #: src/magic.cpp #, c-format msgid "" @@ -202025,6 +202989,11 @@ msgstr "" msgid "Popup Distractions" msgstr "" +#: src/magic.cpp +#, c-format +msgid "%d moves" +msgstr "" + #: src/magic.cpp msgid "requires concentration" msgstr "" @@ -202544,7 +203513,7 @@ msgstr "" #: src/map.cpp #, c-format -msgid "The autoclave in the %s has finished washing." +msgid "The autoclave in the %s has finished its cycle." msgstr "" #: src/map.cpp @@ -202810,22 +203779,6 @@ msgstr "Abrir Cámaras" msgid "Missile Controls" msgstr "Controles de Misiles" -#: src/mapgen.cpp -msgid "EnviroCom OS v2.03" -msgstr "EnviroCom OS v2.03" - -#: src/mapgen.cpp -msgid "Unlock stairs" -msgstr "Abrir escaleras" - -#: src/mapgen.cpp -msgid "Download Sewer Maps" -msgstr "Descargar Mapas de Cloacas" - -#: src/mapgen.cpp -msgid "Divert sample" -msgstr "Desviar muestra" - #: src/mapgen.cpp msgid "NEPowerOS" msgstr "NEPowerOS" @@ -205493,6 +206446,11 @@ msgstr "¡Los brazos de %s se lanzan hacia , pero los esquivan!" msgid "The %1$s's arms fly out and pull and grab %2$s!" msgstr "¡Los brazos de %1$s son lanzados y tiran y agarran %2$s!" +#: src/monattack.cpp +#, c-format +msgid "The %1$s reaches out and pulls %2$s!" +msgstr "" + #: src/monattack.cpp #, c-format msgid "The %s gropes at you, but you dodge!" @@ -206241,6 +207199,19 @@ msgstr "¡Vacíe sus manos y mantenga su posición, ciudadano!" msgid "fzzzzzt" msgstr "fzzzzzt" +#: src/monattack.cpp +msgid "The floor trembles underneath your feet." +msgstr "" + +#: src/monattack.cpp +msgid "a deafening roar!" +msgstr "" + +#: src/monattack.cpp +#, c-format +msgid "A %s struggles to pull itself free from the %s!" +msgstr "" + #: src/monattack.cpp #, c-format msgid "The %1$s mechanically grabs at %2$s!" @@ -208927,6 +209898,11 @@ msgstr "%1$s deja un %2$s." msgid "Hold on, I want to pulp that %s." msgstr "Esperá, quiero destrozar ese %s." +#: src/npcmove.cpp +#, c-format +msgid "%s completed the assigned task." +msgstr "" + #: src/npcmove.cpp #, c-format msgid "%1$s throws a %2$s." @@ -209429,6 +210405,10 @@ msgstr "puños" msgid "BADAMMO" msgstr "MALMUNICIÓN" +#: src/npctalk.cpp +msgid "doing this and that" +msgstr "" + #: src/npctalk.cpp msgctxt "punctuation" msgid "." @@ -209532,6 +210512,11 @@ msgstr "" msgid "%1$s doesn't have a %2$s!" msgstr "" +#: src/npctalk.cpp +#, c-format +msgid "%1$s gives you %2$s." +msgstr "" + #: src/npctalk.cpp msgid "I don't trust you enough to eat THIS..." msgstr " no confío lo suficiente en vos como para comer ESTO..." @@ -209786,11 +210771,6 @@ msgstr "Pago:" msgid "Select a follower" msgstr "Elegir un seguidor" -#: src/npctalk_funcs.cpp -#, c-format -msgid "Pickup rules for %s" -msgstr "Reglas de agarrar para %s" - #: src/npctrade.cpp #, c-format msgid "Volume: %s %s, Weight: %.1f %s" @@ -212737,10 +213717,6 @@ msgstr "" msgid "Freezing!" msgstr "" -#: src/panels.cpp -msgid "Pain " -msgstr "" - #: src/panels.cpp msgid "Bad" msgstr "" @@ -212908,22 +213884,10 @@ msgstr "" msgid "Style:" msgstr "" -#: src/panels.cpp -msgid "Food :" -msgstr "" - -#: src/panels.cpp -msgid "Drink:" -msgstr "" - #: src/panels.cpp msgid "Rest :" msgstr "" -#: src/panels.cpp -msgid "Pain :" -msgstr "" - #: src/panels.cpp msgid "Heat :" msgstr "" @@ -214694,11 +215658,6 @@ msgstr "%s (%d)" msgid "%s with %s (%d)" msgstr "%s con %s (%d)" -#: src/player.cpp -#, c-format -msgid "%s, %s" -msgstr "%s, %s" - #: src/player.cpp msgid "| Location " msgstr "| Lugar " @@ -215459,6 +216418,10 @@ msgstr "" msgid "Peckish" msgstr "" +#: src/player.cpp +msgid "Pain " +msgstr "" + #: src/player_activity.cpp msgid "You pause for a moment to catch your breath." msgstr "" @@ -216936,6 +217899,10 @@ msgstr "B/W" msgid "Safe Mode enabled:" msgstr "Modo Seguro activado:" +#: src/safemode_ui.cpp +msgid "Please load a character first to use this page!" +msgstr "¡Primero cargá un personaje antes de usar esto!" + #: src/safemode_ui.cpp msgid "Safe Mode manager currently inactive." msgstr "La Configuración de Modo Seguro ahora está desactivada." @@ -219774,6 +220741,10 @@ msgid "" "door." msgstr "" +#: src/vehicle_use.cpp +msgid "The autoclave is empty, there's no point in starting it." +msgstr "" + #: src/vehicle_use.cpp #, c-format msgid "" @@ -219802,6 +220773,10 @@ msgstr "" "Apagás el lavarropas antes de que termine el programa de kavado, y abrís la " "tapa." +#: src/vehicle_use.cpp +msgid "The washing machine is empty, there's no point in starting it." +msgstr "" + #: src/vehicle_use.cpp #, c-format msgid "" @@ -219845,6 +220820,10 @@ msgid "" "lid." msgstr "" +#: src/vehicle_use.cpp +msgid "The dishwasher is empty, there's no point in starting it." +msgstr "" + #: src/vehicle_use.cpp #, c-format msgid "" diff --git a/lang/po/es_ES.po b/lang/po/es_ES.po index 6cd6d9ce39eba..d130fbff23820 100644 --- a/lang/po/es_ES.po +++ b/lang/po/es_ES.po @@ -5,16 +5,16 @@ # keno xite , 2019 # Emma Forner, 2019 # lokatronao , 2019 +# Toni López , 2019 # Vlasov Vitaly , 2019 # Brett Dong , 2019 -# Toni López , 2019 # Miguel de Dios Matias , 2019 # msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.D\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-16 17:39+0800\n" +"POT-Creation-Date: 2019-08-23 23:11+0800\n" "PO-Revision-Date: 2018-04-26 14:47+0000\n" "Last-Translator: Miguel de Dios Matias , 2019\n" "Language-Team: Spanish (Spain) (https://www.transifex.com/cataclysm-dda-translators/teams/2217/es_ES/)\n" @@ -426,26 +426,6 @@ msgstr "" "Son pedazos de cobre. Se puede usar para fabricar algo, como unos cartuchos " "de escopeta improvisados." -#: lang/json/AMMO_from_json.py -msgid "solder" -msgstr "estaño" - -#. ~ Description for solder -#: lang/json/AMMO_from_json.py -msgid "" -"A small spool of solder, able to be used in ammunition and electronics." -msgstr "" -"Un rollito de estaño, puede ser usado para municiones o en electrónica." - -#: lang/json/AMMO_from_json.py -msgid "tin" -msgstr "latas" - -#. ~ Description for tin -#: lang/json/AMMO_from_json.py -msgid "Tin and pewter scraps. Usable in making ammo." -msgstr "Son pedazos de estaño y peltre. Útiles para hacer munición." - #: lang/json/AMMO_from_json.py msgid "medical tape" msgstr "cinta médica" @@ -464,6 +444,34 @@ msgstr "cohete PG-7VL de 93mm" msgid "93mm single-stage high-explosive ammunition for the RPG-7." msgstr "Es munición 93mm monoetapa de alta explosividad para el RPG-7." +#: lang/json/AMMO_from_json.py +msgid "PG-7VR 64mm/105mm rocket" +msgstr "" + +#. ~ Description for PG-7VR 64mm/105mm rocket +#: lang/json/AMMO_from_json.py +msgid "64mm/105mm high-explosive tandem ammunition for the RPG-7." +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid "TBG-7V 105mm rocket" +msgstr "" + +#. ~ Description for TBG-7V 105mm rocket +#: lang/json/AMMO_from_json.py +msgid "105mm thermobaric ammunition for the RPG-7." +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid "OG-7V 40mm rocket" +msgstr "" + +#. ~ Description for OG-7V 40mm rocket +#: lang/json/AMMO_from_json.py +msgid "" +"40mm high-explosive fragmentation antipersonnel ammunition for the RPG-7." +msgstr "" + #: lang/json/AMMO_from_json.py msgid "M235 66mm TPA rocket" msgstr "cohete M235 TPA de 66mm" @@ -1933,7 +1941,7 @@ msgstr "" #: lang/json/AMMO_from_json.py msgid "throwing stick" -msgstr "" +msgstr "palo arrojadizo" #. ~ Description for throwing stick #: lang/json/AMMO_from_json.py @@ -2418,21 +2426,19 @@ msgstr "" #. ~ Description for .300 AAC Blackout #: lang/json/AMMO_from_json.py msgid "" -".300 AAC Blackout is an intermediate cartridge that achieves ballistics " -"similar to the 7.62x39 but allows use on the AR-15 platform. The round is " -"necked-up from the 5.56mm NATO, but feeds from a STANAG magazine. It " -"requires a specific barrel, so will not work in a standard M4 or similar " -"carbine. This loading is supersonic." +"A .300 AAC Blackout round with a 125gr open tip match bullet. 300 BLK is an" +" intermediate cartridge necked up from 5.56x45mm, designed to achieve " +"similar ballistics to 7.62x39mm. It is compatible with standard AR-15 lower" +" receivers and will feed from STANAG magazines." msgstr "" #. ~ Description for .300 AAC Blackout #: lang/json/AMMO_from_json.py msgid "" -".300 AAC Blackout is an intermediate cartridge that achieves ballistics " -"similar to the 7.62x39 but allows use on the AR-15 platform. The round is " -"necked-up from the 5.56mm NATO, but feeds from a STANAG magazine. It " -"requires a specific barrel, so will not work in a standard M4 or similar " -"carbine. This loading is subsonic." +"A subsonic .300 AAC Blackout round with a 220gr open tip match bullet. 300 " +"BLK is an intermediate cartridge necked up from 5.56x45mm, designed to " +"achieve similar ballistics to 7.62x39mm. It is compatible with standard " +"AR-15 lower receivers and will feed from STANAG magazines." msgstr "" #: lang/json/AMMO_from_json.py @@ -3932,6 +3938,17 @@ msgid "" " tube. Designed to be highly effective against vehicles and structures." msgstr "" +#: lang/json/AMMO_from_json.py +msgid "paralyzing barb" +msgstr "" + +#. ~ Description for paralyzing barb +#: lang/json/AMMO_from_json.py +msgid "" +"Tiny droplets of venom trickle out of the sponge-like tissue of this sharp " +"barb." +msgstr "" + #: lang/json/AMMO_from_json.py msgid "sprayable toxic gas" msgstr "gas tóxico rociable" @@ -4531,6 +4548,28 @@ msgid "" "making doors." msgstr "" +#: lang/json/AMMO_from_json.py +msgid "tin powder" +msgstr "" + +#. ~ Description for tin powder +#: lang/json/AMMO_from_json.py +msgid "" +"A fine gray powder composed of tin, usable for making solder and lining " +"containers to prevent corrosion." +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid "solder" +msgstr "estaño" + +#. ~ Description for solder +#: lang/json/AMMO_from_json.py +msgid "" +"A small spool of solder, able to be used in ammunition and electronics." +msgstr "" +"Un rollito de estaño, puede ser usado para municiones o en electrónica." + #: lang/json/AMMO_from_json.py msgid "incendiary" msgid_plural "incendiaries" @@ -6303,45 +6342,6 @@ msgstr[1] "pantalones cortos de baloncesto" msgid "A pair of basketball shorts. Comfortable and light." msgstr "Un par de pantalones cortos de baloncesto. Cómodos y livianos." -#: lang/json/ARMOR_from_json.py -msgid "backpack" -msgid_plural "backpacks" -msgstr[0] "mochila" -msgstr[1] "mochilas" - -#. ~ Description for backpack -#: lang/json/ARMOR_from_json.py -msgid "A small backpack. Good storage for a little encumbrance." -msgstr "" -"Es una mochila pequeña. Buen almacenamiento a cambio de una ligera " -"incomodidad." - -#: lang/json/ARMOR_from_json.py -msgid "giant novelty backpack" -msgid_plural "giant novelty backpacks" -msgstr[0] "mochila innovadora gigante" -msgstr[1] "mochilas innovadoras gigantes " - -#. ~ Description for giant novelty backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A huge fabric backpack made mostly as a joke before the cataclysm. Now, " -"it's still rather silly, but it can store a lot of stuff." -msgstr "" -"Una gran mochila de tela fabricada como una broma antes del cataclismo. " -"Ahora sigue siendo algo estúpida, pero puede cargar con bastantes cosas." - -#: lang/json/ARMOR_from_json.py -msgid "leather backpack" -msgid_plural "leather backpacks" -msgstr[0] "mochila de cuero" -msgstr[1] "mochilas de cuero" - -#. ~ Description for leather backpack -#: lang/json/ARMOR_from_json.py -msgid "A small leather backpack. Good storage for a little encumbrance." -msgstr "Es una mochila pequeña de cuero. Buena capacidad y poca incomodidad." - #: lang/json/ARMOR_from_json.py msgid "balaclava" msgid_plural "balaclavas" @@ -6365,8 +6365,8 @@ msgstr[1] "tahalís" #. ~ Use action holster_msg for scabbard. #. ~ Use action holster_msg for sheath. #. ~ Use action holster_msg for survivor belt. -#. ~ Use action holster_msg for hiking backpack. #. ~ Use action holster_msg for survivor utility belt. +#. ~ Use action holster_msg for hiking backpack. #. ~ Use action holster_msg for pair of boots. #. ~ Use action holster_msg for pair of bone armor boots. #. ~ Use action holster_msg for pair of turnout boots. @@ -6391,7 +6391,8 @@ msgstr[1] "tahalís" #. ~ Use action holster_msg for pair of rollerblades. #. ~ Use action holster_msg for pair of rollerskates. #. ~ Use action holster_msg for C.R.I.T web belt. -#: lang/json/ARMOR_from_json.py +#. ~ Use action holster_msg for hollow cane. +#: lang/json/ARMOR_from_json.py lang/json/GENERIC_from_json.py #, no-python-format msgid "You sheath your %s" msgstr "Enfundas tu %s." @@ -6399,7 +6400,9 @@ msgstr "Enfundas tu %s." #. ~ Use action holster_prompt for baldric. #. ~ Use action holster_prompt for back scabbard. #. ~ Use action holster_prompt for scabbard. -#: lang/json/ARMOR_from_json.py +#. ~ Use action holster_prompt for hollow cane. +#: lang/json/ARMOR_from_json.py lang/json/ARMOR_from_json.py +#: lang/json/GENERIC_from_json.py msgid "Sheath sword" msgstr "Enfundar espada" @@ -6994,6 +6997,9 @@ msgid "" " other. The lack of fingers makes them less cumbersome and allows them to " "be used with gloves." msgstr "" +"Son mangas de cota de malla. Cada manga tiene correas para conectarlas entre" +" sí. No cubren tus manos así que no son muy incómodas y te permiten usar " +"guantes." #: lang/json/ARMOR_from_json.py msgid "chainmail coif" @@ -7429,17 +7435,6 @@ msgstr "" "bastante incómodo de usar y tiene poca capacidad de almacenamiento, pero es " "muy calentito." -#: lang/json/ARMOR_from_json.py -msgid "dive bag" -msgid_plural "dive bags" -msgstr[0] "bolsa de buceo" -msgstr[1] "bolsas de buceo" - -#. ~ Description for dive bag -#: lang/json/ARMOR_from_json.py -msgid "A lightweight mesh backpack, commonly worn by swimmers and divers." -msgstr "Una bolsa de red liviana, muy usada por los nadadores y los buzos." - #: lang/json/ARMOR_from_json.py msgid "down-filled blanket" msgid_plural "down-filled blankets" @@ -7523,20 +7518,6 @@ msgstr[1] "vestidos de boda" msgid "A beautiful white wedding dress. What good will it be now?" msgstr "Un vestido de boda blanco y hermoso. ¿Para qué puede servir ahora?" -#: lang/json/ARMOR_from_json.py -msgid "duffel bag" -msgid_plural "duffel bags" -msgstr[0] "bolso de viaje" -msgstr[1] "bolsos de viaje" - -#. ~ Description for duffel bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A huge duffel bag. Provides plenty of storage, but is severely encumbering." -msgstr "" -"Un gran bolso de viaje. Tiene mucha capacidad de almacenamiento pero es muy " -"incómodo." - #: lang/json/ARMOR_from_json.py msgid "tactical dump pouch" msgid_plural "tactical dump pouches" @@ -9481,19 +9462,6 @@ msgid "" "off dramatically before fighting any foes!" msgstr "" -#: lang/json/ARMOR_from_json.py -msgid "jerrypack" -msgid_plural "jerrypacks" -msgstr[0] "bidón-chila" -msgstr[1] "bidón-chilas" - -#. ~ Description for jerrypack -#: lang/json/ARMOR_from_json.py -msgid "A jerrycan modified to be worn in a similar manner to a backpack." -msgstr "" -"Es un bidón modificado para poder ser llevado en la espalda, como una " -"mochila." - #: lang/json/ARMOR_from_json.py msgid "sports jersey" msgid_plural "sports jerseys" @@ -10403,30 +10371,6 @@ msgstr "" "Una cinta blanca con volados para usar en la cabeza. Parte de la ropa de " "sirvienta francesa." -#: lang/json/ARMOR_from_json.py -msgid "makeshift knapsack" -msgid_plural "makeshift knapsacks" -msgstr[0] "alforja improvisada" -msgstr[1] "alforjas improvisadas" - -#. ~ Description for makeshift knapsack -#: lang/json/ARMOR_from_json.py -msgid "" -"A pair of pants with the bottom ends tied with string, and then passed " -"through the belt loops so the knapsack can be carried on the back." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "makeshift sling" -msgid_plural "makeshift slings" -msgstr[0] "cabestrillo improvisado" -msgstr[1] "cabestrillos improvisados" - -#. ~ Description for makeshift sling -#: lang/json/ARMOR_from_json.py -msgid "A large sheet tied into a crude, over-the-shoulder sling." -msgstr "Es un pedazo de tela atado a un cabestrillo." - #: lang/json/ARMOR_from_json.py msgid "ballistic mask" msgid_plural "ballistic masks" @@ -10498,19 +10442,6 @@ msgstr "" "Usualmente la utilizan los manifestantes u otros luchadores por los derechos" " sociales que quieren cubrir su neumáticos." -#: lang/json/ARMOR_from_json.py -msgid "messenger bag" -msgid_plural "messenger bags" -msgstr[0] "bolso de cartero" -msgstr[1] "bolsos de cartero" - -#. ~ Description for messenger bag -#: lang/json/ARMOR_from_json.py -msgid "Light and easy to wear, but doesn't offer much storage." -msgstr "" -"Es liviano y fácil de llevar pero no tiene mucha capacidad de " -"almacenamiento." - #: lang/json/ARMOR_from_json.py msgid "pair of mittens" msgid_plural "pairs of mittens" @@ -10522,24 +10453,6 @@ msgstr[1] "pares de manoplas" msgid "A pair of warm mittens. They are extremely cumbersome." msgstr "Un par de manoplas abrigadas. Son extremadamente incómodas." -#: lang/json/ARMOR_from_json.py -msgid "MOLLE pack" -msgid_plural "MOLLE packs" -msgstr[0] "mochila MOLLE" -msgstr[1] "mochilas MOLLE" - -#. ~ Description for MOLLE pack -#: lang/json/ARMOR_from_json.py -msgid "" -"The Modular Lightweight Load-carrying Equipment is an advanced military " -"backpack. Covered with pockets and straps, it strikes a fine balance " -"between storage space and encumbrance." -msgstr "" -"Es una mochila militar. Su nombre viene del acrónimo en inglés \"Modular " -"Lightweight Load-carrying Equipment\". Está cubierta de bolsillos y bolsas. " -"Tiene un equilibrio perfecto entre la capacidad de almacenamiento y su " -"incomodidad." - #: lang/json/ARMOR_from_json.py msgid "motorcycle armor" msgid_plural "motorcycle armors" @@ -11015,19 +10928,6 @@ msgstr "" "Es un casco que en realidad es una olla para sopa. No protege mucho que " "digamos, pero es mejor que nada." -#: lang/json/ARMOR_from_json.py -msgid "purse" -msgid_plural "purses" -msgstr[0] "monedero" -msgstr[1] "monederos" - -#. ~ Description for purse -#: lang/json/ARMOR_from_json.py -msgid "A bit cumbersome to wear, but provides some storage." -msgstr "" -"Aunque tiene buena capacidad de almacenamiento, es un poco incómodo de " -"llevar." - #: lang/json/ARMOR_from_json.py msgid "quiver" msgid_plural "quivers" @@ -11120,33 +11020,6 @@ msgstr "" "Es una prenda externa suelta, con mangas y una misteriosa cantidad de " "bolsillos ocultos." -#: lang/json/ARMOR_from_json.py -msgid "military rucksack" -msgid_plural "military rucksacks" -msgstr[0] "mochilón militar" -msgstr[1] "mochilones militares" - -#. ~ Description for military rucksack -#: lang/json/ARMOR_from_json.py -msgid "A huge military rucksack, provides a lot of storage." -msgstr "" -"Es una mochila militar enorme. Tiene mucha capacidad de almacenamiento." - -#: lang/json/ARMOR_from_json.py -msgid "runner pack" -msgid_plural "runner packs" -msgstr[0] "mochila de footing" -msgstr[1] "mochilas de footing" - -#. ~ Description for runner pack -#: lang/json/ARMOR_from_json.py -msgid "" -"The obvious choice for outdoor athletes, this ergonomic backpack is light " -"and easy to wear, ensuring comfort when carrying heavy and bulky items." -msgstr "" -"La elección lógica para los atletas, esta mochila ergonómica es ligera y " -"fácil de llevar, pudiendo transportar objetos pesados cómodamente." - #: lang/json/ARMOR_from_json.py msgid "scabbard" msgid_plural "scabbards" @@ -11560,22 +11433,6 @@ msgstr[1] "túnicas sin mangas" msgid "A sleeveless cloth garment that covers the torso and legs." msgstr "Una prenda de tela sin mangas que cubre el torso y las piernas." -#: lang/json/ARMOR_from_json.py -msgid "sling pack" -msgid_plural "sling packs" -msgstr[0] "mochila cruzada" -msgstr[1] "mochilas cruzadas" - -#. ~ Description for sling pack -#: lang/json/ARMOR_from_json.py -msgid "" -"A simple single-sling backpack. Easier to access than a normal backpack, " -"but can't comfortably hold as much." -msgstr "" -"Es una simple mochila con una correa cruzada al cuerpo. Más fácil para " -"acceder a su contenido que una mochila normal, pero no puede cargar " -"cómodamente tanto." - #: lang/json/ARMOR_from_json.py msgid "snuggie" msgid_plural "snuggies" @@ -11875,8 +11732,8 @@ msgstr[0] "cinturón de supervivencia" msgstr[1] "cinturones de supervivencia" #. ~ Use action holster_prompt for survivor belt. -#. ~ Use action holster_prompt for hiking backpack. #. ~ Use action holster_prompt for survivor utility belt. +#. ~ Use action holster_prompt for hiking backpack. #. ~ Use action holster_prompt for C.R.I.T web belt. #: lang/json/ARMOR_from_json.py msgid "Sheath blade" @@ -11893,21 +11750,6 @@ msgstr "" "llevar una cuchilla pequeña. Duradero y diseñado para ser cómodo. Hay que " "activarlo para enfundar y desenfundar el arma." -#: lang/json/ARMOR_from_json.py -msgid "survivor duffel bag" -msgid_plural "survivor duffel bags" -msgstr[0] "bolso de viaje de supervivencia" -msgstr[1] "bolsos de viaje de supervivencia" - -#. ~ Description for survivor duffel bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built heavy duffel bag. Durable and carefully crafted to hold as " -"much stuff as possible." -msgstr "" -"Un bolso de viaje pesado. Duradera y diseñado cuidadosamente para tener la " -"mayor capacidad posible." - #: lang/json/ARMOR_from_json.py msgid "survivor goggles" msgid_plural "pairs of survivor goggles" @@ -11923,50 +11765,6 @@ msgstr "" "Es un par de gafas blindadas con los lentes polarizados. Son cómodas y " "duraderas, brindan una excelente protección contra los peligros ambientales." -#: lang/json/ARMOR_from_json.py -msgid "survivor backpack" -msgid_plural "survivor backpacks" -msgstr[0] "mochila de supervivencia" -msgstr[1] "mochilas de supervivencia" - -#. ~ Description for survivor backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built backpack. Durable and carefully crafted to hold as much " -"stuff as possible." -msgstr "" -"Una mochila. Duradera y diseñada para tener la mayor capacidad posible." - -#: lang/json/ARMOR_from_json.py -msgid "survivor rucksack" -msgid_plural "survivor rucksacks" -msgstr[0] "mochilón de supervivencia" -msgstr[1] "mochilones de supervivencia" - -#. ~ Description for survivor rucksack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built heavy backpack. Durable and carefully crafted to hold as " -"much stuff as possible." -msgstr "" -"Una mochila pesada de supervivencia. Duradera y diseñada para tener la mayor" -" capacidad posible." - -#: lang/json/ARMOR_from_json.py -msgid "survivor runner pack" -msgid_plural "survivor runner packs" -msgstr[0] "mochila de supervivencia de footing" -msgstr[1] "mochilas de supervivencia de footing" - -#. ~ Description for survivor runner pack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built lightweight runner pack. Durable and carefully crafted to " -"hold as much stuff as possible." -msgstr "" -"Una mochila ligera que se utiliza para llevar cosas mientras corres. " -"Duradera y diseñada para tener la mayor capacidad posible." - #: lang/json/ARMOR_from_json.py msgid "survivor suit" msgid_plural "survivor suits" @@ -12940,30 +12738,6 @@ msgstr "" "No sabes si se llama \"gorra de golf\" pero es la gorra que llevan los " "golfistas estereotípicos." -#: lang/json/ARMOR_from_json.py -msgid "golf bag" -msgid_plural "golf bags" -msgstr[0] "bolsa de golf" -msgstr[1] "bolsas de golf" - -#. ~ Use action holster_msg for golf bag. -#: lang/json/ARMOR_from_json.py -#, no-python-format -msgid "You awkwardly sheath your %s" -msgstr "Embarazosamente enfundas tu %s." - -#. ~ Use action holster_prompt for golf bag. -#: lang/json/ARMOR_from_json.py -msgid "Sheath golf club" -msgstr "Enfundar palo de golf" - -#. ~ Description for golf bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A tall canvas and plastic bag with fold-out legs used for golfing. It even " -"has straps to be worn on the back." -msgstr "" - #: lang/json/ARMOR_from_json.py msgid "javelin bag" msgid_plural "javelin bags" @@ -13070,67 +12844,6 @@ msgstr "" "Una tela plástica con varias arandelas para poder atarla con una soga o una " "cuerda. Es útil para improvisar un techo durante la lluvia." -#: lang/json/ARMOR_from_json.py -msgid "high-volume rucksack" -msgid_plural "high-volume rucksacks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for high-volume rucksack -#: lang/json/ARMOR_from_json.py -msgid "" -"Also know as a \"bigpack\", this rucksack is prized by pack rats but may " -"lead to a bad back." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "hiking backpack" -msgid_plural "hiking backpacks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for hiking backpack -#: lang/json/ARMOR_from_json.py -msgid "A large sized hiking backpack with plenty of storage space." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "petpack" -msgid_plural "petpacks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for petpack -#: lang/json/ARMOR_from_json.py -msgid "" -"Before the Cataclysm this would allow your four-legged friend to see the " -"world, now it's used to shield them from the world." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "large tactical backpack" -msgid_plural "large tactical backpacks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for large tactical backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A large tactical multi-compartment backpack that has great lower back " -"support." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "travelpack" -msgid_plural "travelpacks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for travelpack -#: lang/json/ARMOR_from_json.py -msgid "A hiking pack used for short trips." -msgstr "" - #: lang/json/ARMOR_from_json.py msgid "survivor utility belt" msgid_plural "survivor utility belts" @@ -13355,6 +13068,338 @@ msgid "" "resistant vests. It has four pouches capable of carrying magazines." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "backpack" +msgid_plural "backpacks" +msgstr[0] "mochila" +msgstr[1] "mochilas" + +#. ~ Description for backpack +#: lang/json/ARMOR_from_json.py +msgid "A small backpack. Good storage for a little encumbrance." +msgstr "" +"Es una mochila pequeña. Buen almacenamiento a cambio de una ligera " +"incomodidad." + +#: lang/json/ARMOR_from_json.py +msgid "hiking backpack" +msgid_plural "hiking backpacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for hiking backpack +#: lang/json/ARMOR_from_json.py +msgid "A large sized hiking backpack with plenty of storage space." +msgstr "" + +#: lang/json/ARMOR_from_json.py +msgid "giant novelty backpack" +msgid_plural "giant novelty backpacks" +msgstr[0] "mochila innovadora gigante" +msgstr[1] "mochilas innovadoras gigantes " + +#. ~ Description for giant novelty backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A huge fabric backpack made mostly as a joke before the cataclysm. Now, " +"it's still rather silly, but it can store a lot of stuff." +msgstr "" +"Una gran mochila de tela fabricada como una broma antes del cataclismo. " +"Ahora sigue siendo algo estúpida, pero puede cargar con bastantes cosas." + +#: lang/json/ARMOR_from_json.py +msgid "leather backpack" +msgid_plural "leather backpacks" +msgstr[0] "mochila de cuero" +msgstr[1] "mochilas de cuero" + +#. ~ Description for leather backpack +#: lang/json/ARMOR_from_json.py +msgid "A small leather backpack. Good storage for a little encumbrance." +msgstr "Es una mochila pequeña de cuero. Buena capacidad y poca incomodidad." + +#: lang/json/ARMOR_from_json.py +msgid "large tactical backpack" +msgid_plural "large tactical backpacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for large tactical backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A large tactical multi-compartment backpack that has great lower back " +"support." +msgstr "" + +#: lang/json/ARMOR_from_json.py +msgid "high-volume rucksack" +msgid_plural "high-volume rucksacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for high-volume rucksack +#: lang/json/ARMOR_from_json.py +msgid "" +"Also know as a \"bigpack\", this rucksack is prized by pack rats but may " +"lead to a bad back." +msgstr "" + +#: lang/json/ARMOR_from_json.py +msgid "dive bag" +msgid_plural "dive bags" +msgstr[0] "bolsa de buceo" +msgstr[1] "bolsas de buceo" + +#. ~ Description for dive bag +#: lang/json/ARMOR_from_json.py +msgid "A lightweight mesh backpack, commonly worn by swimmers and divers." +msgstr "Una bolsa de red liviana, muy usada por los nadadores y los buzos." + +#: lang/json/ARMOR_from_json.py +msgid "duffel bag" +msgid_plural "duffel bags" +msgstr[0] "bolso de viaje" +msgstr[1] "bolsos de viaje" + +#. ~ Description for duffel bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A huge duffel bag. Provides plenty of storage, but is severely encumbering." +msgstr "" +"Un gran bolso de viaje. Tiene mucha capacidad de almacenamiento pero es muy " +"incómodo." + +#: lang/json/ARMOR_from_json.py +msgid "petpack" +msgid_plural "petpacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for petpack +#: lang/json/ARMOR_from_json.py +msgid "" +"Before the Cataclysm this would allow your four-legged friend to see the " +"world, now it's used to shield them from the world." +msgstr "" + +#: lang/json/ARMOR_from_json.py +msgid "jerrypack" +msgid_plural "jerrypacks" +msgstr[0] "bidón-chila" +msgstr[1] "bidón-chilas" + +#. ~ Description for jerrypack +#: lang/json/ARMOR_from_json.py +msgid "A jerrycan modified to be worn in a similar manner to a backpack." +msgstr "" +"Es un bidón modificado para poder ser llevado en la espalda, como una " +"mochila." + +#: lang/json/ARMOR_from_json.py +msgid "makeshift knapsack" +msgid_plural "makeshift knapsacks" +msgstr[0] "alforja improvisada" +msgstr[1] "alforjas improvisadas" + +#. ~ Description for makeshift knapsack +#: lang/json/ARMOR_from_json.py +msgid "" +"A pair of pants with the bottom ends tied with string, and then passed " +"through the belt loops so the knapsack can be carried on the back." +msgstr "" + +#: lang/json/ARMOR_from_json.py +msgid "makeshift sling" +msgid_plural "makeshift slings" +msgstr[0] "cabestrillo improvisado" +msgstr[1] "cabestrillos improvisados" + +#. ~ Description for makeshift sling +#: lang/json/ARMOR_from_json.py +msgid "A large sheet tied into a crude, over-the-shoulder sling." +msgstr "Es un pedazo de tela atado a un cabestrillo." + +#: lang/json/ARMOR_from_json.py +msgid "messenger bag" +msgid_plural "messenger bags" +msgstr[0] "bolso de cartero" +msgstr[1] "bolsos de cartero" + +#. ~ Description for messenger bag +#: lang/json/ARMOR_from_json.py +msgid "Light and easy to wear, but doesn't offer much storage." +msgstr "" +"Es liviano y fácil de llevar pero no tiene mucha capacidad de " +"almacenamiento." + +#: lang/json/ARMOR_from_json.py +msgid "MOLLE pack" +msgid_plural "MOLLE packs" +msgstr[0] "mochila MOLLE" +msgstr[1] "mochilas MOLLE" + +#. ~ Description for MOLLE pack +#: lang/json/ARMOR_from_json.py +msgid "" +"The Modular Lightweight Load-carrying Equipment is an advanced military " +"backpack. Covered with pockets and straps, it strikes a fine balance " +"between storage space and encumbrance." +msgstr "" +"Es una mochila militar. Su nombre viene del acrónimo en inglés \"Modular " +"Lightweight Load-carrying Equipment\". Está cubierta de bolsillos y bolsas. " +"Tiene un equilibrio perfecto entre la capacidad de almacenamiento y su " +"incomodidad." + +#: lang/json/ARMOR_from_json.py +msgid "purse" +msgid_plural "purses" +msgstr[0] "monedero" +msgstr[1] "monederos" + +#. ~ Description for purse +#: lang/json/ARMOR_from_json.py +msgid "A bit cumbersome to wear, but provides some storage." +msgstr "" +"Aunque tiene buena capacidad de almacenamiento, es un poco incómodo de " +"llevar." + +#: lang/json/ARMOR_from_json.py +msgid "military rucksack" +msgid_plural "military rucksacks" +msgstr[0] "mochilón militar" +msgstr[1] "mochilones militares" + +#. ~ Description for military rucksack +#: lang/json/ARMOR_from_json.py +msgid "A huge military rucksack, provides a lot of storage." +msgstr "" +"Es una mochila militar enorme. Tiene mucha capacidad de almacenamiento." + +#: lang/json/ARMOR_from_json.py +msgid "runner pack" +msgid_plural "runner packs" +msgstr[0] "mochila de footing" +msgstr[1] "mochilas de footing" + +#. ~ Description for runner pack +#: lang/json/ARMOR_from_json.py +msgid "" +"The obvious choice for outdoor athletes, this ergonomic backpack is light " +"and easy to wear, ensuring comfort when carrying heavy and bulky items." +msgstr "" +"La elección lógica para los atletas, esta mochila ergonómica es ligera y " +"fácil de llevar, pudiendo transportar objetos pesados cómodamente." + +#: lang/json/ARMOR_from_json.py +msgid "sling pack" +msgid_plural "sling packs" +msgstr[0] "mochila cruzada" +msgstr[1] "mochilas cruzadas" + +#. ~ Description for sling pack +#: lang/json/ARMOR_from_json.py +msgid "" +"A simple single-sling backpack. Easier to access than a normal backpack, " +"but can't comfortably hold as much." +msgstr "" +"Es una simple mochila con una correa cruzada al cuerpo. Más fácil para " +"acceder a su contenido que una mochila normal, pero no puede cargar " +"cómodamente tanto." + +#: lang/json/ARMOR_from_json.py +msgid "survivor duffel bag" +msgid_plural "survivor duffel bags" +msgstr[0] "bolso de viaje de supervivencia" +msgstr[1] "bolsos de viaje de supervivencia" + +#. ~ Description for survivor duffel bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built heavy duffel bag. Durable and carefully crafted to hold as " +"much stuff as possible." +msgstr "" +"Un bolso de viaje pesado. Duradera y diseñado cuidadosamente para tener la " +"mayor capacidad posible." + +#: lang/json/ARMOR_from_json.py +msgid "survivor backpack" +msgid_plural "survivor backpacks" +msgstr[0] "mochila de supervivencia" +msgstr[1] "mochilas de supervivencia" + +#. ~ Description for survivor backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built backpack. Durable and carefully crafted to hold as much " +"stuff as possible." +msgstr "" +"Una mochila. Duradera y diseñada para tener la mayor capacidad posible." + +#: lang/json/ARMOR_from_json.py +msgid "survivor rucksack" +msgid_plural "survivor rucksacks" +msgstr[0] "mochilón de supervivencia" +msgstr[1] "mochilones de supervivencia" + +#. ~ Description for survivor rucksack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built heavy backpack. Durable and carefully crafted to hold as " +"much stuff as possible." +msgstr "" +"Una mochila pesada de supervivencia. Duradera y diseñada para tener la mayor" +" capacidad posible." + +#: lang/json/ARMOR_from_json.py +msgid "survivor runner pack" +msgid_plural "survivor runner packs" +msgstr[0] "mochila de supervivencia de footing" +msgstr[1] "mochilas de supervivencia de footing" + +#. ~ Description for survivor runner pack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built lightweight runner pack. Durable and carefully crafted to " +"hold as much stuff as possible." +msgstr "" +"Una mochila ligera que se utiliza para llevar cosas mientras corres. " +"Duradera y diseñada para tener la mayor capacidad posible." + +#: lang/json/ARMOR_from_json.py +msgid "golf bag" +msgid_plural "golf bags" +msgstr[0] "bolsa de golf" +msgstr[1] "bolsas de golf" + +#. ~ Use action holster_msg for golf bag. +#: lang/json/ARMOR_from_json.py +#, no-python-format +msgid "You awkwardly sheath your %s" +msgstr "Embarazosamente enfundas tu %s." + +#. ~ Use action holster_prompt for golf bag. +#: lang/json/ARMOR_from_json.py +msgid "Sheath golf club" +msgstr "Enfundar palo de golf" + +#. ~ Description for golf bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A tall canvas and plastic bag with fold-out legs used for golfing. It even " +"has straps to be worn on the back." +msgstr "" + +#: lang/json/ARMOR_from_json.py +msgid "travelpack" +msgid_plural "travelpacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for travelpack +#: lang/json/ARMOR_from_json.py +msgid "A hiking pack used for short trips." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "pistol bandolier" msgid_plural "pistol bandoliers" @@ -15193,6 +15238,8 @@ msgid "" "A star shaped badge, on it you can read \"Foodkid\" in bold letters. This " "is Foodperson's trusty sidekick's badge." msgstr "" +"Es una placa con forma de estrella que dice \"Foodkid\" en negrita. Es la " +"placa del compañero fiel de Foodperson." #: lang/json/ARMOR_from_json.py msgid "pair of fuzzy cat ears" @@ -15660,8 +15707,8 @@ msgstr[1] "" #: lang/json/ARMOR_from_json.py msgid "welding mask" msgid_plural "welding masks" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "mascara de soldador" +msgstr[1] "mascaras de soldador" #. ~ Description for welding mask #: lang/json/ARMOR_from_json.py @@ -16020,8 +16067,8 @@ msgstr "" #: lang/json/ARMOR_from_json.py msgid "C.R.I.T trousers" msgid_plural "C.R.I.T trouserss" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "pantalones C.R.I.T." +msgstr[1] "pantalones C.R.I.T." #. ~ Description for C.R.I.T trousers #: lang/json/ARMOR_from_json.py @@ -16120,6 +16167,8 @@ msgid "" "A simple, durable steel canteen that can heat up food with built in " "plutonium heating elements." msgstr "" +"Es una cantimplora común y duradera de acero, que puede calentar la comida " +"con sus resistencias térmicas de plutonio integradas." #. ~ Description for pistol bandolier #: lang/json/ARMOR_from_json.py @@ -16558,19 +16607,6 @@ msgid "" " turn more often than massive objects." msgstr "" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Advanced Microreactor CBM" -msgid_plural "Advanced Microreactor CBMs" -msgstr[0] "MCB Microreactor Mejorado" -msgstr[1] "MCB Microreactor Mejorado" - -#. ~ Description for Advanced Microreactor CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"This module upgrades a pre-installed microreactor with enhanced maximum " -"yield and limited automatic radiation scrubbing capabilities." -msgstr "" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Alarm System CBM" msgid_plural "Alarm System CBMs" @@ -17328,19 +17364,6 @@ msgid "" "cause delayed reaction times and drowsiness." msgstr "" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Plutonium Filter CBM" -msgid_plural "Plutonium Filter CBMs" -msgstr[0] "MCB Filtro de Plutonio" -msgstr[1] "MCB Filtro de Plutonio" - -#. ~ Description for Plutonium Filter CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A system of tanks and filters that are connected to a microreactor to " -"extract plutonium from radioactive slurry." -msgstr "" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Power Armor Interface CBM" msgid_plural "Power Armor Interface CBMs" @@ -17468,33 +17491,6 @@ msgid "" "unarmed slashing damage whenever the user's fingertips are uncovered." msgstr "" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Internal Microreactor CBM" -msgid_plural "Internal Microreactor CBMs" -msgstr[0] "MCB Microreactor Interno" -msgstr[1] "MCB Microreactor Interno" - -#. ~ Description for Internal Microreactor CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"This stripped down mini-reactor will generate impressive amounts of bionic " -"power, but may not be the safest thing to install. Once active, it cannot " -"be shut down and will slowly contaminate the user's body with radiation." -msgstr "" - -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Microreactor Upgrade CBM" -msgid_plural "Microreactor Upgrade CBMs" -msgstr[0] "MCB Mejora de Microreactor" -msgstr[1] "MCB Mejora de Microreactor" - -#. ~ Description for Microreactor Upgrade CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A kit for upgrading a pre-installed microreactor with enhanced maximum yield" -" and limited automatic radiation scrubbing capabilities." -msgstr "" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Recycler Unit CBM" msgid_plural "Recycler Unit CBMs" @@ -18136,6 +18132,59 @@ msgstr "" "El espacio dentro de la cavidad de tu pecho ha sido convertido en un lugar " "de almacenamiento. Puedes transportar 2 litros extra por volumen." +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Advanced Microreactor CBM" +msgid_plural "Advanced Microreactor CBMs" +msgstr[0] "MCB Microreactor Mejorado" +msgstr[1] "MCB Microreactor Mejorado" + +#. ~ Description for Advanced Microreactor CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"This module upgrades a pre-installed microreactor with enhanced maximum " +"yield and limited automatic radiation scrubbing capabilities." +msgstr "" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Plutonium Filter CBM" +msgid_plural "Plutonium Filter CBMs" +msgstr[0] "MCB Filtro de Plutonio" +msgstr[1] "MCB Filtro de Plutonio" + +#. ~ Description for Plutonium Filter CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A system of tanks and filters that are connected to a microreactor to " +"extract plutonium from radioactive slurry." +msgstr "" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Internal Microreactor CBM" +msgid_plural "Internal Microreactor CBMs" +msgstr[0] "MCB Microreactor Interno" +msgstr[1] "MCB Microreactor Interno" + +#. ~ Description for Internal Microreactor CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"This stripped down mini-reactor will generate impressive amounts of bionic " +"power, but may not be the safest thing to install. Once active, it cannot " +"be shut down and will slowly contaminate the user's body with radiation." +msgstr "" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Microreactor Upgrade CBM" +msgid_plural "Microreactor Upgrade CBMs" +msgstr[0] "MCB Mejora de Microreactor" +msgstr[1] "MCB Mejora de Microreactor" + +#. ~ Description for Microreactor Upgrade CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A kit for upgrading a pre-installed microreactor with enhanced maximum yield" +" and limited automatic radiation scrubbing capabilities." +msgstr "" + #. ~ Description for Solar Panels CBM #: lang/json/BIONIC_ITEM_from_json.py msgid "" @@ -20881,26 +20930,26 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Nietzsche's \"Beyond Good and Evil\". Its cover is dog-" +"This is a copy of Nietzsche's \"Beyond Good and Evil\". Its cover is dog-" "eared and creased." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"The Unique and Its Property\" by Max Stirner. A modern " +"This is a copy of \"The Unique and Its Property\" by Max Stirner. A modern " "translation by Wolfi Landstreicher." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Jean-Paul Sartre's \"Being and Nothingness\". A key work " +"This is a copy of Jean-Paul Sartre's \"Being and Nothingness\". A key work " "in the existentialist tradition." msgstr "" #: lang/json/BOOK_from_json.py msgid "" "A large, extended version of \"Madness and Civilisation\" by Michel " -"Foucault. The cover features a striking image of a Panopticonic Prison." +"Foucault. The cover features a striking image of a Panopticonic Prison." msgstr "" #: lang/json/BOOK_from_json.py @@ -20911,13 +20960,13 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"A collection of texts and essays by Jacques Derrida. It's pages loose and " +"A collection of texts and essays by Jacques Derrida. It's pages loose and " "yellowed, you should probably handle it with care." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Society of the Spectacle\" by Guy Debord. Its cover " +"This is a copy of \"Society of the Spectacle\" by Guy Debord. Its cover " "shows rows of adults staring placidly into a screen." msgstr "" @@ -20929,36 +20978,36 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Baudrillard's \"Simulation and Simulacra\". The cover " +"This is a copy of Baudrillard's \"Simulation and Simulacra\". The cover " "contains an image of a man holding a colored pill in each hand, with the " -"caption \"Welcome to the Desert of the Real.\". You think you've seen this " +"caption \"Welcome to the Desert of the Real.\". You think you've seen this " "movie." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a small, pocket version of Sartre's \"Existentialism and Humanism.\"" -" It looks to have been used as a coaster in a past life." +"This is a small, pocket version of Sartre's \"Existentialism and Humanism\"." +" It looks to have been used as a coaster in a past life." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Practical Ethics\" by Peter Singer. From the local " +"This is a copy of \"Practical Ethics\" by Peter Singer. From the local " "university press." msgstr "" #: lang/json/BOOK_from_json.py msgid "" "This is a photocopied spiral-bound copy of \"Industrial Society and Its " -"Future\" by 'Freedom Club'. The original looks to have been written on a " +"Future\" by 'Freedom Club'. The original looks to have been written on a " "typewriter before being copied." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Industrial Society and Its Future\" by Ted Kaczynski. " +"This is a copy of \"Industrial Society and Its Future\" by Ted Kaczynski. " "Its cover is an image of a hand-crafted wooden box filled with wiring and an" -" ominous looking metal tube. Provocative." +" ominous looking metal tube. Provocative." msgstr "" #: lang/json/BOOK_from_json.py @@ -20967,23 +21016,23 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"The State and Revolution\" by Vladimir Lenin. In " +"This is a copy of \"The State and Revolution\" by Vladimir Lenin. In " "English, thankfully." msgstr "" #: lang/json/BOOK_from_json.py -msgid "This is a copy of \"In Defence of Terrorism\" by Leon Trotsky." +msgid "This is a copy of \"In Defense of Marxism\" by Leon Trotsky." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Steal This Book\" by Abbie Hoffman. There is a security " -"tag on the back cover. It appears to still be active." +"This is a copy of \"Steal This Book\" by Abbie Hoffman. There is a security" +" tag on the back cover. It appears to still be active." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Walden: Or Life In The Woods\" by Henry David Thoreau. " +"This is a copy of \"Walden: Or Life In The Woods\" by Henry David Thoreau. " "It contains a dried and pressed leaf as a bookmark." msgstr "" @@ -21004,7 +21053,7 @@ msgid "" msgstr "" #: lang/json/BOOK_from_json.py -msgid "This is a copy of Machiavelli's \"The Prince\". With intro by Q. Skinner." +msgid "This is a copy of Machiavelli's \"The Prince\". With intro by Q. Skinner." msgstr "" #: lang/json/BOOK_from_json.py @@ -21014,12 +21063,12 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a pocket copy of \"An Essay on Liberation\" by Herbert Marcuse. The " -"cover contains an image of a pelican." +"This is a pocket copy of \"An Essay on Liberation\" by Herbert Marcuse. The" +" cover contains an image of a pelican." msgstr "" #: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Either-Or\" by Sören Kierkegaard." +msgid "This is a copy of \"Either-Or\" by Søren Kierkegaard." msgstr "" #: lang/json/BOOK_from_json.py @@ -21044,6 +21093,69 @@ msgid "" "Science\" by Friederich Nietzsche." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Myth of Sisyphus\", and other essays, by Albert " +"Camus. The cover depicts a bare-chested man and a large boulder." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Sickness Unto Death\" by Søren Kierkegaard. The " +"pages are dotted with post-it notes." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Defence of Terrorism\" by Leon Trotsky. Despite the" +" title, it does not actually appear to be defending terrorism." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Enquiry Concerning Political Justice\" by William " +"Godwin. This thick book is filled with antiquated phrases." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Abolition of Work and Other Essays\" by Bob Black. " +"It is likely that \"The Abolition of Work\" is the most famous essay in this" +" book." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"What is Property?\" by Pierre-Joseph Proudhon. It looks" +" like this book has a surprisingly long track record of owners." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Conquest of Bread\" by Peter Kropotkin. There is a " +"picture of an old philosopher with magnificent beard, instead of bread, on " +"the cover." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Trouble with Being Born\" by Emil Cioran. This book" +" might have been printed decades before the cataclysm since the cover is " +"quite weathered." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The World as Will and Representation\" by Arthur " +"Schopenhauer. It contains a few undecipherable notes and scribbles." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Up-Wingers: A Futurist Manifesto\" by FM-2030. It seems" +" that the author's real name is Fereidoun M. Esfandiary." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "phone book" msgid_plural "phone books" @@ -22978,8 +23090,8 @@ msgstr[1] "" msgid "" "This useful stuff is a potent solvent and has a wide range of reactive " "applications. It can be used to make a huge number of plastics and " -"polymers, it can be a disinfectant, it can strip paint and break down epoxy," -" and it can burn your skin away like tissue paper under a heat gun. Wear " +"polymers, it can be an antiseptic, it can strip paint and break down epoxy, " +"and it can burn your skin away like tissue paper under a heat gun. Wear " "gloves." msgstr "" @@ -23915,7 +24027,7 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "beer wort" -msgstr "" +msgstr "mosto de cerveza" #. ~ Description for beer wort #: lang/json/COMESTIBLE_from_json.py @@ -28531,11 +28643,9 @@ msgstr[1] "polvo antiséptico" #. ~ Description for antiseptic powder #: lang/json/COMESTIBLE_from_json.py msgid "" -"A powdered form of chemical disinfectant, this bismuth formic iodide cleans " +"A powdered form of chemical antiseptic, this bismuth formic iodide cleans " "wounds quickly and painlessly." msgstr "" -"Es un desinfectante químico en forma de polvo. Este yoduro de bismuto " -"fórmico limpia las heridas de manera rápida y sin dolor." #: lang/json/COMESTIBLE_from_json.py msgid "caffeinated chewing gum" @@ -28587,13 +28697,10 @@ msgstr[1] "agua oxigenada" #. ~ Description for hydrogen peroxide #: lang/json/COMESTIBLE_from_json.py msgid "" -"Dilute hydrogen peroxide, for use as a disinfectant and for bleaching hair " -"or textiles. Foams a little when in contact with organic matter, but " +"Dilute hydrogen peroxide, for use as an antiseptic and for bleaching hair or" +" textiles. Foams a little when in contact with organic matter, but " "otherwise harmless." msgstr "" -"Es agua oxigenada diluido, para usar como desinfectante o blanqueador de " -"pelo o telas. Hace un poco de espuma cuando está en contacto con materia " -"orgánica, pero si no es inofensivo." #: lang/json/COMESTIBLE_from_json.py lang/json/GENERIC_from_json.py msgid "cigarette" @@ -28760,27 +28867,23 @@ msgstr "" "Igual, vas a necesitar descanso y mucho líquido." #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant" -msgstr "desinfectante" +msgid "antiseptic" +msgstr "" -#. ~ Description for disinfectant +#. ~ Description for antiseptic #: lang/json/COMESTIBLE_from_json.py -msgid "A powerful disinfectant commonly used for contaminated wounds." +msgid "A powerful antiseptic commonly used for contaminated wounds." msgstr "" -"Es un desinfectante poderoso comúnmente usado para limpiar heridas " -"contaminadas." #: lang/json/COMESTIBLE_from_json.py -msgid "makeshift disinfectant" -msgstr "desinfectante improvidado" +msgid "makeshift antiseptic" +msgstr "" -#. ~ Description for makeshift disinfectant +#. ~ Description for makeshift antiseptic #: lang/json/COMESTIBLE_from_json.py msgid "" -"Makeshift disinfectant made from ethanol. Can be used to disinfect a wound." +"Makeshift antiseptic made from ethanol. Can be used to disinfect a wound." msgstr "" -"Es un desinfectante improvisado, hecho con etanol. Puede ser utilizado para " -"desinfectar una herida." #: lang/json/COMESTIBLE_from_json.py src/addiction.cpp msgid "diazepam" @@ -29186,10 +29289,8 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "" "Some essential oil made from thyme, which can act as a mildly irritating " -"disinfectant." +"antiseptic." msgstr "" -"Es un poco de aceite esencial hecho con tomillo, que puede servir como un " -"leve desinfectante irritante." #: lang/json/COMESTIBLE_from_json.py msgid "rolling tobacco" @@ -29401,28 +29502,28 @@ msgstr "" "alprazolam." #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant soaked rag" -msgid_plural "disinfectant soaked rags" -msgstr[0] "trapo empapado de desinfectante" -msgstr[1] "trapos empapados de desinfectante" +msgid "antiseptic soaked rag" +msgid_plural "antiseptic soaked rags" +msgstr[0] "" +msgstr[1] "" -#. ~ Description for disinfectant soaked rag +#. ~ Description for antiseptic soaked rag #: lang/json/COMESTIBLE_from_json.py msgid "" -"A rag soaked in disinfectant. Useful for light wounds, probaby won't help " -"with deep bites." +"A rag soaked in antiseptic. Useful for light wounds, probaby won't help with" +" deep bites." msgstr "" #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant soaked cotton balls" -msgid_plural "disinfectant soaked cotton balls" -msgstr[0] "pelota de algodón empapada de desinfectante" -msgstr[1] "pelotas de algodón empapadas de desinfectante" +msgid "antiseptic soaked cotton balls" +msgid_plural "antiseptic soaked cotton balls" +msgstr[0] "" +msgstr[1] "" -#. ~ Description for disinfectant soaked cotton balls +#. ~ Description for antiseptic soaked cotton balls #: lang/json/COMESTIBLE_from_json.py msgid "" -"Fluffy balls of clean white cotton. Now soaked with disinfectant, they are " +"Fluffy balls of clean white cotton. Now soaked with antiseptic, they are " "somewhat useful to disinfect a wound." msgstr "" @@ -30138,7 +30239,7 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "mutagen" -msgstr "" +msgstr "mutágeno" #: lang/json/COMESTIBLE_from_json.py msgid "congealed blood" @@ -31405,7 +31506,7 @@ msgstr[1] "" #. ~ Description for handful of huckleberries #: lang/json/COMESTIBLE_from_json.py msgid "Huckleberries, often times confused for blueberries." -msgstr "" +msgstr "Son arándanos agrios, a menudo confundidos con las moras azules." #: lang/json/COMESTIBLE_from_json.py msgid "handful of mulberries" @@ -31476,8 +31577,8 @@ msgstr "Una fruta cítrica, cuyo gusto va desde lo agrio hasta lo semidulce." #: lang/json/COMESTIBLE_from_json.py msgid "handful of cherries" msgid_plural "handful of cherries" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "puñado de cerezas" +msgstr[1] "puñado de cerezas" #. ~ Description for handful of cherries #: lang/json/COMESTIBLE_from_json.py @@ -32161,6 +32262,20 @@ msgstr[1] "sandwiches de mermelada" msgid "A delicious jam sandwich." msgstr "Es un delicioso sandwich de mermelada." +#: lang/json/COMESTIBLE_from_json.py +msgid "fairy bread" +msgid_plural "fairy bread" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for fairy bread +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"An 'open-faced sandwich' consisting of sliced white bread, a healthy crust-" +"to-crust slathering of butter, and sprinkles. Supposedly a staple of " +"birthday parties in Australia." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "honey sandwich" msgid_plural "honey sandwiches" @@ -32355,7 +32470,7 @@ msgstr "Son unas semillas de arándano." #: lang/json/COMESTIBLE_from_json.py msgid "blueberry" -msgstr "" +msgstr "arándano" #: lang/json/COMESTIBLE_from_json.py msgid "cranberry seeds" @@ -32370,7 +32485,7 @@ msgstr "Son unas semillas de arándano rojo." #: lang/json/COMESTIBLE_from_json.py msgid "cranberry" -msgstr "" +msgstr "arándano" #: lang/json/COMESTIBLE_from_json.py msgid "huckleberry seeds" @@ -32430,7 +32545,7 @@ msgstr "Algunas semillas de frambuesa." #: lang/json/COMESTIBLE_from_json.py msgid "raspberry" -msgstr "" +msgstr "frambuesa" #: lang/json/COMESTIBLE_from_json.py msgid "strawberry seeds" @@ -32445,7 +32560,7 @@ msgstr "Algunas semillas de fresa." #: lang/json/COMESTIBLE_from_json.py msgid "strawberry" -msgstr "" +msgstr "fresa" #: lang/json/COMESTIBLE_from_json.py msgid "grape seeds" @@ -32460,7 +32575,7 @@ msgstr "Algunas semillas de uva." #: lang/json/COMESTIBLE_from_json.py msgid "grape" -msgstr "" +msgstr "uva" #: lang/json/COMESTIBLE_from_json.py msgid "rose seeds" @@ -33406,6 +33521,21 @@ msgstr "" "Dulce, dulce azúcar. Malo para tus dientes y sorprendentemente no es muy " "sabrosa sola." +#: lang/json/COMESTIBLE_from_json.py +msgid "sprinkles" +msgid_plural "sprinkles" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for sprinkles +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Known as nonpareils, sprinkles, jimmies, sugar strands or 'hundreds-and-" +"thousands', these colorful balls, rods or flakes of sugar and starch are " +"intended for use decorating soft surfaces of sweets. Like sugar, they are " +"bad for your teeth and surprisingly not very tasty on their own." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "wild herbs" msgid_plural "wild herbs" @@ -36962,8 +37092,8 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "smoldering embers" msgid_plural "smoldering embers" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "brasas ardientes" +msgstr[1] "brasas ardientes" #. ~ Description for smoldering embers #: lang/json/GENERIC_from_json.py @@ -38210,6 +38340,21 @@ msgid "" "create an item through a nanofabricator." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "nanofabricator template (silicon photonics)" +msgid_plural "nanofabricator template (silicon photonics)s" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for nanofabricator template (silicon photonics) +#: lang/json/GENERIC_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "antenna" msgid_plural "antennas" @@ -38801,8 +38946,8 @@ msgstr "" #: lang/json/GENERIC_from_json.py lang/json/furniture_from_json.py msgid "lily" msgid_plural "lilys" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "lirio" +msgstr[1] "lirios" #. ~ Description for lily #: lang/json/GENERIC_from_json.py @@ -38820,6 +38965,8 @@ msgstr[1] "" msgid "" "A lily bud. Contains some substances commonly produced by a lily flower." msgstr "" +"Es el capullo de un lirio. Contiene algunas sustancias comúnmente producidas" +" por la flor del lirio." #: lang/json/GENERIC_from_json.py lang/json/furniture_from_json.py msgid "lotus" @@ -42157,6 +42304,8 @@ msgid "" "A bone from a human being. Could be used to make some stuff, if you're " "feeling sufficiently ghoulish." msgstr "" +"Es un hueso de un ser humano. Puede ser usado para hacer cosas, si te " +"sientes lo suficientemente morboso." #: lang/json/GENERIC_from_json.py msgid "first aid kit" @@ -42702,8 +42851,8 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid ".300 Win Mag casing" msgid_plural ".300 Win Mag casings" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "vaina .300 Win Mag" +msgstr[1] "vainas .300 Win Mag" #. ~ Description for .300 Win Mag casing #: lang/json/GENERIC_from_json.py @@ -43082,7 +43231,7 @@ msgstr[1] "" #. ~ Description for .300BLK casing #: lang/json/GENERIC_from_json.py -msgid "An empty casing from a .300BLK round." +msgid "An empty casing from a .300 AAC Blackout round." msgstr "" #: lang/json/GENERIC_from_json.py @@ -44763,6 +44912,36 @@ msgid "" "had fake black soot painted on." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "blackjack" +msgid_plural "blackjacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for blackjack +#: lang/json/GENERIC_from_json.py +msgid "" +"This is a short, easily concealed bludgeoning weapon consisting of a weight " +"embedded at the end of a short leather shaft. Formerly used by law " +"enforcement, this weapon is meant to stun or knock out the subject, although" +" head strikes have a high risk of causing a permanent, disabling brain " +"injury or being fatal." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "makeshift sap" +msgid_plural "makeshift saps" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for makeshift sap +#: lang/json/GENERIC_from_json.py +msgid "" +"This is an improvised sap, also known as a cosh, slapjack and slapper. A " +"short and flat bludgeoning weapon consisting of a weight embedded between " +"two patches of leather." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "pointy stick" msgid_plural "pointy sticks" @@ -45283,6 +45462,30 @@ msgstr "" "sable es bastante más corto que el florete y la espada de esgrima, pero no " "es menos eficaz." +#: lang/json/GENERIC_from_json.py +msgid "hollow cane" +msgid_plural "hollow canes" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for hollow cane +#: lang/json/GENERIC_from_json.py +msgid "" +"A cane designed to conceal blade. This was a popular fashion accessory for " +"the wealthy during the 18th and 19th centuries." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "sword cane" +msgid_plural "sword canes" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for sword cane +#: lang/json/GENERIC_from_json.py +msgid "A sword with a thin blade designed to be hidden inside an hollow cane." +msgstr "" + #: lang/json/GENERIC_from_json.py lang/json/TOOL_from_json.py #: lang/json/TOOL_from_json.py msgid "cutlass" @@ -45959,8 +46162,8 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "wood boat hull" msgid_plural "wood boat hulls" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "casco de madera de bote" +msgstr[1] "cascos de madera de bote" #. ~ Description for wood boat hull #: lang/json/GENERIC_from_json.py @@ -51759,6 +51962,8 @@ msgid "" "A broken military robot, shattered and inert. This one is armed with an " "integrated 40mm grenade launcher. Could be stripped for parts." msgstr "" +"Es un robot militar roto, destrozado e inerte. Este está equipado con un " +"lanzagranadas 40mm integrado. Puede ser desarmado para recuperar partes." #: lang/json/GENERIC_from_json.py msgid "broken military flame robot" @@ -52692,6 +52897,15 @@ msgstr "" msgid "A cheap 6-round steel box magazine for the Jennings J-22." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "Walther P22 magazine" +msgstr "" + +#. ~ Description for Walther P22 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round box magazine for the Walther P22." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "LW-5 speedloader" msgstr "" @@ -53130,6 +53344,20 @@ msgstr "" msgid "A cheap 32-round steel box magazine for use with the MAC-11 SMG." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "CF-380 magazine" +msgstr "" + +#. ~ Description for CF-380 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Hi-Point CF-380." +msgstr "" + +#. ~ Description for CF-380 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point CF-380." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "M1911 .38 Super magazine" msgstr "" @@ -53194,6 +53422,43 @@ msgid "" "expect much reliability." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "Hi-Power magazine .40 S&W" +msgstr "" + +#. ~ Description for Hi-Power magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Browning Hi-Power .40 S&W." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine .40 S&W" +msgstr "" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 12 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 14 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "Model JCP magazine" +msgstr "" + +#. ~ Description for Model JCP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point Model JCP." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "grenade belt" msgstr "cinta de granadas" @@ -53358,6 +53623,24 @@ msgstr "" "Es un cargador de capacidad estándar para usar con las armas de mano H&K " "USP." +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine .45 ACP" +msgstr "" + +#. ~ Description for PPQ magazine .45 ACP +#: lang/json/MAGAZINE_from_json.py +msgid "A 12 round steel box magazine for the Walther PPQ .45 ACP." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "Model JHP magazine" +msgstr "" + +#. ~ Description for Model JHP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 9-round steel box magazine for use with the Hi-Point Model JHP." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid ".454 5-round speedloader" msgstr "" @@ -53885,6 +54168,95 @@ msgstr "" msgid "A 17 round double stack box magazine for the SIG Sauer P320." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "Hi-Power magazine 9x19mm" +msgstr "" + +#. ~ Description for Hi-Power magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 13 round steel box magazine for the Browning Hi-Power 9x19mm." +msgstr "" + +#. ~ Description for Hi-Power magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 15 round steel box magazine for the Browning Hi-Power 9x19mm." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "P38 magazine" +msgstr "" + +#. ~ Description for P38 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8 round steel box magazine for the Walther P38." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine 9x19mm" +msgstr "" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Walther PPQ 9mm." +msgstr "" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 15 round steel box magazine for the Walther PPQ 9mm." +msgstr "" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 17 round steel box magazine for the Walther PPQ 9mm." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "C-9 magazine" +msgstr "" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Hi-Point C-9." +msgstr "" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point C-9." +msgstr "" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 15-round steel box magazine for use with the Hi-Point C-9." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "CZ 75 magazine" +msgstr "" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 12-round steel box magazine for use with the CZ 75." +msgstr "" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 20-round steel box magazine for use with the CZ 75." +msgstr "" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 26-round steel box magazine for use with the CZ 75." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "CCP magazine" +msgstr "" + +#. ~ Description for CCP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Walther CCP." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "Makarov PM magazine" msgstr "cargador Makarov PM" @@ -56061,7 +56433,7 @@ msgstr "" #: lang/json/MONSTER_from_json.py msgid "perch" -msgstr "" +msgstr "lucioperca" #. ~ Description for perch #: lang/json/MONSTER_from_json.py @@ -57805,10 +58177,8 @@ msgstr "torreta milspec" #: lang/json/MONSTER_from_json.py msgid "" "Leadworks LLC's T-4A1 Sentry. It features improved firmware over General " -"Atomics' TX-1 9x19mm model and an automated M4 carbine." +"Atomics' TX-1 9x19mm model and an automated 5.56mm carbine." msgstr "" -"La T-4A1 Sentry de Leadworks SRL. Posee un firmware mejorado del modelo TX-1" -" 9x19mm de General Atomic, y una carabina M4 automatizada." #: lang/json/MONSTER_from_json.py msgid "debug monster" @@ -59349,6 +59719,47 @@ msgid "" "between walls and ceiling with limbs grown from its own disjointed ribs." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "gangrenous impaler" +msgstr "" + +#. ~ Description for gangrenous impaler +#: lang/json/MONSTER_from_json.py +msgid "" +"A corpse hideously twisted into an insect-like form. A hollow tendril " +"reaches out from its open thorax." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "The impaler launches a barb!" +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "trapped tendril" +msgstr "" + +#. ~ Description for trapped tendril +#: lang/json/MONSTER_from_json.py +msgid "" +"A great tendril of mutated flesh and sharpened bone. Emergent from a " +"crevice in the ruined floor, hundreds of human limbs seek freedom and writhe" +" incessantly from underneath its grotesque carapace. As enormous as it may " +"already be, you feel certain that this is just part of a creature much " +"bigger, for when it moves, you can feel this whole ruin tremble, as if an " +"unseen giant struggled against the weight of its concrete tomb." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "flesh wall" +msgstr "" + +#. ~ Description for flesh wall +#: lang/json/MONSTER_from_json.py +msgid "" +"A great lump of mutated flesh. It resembles the innards of some gigantic " +"creature and is covered in a grid of diminutive veins." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "bloated fungal zombie" msgstr "" @@ -62461,6 +62872,9 @@ msgid "" "firearms. An opulent luxury-bot suitable for those who wish to survive the " "apocalypse in style." msgstr "" +"Es un robot con placas de oro y decorado con diamantes, armado con un par de" +" armas 9mm integradas. Es un robot opulento de lujo, adecuado para aquellos " +"que desean sobrevivir al apocalipsis sin perder el estilo." #: lang/json/MONSTER_from_json.py msgid "robo-protector" @@ -62592,7 +63006,7 @@ msgstr "" #: lang/json/MONSTER_from_json.py msgid "fist king" -msgstr "" +msgstr "puño rey" #. ~ Description for fist king #: lang/json/MONSTER_from_json.py @@ -62982,6 +63396,24 @@ msgid "" "effect. Starts very short range, increases rapidly with level." msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Summon Gangrenous Crawlers" +msgstr "" + +#. ~ Description for Summon Gangrenous Crawlers +#: lang/json/SPELL_from_json.py +msgid "Summons 2 permanent gangrenous crawlers." +msgstr "" + +#: lang/json/SPELL_from_json.py +msgid "Summon Gangrenous Monsters" +msgstr "" + +#. ~ Description for Summon Gangrenous Monsters +#: lang/json/SPELL_from_json.py +msgid "Summons 2 permanent gangrenous impalers." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Smite" msgstr "" @@ -69080,6 +69512,10 @@ msgid "" "Dropping it will set you on fire, so don't do that unless you want to burn " "to death." msgstr "" +"Es una botella con un líquido inflamable y un trapo llameante metido en el " +"cuello. Al tirarlo se rompe la botella y se prende como una bola de fuego. " +"Si se te cae, te va a prender fuego a vos, así que no hagas eso excepto que " +"te quieras morir quemado." #: lang/json/TOOL_from_json.py msgid "mop" @@ -69803,6 +70239,19 @@ msgid "" "used for cleaning impervious surfaces." msgstr "" +#: lang/json/TOOL_from_json.py +msgid "washing kit" +msgid_plural "washing kits" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for washing kit +#: lang/json/TOOL_from_json.py +msgid "" +"A combination kit of a washboard and a sponge. Everything you need to clean" +" items after the apocalypse." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "reading light" msgid_plural "reading lights" @@ -72602,6 +73051,11 @@ msgid "" "standard light sources, the L-stick or light stick as it is commonly called," " batteries last longer than other light sources." msgstr "" +"Producido por la empresa Light, este elegante palo no solo funciona como " +"fuente de luz, sino que también es un arma liviana debido a los materiales " +"de superaleación con los que está hecho. Dado sus mejoras de eficiencia " +"sobre las fuentes de luz comunes, el palo-L o palo luz como también se lo " +"llama, las baterías duran más que en otros aparatos." #: lang/json/TOOL_from_json.py msgid "L-stick (on)" @@ -73732,6 +74186,10 @@ msgid "" " modified to be a more effective weapon. Unfortunately these modifications " "have rendered it much less effective as a woodcutting tool." msgstr "" +"Es una motosierra eléctrica más liviana, más precisa y extensivamente " +"modificada para ser un arma más eficaz. Lamentablemente, estas " +"modificaciones la han hecho menos efectiva como herramienta para cortar " +"madera." #: lang/json/TOOL_from_json.py msgid "electric combat chainsaw (on)" @@ -75663,8 +76121,8 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "inactive 50 caliber military turret" msgid_plural "inactive 50 caliber military turrets" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "torreta militar calibre 50 inactiva" +msgstr[1] "torretas militares calibre 50 inactivas" #. ~ Description for inactive 50 caliber military turret #: lang/json/TOOL_from_json.py @@ -76283,6 +76741,10 @@ msgid "" "Activate this item, with wooden bolts in your inventory, to load and deploy " "the robot." msgstr "" +"Es un utilitaribot recuperado convertido en una colmena ambulante que " +"periódicamente quita y entrega panales. Protege la colonia con una ballesta " +"mecánica montada en su chasis. Activá este objeto, con pernos de madera en " +"tu inventario, para cargar y desplegar el robot." #: lang/json/TOOL_from_json.py msgid "inactive medibot" @@ -76521,6 +76983,8 @@ msgid "" "A salvaged military robot refitted with an integrated 50bmg rifle. Activate" " this item, with ammo in your inventory, to load and deploy the robot." msgstr "" +"Es un militaribot reconvertido con un rifle 50bmg integrado. Activá este " +"objeto, con munición en tu inventario, para cargar y desplegar el robot." #: lang/json/TOOL_from_json.py msgid "inactive advanced robot" @@ -77888,6 +78352,10 @@ msgstr "" msgid "nails" msgstr "clavos" +#: lang/json/ammunition_type_from_json.py +msgid "barb" +msgstr "" + #: lang/json/ammunition_type_from_json.py msgid "BBs" msgstr "balines" @@ -78096,8 +78564,8 @@ msgid "components" msgstr "componentes" #: lang/json/ammunition_type_from_json.py -msgid "93mm RPG-7" -msgstr "93mm RPG-7" +msgid "RPG-7 rocket" +msgstr "" #: lang/json/ammunition_type_from_json.py msgid "rebreather filter" @@ -78231,18 +78699,6 @@ msgid "" "those in turn more often than massive objects." msgstr "" -#: lang/json/bionic_from_json.py -msgid "Advanced Microreactor System" -msgstr "Sistema Mejorado de Microreactor" - -#. ~ Description for Advanced Microreactor System -#: lang/json/bionic_from_json.py -msgid "" -"This stripped down mini-reactor is more efficient and safer than the base " -"model due to integrated radiation cleansers. There is no way to shut it " -"down once active, but you can toggle additional fuel intake." -msgstr "" - #: lang/json/bionic_from_json.py msgid "Alarm System" msgstr "Sistema de Alarma" @@ -79090,28 +79546,6 @@ msgstr "" " te permite dormir tus sentidos cuando quieras. Sin embargo, la utilización " "de este sistema puede causar que tus reacciones sean lentas y somnolencia." -#: lang/json/bionic_from_json.py -msgid "Plutonium Filter" -msgstr "Filtro de Plutonio" - -#. ~ Description for Plutonium Filter -#: lang/json/bionic_from_json.py -msgid "" -"This set of tanks and filters allows you to extract plutonium from " -"radioactive slurry." -msgstr "" - -#: lang/json/bionic_from_json.py -msgid "Plutonium Purger" -msgstr "Purificador de Plutonio" - -#. ~ Description for Plutonium Purger -#: lang/json/bionic_from_json.py -msgid "" -"Triggers an emergency reactor fuel purge that ejects all fuel from your " -"reactor." -msgstr "" - #. ~ Description for Bionic Visual Impairment #: lang/json/bionic_from_json.py msgid "" @@ -79243,18 +79677,6 @@ msgid "" "amount of unarmed slashing damage whenever your fingertips are uncovered." msgstr "" -#: lang/json/bionic_from_json.py -msgid "Microreactor System" -msgstr "Sistema de Microreactor" - -#. ~ Description for Microreactor System -#: lang/json/bionic_from_json.py -msgid "" -"This stripped down mini-reactor generates impressive amounts of bionic " -"power. There is no way to shut it down, but you can toggle additional fuel " -"intake. Irradiates your body when active." -msgstr "" - #: lang/json/bionic_from_json.py msgid "Recycler Unit" msgstr "Unidad de Reciclado" @@ -79696,6 +80118,52 @@ msgid "" "artificial but effective sensation of fatigue." msgstr "" +#: lang/json/bionic_from_json.py +msgid "Advanced Microreactor System" +msgstr "Sistema Mejorado de Microreactor" + +#. ~ Description for Advanced Microreactor System +#: lang/json/bionic_from_json.py +msgid "" +"This stripped down mini-reactor is more efficient and safer than the base " +"model due to integrated radiation cleansers. There is no way to shut it " +"down once active, but you can toggle additional fuel intake." +msgstr "" + +#: lang/json/bionic_from_json.py +msgid "Plutonium Filter" +msgstr "Filtro de Plutonio" + +#. ~ Description for Plutonium Filter +#: lang/json/bionic_from_json.py +msgid "" +"This set of tanks and filters allows you to extract plutonium from " +"radioactive slurry." +msgstr "" + +#: lang/json/bionic_from_json.py +msgid "Plutonium Purger" +msgstr "Purificador de Plutonio" + +#. ~ Description for Plutonium Purger +#: lang/json/bionic_from_json.py +msgid "" +"Triggers an emergency reactor fuel purge that ejects all fuel from your " +"reactor." +msgstr "" + +#: lang/json/bionic_from_json.py +msgid "Microreactor System" +msgstr "Sistema de Microreactor" + +#. ~ Description for Microreactor System +#: lang/json/bionic_from_json.py +msgid "" +"This stripped down mini-reactor generates impressive amounts of bionic " +"power. There is no way to shut it down, but you can toggle additional fuel " +"intake. Irradiates your body when active." +msgstr "" + #: lang/json/bionic_from_json.py msgid "Internal Furnace" msgstr "Horno Interno" @@ -79822,9 +80290,7 @@ msgstr "Te cuesta más esquivar y combatir cuerpo a cuerpo." #: lang/json/bodypart_from_json.py src/armor_layers.cpp src/character.cpp #: src/debug_menu.cpp msgid "Torso" -msgid_plural "Torso" -msgstr[0] "Torso" -msgstr[1] "Torsos" +msgstr "Torsos" #. ~ Crafting recipes subcategory of 'ARMOR' category #: lang/json/bodypart_from_json.py lang/json/recipe_category_from_json.py @@ -79843,9 +80309,7 @@ msgstr "cabeza" #: lang/json/bodypart_from_json.py src/armor_layers.cpp src/character.cpp #: src/debug_menu.cpp msgid "Head" -msgid_plural "Head" -msgstr[0] "Cabeza" -msgstr[1] "Cabezas" +msgstr "Cabezas" #. ~ Crafting recipes subcategory of 'ARMOR' category #: lang/json/bodypart_from_json.py lang/json/recipe_category_from_json.py @@ -79867,9 +80331,7 @@ msgstr "Te cuesta más el combate a distancia." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "Eyes" -msgid_plural "Eyes" -msgstr[0] "Ojos" -msgstr[1] "Ojos" +msgstr "Ojos" #: lang/json/bodypart_from_json.py msgid "mouth" @@ -79886,9 +80348,7 @@ msgstr "Corrés más lento." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "Mouth" -msgid_plural "Mouth" -msgstr[0] "Boca" -msgstr[1] "Bocas" +msgstr "Bocas" #: lang/json/bodypart_from_json.py msgid "left arm" @@ -79899,15 +80359,26 @@ msgctxt "bodypart_accusative" msgid "left arm" msgstr "brazo izquierdo" +#: lang/json/bodypart_from_json.py +msgid "arms" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "arms" +msgstr "" + #: lang/json/bodypart_from_json.py msgid "Melee and ranged combat is hampered." msgstr "Te cuesta más el combate a distancia y cuerpo a cuerpo." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Arm" -msgid_plural "Arms" -msgstr[0] "Brazo Izq." -msgstr[1] "Brazos" +msgstr "Bra Izq." + +#: lang/json/bodypart_from_json.py +msgid "Arms" +msgstr "Brazos" #: lang/json/bodypart_from_json.py msgid "L ARM" @@ -79924,9 +80395,7 @@ msgstr "brazo derecho" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Arm" -msgid_plural "Arms" -msgstr[0] "Brazo Der." -msgstr[1] "Brazos" +msgstr "Bra Der." #: lang/json/bodypart_from_json.py msgid "R ARM" @@ -79941,15 +80410,26 @@ msgctxt "bodypart_accusative" msgid "left hand" msgstr "mano izquierda" +#: lang/json/bodypart_from_json.py +msgid "hands" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "hands" +msgstr "" + #: lang/json/bodypart_from_json.py msgid "Manual tasks are slowed." msgstr "Las tareas manuales serán más lentas." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Hand" -msgid_plural "Hands" -msgstr[0] "Mano Izq." -msgstr[1] "Manos" +msgstr "Mano Izq." + +#: lang/json/bodypart_from_json.py +msgid "Hands" +msgstr "Manos" #: lang/json/bodypart_from_json.py msgid "right hand" @@ -79962,9 +80442,7 @@ msgstr "mano derecha" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Hand" -msgid_plural "Hands" -msgstr[0] "Mano Der." -msgstr[1] "Manos" +msgstr "Mano Der." #: lang/json/bodypart_from_json.py msgid "left leg" @@ -79975,15 +80453,26 @@ msgctxt "bodypart_accusative" msgid "left leg" msgstr "pierna izquierda" +#: lang/json/bodypart_from_json.py +msgid "legs" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "legs" +msgstr "" + #: lang/json/bodypart_from_json.py msgid "Running and swimming are slowed." msgstr "Nadás y corrés más lento." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Leg" -msgid_plural "Legs" -msgstr[0] "Pierna Izq." -msgstr[1] "Piernas" +msgstr "Prn Izq." + +#: lang/json/bodypart_from_json.py +msgid "Legs" +msgstr "Piernas" #: lang/json/bodypart_from_json.py msgid "L LEG" @@ -80000,9 +80489,7 @@ msgstr "pierna derecha" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Leg" -msgid_plural "Legs" -msgstr[0] "Pierna Der." -msgstr[1] "Piernas" +msgstr "Prn Der." #: lang/json/bodypart_from_json.py msgid "R LEG" @@ -80017,11 +80504,22 @@ msgctxt "bodypart_accusative" msgid "left foot" msgstr "pie izquierdo" +#: lang/json/bodypart_from_json.py +msgid "feet" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "feet" +msgstr "" + #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Foot" -msgid_plural "Feet" -msgstr[0] "Pie Izq." -msgstr[1] "Pies" +msgstr "Pie Izq." + +#: lang/json/bodypart_from_json.py +msgid "Feet" +msgstr "Pies" #: lang/json/bodypart_from_json.py msgid "right foot" @@ -80034,15 +80532,11 @@ msgstr "pie drecho" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Foot" -msgid_plural "Feet" -msgstr[0] "Pie Der." -msgstr[1] "Pies" +msgstr "Pie Der." #: lang/json/bodypart_from_json.py msgid "appendix" -msgid_plural "Appendices" -msgstr[0] "Apéndice" -msgstr[1] "Apéndices" +msgstr "apéndice" #: lang/json/bodypart_from_json.py msgctxt "bodypart_accusative" @@ -80053,6 +80547,10 @@ msgstr "apéndice" msgid "It's inflamed." msgstr "Está inflamado." +#: lang/json/bodypart_from_json.py +msgid "Appendices" +msgstr "Apéndices" + #: lang/json/clothing_mod_from_json.py msgid "Pad with leather" msgstr "Rellenar con cuero" @@ -84134,7 +84632,7 @@ msgstr "" #. ~ Miss message for effect(s) 'Stimulant Overdose'. #: lang/json/effects_from_json.py msgid "You shake with the excess stimulation." -msgstr "Temblás por el exceso de estimulación." +msgstr "Tiemblas por el exceso de estimulación." #: lang/json/effects_from_json.py msgid "Took weak antibiotic" @@ -88610,7 +89108,7 @@ msgstr "Activás el mecanismo..." #. ~ 'close' action message of some gate object. #: lang/json/gates_from_json.py msgid "The bolts slide back into place." -msgstr "" +msgstr "Los pestillos se deslizan de vuelta a su lugar." #. ~ 'fail' action message of some gate object. #: lang/json/gates_from_json.py @@ -88937,7 +89435,9 @@ msgstr "" "debido a su tamaño pequeño y corto tensado. Los pernos disparados con esta " "arma tienen una gran probabilidad de no romperse." -#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py src/item.cpp +#: lang/json/gun_from_json.py lang/json/gun_from_json.py +#: lang/json/gunmod_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gunmod_from_json.py src/item.cpp msgctxt "gun_type_type" msgid "pistol" msgstr "pistola" @@ -89032,8 +89532,8 @@ msgstr[1] "pistolas de ácido" #: lang/json/gun_from_json.py msgid "reach bow" msgid_plural "reach bows" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "arco de alcance" +msgstr[1] "arcos de alcance" #: lang/json/gun_from_json.py msgid "A test item that is both a ranged weapon and a reach weapon" @@ -89070,6 +89570,20 @@ msgstr "" "una pequeña bomba al costado le permite represurizarlo, aunque este proceso " "tarda unos minutos." +#: lang/json/gun_from_json.py +msgid "simple flamethrower" +msgid_plural "simple flamethrowers" +msgstr[0] "lanzallamas simple" +msgstr[1] "lanzallamas simples" + +#: lang/json/gun_from_json.py +msgid "" +"A simple, home-made flamethrower. While its capacity is not superb, it is " +"more than capable of igniting terrain and monsters alike." +msgstr "" +"Un lanzallamas simple, hecho en casa. Aunque su capacidad no es muy buena, " +"es más que capaz de prender fuego el terreno y los monstruos." + #: lang/json/gun_from_json.py msgid "BB gun" msgid_plural "BB guns" @@ -89743,6 +90257,19 @@ msgid "" "safety issues." msgstr "" +#: lang/json/gun_from_json.py +msgid "Walther P22" +msgid_plural "Walther P22s" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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" +msgstr "" + #: lang/json/gun_from_json.py msgid "Remington ACR" msgid_plural "Remington ACRs" @@ -90406,8 +90933,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "Savage 111F" msgid_plural "Savage 111F" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Savage 111F" +msgstr[1] "Savage 111F" #: lang/json/gun_from_json.py msgid "" @@ -90754,6 +91281,20 @@ msgid "" " make for a moderately poor handling pistol." msgstr "" +#: lang/json/gun_from_json.py +msgid "Hi-Point CF-380" +msgid_plural "Hi-Point CF-380s" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "M1911A1" msgid_plural "M1911A1s" @@ -90847,6 +91388,47 @@ msgstr "" "La Smith & Wesson 610 es un revólver clásico de seis disparos para balas " "calibre 10mm, o para las propias de la marca S$W, el calibre .40." +#: lang/json/gun_from_json.py +msgid "Browning Hi-Power .40 S&W" +msgid_plural "Browning Hi-Power .40 S&Ws" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Browning Hi-Power is a semi-automatic handgun developed shortly before " +"the second world war. Widely issued since then, it remains in use by India, " +"Canada and Australia. This is a commercial variant produced by Browning Arms" +" in .40 S&W." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther PPQ .40 S&W" +msgid_plural "Walther PPQ .40 S&Ws" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in .40 S&W." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Hi-Point Model JCP" +msgid_plural "Hi-Point Model JCPs" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "tube 40mm launcher" msgid_plural "tube 40mm launchers" @@ -91201,6 +91783,33 @@ msgid_plural "USP .45s" msgstr[0] "" msgstr[1] "" +#: lang/json/gun_from_json.py +msgid "Walther PPQ .45 ACP" +msgid_plural "Walther PPQ .45 ACPs" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in .45 ACP." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Hi-Point Model JHP" +msgid_plural "Hi-Point Model JHPs" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "Taurus Raging Bull" msgid_plural "Taurus Raging Bull" @@ -92192,6 +92801,94 @@ msgid "" "SIG Sauer P320." msgstr "" +#: lang/json/gun_from_json.py +msgid "Browning Hi-Power 9x19mm" +msgid_plural "Browning Hi-Power 9x19mms" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Browning Hi-Power is a semi-automatic handgun developed shortly before " +"the second world war. Widely issued since then, it remains in use by India, " +"Canada and Australia. This is a commercial variant produced by Browning Arms" +" in 9x19mm Parabellum." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther P38" +msgid_plural "Walther P38s" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther PPQ 9mm" +msgid_plural "Walther PPQ 9mms" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in 9x19mm Parabellum." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Hi-Point C-9" +msgid_plural "Hi-Point C-9s" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "CZ-75" +msgid_plural "CZ-75s" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The CZ-75 is a semi-automatic pistol developed in Czechoslovakia, and is one" +" of the original wonder nines. Though designed for export to western " +"countries, it was declared a state secret; lack of international patent " +"protection meant that many clones and variants were produced and distributed" +" around the world, with Česká zbrojovka only joining in the 90's. This " +"pistol remains wildly popular among competition shooters." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther CCP" +msgid_plural "Walther CCPs" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "Makarov PM" msgid_plural "Makarov PMs" @@ -92293,20 +92990,6 @@ msgstr "" "Un lanzallamas grande con grandes reservas de combustible. Muy amenazante y " "mortal." -#: lang/json/gun_from_json.py -msgid "simple flamethrower" -msgid_plural "simple flamethrowers" -msgstr[0] "lanzallamas simple" -msgstr[1] "lanzallamas simples" - -#: lang/json/gun_from_json.py -msgid "" -"A simple, home-made flamethrower. While its capacity is not superb, it is " -"more than capable of igniting terrain and monsters alike." -msgstr "" -"Un lanzallamas simple, hecho en casa. Aunque su capacidad no es muy buena, " -"es más que capaz de prender fuego el terreno y los monstruos." - #: lang/json/gun_from_json.py msgid "RM451 flamethrower" msgid_plural "RM451 flamethrowers" @@ -92435,6 +93118,16 @@ msgstr "" "fuerza de Lorentz generada por la inducción electromagnética. Se alimenta " "con un UPS normal." +#: lang/json/gun_from_json.py +msgid "barb launching organ" +msgid_plural "barb launching organs" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "A mutated organ capable of launching bony barbs at great speed." +msgstr "" + #: lang/json/gun_from_json.py msgid "coilgun" msgid_plural "coilguns" @@ -93078,6 +93771,19 @@ msgstr "" "objetivos. La energía disparada incendia el oxígeno creando fuego mientras " "se va moviendo y explotando al impactar." +#: lang/json/gun_from_json.py +msgid "Yeet Cannon" +msgid_plural "Yeet Cannons" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"You can YEET all the bullets with this baby. YEET them right into all of the" +" zombies in your path, all the hulks, the spiders, and those damned mole " +"rats." +msgstr "" + #: lang/json/gun_from_json.py msgid "SVS-24" msgid_plural "SVS-24" @@ -94652,8 +95358,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "perforator" msgid_plural "perforators" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "perforadora" +msgstr[1] "perforadoras" #: lang/json/gun_from_json.py msgid "" @@ -94974,27 +95680,6 @@ msgid "" "cartridges." msgstr "" -#: lang/json/gunmod_from_json.py -msgid ".300 AAC Blackout caliber conversion kit" -msgid_plural ".300 AAC Blackout caliber conversion kits" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/gunmod_from_json.py -msgid "" -"This kit is used to convert an AR-15 .223/5.56mm rifle to the new .300BLK " -"caliber." -msgstr "" - -#: lang/json/gunmod_from_json.py -msgid "bore" -msgstr "calibre" - -#: lang/json/gunmod_from_json.py -msgctxt "gun_type_type" -msgid "ar15" -msgstr "" - #: lang/json/gunmod_from_json.py msgid "barrel extension" msgid_plural "barrel extensions" @@ -95094,6 +95779,10 @@ msgstr "" ".40, 5.7mm, 4.6mm, 7.62x39mm o .223, lo convierte en un .22. Esta conversión" " reduce un poco la precisión." +#: lang/json/gunmod_from_json.py +msgid "bore" +msgstr "calibre" + #: lang/json/gunmod_from_json.py msgid ".223 caliber conversion kit" msgid_plural ".223 caliber conversion kits" @@ -95445,6 +96134,36 @@ msgstr "" "Es una bolsa que cuelga a un costado del arma y recolecta los casquillos " "eyectadas, así no tienes que levantarlas." +#: lang/json/gunmod_from_json.py +msgid ".300 AAC Blackout AR-15 conversion kit" +msgid_plural ".300 AAC Blackout AR-15 conversion kits" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gunmod_from_json.py +msgid "A complete AR-15 upper assembly with a .300 AAC Blackout barrel." +msgstr "" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "ar15" +msgstr "" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "m4a1" +msgstr "" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "h&k416a5" +msgstr "" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "m27iar" +msgstr "" + #: lang/json/gunmod_from_json.py msgid "lightweight replacement furniture" msgid_plural "lightweight replacement furnitures" @@ -97653,11 +98372,11 @@ msgstr "" #: lang/json/help_from_json.py msgid "" -"While magazines are often firearm-specific, on some occasions a magazine is compatible with several other firearms. The firearms in the game often reflect real-world prototypes in terms of caliber and compatibility. Below are some examples of interchangeable ammo:\n" -".308 = 7.62x51mm,\n" -".223 = 5.56 NATO,\n" -".270 = .30-06,\n" -".40 S&W = 10mm." +"While magazines and clips are often firearm-specific, on some occasions a magazine/speedloader is compatible with several other firearms or calibers. Below are some examples of calibers that might share magazines or speedloaders:\n" +".380 ACP and 9mm Luger,\n" +" .40 S&W and 10mm Auto 3\n" +".45 ACP and .460 Rowland,\n" +".45 Colt and .454 Casull." msgstr "" #: lang/json/help_from_json.py @@ -98768,8 +99487,9 @@ msgid "Measure radiation" msgstr "Medir radiación" #: lang/json/item_action_from_json.py lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py #: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py -#: lang/json/talk_topic_from_json.py src/game_inventory.cpp +#: src/game_inventory.cpp msgid "..." msgstr "..." @@ -98831,11 +99551,15 @@ msgid "Well, you know" msgstr "Bueno, ya sabes" #: lang/json/item_action_from_json.py -msgid "Wash clothes" -msgstr "Lavar ropa" +msgid "Wash soft items" +msgstr "" + +#: lang/json/item_action_from_json.py +msgid "Wash hard items" +msgstr "" #: lang/json/item_action_from_json.py -msgid "Wash CBMs" +msgid "Wash items" msgstr "" #: lang/json/item_action_from_json.py @@ -101842,7 +102566,7 @@ msgstr "" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "STRAWBERRY" -msgstr "" +msgstr "FRESA" #. ~ Sign #: lang/json/mapgen_from_json.py @@ -102435,6 +103159,41 @@ msgstr "¡Amplia variedad de baterías de almacenamiento! ¡Descuentos!" msgid "the name is gone but a slogan remains: 'We'll repair you all the way'" msgstr "el nombre ya no está pero quedó el slogan: 'Te vamos a reparar todo'" +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "EnviroCom OS v2.03 - Basement Access" +msgstr "" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Unlock stairs" +msgstr "Abrir escaleras" + +#. ~ Sign +#: lang/json/mapgen_from_json.py +msgid "Authorized personnel only" +msgstr "" + +#. ~ Sign +#: lang/json/mapgen_from_json.py +msgid " sewage treatment plant" +msgstr "" + +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "EnviroCom OS v2.03" +msgstr "EnviroCom OS v2.03" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Download Sewer Maps" +msgstr "Descargar Mapas de Cloacas" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Divert sample" +msgstr "Desviar muestra" + #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Evac shelter computer" @@ -103043,6 +103802,43 @@ msgid "" "Blocked damage reduced by 50%% of Dexterity." msgstr "" +#. ~ Description for martial art 'Fior Di Battaglia' +#: lang/json/martial_art_from_json.py +msgid "" +"Medieval Europe's martial techniques for fighting with polearms. The " +"\"Flower of Battle\" places great focus on countering one's opponent and " +"knocking them down before landing a killing blow" +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stand Your Ground" +msgstr "" + +#. ~ Description of buff 'Stand Your Ground' for martial art 'Fior Di +#. Battaglia' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You stalwart and will not budge against any threat.\n" +"\n" +"+2 Block attempts, -1.0 Dodge skill, blocked damage reduced by 50%% of Strength." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Tactical Retreat" +msgstr "" + +#. ~ Description of buff 'Tactical Retreat' for martial art 'Fior Di +#. Battaglia' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You moved and nullified the effects of Stand Your Ground!\n" +"\n" +"-2 Block attempts, +1.0 Dodge skill, blocked damaged increased by 50%% of Strength.\n" +"Lasts 1 turn." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Karate" msgstr "Karate" @@ -103523,35 +104319,6 @@ msgstr "" msgid "Perception increases dodging ability, +1 dodges per turn" msgstr "" -#. ~ Description for martial art 'Fior Di Battaglia' -#: lang/json/martial_art_from_json.py -msgid "" -"Medieval Europe's martial techniques for fighting with polearms, great focus" -" is given in countering one's opponent and knocking them down before landing" -" a killing blow" -msgstr "" - -#: lang/json/martial_art_from_json.py -msgid "Stand Your Ground" -msgstr "" - -#. ~ Description of buff 'Stand Your Ground' for martial art 'Fior Di -#. Battaglia' -#: lang/json/martial_art_from_json.py -msgid "" -"+2 blocks -1 dodge, halves your dodge and damage is reduced by your strength" -" when blocking" -msgstr "" - -#: lang/json/martial_art_from_json.py -msgid "You moved" -msgstr "" - -#. ~ Description of buff 'You moved' for martial art 'Fior Di Battaglia' -#: lang/json/martial_art_from_json.py -msgid "Nullifies Stand Your Ground, don't move, stand there and counter!" -msgstr "" - #: lang/json/martial_art_from_json.py msgid "Medieval Swordsmanship" msgstr "Manejo de Espada Medieval" @@ -105435,39 +106202,6 @@ msgstr "¡Muchísimas gracias por encontrarlo!" msgid "Oh no! My poor puppy..." msgstr "¡Oh, no! Mi perrito..." -#: lang/json/mission_def_from_json.py -msgid "Find 100 Cigarettes" -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "Come on man, I just need a smoke." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "" -"With all that's been going on, it's been more and more difficult to find a " -"smoke. My stash has been running low for a while now. Think you could help" -" me out here? A few packs is all I need." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "Thanks, it's great to see someone willing to help a guy out." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "" -"Plenty of smokers in towns. Gotta be some left over cigs in some of them " -"houses." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "Got the smokes?" -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "Thanks! I'll be sure to put in a good word for you around the center." -msgstr "" - #: lang/json/mission_def_from_json.py msgid "Break into armory to retrieve family photo" msgstr "" @@ -106750,7 +107484,7 @@ msgid "" msgstr "" #: lang/json/mission_def_from_json.py -msgid "Find 50 3L jars" +msgid "In a Pickle Pt. 2" msgstr "" #: lang/json/mission_def_from_json.py @@ -106779,6 +107513,39 @@ msgid "" "payment." msgstr "" +#: lang/json/mission_def_from_json.py +msgid "Smokes, let's go." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Come on man, I just need a smoke." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"With all that's been going on, it's been more and more difficult to find a " +"smoke. My stash has been running low for a while now. Think you could help" +" me out here? A few packs is all I need." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Thanks, it's great to see someone willing to help a guy out." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Plenty of smokers in towns. Gotta be some left over cigs in some of them " +"houses." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Got the smokes?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Thanks! I'll be sure to put in a good word for you around the center." +msgstr "" + #: lang/json/mission_def_from_json.py msgid "Clear Back Bay" msgstr "Limpiar Plataforma de Atrás" @@ -106893,7 +107660,7 @@ msgid "" msgstr "" #: lang/json/mission_def_from_json.py -msgid "Find 10 solar panels" +msgid "Solar Power" msgstr "" #: lang/json/mission_def_from_json.py @@ -106921,7 +107688,7 @@ msgid "" msgstr "" #: lang/json/mission_def_from_json.py -msgid "Find 100 canning jars" +msgid "In a Pickle" msgstr "" #: lang/json/mission_def_from_json.py @@ -107174,8 +107941,8 @@ msgid "Thank you, I'll do the explaining if anyone else asks about it." msgstr "Gracias, yo voy a explicar todo si alguien pregunta." #: lang/json/mission_def_from_json.py -msgid "Kill ???" -msgstr "¿¿¿ Matar ???" +msgid "Secure Trade Route" +msgstr "" #: lang/json/mission_def_from_json.py msgid "" @@ -107207,8 +107974,8 @@ msgid "Great work, wasn't sure what I was sending you after." msgstr "" #: lang/json/mission_def_from_json.py -msgid "Kill Raider Leader" -msgstr "Matar Líder Pirata" +msgid "Assassinate Raider Leader" +msgstr "" #: lang/json/mission_def_from_json.py msgid "" @@ -107329,8 +108096,8 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" -"Remember, do extraction /exactly/ as specified, otherwise the bionic will " -"self-destruct." +"Remember, perform the extraction /exactly/ as specified, otherwise the " +"bionic will self-destruct." msgstr "" #: lang/json/mission_def_from_json.py @@ -107354,6 +108121,37 @@ msgstr "" msgid "You have our thanks and payment." msgstr "" +#: lang/json/mission_def_from_json.py +msgid "Light retrieval" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Our facility once sourced advanced photonic circuitry from a nearby robotics manufacturer. Their building suffered major damage during the portal storms, and collapsed almost entirely. However, preliminary scouting reveals that the basement prototyping lab likely remains intact.\n" +"\n" +"the intercom: We ask you to investigate the ruins, and if possible, retrieve a template for the fabrication of said photonic circuitry." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "We expect your success, mercenary." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Return if you change your mind." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"The scout drone also revealed extensive heat signatures and high " +"concentrations of toxic compounds within the ruins, plan accordingly. We " +"are willing to sell you some protective gear at a discount, if you require " +"it." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Have you retrieved the blueprints?" +msgstr "" + #: lang/json/mission_def_from_json.py msgid "Make 2 Stills" msgstr "Hacer 2 Destiladores" @@ -110531,6 +111329,8 @@ msgid "" "There's nothing quite like the smell of a good book! Books are more fun (or" " less boring) for you!" msgstr "" +"¡No hay nada comparable con el olor de un buen libro! ¡Los libros te " +"resultan más divertidos (o menos aburridos)!" #: lang/json/mutation_from_json.py msgid "Addiction Resistant" @@ -111398,7 +112198,7 @@ msgstr "Narcoléptico" #. ~ Description for Narcoleptic #: lang/json/mutation_from_json.py msgid "You randomly fall asleep without any reason." -msgstr "" +msgstr "Sin razón alguna, a veces te quedás dormido." #: lang/json/mutation_from_json.py msgid "Clumsy" @@ -113538,6 +114338,10 @@ msgid "" "top of the food chain. You can effortlessly master and maintain combat " "skills, but your critical thinking has atrophied further." msgstr "" +"Tu mente y cerebro se han adaptado a tu nuevo lugar en el mundo: el de uno " +"en la punta de la pirámide alimenticia. Sin esfuerzo, podés perfeccionar y " +"mantener tus habilidades de combate, pero tu pensamiento crítico se ha " +"atrofiado aún más." #: lang/json/mutation_from_json.py msgid "Sapiovore" @@ -117258,7 +118062,7 @@ msgstr "Sin clase" #: lang/json/npc_class_from_json.py msgid "I'm just wandering." -msgstr "" +msgstr "Solo estoy dando vueltas." #: lang/json/npc_class_from_json.py msgid "Debug Dude" @@ -118671,6 +119475,10 @@ msgstr "" msgid "sugar house roof" msgstr "" +#: lang/json/overmap_terrain_from_json.py +msgid "rural road" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "farm field" msgstr "sembradío" @@ -119995,7 +120803,7 @@ msgstr "cárcel" #: lang/json/overmap_terrain_from_json.py msgid "post office" -msgstr "" +msgstr "correo" #: lang/json/overmap_terrain_from_json.py msgid "post office roof" @@ -120495,8 +121303,16 @@ msgid "parking garage" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "sewage treatment" -msgstr "tratamiento de aguas cloacales" +msgid "sewage treatment plant" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment plant roof" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment plant - underground" +msgstr "" #: lang/json/overmap_terrain_from_json.py msgid "toxic waste dump" @@ -120696,7 +121512,7 @@ msgstr "" #: lang/json/overmap_terrain_from_json.py msgid "arms room" -msgstr "" +msgstr "sala de armas" #: lang/json/overmap_terrain_from_json.py msgid "dining facility" @@ -120803,6 +121619,10 @@ msgstr "" msgid "mechanics garage" msgstr "" +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment" +msgstr "tratamiento de aguas cloacales" + #: lang/json/overmap_terrain_from_json.py msgid "mechanic garage" msgstr "" @@ -121799,6 +122619,34 @@ msgstr "" "No estás muy segura de lo que pasó, pero todo se fue a la mierda y la única " "cosa que se te pasa por la cabeza es dónde conseguir un chute más." +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Pillhead" +msgstr "" + +#. ~ Profession (male Pillhead) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"After an accident in your youth, you got addicted to the opiates treating " +"your pain. With the pharmacies shut down and dealers turned undead, " +"satisfying your fix just got a lot more difficult." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Pillhead" +msgstr "" + +#. ~ Profession (female Pillhead) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"After an accident in your youth, you got addicted to the opiates treating " +"your pain. With the pharmacies shut down and dealers turned undead, " +"satisfying your fix just got a lot more difficult." +msgstr "" + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "K9 Officer" @@ -128279,7 +129127,6 @@ msgid "WEAPON" msgstr "ARMA" #. ~ Crafting recipes subcategory all -#. ~ Crafting recipes subcategory of 'ENCHANTED' category #: lang/json/recipe_category_from_json.py #: lang/json/recipe_category_from_json.py src/crafting_gui.cpp msgid "ALL" @@ -129333,7 +130180,7 @@ msgstr "Inspeccionar el terreno para poner un negocio de productos de granja." #: lang/json/recipe_from_json.py msgid "Plowing a few plots should get us started." -msgstr "" +msgstr "Si aramos algunas áreas ya podríamos empezar." #: lang/json/recipe_from_json.py msgid "We could use a farming shed to store resources where we'll be working." @@ -129392,7 +130239,7 @@ msgstr "" #: lang/json/recipe_from_json.py msgid "Building a cook-shack is our first task." -msgstr "" +msgstr "Construir un cuarto para la cocina es nuestra primera tarea." #: lang/json/recipe_from_json.py msgid "We need to finish framing the walls for the cook-shack." @@ -131645,10 +132492,8 @@ msgid "" msgstr "" #: lang/json/snippet_from_json.py -msgid "Wounds heal over time. Bandages and disinfectant speeds that up." +msgid "Wounds heal over time. Bandages and antiseptic speeds that up." msgstr "" -"Las heridas sanan con el tiempo. Las vendas y el desinfectante aceleran el " -"proceso." #: lang/json/snippet_from_json.py msgid "Don't get grabbed by zombies. Their bites can be infectious." @@ -132525,8 +133370,8 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "" -"If you have extra disinfectant, use it to disinfect your wounds, even if " -"they aren't infected. They will recover faster that way." +"If you have extra antiseptic, use it to disinfect your wounds, even if they " +"aren't infected. They will recover faster that way." msgstr "" #: lang/json/snippet_from_json.py @@ -139572,17 +140417,6 @@ msgstr "" "sus trabajos, su país, incluso su vida... claro que algunos van a recurrir a" " las drogas,\" dijo un experto." -#: lang/json/snippet_from_json.py -msgid "" -"WAR ON DRUGS DEAD: The government has finally reacted to long accumulated " -"evidence that suggests that decriminalized drugs cause fewer health problems" -" and are generally better managed while providing valuable tax revenues." -msgstr "" -"TERMINÓ LA GUERRA CONTRA LAS DROGAS: El gobierno ha reaccionado finalmente a" -" la evidencia acumulada por mucho tiempo que sugiere que las drogas " -"despenalizadas causan menos problemas de salud y son generalmente mejor " -"manejadas a la vez que proveen ganancias a través de los impuestos." - #: lang/json/snippet_from_json.py msgid "" "FEELING BLUE? Try \"Greens\" for Magazines! Your local Supermarket! " @@ -144205,7 +145039,7 @@ msgstr "\"Bip Bip. Whirr.\"" #: lang/json/speech_from_json.py msgid "\"Vrrrr Hrrrmmm.\"" -msgstr "" +msgstr "\"Vrrrr Hrrrmmm.\"" #: lang/json/speech_from_json.py msgid "\"Whirrrrr-click click.\"" @@ -144670,8 +145504,7 @@ msgid "" "Bionics are augmentation packages, right? They come in these installable Compact Bionic Modules or CBMs, and I can use some CBMs - if you examine a CBM, it will tell you if I can use it.\n" " Find a programmable surgical installer or autodoc, position me on the couch, and activate it, and you can install a suitable CBM to me - or if I think I'll do a better job, I'll do. I'll take over installing CBMs into you if I'm better at it.\n" " I can use almost all passive bionics and some active bionics. If I have any active bionics, I'll try to use them sensibly, but if we're in danger, I'm going to activate anything that might give me an edge. I'll use any weapon bionics if they're better than the weapons you gave me, but if you think I should reserve my bionic energy for my defensive and healing bionics, you can tell me how much to reserve. I'll try to keep my bionic energy topped off, but if we're running low on supplies, you can tell me to stop recharging when I'm not full.\n" -" I'll tell you if I'm low on bionic energy and can't recharge, and what fuel I need.\n" -" Sothere are some internal atomic reactor bionics - I can use those, but I can only recharge them with plutonium slurry. That stuff is radioactive, so do us both a favor and don't give me an internal reactor unless you really like glowing in the dark." +" I'll tell you if I'm low on bionic energy and can't recharge, and what fuel I need." msgstr "" #: lang/json/talk_topic_from_json.py @@ -144851,11 +145684,11 @@ msgid "Go back to sleep." msgstr "Vuelve a dormir." #: lang/json/talk_topic_from_json.py -msgid " *pshhhttt* I'm reading you boss, over." +msgid "What is it, friend?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "What is it, friend?" +msgid " *pshhhttt* I'm reading you boss, over." msgstr "" #: lang/json/talk_topic_from_json.py @@ -145094,11 +145927,11 @@ msgid "Show me what needs to be done at the camp." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I'm currently ." +msgid "I'm not doing much currently." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I'm not doing much currently." +msgid "I'm currently ." msgstr "" #: lang/json/talk_topic_from_json.py @@ -145153,13 +145986,13 @@ msgid "OK, maybe it'll stop me from freezing in this weather, what's up?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "" -"Well, it's the time of day for a quick break surely! How are you holding " -"up?" +msgid "Man it's dark out isn't it? what's up?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Man it's dark out isn't it? what's up?" +msgid "" +"Well, it's the time of day for a quick break surely! How are you holding " +"up?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -145168,14 +146001,14 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Definitely, by the way, thanks for helping me so much with my tasks! " -"Anyway, you coping OK, ? " +"OK, let's take a moment, oh, and thanks for helping me with that thing, " +"so... what's up?" msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"OK, let's take a moment, oh, and thanks for helping me with that thing, " -"so... what's up?" +"Definitely, by the way, thanks for helping me so much with my tasks! " +"Anyway, you coping OK, ? " msgstr "" #: lang/json/talk_topic_from_json.py @@ -145251,14 +146084,14 @@ msgstr "Bueno, sin hacer movimientos repentinos..." msgid "Keep your distance!" msgstr "¡Quédate lejos!" -#: lang/json/talk_topic_from_json.py -msgid "" -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "This is my territory, ." msgstr "Este es mi territorio, ." +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Calm down. I'm not going to hurt you." msgstr "" @@ -145311,14 +146144,6 @@ msgstr "¿Qué pasa?" msgid "I don't care." msgstr "No me importa." -#: lang/json/talk_topic_from_json.py -msgid "I don't have any jobs for you." -msgstr "No tengo ningún trabajo para ti." - -#: lang/json/talk_topic_from_json.py -msgid "I don't have any more jobs for you." -msgstr "No tengo ningún otro trabajo para ti." - #: lang/json/talk_topic_from_json.py msgid "I have other jobs for you. Want to hear about them?" msgstr "" @@ -145327,13 +146152,21 @@ msgstr "" msgid "I have more jobs for you. Want to hear about them?" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "I just have one job for you. Want to hear about it?" +msgstr "Tengo un trabajo para ti. ¿Quieres que te cuente?" + #: lang/json/talk_topic_from_json.py msgid "I have another job for you. Want to hear about it?" msgstr "Tengo otro trabajo para ti. ¿Quieres que te cuente?" #: lang/json/talk_topic_from_json.py -msgid "I just have one job for you. Want to hear about it?" -msgstr "Tengo un trabajo para ti. ¿Quieres que te cuente?" +msgid "I don't have any more jobs for you." +msgstr "No tengo ningún otro trabajo para ti." + +#: lang/json/talk_topic_from_json.py +msgid "I don't have any jobs for you." +msgstr "No tengo ningún trabajo para ti." #: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py #: src/npctalk.cpp @@ -145345,16 +146178,16 @@ msgid "Never mind, I'm not interested." msgstr "No importa, no estoy interesado." #: lang/json/talk_topic_from_json.py -msgid "You're not working on anything for me now." -msgstr "" +msgid "What about it?" +msgstr "¿Qué te parece?" #: lang/json/talk_topic_from_json.py msgid "Which job?" msgstr "¿Cuál trabajo?" #: lang/json/talk_topic_from_json.py -msgid "What about it?" -msgstr "¿Qué te parece?" +msgid "You're not working on anything for me now." +msgstr "" #: lang/json/talk_topic_from_json.py msgid "I'll do it!" @@ -145872,7 +146705,7 @@ msgstr "Bueno, está bien, chao." #: lang/json/talk_topic_from_json.py msgid "Okay" -msgstr "" +msgstr "Bueno." #: lang/json/talk_topic_from_json.py msgid "" @@ -147950,7 +148783,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "It's good you found your calling. " -msgstr "" +msgstr "Qué bueno que encontraste tu vocación. " #: lang/json/talk_topic_from_json.py msgid "It's good you found your calling. " @@ -148102,6 +148935,10 @@ msgid "" "horrible things came out of them. I decided it was safer in my locked up " "house." msgstr "" +"No. El llamado llegó demasiado tarde. Ya había visto las nubes en el " +"horizonte. Nubes con forma de hongo, y también esas nubes infernales. " +"Escuché esas horribles cosas que vienen de allí. Decidí que era más seguro " +"encerrarme en la casa." #: lang/json/talk_topic_from_json.py msgid "Something must have happened to drive you out?" @@ -148930,7 +149767,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "I guess they didn't know." -msgstr "" +msgstr "Supongo que no pudieron decirte nada." #: lang/json/talk_topic_from_json.py msgid "" @@ -150885,7 +151722,7 @@ msgid "All right! Let's get going." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "We've done it! We've solved the list!" +msgid "Have I told you about cardboard, friend? Do you have any?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -150894,7 +151731,7 @@ msgid "" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Have I told you about cardboard, friend? Do you have any?" +msgid "We've done it! We've solved the list!" msgstr "" #: lang/json/talk_topic_from_json.py @@ -151536,6 +152373,10 @@ msgid "" "have none of this and still have to look for food... in other words, I'd be " "dead as a doornail. Or I guess undead." msgstr "" +"Esto es misericordia. Tengo refugio, luz y calor, y esos guardias nos ayudan" +" si aparece algún zombi. No está tan mal. Si estuviera solo por ahí, no " +"tendría nada de esto y tendría que seguir buscando comida... en otras " +"palabras, estaría muerto bien muerto. O tal vez... muerto vivo." #: lang/json/talk_topic_from_json.py msgid "" @@ -155288,6 +156129,10 @@ msgstr "" msgid "What the hell were you testing out there?" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "So, about that protective gear?" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "No. Now leave." msgstr "" @@ -155303,6 +156148,21 @@ msgid "" "Shame about what happened, with the evisceration and all..." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"Given the current context, we are willing to sell you a set of our protective gear: gas mask, suit and gear, at a considerable discount. We will sell it for two of our coins.\n" +"\n" +"the intercom: Hmm wait, we might not have your size..." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "[ 2 Hub 01 Gold Coins ] Deal!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I have to give it a thought." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Just leave." msgstr "" @@ -157108,6 +157968,86 @@ msgstr "" msgid " delivers a perfect riposte to %s" msgstr "" +#: lang/json/technique_from_json.py +msgid "Displace and Hook" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You parry and hook %s down" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " parries and hooks %s down" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "High Round Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You swing high and strike at %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " swings high and strikes %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "High Round Feint" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You fake a high round strike at %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " feints at %s" +msgstr " le amaga al %s" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab you, but you push away!" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab , but they push away!" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Hook and Drag" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You hook and drag %s down" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " hooks and drags %s down" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Colpo di Grazia" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You swing down hard and execute %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " swings down hard and executes %s" +msgstr "" + #: lang/json/technique_from_json.py msgid "quick punch" msgstr "puñetazo rápido" @@ -157285,11 +158225,6 @@ msgstr "amagar a" msgid "You feint at %s" msgstr "Le amagas al %s" -#: lang/json/technique_from_json.py -#, python-format -msgid " feints at %s" -msgstr " le amaga al %s" - #: lang/json/technique_from_json.py #, python-format msgid "You jab %s" @@ -157489,7 +158424,7 @@ msgstr "" #: lang/json/technique_from_json.py #, python-format msgid " dodges and catches %s exposed" -msgstr "" +msgstr " esquiva el ataque y golpea %s con la guardia baja" #: lang/json/technique_from_json.py msgid "Snake Snap" @@ -157738,57 +158673,6 @@ msgstr "" msgid " receives %s's attack, and counters" msgstr "" -#: lang/json/technique_from_json.py -msgid "Displace and Hook" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You parry %s attack and hook them down" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid " parries %s attack and hooks them down" -msgstr "" - -#: lang/json/technique_from_json.py -msgid "High Round Strike" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You swing high and strike at %s" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid " swings high and strikes %s" -msgstr "" - -#: lang/json/technique_from_json.py -msgid "High Round Feint" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You fake a high round strike at %s" -msgstr "" - -#: lang/json/technique_from_json.py -msgid "High Round Stab" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You quickly stab %s" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid " quickly stabs %s" -msgstr "" - #: lang/json/technique_from_json.py msgid "grab and pommel strike" msgstr "" @@ -159511,6 +160395,16 @@ msgstr "" msgid "SMASH!" msgstr "¡SMASH!" +#: lang/json/terrain_from_json.py +msgid "metal floor" +msgstr "suelo de metal" + +#. ~ Description for metal floor +#: lang/json/terrain_from_json.py +msgid "" +"High-quality and tough checkered flooring to reduce risk of slips and falls." +msgstr "" + #: lang/json/terrain_from_json.py msgid "linoleum tile" msgstr "baldosa de linóleo" @@ -159608,10 +160502,6 @@ msgid "" "smoothed and the roof isn't quite filled in yet." msgstr "" -#: lang/json/terrain_from_json.py -msgid "metal floor" -msgstr "suelo de metal" - #. ~ Description for metal floor #: lang/json/terrain_from_json.py msgid "" @@ -159649,6 +160539,8 @@ msgid "" "A crudely welded together floor of metal with steel trusses and supporting " "girders." msgstr "" +"Es un piso de metal no muy bien soldado con una estructura de acero y vigas " +"de apoyo." #: lang/json/terrain_from_json.py msgid "waxed floor" @@ -159947,6 +160839,9 @@ msgid "" "A massive deciduous tree belonging to the 'Quercus' genus, commonly found " "throughout New England region. You could cut it down with the right tools." msgstr "" +"Es un enorme árbol de hojas marchitas que pertenece al género 'Quercus', " +"comúnmente visto por toda la región de New England. Podrías talarlo con las " +"herramientas adecuadas." #: lang/json/terrain_from_json.py msgid "cottonwood tree" @@ -160502,7 +161397,7 @@ msgstr "" #. ~ Description for strawberry bush #: lang/json/terrain_from_json.py msgid "A small strawberry bush that's fruitless." -msgstr "" +msgstr "Un pequeño arbusto de fresas vacío." #: lang/json/terrain_from_json.py msgid "blackberry bush" @@ -162011,6 +162906,9 @@ msgid "" "A deep pit with a two by four placed across it, looks sturdy enough to cross" " safely or the plank could be removed to turn it back into trap fall." msgstr "" +"Es un pozo profundo con una tabla de madera puesta encima. Parece resistente" +" como para cruzarlo, pero se puede sacar la tabla para convertirlo en una " +"trampa." #: lang/json/terrain_from_json.py lang/json/trap_from_json.py msgid "spiked pit" @@ -164968,7 +165866,7 @@ msgstr "" #: lang/json/vehicle_part_from_json.py msgid "atomic nightlight" -msgstr "" +msgstr "luz de noche atómica" #. ~ Description for atomic nightlight #: lang/json/vehicle_part_from_json.py @@ -165119,6 +166017,16 @@ msgstr "" msgid "biosilicfied chitin ram" msgstr "" +#: lang/json/vehicle_part_from_json.py +msgid "tied mattress" +msgstr "" + +#. ~ Description for tied mattress +#: lang/json/vehicle_part_from_json.py +msgid "" +"A mattress, strapped onto the vehicle. It could serve to blunt any impact." +msgstr "" + #. ~ Description for shredder #: lang/json/vehicle_part_from_json.py msgid "" @@ -166295,7 +167203,7 @@ msgstr "rueda de bicicleta (maniobrable)" #: lang/json/vehicle_part_from_json.py msgid "off-road bicycle wheel (steerable)" -msgstr "" +msgstr "rueda todo terreno de bicicleta (maniobrable)" #: lang/json/vehicle_part_from_json.py msgid "casters" @@ -169462,6 +170370,10 @@ msgstr "" msgid "Stop %s?" msgstr "" +#: src/activity_type.h +msgid "THIS IS A BUG" +msgstr "" + #: src/addiction.cpp msgid "You need some nicotine." msgstr "Necesitas nicotina." @@ -170092,7 +171004,11 @@ msgid_plural "" "Wearing multiple items %s on your %s is adding " "encumbrance there." msgstr[0] "" +"Ponerse varios objetos %s en tu %s agrega " +"incomodidad en ese lugar." msgstr[1] "" +"Ponerse varios objetos %s en tu %s agrega " +"incomodidad en ese lugar." #: src/armor_layers.cpp #, c-format @@ -171029,10 +171945,6 @@ msgstr "%1$s de %2$s" msgid "artifact file" msgstr "archivo de artefactos" -#: src/auto_pickup.cpp -msgid " AUTO PICKUP MANAGER " -msgstr "GESTOR DE AUTO-RECOGIDA" - #: src/auto_pickup.cpp src/game.cpp src/safemode_ui.cpp msgid "dd" msgstr "gregar" @@ -171081,14 +171993,6 @@ msgstr "Reglas" msgid "I/E" msgstr "I/E" -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "[]" -msgstr "[]" - -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "[]" -msgstr "[]" - #: src/auto_pickup.cpp msgid "Auto pickup enabled:" msgstr "Auto-recogida activado:" @@ -171105,10 +172009,6 @@ msgstr "Sí" msgid "witch" msgstr "-Cambiar" -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "Please load a character first to use this page!" -msgstr "¡Primero cargá un personaje antes de usar esto!" - #: src/auto_pickup.cpp src/safemode_ui.cpp msgid "" msgstr "" @@ -171146,6 +172046,18 @@ msgstr "Regla de Recogida:" msgid "Save changes?" msgstr "¿Guardar cambios?" +#: src/auto_pickup.cpp +msgid " AUTO PICKUP MANAGER " +msgstr "GESTOR DE AUTO-RECOGIDA" + +#: src/auto_pickup.cpp src/safemode_ui.cpp +msgid "[]" +msgstr "[]" + +#: src/auto_pickup.cpp src/safemode_ui.cpp +msgid "[]" +msgstr "[]" + #: src/auto_pickup.cpp #, c-format msgid "%1$d item matches: %2$s" @@ -171166,6 +172078,11 @@ msgstr "" msgid "autopickup configuration" msgstr "configuración de auto-recogida" +#: src/auto_pickup.cpp +#, c-format +msgid "Pickup rules for %s" +msgstr "Reglas de recogida para %s" + #: src/avatar.cpp src/iuse.cpp msgid "He" msgstr "Él" @@ -172411,7 +173328,37 @@ msgstr "Retraés tu %s." #: src/bionics.cpp #, c-format -msgid "%s withdraws %s %s." +msgid " withdraws %s %s." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Your %s does not have enought fuel to start." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "'s %s does not have enought fuel to start." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Your %s turns off to not waste fuel." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "'s %s turns off to not waste fuel." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Your %s runs out of fuel and turn off." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "'s %s runs out of fuel and turn off." msgstr "" #: src/bionics.cpp @@ -172786,6 +173733,10 @@ msgid "" "enjoy the operation." msgstr "" +#: src/bionics_ui.cpp +msgid "Available Fuel: " +msgstr "" + #: src/bionics_ui.cpp #, c-format msgid "" @@ -173520,7 +174471,7 @@ msgstr "Está roto/a. Necesita entablillarlo/a o atención médica." #: src/character.cpp #, c-format msgid "Chance to stop: %d %%" -msgstr "" +msgstr "Posibilidad de pararlo: %d %%" #: src/character.cpp msgid "This will not stop the bleeding." @@ -173782,7 +174733,7 @@ msgstr "a ti mismo soltando un aullido penetrante!" #: src/character.cpp msgid "a loud scream!" -msgstr "" +msgstr "¡Un alarido fuerte!" #: src/character.cpp msgid "yourself scream loudly!" @@ -175978,6 +176929,20 @@ msgid_plural " digests a %s and recharges %d points of energy." msgstr[0] " digiere un/a %s y recarga %d punto de energía." msgstr[1] " digiere un/a %s y recarga %d puntos de energía." +#: src/consumption.cpp +#, c-format +msgid "You load %i charge of %s in your %s." +msgid_plural "You load %i charges of %s in your %s." +msgstr[0] "" +msgstr[1] "" + +#: src/consumption.cpp +#, c-format +msgid " load %i charge of %s in their %s." +msgid_plural " load %i charges of %s in their %s." +msgstr[0] "" +msgstr[1] "" + #: src/craft_command.cpp src/crafting.cpp src/veh_interact.cpp msgid " (nearby)" msgstr " (cercano)" @@ -176064,8 +177029,10 @@ msgstr "¡Ya no puedes fabricar eso!" #: src/crafting.cpp #, c-format -msgid "You don't have anything to store %s in!" -msgstr "¡No tienes nada para poder guardar el/la %s!" +msgid "" +"You don't have anything in which to store %s and may have to pour it out or " +"consume it as soon as it is prepared! Proceed?" +msgstr "" #: src/crafting.cpp src/pickup.cpp #, c-format @@ -176494,7 +177461,7 @@ msgstr "componente necesario para fabricar" #: src/crafting_gui.cpp msgid "two by four" -msgstr "" +msgstr "tabla de madera" #: src/crafting_gui.cpp msgid "primary skill used to craft" @@ -176642,6 +177609,10 @@ msgstr "Buen golpe!" msgid "Grazing hit." msgstr "Rozado." +#: src/creature.cpp +msgid "You feel poison coursing through your body!" +msgstr "" + #: src/creature.cpp msgid "The shot misses!" msgstr "¡Fallaste el disparo!" @@ -178212,19 +179183,19 @@ msgid "You can't see the terrain here." msgstr "" #: src/descriptions.cpp +#, c-format msgid "" "\n" -"Sign: ???" +"Sign: %s" msgstr "" +"\n" +"Firma: %s" #: src/descriptions.cpp -#, c-format msgid "" "\n" -"Sign: %s" +"Sign: ???" msgstr "" -"\n" -"Firma: %s" #: src/descriptions.cpp src/iexamine.cpp #, c-format @@ -178327,7 +179298,7 @@ msgstr "afuera: %d obstruido: %d" #: src/editmap.cpp #, c-format msgid "light_at: %s" -msgstr "" +msgstr "luz_a: %s" #: src/editmap.cpp #, c-format @@ -179448,7 +180419,7 @@ msgstr "" #: src/faction_camp.cpp msgid "Menial Labor" -msgstr "" +msgstr "Labores Menores" #: src/faction_camp.cpp msgid "Performing menial labor...\n" @@ -179743,6 +180714,7 @@ msgstr "" #: src/faction_camp.cpp msgid "There are few forests. Wood is your primary construction material.\n" msgstr "" +"Hay pocos bosques. La madera es tu principal material de construcción.\n" #: src/faction_camp.cpp msgid "There are few large clean-ish water sources.\n" @@ -179752,6 +180724,8 @@ msgstr "Hay muy pocas fuentes de agua potable o más o menos.\n" msgid "" "There are no swamps. Swamps provide access to a few late game industries.\n" msgstr "" +"No hay pantanos. Los pantanos te permitirán acceder a algunas industrias " +"avanzadas.\n" #: src/faction_camp.cpp msgid "There are few fields. Farming may be difficult.\n" @@ -181277,20 +182251,6 @@ msgstr "información de uistate" msgid "Failed to save game data" msgstr "No se pudo guardar la información del juego" -#: src/game.cpp -msgid "You haven't killed any monsters yet!" -msgstr "¡No mataste a ningún monstruo!" - -#: src/game.cpp -#, c-format -msgid "KILL COUNT: %d" -msgstr "TOTAL DE MUERTES: %d" - -#: src/game.cpp -#, c-format -msgid "Experience: %d (%d points available)" -msgstr "" - #: src/game.cpp msgid " You are forgotten among the billions lost in the cataclysm..." msgstr "" @@ -183287,6 +184247,11 @@ msgstr "" msgid "You're fully charged" msgstr "" +#: src/game_inventory.cpp +#, c-format +msgid "No space to store more %s" +msgstr "" + #: src/game_inventory.cpp msgid "soon!" msgstr "pronto!" @@ -183319,6 +184284,18 @@ msgstr "viejo" msgid "rotten" msgstr "podrido" +#: src/game_inventory.cpp src/panels.cpp +msgid "Food :" +msgstr "" + +#: src/game_inventory.cpp src/panels.cpp +msgid "Drink:" +msgstr "" + +#: src/game_inventory.cpp src/panels.cpp +msgid "Pain :" +msgstr "" + #: src/game_inventory.cpp msgid "Consume item" msgstr "Consumir objeto" @@ -186091,6 +187068,14 @@ msgstr "" msgid "ERROR NO SPACE AVAILABLE. Operation impossible. Exiting." msgstr "" +#: src/iexamine.cpp +msgid "Personality_Override" +msgstr "" + +#: src/iexamine.cpp +msgid "C0RR#PTED?D#TA" +msgstr "" + #: src/iexamine.cpp msgid "Choose bionic to uninstall" msgstr "Elegir biónico para desinstalar" @@ -187343,8 +188328,8 @@ msgid "Capacity: " msgstr "Capacidad:" #: src/item.cpp -msgid " per round" -msgstr " por bala" +msgid " moves per round" +msgstr "" #: src/item.cpp msgid "Reload time: " @@ -187443,8 +188428,8 @@ msgid "" msgstr "" #: src/item.cpp -msgid " seconds" -msgstr " segundos" +msgid " moves " +msgstr "" #: src/item.cpp msgid "Time to reach aim level: " @@ -187478,10 +188463,6 @@ msgstr "Retroceso efectivo: " msgid "Recommended strength (burst): " msgstr "Fuerza recomendada (ráfaga): " -#: src/item.cpp -msgid " seconds per round" -msgstr " segundos por bala" - #: src/item.cpp msgid "Fire modes: " msgstr "Modo de disparo: " @@ -187752,6 +188733,14 @@ msgid "" "improve them by repairing this item." msgstr "" +#: src/item.cpp +msgid "Weight capacity modifier: " +msgstr "" + +#: src/item.cpp +msgid "Weight capacity bonus: " +msgstr "" + #: src/item.cpp msgid "Just for fun." msgstr "Solo para divertirse." @@ -188207,6 +189196,14 @@ msgstr "" msgid "This bionic is installed in the following body part(s):" msgstr "Este biónico se instala en las siguientes partes del cuerpo:" +#: src/item.cpp +msgid "Encumbrance: " +msgstr "" + +#: src/item.cpp +msgid "Environmental Protection: " +msgstr "" + #: src/item.cpp msgid "* This weapon needs two free hands to fire." msgstr "" @@ -191527,6 +192524,11 @@ msgstr "" msgid " illuminated by %s" msgstr "" +#: src/iuse.cpp +#, c-format +msgid " in %s cloud" +msgstr "" + #: src/iuse.cpp #, c-format msgid " with graffiti \"%s\"" @@ -191786,6 +192788,9 @@ msgid "" "\n" "This photo was taken mostly inside, but outside can be seen." msgstr "" +"\n" +"\n" +"Esta foto fue sacada adentro, pero se puede ver parte del exterior también." #: src/iuse.cpp msgid "" @@ -192763,6 +193768,10 @@ msgstr "Necesitas alguna fuente de energía para tu %s (un UPS común, sirve)." msgid "There is also a certain bionic that helps with this kind of armor." msgstr "También existe un biónico que te ayuda con esta clase de armadura." +#: src/iuse_actor.cpp +msgid "No lock to pick." +msgstr "" + #: src/iuse_actor.cpp msgid "Use your lockpick where?" msgstr "¿Dónde quieres usar tu ganzúa?" @@ -194877,6 +195886,20 @@ msgstr "<-> anterior" msgid "ndo move" msgstr " deshacer movimiento" +#: src/kill_tracker.cpp +msgid "You haven't killed any monsters yet!" +msgstr "¡No mataste a ningún monstruo!" + +#: src/kill_tracker.cpp +#, c-format +msgid "KILL COUNT: %d" +msgstr "TOTAL DE MUERTES: %d" + +#: src/kill_tracker.cpp +#, c-format +msgid "Experience: %d (%d points available)" +msgstr "" + #. ~ abbreviated direction names and long direction names #: src/line.cpp msgid "N " @@ -195146,6 +196169,16 @@ msgstr "" msgid "an explosion" msgstr "" +#: src/magic.cpp +#, c-format +msgid "%s and %s" +msgstr "%s y %s" + +#: src/magic.cpp src/player.cpp +#, c-format +msgid "%s, %s" +msgstr "%s, %s" + #: src/magic.cpp #, c-format msgid "" @@ -195182,6 +196215,11 @@ msgstr "" msgid "Popup Distractions" msgstr "" +#: src/magic.cpp +#, c-format +msgid "%d moves" +msgstr "" + #: src/magic.cpp msgid "requires concentration" msgstr "" @@ -195700,7 +196738,7 @@ msgstr "" #: src/map.cpp #, c-format -msgid "The autoclave in the %s has finished washing." +msgid "The autoclave in the %s has finished its cycle." msgstr "" #: src/map.cpp @@ -195966,22 +197004,6 @@ msgstr "Abrir Cámaras" msgid "Missile Controls" msgstr "Controles de Misiles" -#: src/mapgen.cpp -msgid "EnviroCom OS v2.03" -msgstr "EnviroCom OS v2.03" - -#: src/mapgen.cpp -msgid "Unlock stairs" -msgstr "Abrir escaleras" - -#: src/mapgen.cpp -msgid "Download Sewer Maps" -msgstr "Descargar Mapas de Cloacas" - -#: src/mapgen.cpp -msgid "Divert sample" -msgstr "Desviar muestra" - #: src/mapgen.cpp msgid "NEPowerOS" msgstr "NEPowerOS" @@ -198628,6 +199650,11 @@ msgstr "¡Los brazos de %s se lanzan hacia , pero los esquiva!" msgid "The %1$s's arms fly out and pull and grab %2$s!" msgstr "¡Los brazos de %1$s son lanzados y tiran y agarran %2$s!" +#: src/monattack.cpp +#, c-format +msgid "The %1$s reaches out and pulls %2$s!" +msgstr "" + #: src/monattack.cpp #, c-format msgid "The %s gropes at you, but you dodge!" @@ -199375,6 +200402,19 @@ msgstr "¡Vacíe sus manos y mantenga su posición, ciudadano!" msgid "fzzzzzt" msgstr "fzzzzzt" +#: src/monattack.cpp +msgid "The floor trembles underneath your feet." +msgstr "" + +#: src/monattack.cpp +msgid "a deafening roar!" +msgstr "" + +#: src/monattack.cpp +#, c-format +msgid "A %s struggles to pull itself free from the %s!" +msgstr "" + #: src/monattack.cpp #, c-format msgid "The %1$s mechanically grabs at %2$s!" @@ -202056,6 +203096,11 @@ msgstr "%1$s deja un/a %2$s." msgid "Hold on, I want to pulp that %s." msgstr "Espera, quiero destrozar ese/a %s." +#: src/npcmove.cpp +#, c-format +msgid "%s completed the assigned task." +msgstr "" + #: src/npcmove.cpp #, c-format msgid "%1$s throws a %2$s." @@ -202558,6 +203603,10 @@ msgstr "puños" msgid "BADAMMO" msgstr "MALMUNICIÓN" +#: src/npctalk.cpp +msgid "doing this and that" +msgstr "" + #: src/npctalk.cpp msgctxt "punctuation" msgid "." @@ -202661,6 +203710,11 @@ msgstr "" msgid "%1$s doesn't have a %2$s!" msgstr "" +#: src/npctalk.cpp +#, c-format +msgid "%1$s gives you %2$s." +msgstr "" + #: src/npctalk.cpp msgid "I don't trust you enough to eat THIS..." msgstr "" @@ -202915,11 +203969,6 @@ msgstr "Pago:" msgid "Select a follower" msgstr "Elegir un seguidor" -#: src/npctalk_funcs.cpp -#, c-format -msgid "Pickup rules for %s" -msgstr "Reglas de recogida para %s" - #: src/npctrade.cpp #, c-format msgid "Volume: %s %s, Weight: %.1f %s" @@ -205822,10 +206871,6 @@ msgstr "¡Muy Frio!" msgid "Freezing!" msgstr "¡Congelado!" -#: src/panels.cpp -msgid "Pain " -msgstr "Dolor" - #: src/panels.cpp msgid "Bad" msgstr "" @@ -205993,22 +207038,10 @@ msgstr "" msgid "Style:" msgstr "" -#: src/panels.cpp -msgid "Food :" -msgstr "" - -#: src/panels.cpp -msgid "Drink:" -msgstr "" - #: src/panels.cpp msgid "Rest :" msgstr "" -#: src/panels.cpp -msgid "Pain :" -msgstr "" - #: src/panels.cpp msgid "Heat :" msgstr "" @@ -207770,11 +208803,6 @@ msgstr "%s (%d)" msgid "%s with %s (%d)" msgstr "%s con %s (%d)" -#: src/player.cpp -#, c-format -msgid "%s, %s" -msgstr "%s, %s" - #: src/player.cpp msgid "| Location " msgstr "| Lugar " @@ -208525,6 +209553,10 @@ msgstr "" msgid "Peckish" msgstr "" +#: src/player.cpp +msgid "Pain " +msgstr "Dolor" + #: src/player_activity.cpp msgid "You pause for a moment to catch your breath." msgstr "" @@ -209994,6 +211026,10 @@ msgstr "B/W" msgid "Safe Mode enabled:" msgstr "Modo seguro activado:" +#: src/safemode_ui.cpp +msgid "Please load a character first to use this page!" +msgstr "¡Primero cargá un personaje antes de usar esto!" + #: src/safemode_ui.cpp msgid "Safe Mode manager currently inactive." msgstr "El gestor de modo seguro está inactivo." @@ -212826,6 +213862,10 @@ msgid "" "door." msgstr "" +#: src/vehicle_use.cpp +msgid "The autoclave is empty, there's no point in starting it." +msgstr "" + #: src/vehicle_use.cpp #, c-format msgid "" @@ -212852,6 +213892,10 @@ msgid "" "its lid." msgstr "" +#: src/vehicle_use.cpp +msgid "The washing machine is empty, there's no point in starting it." +msgstr "" + #: src/vehicle_use.cpp #, c-format msgid "" @@ -212890,6 +213934,10 @@ msgid "" "lid." msgstr "" +#: src/vehicle_use.cpp +msgid "The dishwasher is empty, there's no point in starting it." +msgstr "" + #: src/vehicle_use.cpp #, c-format msgid "" diff --git a/lang/po/hu.po b/lang/po/hu.po index d372492b5cdcf..9a5dc4bca0ccb 100644 --- a/lang/po/hu.po +++ b/lang/po/hu.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.D\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-16 17:39+0800\n" +"POT-Creation-Date: 2019-08-23 23:11+0800\n" "PO-Revision-Date: 2018-04-26 14:47+0000\n" "Last-Translator: Daniel Szollosi-Nagy , 2019\n" "Language-Team: Hungarian (https://www.transifex.com/cataclysm-dda-translators/teams/2217/hu/)\n" @@ -409,27 +409,6 @@ msgstr "" "Hulladék réz. Valaminek az elkészítéséhez lehet használni, például " "hevenyészett sörétes puska lőszerhez." -#: lang/json/AMMO_from_json.py -msgid "solder" -msgstr "forrasztóón" - -#. ~ Description for solder -#: lang/json/AMMO_from_json.py -msgid "" -"A small spool of solder, able to be used in ammunition and electronics." -msgstr "" -"Egy kis tekercs forrasztóón, amit lőszerekhez és elektronikai eszközökhöz " -"lehet használni." - -#: lang/json/AMMO_from_json.py -msgid "tin" -msgstr "ón" - -#. ~ Description for tin -#: lang/json/AMMO_from_json.py -msgid "Tin and pewter scraps. Usable in making ammo." -msgstr "Ón és bádog hulladék. Lőszer-készítéshez lehet használni." - #: lang/json/AMMO_from_json.py msgid "medical tape" msgstr "orvosi ragasztószalag" @@ -448,6 +427,34 @@ msgstr "PG-7VL 93mm rakéta" msgid "93mm single-stage high-explosive ammunition for the RPG-7." msgstr "93 mm-es, egylépcsős robbanó muníció az RPG-7-hez." +#: lang/json/AMMO_from_json.py +msgid "PG-7VR 64mm/105mm rocket" +msgstr "" + +#. ~ Description for PG-7VR 64mm/105mm rocket +#: lang/json/AMMO_from_json.py +msgid "64mm/105mm high-explosive tandem ammunition for the RPG-7." +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid "TBG-7V 105mm rocket" +msgstr "" + +#. ~ Description for TBG-7V 105mm rocket +#: lang/json/AMMO_from_json.py +msgid "105mm thermobaric ammunition for the RPG-7." +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid "OG-7V 40mm rocket" +msgstr "" + +#. ~ Description for OG-7V 40mm rocket +#: lang/json/AMMO_from_json.py +msgid "" +"40mm high-explosive fragmentation antipersonnel ammunition for the RPG-7." +msgstr "" + #: lang/json/AMMO_from_json.py msgid "M235 66mm TPA rocket" msgstr "M235 66mm TPA rakéta" @@ -2424,21 +2431,19 @@ msgstr "" #. ~ Description for .300 AAC Blackout #: lang/json/AMMO_from_json.py msgid "" -".300 AAC Blackout is an intermediate cartridge that achieves ballistics " -"similar to the 7.62x39 but allows use on the AR-15 platform. The round is " -"necked-up from the 5.56mm NATO, but feeds from a STANAG magazine. It " -"requires a specific barrel, so will not work in a standard M4 or similar " -"carbine. This loading is supersonic." +"A .300 AAC Blackout round with a 125gr open tip match bullet. 300 BLK is an" +" intermediate cartridge necked up from 5.56x45mm, designed to achieve " +"similar ballistics to 7.62x39mm. It is compatible with standard AR-15 lower" +" receivers and will feed from STANAG magazines." msgstr "" #. ~ Description for .300 AAC Blackout #: lang/json/AMMO_from_json.py msgid "" -".300 AAC Blackout is an intermediate cartridge that achieves ballistics " -"similar to the 7.62x39 but allows use on the AR-15 platform. The round is " -"necked-up from the 5.56mm NATO, but feeds from a STANAG magazine. It " -"requires a specific barrel, so will not work in a standard M4 or similar " -"carbine. This loading is subsonic." +"A subsonic .300 AAC Blackout round with a 220gr open tip match bullet. 300 " +"BLK is an intermediate cartridge necked up from 5.56x45mm, designed to " +"achieve similar ballistics to 7.62x39mm. It is compatible with standard " +"AR-15 lower receivers and will feed from STANAG magazines." msgstr "" #: lang/json/AMMO_from_json.py @@ -3960,6 +3965,17 @@ msgid "" " tube. Designed to be highly effective against vehicles and structures." msgstr "" +#: lang/json/AMMO_from_json.py +msgid "paralyzing barb" +msgstr "" + +#. ~ Description for paralyzing barb +#: lang/json/AMMO_from_json.py +msgid "" +"Tiny droplets of venom trickle out of the sponge-like tissue of this sharp " +"barb." +msgstr "" + #: lang/json/AMMO_from_json.py msgid "sprayable toxic gas" msgstr "permetezhető mérgesgáz" @@ -4554,6 +4570,29 @@ msgid "" "making doors." msgstr "" +#: lang/json/AMMO_from_json.py +msgid "tin powder" +msgstr "" + +#. ~ Description for tin powder +#: lang/json/AMMO_from_json.py +msgid "" +"A fine gray powder composed of tin, usable for making solder and lining " +"containers to prevent corrosion." +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid "solder" +msgstr "forrasztóón" + +#. ~ Description for solder +#: lang/json/AMMO_from_json.py +msgid "" +"A small spool of solder, able to be used in ammunition and electronics." +msgstr "" +"Egy kis tekercs forrasztóón, amit lőszerekhez és elektronikai eszközökhöz " +"lehet használni." + #: lang/json/AMMO_from_json.py msgid "incendiary" msgid_plural "incendiaries" @@ -6308,44 +6347,6 @@ msgstr[1] "kosaras rövidnadrág" msgid "A pair of basketball shorts. Comfortable and light." msgstr "Kosárlabdás rövidnadrág. Kényelmes és könnyű." -#: lang/json/ARMOR_from_json.py -msgid "backpack" -msgid_plural "backpacks" -msgstr[0] "hátizsák" -msgstr[1] "hátizsák" - -#. ~ Description for backpack -#: lang/json/ARMOR_from_json.py -msgid "A small backpack. Good storage for a little encumbrance." -msgstr "Egy kis hátizsák, jó tárolási lehetőség kis ormótlanságért cserébe." - -#: lang/json/ARMOR_from_json.py -msgid "giant novelty backpack" -msgid_plural "giant novelty backpacks" -msgstr[0] "óriási vicces hátizsák" -msgstr[1] "óriási vicces hátizsák" - -#. ~ Description for giant novelty backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A huge fabric backpack made mostly as a joke before the cataclysm. Now, " -"it's still rather silly, but it can store a lot of stuff." -msgstr "" -"Óriási méretű textil hátizsák, amelyet a kataklizma előtt viccből " -"készítettek. Még mindig röhejesen néz ki, de egy csomó minden elfér benne." - -#: lang/json/ARMOR_from_json.py -msgid "leather backpack" -msgid_plural "leather backpacks" -msgstr[0] "bőr hátizsák" -msgstr[1] "bőr hátizsák" - -#. ~ Description for leather backpack -#: lang/json/ARMOR_from_json.py -msgid "A small leather backpack. Good storage for a little encumbrance." -msgstr "" -"Egy kis bőr hátizsák, jó tárolási lehetőség kis ormótlanságért cserébe." - #: lang/json/ARMOR_from_json.py msgid "balaclava" msgid_plural "balaclavas" @@ -6369,8 +6370,8 @@ msgstr[1] "derékhordású kardszíj" #. ~ Use action holster_msg for scabbard. #. ~ Use action holster_msg for sheath. #. ~ Use action holster_msg for survivor belt. -#. ~ Use action holster_msg for hiking backpack. #. ~ Use action holster_msg for survivor utility belt. +#. ~ Use action holster_msg for hiking backpack. #. ~ Use action holster_msg for pair of boots. #. ~ Use action holster_msg for pair of bone armor boots. #. ~ Use action holster_msg for pair of turnout boots. @@ -6395,7 +6396,8 @@ msgstr[1] "derékhordású kardszíj" #. ~ Use action holster_msg for pair of rollerblades. #. ~ Use action holster_msg for pair of rollerskates. #. ~ Use action holster_msg for C.R.I.T web belt. -#: lang/json/ARMOR_from_json.py +#. ~ Use action holster_msg for hollow cane. +#: lang/json/ARMOR_from_json.py lang/json/GENERIC_from_json.py #, no-python-format msgid "You sheath your %s" msgstr "Elrakod a %st" @@ -6403,7 +6405,9 @@ msgstr "Elrakod a %st" #. ~ Use action holster_prompt for baldric. #. ~ Use action holster_prompt for back scabbard. #. ~ Use action holster_prompt for scabbard. -#: lang/json/ARMOR_from_json.py +#. ~ Use action holster_prompt for hollow cane. +#: lang/json/ARMOR_from_json.py lang/json/ARMOR_from_json.py +#: lang/json/GENERIC_from_json.py msgid "Sheath sword" msgstr "Kard hüvelybe rakása" @@ -7420,17 +7424,6 @@ msgstr "" "Egész testet beborító dinoszaurusz jelmez. Rendkívül ormótlan és kevés dolog" " fér el benne, de jó meleg." -#: lang/json/ARMOR_from_json.py -msgid "dive bag" -msgid_plural "dive bags" -msgstr[0] "búvárzsák" -msgstr[1] "búvárzsák" - -#. ~ Description for dive bag -#: lang/json/ARMOR_from_json.py -msgid "A lightweight mesh backpack, commonly worn by swimmers and divers." -msgstr "Könnyű hálós hátizsák, főleg búvárok használják." - #: lang/json/ARMOR_from_json.py msgid "down-filled blanket" msgid_plural "down-filled blankets" @@ -7513,18 +7506,6 @@ msgstr[1] "esküvői ruha" msgid "A beautiful white wedding dress. What good will it be now?" msgstr "Gyönyörű fehér esküvői ruha. Most viszont mire jó?" -#: lang/json/ARMOR_from_json.py -msgid "duffel bag" -msgid_plural "duffel bags" -msgstr[0] "sporttáska" -msgstr[1] "sporttáska" - -#. ~ Description for duffel bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A huge duffel bag. Provides plenty of storage, but is severely encumbering." -msgstr "Hatalmas sporttáska rengeteg hellyel, de rettenetesen ormótlan." - #: lang/json/ARMOR_from_json.py msgid "tactical dump pouch" msgid_plural "tactical dump pouches" @@ -9458,17 +9439,6 @@ msgstr "" "Hosszan libegő palást. Egyszerű és kényelmes viselet. Az ellenséges harcok " "előtt drámaian tépd le magadról!" -#: lang/json/ARMOR_from_json.py -msgid "jerrypack" -msgid_plural "jerrypacks" -msgstr[0] "kannás táska" -msgstr[1] "kannás táska" - -#. ~ Description for jerrypack -#: lang/json/ARMOR_from_json.py -msgid "A jerrycan modified to be worn in a similar manner to a backpack." -msgstr "Hátizsákként viselhető kanna." - #: lang/json/ARMOR_from_json.py msgid "sports jersey" msgid_plural "sports jerseys" @@ -10351,32 +10321,6 @@ msgstr[1] "francia szobalány kalap" msgid "A frilly white headpiece." msgstr "Fodros fehér fejdísz" -#: lang/json/ARMOR_from_json.py -msgid "makeshift knapsack" -msgid_plural "makeshift knapsacks" -msgstr[0] "hevenyészett hátizsák" -msgstr[1] "hevenyészett hátizsák" - -#. ~ Description for makeshift knapsack -#: lang/json/ARMOR_from_json.py -msgid "" -"A pair of pants with the bottom ends tied with string, and then passed " -"through the belt loops so the knapsack can be carried on the back." -msgstr "" -"Elkötött szárú nadrág, amelyet az övcsatokhoz rögzítve a hátadon tudsz " -"hordani." - -#: lang/json/ARMOR_from_json.py -msgid "makeshift sling" -msgid_plural "makeshift slings" -msgstr[0] "hevenyészett heveder" -msgstr[1] "hevenyészett heveder" - -#. ~ Description for makeshift sling -#: lang/json/ARMOR_from_json.py -msgid "A large sheet tied into a crude, over-the-shoulder sling." -msgstr "Egy nagy lepedőből kötött, vállra vetett heveder." - #: lang/json/ARMOR_from_json.py msgid "ballistic mask" msgid_plural "ballistic masks" @@ -10446,17 +10390,6 @@ msgstr "" "Hátra kötözött ujjú póló, általában azok a tüntetők viselik, akik az arcukat" " szeretnék elrejteni." -#: lang/json/ARMOR_from_json.py -msgid "messenger bag" -msgid_plural "messenger bags" -msgstr[0] "oldaltáska" -msgstr[1] "oldaltáska" - -#. ~ Description for messenger bag -#: lang/json/ARMOR_from_json.py -msgid "Light and easy to wear, but doesn't offer much storage." -msgstr "Könnyű és könnyen viselhető, de nincs benne sok hely." - #: lang/json/ARMOR_from_json.py msgid "pair of mittens" msgid_plural "pairs of mittens" @@ -10468,23 +10401,6 @@ msgstr[1] "sütőkesztyű" msgid "A pair of warm mittens. They are extremely cumbersome." msgstr "Egy pár meleg sütőkesztyű. Extrém mértékben ormótlan." -#: lang/json/ARMOR_from_json.py -msgid "MOLLE pack" -msgid_plural "MOLLE packs" -msgstr[0] "MKFSZB zsák" -msgstr[1] "MKFSZB zsák" - -#. ~ Description for MOLLE pack -#: lang/json/ARMOR_from_json.py -msgid "" -"The Modular Lightweight Load-carrying Equipment is an advanced military " -"backpack. Covered with pockets and straps, it strikes a fine balance " -"between storage space and encumbrance." -msgstr "" -"A modulárisan könnyített felszerelés-szállító berendezés egy " -"csúcstechnológiájú katonai hátizsák. Kívül számos zseb és pánt borítja, " -"kiváló egyensúlyt teremtve a tárolási kapacitás és az ormótlanság között." - #: lang/json/ARMOR_from_json.py msgid "motorcycle armor" msgid_plural "motorcycle armors" @@ -10946,17 +10862,6 @@ msgid "" msgstr "" "Leveslábosból készített sisak. Nem véd túl sok ellen, de jobb a semminél." -#: lang/json/ARMOR_from_json.py -msgid "purse" -msgid_plural "purses" -msgstr[0] "retikül" -msgstr[1] "retikül" - -#. ~ Description for purse -#: lang/json/ARMOR_from_json.py -msgid "A bit cumbersome to wear, but provides some storage." -msgstr "Kicsit ormótlan a viselete, de valamennyi hely van benne." - #: lang/json/ARMOR_from_json.py msgid "quiver" msgid_plural "quivers" @@ -11049,33 +10954,6 @@ msgid "" msgstr "" "Bő külső ruházat ujjakkal és titokzatos mennyiségű, jól elrejtett zsebekkel." -#: lang/json/ARMOR_from_json.py -msgid "military rucksack" -msgid_plural "military rucksacks" -msgstr[0] "katonai hátizsák" -msgstr[1] "katonai hátizsák" - -#. ~ Description for military rucksack -#: lang/json/ARMOR_from_json.py -msgid "A huge military rucksack, provides a lot of storage." -msgstr "Hatalmas katonai hátizsák, rengeteg tárolóhellyel." - -#: lang/json/ARMOR_from_json.py -msgid "runner pack" -msgid_plural "runner packs" -msgstr[0] "futótáska" -msgstr[1] "futótáska" - -#. ~ Description for runner pack -#: lang/json/ARMOR_from_json.py -msgid "" -"The obvious choice for outdoor athletes, this ergonomic backpack is light " -"and easy to wear, ensuring comfort when carrying heavy and bulky items." -msgstr "" -"A távfutók kedvence. Ezt az ergonómiai szempontból kivitelezett hátizsákot " -"könnyű hordani és viselni, még nehéz és nagyméretű tárgyak szállításnál is " -"komfortos marad." - #: lang/json/ARMOR_from_json.py msgid "scabbard" msgid_plural "scabbards" @@ -11484,21 +11362,6 @@ msgstr[1] "ujjatlan tunika" msgid "A sleeveless cloth garment that covers the torso and legs." msgstr "A törzset és a lábakat befedő textil ruha." -#: lang/json/ARMOR_from_json.py -msgid "sling pack" -msgid_plural "sling packs" -msgstr[0] "válltáska" -msgstr[1] "válltáska" - -#. ~ Description for sling pack -#: lang/json/ARMOR_from_json.py -msgid "" -"A simple single-sling backpack. Easier to access than a normal backpack, " -"but can't comfortably hold as much." -msgstr "" -"Egypántos válltáska. Könnyebben elérhető a tartalma, mint a hátizsáknak, " -"viszont nem is fér el benne annyi minden." - #: lang/json/ARMOR_from_json.py msgid "snuggie" msgid_plural "snuggies" @@ -11784,8 +11647,8 @@ msgstr[0] "túlélő öv" msgstr[1] "túlélő öv" #. ~ Use action holster_prompt for survivor belt. -#. ~ Use action holster_prompt for hiking backpack. #. ~ Use action holster_prompt for survivor utility belt. +#. ~ Use action holster_prompt for hiking backpack. #. ~ Use action holster_prompt for C.R.I.T web belt. #: lang/json/ARMOR_from_json.py msgid "Sheath blade" @@ -11802,21 +11665,6 @@ msgstr "" " kisméretű késtartó tokkal. Tartós és kifejezetten kényelmes viseletre " "szabott. Aktiváld egy kés tokba rakásához illetve előrántásához." -#: lang/json/ARMOR_from_json.py -msgid "survivor duffel bag" -msgid_plural "survivor duffel bags" -msgstr[0] "túlélő sporttáska" -msgstr[1] "túlélő sporttáska" - -#. ~ Description for survivor duffel bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built heavy duffel bag. Durable and carefully crafted to hold as " -"much stuff as possible." -msgstr "" -"Egyedi készítésű nehéz sporttáska. Tartós és gondosan kialakított volta " -"miatt a lehető legtöbb dolog fér el benne." - #: lang/json/ARMOR_from_json.py msgid "survivor goggles" msgid_plural "pairs of survivor goggles" @@ -11832,51 +11680,6 @@ msgstr "" "Egyedi készítésű, színes lencsékkel ellátott, páncélozott védőszemüveg. " "Kényelmes és tartós, kiváló védelmet nyújt a környezeti veszélyek ellen." -#: lang/json/ARMOR_from_json.py -msgid "survivor backpack" -msgid_plural "survivor backpacks" -msgstr[0] "túlélő hátizsák" -msgstr[1] "túlélő hátizsák" - -#. ~ Description for survivor backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built backpack. Durable and carefully crafted to hold as much " -"stuff as possible." -msgstr "" -"Egyedi készítésű hátizsák. Tartós és gondosan kialakított volta miatt a " -"lehető legtöbb dolog fér el benne." - -#: lang/json/ARMOR_from_json.py -msgid "survivor rucksack" -msgid_plural "survivor rucksacks" -msgstr[0] "túlélő hátizsák" -msgstr[1] "túlélő hátizsák" - -#. ~ Description for survivor rucksack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built heavy backpack. Durable and carefully crafted to hold as " -"much stuff as possible." -msgstr "" -"Egyedi készítésű nehéz hátizsák. Tartós és gondosan kialakított volta miatt " -"a lehető legtöbb dolog fér el benne." - -#: lang/json/ARMOR_from_json.py -msgid "survivor runner pack" -msgid_plural "survivor runner packs" -msgstr[0] "túlélő futótáska" -msgstr[1] "túlélő futótáska" - -#. ~ Description for survivor runner pack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built lightweight runner pack. Durable and carefully crafted to " -"hold as much stuff as possible." -msgstr "" -"Egyedi készítésű, könnyű futótáska. Tartós és gondosan kialakított volta " -"miatt a lehető legtöbb dolog fér el benne." - #: lang/json/ARMOR_from_json.py msgid "survivor suit" msgid_plural "survivor suits" @@ -12834,32 +12637,6 @@ msgstr "" "Nem vagy abban teljesen biztos, hogy ezt a golfozók által hordott, " "napellenzős dolgot tényleg golfsapkának hívják." -#: lang/json/ARMOR_from_json.py -msgid "golf bag" -msgid_plural "golf bags" -msgstr[0] "golftáska" -msgstr[1] "golftáska" - -#. ~ Use action holster_msg for golf bag. -#: lang/json/ARMOR_from_json.py -#, no-python-format -msgid "You awkwardly sheath your %s" -msgstr "Ügyetlenül elteszed a(z) %st" - -#. ~ Use action holster_prompt for golf bag. -#: lang/json/ARMOR_from_json.py -msgid "Sheath golf club" -msgstr "Elteszed a golfütőt" - -#. ~ Description for golf bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A tall canvas and plastic bag with fold-out legs used for golfing. It even " -"has straps to be worn on the back." -msgstr "" -"Magas, kihajtható lábakkal ellátott textil és műanyag zsák golfütők " -"tárolásához. Még pánt is van rajta, hogy a hátadra vehesd." - #: lang/json/ARMOR_from_json.py msgid "javelin bag" msgid_plural "javelin bags" @@ -12967,67 +12744,6 @@ msgstr "" "Több fűzőkarikával ellátott műanyag ponyva, rögtönzött eső elleni védelemre " "jól használható." -#: lang/json/ARMOR_from_json.py -msgid "high-volume rucksack" -msgid_plural "high-volume rucksacks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for high-volume rucksack -#: lang/json/ARMOR_from_json.py -msgid "" -"Also know as a \"bigpack\", this rucksack is prized by pack rats but may " -"lead to a bad back." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "hiking backpack" -msgid_plural "hiking backpacks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for hiking backpack -#: lang/json/ARMOR_from_json.py -msgid "A large sized hiking backpack with plenty of storage space." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "petpack" -msgid_plural "petpacks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for petpack -#: lang/json/ARMOR_from_json.py -msgid "" -"Before the Cataclysm this would allow your four-legged friend to see the " -"world, now it's used to shield them from the world." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "large tactical backpack" -msgid_plural "large tactical backpacks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for large tactical backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A large tactical multi-compartment backpack that has great lower back " -"support." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "travelpack" -msgid_plural "travelpacks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for travelpack -#: lang/json/ARMOR_from_json.py -msgid "A hiking pack used for short trips." -msgstr "" - #: lang/json/ARMOR_from_json.py msgid "survivor utility belt" msgid_plural "survivor utility belts" @@ -13268,6 +12984,332 @@ msgid "" "resistant vests. It has four pouches capable of carrying magazines." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "backpack" +msgid_plural "backpacks" +msgstr[0] "hátizsák" +msgstr[1] "hátizsák" + +#. ~ Description for backpack +#: lang/json/ARMOR_from_json.py +msgid "A small backpack. Good storage for a little encumbrance." +msgstr "Egy kis hátizsák, jó tárolási lehetőség kis ormótlanságért cserébe." + +#: lang/json/ARMOR_from_json.py +msgid "hiking backpack" +msgid_plural "hiking backpacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for hiking backpack +#: lang/json/ARMOR_from_json.py +msgid "A large sized hiking backpack with plenty of storage space." +msgstr "" + +#: lang/json/ARMOR_from_json.py +msgid "giant novelty backpack" +msgid_plural "giant novelty backpacks" +msgstr[0] "óriási vicces hátizsák" +msgstr[1] "óriási vicces hátizsák" + +#. ~ Description for giant novelty backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A huge fabric backpack made mostly as a joke before the cataclysm. Now, " +"it's still rather silly, but it can store a lot of stuff." +msgstr "" +"Óriási méretű textil hátizsák, amelyet a kataklizma előtt viccből " +"készítettek. Még mindig röhejesen néz ki, de egy csomó minden elfér benne." + +#: lang/json/ARMOR_from_json.py +msgid "leather backpack" +msgid_plural "leather backpacks" +msgstr[0] "bőr hátizsák" +msgstr[1] "bőr hátizsák" + +#. ~ Description for leather backpack +#: lang/json/ARMOR_from_json.py +msgid "A small leather backpack. Good storage for a little encumbrance." +msgstr "" +"Egy kis bőr hátizsák, jó tárolási lehetőség kis ormótlanságért cserébe." + +#: lang/json/ARMOR_from_json.py +msgid "large tactical backpack" +msgid_plural "large tactical backpacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for large tactical backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A large tactical multi-compartment backpack that has great lower back " +"support." +msgstr "" + +#: lang/json/ARMOR_from_json.py +msgid "high-volume rucksack" +msgid_plural "high-volume rucksacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for high-volume rucksack +#: lang/json/ARMOR_from_json.py +msgid "" +"Also know as a \"bigpack\", this rucksack is prized by pack rats but may " +"lead to a bad back." +msgstr "" + +#: lang/json/ARMOR_from_json.py +msgid "dive bag" +msgid_plural "dive bags" +msgstr[0] "búvárzsák" +msgstr[1] "búvárzsák" + +#. ~ Description for dive bag +#: lang/json/ARMOR_from_json.py +msgid "A lightweight mesh backpack, commonly worn by swimmers and divers." +msgstr "Könnyű hálós hátizsák, főleg búvárok használják." + +#: lang/json/ARMOR_from_json.py +msgid "duffel bag" +msgid_plural "duffel bags" +msgstr[0] "sporttáska" +msgstr[1] "sporttáska" + +#. ~ Description for duffel bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A huge duffel bag. Provides plenty of storage, but is severely encumbering." +msgstr "Hatalmas sporttáska rengeteg hellyel, de rettenetesen ormótlan." + +#: lang/json/ARMOR_from_json.py +msgid "petpack" +msgid_plural "petpacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for petpack +#: lang/json/ARMOR_from_json.py +msgid "" +"Before the Cataclysm this would allow your four-legged friend to see the " +"world, now it's used to shield them from the world." +msgstr "" + +#: lang/json/ARMOR_from_json.py +msgid "jerrypack" +msgid_plural "jerrypacks" +msgstr[0] "kannás táska" +msgstr[1] "kannás táska" + +#. ~ Description for jerrypack +#: lang/json/ARMOR_from_json.py +msgid "A jerrycan modified to be worn in a similar manner to a backpack." +msgstr "Hátizsákként viselhető kanna." + +#: lang/json/ARMOR_from_json.py +msgid "makeshift knapsack" +msgid_plural "makeshift knapsacks" +msgstr[0] "hevenyészett hátizsák" +msgstr[1] "hevenyészett hátizsák" + +#. ~ Description for makeshift knapsack +#: lang/json/ARMOR_from_json.py +msgid "" +"A pair of pants with the bottom ends tied with string, and then passed " +"through the belt loops so the knapsack can be carried on the back." +msgstr "" +"Elkötött szárú nadrág, amelyet az övcsatokhoz rögzítve a hátadon tudsz " +"hordani." + +#: lang/json/ARMOR_from_json.py +msgid "makeshift sling" +msgid_plural "makeshift slings" +msgstr[0] "hevenyészett heveder" +msgstr[1] "hevenyészett heveder" + +#. ~ Description for makeshift sling +#: lang/json/ARMOR_from_json.py +msgid "A large sheet tied into a crude, over-the-shoulder sling." +msgstr "Egy nagy lepedőből kötött, vállra vetett heveder." + +#: lang/json/ARMOR_from_json.py +msgid "messenger bag" +msgid_plural "messenger bags" +msgstr[0] "oldaltáska" +msgstr[1] "oldaltáska" + +#. ~ Description for messenger bag +#: lang/json/ARMOR_from_json.py +msgid "Light and easy to wear, but doesn't offer much storage." +msgstr "Könnyű és könnyen viselhető, de nincs benne sok hely." + +#: lang/json/ARMOR_from_json.py +msgid "MOLLE pack" +msgid_plural "MOLLE packs" +msgstr[0] "MKFSZB zsák" +msgstr[1] "MKFSZB zsák" + +#. ~ Description for MOLLE pack +#: lang/json/ARMOR_from_json.py +msgid "" +"The Modular Lightweight Load-carrying Equipment is an advanced military " +"backpack. Covered with pockets and straps, it strikes a fine balance " +"between storage space and encumbrance." +msgstr "" +"A modulárisan könnyített felszerelés-szállító berendezés egy " +"csúcstechnológiájú katonai hátizsák. Kívül számos zseb és pánt borítja, " +"kiváló egyensúlyt teremtve a tárolási kapacitás és az ormótlanság között." + +#: lang/json/ARMOR_from_json.py +msgid "purse" +msgid_plural "purses" +msgstr[0] "retikül" +msgstr[1] "retikül" + +#. ~ Description for purse +#: lang/json/ARMOR_from_json.py +msgid "A bit cumbersome to wear, but provides some storage." +msgstr "Kicsit ormótlan a viselete, de valamennyi hely van benne." + +#: lang/json/ARMOR_from_json.py +msgid "military rucksack" +msgid_plural "military rucksacks" +msgstr[0] "katonai hátizsák" +msgstr[1] "katonai hátizsák" + +#. ~ Description for military rucksack +#: lang/json/ARMOR_from_json.py +msgid "A huge military rucksack, provides a lot of storage." +msgstr "Hatalmas katonai hátizsák, rengeteg tárolóhellyel." + +#: lang/json/ARMOR_from_json.py +msgid "runner pack" +msgid_plural "runner packs" +msgstr[0] "futótáska" +msgstr[1] "futótáska" + +#. ~ Description for runner pack +#: lang/json/ARMOR_from_json.py +msgid "" +"The obvious choice for outdoor athletes, this ergonomic backpack is light " +"and easy to wear, ensuring comfort when carrying heavy and bulky items." +msgstr "" +"A távfutók kedvence. Ezt az ergonómiai szempontból kivitelezett hátizsákot " +"könnyű hordani és viselni, még nehéz és nagyméretű tárgyak szállításnál is " +"komfortos marad." + +#: lang/json/ARMOR_from_json.py +msgid "sling pack" +msgid_plural "sling packs" +msgstr[0] "válltáska" +msgstr[1] "válltáska" + +#. ~ Description for sling pack +#: lang/json/ARMOR_from_json.py +msgid "" +"A simple single-sling backpack. Easier to access than a normal backpack, " +"but can't comfortably hold as much." +msgstr "" +"Egypántos válltáska. Könnyebben elérhető a tartalma, mint a hátizsáknak, " +"viszont nem is fér el benne annyi minden." + +#: lang/json/ARMOR_from_json.py +msgid "survivor duffel bag" +msgid_plural "survivor duffel bags" +msgstr[0] "túlélő sporttáska" +msgstr[1] "túlélő sporttáska" + +#. ~ Description for survivor duffel bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built heavy duffel bag. Durable and carefully crafted to hold as " +"much stuff as possible." +msgstr "" +"Egyedi készítésű nehéz sporttáska. Tartós és gondosan kialakított volta " +"miatt a lehető legtöbb dolog fér el benne." + +#: lang/json/ARMOR_from_json.py +msgid "survivor backpack" +msgid_plural "survivor backpacks" +msgstr[0] "túlélő hátizsák" +msgstr[1] "túlélő hátizsák" + +#. ~ Description for survivor backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built backpack. Durable and carefully crafted to hold as much " +"stuff as possible." +msgstr "" +"Egyedi készítésű hátizsák. Tartós és gondosan kialakított volta miatt a " +"lehető legtöbb dolog fér el benne." + +#: lang/json/ARMOR_from_json.py +msgid "survivor rucksack" +msgid_plural "survivor rucksacks" +msgstr[0] "túlélő hátizsák" +msgstr[1] "túlélő hátizsák" + +#. ~ Description for survivor rucksack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built heavy backpack. Durable and carefully crafted to hold as " +"much stuff as possible." +msgstr "" +"Egyedi készítésű nehéz hátizsák. Tartós és gondosan kialakított volta miatt " +"a lehető legtöbb dolog fér el benne." + +#: lang/json/ARMOR_from_json.py +msgid "survivor runner pack" +msgid_plural "survivor runner packs" +msgstr[0] "túlélő futótáska" +msgstr[1] "túlélő futótáska" + +#. ~ Description for survivor runner pack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built lightweight runner pack. Durable and carefully crafted to " +"hold as much stuff as possible." +msgstr "" +"Egyedi készítésű, könnyű futótáska. Tartós és gondosan kialakított volta " +"miatt a lehető legtöbb dolog fér el benne." + +#: lang/json/ARMOR_from_json.py +msgid "golf bag" +msgid_plural "golf bags" +msgstr[0] "golftáska" +msgstr[1] "golftáska" + +#. ~ Use action holster_msg for golf bag. +#: lang/json/ARMOR_from_json.py +#, no-python-format +msgid "You awkwardly sheath your %s" +msgstr "Ügyetlenül elteszed a(z) %st" + +#. ~ Use action holster_prompt for golf bag. +#: lang/json/ARMOR_from_json.py +msgid "Sheath golf club" +msgstr "Elteszed a golfütőt" + +#. ~ Description for golf bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A tall canvas and plastic bag with fold-out legs used for golfing. It even " +"has straps to be worn on the back." +msgstr "" +"Magas, kihajtható lábakkal ellátott textil és műanyag zsák golfütők " +"tárolásához. Még pánt is van rajta, hogy a hátadra vehesd." + +#: lang/json/ARMOR_from_json.py +msgid "travelpack" +msgid_plural "travelpacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for travelpack +#: lang/json/ARMOR_from_json.py +msgid "A hiking pack used for short trips." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "pistol bandolier" msgid_plural "pistol bandoliers" @@ -16453,19 +16495,6 @@ msgid "" " turn more often than massive objects." msgstr "" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Advanced Microreactor CBM" -msgid_plural "Advanced Microreactor CBMs" -msgstr[0] "Modern mikroreaktor KBM" -msgstr[1] "Modern mikroreaktor KBM" - -#. ~ Description for Advanced Microreactor CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"This module upgrades a pre-installed microreactor with enhanced maximum " -"yield and limited automatic radiation scrubbing capabilities." -msgstr "" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Alarm System CBM" msgid_plural "Alarm System CBMs" @@ -17224,19 +17253,6 @@ msgid "" "cause delayed reaction times and drowsiness." msgstr "" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Plutonium Filter CBM" -msgid_plural "Plutonium Filter CBMs" -msgstr[0] "Plutónium-szűrő KBM" -msgstr[1] "Plutónium-szűrő KBM" - -#. ~ Description for Plutonium Filter CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A system of tanks and filters that are connected to a microreactor to " -"extract plutonium from radioactive slurry." -msgstr "" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Power Armor Interface CBM" msgid_plural "Power Armor Interface CBMs" @@ -17364,33 +17380,6 @@ msgid "" "unarmed slashing damage whenever the user's fingertips are uncovered." msgstr "" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Internal Microreactor CBM" -msgid_plural "Internal Microreactor CBMs" -msgstr[0] "Belső mikroreaktor KBM" -msgstr[1] "Belső mikroreaktor KBM" - -#. ~ Description for Internal Microreactor CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"This stripped down mini-reactor will generate impressive amounts of bionic " -"power, but may not be the safest thing to install. Once active, it cannot " -"be shut down and will slowly contaminate the user's body with radiation." -msgstr "" - -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Microreactor Upgrade CBM" -msgid_plural "Microreactor Upgrade CBMs" -msgstr[0] "Korszerűsített mikroreaktor KBM" -msgstr[1] "Korszerűsített mikroreaktor KBM" - -#. ~ Description for Microreactor Upgrade CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A kit for upgrading a pre-installed microreactor with enhanced maximum yield" -" and limited automatic radiation scrubbing capabilities." -msgstr "" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Recycler Unit CBM" msgid_plural "Recycler Unit CBMs" @@ -18032,6 +18021,59 @@ msgstr "" "A mellüregedben egy tárolórekesz került kialakításra, további 2 liternyi " "tárgyat tudsz magaddal vinni." +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Advanced Microreactor CBM" +msgid_plural "Advanced Microreactor CBMs" +msgstr[0] "Modern mikroreaktor KBM" +msgstr[1] "Modern mikroreaktor KBM" + +#. ~ Description for Advanced Microreactor CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"This module upgrades a pre-installed microreactor with enhanced maximum " +"yield and limited automatic radiation scrubbing capabilities." +msgstr "" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Plutonium Filter CBM" +msgid_plural "Plutonium Filter CBMs" +msgstr[0] "Plutónium-szűrő KBM" +msgstr[1] "Plutónium-szűrő KBM" + +#. ~ Description for Plutonium Filter CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A system of tanks and filters that are connected to a microreactor to " +"extract plutonium from radioactive slurry." +msgstr "" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Internal Microreactor CBM" +msgid_plural "Internal Microreactor CBMs" +msgstr[0] "Belső mikroreaktor KBM" +msgstr[1] "Belső mikroreaktor KBM" + +#. ~ Description for Internal Microreactor CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"This stripped down mini-reactor will generate impressive amounts of bionic " +"power, but may not be the safest thing to install. Once active, it cannot " +"be shut down and will slowly contaminate the user's body with radiation." +msgstr "" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Microreactor Upgrade CBM" +msgid_plural "Microreactor Upgrade CBMs" +msgstr[0] "Korszerűsített mikroreaktor KBM" +msgstr[1] "Korszerűsített mikroreaktor KBM" + +#. ~ Description for Microreactor Upgrade CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A kit for upgrading a pre-installed microreactor with enhanced maximum yield" +" and limited automatic radiation scrubbing capabilities." +msgstr "" + #. ~ Description for Solar Panels CBM #: lang/json/BIONIC_ITEM_from_json.py msgid "" @@ -20749,26 +20791,26 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Nietzsche's \"Beyond Good and Evil\". Its cover is dog-" +"This is a copy of Nietzsche's \"Beyond Good and Evil\". Its cover is dog-" "eared and creased." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"The Unique and Its Property\" by Max Stirner. A modern " +"This is a copy of \"The Unique and Its Property\" by Max Stirner. A modern " "translation by Wolfi Landstreicher." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Jean-Paul Sartre's \"Being and Nothingness\". A key work " +"This is a copy of Jean-Paul Sartre's \"Being and Nothingness\". A key work " "in the existentialist tradition." msgstr "" #: lang/json/BOOK_from_json.py msgid "" "A large, extended version of \"Madness and Civilisation\" by Michel " -"Foucault. The cover features a striking image of a Panopticonic Prison." +"Foucault. The cover features a striking image of a Panopticonic Prison." msgstr "" #: lang/json/BOOK_from_json.py @@ -20779,13 +20821,13 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"A collection of texts and essays by Jacques Derrida. It's pages loose and " +"A collection of texts and essays by Jacques Derrida. It's pages loose and " "yellowed, you should probably handle it with care." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Society of the Spectacle\" by Guy Debord. Its cover " +"This is a copy of \"Society of the Spectacle\" by Guy Debord. Its cover " "shows rows of adults staring placidly into a screen." msgstr "" @@ -20797,36 +20839,36 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Baudrillard's \"Simulation and Simulacra\". The cover " +"This is a copy of Baudrillard's \"Simulation and Simulacra\". The cover " "contains an image of a man holding a colored pill in each hand, with the " -"caption \"Welcome to the Desert of the Real.\". You think you've seen this " +"caption \"Welcome to the Desert of the Real.\". You think you've seen this " "movie." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a small, pocket version of Sartre's \"Existentialism and Humanism.\"" -" It looks to have been used as a coaster in a past life." +"This is a small, pocket version of Sartre's \"Existentialism and Humanism\"." +" It looks to have been used as a coaster in a past life." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Practical Ethics\" by Peter Singer. From the local " +"This is a copy of \"Practical Ethics\" by Peter Singer. From the local " "university press." msgstr "" #: lang/json/BOOK_from_json.py msgid "" "This is a photocopied spiral-bound copy of \"Industrial Society and Its " -"Future\" by 'Freedom Club'. The original looks to have been written on a " +"Future\" by 'Freedom Club'. The original looks to have been written on a " "typewriter before being copied." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Industrial Society and Its Future\" by Ted Kaczynski. " +"This is a copy of \"Industrial Society and Its Future\" by Ted Kaczynski. " "Its cover is an image of a hand-crafted wooden box filled with wiring and an" -" ominous looking metal tube. Provocative." +" ominous looking metal tube. Provocative." msgstr "" #: lang/json/BOOK_from_json.py @@ -20835,23 +20877,23 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"The State and Revolution\" by Vladimir Lenin. In " +"This is a copy of \"The State and Revolution\" by Vladimir Lenin. In " "English, thankfully." msgstr "" #: lang/json/BOOK_from_json.py -msgid "This is a copy of \"In Defence of Terrorism\" by Leon Trotsky." +msgid "This is a copy of \"In Defense of Marxism\" by Leon Trotsky." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Steal This Book\" by Abbie Hoffman. There is a security " -"tag on the back cover. It appears to still be active." +"This is a copy of \"Steal This Book\" by Abbie Hoffman. There is a security" +" tag on the back cover. It appears to still be active." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Walden: Or Life In The Woods\" by Henry David Thoreau. " +"This is a copy of \"Walden: Or Life In The Woods\" by Henry David Thoreau. " "It contains a dried and pressed leaf as a bookmark." msgstr "" @@ -20872,7 +20914,7 @@ msgid "" msgstr "" #: lang/json/BOOK_from_json.py -msgid "This is a copy of Machiavelli's \"The Prince\". With intro by Q. Skinner." +msgid "This is a copy of Machiavelli's \"The Prince\". With intro by Q. Skinner." msgstr "" #: lang/json/BOOK_from_json.py @@ -20882,12 +20924,12 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a pocket copy of \"An Essay on Liberation\" by Herbert Marcuse. The " -"cover contains an image of a pelican." +"This is a pocket copy of \"An Essay on Liberation\" by Herbert Marcuse. The" +" cover contains an image of a pelican." msgstr "" #: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Either-Or\" by Sören Kierkegaard." +msgid "This is a copy of \"Either-Or\" by Søren Kierkegaard." msgstr "" #: lang/json/BOOK_from_json.py @@ -20912,6 +20954,69 @@ msgid "" "Science\" by Friederich Nietzsche." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Myth of Sisyphus\", and other essays, by Albert " +"Camus. The cover depicts a bare-chested man and a large boulder." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Sickness Unto Death\" by Søren Kierkegaard. The " +"pages are dotted with post-it notes." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Defence of Terrorism\" by Leon Trotsky. Despite the" +" title, it does not actually appear to be defending terrorism." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Enquiry Concerning Political Justice\" by William " +"Godwin. This thick book is filled with antiquated phrases." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Abolition of Work and Other Essays\" by Bob Black. " +"It is likely that \"The Abolition of Work\" is the most famous essay in this" +" book." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"What is Property?\" by Pierre-Joseph Proudhon. It looks" +" like this book has a surprisingly long track record of owners." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Conquest of Bread\" by Peter Kropotkin. There is a " +"picture of an old philosopher with magnificent beard, instead of bread, on " +"the cover." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Trouble with Being Born\" by Emil Cioran. This book" +" might have been printed decades before the cataclysm since the cover is " +"quite weathered." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The World as Will and Representation\" by Arthur " +"Schopenhauer. It contains a few undecipherable notes and scribbles." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Up-Wingers: A Futurist Manifesto\" by FM-2030. It seems" +" that the author's real name is Fereidoun M. Esfandiary." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "phone book" msgid_plural "phone books" @@ -22734,8 +22839,8 @@ msgstr[1] "" msgid "" "This useful stuff is a potent solvent and has a wide range of reactive " "applications. It can be used to make a huge number of plastics and " -"polymers, it can be a disinfectant, it can strip paint and break down epoxy," -" and it can burn your skin away like tissue paper under a heat gun. Wear " +"polymers, it can be an antiseptic, it can strip paint and break down epoxy, " +"and it can burn your skin away like tissue paper under a heat gun. Wear " "gloves." msgstr "" @@ -28345,11 +28450,9 @@ msgstr[1] "fertőtlenítő por" #. ~ Description for antiseptic powder #: lang/json/COMESTIBLE_from_json.py msgid "" -"A powdered form of chemical disinfectant, this bismuth formic iodide cleans " +"A powdered form of chemical antiseptic, this bismuth formic iodide cleans " "wounds quickly and painlessly." msgstr "" -"Por alakú kémiai fertőtlenítőszer. A bizmut hangyasav-jodid gyorsan és " -"fájdalommentesen tisztítja sebeket." #: lang/json/COMESTIBLE_from_json.py msgid "caffeinated chewing gum" @@ -28401,13 +28504,10 @@ msgstr[1] "hidrogén-peroxid" #. ~ Description for hydrogen peroxide #: lang/json/COMESTIBLE_from_json.py msgid "" -"Dilute hydrogen peroxide, for use as a disinfectant and for bleaching hair " -"or textiles. Foams a little when in contact with organic matter, but " +"Dilute hydrogen peroxide, for use as an antiseptic and for bleaching hair or" +" textiles. Foams a little when in contact with organic matter, but " "otherwise harmless." msgstr "" -"Hígított hidrogén-peroxid fertőtlenítésre és haj illetve textíliák " -"befestésére. Szerves anyaggal kapcsolatba kerülve habzik egy kicsit, de " -"egyébként ártalmatlan." #: lang/json/COMESTIBLE_from_json.py lang/json/GENERIC_from_json.py msgid "cigarette" @@ -28573,25 +28673,23 @@ msgstr "" "orrfolyást, de még akkor is pihenni kell meg sok-sok folyadékot inni." #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant" -msgstr "fertőtlenítő" +msgid "antiseptic" +msgstr "" -#. ~ Description for disinfectant +#. ~ Description for antiseptic #: lang/json/COMESTIBLE_from_json.py -msgid "A powerful disinfectant commonly used for contaminated wounds." -msgstr "Szennyezett sebek fertőtlenítésére használ erős szer." +msgid "A powerful antiseptic commonly used for contaminated wounds." +msgstr "" #: lang/json/COMESTIBLE_from_json.py -msgid "makeshift disinfectant" -msgstr "hevenyészett fertőtlenítő" +msgid "makeshift antiseptic" +msgstr "" -#. ~ Description for makeshift disinfectant +#. ~ Description for makeshift antiseptic #: lang/json/COMESTIBLE_from_json.py msgid "" -"Makeshift disinfectant made from ethanol. Can be used to disinfect a wound." +"Makeshift antiseptic made from ethanol. Can be used to disinfect a wound." msgstr "" -"Etanolból készült hevenyészett fertőtlenítőszer. Sebek fertőtlenítésére " -"használható." #: lang/json/COMESTIBLE_from_json.py src/addiction.cpp msgid "diazepam" @@ -28994,9 +29092,8 @@ msgstr "kakukkfűolaj" #: lang/json/COMESTIBLE_from_json.py msgid "" "Some essential oil made from thyme, which can act as a mildly irritating " -"disinfectant." +"antiseptic." msgstr "" -"Kakukkfűből készült illóolaj, enyhén irritáló fertőtlenítőként használható." #: lang/json/COMESTIBLE_from_json.py msgid "rolling tobacco" @@ -29205,28 +29302,28 @@ msgstr "" "generikus gyógyszer neve alprazolam." #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant soaked rag" -msgid_plural "disinfectant soaked rags" -msgstr[0] "fertőtlenítővel áztatott rongy" -msgstr[1] "fertőtlenítővel áztatott rongy" +msgid "antiseptic soaked rag" +msgid_plural "antiseptic soaked rags" +msgstr[0] "" +msgstr[1] "" -#. ~ Description for disinfectant soaked rag +#. ~ Description for antiseptic soaked rag #: lang/json/COMESTIBLE_from_json.py msgid "" -"A rag soaked in disinfectant. Useful for light wounds, probaby won't help " -"with deep bites." +"A rag soaked in antiseptic. Useful for light wounds, probaby won't help with" +" deep bites." msgstr "" #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant soaked cotton balls" -msgid_plural "disinfectant soaked cotton balls" -msgstr[0] "fertőtlenítővel áztatott vatta" -msgstr[1] "fertőtlenítővel áztatott vatta" +msgid "antiseptic soaked cotton balls" +msgid_plural "antiseptic soaked cotton balls" +msgstr[0] "" +msgstr[1] "" -#. ~ Description for disinfectant soaked cotton balls +#. ~ Description for antiseptic soaked cotton balls #: lang/json/COMESTIBLE_from_json.py msgid "" -"Fluffy balls of clean white cotton. Now soaked with disinfectant, they are " +"Fluffy balls of clean white cotton. Now soaked with antiseptic, they are " "somewhat useful to disinfect a wound." msgstr "" @@ -31964,6 +32061,20 @@ msgstr[1] "lekváros szendvics" msgid "A delicious jam sandwich." msgstr "Ízletes lekváros szendvics." +#: lang/json/COMESTIBLE_from_json.py +msgid "fairy bread" +msgid_plural "fairy bread" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for fairy bread +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"An 'open-faced sandwich' consisting of sliced white bread, a healthy crust-" +"to-crust slathering of butter, and sprinkles. Supposedly a staple of " +"birthday parties in Australia." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "honey sandwich" msgid_plural "honey sandwiches" @@ -33200,6 +33311,21 @@ msgstr "" "Édes, édes cukor. Rossz a fogadnak és meglepő módon önmagában nem nagyon " "ízletes." +#: lang/json/COMESTIBLE_from_json.py +msgid "sprinkles" +msgid_plural "sprinkles" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for sprinkles +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Known as nonpareils, sprinkles, jimmies, sugar strands or 'hundreds-and-" +"thousands', these colorful balls, rods or flakes of sugar and starch are " +"intended for use decorating soft surfaces of sweets. Like sugar, they are " +"bad for your teeth and surprisingly not very tasty on their own." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "wild herbs" msgid_plural "wild herbs" @@ -38029,6 +38155,21 @@ msgstr "" "Ultramodern optikai adattároló. Ez az apró üveglap miniatűr mintákban " "tárolja a nanofabrikátorban elkészíthető tárgy jellemzőit." +#: lang/json/GENERIC_from_json.py +msgid "nanofabricator template (silicon photonics)" +msgid_plural "nanofabricator template (silicon photonics)s" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for nanofabricator template (silicon photonics) +#: lang/json/GENERIC_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "antenna" msgid_plural "antennas" @@ -42960,7 +43101,7 @@ msgstr[1] "" #. ~ Description for .300BLK casing #: lang/json/GENERIC_from_json.py -msgid "An empty casing from a .300BLK round." +msgid "An empty casing from a .300 AAC Blackout round." msgstr "" #: lang/json/GENERIC_from_json.py @@ -44662,6 +44803,36 @@ msgid "" "had fake black soot painted on." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "blackjack" +msgid_plural "blackjacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for blackjack +#: lang/json/GENERIC_from_json.py +msgid "" +"This is a short, easily concealed bludgeoning weapon consisting of a weight " +"embedded at the end of a short leather shaft. Formerly used by law " +"enforcement, this weapon is meant to stun or knock out the subject, although" +" head strikes have a high risk of causing a permanent, disabling brain " +"injury or being fatal." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "makeshift sap" +msgid_plural "makeshift saps" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for makeshift sap +#: lang/json/GENERIC_from_json.py +msgid "" +"This is an improvised sap, also known as a cosh, slapjack and slapper. A " +"short and flat bludgeoning weapon consisting of a weight embedded between " +"two patches of leather." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "pointy stick" msgid_plural "pointy sticks" @@ -45188,6 +45359,30 @@ msgstr "" "valamennyivel rövidebb a tőrnél és a párbajtőrnél, de egyáltalán nem kevésbé" " hatásos." +#: lang/json/GENERIC_from_json.py +msgid "hollow cane" +msgid_plural "hollow canes" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for hollow cane +#: lang/json/GENERIC_from_json.py +msgid "" +"A cane designed to conceal blade. This was a popular fashion accessory for " +"the wealthy during the 18th and 19th centuries." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "sword cane" +msgid_plural "sword canes" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for sword cane +#: lang/json/GENERIC_from_json.py +msgid "A sword with a thin blade designed to be hidden inside an hollow cane." +msgstr "" + #: lang/json/GENERIC_from_json.py lang/json/TOOL_from_json.py #: lang/json/TOOL_from_json.py msgid "cutlass" @@ -52684,6 +52879,15 @@ msgstr "" msgid "A cheap 6-round steel box magazine for the Jennings J-22." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "Walther P22 magazine" +msgstr "" + +#. ~ Description for Walther P22 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round box magazine for the Walther P22." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "LW-5 speedloader" msgstr "" @@ -53117,6 +53321,20 @@ msgstr "" msgid "A cheap 32-round steel box magazine for use with the MAC-11 SMG." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "CF-380 magazine" +msgstr "" + +#. ~ Description for CF-380 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Hi-Point CF-380." +msgstr "" + +#. ~ Description for CF-380 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point CF-380." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "M1911 .38 Super magazine" msgstr "" @@ -53181,6 +53399,43 @@ msgid "" "expect much reliability." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "Hi-Power magazine .40 S&W" +msgstr "" + +#. ~ Description for Hi-Power magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Browning Hi-Power .40 S&W." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine .40 S&W" +msgstr "" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 12 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 14 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "Model JCP magazine" +msgstr "" + +#. ~ Description for Model JCP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point Model JCP." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "grenade belt" msgstr "gránátöv" @@ -53342,6 +53597,24 @@ msgstr "USP .45 tár" msgid "A standard capacity magazine for use with the H&K USP handgun." msgstr "Sztenderd kapacitású tár a H&K USP kézifegyverhez." +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine .45 ACP" +msgstr "" + +#. ~ Description for PPQ magazine .45 ACP +#: lang/json/MAGAZINE_from_json.py +msgid "A 12 round steel box magazine for the Walther PPQ .45 ACP." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "Model JHP magazine" +msgstr "" + +#. ~ Description for Model JHP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 9-round steel box magazine for use with the Hi-Point Model JHP." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid ".454 5-round speedloader" msgstr "" @@ -53864,6 +54137,95 @@ msgstr "" msgid "A 17 round double stack box magazine for the SIG Sauer P320." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "Hi-Power magazine 9x19mm" +msgstr "" + +#. ~ Description for Hi-Power magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 13 round steel box magazine for the Browning Hi-Power 9x19mm." +msgstr "" + +#. ~ Description for Hi-Power magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 15 round steel box magazine for the Browning Hi-Power 9x19mm." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "P38 magazine" +msgstr "" + +#. ~ Description for P38 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8 round steel box magazine for the Walther P38." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine 9x19mm" +msgstr "" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Walther PPQ 9mm." +msgstr "" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 15 round steel box magazine for the Walther PPQ 9mm." +msgstr "" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 17 round steel box magazine for the Walther PPQ 9mm." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "C-9 magazine" +msgstr "" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Hi-Point C-9." +msgstr "" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point C-9." +msgstr "" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 15-round steel box magazine for use with the Hi-Point C-9." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "CZ 75 magazine" +msgstr "" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 12-round steel box magazine for use with the CZ 75." +msgstr "" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 20-round steel box magazine for use with the CZ 75." +msgstr "" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 26-round steel box magazine for use with the CZ 75." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "CCP magazine" +msgstr "" + +#. ~ Description for CCP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Walther CCP." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "Makarov PM magazine" msgstr "Makarov PM tár" @@ -57787,12 +58149,8 @@ msgstr "katonai lövegtorony" #: lang/json/MONSTER_from_json.py msgid "" "Leadworks LLC's T-4A1 Sentry. It features improved firmware over General " -"Atomics' TX-1 9x19mm model and an automated M4 carbine." +"Atomics' TX-1 9x19mm model and an automated 5.56mm carbine." msgstr "" -"A Leadworks LLC T-4A1 Sentry egy automatizált őrszem. A legújabb firmware " -"frissítésnek köszönhetően képes a beépített M4 karabély kezelésére, és " -"általában elmondható, hogy jobb a General Atomics 9x19mm-es TX-1 " -"lövegtornyánál." #: lang/json/MONSTER_from_json.py msgid "debug monster" @@ -59290,6 +59648,47 @@ msgid "" "between walls and ceiling with limbs grown from its own disjointed ribs." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "gangrenous impaler" +msgstr "" + +#. ~ Description for gangrenous impaler +#: lang/json/MONSTER_from_json.py +msgid "" +"A corpse hideously twisted into an insect-like form. A hollow tendril " +"reaches out from its open thorax." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "The impaler launches a barb!" +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "trapped tendril" +msgstr "" + +#. ~ Description for trapped tendril +#: lang/json/MONSTER_from_json.py +msgid "" +"A great tendril of mutated flesh and sharpened bone. Emergent from a " +"crevice in the ruined floor, hundreds of human limbs seek freedom and writhe" +" incessantly from underneath its grotesque carapace. As enormous as it may " +"already be, you feel certain that this is just part of a creature much " +"bigger, for when it moves, you can feel this whole ruin tremble, as if an " +"unseen giant struggled against the weight of its concrete tomb." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "flesh wall" +msgstr "" + +#. ~ Description for flesh wall +#: lang/json/MONSTER_from_json.py +msgid "" +"A great lump of mutated flesh. It resembles the innards of some gigantic " +"creature and is covered in a grid of diminutive veins." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "bloated fungal zombie" msgstr "" @@ -62896,6 +63295,24 @@ msgid "" "effect. Starts very short range, increases rapidly with level." msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Summon Gangrenous Crawlers" +msgstr "" + +#. ~ Description for Summon Gangrenous Crawlers +#: lang/json/SPELL_from_json.py +msgid "Summons 2 permanent gangrenous crawlers." +msgstr "" + +#: lang/json/SPELL_from_json.py +msgid "Summon Gangrenous Monsters" +msgstr "" + +#. ~ Description for Summon Gangrenous Monsters +#: lang/json/SPELL_from_json.py +msgid "Summons 2 permanent gangrenous impalers." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Smite" msgstr "" @@ -69734,6 +70151,19 @@ msgid "" "used for cleaning impervious surfaces." msgstr "" +#: lang/json/TOOL_from_json.py +msgid "washing kit" +msgid_plural "washing kits" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for washing kit +#: lang/json/TOOL_from_json.py +msgid "" +"A combination kit of a washboard and a sponge. Everything you need to clean" +" items after the apocalypse." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "reading light" msgid_plural "reading lights" @@ -78009,6 +78439,10 @@ msgstr "" msgid "nails" msgstr "szög" +#: lang/json/ammunition_type_from_json.py +msgid "barb" +msgstr "" + #: lang/json/ammunition_type_from_json.py msgid "BBs" msgstr "légpuska lövedék" @@ -78217,8 +78651,8 @@ msgid "components" msgstr "alkatrészek" #: lang/json/ammunition_type_from_json.py -msgid "93mm RPG-7" -msgstr "93mm RPG-7" +msgid "RPG-7 rocket" +msgstr "" #: lang/json/ammunition_type_from_json.py msgid "rebreather filter" @@ -78351,18 +78785,6 @@ msgid "" "those in turn more often than massive objects." msgstr "" -#: lang/json/bionic_from_json.py -msgid "Advanced Microreactor System" -msgstr "Modern mikroreaktor rendszer" - -#. ~ Description for Advanced Microreactor System -#: lang/json/bionic_from_json.py -msgid "" -"This stripped down mini-reactor is more efficient and safer than the base " -"model due to integrated radiation cleansers. There is no way to shut it " -"down once active, but you can toggle additional fuel intake." -msgstr "" - #: lang/json/bionic_from_json.py msgid "Alarm System" msgstr "Riasztórendszer" @@ -79235,28 +79657,6 @@ msgstr "" " csökkentheted az érzékeidet. A modul használata azonban növeli a " "reakcióidőt és tompasághoz vezethet." -#: lang/json/bionic_from_json.py -msgid "Plutonium Filter" -msgstr "Plutónium-szűrő" - -#. ~ Description for Plutonium Filter -#: lang/json/bionic_from_json.py -msgid "" -"This set of tanks and filters allows you to extract plutonium from " -"radioactive slurry." -msgstr "" - -#: lang/json/bionic_from_json.py -msgid "Plutonium Purger" -msgstr "Plutónium átfuvató" - -#. ~ Description for Plutonium Purger -#: lang/json/bionic_from_json.py -msgid "" -"Triggers an emergency reactor fuel purge that ejects all fuel from your " -"reactor." -msgstr "" - #. ~ Description for Bionic Visual Impairment #: lang/json/bionic_from_json.py msgid "" @@ -79392,18 +79792,6 @@ msgid "" "amount of unarmed slashing damage whenever your fingertips are uncovered." msgstr "" -#: lang/json/bionic_from_json.py -msgid "Microreactor System" -msgstr "Mikroreaktor rendszer" - -#. ~ Description for Microreactor System -#: lang/json/bionic_from_json.py -msgid "" -"This stripped down mini-reactor generates impressive amounts of bionic " -"power. There is no way to shut it down, but you can toggle additional fuel " -"intake. Irradiates your body when active." -msgstr "" - #: lang/json/bionic_from_json.py msgid "Recycler Unit" msgstr "Újrahasznosító egység" @@ -79868,6 +80256,52 @@ msgid "" "artificial but effective sensation of fatigue." msgstr "" +#: lang/json/bionic_from_json.py +msgid "Advanced Microreactor System" +msgstr "Modern mikroreaktor rendszer" + +#. ~ Description for Advanced Microreactor System +#: lang/json/bionic_from_json.py +msgid "" +"This stripped down mini-reactor is more efficient and safer than the base " +"model due to integrated radiation cleansers. There is no way to shut it " +"down once active, but you can toggle additional fuel intake." +msgstr "" + +#: lang/json/bionic_from_json.py +msgid "Plutonium Filter" +msgstr "Plutónium-szűrő" + +#. ~ Description for Plutonium Filter +#: lang/json/bionic_from_json.py +msgid "" +"This set of tanks and filters allows you to extract plutonium from " +"radioactive slurry." +msgstr "" + +#: lang/json/bionic_from_json.py +msgid "Plutonium Purger" +msgstr "Plutónium átfuvató" + +#. ~ Description for Plutonium Purger +#: lang/json/bionic_from_json.py +msgid "" +"Triggers an emergency reactor fuel purge that ejects all fuel from your " +"reactor." +msgstr "" + +#: lang/json/bionic_from_json.py +msgid "Microreactor System" +msgstr "Mikroreaktor rendszer" + +#. ~ Description for Microreactor System +#: lang/json/bionic_from_json.py +msgid "" +"This stripped down mini-reactor generates impressive amounts of bionic " +"power. There is no way to shut it down, but you can toggle additional fuel " +"intake. Irradiates your body when active." +msgstr "" + #: lang/json/bionic_from_json.py msgid "Internal Furnace" msgstr "Belső kazán" @@ -80000,9 +80434,7 @@ msgstr "A közelharc és a kitérés hatékonysága csökkent." #: lang/json/bodypart_from_json.py src/armor_layers.cpp src/character.cpp #: src/debug_menu.cpp msgid "Torso" -msgid_plural "Torso" -msgstr[0] "Törzs" -msgstr[1] "Törzs" +msgstr "Törzs" #. ~ Crafting recipes subcategory of 'ARMOR' category #: lang/json/bodypart_from_json.py lang/json/recipe_category_from_json.py @@ -80021,9 +80453,7 @@ msgstr "fejed" #: lang/json/bodypart_from_json.py src/armor_layers.cpp src/character.cpp #: src/debug_menu.cpp msgid "Head" -msgid_plural "Head" -msgstr[0] "Fej" -msgstr[1] "Fej" +msgstr "Fej" #. ~ Crafting recipes subcategory of 'ARMOR' category #: lang/json/bodypart_from_json.py lang/json/recipe_category_from_json.py @@ -80045,9 +80475,7 @@ msgstr "A tűzharc hatékonysága csökkent." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "Eyes" -msgid_plural "Eyes" -msgstr[0] "Szem" -msgstr[1] "Szem" +msgstr "Szem" #: lang/json/bodypart_from_json.py msgid "mouth" @@ -80064,9 +80492,7 @@ msgstr "A futás sebessége csökkent." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "Mouth" -msgid_plural "Mouth" -msgstr[0] "Száj" -msgstr[1] "Száj" +msgstr "Száj" #: lang/json/bodypart_from_json.py msgid "left arm" @@ -80077,15 +80503,26 @@ msgctxt "bodypart_accusative" msgid "left arm" msgstr "bal karod" +#: lang/json/bodypart_from_json.py +msgid "arms" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "arms" +msgstr "" + #: lang/json/bodypart_from_json.py msgid "Melee and ranged combat is hampered." msgstr "A közelharc és a tűzharc hatékonysága csökkent." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Arm" -msgid_plural "Arms" -msgstr[0] "B. Kar" -msgstr[1] "Karok" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgid "Arms" +msgstr "Karok" #: lang/json/bodypart_from_json.py msgid "L ARM" @@ -80102,9 +80539,7 @@ msgstr "jobb karod" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Arm" -msgid_plural "Arms" -msgstr[0] "J. Kar" -msgstr[1] "Karok" +msgstr "" #: lang/json/bodypart_from_json.py msgid "R ARM" @@ -80119,15 +80554,26 @@ msgctxt "bodypart_accusative" msgid "left hand" msgstr "bal kezed" +#: lang/json/bodypart_from_json.py +msgid "hands" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "hands" +msgstr "" + #: lang/json/bodypart_from_json.py msgid "Manual tasks are slowed." msgstr "A kézi műveletek sebessége csökkent." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Hand" -msgid_plural "Hands" -msgstr[0] "B. Kéz" -msgstr[1] "Kezek" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgid "Hands" +msgstr "Kezek" #: lang/json/bodypart_from_json.py msgid "right hand" @@ -80140,9 +80586,7 @@ msgstr "jobb kezed" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Hand" -msgid_plural "Hands" -msgstr[0] "J. Kéz" -msgstr[1] "Kezek" +msgstr "" #: lang/json/bodypart_from_json.py msgid "left leg" @@ -80153,15 +80597,26 @@ msgctxt "bodypart_accusative" msgid "left leg" msgstr "bal lábad" +#: lang/json/bodypart_from_json.py +msgid "legs" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "legs" +msgstr "" + #: lang/json/bodypart_from_json.py msgid "Running and swimming are slowed." msgstr "A futás és az úszás sebessége csökkent." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Leg" -msgid_plural "Legs" -msgstr[0] "B. Láb" -msgstr[1] "Lábak" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgid "Legs" +msgstr "Lábak" #: lang/json/bodypart_from_json.py msgid "L LEG" @@ -80178,9 +80633,7 @@ msgstr "jobb lábad" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Leg" -msgid_plural "Legs" -msgstr[0] "J. Láb" -msgstr[1] "Lábak" +msgstr "" #: lang/json/bodypart_from_json.py msgid "R LEG" @@ -80195,11 +80648,22 @@ msgctxt "bodypart_accusative" msgid "left foot" msgstr "bal lábfejed" +#: lang/json/bodypart_from_json.py +msgid "feet" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "feet" +msgstr "" + #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Foot" -msgid_plural "Feet" -msgstr[0] "B. Lábfej" -msgstr[1] "Lábfejek" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgid "Feet" +msgstr "Lábfejek" #: lang/json/bodypart_from_json.py msgid "right foot" @@ -80212,15 +80676,11 @@ msgstr "jobb lábfejed" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Foot" -msgid_plural "Feet" -msgstr[0] "J. Lábfej" -msgstr[1] "Lábfejek" +msgstr "" #: lang/json/bodypart_from_json.py msgid "appendix" -msgid_plural "Appendices" -msgstr[0] "vakbél" -msgstr[1] "Vakbél" +msgstr "vakbeled" #: lang/json/bodypart_from_json.py msgctxt "bodypart_accusative" @@ -80231,6 +80691,10 @@ msgstr "vakbeled" msgid "It's inflamed." msgstr "Begyulladt." +#: lang/json/bodypart_from_json.py +msgid "Appendices" +msgstr "Vakbél" + #: lang/json/clothing_mod_from_json.py msgid "Pad with leather" msgstr "Kibélelés bőrrel" @@ -89075,7 +89539,9 @@ msgstr "" "gyenge fegyver, apróvadra jó. A fegyverből kilőtt tüskék jó eséllyel " "sértetlenül megmaradnak és újra használhatók." -#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py src/item.cpp +#: lang/json/gun_from_json.py lang/json/gun_from_json.py +#: lang/json/gunmod_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gunmod_from_json.py src/item.cpp msgctxt "gun_type_type" msgid "pistol" msgstr "pisztoly" @@ -89214,6 +89680,21 @@ msgstr "" "szivattyú pedig újra nyomás alá helyezi a rendszert, bár ez eltarthat egy " "pár percig." +#: lang/json/gun_from_json.py +msgid "simple flamethrower" +msgid_plural "simple flamethrowers" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"A simple, home-made flamethrower. While its capacity is not superb, it is " +"more than capable of igniting terrain and monsters alike." +msgstr "" +"Egyszerű, házi készítésű lángszóró. Bár kapacitásáról nem fognak legendákat " +"írni, megfelelő mértékben lobbant lángra tereptárgyakat és szörnyeket " +"egyaránt." + #: lang/json/gun_from_json.py msgid "BB gun" msgid_plural "BB guns" @@ -89899,6 +90380,19 @@ msgid "" "safety issues." msgstr "" +#: lang/json/gun_from_json.py +msgid "Walther P22" +msgid_plural "Walther P22s" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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" +msgstr "" + #: lang/json/gun_from_json.py msgid "Remington ACR" msgid_plural "Remington ACRs" @@ -90931,6 +91425,20 @@ msgid "" " make for a moderately poor handling pistol." msgstr "" +#: lang/json/gun_from_json.py +msgid "Hi-Point CF-380" +msgid_plural "Hi-Point CF-380s" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "M1911A1" msgid_plural "M1911A1s" @@ -91023,6 +91531,47 @@ msgstr "" "A Smith & Wesson 610 egy 10 mm-es, illetve a S&W saját készítésű .40-es " "kaliberű lövedékekre kifejlesztett, klasszikus felépítésű revolver." +#: lang/json/gun_from_json.py +msgid "Browning Hi-Power .40 S&W" +msgid_plural "Browning Hi-Power .40 S&Ws" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Browning Hi-Power is a semi-automatic handgun developed shortly before " +"the second world war. Widely issued since then, it remains in use by India, " +"Canada and Australia. This is a commercial variant produced by Browning Arms" +" in .40 S&W." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther PPQ .40 S&W" +msgid_plural "Walther PPQ .40 S&Ws" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in .40 S&W." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Hi-Point Model JCP" +msgid_plural "Hi-Point Model JCPs" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "tube 40mm launcher" msgid_plural "tube 40mm launchers" @@ -91381,6 +91930,33 @@ msgid_plural "USP .45s" msgstr[0] "" msgstr[1] "" +#: lang/json/gun_from_json.py +msgid "Walther PPQ .45 ACP" +msgid_plural "Walther PPQ .45 ACPs" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in .45 ACP." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Hi-Point Model JHP" +msgid_plural "Hi-Point Model JHPs" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "Taurus Raging Bull" msgid_plural "Taurus Raging Bull" @@ -92404,6 +92980,94 @@ msgid "" "SIG Sauer P320." msgstr "" +#: lang/json/gun_from_json.py +msgid "Browning Hi-Power 9x19mm" +msgid_plural "Browning Hi-Power 9x19mms" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Browning Hi-Power is a semi-automatic handgun developed shortly before " +"the second world war. Widely issued since then, it remains in use by India, " +"Canada and Australia. This is a commercial variant produced by Browning Arms" +" in 9x19mm Parabellum." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther P38" +msgid_plural "Walther P38s" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther PPQ 9mm" +msgid_plural "Walther PPQ 9mms" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in 9x19mm Parabellum." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Hi-Point C-9" +msgid_plural "Hi-Point C-9s" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "CZ-75" +msgid_plural "CZ-75s" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The CZ-75 is a semi-automatic pistol developed in Czechoslovakia, and is one" +" of the original wonder nines. Though designed for export to western " +"countries, it was declared a state secret; lack of international patent " +"protection meant that many clones and variants were produced and distributed" +" around the world, with Česká zbrojovka only joining in the 90's. This " +"pistol remains wildly popular among competition shooters." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther CCP" +msgid_plural "Walther CCPs" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "Makarov PM" msgid_plural "Makarov PMs" @@ -92509,21 +93173,6 @@ msgstr "" "Nagyméretű lángszóró jelentős tüzelőanyag-tartalékkal. Egyszerre fenyegető " "és halálos." -#: lang/json/gun_from_json.py -msgid "simple flamethrower" -msgid_plural "simple flamethrowers" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/gun_from_json.py -msgid "" -"A simple, home-made flamethrower. While its capacity is not superb, it is " -"more than capable of igniting terrain and monsters alike." -msgstr "" -"Egyszerű, házi készítésű lángszóró. Bár kapacitásáról nem fognak legendákat " -"írni, megfelelő mértékben lobbant lángra tereptárgyakat és szörnyeket " -"egyaránt." - #: lang/json/gun_from_json.py msgid "RM451 flamethrower" msgid_plural "RM451 flamethrowers" @@ -92650,6 +93299,16 @@ msgstr "" "atmoszferikus öngyulladási hipersebességre gyorsítja fel. Energiáját az ET " "biztosítja." +#: lang/json/gun_from_json.py +msgid "barb launching organ" +msgid_plural "barb launching organs" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "A mutated organ capable of launching bony barbs at great speed." +msgstr "" + #: lang/json/gun_from_json.py msgid "coilgun" msgid_plural "coilguns" @@ -93302,6 +93961,19 @@ msgstr "" "oxigént, ezért mozgása közben tüzeket gyújt, valamint becsapódáskor " "felrobbant." +#: lang/json/gun_from_json.py +msgid "Yeet Cannon" +msgid_plural "Yeet Cannons" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"You can YEET all the bullets with this baby. YEET them right into all of the" +" zombies in your path, all the hulks, the spiders, and those damned mole " +"rats." +msgstr "" + #: lang/json/gun_from_json.py msgid "SVS-24" msgid_plural "SVS-24" @@ -95122,27 +95794,6 @@ msgstr "" "készített revolver. Betárazható továbbá .410 sörétes puska és .45 Long Colt " "lövedékekkel is." -#: lang/json/gunmod_from_json.py -msgid ".300 AAC Blackout caliber conversion kit" -msgid_plural ".300 AAC Blackout caliber conversion kits" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/gunmod_from_json.py -msgid "" -"This kit is used to convert an AR-15 .223/5.56mm rifle to the new .300BLK " -"caliber." -msgstr "" - -#: lang/json/gunmod_from_json.py -msgid "bore" -msgstr "kaliber" - -#: lang/json/gunmod_from_json.py -msgctxt "gun_type_type" -msgid "ar15" -msgstr "AR15" - #: lang/json/gunmod_from_json.py msgid "barrel extension" msgid_plural "barrel extensions" @@ -95242,6 +95893,10 @@ msgstr "" "számos kulcsfontosságú részét alakítja át .22 kaliberre. Az átalakítás " "eredményeképpen egy kicsit csökken a fegyver pontossága." +#: lang/json/gunmod_from_json.py +msgid "bore" +msgstr "kaliber" + #: lang/json/gunmod_from_json.py msgid ".223 caliber conversion kit" msgid_plural ".223 caliber conversion kits" @@ -95604,6 +96259,36 @@ msgstr "" "A fegyver oldalára szerelt zsák összegyűjti a töltényhüvelyeket, így azokat " "nem kell külön felszedni." +#: lang/json/gunmod_from_json.py +msgid ".300 AAC Blackout AR-15 conversion kit" +msgid_plural ".300 AAC Blackout AR-15 conversion kits" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gunmod_from_json.py +msgid "A complete AR-15 upper assembly with a .300 AAC Blackout barrel." +msgstr "" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "ar15" +msgstr "AR15" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "m4a1" +msgstr "" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "h&k416a5" +msgstr "" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "m27iar" +msgstr "" + #: lang/json/gunmod_from_json.py msgid "lightweight replacement furniture" msgid_plural "lightweight replacement furnitures" @@ -97843,11 +98528,11 @@ msgstr "" #: lang/json/help_from_json.py msgid "" -"While magazines are often firearm-specific, on some occasions a magazine is compatible with several other firearms. The firearms in the game often reflect real-world prototypes in terms of caliber and compatibility. Below are some examples of interchangeable ammo:\n" -".308 = 7.62x51mm,\n" -".223 = 5.56 NATO,\n" -".270 = .30-06,\n" -".40 S&W = 10mm." +"While magazines and clips are often firearm-specific, on some occasions a magazine/speedloader is compatible with several other firearms or calibers. Below are some examples of calibers that might share magazines or speedloaders:\n" +".380 ACP and 9mm Luger,\n" +" .40 S&W and 10mm Auto 3\n" +".45 ACP and .460 Rowland,\n" +".45 Colt and .454 Casull." msgstr "" #: lang/json/help_from_json.py @@ -98956,8 +99641,9 @@ msgid "Measure radiation" msgstr "Sugárzásmérés" #: lang/json/item_action_from_json.py lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py #: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py -#: lang/json/talk_topic_from_json.py src/game_inventory.cpp +#: src/game_inventory.cpp msgid "..." msgstr "..." @@ -99019,11 +99705,15 @@ msgid "Well, you know" msgstr "Hát, tudod" #: lang/json/item_action_from_json.py -msgid "Wash clothes" -msgstr "Ruhamosás" +msgid "Wash soft items" +msgstr "" + +#: lang/json/item_action_from_json.py +msgid "Wash hard items" +msgstr "" #: lang/json/item_action_from_json.py -msgid "Wash CBMs" +msgid "Wash items" msgstr "" #: lang/json/item_action_from_json.py @@ -102673,6 +103363,41 @@ msgstr "" msgid "the name is gone but a slogan remains: 'We'll repair you all the way'" msgstr "" +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "EnviroCom OS v2.03 - Basement Access" +msgstr "" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Unlock stairs" +msgstr "Lépcsőzár feloldása" + +#. ~ Sign +#: lang/json/mapgen_from_json.py +msgid "Authorized personnel only" +msgstr "" + +#. ~ Sign +#: lang/json/mapgen_from_json.py +msgid " sewage treatment plant" +msgstr "" + +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "EnviroCom OS v2.03" +msgstr "EnviroCom OS v2.03" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Download Sewer Maps" +msgstr "Szennyvíztérkép letöltése" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Divert sample" +msgstr "Minta eltérítése" + #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Evac shelter computer" @@ -103285,6 +104010,43 @@ msgid "" "Blocked damage reduced by 50%% of Dexterity." msgstr "" +#. ~ Description for martial art 'Fior Di Battaglia' +#: lang/json/martial_art_from_json.py +msgid "" +"Medieval Europe's martial techniques for fighting with polearms. The " +"\"Flower of Battle\" places great focus on countering one's opponent and " +"knocking them down before landing a killing blow" +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stand Your Ground" +msgstr "" + +#. ~ Description of buff 'Stand Your Ground' for martial art 'Fior Di +#. Battaglia' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You stalwart and will not budge against any threat.\n" +"\n" +"+2 Block attempts, -1.0 Dodge skill, blocked damage reduced by 50%% of Strength." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Tactical Retreat" +msgstr "" + +#. ~ Description of buff 'Tactical Retreat' for martial art 'Fior Di +#. Battaglia' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You moved and nullified the effects of Stand Your Ground!\n" +"\n" +"-2 Block attempts, +1.0 Dodge skill, blocked damaged increased by 50%% of Strength.\n" +"Lasts 1 turn." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Karate" msgstr "Karate" @@ -103766,35 +104528,6 @@ msgstr "" msgid "Perception increases dodging ability, +1 dodges per turn" msgstr "" -#. ~ Description for martial art 'Fior Di Battaglia' -#: lang/json/martial_art_from_json.py -msgid "" -"Medieval Europe's martial techniques for fighting with polearms, great focus" -" is given in countering one's opponent and knocking them down before landing" -" a killing blow" -msgstr "" - -#: lang/json/martial_art_from_json.py -msgid "Stand Your Ground" -msgstr "" - -#. ~ Description of buff 'Stand Your Ground' for martial art 'Fior Di -#. Battaglia' -#: lang/json/martial_art_from_json.py -msgid "" -"+2 blocks -1 dodge, halves your dodge and damage is reduced by your strength" -" when blocking" -msgstr "" - -#: lang/json/martial_art_from_json.py -msgid "You moved" -msgstr "" - -#. ~ Description of buff 'You moved' for martial art 'Fior Di Battaglia' -#: lang/json/martial_art_from_json.py -msgid "Nullifies Stand Your Ground, don't move, stand there and counter!" -msgstr "" - #: lang/json/martial_art_from_json.py msgid "Medieval Swordsmanship" msgstr "Középkori kardforgatás " @@ -105780,39 +106513,6 @@ msgstr "" msgid "Oh no! My poor puppy..." msgstr "" -#: lang/json/mission_def_from_json.py -msgid "Find 100 Cigarettes" -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "Come on man, I just need a smoke." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "" -"With all that's been going on, it's been more and more difficult to find a " -"smoke. My stash has been running low for a while now. Think you could help" -" me out here? A few packs is all I need." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "Thanks, it's great to see someone willing to help a guy out." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "" -"Plenty of smokers in towns. Gotta be some left over cigs in some of them " -"houses." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "Got the smokes?" -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "Thanks! I'll be sure to put in a good word for you around the center." -msgstr "" - #: lang/json/mission_def_from_json.py msgid "Break into armory to retrieve family photo" msgstr "" @@ -107087,7 +107787,7 @@ msgid "" msgstr "" #: lang/json/mission_def_from_json.py -msgid "Find 50 3L jars" +msgid "In a Pickle Pt. 2" msgstr "" #: lang/json/mission_def_from_json.py @@ -107116,6 +107816,39 @@ msgid "" "payment." msgstr "" +#: lang/json/mission_def_from_json.py +msgid "Smokes, let's go." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Come on man, I just need a smoke." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"With all that's been going on, it's been more and more difficult to find a " +"smoke. My stash has been running low for a while now. Think you could help" +" me out here? A few packs is all I need." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Thanks, it's great to see someone willing to help a guy out." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Plenty of smokers in towns. Gotta be some left over cigs in some of them " +"houses." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Got the smokes?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Thanks! I'll be sure to put in a good word for you around the center." +msgstr "" + #: lang/json/mission_def_from_json.py msgid "Clear Back Bay" msgstr "Rakj rendet a hátsó rakodónál" @@ -107235,7 +107968,7 @@ msgid "" msgstr "" #: lang/json/mission_def_from_json.py -msgid "Find 10 solar panels" +msgid "Solar Power" msgstr "" #: lang/json/mission_def_from_json.py @@ -107267,7 +108000,7 @@ msgstr "" " a bővítést." #: lang/json/mission_def_from_json.py -msgid "Find 100 canning jars" +msgid "In a Pickle" msgstr "" #: lang/json/mission_def_from_json.py @@ -107511,7 +108244,7 @@ msgid "Thank you, I'll do the explaining if anyone else asks about it." msgstr "" #: lang/json/mission_def_from_json.py -msgid "Kill ???" +msgid "Secure Trade Route" msgstr "" #: lang/json/mission_def_from_json.py @@ -107537,7 +108270,7 @@ msgid "Great work, wasn't sure what I was sending you after." msgstr "" #: lang/json/mission_def_from_json.py -msgid "Kill Raider Leader" +msgid "Assassinate Raider Leader" msgstr "" #: lang/json/mission_def_from_json.py @@ -107652,8 +108385,8 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" -"Remember, do extraction /exactly/ as specified, otherwise the bionic will " -"self-destruct." +"Remember, perform the extraction /exactly/ as specified, otherwise the " +"bionic will self-destruct." msgstr "" #: lang/json/mission_def_from_json.py @@ -107677,6 +108410,37 @@ msgstr "" msgid "You have our thanks and payment." msgstr "" +#: lang/json/mission_def_from_json.py +msgid "Light retrieval" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Our facility once sourced advanced photonic circuitry from a nearby robotics manufacturer. Their building suffered major damage during the portal storms, and collapsed almost entirely. However, preliminary scouting reveals that the basement prototyping lab likely remains intact.\n" +"\n" +"the intercom: We ask you to investigate the ruins, and if possible, retrieve a template for the fabrication of said photonic circuitry." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "We expect your success, mercenary." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Return if you change your mind." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"The scout drone also revealed extensive heat signatures and high " +"concentrations of toxic compounds within the ruins, plan accordingly. We " +"are willing to sell you some protective gear at a discount, if you require " +"it." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Have you retrieved the blueprints?" +msgstr "" + #: lang/json/mission_def_from_json.py msgid "Make 2 Stills" msgstr "" @@ -119115,6 +119879,10 @@ msgstr "cukormázas ház" msgid "sugar house roof" msgstr "" +#: lang/json/overmap_terrain_from_json.py +msgid "rural road" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "farm field" msgstr "farm mezeje" @@ -120939,8 +121707,16 @@ msgid "parking garage" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "sewage treatment" -msgstr "szennyvíztisztító" +msgid "sewage treatment plant" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment plant roof" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment plant - underground" +msgstr "" #: lang/json/overmap_terrain_from_json.py msgid "toxic waste dump" @@ -121247,6 +122023,10 @@ msgstr "" msgid "mechanics garage" msgstr "gépészeti szervíz" +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment" +msgstr "szennyvíztisztító" + #: lang/json/overmap_terrain_from_json.py msgid "mechanic garage" msgstr "gépészeti szervíz" @@ -122251,6 +123031,34 @@ msgstr "" "Nem tudod pontosan, hogy mi történt, de egyszer csak minden szar, és csak az" " jár a fejedben, hogy a következő löketet honnan szerzed." +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Pillhead" +msgstr "" + +#. ~ Profession (male Pillhead) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"After an accident in your youth, you got addicted to the opiates treating " +"your pain. With the pharmacies shut down and dealers turned undead, " +"satisfying your fix just got a lot more difficult." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Pillhead" +msgstr "" + +#. ~ Profession (female Pillhead) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"After an accident in your youth, you got addicted to the opiates treating " +"your pain. With the pharmacies shut down and dealers turned undead, " +"satisfying your fix just got a lot more difficult." +msgstr "" + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "K9 Officer" @@ -128799,7 +129607,6 @@ msgid "WEAPON" msgstr "FEGYVER" #. ~ Crafting recipes subcategory all -#. ~ Crafting recipes subcategory of 'ENCHANTED' category #: lang/json/recipe_category_from_json.py #: lang/json/recipe_category_from_json.py src/crafting_gui.cpp msgid "ALL" @@ -132172,10 +132979,8 @@ msgstr "" "először beszerezned." #: lang/json/snippet_from_json.py -msgid "Wounds heal over time. Bandages and disinfectant speeds that up." +msgid "Wounds heal over time. Bandages and antiseptic speeds that up." msgstr "" -"A sebek idővel begyógyulnak. A sebek bekötözése és fertőtlenítése " -"felgyorsíthatja ezt a folyamatot." #: lang/json/snippet_from_json.py msgid "Don't get grabbed by zombies. Their bites can be infectious." @@ -133012,8 +133817,8 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "" -"If you have extra disinfectant, use it to disinfect your wounds, even if " -"they aren't infected. They will recover faster that way." +"If you have extra antiseptic, use it to disinfect your wounds, even if they " +"aren't infected. They will recover faster that way." msgstr "" #: lang/json/snippet_from_json.py @@ -139341,13 +140146,6 @@ msgid "" "expert." msgstr "" -#: lang/json/snippet_from_json.py -msgid "" -"WAR ON DRUGS DEAD: The government has finally reacted to long accumulated " -"evidence that suggests that decriminalized drugs cause fewer health problems" -" and are generally better managed while providing valuable tax revenues." -msgstr "" - #: lang/json/snippet_from_json.py msgid "" "FEELING BLUE? Try \"Greens\" for Magazines! Your local Supermarket! " @@ -143990,8 +144788,7 @@ msgid "" "Bionics are augmentation packages, right? They come in these installable Compact Bionic Modules or CBMs, and I can use some CBMs - if you examine a CBM, it will tell you if I can use it.\n" " Find a programmable surgical installer or autodoc, position me on the couch, and activate it, and you can install a suitable CBM to me - or if I think I'll do a better job, I'll do. I'll take over installing CBMs into you if I'm better at it.\n" " I can use almost all passive bionics and some active bionics. If I have any active bionics, I'll try to use them sensibly, but if we're in danger, I'm going to activate anything that might give me an edge. I'll use any weapon bionics if they're better than the weapons you gave me, but if you think I should reserve my bionic energy for my defensive and healing bionics, you can tell me how much to reserve. I'll try to keep my bionic energy topped off, but if we're running low on supplies, you can tell me to stop recharging when I'm not full.\n" -" I'll tell you if I'm low on bionic energy and can't recharge, and what fuel I need.\n" -" Sothere are some internal atomic reactor bionics - I can use those, but I can only recharge them with plutonium slurry. That stuff is radioactive, so do us both a favor and don't give me an internal reactor unless you really like glowing in the dark." +" I'll tell you if I'm low on bionic energy and can't recharge, and what fuel I need." msgstr "" #: lang/json/talk_topic_from_json.py @@ -144171,11 +144968,11 @@ msgid "Go back to sleep." msgstr "Menj vissza aludni." #: lang/json/talk_topic_from_json.py -msgid " *pshhhttt* I'm reading you boss, over." +msgid "What is it, friend?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "What is it, friend?" +msgid " *pshhhttt* I'm reading you boss, over." msgstr "" #: lang/json/talk_topic_from_json.py @@ -144414,11 +145211,11 @@ msgid "Show me what needs to be done at the camp." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I'm currently ." +msgid "I'm not doing much currently." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I'm not doing much currently." +msgid "I'm currently ." msgstr "" #: lang/json/talk_topic_from_json.py @@ -144473,13 +145270,13 @@ msgid "OK, maybe it'll stop me from freezing in this weather, what's up?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "" -"Well, it's the time of day for a quick break surely! How are you holding " -"up?" +msgid "Man it's dark out isn't it? what's up?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Man it's dark out isn't it? what's up?" +msgid "" +"Well, it's the time of day for a quick break surely! How are you holding " +"up?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -144488,14 +145285,14 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Definitely, by the way, thanks for helping me so much with my tasks! " -"Anyway, you coping OK, ? " +"OK, let's take a moment, oh, and thanks for helping me with that thing, " +"so... what's up?" msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"OK, let's take a moment, oh, and thanks for helping me with that thing, " -"so... what's up?" +"Definitely, by the way, thanks for helping me so much with my tasks! " +"Anyway, you coping OK, ? " msgstr "" #: lang/json/talk_topic_from_json.py @@ -144569,14 +145366,14 @@ msgstr "Oké, csak semmi hirtelen mozdulat..." msgid "Keep your distance!" msgstr "Maradj távol!" -#: lang/json/talk_topic_from_json.py -msgid "" -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "This is my territory, ." msgstr "Ez itt az én területem, ." +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Calm down. I'm not going to hurt you." msgstr "Nyugi! Nem foglak bántani." @@ -144630,27 +145427,27 @@ msgid "I don't care." msgstr "Nem érdekel." #: lang/json/talk_topic_from_json.py -msgid "I don't have any jobs for you." +msgid "I have other jobs for you. Want to hear about them?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I don't have any more jobs for you." +msgid "I have more jobs for you. Want to hear about them?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I have other jobs for you. Want to hear about them?" +msgid "I just have one job for you. Want to hear about it?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I have more jobs for you. Want to hear about them?" +msgid "I have another job for you. Want to hear about it?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I have another job for you. Want to hear about it?" +msgid "I don't have any more jobs for you." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I just have one job for you. Want to hear about it?" +msgid "I don't have any jobs for you." msgstr "" #: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py @@ -144663,7 +145460,7 @@ msgid "Never mind, I'm not interested." msgstr "Mindegy, nem érdekel." #: lang/json/talk_topic_from_json.py -msgid "You're not working on anything for me now." +msgid "What about it?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -144671,7 +145468,7 @@ msgid "Which job?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "What about it?" +msgid "You're not working on anything for me now." msgstr "" #: lang/json/talk_topic_from_json.py @@ -150153,7 +150950,7 @@ msgid "All right! Let's get going." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "We've done it! We've solved the list!" +msgid "Have I told you about cardboard, friend? Do you have any?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -150162,7 +150959,7 @@ msgid "" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Have I told you about cardboard, friend? Do you have any?" +msgid "We've done it! We've solved the list!" msgstr "" #: lang/json/talk_topic_from_json.py @@ -154429,6 +155226,10 @@ msgstr "" msgid "What the hell were you testing out there?" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "So, about that protective gear?" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "No. Now leave." msgstr "" @@ -154444,6 +155245,21 @@ msgid "" "Shame about what happened, with the evisceration and all..." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"Given the current context, we are willing to sell you a set of our protective gear: gas mask, suit and gear, at a considerable discount. We will sell it for two of our coins.\n" +"\n" +"the intercom: Hmm wait, we might not have your size..." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "[ 2 Hub 01 Gold Coins ] Deal!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I have to give it a thought." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Just leave." msgstr "" @@ -156165,6 +156981,86 @@ msgstr "" msgid " delivers a perfect riposte to %s" msgstr "" +#: lang/json/technique_from_json.py +msgid "Displace and Hook" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You parry and hook %s down" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " parries and hooks %s down" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "High Round Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You swing high and strike at %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " swings high and strikes %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "High Round Feint" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You fake a high round strike at %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " feints at %s" +msgstr " cselfogást mér a(z) %s testére" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab you, but you push away!" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab , but they push away!" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Hook and Drag" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You hook and drag %s down" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " hooks and drags %s down" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Colpo di Grazia" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You swing down hard and execute %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " swings down hard and executes %s" +msgstr "" + #: lang/json/technique_from_json.py msgid "quick punch" msgstr "gyorsütés" @@ -156342,11 +157238,6 @@ msgstr "cselfogás" msgid "You feint at %s" msgstr "Cselfogást mérsz a(z) %s testére" -#: lang/json/technique_from_json.py -#, python-format -msgid " feints at %s" -msgstr " cselfogást mér a(z) %s testére" - #: lang/json/technique_from_json.py #, python-format msgid "You jab %s" @@ -156795,57 +157686,6 @@ msgstr "" msgid " receives %s's attack, and counters" msgstr "" -#: lang/json/technique_from_json.py -msgid "Displace and Hook" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You parry %s attack and hook them down" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid " parries %s attack and hooks them down" -msgstr "" - -#: lang/json/technique_from_json.py -msgid "High Round Strike" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You swing high and strike at %s" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid " swings high and strikes %s" -msgstr "" - -#: lang/json/technique_from_json.py -msgid "High Round Feint" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You fake a high round strike at %s" -msgstr "" - -#: lang/json/technique_from_json.py -msgid "High Round Stab" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You quickly stab %s" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid " quickly stabs %s" -msgstr "" - #: lang/json/technique_from_json.py msgid "grab and pommel strike" msgstr "" @@ -158513,6 +159353,16 @@ msgstr "" msgid "SMASH!" msgstr "" +#: lang/json/terrain_from_json.py +msgid "metal floor" +msgstr "fémpadló" + +#. ~ Description for metal floor +#: lang/json/terrain_from_json.py +msgid "" +"High-quality and tough checkered flooring to reduce risk of slips and falls." +msgstr "" + #: lang/json/terrain_from_json.py msgid "linoleum tile" msgstr "linóleum csempe" @@ -158610,10 +159460,6 @@ msgid "" "smoothed and the roof isn't quite filled in yet." msgstr "" -#: lang/json/terrain_from_json.py -msgid "metal floor" -msgstr "fémpadló" - #. ~ Description for metal floor #: lang/json/terrain_from_json.py msgid "" @@ -163859,6 +164705,16 @@ msgstr "" msgid "biosilicfied chitin ram" msgstr "" +#: lang/json/vehicle_part_from_json.py +msgid "tied mattress" +msgstr "" + +#. ~ Description for tied mattress +#: lang/json/vehicle_part_from_json.py +msgid "" +"A mattress, strapped onto the vehicle. It could serve to blunt any impact." +msgstr "" + #. ~ Description for shredder #: lang/json/vehicle_part_from_json.py msgid "" @@ -168199,6 +169055,10 @@ msgstr "" msgid "Stop %s?" msgstr "" +#: src/activity_type.h +msgid "THIS IS A BUG" +msgstr "" + #: src/addiction.cpp msgid "You need some nicotine." msgstr "Valami nikotintartalmút szeretnél." @@ -169738,10 +170598,6 @@ msgstr "%1$s %2$s" msgid "artifact file" msgstr "" -#: src/auto_pickup.cpp -msgid " AUTO PICKUP MANAGER " -msgstr "AUTO FELVÉTEL BEÁLLÍTÁSAI" - #: src/auto_pickup.cpp src/game.cpp src/safemode_ui.cpp msgid "dd" msgstr "Hozzád" @@ -169790,14 +170646,6 @@ msgstr "Szabályok" msgid "I/E" msgstr "I/E" -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "[]" -msgstr "[]" - -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "[]" -msgstr "[]" - #: src/auto_pickup.cpp msgid "Auto pickup enabled:" msgstr "Auto felvétel be:" @@ -169814,10 +170662,6 @@ msgstr "Igen" msgid "witch" msgstr " Vált" -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "Please load a character first to use this page!" -msgstr "Ehhez az oldalhoz először be kell tölteni egy karaktert." - #: src/auto_pickup.cpp src/safemode_ui.cpp msgid "" msgstr "<üres szabály>" @@ -169867,6 +170711,18 @@ msgstr "Felszedési szabály:" msgid "Save changes?" msgstr "Mented a változtatásokat?" +#: src/auto_pickup.cpp +msgid " AUTO PICKUP MANAGER " +msgstr "AUTO FELVÉTEL BEÁLLÍTÁSAI" + +#: src/auto_pickup.cpp src/safemode_ui.cpp +msgid "[]" +msgstr "[]" + +#: src/auto_pickup.cpp src/safemode_ui.cpp +msgid "[]" +msgstr "[]" + #: src/auto_pickup.cpp #, c-format msgid "%1$d item matches: %2$s" @@ -169887,6 +170743,11 @@ msgstr "" msgid "autopickup configuration" msgstr "Auto felvét beállításai" +#: src/auto_pickup.cpp +#, c-format +msgid "Pickup rules for %s" +msgstr "" + #: src/avatar.cpp src/iuse.cpp msgid "He" msgstr "Ez a férfi" @@ -171132,7 +171993,37 @@ msgstr "Behúzod a(z) %st." #: src/bionics.cpp #, c-format -msgid "%s withdraws %s %s." +msgid " withdraws %s %s." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Your %s does not have enought fuel to start." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "'s %s does not have enought fuel to start." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Your %s turns off to not waste fuel." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "'s %s turns off to not waste fuel." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Your %s runs out of fuel and turn off." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "'s %s runs out of fuel and turn off." msgstr "" #: src/bionics.cpp @@ -171522,6 +172413,10 @@ msgstr "" "Ahogy érzed az öntudatod elvesztését egy kicsit sajnálod, hogy nem fogod " "tudni végig élvezni a műtétet." +#: src/bionics_ui.cpp +msgid "Available Fuel: " +msgstr "" + #: src/bionics_ui.cpp #, c-format msgid "" @@ -174752,6 +175647,20 @@ msgid_plural " digests a %s and recharges %d points of energy." msgstr[0] "" msgstr[1] "" +#: src/consumption.cpp +#, c-format +msgid "You load %i charge of %s in your %s." +msgid_plural "You load %i charges of %s in your %s." +msgstr[0] "" +msgstr[1] "" + +#: src/consumption.cpp +#, c-format +msgid " load %i charge of %s in their %s." +msgid_plural " load %i charges of %s in their %s." +msgstr[0] "" +msgstr[1] "" + #: src/craft_command.cpp src/crafting.cpp src/veh_interact.cpp msgid " (nearby)" msgstr " (közel)" @@ -174835,8 +175744,10 @@ msgstr "Azt többé már nem tudod elkészíteni!" #: src/crafting.cpp #, c-format -msgid "You don't have anything to store %s in!" -msgstr "Nincsen semmid, ahol a(z) %st el tudnád tárolni!" +msgid "" +"You don't have anything in which to store %s and may have to pour it out or " +"consume it as soon as it is prepared! Proceed?" +msgstr "" #: src/crafting.cpp src/pickup.cpp #, c-format @@ -175433,6 +176344,10 @@ msgstr "Jó találat!" msgid "Grazing hit." msgstr "Lepattanó találat." +#: src/creature.cpp +msgid "You feel poison coursing through your body!" +msgstr "" + #: src/creature.cpp msgid "The shot misses!" msgstr "A lövedék nem talál!" @@ -176993,21 +177908,21 @@ msgid "You can't see the terrain here." msgstr "Itt nem látsz semmiféle talajt." #: src/descriptions.cpp +#, c-format msgid "" "\n" -"Sign: ???" +"Sign: %s" msgstr "" "\n" -"Tábla: ???" +"Tábla: %s" #: src/descriptions.cpp -#, c-format msgid "" "\n" -"Sign: %s" +"Sign: ???" msgstr "" "\n" -"Tábla: %s" +"Tábla: ???" #: src/descriptions.cpp src/iexamine.cpp #, c-format @@ -179969,20 +180884,6 @@ msgstr "UI adatok" msgid "Failed to save game data" msgstr "A játékállás adatait nem sikerült elmenteni" -#: src/game.cpp -msgid "You haven't killed any monsters yet!" -msgstr "Még egy szörnyet sem öltél meg!" - -#: src/game.cpp -#, c-format -msgid "KILL COUNT: %d" -msgstr "ÁLDOZATOK: %d" - -#: src/game.cpp -#, c-format -msgid "Experience: %d (%d points available)" -msgstr "" - #: src/game.cpp msgid " You are forgotten among the billions lost in the cataclysm..." msgstr "" @@ -182004,6 +182905,11 @@ msgstr "Kiömlött folyadékot nem lehet meginni" msgid "You're fully charged" msgstr "Teljesen fel vagy töltve" +#: src/game_inventory.cpp +#, c-format +msgid "No space to store more %s" +msgstr "" + #: src/game_inventory.cpp msgid "soon!" msgstr "hamarosan!" @@ -182036,6 +182942,18 @@ msgstr "régi" msgid "rotten" msgstr "rohadt" +#: src/game_inventory.cpp src/panels.cpp +msgid "Food :" +msgstr "" + +#: src/game_inventory.cpp src/panels.cpp +msgid "Drink:" +msgstr "" + +#: src/game_inventory.cpp src/panels.cpp +msgid "Pain :" +msgstr "" + #: src/game_inventory.cpp msgid "Consume item" msgstr "Tárgy elfogyasztása" @@ -184771,6 +185689,14 @@ msgstr "Válaszd ki, hogy melyik implantált bionikát szeretnéd kiszedni." msgid "ERROR NO SPACE AVAILABLE. Operation impossible. Exiting." msgstr "" +#: src/iexamine.cpp +msgid "Personality_Override" +msgstr "" + +#: src/iexamine.cpp +msgid "C0RR#PTED?D#TA" +msgstr "" + #: src/iexamine.cpp msgid "Choose bionic to uninstall" msgstr "Válaszd ki, hogy melyik bionikát szeretnéd kiszedni." @@ -186034,8 +186960,8 @@ msgid "Capacity: " msgstr "Kapacitás: " #: src/item.cpp -msgid " per round" -msgstr "lövedékenként " +msgid " moves per round" +msgstr "" #: src/item.cpp msgid "Reload time: " @@ -186132,8 +187058,8 @@ msgid "" msgstr "" #: src/item.cpp -msgid " seconds" -msgstr " másodperc" +msgid " moves " +msgstr "" #: src/item.cpp msgid "Time to reach aim level: " @@ -186167,10 +187093,6 @@ msgstr "Tényleges visszarúgás: " msgid "Recommended strength (burst): " msgstr "Javasolt erő (sorozathoz): " -#: src/item.cpp -msgid " seconds per round" -msgstr "töltényenként másodperc" - #: src/item.cpp msgid "Fire modes: " msgstr "Tüzelési módok: " @@ -186441,6 +187363,14 @@ msgid "" "improve them by repairing this item." msgstr "" +#: src/item.cpp +msgid "Weight capacity modifier: " +msgstr "" + +#: src/item.cpp +msgid "Weight capacity bonus: " +msgstr "" + #: src/item.cpp msgid "Just for fun." msgstr "Csak a móka kedvéért." @@ -186897,6 +187827,14 @@ msgstr "" msgid "This bionic is installed in the following body part(s):" msgstr "Ez a bionika az alábbi testrészekbe került beépítésre:" +#: src/item.cpp +msgid "Encumbrance: " +msgstr "" + +#: src/item.cpp +msgid "Environmental Protection: " +msgstr "" + #: src/item.cpp msgid "* This weapon needs two free hands to fire." msgstr "" @@ -190185,6 +191123,11 @@ msgstr "" msgid " illuminated by %s" msgstr "" +#: src/iuse.cpp +#, c-format +msgid " in %s cloud" +msgstr "" + #: src/iuse.cpp #, c-format msgid " with graffiti \"%s\"" @@ -191392,6 +192335,10 @@ msgstr "" msgid "There is also a certain bionic that helps with this kind of armor." msgstr "" +#: src/iuse_actor.cpp +msgid "No lock to pick." +msgstr "" + #: src/iuse_actor.cpp msgid "Use your lockpick where?" msgstr "" @@ -193429,6 +194376,20 @@ msgstr "" msgid "ndo move" msgstr "" +#: src/kill_tracker.cpp +msgid "You haven't killed any monsters yet!" +msgstr "Még egy szörnyet sem öltél meg!" + +#: src/kill_tracker.cpp +#, c-format +msgid "KILL COUNT: %d" +msgstr "ÁLDOZATOK: %d" + +#: src/kill_tracker.cpp +#, c-format +msgid "Experience: %d (%d points available)" +msgstr "" + #. ~ abbreviated direction names and long direction names #: src/line.cpp msgid "N " @@ -193698,6 +194659,16 @@ msgstr "" msgid "an explosion" msgstr "" +#: src/magic.cpp +#, c-format +msgid "%s and %s" +msgstr "" + +#: src/magic.cpp src/player.cpp +#, c-format +msgid "%s, %s" +msgstr "%s, %s" + #: src/magic.cpp #, c-format msgid "" @@ -193734,6 +194705,11 @@ msgstr "" msgid "Popup Distractions" msgstr "" +#: src/magic.cpp +#, c-format +msgid "%d moves" +msgstr "" + #: src/magic.cpp msgid "requires concentration" msgstr "" @@ -194257,7 +195233,7 @@ msgstr "" #: src/map.cpp #, c-format -msgid "The autoclave in the %s has finished washing." +msgid "The autoclave in the %s has finished its cycle." msgstr "" #: src/map.cpp @@ -194523,22 +195499,6 @@ msgstr "Kamranyitás" msgid "Missile Controls" msgstr "Rakétavezérlés" -#: src/mapgen.cpp -msgid "EnviroCom OS v2.03" -msgstr "EnviroCom OS v2.03" - -#: src/mapgen.cpp -msgid "Unlock stairs" -msgstr "Lépcsőzár feloldása" - -#: src/mapgen.cpp -msgid "Download Sewer Maps" -msgstr "Szennyvíztérkép letöltése" - -#: src/mapgen.cpp -msgid "Divert sample" -msgstr "Minta eltérítése" - #: src/mapgen.cpp msgid "NEPowerOS" msgstr "NEPowerOS" @@ -197122,6 +198082,11 @@ msgstr "" msgid "The %1$s's arms fly out and pull and grab %2$s!" msgstr "" +#: src/monattack.cpp +#, c-format +msgid "The %1$s reaches out and pulls %2$s!" +msgstr "" + #: src/monattack.cpp #, c-format msgid "The %s gropes at you, but you dodge!" @@ -197825,6 +198790,19 @@ msgstr "" msgid "fzzzzzt" msgstr "" +#: src/monattack.cpp +msgid "The floor trembles underneath your feet." +msgstr "" + +#: src/monattack.cpp +msgid "a deafening roar!" +msgstr "" + +#: src/monattack.cpp +#, c-format +msgid "A %s struggles to pull itself free from the %s!" +msgstr "" + #: src/monattack.cpp #, c-format msgid "The %1$s mechanically grabs at %2$s!" @@ -200486,6 +201464,11 @@ msgstr "" msgid "Hold on, I want to pulp that %s." msgstr "" +#: src/npcmove.cpp +#, c-format +msgid "%s completed the assigned task." +msgstr "" + #: src/npcmove.cpp #, c-format msgid "%1$s throws a %2$s." @@ -200988,6 +201971,10 @@ msgstr "" msgid "BADAMMO" msgstr "" +#: src/npctalk.cpp +msgid "doing this and that" +msgstr "" + #: src/npctalk.cpp msgctxt "punctuation" msgid "." @@ -201091,6 +202078,11 @@ msgstr "" msgid "%1$s doesn't have a %2$s!" msgstr "" +#: src/npctalk.cpp +#, c-format +msgid "%1$s gives you %2$s." +msgstr "" + #: src/npctalk.cpp msgid "I don't trust you enough to eat THIS..." msgstr "" @@ -201344,11 +202336,6 @@ msgstr "" msgid "Select a follower" msgstr "" -#: src/npctalk_funcs.cpp -#, c-format -msgid "Pickup rules for %s" -msgstr "" - #: src/npctrade.cpp #, c-format msgid "Volume: %s %s, Weight: %.1f %s" @@ -204235,10 +205222,6 @@ msgstr "" msgid "Freezing!" msgstr "" -#: src/panels.cpp -msgid "Pain " -msgstr "" - #: src/panels.cpp msgid "Bad" msgstr "" @@ -204406,22 +205389,10 @@ msgstr "" msgid "Style:" msgstr "" -#: src/panels.cpp -msgid "Food :" -msgstr "" - -#: src/panels.cpp -msgid "Drink:" -msgstr "" - #: src/panels.cpp msgid "Rest :" msgstr "" -#: src/panels.cpp -msgid "Pain :" -msgstr "" - #: src/panels.cpp msgid "Heat :" msgstr "" @@ -206173,11 +207144,6 @@ msgstr "%s (%d)" msgid "%s with %s (%d)" msgstr "%s ezzel: %s (%d)" -#: src/player.cpp -#, c-format -msgid "%s, %s" -msgstr "%s, %s" - #: src/player.cpp msgid "| Location " msgstr "" @@ -206925,6 +207891,10 @@ msgstr "" msgid "Peckish" msgstr "" +#: src/player.cpp +msgid "Pain " +msgstr "" + #: src/player_activity.cpp msgid "You pause for a moment to catch your breath." msgstr "" @@ -208384,6 +209354,10 @@ msgstr "" msgid "Safe Mode enabled:" msgstr "Biztonságos mód bekapcsolva:" +#: src/safemode_ui.cpp +msgid "Please load a character first to use this page!" +msgstr "Ehhez az oldalhoz először be kell tölteni egy karaktert." + #: src/safemode_ui.cpp msgid "Safe Mode manager currently inactive." msgstr "A biztonságos mód kezelője jelenleg inaktív." @@ -211225,6 +212199,10 @@ msgid "" "door." msgstr "" +#: src/vehicle_use.cpp +msgid "The autoclave is empty, there's no point in starting it." +msgstr "" + #: src/vehicle_use.cpp #, c-format msgid "" @@ -211251,6 +212229,10 @@ msgid "" "its lid." msgstr "" +#: src/vehicle_use.cpp +msgid "The washing machine is empty, there's no point in starting it." +msgstr "" + #: src/vehicle_use.cpp #, c-format msgid "" @@ -211289,6 +212271,10 @@ msgid "" "lid." msgstr "" +#: src/vehicle_use.cpp +msgid "The dishwasher is empty, there's no point in starting it." +msgstr "" + #: src/vehicle_use.cpp #, c-format msgid "" diff --git a/lang/po/ja.po b/lang/po/ja.po index d6eac93e2b123..069e03a45fbd8 100644 --- a/lang/po/ja.po +++ b/lang/po/ja.po @@ -11,12 +11,12 @@ # 02a55f6b0b75a11ad1dedf9f8b4d9b4f, 2018 # 山田太郎, 2018 # xyz , 2019 -# Brett Dong , 2019 # Ban Kaidou, 2019 # nobiruneko , 2019 -# TEATIME , 2019 # zojirushi, 2019 # T5idr3, 2019 +# TEATIME , 2019 +# Brett Dong , 2019 # Itoh Shu , 2019 # Pigmentblue15, 2019 # @@ -24,7 +24,7 @@ msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.D\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-16 17:39+0800\n" +"POT-Creation-Date: 2019-08-23 23:11+0800\n" "PO-Revision-Date: 2018-04-26 14:47+0000\n" "Last-Translator: Pigmentblue15, 2019\n" "Language-Team: Japanese (https://www.transifex.com/cataclysm-dda-translators/teams/2217/ja/)\n" @@ -399,25 +399,6 @@ msgid "" "shotgun shells." msgstr "銅屑です。自作のショットガン用弾薬などを製作する時に使います。" -#: lang/json/AMMO_from_json.py -msgid "solder" -msgstr "はんだ" - -#. ~ Description for solder -#: lang/json/AMMO_from_json.py -msgid "" -"A small spool of solder, able to be used in ammunition and electronics." -msgstr "弾薬や電子機器に利用できそうな、ひと巻き分のはんだです。" - -#: lang/json/AMMO_from_json.py -msgid "tin" -msgstr "錫" - -#. ~ Description for tin -#: lang/json/AMMO_from_json.py -msgid "Tin and pewter scraps. Usable in making ammo." -msgstr "錫や鉛からなる合金の廃材です。弾薬の製作に利用できます。" - #: lang/json/AMMO_from_json.py msgid "medical tape" msgstr "医療テープ" @@ -436,6 +417,34 @@ msgstr "ロケット弾(93mm/PG-7VL)" msgid "93mm single-stage high-explosive ammunition for the RPG-7." msgstr "RPG-7用の93mm単段式榴弾です。" +#: lang/json/AMMO_from_json.py +msgid "PG-7VR 64mm/105mm rocket" +msgstr "ロケット弾(64mm/105mm/PG-7VR)" + +#. ~ Description for PG-7VR 64mm/105mm rocket +#: lang/json/AMMO_from_json.py +msgid "64mm/105mm high-explosive tandem ammunition for the RPG-7." +msgstr "RPG-7用の64mm/105mmタンデム式榴弾です。" + +#: lang/json/AMMO_from_json.py +msgid "TBG-7V 105mm rocket" +msgstr "ロケット弾(105mm/TBG-7V/気化)" + +#. ~ Description for TBG-7V 105mm rocket +#: lang/json/AMMO_from_json.py +msgid "105mm thermobaric ammunition for the RPG-7." +msgstr "RPG-7用の105mm燃料気化榴弾です。" + +#: lang/json/AMMO_from_json.py +msgid "OG-7V 40mm rocket" +msgstr "ロケット弾(40mm/OG-7V)" + +#. ~ Description for OG-7V 40mm rocket +#: lang/json/AMMO_from_json.py +msgid "" +"40mm high-explosive fragmentation antipersonnel ammunition for the RPG-7." +msgstr "RPG-7用の高性能対人破砕榴弾です。" + #: lang/json/AMMO_from_json.py msgid "M235 66mm TPA rocket" msgstr "ロケット弾(66mm/自然発火剤)" @@ -1030,7 +1039,7 @@ msgstr "緩くまとまった、やや湿ったローム質の土です。砂、 #: lang/json/AMMO_from_json.py msgid "aluminum powder" msgid_plural "aluminum powder" -msgstr[0] "粉末(アルミニウム)" +msgstr[0] "アルミニウム粉末" #. ~ Description for aluminum powder #: lang/json/AMMO_from_json.py @@ -1045,7 +1054,7 @@ msgstr "" #: lang/json/AMMO_from_json.py msgid "zinc powder" msgid_plural "zinc powder" -msgstr[0] "粉末(亜鉛)" +msgstr[0] "亜鉛粉末" #. ~ Description for zinc powder #: lang/json/AMMO_from_json.py @@ -2127,26 +2136,24 @@ msgstr "弾薬(.300口径/AACブラックアウト)" #. ~ Description for .300 AAC Blackout #: lang/json/AMMO_from_json.py msgid "" -".300 AAC Blackout is an intermediate cartridge that achieves ballistics " -"similar to the 7.62x39 but allows use on the AR-15 platform. The round is " -"necked-up from the 5.56mm NATO, but feeds from a STANAG magazine. It " -"requires a specific barrel, so will not work in a standard M4 or similar " -"carbine. This loading is supersonic." +"A .300 AAC Blackout round with a 125gr open tip match bullet. 300 BLK is an" +" intermediate cartridge necked up from 5.56x45mm, designed to achieve " +"similar ballistics to 7.62x39mm. It is compatible with standard AR-15 lower" +" receivers and will feed from STANAG magazines." msgstr "" -".300口径AACブラックアウト弾は、7.62x39mm弾に似た弾道特性を持ちながらAR-" -"15系ライフルに装填可能な中型の弾薬です。5.56mmNATO弾からネックアップされており、STANAG弾倉から給弾されます。特定の銃身が必要となるため、標準的なM4や類似するカービンには装填できません。この弾薬は超音速弾です。" +"重量約8gの競技用オープンチップ弾頭を備えた.300口径AACブラックアウト弾は、5.56mmNATO弾からネックアップされ、7.62x39mm弾に似た弾道特性を持つように設計された中型の弾薬です" +"。標準的なAR-15系のロアレシーバーと互換性があり、STANAG弾倉から給弾されます。" #. ~ Description for .300 AAC Blackout #: lang/json/AMMO_from_json.py msgid "" -".300 AAC Blackout is an intermediate cartridge that achieves ballistics " -"similar to the 7.62x39 but allows use on the AR-15 platform. The round is " -"necked-up from the 5.56mm NATO, but feeds from a STANAG magazine. It " -"requires a specific barrel, so will not work in a standard M4 or similar " -"carbine. This loading is subsonic." +"A subsonic .300 AAC Blackout round with a 220gr open tip match bullet. 300 " +"BLK is an intermediate cartridge necked up from 5.56x45mm, designed to " +"achieve similar ballistics to 7.62x39mm. It is compatible with standard " +"AR-15 lower receivers and will feed from STANAG magazines." msgstr "" -".300口径AACブラックアウト弾は、7.62x39mm弾に似た弾道特性を持ちながらAR-" -"15系ライフルに装填可能な中型の弾薬です。5.56mmNATO弾からネックアップされており、STANAG弾倉から給弾されます。特定の銃身が必要となるため、標準的なM4や類似するカービンには装填できません。この弾薬は亜音速弾です。" +"重量約14.5gの競技用オープンチップ弾頭を備えた.300口径AACブラックアウト亜音速弾は、5.56mmNATO弾からネックアップされ、7.62x39mm弾に似た弾道特性を持つように設計された中型の弾薬です" +"。標準的なAR-15系のロアレシーバーと互換性があり、STANAG弾倉から給弾されます。" #: lang/json/AMMO_from_json.py msgid "reloaded .300 AAC Blackout" @@ -3362,7 +3369,7 @@ msgstr "Rivtech社製銃器専用の、8x40mm軍用ケースレス・ジャケ #: lang/json/AMMO_from_json.py msgid "9x19mm JHP" -msgstr "弾薬(9x19mm/JHP)" +msgstr "弾薬(9mm/JHP)" #. ~ Description for 9x19mm JHP #: lang/json/AMMO_from_json.py @@ -3376,7 +3383,7 @@ msgstr "" #: lang/json/AMMO_from_json.py msgid "9x19mm FMJ" -msgstr "弾薬(9x19mm/FMJ)" +msgstr "弾薬(9mm/FMJ)" #. ~ Description for 9x19mm FMJ #: lang/json/AMMO_from_json.py @@ -3388,7 +3395,7 @@ msgstr "弾頭重量約7.45gの9x19mmブラスジャケッテッド弾です。 #: lang/json/AMMO_from_json.py msgid "9x19mm +P" -msgstr "弾薬(9x19mm/+P)" +msgstr "弾薬(9mm/+P)" #. ~ Description for 9x19mm +P #: lang/json/AMMO_from_json.py @@ -3399,7 +3406,7 @@ msgstr "9x19mmパラベラム/強装弾です。通常より反動は強いで #: lang/json/AMMO_from_json.py msgid "9x19mm +P+" -msgstr "弾薬(9x19mm/+P+)" +msgstr "弾薬(9mm/+P+)" #. ~ Description for 9x19mm +P+ #: lang/json/AMMO_from_json.py @@ -3410,27 +3417,27 @@ msgstr "9x19mm/+P弾の一歩先をゆく+P+弾です。通常より装薬量を #: lang/json/AMMO_from_json.py msgid "9x19mm JHP blackpowder" -msgstr "弾薬(9x19mm/JHP/黒色火薬)" +msgstr "弾薬(9mm/JHP/黒色火薬)" #: lang/json/AMMO_from_json.py msgid "9x19mm FMJ blackpowder" -msgstr "弾薬(9x19mm/FMJ/黒色火薬)" +msgstr "弾薬(9mm/FMJ/黒色火薬)" #: lang/json/AMMO_from_json.py msgid "reloaded 9x19mm JHP" -msgstr "弾薬(9x19mm/JHP(手詰め))" +msgstr "弾薬(9mm/JHP(手詰め))" #: lang/json/AMMO_from_json.py msgid "reloaded 9x19mm FMJ" -msgstr "弾薬(9x19mm/FMJ(手詰め))" +msgstr "弾薬(9mm/FMJ(手詰め))" #: lang/json/AMMO_from_json.py msgid "reloaded 9x19mm +P" -msgstr "弾薬(9x19mm/+P(手詰め))" +msgstr "弾薬(9mm/+P(手詰め))" #: lang/json/AMMO_from_json.py msgid "reloaded 9x19mm +P+" -msgstr "弾薬(9x19mm/+P+(手詰め))" +msgstr "弾薬(9mm/+P+(手詰め))" #: lang/json/AMMO_from_json.py msgid "9x18mm 57-N-181S" @@ -3518,6 +3525,17 @@ msgid "" " tube. Designed to be highly effective against vehicles and structures." msgstr "鋼鉄製のチューブに入った光学照準式有線誘導ミサイルです。車両や建造物に対して高い威力を発揮します。" +#: lang/json/AMMO_from_json.py +msgid "paralyzing barb" +msgstr "麻痺毒針" + +#. ~ Description for paralyzing barb +#: lang/json/AMMO_from_json.py +msgid "" +"Tiny droplets of venom trickle out of the sponge-like tissue of this sharp " +"barb." +msgstr "鋭いトゲの表面はスポンジのようになっており、そこから毒液が滴っています。" + #: lang/json/AMMO_from_json.py msgid "sprayable toxic gas" msgstr "噴霧式有毒ガス" @@ -3995,7 +4013,7 @@ msgstr "古代より存在を知られている、鈍い色の柔らかい金属 #: lang/json/AMMO_from_json.py msgid "magnesium powder" msgid_plural "magnesium powder" -msgstr[0] "粉末(マグネシウム)" +msgstr[0] "マグネシウム粉末" #. ~ Description for magnesium powder #: lang/json/AMMO_from_json.py @@ -4056,6 +4074,27 @@ msgid "" "making doors." msgstr "ネジ穴付きの2枚の金属板からなる小さな蝶番です。ドアの部品として使います。" +#: lang/json/AMMO_from_json.py +msgid "tin powder" +msgstr "錫粉末" + +#. ~ Description for tin powder +#: lang/json/AMMO_from_json.py +msgid "" +"A fine gray powder composed of tin, usable for making solder and lining " +"containers to prevent corrosion." +msgstr "はんだの製作や容器の腐食を防ぐライニング加工に使う、灰色の細かな錫粉末です。" + +#: lang/json/AMMO_from_json.py +msgid "solder" +msgstr "はんだ" + +#. ~ Description for solder +#: lang/json/AMMO_from_json.py +msgid "" +"A small spool of solder, able to be used in ammunition and electronics." +msgstr "弾薬や電子機器に利用できそうな、ひと巻き分のはんだです。" + #: lang/json/AMMO_from_json.py msgid "incendiary" msgid_plural "incendiaries" @@ -5541,38 +5580,6 @@ msgstr[0] "バスケットボールパンツ" msgid "A pair of basketball shorts. Comfortable and light." msgstr "バスケットボールパンツです。軽量で履き心地に優れています。" -#: lang/json/ARMOR_from_json.py -msgid "backpack" -msgid_plural "backpacks" -msgstr[0] "バックパック" - -#. ~ Description for backpack -#: lang/json/ARMOR_from_json.py -msgid "A small backpack. Good storage for a little encumbrance." -msgstr "小型のバックパックです。最低限の動作制限で、十分な収納容積を確保できます。" - -#: lang/json/ARMOR_from_json.py -msgid "giant novelty backpack" -msgid_plural "giant novelty backpacks" -msgstr[0] "超大型バックパック" - -#. ~ Description for giant novelty backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A huge fabric backpack made mostly as a joke before the cataclysm. Now, " -"it's still rather silly, but it can store a lot of stuff." -msgstr "大変動前にジョークグッズとして作られた、非常に大きな布製バックパックです。今なお馬鹿げた代物ですが、たくさんの荷物を持ち運べます。" - -#: lang/json/ARMOR_from_json.py -msgid "leather backpack" -msgid_plural "leather backpacks" -msgstr[0] "バックパック(革)" - -#. ~ Description for leather backpack -#: lang/json/ARMOR_from_json.py -msgid "A small leather backpack. Good storage for a little encumbrance." -msgstr "小型の革製バックパックです。最低限の動作制限で、十分な収納容積を確保できます。" - #: lang/json/ARMOR_from_json.py msgid "balaclava" msgid_plural "balaclavas" @@ -5594,8 +5601,8 @@ msgstr[0] "鞘(大型/胴)" #. ~ Use action holster_msg for scabbard. #. ~ Use action holster_msg for sheath. #. ~ Use action holster_msg for survivor belt. -#. ~ Use action holster_msg for hiking backpack. #. ~ Use action holster_msg for survivor utility belt. +#. ~ Use action holster_msg for hiking backpack. #. ~ Use action holster_msg for pair of boots. #. ~ Use action holster_msg for pair of bone armor boots. #. ~ Use action holster_msg for pair of turnout boots. @@ -5620,7 +5627,8 @@ msgstr[0] "鞘(大型/胴)" #. ~ Use action holster_msg for pair of rollerblades. #. ~ Use action holster_msg for pair of rollerskates. #. ~ Use action holster_msg for C.R.I.T web belt. -#: lang/json/ARMOR_from_json.py +#. ~ Use action holster_msg for hollow cane. +#: lang/json/ARMOR_from_json.py lang/json/GENERIC_from_json.py #, no-python-format msgid "You sheath your %s" msgstr "%sを鞘に収めました。" @@ -5628,7 +5636,9 @@ msgstr "%sを鞘に収めました。" #. ~ Use action holster_prompt for baldric. #. ~ Use action holster_prompt for back scabbard. #. ~ Use action holster_prompt for scabbard. -#: lang/json/ARMOR_from_json.py +#. ~ Use action holster_prompt for hollow cane. +#: lang/json/ARMOR_from_json.py lang/json/ARMOR_from_json.py +#: lang/json/GENERIC_from_json.py msgid "Sheath sword" msgstr "剣を納める" @@ -6497,16 +6507,6 @@ msgid "" " encumbering and has little storage but is very warm." msgstr "擬人化した恐竜の全身着ぐるみです。かなり動き辛いですが、中は非常に暖かい作りになっています。" -#: lang/json/ARMOR_from_json.py -msgid "dive bag" -msgid_plural "dive bags" -msgstr[0] "ダイビングバッグ" - -#. ~ Description for dive bag -#: lang/json/ARMOR_from_json.py -msgid "A lightweight mesh backpack, commonly worn by swimmers and divers." -msgstr "軽量なメッシュのバックパックです。スイマーやダイバーがよく着用しています。" - #: lang/json/ARMOR_from_json.py msgid "down-filled blanket" msgid_plural "down-filled blankets" @@ -6577,17 +6577,6 @@ msgstr[0] "ウェディングドレス" msgid "A beautiful white wedding dress. What good will it be now?" msgstr "美しい純白のウェディングドレスです。しかし、今それに一体どんな価値があるのでしょうか?" -#: lang/json/ARMOR_from_json.py -msgid "duffel bag" -msgid_plural "duffel bags" -msgstr[0] "ダッフルバッグ" - -#. ~ Description for duffel bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A huge duffel bag. Provides plenty of storage, but is severely encumbering." -msgstr "巨大なダッフルバッグです。著しく行動を阻害しますが、相当の収納容積を確保できます。" - #: lang/json/ARMOR_from_json.py msgid "tactical dump pouch" msgid_plural "tactical dump pouches" @@ -8208,16 +8197,6 @@ msgid "" "off dramatically before fighting any foes!" msgstr "ゆるやかな長い外套です。デザインが凝っておらず着心地も良好です。敵と戦う際はビリビリに引き裂かれてしまうことを覚悟しておきましょう!" -#: lang/json/ARMOR_from_json.py -msgid "jerrypack" -msgid_plural "jerrypacks" -msgstr[0] "ジェリカンパック" - -#. ~ Description for jerrypack -#: lang/json/ARMOR_from_json.py -msgid "A jerrycan modified to be worn in a similar manner to a backpack." -msgstr "改造を施したジェリカンです。バックパックのように背負えます。" - #: lang/json/ARMOR_from_json.py msgid "sports jersey" msgid_plural "sports jerseys" @@ -8966,28 +8945,6 @@ msgstr[0] "ホワイトブリム" msgid "A frilly white headpiece." msgstr "フリルの付いた白いヘッドピースです。" -#: lang/json/ARMOR_from_json.py -msgid "makeshift knapsack" -msgid_plural "makeshift knapsacks" -msgstr[0] "簡易ナップサック" - -#. ~ Description for makeshift knapsack -#: lang/json/ARMOR_from_json.py -msgid "" -"A pair of pants with the bottom ends tied with string, and then passed " -"through the belt loops so the knapsack can be carried on the back." -msgstr "紐でズボンの裾を縛り、その紐をさらにベルト通しに通してナップサックのように背負えるようにしたものです。" - -#: lang/json/ARMOR_from_json.py -msgid "makeshift sling" -msgid_plural "makeshift slings" -msgstr[0] "簡易三角巾" - -#. ~ Description for makeshift sling -#: lang/json/ARMOR_from_json.py -msgid "A large sheet tied into a crude, over-the-shoulder sling." -msgstr "袋になるように適当に結んだシーツです。肩にかけて背負います。" - #: lang/json/ARMOR_from_json.py msgid "ballistic mask" msgid_plural "ballistic masks" @@ -9046,16 +9003,6 @@ msgid "" "rioters to hide their identity." msgstr "Tシャツの袖を後ろ手に縛ったものです。暴徒が身元を隠すために着用します。" -#: lang/json/ARMOR_from_json.py -msgid "messenger bag" -msgid_plural "messenger bags" -msgstr[0] "メッセンジャーバッグ" - -#. ~ Description for messenger bag -#: lang/json/ARMOR_from_json.py -msgid "Light and easy to wear, but doesn't offer much storage." -msgstr "装着は簡単で軽量ですが、収納容積も少量です。" - #: lang/json/ARMOR_from_json.py msgid "pair of mittens" msgid_plural "pairs of mittens" @@ -9066,21 +9013,6 @@ msgstr[0] "ミトン" msgid "A pair of warm mittens. They are extremely cumbersome." msgstr "暖かいミトンです。非常に嵩張ります。" -#: lang/json/ARMOR_from_json.py -msgid "MOLLE pack" -msgid_plural "MOLLE packs" -msgstr[0] "MOLLEバックパック" - -#. ~ Description for MOLLE pack -#: lang/json/ARMOR_from_json.py -msgid "" -"The Modular Lightweight Load-carrying Equipment is an advanced military " -"backpack. Covered with pockets and straps, it strikes a fine balance " -"between storage space and encumbrance." -msgstr "" -"モジュール式軽量荷物運搬用装備(MOdularLightweightLoad-" -"carryingEquipmentの頭文字の略称)は軍用の改良型バックパックです。ポケットやストラップがついていて、阻害性と収納性のバランスに優れています。" - #: lang/json/ARMOR_from_json.py msgid "motorcycle armor" msgid_plural "motorcycle armors" @@ -9475,16 +9407,6 @@ msgid "" "better than nothing." msgstr "鍋を加工して作ったヘルメットです。性能は良くありませんが何も無いよりは確実にマシです。" -#: lang/json/ARMOR_from_json.py -msgid "purse" -msgid_plural "purses" -msgstr[0] "ハンドバッグ" - -#. ~ Description for purse -#: lang/json/ARMOR_from_json.py -msgid "A bit cumbersome to wear, but provides some storage." -msgstr "動きを少し阻害しますが、ある程度の収納容積を備えています。" - #: lang/json/ARMOR_from_json.py msgid "quiver" msgid_plural "quivers" @@ -9559,29 +9481,6 @@ msgid "" "hidden pockets." msgstr "袖付きのゆったりとした上着です。内ポケットには不思議なくらい物が沢山入ります。" -#: lang/json/ARMOR_from_json.py -msgid "military rucksack" -msgid_plural "military rucksacks" -msgstr[0] "軍用リュックサック" - -#. ~ Description for military rucksack -#: lang/json/ARMOR_from_json.py -msgid "A huge military rucksack, provides a lot of storage." -msgstr "十分な収納容積を備えた大型の軍用背嚢です。" - -#: lang/json/ARMOR_from_json.py -msgid "runner pack" -msgid_plural "runner packs" -msgstr[0] "ランニングバッグ" - -#. ~ Description for runner pack -#: lang/json/ARMOR_from_json.py -msgid "" -"The obvious choice for outdoor athletes, this ergonomic backpack is light " -"and easy to wear, ensuring comfort when carrying heavy and bulky items." -msgstr "" -"この人間工学に基づいて設計されたバックパックは、野外スポーツ愛好家の必需品です。着用も簡単で軽く、重い物やかさばる物を運ぶ際の快適さは保証できます。" - #: lang/json/ARMOR_from_json.py msgid "scabbard" msgid_plural "scabbards" @@ -9927,18 +9826,6 @@ msgstr[0] "袖無しチュニック" msgid "A sleeveless cloth garment that covers the torso and legs." msgstr "胴体と脚を覆う、袖の無い服です。" -#: lang/json/ARMOR_from_json.py -msgid "sling pack" -msgid_plural "sling packs" -msgstr[0] "スリングバッグ" - -#. ~ Description for sling pack -#: lang/json/ARMOR_from_json.py -msgid "" -"A simple single-sling backpack. Easier to access than a normal backpack, " -"but can't comfortably hold as much." -msgstr "吊り帯が1つだけ付いたシンプルなバックパックです。通常のバックパックよりも簡単に荷物を出し入れ出来ますが、収納性は劣ります。" - #: lang/json/ARMOR_from_json.py msgid "snuggie" msgid_plural "snuggies" @@ -10184,8 +10071,8 @@ msgid_plural "survivor belts" msgstr[0] "サバイバーベルト" #. ~ Use action holster_prompt for survivor belt. -#. ~ Use action holster_prompt for hiking backpack. #. ~ Use action holster_prompt for survivor utility belt. +#. ~ Use action holster_prompt for hiking backpack. #. ~ Use action holster_prompt for C.R.I.T web belt. #: lang/json/ARMOR_from_json.py msgid "Sheath blade" @@ -10200,18 +10087,6 @@ msgid "" msgstr "" "特製の革製ツールベルトです。掛け紐や袋が取り付けてあり、鞘には小型の刃物を収納できます。頑丈で身に付けていて疲れないよう丁寧に調整してあります。使用することで武器の納刀/抜刀ができます。" -#: lang/json/ARMOR_from_json.py -msgid "survivor duffel bag" -msgid_plural "survivor duffel bags" -msgstr[0] "サバイバーダッフルバッグ" - -#. ~ Description for survivor duffel bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built heavy duffel bag. Durable and carefully crafted to hold as " -"much stuff as possible." -msgstr "特製の丈夫な重量型ダッフルバッグです。出来る限りの荷物を詰め込めるように手間を掛けて作られています。" - #: lang/json/ARMOR_from_json.py msgid "survivor goggles" msgid_plural "pairs of survivor goggles" @@ -10224,42 +10099,6 @@ msgid "" "built to last, they provide excellent protection from environmental dangers." msgstr "着色レンズが入った特製の装甲付きゴーグルです。快適かつ頑丈で、危険な環境からの保護に優れています。" -#: lang/json/ARMOR_from_json.py -msgid "survivor backpack" -msgid_plural "survivor backpacks" -msgstr[0] "サバイバーバックパック" - -#. ~ Description for survivor backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built backpack. Durable and carefully crafted to hold as much " -"stuff as possible." -msgstr "特製の丈夫なバックパックです。出来る限りの荷物を詰め込めるように手間を掛けて作られています。" - -#: lang/json/ARMOR_from_json.py -msgid "survivor rucksack" -msgid_plural "survivor rucksacks" -msgstr[0] "サバイバーリュックサック" - -#. ~ Description for survivor rucksack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built heavy backpack. Durable and carefully crafted to hold as " -"much stuff as possible." -msgstr "特製の丈夫な重量型バックパックです。出来る限りの荷物を詰め込めるように手間を掛けて作られています。" - -#: lang/json/ARMOR_from_json.py -msgid "survivor runner pack" -msgid_plural "survivor runner packs" -msgstr[0] "サバイバーランニングバッグ" - -#. ~ Description for survivor runner pack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built lightweight runner pack. Durable and carefully crafted to " -"hold as much stuff as possible." -msgstr "特製の軽量で丈夫なランニング用のバッグです。出来る限りの荷物を詰め込めるように手間を掛けて作られています。" - #: lang/json/ARMOR_from_json.py msgid "survivor suit" msgid_plural "survivor suits" @@ -11094,29 +10933,6 @@ msgid "" "stereotypical cap golfers wear." msgstr "これをゴルフ帽と呼んでいいのか分かりませんが、ゴルファーがよく被っているような気がします。" -#: lang/json/ARMOR_from_json.py -msgid "golf bag" -msgid_plural "golf bags" -msgstr[0] "ゴルフバッグ" - -#. ~ Use action holster_msg for golf bag. -#: lang/json/ARMOR_from_json.py -#, no-python-format -msgid "You awkwardly sheath your %s" -msgstr "ぎこちなく%sをバッグの中に収めました。" - -#. ~ Use action holster_prompt for golf bag. -#: lang/json/ARMOR_from_json.py -msgid "Sheath golf club" -msgstr "ゴルフクラブを収める" - -#. ~ Description for golf bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A tall canvas and plastic bag with fold-out legs used for golfing. It even " -"has straps to be worn on the back." -msgstr "折り畳めるスタンドが付いた、背の高い帆布とビニール製のバッグです。背負って着用できるストラップも付いています。" - #: lang/json/ARMOR_from_json.py msgid "javelin bag" msgid_plural "javelin bags" @@ -11212,62 +11028,6 @@ msgid "" msgstr "" "縁に紐を通すハトメ金がついたプラスチックのシートです。全身を覆えるほどの大きさがあります。手っ取り早く雨をしのぐには有効な手段となるでしょう。" -#: lang/json/ARMOR_from_json.py -msgid "high-volume rucksack" -msgid_plural "high-volume rucksacks" -msgstr[0] "大容量リュックサック" - -#. ~ Description for high-volume rucksack -#: lang/json/ARMOR_from_json.py -msgid "" -"Also know as a \"bigpack\", this rucksack is prized by pack rats but may " -"lead to a bad back." -msgstr "『ビッグパック』としても知られるこのリュックサックは収集癖のある人々に珍重されてきましたが、腰を痛めることになるかもしれませんよ。" - -#: lang/json/ARMOR_from_json.py -msgid "hiking backpack" -msgid_plural "hiking backpacks" -msgstr[0] "ハイキング用バックパック" - -#. ~ Description for hiking backpack -#: lang/json/ARMOR_from_json.py -msgid "A large sized hiking backpack with plenty of storage space." -msgstr "収納スペースがたっぷりある、大型のハイキング用バックパックです。" - -#: lang/json/ARMOR_from_json.py -msgid "petpack" -msgid_plural "petpacks" -msgstr[0] "ペットパック" - -#. ~ Description for petpack -#: lang/json/ARMOR_from_json.py -msgid "" -"Before the Cataclysm this would allow your four-legged friend to see the " -"world, now it's used to shield them from the world." -msgstr "大変動以前、ペットパックは四つ足の友に世界を見せて回るツールでしたが、今は世界から友を守るために使われています。" - -#: lang/json/ARMOR_from_json.py -msgid "large tactical backpack" -msgid_plural "large tactical backpacks" -msgstr[0] "大型タクティカルバックパック" - -#. ~ Description for large tactical backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A large tactical multi-compartment backpack that has great lower back " -"support." -msgstr "内部が複数に仕切られた大型のタクティカルバックパックです。腰回りに大きなサポーターがついています。" - -#: lang/json/ARMOR_from_json.py -msgid "travelpack" -msgid_plural "travelpacks" -msgstr[0] "トラベルパック" - -#. ~ Description for travelpack -#: lang/json/ARMOR_from_json.py -msgid "A hiking pack used for short trips." -msgstr "小旅行に使うようなバックパックです。" - #: lang/json/ARMOR_from_json.py msgid "survivor utility belt" msgid_plural "survivor utility belts" @@ -11467,6 +11227,288 @@ msgid "" "resistant vests. It has four pouches capable of carrying magazines." msgstr "既存の防弾ベストを基にサイズを大型化した手製のケブラーベストです。弾倉を4つ収納できるポーチが付いています。" +#: lang/json/ARMOR_from_json.py +msgid "backpack" +msgid_plural "backpacks" +msgstr[0] "バックパック" + +#. ~ Description for backpack +#: lang/json/ARMOR_from_json.py +msgid "A small backpack. Good storage for a little encumbrance." +msgstr "小型のバックパックです。最低限の動作制限で、十分な収納容積を確保できます。" + +#: lang/json/ARMOR_from_json.py +msgid "hiking backpack" +msgid_plural "hiking backpacks" +msgstr[0] "ハイキング用バックパック" + +#. ~ Description for hiking backpack +#: lang/json/ARMOR_from_json.py +msgid "A large sized hiking backpack with plenty of storage space." +msgstr "収納スペースがたっぷりある、大型のハイキング用バックパックです。" + +#: lang/json/ARMOR_from_json.py +msgid "giant novelty backpack" +msgid_plural "giant novelty backpacks" +msgstr[0] "超大型バックパック" + +#. ~ Description for giant novelty backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A huge fabric backpack made mostly as a joke before the cataclysm. Now, " +"it's still rather silly, but it can store a lot of stuff." +msgstr "大変動前にジョークグッズとして作られた、非常に大きな布製バックパックです。今なお馬鹿げた代物ですが、たくさんの荷物を持ち運べます。" + +#: lang/json/ARMOR_from_json.py +msgid "leather backpack" +msgid_plural "leather backpacks" +msgstr[0] "バックパック(革)" + +#. ~ Description for leather backpack +#: lang/json/ARMOR_from_json.py +msgid "A small leather backpack. Good storage for a little encumbrance." +msgstr "小型の革製バックパックです。最低限の動作制限で、十分な収納容積を確保できます。" + +#: lang/json/ARMOR_from_json.py +msgid "large tactical backpack" +msgid_plural "large tactical backpacks" +msgstr[0] "大型タクティカルバックパック" + +#. ~ Description for large tactical backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A large tactical multi-compartment backpack that has great lower back " +"support." +msgstr "内部が複数に仕切られた大型のタクティカルバックパックです。腰回りに大きなサポーターがついています。" + +#: lang/json/ARMOR_from_json.py +msgid "high-volume rucksack" +msgid_plural "high-volume rucksacks" +msgstr[0] "大容量リュックサック" + +#. ~ Description for high-volume rucksack +#: lang/json/ARMOR_from_json.py +msgid "" +"Also know as a \"bigpack\", this rucksack is prized by pack rats but may " +"lead to a bad back." +msgstr "『ビッグパック』としても知られるこのリュックサックは収集癖のある人々に珍重されてきましたが、腰を痛めることになるかもしれませんよ。" + +#: lang/json/ARMOR_from_json.py +msgid "dive bag" +msgid_plural "dive bags" +msgstr[0] "ダイビングバッグ" + +#. ~ Description for dive bag +#: lang/json/ARMOR_from_json.py +msgid "A lightweight mesh backpack, commonly worn by swimmers and divers." +msgstr "軽量なメッシュのバックパックです。スイマーやダイバーがよく着用しています。" + +#: lang/json/ARMOR_from_json.py +msgid "duffel bag" +msgid_plural "duffel bags" +msgstr[0] "ダッフルバッグ" + +#. ~ Description for duffel bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A huge duffel bag. Provides plenty of storage, but is severely encumbering." +msgstr "巨大なダッフルバッグです。著しく行動を阻害しますが、相当の収納容積を確保できます。" + +#: lang/json/ARMOR_from_json.py +msgid "petpack" +msgid_plural "petpacks" +msgstr[0] "ペットパック" + +#. ~ Description for petpack +#: lang/json/ARMOR_from_json.py +msgid "" +"Before the Cataclysm this would allow your four-legged friend to see the " +"world, now it's used to shield them from the world." +msgstr "大変動以前、ペットパックは四つ足の友に世界を見せて回るツールでしたが、今は世界から友を守るために使われています。" + +#: lang/json/ARMOR_from_json.py +msgid "jerrypack" +msgid_plural "jerrypacks" +msgstr[0] "ジェリカンパック" + +#. ~ Description for jerrypack +#: lang/json/ARMOR_from_json.py +msgid "A jerrycan modified to be worn in a similar manner to a backpack." +msgstr "改造を施したジェリカンです。バックパックのように背負えます。" + +#: lang/json/ARMOR_from_json.py +msgid "makeshift knapsack" +msgid_plural "makeshift knapsacks" +msgstr[0] "簡易ナップサック" + +#. ~ Description for makeshift knapsack +#: lang/json/ARMOR_from_json.py +msgid "" +"A pair of pants with the bottom ends tied with string, and then passed " +"through the belt loops so the knapsack can be carried on the back." +msgstr "紐でズボンの裾を縛り、その紐をさらにベルト通しに通してナップサックのように背負えるようにしたものです。" + +#: lang/json/ARMOR_from_json.py +msgid "makeshift sling" +msgid_plural "makeshift slings" +msgstr[0] "簡易三角巾" + +#. ~ Description for makeshift sling +#: lang/json/ARMOR_from_json.py +msgid "A large sheet tied into a crude, over-the-shoulder sling." +msgstr "袋になるように適当に結んだシーツです。肩にかけて背負います。" + +#: lang/json/ARMOR_from_json.py +msgid "messenger bag" +msgid_plural "messenger bags" +msgstr[0] "メッセンジャーバッグ" + +#. ~ Description for messenger bag +#: lang/json/ARMOR_from_json.py +msgid "Light and easy to wear, but doesn't offer much storage." +msgstr "装着は簡単で軽量ですが、収納容積も少量です。" + +#: lang/json/ARMOR_from_json.py +msgid "MOLLE pack" +msgid_plural "MOLLE packs" +msgstr[0] "MOLLEバックパック" + +#. ~ Description for MOLLE pack +#: lang/json/ARMOR_from_json.py +msgid "" +"The Modular Lightweight Load-carrying Equipment is an advanced military " +"backpack. Covered with pockets and straps, it strikes a fine balance " +"between storage space and encumbrance." +msgstr "" +"モジュール式軽量荷物運搬用装備(MOdularLightweightLoad-" +"carryingEquipmentの頭文字の略称)は軍用の改良型バックパックです。ポケットやストラップがついていて、阻害性と収納性のバランスに優れています。" + +#: lang/json/ARMOR_from_json.py +msgid "purse" +msgid_plural "purses" +msgstr[0] "ハンドバッグ" + +#. ~ Description for purse +#: lang/json/ARMOR_from_json.py +msgid "A bit cumbersome to wear, but provides some storage." +msgstr "動きを少し阻害しますが、ある程度の収納容積を備えています。" + +#: lang/json/ARMOR_from_json.py +msgid "military rucksack" +msgid_plural "military rucksacks" +msgstr[0] "軍用リュックサック" + +#. ~ Description for military rucksack +#: lang/json/ARMOR_from_json.py +msgid "A huge military rucksack, provides a lot of storage." +msgstr "十分な収納容積を備えた大型の軍用背嚢です。" + +#: lang/json/ARMOR_from_json.py +msgid "runner pack" +msgid_plural "runner packs" +msgstr[0] "ランニングバッグ" + +#. ~ Description for runner pack +#: lang/json/ARMOR_from_json.py +msgid "" +"The obvious choice for outdoor athletes, this ergonomic backpack is light " +"and easy to wear, ensuring comfort when carrying heavy and bulky items." +msgstr "" +"この人間工学に基づいて設計されたバックパックは、野外スポーツ愛好家の必需品です。着用も簡単で軽く、重い物やかさばる物を運ぶ際の快適さは保証できます。" + +#: lang/json/ARMOR_from_json.py +msgid "sling pack" +msgid_plural "sling packs" +msgstr[0] "スリングバッグ" + +#. ~ Description for sling pack +#: lang/json/ARMOR_from_json.py +msgid "" +"A simple single-sling backpack. Easier to access than a normal backpack, " +"but can't comfortably hold as much." +msgstr "吊り帯が1つだけ付いたシンプルなバックパックです。通常のバックパックよりも簡単に荷物を出し入れ出来ますが、収納性は劣ります。" + +#: lang/json/ARMOR_from_json.py +msgid "survivor duffel bag" +msgid_plural "survivor duffel bags" +msgstr[0] "サバイバーダッフルバッグ" + +#. ~ Description for survivor duffel bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built heavy duffel bag. Durable and carefully crafted to hold as " +"much stuff as possible." +msgstr "特製の丈夫な重量型ダッフルバッグです。出来る限りの荷物を詰め込めるように手間を掛けて作られています。" + +#: lang/json/ARMOR_from_json.py +msgid "survivor backpack" +msgid_plural "survivor backpacks" +msgstr[0] "サバイバーバックパック" + +#. ~ Description for survivor backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built backpack. Durable and carefully crafted to hold as much " +"stuff as possible." +msgstr "特製の丈夫なバックパックです。出来る限りの荷物を詰め込めるように手間を掛けて作られています。" + +#: lang/json/ARMOR_from_json.py +msgid "survivor rucksack" +msgid_plural "survivor rucksacks" +msgstr[0] "サバイバーリュックサック" + +#. ~ Description for survivor rucksack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built heavy backpack. Durable and carefully crafted to hold as " +"much stuff as possible." +msgstr "特製の丈夫な重量型バックパックです。出来る限りの荷物を詰め込めるように手間を掛けて作られています。" + +#: lang/json/ARMOR_from_json.py +msgid "survivor runner pack" +msgid_plural "survivor runner packs" +msgstr[0] "サバイバーランニングバッグ" + +#. ~ Description for survivor runner pack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built lightweight runner pack. Durable and carefully crafted to " +"hold as much stuff as possible." +msgstr "特製の軽量で丈夫なランニング用のバッグです。出来る限りの荷物を詰め込めるように手間を掛けて作られています。" + +#: lang/json/ARMOR_from_json.py +msgid "golf bag" +msgid_plural "golf bags" +msgstr[0] "ゴルフバッグ" + +#. ~ Use action holster_msg for golf bag. +#: lang/json/ARMOR_from_json.py +#, no-python-format +msgid "You awkwardly sheath your %s" +msgstr "ぎこちなく%sをバッグの中に収めました。" + +#. ~ Use action holster_prompt for golf bag. +#: lang/json/ARMOR_from_json.py +msgid "Sheath golf club" +msgstr "ゴルフクラブを収める" + +#. ~ Description for golf bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A tall canvas and plastic bag with fold-out legs used for golfing. It even " +"has straps to be worn on the back." +msgstr "折り畳めるスタンドが付いた、背の高い帆布とビニール製のバッグです。背負って着用できるストラップも付いています。" + +#: lang/json/ARMOR_from_json.py +msgid "travelpack" +msgid_plural "travelpacks" +msgstr[0] "トラベルパック" + +#. ~ Description for travelpack +#: lang/json/ARMOR_from_json.py +msgid "A hiking pack used for short trips." +msgstr "小旅行に使うようなバックパックです。" + #: lang/json/ARMOR_from_json.py msgid "pistol bandolier" msgid_plural "pistol bandoliers" @@ -14291,18 +14333,6 @@ msgid "" msgstr "" "起動すると薄い力場の膜を全身の周りに展開します。物体が膜の内側に侵入しようとすると、追加で電力を消費して軌道を逸らします。剣などの大きな物体よりも、弾丸などの小さな物体に対して効果的に働きます。" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Advanced Microreactor CBM" -msgid_plural "Advanced Microreactor CBMs" -msgstr[0] "CBM: 高度体内マイクロ反応炉" - -#. ~ Description for Advanced Microreactor CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"This module upgrades a pre-installed microreactor with enhanced maximum " -"yield and limited automatic radiation scrubbing capabilities." -msgstr "既存の小型反応炉を改良して最大収率を高め、限定的な自動除染機能を組み込みます。" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Alarm System CBM" msgid_plural "Alarm System CBMs" @@ -15020,18 +15050,6 @@ msgid "" msgstr "" "痛覚信号の伝達を任意で阻害できるよう神経系を改造します。起動することで鎮痛剤の服用と似た効果を得られますが、反応力の低下と眠気を引き起こします。" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Plutonium Filter CBM" -msgid_plural "Plutonium Filter CBMs" -msgstr[0] "CBM: プルトニウムろ過システム" - -#. ~ Description for Plutonium Filter CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A system of tanks and filters that are connected to a microreactor to " -"extract plutonium from radioactive slurry." -msgstr "貯蔵槽とフィルターからなるろ化装置です。懸濁液からより迅速にマイクロ反応炉用のプルトニウムを抽出できます。" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Power Armor Interface CBM" msgid_plural "Power Armor Interface CBMs" @@ -15156,32 +15174,6 @@ msgid "" msgstr "" "両手の指先すべてに長さ4cmの両刃の爪を埋め込みます。手に何も着用していない状態で素手攻撃を命中させると、追加で多少の斬撃ダメージを与えられます。" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Internal Microreactor CBM" -msgid_plural "Internal Microreactor CBMs" -msgstr[0] "CBM: 体内マイクロ反応炉" - -#. ~ Description for Internal Microreactor CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"This stripped down mini-reactor will generate impressive amounts of bionic " -"power, but may not be the safest thing to install. Once active, it cannot " -"be shut down and will slowly contaminate the user's body with radiation." -msgstr "" -"この小型反応炉はとてつもなく膨大な発電量を誇りますが、埋め込みが最も危険なCBMの一つでもあります。一度稼働すると停止できず、使用者の身体は徐々に被曝が進みます。" - -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Microreactor Upgrade CBM" -msgid_plural "Microreactor Upgrade CBMs" -msgstr[0] "CBM: 体内マイクロ反応炉改良キット" - -#. ~ Description for Microreactor Upgrade CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A kit for upgrading a pre-installed microreactor with enhanced maximum yield" -" and limited automatic radiation scrubbing capabilities." -msgstr "移植済みの体内マイクロ反応炉に使う改良キットです。移植することで出力が向上し、限定的な放射性物質自動除去機能が追加されます。" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Recycler Unit CBM" msgid_plural "Recycler Unit CBMs" @@ -15780,6 +15772,56 @@ msgid "" "may carry an extra 2 liters of volume." msgstr "胸の内部を格納領域に改造します。 所持品の最大容積が2L増加します。" +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Advanced Microreactor CBM" +msgid_plural "Advanced Microreactor CBMs" +msgstr[0] "CBM: 高度体内マイクロ反応炉" + +#. ~ Description for Advanced Microreactor CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"This module upgrades a pre-installed microreactor with enhanced maximum " +"yield and limited automatic radiation scrubbing capabilities." +msgstr "既存の小型反応炉を改良して最大収率を高め、限定的な自動除染機能を組み込みます。" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Plutonium Filter CBM" +msgid_plural "Plutonium Filter CBMs" +msgstr[0] "CBM: プルトニウムろ過システム" + +#. ~ Description for Plutonium Filter CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A system of tanks and filters that are connected to a microreactor to " +"extract plutonium from radioactive slurry." +msgstr "貯蔵槽とフィルターからなるろ化装置です。懸濁液からより迅速にマイクロ反応炉用のプルトニウムを抽出できます。" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Internal Microreactor CBM" +msgid_plural "Internal Microreactor CBMs" +msgstr[0] "CBM: 体内マイクロ反応炉" + +#. ~ Description for Internal Microreactor CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"This stripped down mini-reactor will generate impressive amounts of bionic " +"power, but may not be the safest thing to install. Once active, it cannot " +"be shut down and will slowly contaminate the user's body with radiation." +msgstr "" +"この小型反応炉はとてつもなく膨大な発電量を誇りますが、埋め込みが最も危険なCBMの一つでもあります。一度稼働すると停止できず、使用者の身体は徐々に被曝が進みます。" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Microreactor Upgrade CBM" +msgid_plural "Microreactor Upgrade CBMs" +msgstr[0] "CBM: 体内マイクロ反応炉改良キット" + +#. ~ Description for Microreactor Upgrade CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A kit for upgrading a pre-installed microreactor with enhanced maximum yield" +" and limited automatic radiation scrubbing capabilities." +msgstr "移植済みの体内マイクロ反応炉に使う改良キットです。移植することで出力が向上し、限定的な放射性物質自動除去機能が追加されます。" + #. ~ Description for Solar Panels CBM #: lang/json/BIONIC_ITEM_from_json.py msgid "" @@ -18050,26 +18092,26 @@ msgstr "認識論と論理に重点を置いた、道徳に関する奥深い論 #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Nietzsche's \"Beyond Good and Evil\". Its cover is dog-" +"This is a copy of Nietzsche's \"Beyond Good and Evil\". Its cover is dog-" "eared and creased." msgstr "ニーチェの「善悪の彼岸」です。表紙はボロボロにくたびれており、角も折れ曲がっています。" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"The Unique and Its Property\" by Max Stirner. A modern " +"This is a copy of \"The Unique and Its Property\" by Max Stirner. A modern " "translation by Wolfi Landstreicher." msgstr "マックス・シュティルナーの「唯一者とその所有」をウォルフィ・ラントシュトライヒャーが現代語訳したものです。" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Jean-Paul Sartre's \"Being and Nothingness\". A key work " +"This is a copy of Jean-Paul Sartre's \"Being and Nothingness\". A key work " "in the existentialist tradition." msgstr "実存主義における重要な著作である、ジャン=ポール・サルトルの「存在と無」です。" #: lang/json/BOOK_from_json.py msgid "" "A large, extended version of \"Madness and Civilisation\" by Michel " -"Foucault. The cover features a striking image of a Panopticonic Prison." +"Foucault. The cover features a striking image of a Panopticonic Prison." msgstr "ミシェル・フーコーの「狂気の歴史」の大型拡張版です。表紙には印象的なパノプティコン型刑務所が描かれています。" #: lang/json/BOOK_from_json.py @@ -18080,13 +18122,13 @@ msgstr "リオタールの「ポストモダンの条件」です。" #: lang/json/BOOK_from_json.py msgid "" -"A collection of texts and essays by Jacques Derrida. It's pages loose and " +"A collection of texts and essays by Jacques Derrida. It's pages loose and " "yellowed, you should probably handle it with care." msgstr "ジャック・デリダの文書、エッセイ集です。紙は黄ばみ綴りも緩んでいるため、慎重に扱う必要がありそうです。" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Society of the Spectacle\" by Guy Debord. Its cover " +"This is a copy of \"Society of the Spectacle\" by Guy Debord. Its cover " "shows rows of adults staring placidly into a screen." msgstr "ギー・ドゥボールの「スペクタクルの社会」です。表紙には並んで静かにスクリーンを眺める人々が描かれています。" @@ -18098,37 +18140,37 @@ msgstr "リュス・イリガライの「性的差異のエチカ」、「ひと #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Baudrillard's \"Simulation and Simulacra\". The cover " +"This is a copy of Baudrillard's \"Simulation and Simulacra\". The cover " "contains an image of a man holding a colored pill in each hand, with the " -"caption \"Welcome to the Desert of the Real.\". You think you've seen this " +"caption \"Welcome to the Desert of the Real.\". You think you've seen this " "movie." msgstr "" "ボードリヤールの「シミュラークルとシミュレーション」です。表紙にはそれぞれの手に色の付いた錠剤を持つ男性と「現実の砂漠へようこそ」と書かれた見出しが載っています。" #: lang/json/BOOK_from_json.py msgid "" -"This is a small, pocket version of Sartre's \"Existentialism and Humanism.\"" -" It looks to have been used as a coaster in a past life." +"This is a small, pocket version of Sartre's \"Existentialism and Humanism\"." +" It looks to have been used as a coaster in a past life." msgstr "サルトルの「実存主義とは何か」のポケット版です。以前はコースターとして使われていたようです。" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Practical Ethics\" by Peter Singer. From the local " +"This is a copy of \"Practical Ethics\" by Peter Singer. From the local " "university press." msgstr "地方の大学から出版された、ピーター・シンガーの「実践の倫理」です。" #: lang/json/BOOK_from_json.py msgid "" "This is a photocopied spiral-bound copy of \"Industrial Society and Its " -"Future\" by 'Freedom Club'. The original looks to have been written on a " +"Future\" by 'Freedom Club'. The original looks to have been written on a " "typewriter before being copied." -msgstr "コピーしたページが螺旋綴じされた、フリーダムクラブの「産業社会とその未来」です。原本は綴じられる前にタイプライターで書かれていたようです。" +msgstr "コピー用紙を螺旋綴じで製本した、フリーダムクラブの「産業社会とその未来」です。原本は綴じられる前にタイプライターで書かれていたようです。" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Industrial Society and Its Future\" by Ted Kaczynski. " +"This is a copy of \"Industrial Society and Its Future\" by Ted Kaczynski. " "Its cover is an image of a hand-crafted wooden box filled with wiring and an" -" ominous looking metal tube. Provocative." +" ominous looking metal tube. Provocative." msgstr "" "テッド・カジンスキーの「産業社会とその未来」です。表紙には、配線と不気味な金属管が入った手製の木箱の写真が載っており、非常に挑発的に見えます。" @@ -18138,23 +18180,23 @@ msgstr "ヘーゲルの弁証法について書かれた小型の読本です。 #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"The State and Revolution\" by Vladimir Lenin. In " +"This is a copy of \"The State and Revolution\" by Vladimir Lenin. In " "English, thankfully." msgstr "ウラジーミル・レーニンの「国家と革命」です。ありがたいことに、英語で書かれています。" #: lang/json/BOOK_from_json.py -msgid "This is a copy of \"In Defence of Terrorism\" by Leon Trotsky." -msgstr "レオン・トロツキーの「テロリズムと共産主義」です。" +msgid "This is a copy of \"In Defense of Marxism\" by Leon Trotsky." +msgstr "レオン・トロツキーの「マルクス主義の防衛」です。" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Steal This Book\" by Abbie Hoffman. There is a security " -"tag on the back cover. It appears to still be active." +"This is a copy of \"Steal This Book\" by Abbie Hoffman. There is a security" +" tag on the back cover. It appears to still be active." msgstr "アビー・ホフマンの「この本を盗め」です。背表紙には稼働中の防犯タグが取り付けてあります。" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Walden: Or Life In The Woods\" by Henry David Thoreau. " +"This is a copy of \"Walden: Or Life In The Woods\" by Henry David Thoreau. " "It contains a dried and pressed leaf as a bookmark." msgstr "ヘンリー・デイヴィッド・ソローの「ウォールデン 森の生活」です。乾燥させた木の葉の栞が挟まっています。" @@ -18175,7 +18217,7 @@ msgid "" msgstr "ジャック・ラカンの「精神分析の四基本概念」です。" #: lang/json/BOOK_from_json.py -msgid "This is a copy of Machiavelli's \"The Prince\". With intro by Q. Skinner." +msgid "This is a copy of Machiavelli's \"The Prince\". With intro by Q. Skinner." msgstr "マキャヴェッリの「君主論」です。クェンティン・スキナーによる序文が追加されています。" #: lang/json/BOOK_from_json.py @@ -18185,12 +18227,12 @@ msgstr "ラウル・ヴァネーゲムの「若者用処世術概論」です。 #: lang/json/BOOK_from_json.py msgid "" -"This is a pocket copy of \"An Essay on Liberation\" by Herbert Marcuse. The " -"cover contains an image of a pelican." +"This is a pocket copy of \"An Essay on Liberation\" by Herbert Marcuse. The" +" cover contains an image of a pelican." msgstr "ヘルベルト・マルクーゼの「解放論の試み」です。表紙にはペリカンが描かれています。" #: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Either-Or\" by Sören Kierkegaard." +msgid "This is a copy of \"Either-Or\" by Søren Kierkegaard." msgstr "セーレン・キェルケゴールの「あれか、これか」です。" #: lang/json/BOOK_from_json.py @@ -18215,6 +18257,69 @@ msgid "" "Science\" by Friederich Nietzsche." msgstr "フリードリヒ・ニーチェの「道徳の系譜」、「悦ばしき知識」の合本です。" +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Myth of Sisyphus\", and other essays, by Albert " +"Camus. The cover depicts a bare-chested man and a large boulder." +msgstr "アルベール・カミュの「シーシュポスの神話」他のエッセイ集です。表紙には、上半身裸の男性が大きな岩を押している姿が描かれています。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Sickness Unto Death\" by Søren Kierkegaard. The " +"pages are dotted with post-it notes." +msgstr "セーレン・キェルケゴールの「死にいたる病」です。ページのあちこちにメモが書かれた付箋が貼ってあります。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Defence of Terrorism\" by Leon Trotsky. Despite the" +" title, it does not actually appear to be defending terrorism." +msgstr "レオン・トロツキーの「テロリズムと共産主義」です。タイトルとは裏腹に、テロを擁護する内容ではありません。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Enquiry Concerning Political Justice\" by William " +"Godwin. This thick book is filled with antiquated phrases." +msgstr "ウィリアム・ゴドウィンの「政治的正義」です。分厚い本の中に時代遅れのフレーズがたくさん載っています。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Abolition of Work and Other Essays\" by Bob Black. " +"It is likely that \"The Abolition of Work\" is the most famous essay in this" +" book." +msgstr "ボブ・ブラックの「労働廃絶論 小論集」です。掲載されている中で最も有名なエッセイは「労働廃絶論」でしょう。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"What is Property?\" by Pierre-Joseph Proudhon. It looks" +" like this book has a surprisingly long track record of owners." +msgstr "ピエール・ジョゼフ・プルードンの「所有とは何か」です。この本は驚くほど長く所有されていたようです。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Conquest of Bread\" by Peter Kropotkin. There is a " +"picture of an old philosopher with magnificent beard, instead of bread, on " +"the cover." +msgstr "ピョートル・クロポトキンの「パンの略取」です。表紙には、パンではなく髭もじゃの老哲学者が載っています。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Trouble with Being Born\" by Emil Cioran. This book" +" might have been printed decades before the cataclysm since the cover is " +"quite weathered." +msgstr "エミール・シオランの「生誕の災厄」です。表紙はかなり風化しており、大変動の何十年も前に出版されたようです。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The World as Will and Representation\" by Arthur " +"Schopenhauer. It contains a few undecipherable notes and scribbles." +msgstr "アルトゥル・ショーペンハウアーの「意志と表象としての世界」です。解読不能なメモや落書きが載っています。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Up-Wingers: A Futurist Manifesto\" by FM-2030. It seems" +" that the author's real name is Fereidoun M. Esfandiary." +msgstr "FM-2030の「アップウィンガーズ: 未来派宣言」です。著者の本名はフェレイドゥン・M・エスファンダイアリーであるようです。" + #: lang/json/BOOK_from_json.py msgid "phone book" msgid_plural "phone books" @@ -19812,11 +19917,11 @@ msgstr[0] "フェノール" msgid "" "This useful stuff is a potent solvent and has a wide range of reactive " "applications. It can be used to make a huge number of plastics and " -"polymers, it can be a disinfectant, it can strip paint and break down epoxy," -" and it can burn your skin away like tissue paper under a heat gun. Wear " +"polymers, it can be an antiseptic, it can strip paint and break down epoxy, " +"and it can burn your skin away like tissue paper under a heat gun. Wear " "gloves." msgstr "" -"この便利な薬品は強力な溶媒であり、様々な物質と反応し、プラスチックやポリマーの大量生産にも使われています。消毒薬、塗料剥がし、エポキシの硬化など利用法は多岐にわたりますが、皮膚に付くと炎の中のティッシュペーパーのように一瞬で焼け爛れます。手袋をはめて使いましょう。" +"この便利な薬品は強力な溶媒であり、様々な物質と反応し、プラスチックやポリマーの大量生産にも使われています。消毒剤、塗料剥がし、エポキシ硬化剤など利用法は多岐にわたりますが、皮膚に付着すると燃えるティッシュペーパーのように一瞬で焼け爛れます。手袋をはめて使いましょう。" #: lang/json/COMESTIBLE_from_json.py msgid "glycerol" @@ -24699,9 +24804,9 @@ msgstr[0] "粉末消毒薬" #. ~ Description for antiseptic powder #: lang/json/COMESTIBLE_from_json.py msgid "" -"A powdered form of chemical disinfectant, this bismuth formic iodide cleans " +"A powdered form of chemical antiseptic, this bismuth formic iodide cleans " "wounds quickly and painlessly." -msgstr "ヨウ化ギ酸ビスマスを主成分とする化学消毒剤を粉末にしたものです。傷口を速やかに消毒し、ほとんど沁みません。" +msgstr "ヨウ化ギ酸ビスマスを主成分とする粉末状の化学消毒剤です。傷口に刺激を与えず速やかに消毒します。" #: lang/json/COMESTIBLE_from_json.py msgid "caffeinated chewing gum" @@ -24746,11 +24851,10 @@ msgstr[0] "過酸化水素水" #. ~ Description for hydrogen peroxide #: lang/json/COMESTIBLE_from_json.py msgid "" -"Dilute hydrogen peroxide, for use as a disinfectant and for bleaching hair " -"or textiles. Foams a little when in contact with organic matter, but " +"Dilute hydrogen peroxide, for use as an antiseptic and for bleaching hair or" +" textiles. Foams a little when in contact with organic matter, but " "otherwise harmless." -msgstr "" -"過酸化水素の水溶液です。消毒、または髪や織物の脱色に使える程度の濃度に調整されています。有機物に触れるとわずかに発泡しますが、目などに入らない限り危険はありません。" +msgstr "消毒、髪や織物の脱色に使える程度の濃度に調整された、過酸化水素の水溶液です。有機物に触れるとわずかに発泡しますが、危険はありません。" #: lang/json/COMESTIBLE_from_json.py lang/json/GENERIC_from_json.py msgid "cigarette" @@ -24888,23 +24992,23 @@ msgid "" msgstr "昼用の風邪及びインフルエンザの治療薬です。眠気を催しません。咳、頭痛、鼻水を抑えます。" #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant" +msgid "antiseptic" msgstr "消毒薬" -#. ~ Description for disinfectant +#. ~ Description for antiseptic #: lang/json/COMESTIBLE_from_json.py -msgid "A powerful disinfectant commonly used for contaminated wounds." -msgstr "消毒能力の高い薬品です。ゾンビに噛まれた箇所にかける事で感染症を防げます。" +msgid "A powerful antiseptic commonly used for contaminated wounds." +msgstr "一般的には不潔な傷口に対して使う、強力な消毒薬です。" #: lang/json/COMESTIBLE_from_json.py -msgid "makeshift disinfectant" +msgid "makeshift antiseptic" msgstr "簡易消毒薬" -#. ~ Description for makeshift disinfectant +#. ~ Description for makeshift antiseptic #: lang/json/COMESTIBLE_from_json.py msgid "" -"Makeshift disinfectant made from ethanol. Can be used to disinfect a wound." -msgstr "エタノールを加工して作った消毒薬です。傷口の消毒に使用できます。" +"Makeshift antiseptic made from ethanol. Can be used to disinfect a wound." +msgstr "エタノールで作った簡易的な消毒薬です。傷口の消毒に使用できます。" #: lang/json/COMESTIBLE_from_json.py src/addiction.cpp msgid "diazepam" @@ -25247,8 +25351,8 @@ msgstr "精油(タイム)" #: lang/json/COMESTIBLE_from_json.py msgid "" "Some essential oil made from thyme, which can act as a mildly irritating " -"disinfectant." -msgstr "タイムから採った精油は低刺激性で消毒効果があります。" +"antiseptic." +msgstr "タイムから採った精油は低刺激性の消毒薬として利用でいます。" #: lang/json/COMESTIBLE_from_json.py msgid "rolling tobacco" @@ -25430,26 +25534,26 @@ msgstr "" "強力な鎮静作用を持つ抗不安薬です。副作用として離脱症状や記憶喪失を引き起こす事があります。依存性が強く、定期的な服用による禁断症状を止めるには、少しずつ量を減らしていく必要があります。一般名はアルプラゾラムです。" #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant soaked rag" -msgid_plural "disinfectant soaked rags" +msgid "antiseptic soaked rag" +msgid_plural "antiseptic soaked rags" msgstr[0] "消毒布" -#. ~ Description for disinfectant soaked rag +#. ~ Description for antiseptic soaked rag #: lang/json/COMESTIBLE_from_json.py msgid "" -"A rag soaked in disinfectant. Useful for light wounds, probaby won't help " -"with deep bites." +"A rag soaked in antiseptic. Useful for light wounds, probaby won't help with" +" deep bites." msgstr "消毒液を浸した布切れです。軽傷を治療する効果がありますが、深い咬傷には意味がありません。" #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant soaked cotton balls" -msgid_plural "disinfectant soaked cotton balls" +msgid "antiseptic soaked cotton balls" +msgid_plural "antiseptic soaked cotton balls" msgstr[0] "消毒綿" -#. ~ Description for disinfectant soaked cotton balls +#. ~ Description for antiseptic soaked cotton balls #: lang/json/COMESTIBLE_from_json.py msgid "" -"Fluffy balls of clean white cotton. Now soaked with disinfectant, they are " +"Fluffy balls of clean white cotton. Now soaked with antiseptic, they are " "somewhat useful to disinfect a wound." msgstr "ふわふわとした綺麗な白い綿球です。消毒液に浸してあり、傷の消毒に多少は役立ちます。" @@ -27936,6 +28040,20 @@ msgstr[0] "サンドイッチ(ジャム)" msgid "A delicious jam sandwich." msgstr "ジャムを挟んだ美味しいサンドイッチです。" +#: lang/json/COMESTIBLE_from_json.py +msgid "fairy bread" +msgid_plural "fairy bread" +msgstr[0] "フェアリーブレッド" + +#. ~ Description for fairy bread +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"An 'open-faced sandwich' consisting of sliced white bread, a healthy crust-" +"to-crust slathering of butter, and sprinkles. Supposedly a staple of " +"birthday parties in Australia." +msgstr "" +"バターを塗った健康的な耳つき食パンにスプリンクルをまぶした「オープンサンドイッチ」です。オーストラリアの誕生日パーティーでは定番のようです。" + #: lang/json/COMESTIBLE_from_json.py msgid "honey sandwich" msgid_plural "honey sandwiches" @@ -29062,6 +29180,22 @@ msgid "" "its own." msgstr "とても甘い砂糖です。歯に非常に良くない上に、砂糖単体では余り美味しくないです。そう、ビックリする程ね。" +#: lang/json/COMESTIBLE_from_json.py +msgid "sprinkles" +msgid_plural "sprinkles" +msgstr[0] "スプリンクル" + +#. ~ Description for sprinkles +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Known as nonpareils, sprinkles, jimmies, sugar strands or 'hundreds-and-" +"thousands', these colorful balls, rods or flakes of sugar and starch are " +"intended for use decorating soft surfaces of sweets. Like sugar, they are " +"bad for your teeth and surprisingly not very tasty on their own." +msgstr "" +"ノンパレル " +"、スプリンクル、ジミー、シュガーストランド、「ハンドレッド&サウザンド」などの呼び名がある色鮮やかな丸い粒、縦長の粒、砂糖やデンプンの薄片です。菓子などの柔らかい食品の表面を飾り付けるために使われます。" + #: lang/json/COMESTIBLE_from_json.py msgid "wild herbs" msgid_plural "wild herbs" @@ -33318,6 +33452,21 @@ msgid "" msgstr "" "最先端の光記憶システムです。小さなガラス板に刻まれた緻密な模様には、ナノ製造装置を使ってアイテムを組み立てるのに必要な命令が保存されています。" +#: lang/json/GENERIC_from_json.py +msgid "nanofabricator template (silicon photonics)" +msgid_plural "nanofabricator template (silicon photonics)s" +msgstr[0] "ナノ製造テンプレート(フォトニック回路)" + +#. ~ Description for nanofabricator template (silicon photonics) +#: lang/json/GENERIC_from_json.py +msgid "" +"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." +msgstr "" +"複雑なシリコン製回路の製造に必要な命令セットが入った、最先端の光記憶システムです。内部データにはかつて数百万ドルは下らない価値が付きましたが、今の状況でハイテク文鎮以上の用途があるのでしょうか。" + #: lang/json/GENERIC_from_json.py msgid "antenna" msgid_plural "antennas" @@ -37611,7 +37760,7 @@ msgstr[0] "空薬莢(.300口径/BLK)" #. ~ Description for .300BLK casing #: lang/json/GENERIC_from_json.py -msgid "An empty casing from a .300BLK round." +msgid "An empty casing from a .300 AAC Blackout round." msgstr ".300口径BLK弾の空薬莢です。" #: lang/json/GENERIC_from_json.py @@ -39121,6 +39270,35 @@ msgid "" msgstr "" "観光客向けのお土産として大量生産されたシレーラです。この節くれだった木の枝は、伝統的なシレーラのように煙突の煙を浴びせて硬化されていませんが、黒い煤に見立てた塗料が塗ってあります。" +#: lang/json/GENERIC_from_json.py +msgid "blackjack" +msgid_plural "blackjacks" +msgstr[0] "ブラックジャック" + +#. ~ Description for blackjack +#: lang/json/GENERIC_from_json.py +msgid "" +"This is a short, easily concealed bludgeoning weapon consisting of a weight " +"embedded at the end of a short leather shaft. Formerly used by law " +"enforcement, this weapon is meant to stun or knock out the subject, although" +" head strikes have a high risk of causing a permanent, disabling brain " +"injury or being fatal." +msgstr "" +"短い革製の柄の先端に錘を埋め込んだ、小型で簡単に隠蔽できる棍棒状の武器です。以前は法執行機関によって使われていました。対象を気絶・昏倒させる目的で使われますが、頭部を殴打すると永続的な脳障害や致命的な怪我を負わせるリスクが高まります。" + +#: lang/json/GENERIC_from_json.py +msgid "makeshift sap" +msgid_plural "makeshift saps" +msgstr[0] "簡易サップ" + +#. ~ Description for makeshift sap +#: lang/json/GENERIC_from_json.py +msgid "" +"This is an improvised sap, also known as a cosh, slapjack and slapper. A " +"short and flat bludgeoning weapon consisting of a weight embedded between " +"two patches of leather." +msgstr "コッシュ、スラップジャック、スラッパーという呼び名でも知られている、錘を2枚の革で挟んで作った、短く平らな棍棒状の武器です。" + #: lang/json/GENERIC_from_json.py msgid "pointy stick" msgid_plural "pointy sticks" @@ -39569,6 +39747,28 @@ msgid "" "is marginally shorter than the foil and epee, but no less effective." msgstr "最も高貴なスポーツ、フェンシングで使われる剣の一種です。ホイルやエペよりもわずかに短く作られていますが、変わりゃあしません。" +#: lang/json/GENERIC_from_json.py +msgid "hollow cane" +msgid_plural "hollow canes" +msgstr[0] "仕込み杖" + +#. ~ Description for hollow cane +#: lang/json/GENERIC_from_json.py +msgid "" +"A cane designed to conceal blade. This was a popular fashion accessory for " +"the wealthy during the 18th and 19th centuries." +msgstr "内部に特殊な剣を隠す機能をもった杖です。18世紀から19世紀にかけて、富裕層に人気のファッションアイテムでした。" + +#: lang/json/GENERIC_from_json.py +msgid "sword cane" +msgid_plural "sword canes" +msgstr[0] "仕込み剣" + +#. ~ Description for sword cane +#: lang/json/GENERIC_from_json.py +msgid "A sword with a thin blade designed to be hidden inside an hollow cane." +msgstr "仕込み杖の内部に隠せるように作られた、刃の薄い剣です。" + #: lang/json/GENERIC_from_json.py lang/json/TOOL_from_json.py #: lang/json/TOOL_from_json.py msgid "cutlass" @@ -46127,6 +46327,15 @@ msgstr "弾倉(.22口径/ジェニングスJ-22)" msgid "A cheap 6-round steel box magazine for the Jennings J-22." msgstr "J-22に対応する、安物の6発鋼鉄製箱型弾倉です。" +#: lang/json/MAGAZINE_from_json.py +msgid "Walther P22 magazine" +msgstr "弾倉(.32口径/ワルサーP22)" + +#. ~ Description for Walther P22 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round box magazine for the Walther P22." +msgstr "ワルサーP22に対応する10発箱型弾倉です。" + #: lang/json/MAGAZINE_from_json.py msgid "LW-5 speedloader" msgstr "スピードローダー(.223口径/LW-5)" @@ -46534,6 +46743,20 @@ msgstr "弾倉(.380口径/MAC-11)" msgid "A cheap 32-round steel box magazine for use with the MAC-11 SMG." msgstr "MAC-11に対応する、安物の32発鋼鉄製箱型弾倉です。" +#: lang/json/MAGAZINE_from_json.py +msgid "CF-380 magazine" +msgstr "弾倉(.380口径/CF-380)" + +#. ~ Description for CF-380 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Hi-Point CF-380." +msgstr "ハイポイントCF-380に対応する、8発鋼鉄製箱型弾倉です。" + +#. ~ Description for CF-380 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point CF-380." +msgstr "ハイポイントCF-380に対応する、10発鋼鉄製箱型弾倉です。" + #: lang/json/MAGAZINE_from_json.py msgid "M1911 .38 Super magazine" msgstr "弾倉(.38口径スーパー/M1911)" @@ -46598,6 +46821,43 @@ msgid "" msgstr "" "グロック22ハンドガンに加え、同様の簡易弾倉を装填できるいくつかの武器にも対応した、手製のシングルカラム式鋼鉄製20発弾倉です。信頼性にはあまり期待しない方が良さそうです。" +#: lang/json/MAGAZINE_from_json.py +msgid "Hi-Power magazine .40 S&W" +msgstr "弾倉(.40口径/ハイパワーS&W)" + +#. ~ Description for Hi-Power magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Browning Hi-Power .40 S&W." +msgstr "ブローニングハイパワー.40口径S&W弾モデルに対応する、10発鋼鉄製箱型弾倉です。" + +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine .40 S&W" +msgstr "弾倉(.40口径/PPQ S&W)" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "ワルサーPPQ.40口径S&W弾モデルに対応する、10発鋼鉄製箱型弾倉です。" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 12 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "ワルサーPPQ.40口径S&W弾モデルに対応する、12発鋼鉄製箱型弾倉です。" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 14 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "ワルサーPPQ.40口径S&W弾モデルに対応する、14発鋼鉄製箱型弾倉です。" + +#: lang/json/MAGAZINE_from_json.py +msgid "Model JCP magazine" +msgstr "弾倉(.40口径/ハイポイントモデルJCP)" + +#. ~ Description for Model JCP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point Model JCP." +msgstr "ハイポイントモデルJCPに対応する、10発鋼鉄製箱型弾倉です。" + #: lang/json/MAGAZINE_from_json.py msgid "grenade belt" msgstr "弾帯(40mm擲弾)" @@ -46753,6 +47013,24 @@ msgstr "弾倉(.45口径/USP)" msgid "A standard capacity magazine for use with the H&K USP handgun." msgstr "H&K USPに対応する標準容量の弾倉です。" +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine .45 ACP" +msgstr "弾倉(.45口径/PPQ ACP)" + +#. ~ Description for PPQ magazine .45 ACP +#: lang/json/MAGAZINE_from_json.py +msgid "A 12 round steel box magazine for the Walther PPQ .45 ACP." +msgstr "ワルサーPPQ.45口径ACP弾モデルに対応する、12発鋼鉄製箱型弾倉です。" + +#: lang/json/MAGAZINE_from_json.py +msgid "Model JHP magazine" +msgstr "弾倉(.40口径/ハイポイントモデルJHP)" + +#. ~ Description for Model JHP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 9-round steel box magazine for use with the Hi-Point Model JHP." +msgstr "ハイポイントモデルJHPに対応する、9発鋼鉄製箱型弾倉です。" + #: lang/json/MAGAZINE_from_json.py msgid ".454 5-round speedloader" msgstr "スピードローダー(.454口径/5発)" @@ -47021,7 +47299,7 @@ msgstr "8x40mmの弾薬を5発装填できるスピードローダーです。Ri #: lang/json/MAGAZINE_from_json.py msgid "LW-7 speedloader" -msgstr "スピードローダー(9x19mm/LW-7)" +msgstr "スピードローダー(9mm/LW-7)" #. ~ Description for LW-7 speedloader #: lang/json/MAGAZINE_from_json.py @@ -47218,13 +47496,102 @@ msgstr "ケルテックPF-9に対応する、標準仕様の7発鋼鉄製箱型 #: lang/json/MAGAZINE_from_json.py msgid "P320 magazine 9x19mm" -msgstr "弾倉(9x19mm/SIG P320)" +msgstr "弾倉(9mm/SIG P320)" #. ~ Description for P320 magazine 9x19mm #: lang/json/MAGAZINE_from_json.py msgid "A 17 round double stack box magazine for the SIG Sauer P320." msgstr "SIG P320に対応する、17発鋼鉄製ダブルスタック箱型弾倉です。" +#: lang/json/MAGAZINE_from_json.py +msgid "Hi-Power magazine 9x19mm" +msgstr "弾倉(9mm/ハイパワー)" + +#. ~ Description for Hi-Power magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 13 round steel box magazine for the Browning Hi-Power 9x19mm." +msgstr "ブローニングハイパワー9x19mm弾モデルに対応する、13発鋼鉄製箱型弾倉です。" + +#. ~ Description for Hi-Power magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 15 round steel box magazine for the Browning Hi-Power 9x19mm." +msgstr "ブローニングハイパワー9x19mm弾モデルに対応する、15発鋼鉄製箱型弾倉です。" + +#: lang/json/MAGAZINE_from_json.py +msgid "P38 magazine" +msgstr "弾倉(9mm/P38)" + +#. ~ Description for P38 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8 round steel box magazine for the Walther P38." +msgstr "ワルサーP38に対応する、8発鋼鉄製箱型弾倉です。" + +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine 9x19mm" +msgstr "弾倉(9mm/PPQ)" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Walther PPQ 9mm." +msgstr "ワルサーPPQ9mm弾モデルに対応する、10発鋼鉄製箱型弾倉です。" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 15 round steel box magazine for the Walther PPQ 9mm." +msgstr "ワルサーPPQ9mm弾モデルに対応する、15発鋼鉄製箱型弾倉です。" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 17 round steel box magazine for the Walther PPQ 9mm." +msgstr "ワルサーPPQ9mm弾モデルに対応する、17発鋼鉄製箱型弾倉です。" + +#: lang/json/MAGAZINE_from_json.py +msgid "C-9 magazine" +msgstr "弾倉(9mm/C-9)" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Hi-Point C-9." +msgstr "ハイポイントC-9に対応する8発鋼鉄製箱型弾倉です。" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point C-9." +msgstr "ハイポイントC-9に対応する10発鋼鉄製箱型弾倉です。" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 15-round steel box magazine for use with the Hi-Point C-9." +msgstr "ハイポイントC-9に対応する15発鋼鉄製箱型弾倉です。" + +#: lang/json/MAGAZINE_from_json.py +msgid "CZ 75 magazine" +msgstr "弾倉(9mm/CZ75)" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 12-round steel box magazine for use with the CZ 75." +msgstr "CZ 75に対応する12発鋼鉄製箱型弾倉です。" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 20-round steel box magazine for use with the CZ 75." +msgstr "CZ 75に対応する20発鋼鉄製箱型弾倉です。" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 26-round steel box magazine for use with the CZ 75." +msgstr "CZ 75に対応する26発鋼鉄製箱型弾倉です。" + +#: lang/json/MAGAZINE_from_json.py +msgid "CCP magazine" +msgstr "弾倉(9mm/CCP)" + +#. ~ Description for CCP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Walther CCP." +msgstr "ワルサーCCPに対応する8発鋼鉄製箱型弾倉です。" + #: lang/json/MAGAZINE_from_json.py msgid "Makarov PM magazine" msgstr "弾倉(9x18mm/マカロフ PM)" @@ -50881,10 +51248,10 @@ msgstr "軍用タレット" #: lang/json/MONSTER_from_json.py msgid "" "Leadworks LLC's T-4A1 Sentry. It features improved firmware over General " -"Atomics' TX-1 9x19mm model and an automated M4 carbine." +"Atomics' TX-1 9x19mm model and an automated 5.56mm carbine." msgstr "" "Leadworks 社のT-4A1 Sentryは、 General Atomics社製TX-1 " -"9x19mm銃モデルや無人機のM4カービンよりも性能の高いファームウェアを搭載しています。" +"9x19mm銃モデルや無人機の5.56mmカービンよりも性能の高いファームウェアを搭載しています。" #: lang/json/MONSTER_from_json.py msgid "debug monster" @@ -52267,6 +52634,48 @@ msgid "" msgstr "" "かつて人間だった肉塊から生まれた悪夢のようなクモ型のゾンビです。ボロボロになった肋骨の隙間から生えた四肢を使い、壁や天井を器用に這い回ります。" +#: lang/json/MONSTER_from_json.py +msgid "gangrenous impaler" +msgstr "毒虫ゾンビ" + +#. ~ Description for gangrenous impaler +#: lang/json/MONSTER_from_json.py +msgid "" +"A corpse hideously twisted into an insect-like form. A hollow tendril " +"reaches out from its open thorax." +msgstr "身体が不気味に捻じれて昆虫のような姿に変形しています。開いた胸部からチューブ状の触手が飛び出します。" + +#: lang/json/MONSTER_from_json.py +msgid "The impaler launches a barb!" +msgstr "毒虫ゾンビは針を射出しました!" + +#: lang/json/MONSTER_from_json.py +msgid "trapped tendril" +msgstr "巨大触手" + +#. ~ Description for trapped tendril +#: lang/json/MONSTER_from_json.py +msgid "" +"A great tendril of mutated flesh and sharpened bone. Emergent from a " +"crevice in the ruined floor, hundreds of human limbs seek freedom and writhe" +" incessantly from underneath its grotesque carapace. As enormous as it may " +"already be, you feel certain that this is just part of a creature much " +"bigger, for when it moves, you can feel this whole ruin tremble, as if an " +"unseen giant struggled against the weight of its concrete tomb." +msgstr "" +"変異した肉と鋭い骨からなる大きな触手です。ひび割れた床の隙間から出現し、不気味な甲殻の下では何百もの人の手足が自由を求めて蠢いています。見える部分だけでも相当の大きさですが、これも非常に巨大な化け物の一部に過ぎないのでしょう。まるで巨人がコンクリートの墓に埋もれて苦しんでいるかのように、周囲の空気が震えています。" + +#: lang/json/MONSTER_from_json.py +msgid "flesh wall" +msgstr "肉の壁" + +#. ~ Description for flesh wall +#: lang/json/MONSTER_from_json.py +msgid "" +"A great lump of mutated flesh. It resembles the innards of some gigantic " +"creature and is covered in a grid of diminutive veins." +msgstr "突然変異した肉の巨大な塊です。細い静脈で覆われており、巨大な生物の内臓のようにも見えます。" + #: lang/json/MONSTER_from_json.py msgid "bloated fungal zombie" msgstr "真菌膨張ゾンビ" @@ -55653,6 +56062,24 @@ msgid "" "effect. Starts very short range, increases rapidly with level." msgstr "苦痛増加、スタミナ減少、短期間の幻覚効果をもつミ=ゴ・スレイヴァーのビームです。" +#: lang/json/SPELL_from_json.py +msgid "Summon Gangrenous Crawlers" +msgstr "蜘蛛ゾンビ召喚" + +#. ~ Description for Summon Gangrenous Crawlers +#: lang/json/SPELL_from_json.py +msgid "Summons 2 permanent gangrenous crawlers." +msgstr "2体の蜘蛛ゾンビを召喚します。" + +#: lang/json/SPELL_from_json.py +msgid "Summon Gangrenous Monsters" +msgstr "毒虫ゾンビ召喚" + +#. ~ Description for Summon Gangrenous Monsters +#: lang/json/SPELL_from_json.py +msgid "Summons 2 permanent gangrenous impalers." +msgstr "2体の毒虫ゾンビを召喚します。" + #: lang/json/SPELL_from_json.py msgid "Smite" msgstr "スマイト" @@ -61562,6 +61989,18 @@ msgid "" "used for cleaning impervious surfaces." msgstr "掃除に役立つ、柔らかくて多孔質の素材でできた道具です。普通は水を通さない物体の表面を洗浄するのに使われます。" +#: lang/json/TOOL_from_json.py +msgid "washing kit" +msgid_plural "washing kits" +msgstr[0] "洗濯洗浄キット" + +#. ~ Description for washing kit +#: lang/json/TOOL_from_json.py +msgid "" +"A combination kit of a washboard and a sponge. Everything you need to clean" +" items after the apocalypse." +msgstr "洗濯板とスポンジのセットです。大変動後に物を洗うために必要な道具全てが揃っています。" + #: lang/json/TOOL_from_json.py msgid "reading light" msgid_plural "reading lights" @@ -68757,6 +69196,10 @@ msgstr ".45-70口径弾" msgid "nails" msgstr "釘" +#: lang/json/ammunition_type_from_json.py +msgid "barb" +msgstr "棘" + #: lang/json/ammunition_type_from_json.py msgid "BBs" msgstr "BB弾" @@ -68964,8 +69407,8 @@ msgid "components" msgstr "材料" #: lang/json/ammunition_type_from_json.py -msgid "93mm RPG-7" -msgstr "ランチャー(93mm/RPG-7)" +msgid "RPG-7 rocket" +msgstr "ロケット弾(RPG-7)" #: lang/json/ammunition_type_from_json.py msgid "rebreather filter" @@ -69097,20 +69540,6 @@ msgid "" msgstr "" "起動すると電力を常に消費して膜を発生させ、全身を包みます。物体が膜の内側に侵入しようとすると、追加で電力を消費して軌道を逸らします。剣などよりも弾丸などの小さな物体に対して効果的に働きます。" -#: lang/json/bionic_from_json.py -msgid "Advanced Microreactor System" -msgstr "高度体内マイクロ反応炉システム" - -#. ~ Description for Advanced Microreactor System -#: lang/json/bionic_from_json.py -msgid "" -"This stripped down mini-reactor is more efficient and safer than the base " -"model due to integrated radiation cleansers. There is no way to shut it " -"down once active, but you can toggle additional fuel intake." -msgstr "" -"この必要最低限の要素を備えた小型化された反応炉は、放射能除去装置を装備したことにより基本モデルよりもより効率的で安全になりました。一度動き出したら停止できませんが、燃料追加口を閉鎖することはできます。" -" " - #: lang/json/bionic_from_json.py msgid "Alarm System" msgstr "警報システム" @@ -69889,28 +70318,6 @@ msgid "" msgstr "" "痛覚信号の伝達を任意で阻害できるよう神経系を改造します。起動することで鎮痛剤の服用と似た効果を得られますが、同様に反応力の低下と眠気を引き起こします。" -#: lang/json/bionic_from_json.py -msgid "Plutonium Filter" -msgstr "プルトニウムろ過システム" - -#. ~ Description for Plutonium Filter -#: lang/json/bionic_from_json.py -msgid "" -"This set of tanks and filters allows you to extract plutonium from " -"radioactive slurry." -msgstr "貯蔵槽とフィルターからなるろ化装置です。懸濁液からより迅速にマイクロ反応炉用のプルトニウムを抽出できます。 " - -#: lang/json/bionic_from_json.py -msgid "Plutonium Purger" -msgstr "プルトニウム緊急排出システム" - -#. ~ Description for Plutonium Purger -#: lang/json/bionic_from_json.py -msgid "" -"Triggers an emergency reactor fuel purge that ejects all fuel from your " -"reactor." -msgstr "反応炉に充填されている全ての燃料を緊急排出します。 " - #. ~ Description for Bionic Visual Impairment #: lang/json/bionic_from_json.py msgid "" @@ -70035,20 +70442,6 @@ msgid "" msgstr "" "爪と指の間に極薄で出し入れ自在の刃を埋め込みます。攻撃の際に多少の追加ダメージを発生させるでしょう。当然指先が覆われていない場合に限りますが。 " -#: lang/json/bionic_from_json.py -msgid "Microreactor System" -msgstr "体内マイクロ反応炉システム" - -#. ~ Description for Microreactor System -#: lang/json/bionic_from_json.py -msgid "" -"This stripped down mini-reactor generates impressive amounts of bionic " -"power. There is no way to shut it down, but you can toggle additional fuel " -"intake. Irradiates your body when active." -msgstr "" -"この必要最低限の要素を備えた小型化された反応炉は驚くほどの電力を発生させます。一度動き出したら停止できませんが、燃料追加口を閉鎖することはできます。 " -"起動すると身体を放射能で汚染します。" - #: lang/json/bionic_from_json.py msgid "Recycler Unit" msgstr "再利用ユニット" @@ -70462,6 +70855,56 @@ msgid "" "artificial but effective sensation of fatigue." msgstr "脳の腹外側視索前野に電極が埋め込まれています。眠ろうとする際に自動的に作動し、人工的に疲労状態と似たような感覚を発生させます。" +#: lang/json/bionic_from_json.py +msgid "Advanced Microreactor System" +msgstr "高度体内マイクロ反応炉システム" + +#. ~ Description for Advanced Microreactor System +#: lang/json/bionic_from_json.py +msgid "" +"This stripped down mini-reactor is more efficient and safer than the base " +"model due to integrated radiation cleansers. There is no way to shut it " +"down once active, but you can toggle additional fuel intake." +msgstr "" +"この必要最低限の要素を備えた小型化された反応炉は、放射能除去装置を装備したことにより基本モデルよりもより効率的で安全になりました。一度動き出したら停止できませんが、燃料追加口を閉鎖することはできます。" +" " + +#: lang/json/bionic_from_json.py +msgid "Plutonium Filter" +msgstr "プルトニウムろ過システム" + +#. ~ Description for Plutonium Filter +#: lang/json/bionic_from_json.py +msgid "" +"This set of tanks and filters allows you to extract plutonium from " +"radioactive slurry." +msgstr "貯蔵槽とフィルターからなるろ化装置です。懸濁液からより迅速にマイクロ反応炉用のプルトニウムを抽出できます。 " + +#: lang/json/bionic_from_json.py +msgid "Plutonium Purger" +msgstr "プルトニウム緊急排出システム" + +#. ~ Description for Plutonium Purger +#: lang/json/bionic_from_json.py +msgid "" +"Triggers an emergency reactor fuel purge that ejects all fuel from your " +"reactor." +msgstr "反応炉に充填されている全ての燃料を緊急排出します。 " + +#: lang/json/bionic_from_json.py +msgid "Microreactor System" +msgstr "体内マイクロ反応炉システム" + +#. ~ Description for Microreactor System +#: lang/json/bionic_from_json.py +msgid "" +"This stripped down mini-reactor generates impressive amounts of bionic " +"power. There is no way to shut it down, but you can toggle additional fuel " +"intake. Irradiates your body when active." +msgstr "" +"この必要最低限の要素を備えた小型化された反応炉は驚くほどの電力を発生させます。一度動き出したら停止できませんが、燃料追加口を閉鎖することはできます。 " +"起動すると身体を放射能で汚染します。" + #: lang/json/bionic_from_json.py msgid "Internal Furnace" msgstr "体内炉" @@ -70588,8 +71031,7 @@ msgstr "近接戦闘と回避が阻害されます。" #: lang/json/bodypart_from_json.py src/armor_layers.cpp src/character.cpp #: src/debug_menu.cpp msgid "Torso" -msgid_plural "Torso" -msgstr[0] "胴" +msgstr "胴" #. ~ Crafting recipes subcategory of 'ARMOR' category #: lang/json/bodypart_from_json.py lang/json/recipe_category_from_json.py @@ -70608,8 +71050,7 @@ msgstr "頭" #: lang/json/bodypart_from_json.py src/armor_layers.cpp src/character.cpp #: src/debug_menu.cpp msgid "Head" -msgid_plural "Head" -msgstr[0] "頭" +msgstr "頭" #. ~ Crafting recipes subcategory of 'ARMOR' category #: lang/json/bodypart_from_json.py lang/json/recipe_category_from_json.py @@ -70631,8 +71072,7 @@ msgstr "射撃・投擲が阻害されます。" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "Eyes" -msgid_plural "Eyes" -msgstr[0] "目" +msgstr "目" #: lang/json/bodypart_from_json.py msgid "mouth" @@ -70649,8 +71089,7 @@ msgstr "走る速さが遅くなります。" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "Mouth" -msgid_plural "Mouth" -msgstr[0] "口" +msgstr "口" #: lang/json/bodypart_from_json.py msgid "left arm" @@ -70661,14 +71100,26 @@ msgctxt "bodypart_accusative" msgid "left arm" msgstr "左腕" +#: lang/json/bodypart_from_json.py +msgid "arms" +msgstr "腕" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "arms" +msgstr "腕" + #: lang/json/bodypart_from_json.py msgid "Melee and ranged combat is hampered." msgstr "近接戦闘と射撃・投擲が阻害されます。" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Arm" -msgid_plural "Arms" -msgstr[0] "腕" +msgstr "左腕" + +#: lang/json/bodypart_from_json.py +msgid "Arms" +msgstr "腕" #: lang/json/bodypart_from_json.py msgid "L ARM" @@ -70685,8 +71136,7 @@ msgstr "右腕" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Arm" -msgid_plural "Arms" -msgstr[0] "腕" +msgstr "右腕" #: lang/json/bodypart_from_json.py msgid "R ARM" @@ -70701,14 +71151,26 @@ msgctxt "bodypart_accusative" msgid "left hand" msgstr "左手" +#: lang/json/bodypart_from_json.py +msgid "hands" +msgstr "手" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "hands" +msgstr "手" + #: lang/json/bodypart_from_json.py msgid "Manual tasks are slowed." msgstr "手作業全般が遅くなります。" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Hand" -msgid_plural "Hands" -msgstr[0] "手" +msgstr "左手" + +#: lang/json/bodypart_from_json.py +msgid "Hands" +msgstr "手" #: lang/json/bodypart_from_json.py msgid "right hand" @@ -70721,8 +71183,7 @@ msgstr "右手" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Hand" -msgid_plural "Hands" -msgstr[0] "手" +msgstr "右手" #: lang/json/bodypart_from_json.py msgid "left leg" @@ -70733,14 +71194,26 @@ msgctxt "bodypart_accusative" msgid "left leg" msgstr "左脚" +#: lang/json/bodypart_from_json.py +msgid "legs" +msgstr "脚" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "legs" +msgstr "脚" + #: lang/json/bodypart_from_json.py msgid "Running and swimming are slowed." msgstr "走る速さと泳ぐ速さが遅くなります。" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Leg" -msgid_plural "Legs" -msgstr[0] "脚" +msgstr "左脚" + +#: lang/json/bodypart_from_json.py +msgid "Legs" +msgstr "脚" #: lang/json/bodypart_from_json.py msgid "L LEG" @@ -70757,8 +71230,7 @@ msgstr "右脚" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Leg" -msgid_plural "Legs" -msgstr[0] "脚" +msgstr "右脚" #: lang/json/bodypart_from_json.py msgid "R LEG" @@ -70773,10 +71245,22 @@ msgctxt "bodypart_accusative" msgid "left foot" msgstr "左足" +#: lang/json/bodypart_from_json.py +msgid "feet" +msgstr "足" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "feet" +msgstr "足" + #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Foot" -msgid_plural "Feet" -msgstr[0] "足" +msgstr "左足" + +#: lang/json/bodypart_from_json.py +msgid "Feet" +msgstr "足" #: lang/json/bodypart_from_json.py msgid "right foot" @@ -70789,13 +71273,11 @@ msgstr "右足" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Foot" -msgid_plural "Feet" -msgstr[0] "足" +msgstr "右足" #: lang/json/bodypart_from_json.py msgid "appendix" -msgid_plural "Appendices" -msgstr[0] "付属" +msgstr "追加部位" #: lang/json/bodypart_from_json.py msgctxt "bodypart_accusative" @@ -70806,6 +71288,10 @@ msgstr "追加部位" msgid "It's inflamed." msgstr "炎症を起こしています。" +#: lang/json/bodypart_from_json.py +msgid "Appendices" +msgstr "追加部位" + #: lang/json/clothing_mod_from_json.py msgid "Pad with leather" msgstr "パッド(革)を付ける" @@ -79459,7 +79945,9 @@ msgid "" msgstr "" "隠し持てるほど小さい拳銃型のクロスボウです。小ささと引きの弱さに見合った非力な武器ですが、小動物を狩るにはうってつけです。放たれたボルトは消滅しなければ再利用が可能です。" -#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py src/item.cpp +#: lang/json/gun_from_json.py lang/json/gun_from_json.py +#: lang/json/gunmod_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gunmod_from_json.py src/item.cpp msgctxt "gun_type_type" msgid "pistol" msgstr "ハンドガン" @@ -79571,6 +80059,17 @@ msgid "" msgstr "" "世界中のごろつきが愛用する簡易兵器です。スプレー缶にダクトテープでライターを取り付けただけでも十分危なっかしいオモチャになりますが、小さなガソリンタンクと噴霧ノズル、簡単な加圧ポンプまで付いています。加圧に数分の時間がかかります。" +#: lang/json/gun_from_json.py +msgid "simple flamethrower" +msgid_plural "simple flamethrowers" +msgstr[0] "火炎放射器(自作)" + +#: lang/json/gun_from_json.py +msgid "" +"A simple, home-made flamethrower. While its capacity is not superb, it is " +"more than capable of igniting terrain and monsters alike." +msgstr "シンプルな自作の火炎放射器です。その性能は素晴らしいとまでは言えないが、地形や怪物に火をつけるには十分な性能です。" + #: lang/json/gun_from_json.py msgid "BB gun" msgid_plural "BB guns" @@ -80135,6 +80634,19 @@ msgstr "" "最も典型的な「サタデーナイトスペシャル」の1つであるジェニングスJ-" "22は、射出成形で加工された亜鉛製のスライドとフレームをもつ、非常に手頃な価格の銃です。輸入禁止となった小型のポケットピストルの後釜を狙って作られましたが、明らかな安全性の欠如を気にしない犯罪者に広く普及しました。" +#: lang/json/gun_from_json.py +msgid "Walther P22" +msgid_plural "Walther P22s" +msgstr[0] "ハンドガン(.22口径/ワルサーP22)" + +#: lang/json/gun_from_json.py +msgid "" +"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" +msgstr "" +"ワルサーP22はブローバック式のセミオートピストルです。一般的なワルサー製銃器の半分ほどのサイズです。部品はほとんどプラスチック製で、スライドと重要な部品のみ亜鉛合金を圧力鋳造して作られています。" + #: lang/json/gun_from_json.py msgid "Remington ACR" msgid_plural "Remington ACRs" @@ -80993,6 +81505,21 @@ msgid "" msgstr "" "現代で最も売れているポケットピストルの一つであるLCPは、.380口径ACP弾を利用する、手頃な価格のポリマー製ピストルです。威力は比較的低く、更には軽量で照準長も短いため操作性に難があります。" +#: lang/json/gun_from_json.py +msgid "Hi-Point CF-380" +msgid_plural "Hi-Point CF-380s" +msgstr[0] "ハンドガン(.380口径/ハイポイントCF-380)" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" +"Hi-Point " +"Firearms社が開発したブローバック式セミオートピストルです。この企業は安価な小火器を製造することと、製造した銃器が嵩張り扱い辛いことで有名です。鋼鉄製に比べて壊れやすい鋳造亜鉛スライドが使われています。" + #: lang/json/gun_from_json.py msgid "M1911A1" msgid_plural "M1911A1s" @@ -81073,6 +81600,48 @@ msgid "" "10mm rounds, or for S&W's own .40 round." msgstr "S&W社製のクラシックな6連発リボルバーです。弾薬は10mmオート弾、または自社製の.40S&W弾を使用します。" +#: lang/json/gun_from_json.py +msgid "Browning Hi-Power .40 S&W" +msgid_plural "Browning Hi-Power .40 S&Ws" +msgstr[0] "ハンドガン(.40口径/ブローニングハイパワーS&W)" + +#: lang/json/gun_from_json.py +msgid "" +"The Browning Hi-Power is a semi-automatic handgun developed shortly before " +"the second world war. Widely issued since then, it remains in use by India, " +"Canada and Australia. This is a commercial variant produced by Browning Arms" +" in .40 S&W." +msgstr "" +"ブローニングハイパワーは第二次世界大戦直前に開発されたセミオートピストルです。それ以来多数が流通し、インドやカナダ、オーストラリアで使われ続けています。これはブローニング・アームズ社が製造した民生品で、.40口径S&W弾を装填します。" + +#: lang/json/gun_from_json.py +msgid "Walther PPQ .40 S&W" +msgid_plural "Walther PPQ .40 S&Ws" +msgstr[0] "ハンドガン(.40口径/ワルサーPPQ S&W)" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in .40 S&W." +msgstr "" +"ワルサーPPQはワルサーPPQAの後継となるセミオートピストルで、先代の付属品との互換性を一部維持しています。このモデルは.40口径S&W弾を装填します。" + +#: lang/json/gun_from_json.py +msgid "Hi-Point Model JCP" +msgid_plural "Hi-Point Model JCPs" +msgstr[0] "ハンドガン(.40口径/ハイポイントJCP)" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" +"Hi-Point " +"Firearms社が開発したブローバック式セミオートピストルです。この企業は安価な小火器を製造することと、製造した銃器が嵩張り扱い辛いことで有名です。鋼鉄製に比べて壊れやすい鋳造亜鉛スライドが使われています。" + #: lang/json/gun_from_json.py msgid "tube 40mm launcher" msgid_plural "tube 40mm launchers" @@ -81365,6 +81934,34 @@ msgid "USP .45" msgid_plural "USP .45s" msgstr[0] "ハンドガン(.45口径/USP)" +#: lang/json/gun_from_json.py +msgid "Walther PPQ .45 ACP" +msgid_plural "Walther PPQ .45 ACPs" +msgstr[0] "ハンドガン(.45口径/ワルサーPPQ ACP)" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in .45 ACP." +msgstr "" +"ワルサーPPQはワルサーPPQAの後継となるセミオートピストルで、先代の付属品との互換性を一部維持しています。このモデルは.45口径弾ACP弾を装填します。" + +#: lang/json/gun_from_json.py +msgid "Hi-Point Model JHP" +msgid_plural "Hi-Point Model JHPs" +msgstr[0] "ハンドガン(.40口径/ハイポイントJHP)" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" +"Hi-Point " +"Firearms社が開発したブローバック式セミオートピストルです。この企業は安価な小火器を製造することと、製造した銃器が嵩張り扱い辛いことで有名です。鋼鉄製に比べて壊れやすい鋳造亜鉛スライドが使われています。" + #: lang/json/gun_from_json.py msgid "Taurus Raging Bull" msgid_plural "Taurus Raging Bull" @@ -82079,12 +82676,12 @@ msgstr "9x19mm拳銃というジャンルを代表する大傑作のひとつで #: lang/json/gun_from_json.py msgid "pipe rifle: 9x19mm" msgid_plural "pipe rifles: 9x19mm" -msgstr[0] "ライフル(9x19mm/パイプ銃)" +msgstr[0] "ライフル(9mm/パイプ銃)" #: lang/json/gun_from_json.py msgid "Luty SMG: 9x19mm" msgid_plural "Luty SMGs: 9x19mm" -msgstr[0] "サブマシンガン(9x19mm/DIY)" +msgstr[0] "サブマシンガン(9mm/DIY)" #: lang/json/gun_from_json.py msgid "" @@ -82198,6 +82795,96 @@ msgid "" "SIG Sauer P320." msgstr "SIG P320から派生した、反動の小さいセミオートピストルです。" +#: lang/json/gun_from_json.py +msgid "Browning Hi-Power 9x19mm" +msgid_plural "Browning Hi-Power 9x19mms" +msgstr[0] "ハンドガン(9mm/ブローニングハイパワー)" + +#: lang/json/gun_from_json.py +msgid "" +"The Browning Hi-Power is a semi-automatic handgun developed shortly before " +"the second world war. Widely issued since then, it remains in use by India, " +"Canada and Australia. This is a commercial variant produced by Browning Arms" +" in 9x19mm Parabellum." +msgstr "" +"ブローニングハイパワーは第二次世界大戦直前に開発されたセミオートピストルです。それ以来多数が流通し、インドやカナダ、オーストラリアで使われ続けています。これはブローニング・アームズ社が製造した民生品で、9x19mmパラベラム弾を装填します。" + +#: lang/json/gun_from_json.py +msgid "Walther P38" +msgid_plural "Walther P38s" +msgstr[0] "ハンドガン(9mm/ワルサーP38)" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" +"ワルサーP38は第二次世界大戦直前に開発されたセミオートピストルです。前身であるルガーP08の製造コストが高かったため、P38も9mmパラベラム弾を使っています。後々より近代的な銃器で登場するDA/SA銃身後座式の機構を取り入れた先駆けであり、2004年までドイツで流通していました。" + +#: lang/json/gun_from_json.py +msgid "Walther PPQ 9mm" +msgid_plural "Walther PPQ 9mms" +msgstr[0] "ハンドガン(9mm/ワルサーPPQ)" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in 9x19mm Parabellum." +msgstr "" +"ワルサーPPQはワルサーPPQAの後継となるセミオートピストルで、先代の付属品との互換性を一部維持しています。このモデルは9x19mmパラベラム弾を装填します。" + +#: lang/json/gun_from_json.py +msgid "Hi-Point C-9" +msgid_plural "Hi-Point C-9s" +msgstr[0] "ハンドガン(9mm/ハイポイントC-9)" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" +"Hi-Point " +"Firearms社が開発したブローバック式セミオートピストルです。この企業は安価な小火器を製造することと、製造した銃器が嵩張り扱い辛いことで有名です。鋼鉄製に比べて壊れやすい鋳造亜鉛スライドが使われています。" + +#: lang/json/gun_from_json.py +msgid "CZ-75" +msgid_plural "CZ-75s" +msgstr[0] "ハンドガン(9mm/CZ-75)" + +#: lang/json/gun_from_json.py +msgid "" +"The CZ-75 is a semi-automatic pistol developed in Czechoslovakia, and is one" +" of the original wonder nines. Though designed for export to western " +"countries, it was declared a state secret; lack of international patent " +"protection meant that many clones and variants were produced and distributed" +" around the world, with Česká zbrojovka only joining in the 90's. This " +"pistol remains wildly popular among competition shooters." +msgstr "" +"チェコスロバキアで開発されたセミオートピストルであり、ワンダーナインと呼ばれていた銃の一つです。西側諸国への輸出品として開発されましたが、設計は国家機密でした。しかしチェコスロバキアは90年代まで国際特許の枠組みに参加していなかったため、様々な模造品や改造品が世界中で開発され流通しました。射撃競技選手に大人気の銃です。" + +#: lang/json/gun_from_json.py +msgid "Walther CCP" +msgid_plural "Walther CCPs" +msgstr[0] "ハンドガン(9mm/ワルサーCCP)" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" +"銃器を隠して携帯したい人向けに販売される、ガス遅延式ブローバック方式のセミオートピストルです。内部構造はカルト的人気を誇ったH&K " +"P7とほぼ同じです。銃身が安定するデザインのため大抵のハンドガンより精度は高くなる傾向にありますが、標準のトリガーと短い射程距離では実感し辛いかもしれません。" + #: lang/json/gun_from_json.py msgid "Makarov PM" msgid_plural "Makarov PMs" @@ -82282,17 +82969,6 @@ msgid "" "deadly." msgstr "相当量のガスが圧縮されたボンベを持つ大型の火炎放射器です。非常に威嚇的かつ致命的な武器です。" -#: lang/json/gun_from_json.py -msgid "simple flamethrower" -msgid_plural "simple flamethrowers" -msgstr[0] "火炎放射器(自作)" - -#: lang/json/gun_from_json.py -msgid "" -"A simple, home-made flamethrower. While its capacity is not superb, it is " -"more than capable of igniting terrain and monsters alike." -msgstr "シンプルな自作の火炎放射器です。その性能は素晴らしいとまでは言えないが、地形や怪物に火をつけるには十分な性能です。" - #: lang/json/gun_from_json.py msgid "RM451 flamethrower" msgid_plural "RM451 flamethrowers" @@ -82389,6 +83065,15 @@ msgid "" msgstr "" "廃材から自作した、単射/電磁加速式のレール投射装置です。超高速で射出される金属杭の纏う火は、電磁誘導で発生したローレンツ力により、燃焼点まで加速されて生じたものです。UPSで動作します。" +#: lang/json/gun_from_json.py +msgid "barb launching organ" +msgid_plural "barb launching organs" +msgstr[0] "棘射出器官" + +#: lang/json/gun_from_json.py +msgid "A mutated organ capable of launching bony barbs at great speed." +msgstr "細い棘を高速で射出する、変異した器官です。" + #: lang/json/gun_from_json.py msgid "coilgun" msgid_plural "coilguns" @@ -82938,6 +83623,19 @@ msgid "" msgstr "" "強力なイオンエネルギー発生装置が胸に埋め込まれています。強力で大規模なエネルギーの爆風を発射します。生じた爆風は酸素と反応し、発火と爆発を引き起こします。" +#: lang/json/gun_from_json.py +msgid "Yeet Cannon" +msgid_plural "Yeet Cannons" +msgstr[0] "ハンドガン(9mm/YEET砲)" + +#: lang/json/gun_from_json.py +msgid "" +"You can YEET all the bullets with this baby. YEET them right into all of the" +" zombies in your path, all the hulks, the spiders, and those damned mole " +"rats." +msgstr "" +"このちびっ子を使って全弾をYEETしましょう。道中の全てのゾンビ、全ての巨体ゾンビ、クモ、クソハダカデバネズミをどんどんYEETしましょう。" + #: lang/json/gun_from_json.py msgid "SVS-24" msgid_plural "SVS-24" @@ -84451,26 +85149,6 @@ msgid "" msgstr "" ".454カスール弾を使用する5連発リボルバーです。その名に恥じない絶大な制止力を発揮します。ショットガン用.410口径弾と.45口径ロングコルト弾を装填できます。" -#: lang/json/gunmod_from_json.py -msgid ".300 AAC Blackout caliber conversion kit" -msgid_plural ".300 AAC Blackout caliber conversion kits" -msgstr[0] "変換キット(.300口径AACブラックアウト)" - -#: lang/json/gunmod_from_json.py -msgid "" -"This kit is used to convert an AR-15 .223/5.56mm rifle to the new .300BLK " -"caliber." -msgstr ".223口径/5.56mmのAR-15ライフルを.300ブラックアウト弾用に変換する部品一式です。" - -#: lang/json/gunmod_from_json.py -msgid "bore" -msgstr "口径" - -#: lang/json/gunmod_from_json.py -msgctxt "gun_type_type" -msgid "ar15" -msgstr "AR-15" - #: lang/json/gunmod_from_json.py msgid "barrel extension" msgid_plural "barrel extensions" @@ -84549,6 +85227,10 @@ msgid "" msgstr "" "9x19mm、.38口径、.40口径、5.7mm、4.6mm、7.62x39mm、.223口径の銃を.22口径弾対応に変換する部品です。変換するとわずかに精度が下がります。" +#: lang/json/gunmod_from_json.py +msgid "bore" +msgstr "口径" + #: lang/json/gunmod_from_json.py msgid ".223 caliber conversion kit" msgid_plural ".223 caliber conversion kits" @@ -84850,6 +85532,35 @@ msgid "" " don't have to pick them up." msgstr "銃に取り付けるポーチです。排出された薬莢を回収できる為、拾う手間が省けます。" +#: lang/json/gunmod_from_json.py +msgid ".300 AAC Blackout AR-15 conversion kit" +msgid_plural ".300 AAC Blackout AR-15 conversion kits" +msgstr[0] "変換キット(.300口径BLK/AR-15)" + +#: lang/json/gunmod_from_json.py +msgid "A complete AR-15 upper assembly with a .300 AAC Blackout barrel." +msgstr ".300AACブラックアウト弾用の銃身を備えたAR-15系ライフル用アッパーレシーバーです。" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "ar15" +msgstr "AR-15" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "m4a1" +msgstr "m4a1" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "h&k416a5" +msgstr "h&k416a5" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "m27iar" +msgstr "m27iar" + #: lang/json/gunmod_from_json.py msgid "lightweight replacement furniture" msgid_plural "lightweight replacement furnitures" @@ -86903,17 +87614,16 @@ msgstr "" #: lang/json/help_from_json.py msgid "" -"While magazines are often firearm-specific, on some occasions a magazine is compatible with several other firearms. The firearms in the game often reflect real-world prototypes in terms of caliber and compatibility. Below are some examples of interchangeable ammo:\n" -".308 = 7.62x51mm,\n" -".223 = 5.56 NATO,\n" -".270 = .30-06,\n" -".40 S&W = 10mm." +"While magazines and clips are often firearm-specific, on some occasions a magazine/speedloader is compatible with several other firearms or calibers. Below are some examples of calibers that might share magazines or speedloaders:\n" +".380 ACP and 9mm Luger,\n" +" .40 S&W and 10mm Auto 3\n" +".45 ACP and .460 Rowland,\n" +".45 Colt and .454 Casull." msgstr "" -"通常、銃器には固有の弾倉がありますが、様々な銃器と互換性を持つ弾倉も存在します。ゲーム中では、現実世界の銃器に基づいた口径と互換性が設定されています。以下は互換性のある弾薬の例です。\n" -".308口径 = 7.62x51mm\n" -".223口径 = 5.56mm/NATO\n" -".270口径 = .30-06口径\n" -".40口径/S&W = 10mm" +"弾倉やクリップ大抵各銃器に固有のものですが、場合によっては複数の銃器や口径と互換性があります。以下は、共通の弾倉やスピードローダーを装填できる可能性のある口径の例です。\n" +".380口径ACP弾と9mmパラベラム弾\n" +".40口径S&W弾と10mmオート弾\n" +".45口径コルト弾と.454口径カスール弾" #: lang/json/help_from_json.py msgid "Magazine descriptions also list the compatible ammo." @@ -86926,7 +87636,7 @@ msgid "" " for example load 9x19mm JHP and 9x19mm FMJ ammo into the same magazine, " "since a magazine always requires identical rounds to be loaded in it." msgstr "" -"特定の口径の銃器や弾倉には、装填できる弾薬が複数種類ありますが、これらの種類を1つの弾倉に混ぜて装填することはできません。弾倉には単一種類の弾薬が装填されている必要があるため、例えば弾薬(9x19mm/JHP)と弾薬(9x19mm/FMJ)を同じ弾倉に混ぜて装填するのは不可能です。" +"特定の口径の銃器や弾倉には、装填できる弾薬が複数種類ありますが、これらの種類を1つの弾倉に混ぜて装填することはできません。弾倉には単一種類の弾薬が装填されている必要があるため、例えば弾薬(9mm/JHP)と弾薬(9mm/FMJ)を同じ弾倉に混ぜて装填するのは不可能です。" #: lang/json/help_from_json.py msgid "" @@ -88091,8 +88801,9 @@ msgid "Measure radiation" msgstr "放射線を測定する" #: lang/json/item_action_from_json.py lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py #: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py -#: lang/json/talk_topic_from_json.py src/game_inventory.cpp +#: src/game_inventory.cpp msgid "..." msgstr "..." @@ -88154,12 +88865,16 @@ msgid "Well, you know" msgstr "お察しください" #: lang/json/item_action_from_json.py -msgid "Wash clothes" +msgid "Wash soft items" msgstr "洗濯する" #: lang/json/item_action_from_json.py -msgid "Wash CBMs" -msgstr "CBMを洗浄する" +msgid "Wash hard items" +msgstr "洗浄する" + +#: lang/json/item_action_from_json.py +msgid "Wash items" +msgstr "洗濯/洗浄する" #: lang/json/item_action_from_json.py msgid "Purify some water" @@ -88261,7 +88976,7 @@ msgstr "このアイテムは着用物の最も外側に位置する層を抽象 #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This is in your outer aura." -msgstr "これはオーラ(上着)です。" +msgstr "これはオーラ(内)です。" #: lang/json/json_flag_from_json.py msgid "" @@ -88561,7 +89276,7 @@ msgstr "このアイテムは着用物の最も内側に位置する層を抽象 #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This is in your personal aura." -msgstr "これはオーラ(下着)です。" +msgstr "これはオーラ(内)です。" #: lang/json/json_flag_from_json.py msgid "" @@ -91661,6 +92376,41 @@ msgstr "蓄電池が揃ってます!セール中!" msgid "the name is gone but a slogan remains: 'We'll repair you all the way'" msgstr "店名は判別できませんが、キャッチコピーだけが残っています。「なんでも直します」" +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "EnviroCom OS v2.03 - Basement Access" +msgstr "EnviroCom OS v2.03 - 地下入室管理" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Unlock stairs" +msgstr "階段を開錠" + +#. ~ Sign +#: lang/json/mapgen_from_json.py +msgid "Authorized personnel only" +msgstr "関係者以外立入禁止" + +#. ~ Sign +#: lang/json/mapgen_from_json.py +msgid " sewage treatment plant" +msgstr "下水処理場" + +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "EnviroCom OS v2.03" +msgstr "EnviroCom OS v2.03" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Download Sewer Maps" +msgstr "下水マップをダウンロード" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Divert sample" +msgstr "サンプルを転送" + #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Evac shelter computer" @@ -92324,6 +93074,50 @@ msgstr "" "\n" "ブロック発動時に器用x50%%のダメージを軽減" +#. ~ Description for martial art 'Fior Di Battaglia' +#: lang/json/martial_art_from_json.py +msgid "" +"Medieval Europe's martial techniques for fighting with polearms. The " +"\"Flower of Battle\" places great focus on countering one's opponent and " +"knocking them down before landing a killing blow" +msgstr "長柄武器での戦闘を中心とする中世ヨーロッパの武術です。敵を迎え打ち、打ち倒してから必殺の一撃を加える戦法を特に重視しています。" + +#: lang/json/martial_art_from_json.py +msgid "Stand Your Ground" +msgstr "固守" + +#. ~ Description of buff 'Stand Your Ground' for martial art 'Fior Di +#. Battaglia' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You stalwart and will not budge against any threat.\n" +"\n" +"+2 Block attempts, -1.0 Dodge skill, blocked damage reduced by 50%% of Strength." +msgstr "" +"しっかりと地を踏みしめ、どんな脅威に対しても動揺しません。\n" +"\n" +"ブロック+2、回避スキル-1.0、ブロック発動時に筋力x50%%のダメージを軽減" + +#: lang/json/martial_art_from_json.py +msgid "Tactical Retreat" +msgstr "戦術的撤退" + +#. ~ Description of buff 'Tactical Retreat' for martial art 'Fior Di +#. Battaglia' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You moved and nullified the effects of Stand Your Ground!\n" +"\n" +"-2 Block attempts, +1.0 Dodge skill, blocked damaged increased by 50%% of Strength.\n" +"Lasts 1 turn." +msgstr "" +"移動して「固守」を無効化しました!\n" +"\n" +"ブロック-2、回避スキル+1.0、ブロック発動時に筋力x50%%のダメージ増加\n" +"1ターン継続" + #: lang/json/martial_art_from_json.py msgid "Karate" msgstr "空手" @@ -92767,35 +93561,6 @@ msgstr "黐手" msgid "Perception increases dodging ability, +1 dodges per turn" msgstr "感覚依存で回避率上昇。1ターンごとに回避+1" -#. ~ Description for martial art 'Fior Di Battaglia' -#: lang/json/martial_art_from_json.py -msgid "" -"Medieval Europe's martial techniques for fighting with polearms, great focus" -" is given in countering one's opponent and knocking them down before landing" -" a killing blow" -msgstr "長柄武器での戦闘を中心とする中世ヨーロッパの武術です。敵を迎え打ち、打ち倒してから必殺の一撃を加える戦法を特に重視しています。" - -#: lang/json/martial_art_from_json.py -msgid "Stand Your Ground" -msgstr "固守" - -#. ~ Description of buff 'Stand Your Ground' for martial art 'Fior Di -#. Battaglia' -#: lang/json/martial_art_from_json.py -msgid "" -"+2 blocks -1 dodge, halves your dodge and damage is reduced by your strength" -" when blocking" -msgstr "ブロック+2、回避-1、ブロック発動時に回避半減かつ筋力依存でダメージ軽減" - -#: lang/json/martial_art_from_json.py -msgid "You moved" -msgstr "反転攻勢" - -#. ~ Description of buff 'You moved' for martial art 'Fior Di Battaglia' -#: lang/json/martial_art_from_json.py -msgid "Nullifies Stand Your Ground, don't move, stand there and counter!" -msgstr "「固守」を無効化し、その場で待ち構えてカウンター攻撃を繰り出します!" - #: lang/json/martial_art_from_json.py msgid "Medieval Swordsmanship" msgstr "中世剣術" @@ -94652,40 +95417,6 @@ msgstr "子犬を連れてきてくれて、本当にありがとう!" msgid "Oh no! My poor puppy..." msgstr "ああ!可哀想な子犬...。" -#: lang/json/mission_def_from_json.py -msgid "Find 100 Cigarettes" -msgstr "100個の煙草を探す" - -#: lang/json/mission_def_from_json.py -msgid "Come on man, I just need a smoke." -msgstr "なあちょっと、煙草が欲しいんだ。" - -#: lang/json/mission_def_from_json.py -msgid "" -"With all that's been going on, it's been more and more difficult to find a " -"smoke. My stash has been running low for a while now. Think you could help" -" me out here? A few packs is all I need." -msgstr "" -"こんな状況じゃ、煙草を探すのも大変だ。私の持っている分もだいぶ少なくなってきた。ちょっと助けてもらえないかな?煙草をいくつか持ってきてくれるだけでいいんだ。" - -#: lang/json/mission_def_from_json.py -msgid "Thanks, it's great to see someone willing to help a guy out." -msgstr "ありがとう、助けてくれる人がいて本当によかった。" - -#: lang/json/mission_def_from_json.py -msgid "" -"Plenty of smokers in towns. Gotta be some left over cigs in some of them " -"houses." -msgstr "喫煙者は市街地にたくさんいる。家に煙草を置いたままの人もいるかもしれない。" - -#: lang/json/mission_def_from_json.py -msgid "Got the smokes?" -msgstr "煙草は手に入った?" - -#: lang/json/mission_def_from_json.py -msgid "Thanks! I'll be sure to put in a good word for you around the center." -msgstr "ありがとう!センターの連中にこの功績をふれ回っておくよ。" - #: lang/json/mission_def_from_json.py msgid "Break into armory to retrieve family photo" msgstr "武器庫内にある家族の写真を入手する" @@ -95985,8 +96716,8 @@ msgid "" msgstr "本当に?*ハサミ*すら見つけられないのか?出かける時に靴ひもを結ぶことすらできないんじゃないか?" #: lang/json/mission_def_from_json.py -msgid "Find 50 3L jars" -msgstr "50個のガラス瓶(3L)を見つける" +msgid "In a Pickle Pt. 2" +msgstr "瓶詰め(2)" #: lang/json/mission_def_from_json.py msgid "I do have some work for you." @@ -96016,6 +96747,40 @@ msgid "" "payment." msgstr "わぁ、思っていたよりも随分たくさん瓶があるな。ありがとう。報酬をどうぞ。" +#: lang/json/mission_def_from_json.py +msgid "Smokes, let's go." +msgstr "一服いかが" + +#: lang/json/mission_def_from_json.py +msgid "Come on man, I just need a smoke." +msgstr "なあちょっと、煙草が欲しいんだ。" + +#: lang/json/mission_def_from_json.py +msgid "" +"With all that's been going on, it's been more and more difficult to find a " +"smoke. My stash has been running low for a while now. Think you could help" +" me out here? A few packs is all I need." +msgstr "" +"こんな状況じゃ、煙草を探すのも大変だ。私の持っている分もだいぶ少なくなってきた。ちょっと助けてもらえないかな?煙草をいくつか持ってきてくれるだけでいいんだ。" + +#: lang/json/mission_def_from_json.py +msgid "Thanks, it's great to see someone willing to help a guy out." +msgstr "ありがとう、助けてくれる人がいて本当によかった。" + +#: lang/json/mission_def_from_json.py +msgid "" +"Plenty of smokers in towns. Gotta be some left over cigs in some of them " +"houses." +msgstr "喫煙者は市街地にたくさんいる。家に煙草を置いたままの人もいるかもしれない。" + +#: lang/json/mission_def_from_json.py +msgid "Got the smokes?" +msgstr "煙草は手に入った?" + +#: lang/json/mission_def_from_json.py +msgid "Thanks! I'll be sure to put in a good word for you around the center." +msgstr "ありがとう!センターの連中にこの功績をふれ回っておくよ。" + #: lang/json/mission_def_from_json.py msgid "Clear Back Bay" msgstr "建物裏手の掃除" @@ -96129,8 +96894,8 @@ msgid "" msgstr "これで他の連中も農場への投資に納得するだろう。助かったよ。これが報酬だ。" #: lang/json/mission_def_from_json.py -msgid "Find 10 solar panels" -msgstr "10個のソーラーパネルを持ってくる" +msgid "Solar Power" +msgstr "太陽の力" #: lang/json/mission_def_from_json.py msgid "" @@ -96158,8 +96923,8 @@ msgid "" msgstr "素晴らしい、十分な礼はできないが、また持ってきてくれるとすごく助かるよ。" #: lang/json/mission_def_from_json.py -msgid "Find 100 canning jars" -msgstr "100個のガラス瓶(500ml)を探す" +msgid "In a Pickle" +msgstr "瓶詰め" #: lang/json/mission_def_from_json.py msgid "" @@ -96414,8 +97179,8 @@ msgid "Thank you, I'll do the explaining if anyone else asks about it." msgstr "ありがとう、君のやったことについて誰かに聞かれたら、こちらでちゃんと説明しておく。" #: lang/json/mission_def_from_json.py -msgid "Kill ???" -msgstr "???を殺す" +msgid "Secure Trade Route" +msgstr "交易ルートの護衛" #: lang/json/mission_def_from_json.py msgid "" @@ -96441,8 +97206,8 @@ msgid "Great work, wasn't sure what I was sending you after." msgstr "素晴らしい、正直、君を送り出してから気が気でなかったよ。" #: lang/json/mission_def_from_json.py -msgid "Kill Raider Leader" -msgstr "レイダーのボスを殺す" +msgid "Assassinate Raider Leader" +msgstr "レイダーのボスを暗殺する" #: lang/json/mission_def_from_json.py msgid "" @@ -96563,9 +97328,9 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" -"Remember, do extraction /exactly/ as specified, otherwise the bionic will " -"self-destruct." -msgstr "忘れないで、抽出は指示通り「正確に」やってくれ。そうしないとCBMが自己破壊してしまう。" +"Remember, perform the extraction /exactly/ as specified, otherwise the " +"bionic will self-destruct." +msgstr "忘れないで、摘出は指示通り「正確に」やってくれ。そうしないとCBMが自己破壊してしまう。" #: lang/json/mission_def_from_json.py msgid "" @@ -96589,6 +97354,40 @@ msgstr "見つかったか?" msgid "You have our thanks and payment." msgstr "感謝の気持ちとお礼を送るよ。" +#: lang/json/mission_def_from_json.py +msgid "Light retrieval" +msgstr "光の復活" + +#: lang/json/mission_def_from_json.py +msgid "" +"Our facility once sourced advanced photonic circuitry from a nearby robotics manufacturer. Their building suffered major damage during the portal storms, and collapsed almost entirely. However, preliminary scouting reveals that the basement prototyping lab likely remains intact.\n" +"\n" +"the intercom: We ask you to investigate the ruins, and if possible, retrieve a template for the fabrication of said photonic circuitry." +msgstr "" +"この施設はかつて、付近のロボット製造業者から最新のフォトニック回路を調達していたんだ。その建物はポータルの大暴走中に甚大な被害を受け、ほぼ完全に崩壊してしまった。だが事前調査によって、地下の試作研究室がそのまま残っている可能性が高いことが分かったんだ。\n" +"\n" +"通信装置: 廃墟を調査し、可能であればフォトニック回路を製作するためのテンプレートを取ってきてくれ。" + +#: lang/json/mission_def_from_json.py +msgid "We expect your success, mercenary." +msgstr "成功を祈ってるよ、傭兵さん。" + +#: lang/json/mission_def_from_json.py +msgid "Return if you change your mind." +msgstr "気が変わったら戻ってきてくれ。" + +#: lang/json/mission_def_from_json.py +msgid "" +"The scout drone also revealed extensive heat signatures and high " +"concentrations of toxic compounds within the ruins, plan accordingly. We " +"are willing to sell you some protective gear at a discount, if you require " +"it." +msgstr "偵察ドローンは、廃墟内に広範囲の熱源反応と高濃度の有毒化合物を確認した。もし必要なら、防護装備を割引価格で売ってやるよ。" + +#: lang/json/mission_def_from_json.py +msgid "Have you retrieved the blueprints?" +msgstr "テンプレートを取ってきたか?" + #: lang/json/mission_def_from_json.py msgid "Make 2 Stills" msgstr "2個の蒸留器を作る" @@ -100415,7 +101214,7 @@ msgstr "体内の化学物質のバランスが少しおかしくなっていま #: lang/json/mutation_from_json.py msgid "Animal Discord" -msgstr "動物敵対オーラ" +msgstr "動物敵対" #. ~ Description for Animal Discord #: lang/json/mutation_from_json.py @@ -107263,6 +108062,10 @@ msgstr "製糖所" msgid "sugar house roof" msgstr "製糖所(屋上)" +#: lang/json/overmap_terrain_from_json.py +msgid "rural road" +msgstr "郊外道路" + #: lang/json/overmap_terrain_from_json.py msgid "farm field" msgstr "農地" @@ -109087,8 +109890,16 @@ msgid "parking garage" msgstr "立体駐車場" #: lang/json/overmap_terrain_from_json.py -msgid "sewage treatment" -msgstr "下水処理施設" +msgid "sewage treatment plant" +msgstr "下水処理場" + +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment plant roof" +msgstr "下水処理場(屋上)" + +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment plant - underground" +msgstr "下水処理場(地下)" #: lang/json/overmap_terrain_from_json.py msgid "toxic waste dump" @@ -109395,6 +110206,10 @@ msgstr "公共図書館(2階)" msgid "mechanics garage" msgstr "修理工場" +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment" +msgstr "下水処理施設" + #: lang/json/overmap_terrain_from_json.py msgid "mechanic garage" msgstr "修理工場" @@ -110283,6 +111098,36 @@ msgid "" msgstr "" "何が起こったか全く理解していません。頭にあるのは「ああ、次にキメるクスリを早く探さないと」という事だけです。アンフェタミン依存症を患っています。" +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Pillhead" +msgstr "アヘン中毒者" + +#. ~ Profession (male Pillhead) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"After an accident in your youth, you got addicted to the opiates treating " +"your pain. With the pharmacies shut down and dealers turned undead, " +"satisfying your fix just got a lot more difficult." +msgstr "" +"若い頃のちょっとした事がきっかけで、鎮痛用のアヘンにハマりました。薬局は閉鎖され、売人もゾンビになってしまったので、この苦しみを鎮めることは更に難しくなりました。" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Pillhead" +msgstr "アヘン中毒者" + +#. ~ Profession (female Pillhead) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"After an accident in your youth, you got addicted to the opiates treating " +"your pain. With the pharmacies shut down and dealers turned undead, " +"satisfying your fix just got a lot more difficult." +msgstr "" +"若い頃のちょっとした事がきっかけで、鎮痛用のアヘンにハマりました。薬局は閉鎖され、売人もゾンビになってしまったので、この苦しみを鎮めることは更に難しくなりました。" + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "K9 Officer" @@ -116244,7 +117089,6 @@ msgid "WEAPON" msgstr "武器" #. ~ Crafting recipes subcategory all -#. ~ Crafting recipes subcategory of 'ENCHANTED' category #: lang/json/recipe_category_from_json.py #: lang/json/recipe_category_from_json.py src/crafting_gui.cpp msgid "ALL" @@ -119501,8 +120345,8 @@ msgid "" msgstr "マップを上手に使いましょう。必要なものがありそうな場所を優先して狙いましょう。" #: lang/json/snippet_from_json.py -msgid "Wounds heal over time. Bandages and disinfectant speeds that up." -msgstr "傷は時間経過とともに治癒します。包帯や消毒を使えば治りが早まります。" +msgid "Wounds heal over time. Bandages and antiseptic speeds that up." +msgstr "傷は時間経過とともに治癒します。包帯や消毒薬を使えば治りが早まります。" #: lang/json/snippet_from_json.py msgid "Don't get grabbed by zombies. Their bites can be infectious." @@ -120249,8 +121093,8 @@ msgstr "負傷した時に手当してやれるから、もし包帯が余って #: lang/json/snippet_from_json.py msgid "" -"If you have extra disinfectant, use it to disinfect your wounds, even if " -"they aren't infected. They will recover faster that way." +"If you have extra antiseptic, use it to disinfect your wounds, even if they " +"aren't infected. They will recover faster that way." msgstr "消毒薬が余っているなら、たとえ酷い傷じゃなくても消毒しておくべきだ。治りが早くなるからね。" #: lang/json/snippet_from_json.py @@ -126631,14 +127475,6 @@ msgid "" msgstr "" "『薬物乱用者が増加』直近の統計によると、薬物乱用者の割合が過去2年間で4割もの上昇を見せているとの事です。専門家は語ります。「人は人生や仕事、国際情勢など、ありとあらゆる事柄に対して恐怖を抱きます。ドラッグに手を出してしまうのはそういう時です」" -#: lang/json/snippet_from_json.py -msgid "" -"WAR ON DRUGS DEAD: The government has finally reacted to long accumulated " -"evidence that suggests that decriminalized drugs cause fewer health problems" -" and are generally better managed while providing valuable tax revenues." -msgstr "" -"『薬物との戦いに終止符』政府は健康的な被害が少ないとされるいくつかの薬物の合法化を決定しました。公で管理することで貴重な税収源として活かしたいという考えのようです。" - #: lang/json/snippet_from_json.py msgid "" "FEELING BLUE? Try \"Greens\" for Magazines! Your local Supermarket! " @@ -131441,14 +132277,12 @@ msgid "" "Bionics are augmentation packages, right? They come in these installable Compact Bionic Modules or CBMs, and I can use some CBMs - if you examine a CBM, it will tell you if I can use it.\n" " Find a programmable surgical installer or autodoc, position me on the couch, and activate it, and you can install a suitable CBM to me - or if I think I'll do a better job, I'll do. I'll take over installing CBMs into you if I'm better at it.\n" " I can use almost all passive bionics and some active bionics. If I have any active bionics, I'll try to use them sensibly, but if we're in danger, I'm going to activate anything that might give me an edge. I'll use any weapon bionics if they're better than the weapons you gave me, but if you think I should reserve my bionic energy for my defensive and healing bionics, you can tell me how much to reserve. I'll try to keep my bionic energy topped off, but if we're running low on supplies, you can tell me to stop recharging when I'm not full.\n" -" I'll tell you if I'm low on bionic energy and can't recharge, and what fuel I need.\n" -" Sothere are some internal atomic reactor bionics - I can use those, but I can only recharge them with plutonium slurry. That stuff is radioactive, so do us both a favor and don't give me an internal reactor unless you really like glowing in the dark." +" I'll tell you if I'm low on bionic energy and can't recharge, and what fuel I need." msgstr "" "CBMってのが手術によって移植できる生体部品だってのは、知ってるな?CBMはアイテムとして入手でき、中には私が利用できるものもある。CBMの詳細を調べれば、私が利用可能なものか分かるはずだ。\n" " プログラム可能な外科移植装置かオートドクという装置を見つけたら、私を手術台に乗せて起動すれば適切なCBMを移植できる。得意不得意はあるが、あなたへのCBM移植も引き受けるよ。\n" " 私はほとんど全てのパッシブCBMといくつかのアクティブCBMを利用できる。アクティブCBMを移植されたら賢く使うようにするが、身の危険が迫った時は、優位に立てるCBMを稼働するつもりだ。所持している武器よりも優れたCBMがあれば使うつもりだけど、防御や回復用に電力を取っておくべきなら、どの程度電力を残すか指示できる。CBMの電力は常に充電しようとするが、もし物資が不足しているなら、電力が不足していても充電しないように指示できる。\n" -" CBMの電力が不足して充電できない場合は、何の燃料が必要かを知らせるよ。\n" -" 体内マイクロ反応炉というCBMがある。移植はできるが、充電方法はプルトニウム懸濁液を摂取するしかない。この燃料はもちろん放射性物質だ。暗闇で光る体質を目指していないなら、お互いのためにも体内反応炉は移植しない方がいい。" +" CBMの電力が不足して充電できない場合は、必要な燃料を知らせるよ。" #: lang/json/talk_topic_from_json.py msgid "Tell me how I give you fuel for your bionics." @@ -131650,14 +132484,14 @@ msgstr "起きろ!" msgid "Go back to sleep." msgstr "寝ていいぞ。" -#: lang/json/talk_topic_from_json.py -msgid " *pshhhttt* I'm reading you boss, over." -msgstr "...ザザザザ...ちゃんと聞こえているよ、どうぞ。" - #: lang/json/talk_topic_from_json.py msgid "What is it, friend?" msgstr "何だい、友よ?" +#: lang/json/talk_topic_from_json.py +msgid " *pshhhttt* I'm reading you boss, over." +msgstr "...ザザザザ...ちゃんと聞こえているよ、どうぞ。" + #: lang/json/talk_topic_from_json.py msgid "Combat commands..." msgstr "戦闘指示..." @@ -131893,14 +132727,14 @@ msgstr "その場に留まってくれ。" msgid "Show me what needs to be done at the camp." msgstr "拠点でやるべきことを教えてくれ。" -#: lang/json/talk_topic_from_json.py -msgid "I'm currently ." -msgstr "私は現在、をしている。" - #: lang/json/talk_topic_from_json.py msgid "I'm not doing much currently." msgstr "私は現在は何の行動もしていない。" +#: lang/json/talk_topic_from_json.py +msgid "I'm currently ." +msgstr "私は現在、をしている。" + #: lang/json/talk_topic_from_json.py msgid "Carry on." msgstr "今の行動を続けてくれ。" @@ -131952,32 +132786,32 @@ msgstr "ああ、この暑さに私も参っていたんだ。ちょっと休憩 msgid "OK, maybe it'll stop me from freezing in this weather, what's up?" msgstr "いいよ。話していれば凍えずに済むからな。最近どう?" +#: lang/json/talk_topic_from_json.py +msgid "Man it's dark out isn't it? what's up?" +msgstr "まだ日は落ちていないようだな?調子はどう?" + #: lang/json/talk_topic_from_json.py msgid "" "Well, it's the time of day for a quick break surely! How are you holding " "up?" msgstr "そうだな、そろそろ息抜きの時間だ!最近調子はどう?" -#: lang/json/talk_topic_from_json.py -msgid "Man it's dark out isn't it? what's up?" -msgstr "まだ日は落ちていないようだな?調子はどう?" - #: lang/json/talk_topic_from_json.py msgid "Well, I'm feeling pretty sick... are you doing OK though?" msgstr "その、今はかなり体調が悪いんだけど...それでもやるのか?" -#: lang/json/talk_topic_from_json.py -msgid "" -"Definitely, by the way, thanks for helping me so much with my tasks! " -"Anyway, you coping OK, ? " -msgstr "よし、そうだな、私の依頼をたくさん引き受けてくれてありがとう!それで、の調子はどう?" - #: lang/json/talk_topic_from_json.py msgid "" "OK, let's take a moment, oh, and thanks for helping me with that thing, " "so... what's up?" msgstr "よし、すこし休憩しよう。ああ、そうだ、頼みを聞いてくれてありがとう。それで...調子はどう?" +#: lang/json/talk_topic_from_json.py +msgid "" +"Definitely, by the way, thanks for helping me so much with my tasks! " +"Anyway, you coping OK, ? " +msgstr "よし、そうだな、私の依頼をたくさん引き受けてくれてありがとう!それで、の調子はどう?" + #: lang/json/talk_topic_from_json.py msgid "" "Now, we've got a moment, I was just thinking it's been a month or so " @@ -132049,14 +132883,14 @@ msgstr "よし、急に動いたりはするなよ..." msgid "Keep your distance!" msgstr "近寄るな!" -#: lang/json/talk_topic_from_json.py -msgid "" -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "This is my territory, ." msgstr "ここはうちのシマだ、。" +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Calm down. I'm not going to hurt you." msgstr "落ち着けよ。君を傷付けるつもりはないよ。" @@ -132109,14 +132943,6 @@ msgstr "どうした?" msgid "I don't care." msgstr "どうでもいいね。" -#: lang/json/talk_topic_from_json.py -msgid "I don't have any jobs for you." -msgstr "特に頼みたい事はないね。" - -#: lang/json/talk_topic_from_json.py -msgid "I don't have any more jobs for you." -msgstr "頼みたい事はそれだけだ。" - #: lang/json/talk_topic_from_json.py msgid "I have other jobs for you. Want to hear about them?" msgstr "一つ頼みたい事があるんだ。聞いてくれるか?" @@ -132125,13 +132951,21 @@ msgstr "一つ頼みたい事があるんだ。聞いてくれるか?" msgid "I have more jobs for you. Want to hear about them?" msgstr "他にも頼みたい事があるんだ。聞いてくれるか?" +#: lang/json/talk_topic_from_json.py +msgid "I just have one job for you. Want to hear about it?" +msgstr "1つ頼みたい事があるんだ。聞いてくれるか?" + #: lang/json/talk_topic_from_json.py msgid "I have another job for you. Want to hear about it?" msgstr "一つ頼みたい事があるんだ。聞いてくれるか?" #: lang/json/talk_topic_from_json.py -msgid "I just have one job for you. Want to hear about it?" -msgstr "1つ頼みたい事があるんだ。聞いてくれるか?" +msgid "I don't have any more jobs for you." +msgstr "頼みたい事はそれだけだ。" + +#: lang/json/talk_topic_from_json.py +msgid "I don't have any jobs for you." +msgstr "特に頼みたい事はないね。" #: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py #: src/npctalk.cpp @@ -132143,16 +132977,16 @@ msgid "Never mind, I'm not interested." msgstr "いいや、興味ないね。" #: lang/json/talk_topic_from_json.py -msgid "You're not working on anything for me now." -msgstr "頼んでいる仕事は今のところ何もないよ。" +msgid "What about it?" +msgstr "何だ?" #: lang/json/talk_topic_from_json.py msgid "Which job?" msgstr "どの依頼の話だ?" #: lang/json/talk_topic_from_json.py -msgid "What about it?" -msgstr "何だ?" +msgid "You're not working on anything for me now." +msgstr "頼んでいる仕事は今のところ何もないよ。" #: lang/json/talk_topic_from_json.py msgid "I'll do it!" @@ -137855,8 +138689,8 @@ msgid "All right! Let's get going." msgstr "わかったよ!さあ行こう。" #: lang/json/talk_topic_from_json.py -msgid "We've done it! We've solved the list!" -msgstr "やった!リストが全部埋まった!" +msgid "Have I told you about cardboard, friend? Do you have any?" +msgstr "段ボールの事は話したっけ?君、段ボール持ってる?" #: lang/json/talk_topic_from_json.py msgid "" @@ -137864,8 +138698,8 @@ msgid "" msgstr "調子はどう?私の段ボールコレクションはかなり良い感じだよ。" #: lang/json/talk_topic_from_json.py -msgid "Have I told you about cardboard, friend? Do you have any?" -msgstr "段ボールの事は話したっけ?君、段ボール持ってる?" +msgid "We've done it! We've solved the list!" +msgstr "やった!リストが全部埋まった!" #: lang/json/talk_topic_from_json.py msgid "About that shopping list of yours..." @@ -142298,6 +143132,10 @@ msgstr "何か依頼したいことはあるか?" msgid "What the hell were you testing out there?" msgstr "一体何の実験をしていたんだ?" +#: lang/json/talk_topic_from_json.py +msgid "So, about that protective gear?" +msgstr "その、防護装備っていうのは?" + #: lang/json/talk_topic_from_json.py msgid "No. Now leave." msgstr "嫌だ。さっさと出て行け。" @@ -142314,6 +143152,24 @@ msgid "" msgstr "" "特製のAIを積み込んだレイセオンのシャーシだ。私たちの代わりに外の世界で活動してくれると思ったが、結果は知っての通り...そんな酷い状態だったとは、まったく残念だ..." +#: lang/json/talk_topic_from_json.py +msgid "" +"Given the current context, we are willing to sell you a set of our protective gear: gas mask, suit and gear, at a considerable discount. We will sell it for two of our coins.\n" +"\n" +"the intercom: Hmm wait, we might not have your size..." +msgstr "" +"現状だと、ガスマスク、スーツ、道具をセットで割引価格で売ってやるよ。うちで使ってるコイン2枚でどうだ。\n" +"\n" +"通信装置: おっと待てよ、ピッタリのサイズじゃないかもしれないな..." + +#: lang/json/talk_topic_from_json.py +msgid "[ 2 Hub 01 Gold Coins ] Deal!" +msgstr "[ハブ01金貨] 取引成立だ!" + +#: lang/json/talk_topic_from_json.py +msgid "I have to give it a thought." +msgstr "考える時間が欲しい。" + #: lang/json/talk_topic_from_json.py msgid "Just leave." msgstr "さっさと失せろ。" @@ -143289,12 +144145,12 @@ msgstr "対象の武器装備を外す" #: lang/json/technique_from_json.py #, python-format msgid "You grab %s" -msgstr "%sをつかんで捕らえました。" +msgstr "%sを掴んで捕らえました。" #: lang/json/technique_from_json.py #, python-format msgid " grabs %s" -msgstr "は%sをつかんで捕らえました。" +msgstr "は%sを掴んで捕らえました。" #: lang/json/technique_from_json.py msgid "Spinning Strike" @@ -144042,6 +144898,86 @@ msgstr "%sに完璧なリポストをお見舞いしました。" msgid " delivers a perfect riposte to %s" msgstr "は%sに完璧なリポストをお見舞いしました。" +#: lang/json/technique_from_json.py +msgid "Displace and Hook" +msgstr "回避フック" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You parry and hook %s down" +msgstr "%sを受け流し、得物に引っ掛けて打ち倒しました。" + +#: lang/json/technique_from_json.py +#, python-format +msgid " parries and hooks %s down" +msgstr "は%sを受け流し、得物に引っ掛けて打ち倒しました。" + +#: lang/json/technique_from_json.py +msgid "High Round Strike" +msgstr "大旋回" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You swing high and strike at %s" +msgstr "%s目掛けて得物を大きく振るいました。" + +#: lang/json/technique_from_json.py +#, python-format +msgid " swings high and strikes %s" +msgstr "は%s目掛けて得物を大きく振るいました。" + +#: lang/json/technique_from_json.py +msgid "High Round Feint" +msgstr "大旋回フェイント" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You fake a high round strike at %s" +msgstr "%s目掛けて得物を大きく振るうふりをしました。" + +#: lang/json/technique_from_json.py +#, python-format +msgid " feints at %s" +msgstr "は%sにフェイントを仕掛けました。" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab you, but you push away!" +msgstr "%sが掴みかかろうとしましたが、押し退けました!" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab , but they push away!" +msgstr "%sが掴みかかろうとしましたが、は押し退けました!" + +#: lang/json/technique_from_json.py +msgid "Hook and Drag" +msgstr "引き倒し" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You hook and drag %s down" +msgstr "%sを得物に引っ掛けて打ち倒しました。" + +#: lang/json/technique_from_json.py +#, python-format +msgid " hooks and drags %s down" +msgstr "は%sを得物に引っ掛けて打ち倒しました。" + +#: lang/json/technique_from_json.py +msgid "Colpo di Grazia" +msgstr "慈悲の一撃" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You swing down hard and execute %s" +msgstr "%sに勢いよく得物を振り下ろしました。" + +#: lang/json/technique_from_json.py +#, python-format +msgid " swings down hard and executes %s" +msgstr "は%sに勢いよく得物を振り下ろしました。" + #: lang/json/technique_from_json.py msgid "quick punch" msgstr "正拳突き" @@ -144090,7 +145026,7 @@ msgstr "拘束外し" #: lang/json/technique_from_json.py msgid "counter-grab" -msgstr "掴みカウンター" +msgstr "カウンター拘束" #: lang/json/technique_from_json.py #, python-format @@ -144219,11 +145155,6 @@ msgstr "フェイント" msgid "You feint at %s" msgstr "%sにフェイントを仕掛けました。" -#: lang/json/technique_from_json.py -#, python-format -msgid " feints at %s" -msgstr "は%sにフェイントを仕掛けました。" - #: lang/json/technique_from_json.py #, python-format msgid "You jab %s" @@ -144672,57 +145603,6 @@ msgstr "%sからの攻撃を受け止め、お返しを繰り出しました。" msgid " receives %s's attack, and counters" msgstr "は%sの攻撃を受け止め、カウンターを繰り出しました。" -#: lang/json/technique_from_json.py -msgid "Displace and Hook" -msgstr "回避フック" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You parry %s attack and hook them down" -msgstr "%sの攻撃を受け流し、フックを叩き込みました。" - -#: lang/json/technique_from_json.py -#, python-format -msgid " parries %s attack and hooks them down" -msgstr "は%sの攻撃を受け流し、フックを叩き込みました。" - -#: lang/json/technique_from_json.py -msgid "High Round Strike" -msgstr "大旋回" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You swing high and strike at %s" -msgstr "%s目掛けて得物を大きく振るいました。" - -#: lang/json/technique_from_json.py -#, python-format -msgid " swings high and strikes %s" -msgstr "は%s目掛けて得物を大きく振るいました。" - -#: lang/json/technique_from_json.py -msgid "High Round Feint" -msgstr "大旋回フェイント" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You fake a high round strike at %s" -msgstr "%s目掛けて得物を大きく振るうふりをしました。" - -#: lang/json/technique_from_json.py -msgid "High Round Stab" -msgstr "大旋回刺突" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You quickly stab %s" -msgstr "%sを素早く刺突しました。" - -#: lang/json/technique_from_json.py -#, python-format -msgid " quickly stabs %s" -msgstr "は%sを素早く刺突しました。" - #: lang/json/technique_from_json.py msgid "grab and pommel strike" msgstr "柄頭突き" @@ -146415,6 +147295,16 @@ msgstr "木の板を隙間なく敷き詰めて釘で打ち付けた床です。 msgid "SMASH!" msgstr "ガシャン!" +#: lang/json/terrain_from_json.py +msgid "metal floor" +msgstr "床(金属)" + +#. ~ Description for metal floor +#: lang/json/terrain_from_json.py +msgid "" +"High-quality and tough checkered flooring to reduce risk of slips and falls." +msgstr "頑丈で高品質な床材を使って転倒のリスクを軽減した格子模様の床です。" + #: lang/json/terrain_from_json.py msgid "linoleum tile" msgstr "リノリウムタイル" @@ -146514,10 +147404,6 @@ msgid "" "smoothed and the roof isn't quite filled in yet." msgstr "鉄筋の間にコンクリートを注いだだけの未完成の状態です。表面は滑らかになっておらず、屋根も塞がれていない部分が残っています。" -#: lang/json/terrain_from_json.py -msgid "metal floor" -msgstr "床(金属)" - #. ~ Description for metal floor #: lang/json/terrain_from_json.py msgid "" @@ -151848,6 +152734,16 @@ msgstr "衝角(キチン)" msgid "biosilicfied chitin ram" msgstr "衝角(シリコンキチン)" +#: lang/json/vehicle_part_from_json.py +msgid "tied mattress" +msgstr "車載マットレス" + +#. ~ Description for tied mattress +#: lang/json/vehicle_part_from_json.py +msgid "" +"A mattress, strapped onto the vehicle. It could serve to blunt any impact." +msgstr "車両に結び付けたマットレスです。衝突の衝撃を和らげます。" + #. ~ Description for shredder #: lang/json/vehicle_part_from_json.py msgid "" @@ -156144,6 +157040,10 @@ msgstr "%sは分類可能なすべてのアイテムを並べました。" msgid "Stop %s?" msgstr "%sを中断しますか?" +#: src/activity_type.h +msgid "THIS IS A BUG" +msgstr "これはバグです" + #: src/addiction.cpp msgid "You need some nicotine." msgstr "ニコチンが必要だ。" @@ -156733,7 +157633,7 @@ msgstr "少々お待ちください..." #: src/armor_layers.cpp msgid "in your personal aura" -msgstr "オーラ(下着)" +msgstr "オーラ(内)" #: src/armor_layers.cpp msgid "close to your skin" @@ -156757,7 +157657,7 @@ msgstr "帯" #: src/armor_layers.cpp msgid "an aura around you" -msgstr "オーラ(上着)" +msgstr "オーラ(外)" #: src/armor_layers.cpp #, c-format @@ -157687,10 +158587,6 @@ msgstr "%2$sの%1$s" msgid "artifact file" msgstr "アーティファクトファイル" -#: src/auto_pickup.cpp -msgid " AUTO PICKUP MANAGER " -msgstr " 自動拾得管理" - #: src/auto_pickup.cpp src/game.cpp src/safemode_ui.cpp msgid "dd" msgstr "追加" @@ -157739,14 +158635,6 @@ msgstr "規則" msgid "I/E" msgstr "I/E" -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "[]" -msgstr "[]" - -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "[]" -msgstr "[]" - #: src/auto_pickup.cpp msgid "Auto pickup enabled:" msgstr "自動拾得の状態: " @@ -157763,10 +158651,6 @@ msgstr "True" msgid "witch" msgstr "切替" -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "Please load a character first to use this page!" -msgstr "キャラクターを作成してから設定して下さい!" - #: src/auto_pickup.cpp src/safemode_ui.cpp msgid "" msgstr "" @@ -157816,6 +158700,18 @@ msgstr "拾得規則: " msgid "Save changes?" msgstr "保存しますか?" +#: src/auto_pickup.cpp +msgid " AUTO PICKUP MANAGER " +msgstr " 自動拾得管理" + +#: src/auto_pickup.cpp src/safemode_ui.cpp +msgid "[]" +msgstr "[]" + +#: src/auto_pickup.cpp src/safemode_ui.cpp +msgid "[]" +msgstr "[]" + #: src/auto_pickup.cpp #, c-format msgid "%1$d item matches: %2$s" @@ -157834,6 +158730,11 @@ msgstr "自動拾得がオプションで有効になっていません。有効 msgid "autopickup configuration" msgstr "自動拾得設定" +#: src/auto_pickup.cpp +#, c-format +msgid "Pickup rules for %s" +msgstr "%sの拾得規則" + #: src/avatar.cpp src/iuse.cpp msgid "He" msgstr "彼" @@ -159072,8 +159973,38 @@ msgstr "%sを格納しました。" #: src/bionics.cpp #, c-format -msgid "%s withdraws %s %s." -msgstr "%sは%s%sを格納しました。" +msgid " withdraws %s %s." +msgstr "は%sの%sを格納しました。" + +#: src/bionics.cpp +#, c-format +msgid "Your %s does not have enought fuel to start." +msgstr "%sを起動するのに十分な燃料がありません。" + +#: src/bionics.cpp +#, c-format +msgid "'s %s does not have enought fuel to start." +msgstr "の%sを起動するのに十分な燃料がありません。" + +#: src/bionics.cpp +#, c-format +msgid "Your %s turns off to not waste fuel." +msgstr "燃料消費を防ぐため%sが停止しました。" + +#: src/bionics.cpp +#, c-format +msgid "'s %s turns off to not waste fuel." +msgstr "燃料消費を防ぐための%sが停止しました。" + +#: src/bionics.cpp +#, c-format +msgid "Your %s runs out of fuel and turn off." +msgstr "燃料が切れ、%sが停止しました。" + +#: src/bionics.cpp +#, c-format +msgid "'s %s runs out of fuel and turn off." +msgstr "燃料が切れ、の%sが停止しました。" #: src/bionics.cpp #, c-format @@ -159440,6 +160371,10 @@ msgid "" "enjoy the operation." msgstr "手術を楽しめない事に後悔の念を抱きつつ、意識を失いました。" +#: src/bionics_ui.cpp +msgid "Available Fuel: " +msgstr "対応燃料: " + #: src/bionics_ui.cpp #, c-format msgid "" @@ -160079,7 +161014,7 @@ msgstr "口渇 ***" #: src/character.cpp msgid "Very thirsty" -msgstr "渇き**" +msgstr "口渇**" #: src/character.cpp msgid "Thirsty" @@ -162611,6 +163546,18 @@ msgid " digests a %s and recharges %d point of energy." msgid_plural " digests a %s and recharges %d points of energy." msgstr[0] "は%sを消化して%dの電力を蓄えました。" +#: src/consumption.cpp +#, c-format +msgid "You load %i charge of %s in your %s." +msgid_plural "You load %i charges of %s in your %s." +msgstr[0] "%iの%sを%sに充填しました。" + +#: src/consumption.cpp +#, c-format +msgid " load %i charge of %s in their %s." +msgid_plural " load %i charges of %s in their %s." +msgstr[0] "は%iの%sを%sに充填しました。" + #: src/craft_command.cpp src/crafting.cpp src/veh_interact.cpp msgid " (nearby)" msgstr " (周囲)" @@ -162696,8 +163643,10 @@ msgstr "材料を使い果たしました。" #: src/crafting.cpp #, c-format -msgid "You don't have anything to store %s in!" -msgstr "%sを入れる容器を所持していません!" +msgid "" +"You don't have anything in which to store %s and may have to pour it out or " +"consume it as soon as it is prepared! Proceed?" +msgstr "%sを保管できないため、すぐに消費しないと流れ出してしまいます!続けますか?" #: src/crafting.cpp src/pickup.cpp #, c-format @@ -163285,6 +164234,10 @@ msgstr "見事に命中しました!" msgid "Grazing hit." msgstr "攻撃が掠りました。" +#: src/creature.cpp +msgid "You feel poison coursing through your body!" +msgstr "体内に毒が流れ込むのを感じます!" + #: src/creature.cpp msgid "The shot misses!" msgstr "撃ち損ないました!" @@ -164855,21 +165808,21 @@ msgid "You can't see the terrain here." msgstr "地形が見当たりません。" #: src/descriptions.cpp +#, c-format msgid "" "\n" -"Sign: ???" +"Sign: %s" msgstr "" "\n" -"看板: ???" +"看板: %s" #: src/descriptions.cpp -#, c-format msgid "" "\n" -"Sign: %s" +"Sign: ???" msgstr "" "\n" -"看板: %s" +"看板: ???" #: src/descriptions.cpp src/iexamine.cpp #, c-format @@ -168104,20 +169057,6 @@ msgstr "インターフェース情報" msgid "Failed to save game data" msgstr "ゲームデータのセーブに失敗しました。" -#: src/game.cpp -msgid "You haven't killed any monsters yet!" -msgstr "何も殺していません!" - -#: src/game.cpp -#, c-format -msgid "KILL COUNT: %d" -msgstr "殺害数: %d" - -#: src/game.cpp -#, c-format -msgid "Experience: %d (%d points available)" -msgstr "経験値: %d (%dポイント使用可能)" - #: src/game.cpp msgid " You are forgotten among the billions lost in the cataclysm..." msgstr " あなたは大変動で失われた数多の命の一つとして忘れ去られた..." @@ -170081,6 +171020,11 @@ msgstr "こぼれた液体は飲めない" msgid "You're fully charged" msgstr "完全に充電されている" +#: src/game_inventory.cpp +#, c-format +msgid "No space to store more %s" +msgstr "これ以上の%sを保管する容量がありません。" + #: src/game_inventory.cpp msgid "soon!" msgstr "腐敗間近!" @@ -170113,6 +171057,18 @@ msgstr "古い" msgid "rotten" msgstr "腐敗" +#: src/game_inventory.cpp src/panels.cpp +msgid "Food :" +msgstr "食事:" + +#: src/game_inventory.cpp src/panels.cpp +msgid "Drink:" +msgstr "水分:" + +#: src/game_inventory.cpp src/panels.cpp +msgid "Pain :" +msgstr "苦痛:" + #: src/game_inventory.cpp msgid "Consume item" msgstr "消費するアイテムを選択" @@ -172836,6 +173792,14 @@ msgstr "摘出するCBMを選択" msgid "ERROR NO SPACE AVAILABLE. Operation impossible. Exiting." msgstr "移植空間不足エラー。手術不可能です。操作を終了します。" +#: src/iexamine.cpp +msgid "Personality_Override" +msgstr "人格_上書き" + +#: src/iexamine.cpp +msgid "C0RR#PTED?D#TA" +msgstr "破#損?デ#タ" + #: src/iexamine.cpp msgid "Choose bionic to uninstall" msgstr "摘出するCBMを選択" @@ -174062,8 +175026,8 @@ msgid "Capacity: " msgstr "容量: " #: src/item.cpp -msgid " per round" -msgstr "1発あたり" +msgid " moves per round" +msgstr "コスト/1発" #: src/item.cpp msgid "Reload time: " @@ -174159,8 +175123,8 @@ msgid "" msgstr "" #: src/item.cpp -msgid " seconds" -msgstr "秒" +msgid " moves " +msgstr "コスト" #: src/item.cpp msgid "Time to reach aim level: " @@ -174194,10 +175158,6 @@ msgstr "有効反動: " msgid "Recommended strength (burst): " msgstr "推奨筋力(バースト): " -#: src/item.cpp -msgid " seconds per round" -msgstr "秒/1発" - #: src/item.cpp msgid "Fire modes: " msgstr "射撃モード: " @@ -174367,7 +175327,7 @@ msgstr "積層: " #: src/item.cpp msgid "Personal aura. " -msgstr "オーラ(下着)" +msgstr "オーラ(内)" #: src/item.cpp msgid "Close to skin. " @@ -174387,7 +175347,7 @@ msgstr "。" #: src/item.cpp msgid "Outer aura. " -msgstr "オーラ(上着)" +msgstr "オーラ(外)" #: src/item.cpp msgid "Normal. " @@ -174463,6 +175423,14 @@ msgid "" "improve them by repairing this item." msgstr "防御値が損傷によって減少しています。修復によって防御値を改善できます。" +#: src/item.cpp +msgid "Weight capacity modifier: " +msgstr "所持重量変更: " + +#: src/item.cpp +msgid "Weight capacity bonus: " +msgstr "所持重量ボーナス: " + #: src/item.cpp msgid "Just for fun." msgstr "単なる娯楽用品です。" @@ -174893,6 +175861,14 @@ msgstr "* このアイテムを無線信号で起動すると即座 msgid "This bionic is installed in the following body part(s):" msgstr "この生体部品が導入される部位: " +#: src/item.cpp +msgid "Encumbrance: " +msgstr "動作制限: " + +#: src/item.cpp +msgid "Environmental Protection: " +msgstr "環境防護: " + #: src/item.cpp msgid "* This weapon needs two free hands to fire." msgstr "* この銃器の発射には両手を空けておく必要があります。" @@ -178140,6 +179116,11 @@ msgstr "%sの下にいます。" msgid " illuminated by %s" msgstr "%sで照らされています。" +#: src/iuse.cpp +#, c-format +msgid " in %s cloud" +msgstr "%sの中にいます。" + #: src/iuse.cpp #, c-format msgid " with graffiti \"%s\"" @@ -179351,6 +180332,10 @@ msgstr "充電済みのUPS等で%sに電力を供給する必要があります msgid "There is also a certain bionic that helps with this kind of armor." msgstr "この種のアーマーを運用するにあたって、一部の生体部品も助けになるでしょう。" +#: src/iuse_actor.cpp +msgid "No lock to pick." +msgstr "ピッキングする錠がありません。" + #: src/iuse_actor.cpp msgid "Use your lockpick where?" msgstr "どこにロックピックを使用しますか?" @@ -181383,6 +182368,20 @@ msgstr "<-> 前" msgid "ndo move" msgstr "一手戻す" +#: src/kill_tracker.cpp +msgid "You haven't killed any monsters yet!" +msgstr "何も殺していません!" + +#: src/kill_tracker.cpp +#, c-format +msgid "KILL COUNT: %d" +msgstr "殺害数: %d" + +#: src/kill_tracker.cpp +#, c-format +msgid "Experience: %d (%d points available)" +msgstr "経験値: %d (%dポイント使用可能)" + #. ~ abbreviated direction names and long direction names #: src/line.cpp msgid "N " @@ -181652,6 +182651,16 @@ msgstr "無限" msgid "an explosion" msgstr "[爆発音]" +#: src/magic.cpp +#, c-format +msgid "%s and %s" +msgstr "%sと%s" + +#: src/magic.cpp src/player.cpp +#, c-format +msgid "%s, %s" +msgstr "%s、%s" + #: src/magic.cpp #, c-format msgid "" @@ -181697,6 +182706,11 @@ msgstr "警告文を無視する" msgid "Popup Distractions" msgstr "警告文を表示する" +#: src/magic.cpp +#, c-format +msgid "%d moves" +msgstr "行動コスト%d" + #: src/magic.cpp msgid "requires concentration" msgstr "集中力" @@ -182215,8 +183229,8 @@ msgstr "%d分で%sでの洗浄が完了します。" #: src/map.cpp #, c-format -msgid "The autoclave in the %s has finished washing." -msgstr "%sのオートクレーブが洗浄を完了しました。" +msgid "The autoclave in the %s has finished its cycle." +msgstr "%sのオートクレーブが滅菌を完了しました。" #: src/map.cpp #, c-format @@ -182481,22 +183495,6 @@ msgstr "保管室を開放" msgid "Missile Controls" msgstr "ミサイル制御" -#: src/mapgen.cpp -msgid "EnviroCom OS v2.03" -msgstr "EnviroCom OS v2.03" - -#: src/mapgen.cpp -msgid "Unlock stairs" -msgstr "階段を開錠" - -#: src/mapgen.cpp -msgid "Download Sewer Maps" -msgstr "下水マップをダウンロード" - -#: src/mapgen.cpp -msgid "Divert sample" -msgstr "サンプルを転送" - #: src/mapgen.cpp msgid "NEPowerOS" msgstr "NEPower社OS" @@ -182742,7 +183740,7 @@ msgstr "* 行動コスト相殺 (攻撃失敗時)" #: src/martialarts.cpp msgid "* Will break a grab" -msgstr "* 掴み状態解除(掴み攻撃を受けた時)" +msgstr "* 拘束状態解除(拘束時)" #: src/martialarts.cpp msgid "* Will attack in a wide arc in front of you" @@ -185094,6 +186092,11 @@ msgstr "%sが腕を伸ばしに飛び掛かってきましたが、回 msgid "The %1$s's arms fly out and pull and grab %2$s!" msgstr "%1$sが腕を伸ばして%2$sに飛び掛かり、体を掴みました!" +#: src/monattack.cpp +#, c-format +msgid "The %1$s reaches out and pulls %2$s!" +msgstr "%1$sが腕を伸ばして%2$sを引っ張りました!" + #: src/monattack.cpp #, c-format msgid "The %s gropes at you, but you dodge!" @@ -185797,6 +186800,19 @@ msgstr "「市民、武器を捨てて止まりなさい!」" msgid "fzzzzzt" msgstr "ギュイーン" +#: src/monattack.cpp +msgid "The floor trembles underneath your feet." +msgstr "足下の床が震えています。" + +#: src/monattack.cpp +msgid "a deafening roar!" +msgstr "[耳をつんざく咆哮!]" + +#: src/monattack.cpp +#, c-format +msgid "A %s struggles to pull itself free from the %s!" +msgstr "%sは苦労して%sから逃れました!" + #: src/monattack.cpp #, c-format msgid "The %1$s mechanically grabs at %2$s!" @@ -186719,7 +187735,7 @@ msgstr "%s攻撃能力をもつ" #: src/monster.cpp msgctxt "Grab as an action" msgid "grab" -msgstr "掴み" +msgstr "拘束" #: src/monster.cpp msgctxt "Poison as an action" @@ -186955,11 +187971,11 @@ msgstr "胞子が%1$sを%2$sに変異させました!" #: src/morale.cpp msgid "Total morale:" -msgstr "意欲合計:" +msgstr "合計:" #: src/morale.cpp msgid "Focus trends towards:" -msgstr "意欲変動:" +msgstr "変動:" #: src/morale.cpp msgid "Nothing affects your morale" @@ -187528,7 +188544,7 @@ msgstr "基本HP: %d" #: src/newcharacter.cpp #, c-format msgid "Carry weight: %.1f %s" -msgstr "総運搬重量: %.1f %s" +msgstr "所持重量上限: %.1f %s" #: src/newcharacter.cpp #, c-format @@ -188422,6 +189438,11 @@ msgstr "%1$sは%2$sを落としました。" msgid "Hold on, I want to pulp that %s." msgstr "ちょっと待ってくれ、その%sを破壊したいんだ。" +#: src/npcmove.cpp +#, c-format +msgid "%s completed the assigned task." +msgstr "%sは割り当てられた任務を完了しました。" + #: src/npcmove.cpp #, c-format msgid "%1$s throws a %2$s." @@ -188933,6 +189954,10 @@ msgstr "素手" msgid "BADAMMO" msgstr "不良弾" +#: src/npctalk.cpp +msgid "doing this and that" +msgstr "あれこれ" + #: src/npctalk.cpp msgctxt "punctuation" msgid "." @@ -189036,6 +190061,11 @@ msgstr "%1$sに%2$d個の%3$sを渡しました。" msgid "%1$s doesn't have a %2$s!" msgstr "%1$sは%2$sを持っていません!" +#: src/npctalk.cpp +#, c-format +msgid "%1$s gives you %2$s." +msgstr "%1$sは%2$sを渡しました。" + #: src/npctalk.cpp msgid "I don't trust you enough to eat THIS..." msgstr "こんなものを食べるほど信用しちゃいない..." @@ -189289,11 +190319,6 @@ msgstr "支給: " msgid "Select a follower" msgstr "同行者を選択" -#: src/npctalk_funcs.cpp -#, c-format -msgid "Pickup rules for %s" -msgstr "%sの拾得規則" - #: src/npctrade.cpp #, c-format msgid "Volume: %s %s, Weight: %.1f %s" @@ -192036,10 +193061,6 @@ msgstr "かなり寒い!" msgid "Freezing!" msgstr "猛烈に寒い!" -#: src/panels.cpp -msgid "Pain " -msgstr "苦痛" - #: src/panels.cpp msgid "Bad" msgstr "悪" @@ -192207,22 +193228,10 @@ msgstr "装備:" msgid "Style:" msgstr "武術: " -#: src/panels.cpp -msgid "Food :" -msgstr "食事:" - -#: src/panels.cpp -msgid "Drink:" -msgstr "水分:" - #: src/panels.cpp msgid "Rest :" msgstr "休息:" -#: src/panels.cpp -msgid "Pain :" -msgstr "苦痛:" - #: src/panels.cpp msgid "Heat :" msgstr "寒暖:" @@ -193971,11 +194980,6 @@ msgstr "%s(%d)" msgid "%s with %s (%d)" msgstr "%s %s%d" -#: src/player.cpp -#, c-format -msgid "%s, %s" -msgstr "%s、%s" - #: src/player.cpp msgid "| Location " msgstr "| 場所" @@ -194714,6 +195718,10 @@ msgstr "空腹 **" msgid "Peckish" msgstr "食事可能" +#: src/player.cpp +msgid "Pain " +msgstr "苦痛" + #: src/player_activity.cpp msgid "You pause for a moment to catch your breath." msgstr "立ち止まって息を整えました。" @@ -194819,7 +195827,7 @@ msgstr "基本HP:%d" #: src/player_display.cpp #, c-format msgid "Carry weight (%s): %.1f" -msgstr "運搬重量(%s):%.1f" +msgstr "所持重量上限(%s):%.1f" #: src/player_display.cpp #, c-format @@ -196143,6 +197151,10 @@ msgstr "B/W" msgid "Safe Mode enabled:" msgstr "セーフモードの状態: " +#: src/safemode_ui.cpp +msgid "Please load a character first to use this page!" +msgstr "キャラクターを作成してから設定して下さい!" + #: src/safemode_ui.cpp msgid "Safe Mode manager currently inactive." msgstr "現在セーフモード管理は未設定です。" @@ -198963,6 +199975,10 @@ msgid "" "door." msgstr "滅菌が終了する前にオートクレーブを停止し、ふたを開けました。" +#: src/vehicle_use.cpp +msgid "The autoclave is empty, there's no point in starting it." +msgstr "オートクレーブ内に何も入っていないため、起動しても意味がありません。" + #: src/vehicle_use.cpp #, c-format msgid "" @@ -198989,6 +200005,10 @@ msgid "" "its lid." msgstr "洗濯が終了する前に洗濯機を停止し、ふたを開けました。" +#: src/vehicle_use.cpp +msgid "The washing machine is empty, there's no point in starting it." +msgstr "洗濯機内に何も入っていないため、起動しても意味がありません。" + #: src/vehicle_use.cpp #, c-format msgid "" @@ -199027,6 +200047,10 @@ msgid "" "lid." msgstr "洗浄が終了する前に食器洗浄機を停止し、ふたを開けました。" +#: src/vehicle_use.cpp +msgid "The dishwasher is empty, there's no point in starting it." +msgstr "食器洗浄機内に何も入っていないため、起動しても意味がありません。" + #: src/vehicle_use.cpp #, c-format msgid "" diff --git a/lang/po/ko.po b/lang/po/ko.po index af99453db920e..e84d5bc9ad7ef 100644 --- a/lang/po/ko.po +++ b/lang/po/ko.po @@ -5,21 +5,21 @@ # 김정국 , 2019 # Dawon Shin , 2019 # 탯새 , 2019 +# T itan , 2019 +# 장현우 , 2019 # fenjo , 2019 -# Nick, 2019 -# Vlasov Vitaly , 2019 # indejeC , 2019 +# Vlasov Vitaly , 2019 # Brett Dong , 2019 -# T itan , 2019 -# 장현우 , 2019 +# Nick, 2019 # msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.D\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-16 17:39+0800\n" +"POT-Creation-Date: 2019-08-23 23:11+0800\n" "PO-Revision-Date: 2018-04-26 14:47+0000\n" -"Last-Translator: 장현우 , 2019\n" +"Last-Translator: Nick, 2019\n" "Language-Team: Korean (https://www.transifex.com/cataclysm-dda-translators/teams/2217/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -396,25 +396,6 @@ msgid "" "shotgun shells." msgstr "구리 조각. 산탄 탄피 같은 것을 만드는데 사용할 수 있습니다." -#: lang/json/AMMO_from_json.py -msgid "solder" -msgstr "납땜용 연납" - -#. ~ Description for solder -#: lang/json/AMMO_from_json.py -msgid "" -"A small spool of solder, able to be used in ammunition and electronics." -msgstr "탄약이나 전자기기 제작에 사용되는 작은 납 뭉치." - -#: lang/json/AMMO_from_json.py -msgid "tin" -msgstr "주석" - -#. ~ Description for tin -#: lang/json/AMMO_from_json.py -msgid "Tin and pewter scraps. Usable in making ammo." -msgstr "주석과 백랍 조각. 탄약 제조에 사용이 가능합니다." - #: lang/json/AMMO_from_json.py msgid "medical tape" msgstr "의료용 테이프" @@ -433,6 +414,34 @@ msgstr "PG-7VL 93mm 로켓" msgid "93mm single-stage high-explosive ammunition for the RPG-7." msgstr "RPG-7에 사용하는 93mm 구경 1단구성 고폭탄입니다." +#: lang/json/AMMO_from_json.py +msgid "PG-7VR 64mm/105mm rocket" +msgstr "PG-7VR 64mm/105mm 로켓탄" + +#. ~ Description for PG-7VR 64mm/105mm rocket +#: lang/json/AMMO_from_json.py +msgid "64mm/105mm high-explosive tandem ammunition for the RPG-7." +msgstr "RPG-7용 64mm/105mm 고폭 탄뎀 로켓." + +#: lang/json/AMMO_from_json.py +msgid "TBG-7V 105mm rocket" +msgstr "TBG-7V 105mm 로켓탄" + +#. ~ Description for TBG-7V 105mm rocket +#: lang/json/AMMO_from_json.py +msgid "105mm thermobaric ammunition for the RPG-7." +msgstr "RPG-7용 105mm 초고열 로켓탄." + +#: lang/json/AMMO_from_json.py +msgid "OG-7V 40mm rocket" +msgstr "OG-7V 40mm 로켓탄" + +#. ~ Description for OG-7V 40mm rocket +#: lang/json/AMMO_from_json.py +msgid "" +"40mm high-explosive fragmentation antipersonnel ammunition for the RPG-7." +msgstr "RPG-7용 40mm 고폭 세열 대인로켓탄." + #: lang/json/AMMO_from_json.py msgid "M235 66mm TPA rocket" msgstr "M235 66mm TPA 로켓" @@ -466,14 +475,14 @@ msgstr "" #: lang/json/AMMO_from_json.py msgid "calcium carbide premix" msgid_plural "calcium carbide premix" -msgstr[0] "" +msgstr[0] "탄화칼슘 원료" #. ~ Description for calcium carbide premix #: lang/json/AMMO_from_json.py msgid "" "A powdered mixture of coke and lime ready to be smelted into usable calcium " "carbide in an arc furnace." -msgstr "" +msgstr "탄화칼슘의 재료가 되는 석탄과 석회석 가루 혼합물. 전기로에서 제련해야 한다." #: lang/json/AMMO_from_json.py msgid "coal" @@ -646,14 +655,14 @@ msgstr "숯을 만들다 중단하면 생기는 결과물. 목탄 가마에 사 #: lang/json/AMMO_from_json.py msgid "unfinished calcium carbide" -msgstr "" +msgstr "미완성 탄화칼슘" #. ~ Description for unfinished calcium carbide #: lang/json/AMMO_from_json.py msgid "" "The incomplete process of converting coal and lime into calcium carbide. " "Useless in this state/" -msgstr "" +msgstr "한창 제련 중에 있는 석탄과 석회석 혼합물. 아직 사용할 수 없다." #: lang/json/AMMO_from_json.py msgid "chain link" @@ -1655,7 +1664,7 @@ msgstr "발화 온도를 높이고 표면에 달라붙기 쉽도록 하는 첨 #: lang/json/AMMO_from_json.py msgid "gelled gasoline" msgid_plural "gelled gasoline" -msgstr[0] "" +msgstr[0] "가솔린 젤리" #. ~ Description for gelled gasoline #: lang/json/AMMO_from_json.py @@ -1663,12 +1672,12 @@ msgid "" "A flammable gel composed of gasoline and dissolved shavings of polystyrene, " "roughly similar in properties to napalm b. It's meant to be used with a " "flamethrower." -msgstr "" +msgstr "네이팜과 비슷한 화염방사기 연료. 폴리스티렌 용해액과 가솔린을 섞어 만들었다." #: lang/json/AMMO_from_json.py msgid "flamethrower fuel" msgid_plural "flamethrower fuel" -msgstr[0] "" +msgstr[0] "화염방사기 연료" #. ~ Description for flamethrower fuel #: lang/json/AMMO_from_json.py @@ -1676,12 +1685,12 @@ msgid "" "A mixture of gasoline and diesel oil in equal parts. Its combustion " "properties make it unfit for applications where you would use any of them " "separately, but it can be used to feed a flamethrower." -msgstr "" +msgstr "가솔린과 디젤의 1:1 혼합물. 기계 따위에 쓰기에는 성질이 너무 달라서 화염방사기 외에는 쓰일 곳이 별로 없다." #: lang/json/AMMO_from_json.py msgid "autoclave pouch" msgid_plural "autoclave pouches" -msgstr[0] "" +msgstr[0] "오토클레이브 파우치" #. ~ Description for autoclave pouch #: lang/json/AMMO_from_json.py @@ -1690,6 +1699,8 @@ msgid "" "Administration). If used properly, these pouches can keep things sterile " "indefinitely." msgstr "" +"미 FDA에서 승인받은 의료용 멸균 파우치. 제대로 된 장비와 함께 사용한다면 파우치 안에 넣은 것을 영구적으로 멸균 상태로 유지할 수 " +"있다." #: lang/json/AMMO_from_json.py msgid "shrapnel" @@ -2173,21 +2184,19 @@ msgstr "" #. ~ Description for .300 AAC Blackout #: lang/json/AMMO_from_json.py msgid "" -".300 AAC Blackout is an intermediate cartridge that achieves ballistics " -"similar to the 7.62x39 but allows use on the AR-15 platform. The round is " -"necked-up from the 5.56mm NATO, but feeds from a STANAG magazine. It " -"requires a specific barrel, so will not work in a standard M4 or similar " -"carbine. This loading is supersonic." +"A .300 AAC Blackout round with a 125gr open tip match bullet. 300 BLK is an" +" intermediate cartridge necked up from 5.56x45mm, designed to achieve " +"similar ballistics to 7.62x39mm. It is compatible with standard AR-15 lower" +" receivers and will feed from STANAG magazines." msgstr "" #. ~ Description for .300 AAC Blackout #: lang/json/AMMO_from_json.py msgid "" -".300 AAC Blackout is an intermediate cartridge that achieves ballistics " -"similar to the 7.62x39 but allows use on the AR-15 platform. The round is " -"necked-up from the 5.56mm NATO, but feeds from a STANAG magazine. It " -"requires a specific barrel, so will not work in a standard M4 or similar " -"carbine. This loading is subsonic." +"A subsonic .300 AAC Blackout round with a 220gr open tip match bullet. 300 " +"BLK is an intermediate cartridge necked up from 5.56x45mm, designed to " +"achieve similar ballistics to 7.62x39mm. It is compatible with standard " +"AR-15 lower receivers and will feed from STANAG magazines." msgstr "" #: lang/json/AMMO_from_json.py @@ -3616,6 +3625,17 @@ msgid "" " tube. Designed to be highly effective against vehicles and structures." msgstr "튜브에서 발사하는 광학추적 유선유도 대전차 미사일. 장갑차나 건물 따위를 부수는 데 사용된다." +#: lang/json/AMMO_from_json.py +msgid "paralyzing barb" +msgstr "" + +#. ~ Description for paralyzing barb +#: lang/json/AMMO_from_json.py +msgid "" +"Tiny droplets of venom trickle out of the sponge-like tissue of this sharp " +"barb." +msgstr "" + #: lang/json/AMMO_from_json.py msgid "sprayable toxic gas" msgstr "분무용 독가스" @@ -3642,14 +3662,14 @@ msgstr "" #: lang/json/AMMO_from_json.py msgid "sprayable insecticide" -msgstr "" +msgstr "분무용 농약" #. ~ Description for sprayable insecticide #: lang/json/AMMO_from_json.py msgid "" "Strong sprayable insecticide ammo for the chemical thrower. Best be used " "with some kind of mask or mouth protection." -msgstr "" +msgstr "약품 분무기에 넣어 쓰이는 독한 농약. 호흡기 보호장구 착용 필수!" #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid "paper cartridge" @@ -3754,7 +3774,7 @@ msgstr "버드샷 (흑색화약)" #: lang/json/AMMO_from_json.py msgid "blackpowder dragon's breath shell" -msgstr "" +msgstr "드래곤 브레스 탄 (흑색화약)" #: lang/json/AMMO_from_json.py msgid "blackpowder 00 shot" @@ -4156,6 +4176,27 @@ msgid "" "making doors." msgstr "쇠로 된 경첩. 스크류 구멍이 있다. 문을 달 때 쓰인다." +#: lang/json/AMMO_from_json.py +msgid "tin powder" +msgstr "주석 가루" + +#. ~ Description for tin powder +#: lang/json/AMMO_from_json.py +msgid "" +"A fine gray powder composed of tin, usable for making solder and lining " +"containers to prevent corrosion." +msgstr "고운 회색 가루. 땜납을 만들거나 도금을 하는 데 쓰인다." + +#: lang/json/AMMO_from_json.py +msgid "solder" +msgstr "납땜용 연납" + +#. ~ Description for solder +#: lang/json/AMMO_from_json.py +msgid "" +"A small spool of solder, able to be used in ammunition and electronics." +msgstr "탄약이나 전자기기 제작에 사용되는 작은 납 뭉치." + #: lang/json/AMMO_from_json.py msgid "incendiary" msgid_plural "incendiaries" @@ -5527,14 +5568,14 @@ msgstr "몸을 보호하는 모피로 만든 두꺼운 갑옷. 따뜻하고 착 #: lang/json/ARMOR_from_json.py msgid "lamellar cuirass" msgid_plural "lamellar cuirasses" -msgstr[0] "" +msgstr[0] "라멜라 흉갑" #. ~ Description for lamellar cuirass #: lang/json/ARMOR_from_json.py msgid "" "A cuirass made of multiple pieces of tough leather, laced together for " "durable yet flexible protection." -msgstr "" +msgstr "튼튼한 가죽 여러 장을 묶어 만든 유연한 갑옷. " #: lang/json/ARMOR_from_json.py msgid "leather body armor" @@ -5685,38 +5726,6 @@ msgstr[0] "농구용 반바지" msgid "A pair of basketball shorts. Comfortable and light." msgstr "농구용 반바지. 편안하고 가볍습니다." -#: lang/json/ARMOR_from_json.py -msgid "backpack" -msgid_plural "backpacks" -msgstr[0] "배낭" - -#. ~ Description for backpack -#: lang/json/ARMOR_from_json.py -msgid "A small backpack. Good storage for a little encumbrance." -msgstr "작은 배낭. 적은 방해도에 괜찮은 저장공간이 있습니다." - -#: lang/json/ARMOR_from_json.py -msgid "giant novelty backpack" -msgid_plural "giant novelty backpacks" -msgstr[0] "거대한 노벨티 배낭" - -#. ~ Description for giant novelty backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A huge fabric backpack made mostly as a joke before the cataclysm. Now, " -"it's still rather silly, but it can store a lot of stuff." -msgstr "대재앙 이전에 장난으로 만들어진 거대한 천 가방입니다. 지금도 바보같아 보이지만 많은 것들을 넣을 수 있습니다." - -#: lang/json/ARMOR_from_json.py -msgid "leather backpack" -msgid_plural "leather backpacks" -msgstr[0] "가죽 배낭" - -#. ~ Description for leather backpack -#: lang/json/ARMOR_from_json.py -msgid "A small leather backpack. Good storage for a little encumbrance." -msgstr "작은 가죽 배낭. 조금 불편하지만, 준수한 저장공간을 제공합니다." - #: lang/json/ARMOR_from_json.py msgid "balaclava" msgid_plural "balaclavas" @@ -5738,8 +5747,8 @@ msgstr[0] "수대" #. ~ Use action holster_msg for scabbard. #. ~ Use action holster_msg for sheath. #. ~ Use action holster_msg for survivor belt. -#. ~ Use action holster_msg for hiking backpack. #. ~ Use action holster_msg for survivor utility belt. +#. ~ Use action holster_msg for hiking backpack. #. ~ Use action holster_msg for pair of boots. #. ~ Use action holster_msg for pair of bone armor boots. #. ~ Use action holster_msg for pair of turnout boots. @@ -5764,7 +5773,8 @@ msgstr[0] "수대" #. ~ Use action holster_msg for pair of rollerblades. #. ~ Use action holster_msg for pair of rollerskates. #. ~ Use action holster_msg for C.R.I.T web belt. -#: lang/json/ARMOR_from_json.py +#. ~ Use action holster_msg for hollow cane. +#: lang/json/ARMOR_from_json.py lang/json/GENERIC_from_json.py #, no-python-format msgid "You sheath your %s" msgstr "%s을(를) 칼집에 넣었다." @@ -5772,7 +5782,9 @@ msgstr "%s을(를) 칼집에 넣었다." #. ~ Use action holster_prompt for baldric. #. ~ Use action holster_prompt for back scabbard. #. ~ Use action holster_prompt for scabbard. -#: lang/json/ARMOR_from_json.py +#. ~ Use action holster_prompt for hollow cane. +#: lang/json/ARMOR_from_json.py lang/json/ARMOR_from_json.py +#: lang/json/GENERIC_from_json.py msgid "Sheath sword" msgstr "검 집어넣기" @@ -6275,7 +6287,7 @@ msgid "" "Customized chainmail arms. Each sleeve has straps to connect them with each" " other. The lack of fingers makes them less cumbersome and allows them to " "be used with gloves." -msgstr "" +msgstr "가죽끈으로 연결된 한 쌍의 맞춤 제작 쇠사슬 소매. 손가락 구멍이 나 있어 도구를 다루기도 편하고 장갑을 낄 수도 있다." #: lang/json/ARMOR_from_json.py msgid "chainmail coif" @@ -6297,7 +6309,7 @@ msgstr[0] "사슬 레깅스" msgid "" "Customized chainmail legs. Their straps keep everything in place, and the " "lack of toes and heels allows them to work perfectly well with footwear." -msgstr "" +msgstr "가죽끈으로 연결된 한 쌍의 맞춤 제작 쇠사슬 바지. 발목 아래가 뚫려있어 신발을 같이 신을 수 있다." #: lang/json/ARMOR_from_json.py msgid "chainmail hauberk" @@ -6312,6 +6324,8 @@ msgid "" "gambeson to deal with uneven weight distribution, cold environments and to " "allow them to be used separately." msgstr "" +"맞춤 제작된 전신 쇠사슬 갑옷. 머리가 비어 있다. 무게 분산과 보온을 위해 갬버슨 내의와 같이 입게 되어 있고, 가죽끈으로 결합되어 " +"있어 다시 분해할 수 있다." #: lang/json/ARMOR_from_json.py msgid "chainmail armor" @@ -6326,6 +6340,8 @@ msgid "" "weight distribution, cold environments and to allow them to be used " "separately." msgstr "" +"맞춤 제작된 전신 쇠사슬 갑옷. 무게 분산과 보온을 위해 갬버슨 내의와 같이 입게 되어 있고, 가죽끈으로 결합되어 있어 다시 분해할 수 " +"있다." #: lang/json/ARMOR_from_json.py msgid "chainmail vest" @@ -6537,7 +6553,7 @@ msgstr "큰 주머니 두개와 후드가 달린 비닐 우비. 비를 막아줍 #: lang/json/ARMOR_from_json.py msgid "gutskin parka" msgid_plural "gutskin parkas" -msgstr[0] "" +msgstr[0] "내장 가죽 파카" #. ~ Description for gutskin parka #: lang/json/ARMOR_from_json.py @@ -6623,14 +6639,14 @@ msgstr "" #: lang/json/ARMOR_from_json.py msgid "scrap cuirass" msgid_plural "scrap cuirasses" -msgstr[0] "" +msgstr[0] "고철 흉갑" #. ~ Description for scrap cuirass #: lang/json/ARMOR_from_json.py msgid "" "A cuirass made from scraps of metal secured by simple strings; the loose " "collection of plates provides decent but not the most convenient protection." -msgstr "" +msgstr "고철을 줄로 묶어서 만든 간단한 흉갑. 나름 괜찮은 방어력을 제공하지만 굉장히 불편하고 거추장스럽다." #: lang/json/ARMOR_from_json.py msgid "dinosaur suit" @@ -6644,16 +6660,6 @@ msgid "" " encumbering and has little storage but is very warm." msgstr "의인화된 공룡의 모습을 한 전신 의상. 이 옷은 상당히 불편하며, 약간의 저장공간을 가지고 있고, 몹시 덥습니다." -#: lang/json/ARMOR_from_json.py -msgid "dive bag" -msgid_plural "dive bags" -msgstr[0] "잠수용 가방" - -#. ~ Description for dive bag -#: lang/json/ARMOR_from_json.py -msgid "A lightweight mesh backpack, commonly worn by swimmers and divers." -msgstr "흔히 수영하는 사람이나 잠수부가 사용하는 가벼운 그물 가방입니다." - #: lang/json/ARMOR_from_json.py msgid "down-filled blanket" msgid_plural "down-filled blankets" @@ -6682,14 +6688,14 @@ msgstr "가볍고 유연한, 최첨단 방탄조끼. 내부에 들어있는 세 #: lang/json/ARMOR_from_json.py msgid "lamellar kevlar vest" msgid_plural "lamellar kevlar vests" -msgstr[0] "" +msgstr[0] "라멜라 케블라 조끼" #. ~ Description for lamellar kevlar vest #: lang/json/ARMOR_from_json.py msgid "" "A lamellar kevlar vest, there are intricately cut voids usually filled with " "stitched in ceramic disks, you could repair the stitching if needed" -msgstr "" +msgstr "케블라 천 여러 장을 덧대 만든 조끼. 세라믹 방탄판이 군데군데 내장되어 있다." #: lang/json/ARMOR_from_json.py msgid "dress" @@ -6723,17 +6729,6 @@ msgstr[0] "웨딩 드레스" msgid "A beautiful white wedding dress. What good will it be now?" msgstr "아름다운 순백의 웨딩 드레스. 하지만 지금 세상에 무슨 쓸모가 있겠습니까?" -#: lang/json/ARMOR_from_json.py -msgid "duffel bag" -msgid_plural "duffel bags" -msgstr[0] "더플백" - -#. ~ Description for duffel bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A huge duffel bag. Provides plenty of storage, but is severely encumbering." -msgstr "커다란 더플백. 대용량의 저장공간을 제공하지만, 상당히 불편합니다." - #: lang/json/ARMOR_from_json.py msgid "tactical dump pouch" msgid_plural "tactical dump pouches" @@ -7403,13 +7398,13 @@ msgstr "험한 작업을 위한 튼튼한 장갑." #: lang/json/ARMOR_from_json.py msgid "pair of cut resistant gloves" msgid_plural "pairs of cut resistant gloves" -msgstr[0] "" +msgstr[0] "방검장갑" #. ~ Description for pair of cut resistant gloves #: lang/json/ARMOR_from_json.py msgid "" "A pair of cut resistant gloves, useful when rapidly breaking down carcasses." -msgstr "" +msgstr "도축 따위에 쓰이는 두꺼운 보호용 장갑." #: lang/json/ARMOR_from_json.py msgid "pair of hand wraps" @@ -8371,16 +8366,6 @@ msgid "" "off dramatically before fighting any foes!" msgstr "길게 흘러내리는 예복. 심플하면서 편하게 입을 수 있습니다. 적과 싸우기 전에 멋지게 뜯어내는걸 잊지마세요!" -#: lang/json/ARMOR_from_json.py -msgid "jerrypack" -msgid_plural "jerrypacks" -msgstr[0] "기름통 가방" - -#. ~ Description for jerrypack -#: lang/json/ARMOR_from_json.py -msgid "A jerrycan modified to be worn in a similar manner to a backpack." -msgstr "가방 처럼 착용 할 수 있도록 개조한 기름통." - #: lang/json/ARMOR_from_json.py msgid "sports jersey" msgid_plural "sports jerseys" @@ -9137,28 +9122,6 @@ msgstr[0] "프랑스풍 메이드 모자" msgid "A frilly white headpiece." msgstr "프릴로 장식된 흰색 모자." -#: lang/json/ARMOR_from_json.py -msgid "makeshift knapsack" -msgid_plural "makeshift knapsacks" -msgstr[0] "급조 배낭" - -#. ~ Description for makeshift knapsack -#: lang/json/ARMOR_from_json.py -msgid "" -"A pair of pants with the bottom ends tied with string, and then passed " -"through the belt loops so the knapsack can be carried on the back." -msgstr "바지 밑단을 끈으로 묶고, 벨트로 어깨 줄을 만든 가방." - -#: lang/json/ARMOR_from_json.py -msgid "makeshift sling" -msgid_plural "makeshift slings" -msgstr[0] "대충 만든 포대" - -#. ~ Description for makeshift sling -#: lang/json/ARMOR_from_json.py -msgid "A large sheet tied into a crude, over-the-shoulder sling." -msgstr "큰 천을 묶어서 임시 슬링으로 만든것." - #: lang/json/ARMOR_from_json.py msgid "ballistic mask" msgid_plural "ballistic masks" @@ -9217,16 +9180,6 @@ msgid "" "rioters to hide their identity." msgstr "티셔츠의 소매를 뒤로 묶은 것. 이것은 보통 범죄자들이 신분을 감추기 위해 착용합니다." -#: lang/json/ARMOR_from_json.py -msgid "messenger bag" -msgid_plural "messenger bags" -msgstr[0] "메신저백" - -#. ~ Description for messenger bag -#: lang/json/ARMOR_from_json.py -msgid "Light and easy to wear, but doesn't offer much storage." -msgstr "가방의 한쪽 줄을 어깨에 매는 형태의 가방. 가볍고 착용하기 편하지만, 저장공간이 많지 않습니다." - #: lang/json/ARMOR_from_json.py msgid "pair of mittens" msgid_plural "pairs of mittens" @@ -9237,21 +9190,6 @@ msgstr[0] "벙어리 장갑" msgid "A pair of warm mittens. They are extremely cumbersome." msgstr "방한용 벙어리 장갑. 착용하면 손을 거의 움직일 수 없게 됩니다." -#: lang/json/ARMOR_from_json.py -msgid "MOLLE pack" -msgid_plural "MOLLE packs" -msgstr[0] "MOLLE 팩" - -#. ~ Description for MOLLE pack -#: lang/json/ARMOR_from_json.py -msgid "" -"The Modular Lightweight Load-carrying Equipment is an advanced military " -"backpack. Covered with pockets and straps, it strikes a fine balance " -"between storage space and encumbrance." -msgstr "" -"모듈형 경량 적재 운반 장비(Modular Lightweight Load-carrying Equipment)는 첨단 군용 배낭입니다. " -"주머니와 끈들로 뒤덮여있고, 저장 공간의 방해도 대비 효율이 뛰어납니다." - #: lang/json/ARMOR_from_json.py msgid "motorcycle armor" msgid_plural "motorcycle armors" @@ -9559,14 +9497,14 @@ msgstr "" #. ~ Use action holster_prompt for police duty belt. #: lang/json/ARMOR_from_json.py msgid "Attach what to holder?" -msgstr "" +msgstr "홀스터에 무얼 넣을까?" #. ~ Description for police duty belt #: lang/json/ARMOR_from_json.py msgid "" "Black leather belt used by police officers. It has several pouches and a " "holder for a baton." -msgstr "" +msgstr "경찰관들이 쓰는 검은 가죽 벨트. 수납 공간이 있고, 경찰봉을 넣을 수 있는 홀스터가 달려 있다." #: lang/json/ARMOR_from_json.py msgid "polo shirt" @@ -9651,16 +9589,6 @@ msgid "" "better than nothing." msgstr "냄비를 사용해서 만든 투구. 보호력은 높지 않지만, 없는 것보다는 낫습니다." -#: lang/json/ARMOR_from_json.py -msgid "purse" -msgid_plural "purses" -msgstr[0] "손가방" - -#. ~ Description for purse -#: lang/json/ARMOR_from_json.py -msgid "A bit cumbersome to wear, but provides some storage." -msgstr "착용하면 약간 불편하지만, 저장공간을 약간 제공합니다." - #: lang/json/ARMOR_from_json.py msgid "quiver" msgid_plural "quivers" @@ -9736,29 +9664,6 @@ msgid "" "hidden pockets." msgstr "잘 숨겨진 주머니가 이상하리 만큼 많고 소매가 달린 널널한 사이즈의 겉옷." -#: lang/json/ARMOR_from_json.py -msgid "military rucksack" -msgid_plural "military rucksacks" -msgstr[0] "군용 큰 배낭" - -#. ~ Description for military rucksack -#: lang/json/ARMOR_from_json.py -msgid "A huge military rucksack, provides a lot of storage." -msgstr "럭색이라고 불리기도 하는 커다란 군용 배낭으로, 대용량의 저장공간을 제공합니다." - -#: lang/json/ARMOR_from_json.py -msgid "runner pack" -msgid_plural "runner packs" -msgstr[0] "러너팩" - -#. ~ Description for runner pack -#: lang/json/ARMOR_from_json.py -msgid "" -"The obvious choice for outdoor athletes, this ergonomic backpack is light " -"and easy to wear, ensuring comfort when carrying heavy and bulky items." -msgstr "" -"야외 활동가에게 있어서 최선의 선택인 이 인체공학적 배낭은 가볍고 착용하기 쉬우며, 무겁고 부피가 큰 물건도 편하게 운반할 수 있습니다." - #: lang/json/ARMOR_from_json.py msgid "scabbard" msgid_plural "scabbards" @@ -10104,18 +10009,6 @@ msgstr[0] "민소매 튜닉" msgid "A sleeveless cloth garment that covers the torso and legs." msgstr "상체와 다리를 덮는 민소매 천옷." -#: lang/json/ARMOR_from_json.py -msgid "sling pack" -msgid_plural "sling packs" -msgstr[0] "슬링백" - -#. ~ Description for sling pack -#: lang/json/ARMOR_from_json.py -msgid "" -"A simple single-sling backpack. Easier to access than a normal backpack, " -"but can't comfortably hold as much." -msgstr "어깨걸이가 하나인 평범한 가방. 일반적인 배낭보다 메기 편하지만 그만큼 많이 담을 수는 없습니다." - #: lang/json/ARMOR_from_json.py msgid "snuggie" msgid_plural "snuggies" @@ -10365,8 +10258,8 @@ msgid_plural "survivor belts" msgstr[0] "생존용 벨트" #. ~ Use action holster_prompt for survivor belt. -#. ~ Use action holster_prompt for hiking backpack. #. ~ Use action holster_prompt for survivor utility belt. +#. ~ Use action holster_prompt for hiking backpack. #. ~ Use action holster_prompt for C.R.I.T web belt. #: lang/json/ARMOR_from_json.py msgid "Sheath blade" @@ -10382,18 +10275,6 @@ msgstr "" "수제 가죽 다용도벨트. 줄과 작은 칼을 넣을 수 있는 주머니가 달려 있습니다. 견고하고 착용시 편안하도록 만들여져 있습니다. 사용하면 " "무기를 넣거나 뺍니다." -#: lang/json/ARMOR_from_json.py -msgid "survivor duffel bag" -msgid_plural "survivor duffel bags" -msgstr[0] "생존용 더플백" - -#. ~ Description for survivor duffel bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built heavy duffel bag. Durable and carefully crafted to hold as " -"much stuff as possible." -msgstr "큼직한 맞춤형 더플백. 최대한 많은 물건을 집어넣을 수 있도록 튼튼하고 세심하게 만들어졌다." - #: lang/json/ARMOR_from_json.py msgid "survivor goggles" msgid_plural "pairs of survivor goggles" @@ -10407,42 +10288,6 @@ msgid "" msgstr "" "썬팅한 렌즈가 달린 수제 강화 고글. 편안하고 오래 쓸수 있도록 만들어 졌으며, 여러 환경적 위험에서 눈을 매우 효과적으로 보호합니다." -#: lang/json/ARMOR_from_json.py -msgid "survivor backpack" -msgid_plural "survivor backpacks" -msgstr[0] "생존용 배낭" - -#. ~ Description for survivor backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built backpack. Durable and carefully crafted to hold as much " -"stuff as possible." -msgstr "맞춤형 배낭. 최대한 많은 물건을 집어넣을 수 있도록 튼튼하고 세심하게 만들어졌다." - -#: lang/json/ARMOR_from_json.py -msgid "survivor rucksack" -msgid_plural "survivor rucksacks" -msgstr[0] "생존용 큰 배낭" - -#. ~ Description for survivor rucksack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built heavy backpack. Durable and carefully crafted to hold as " -"much stuff as possible." -msgstr "큼직한 맞춤형 배낭. 최대한 많은 물건을 집어넣을 수 있도록 튼튼하고 세심하게 만들어졌다." - -#: lang/json/ARMOR_from_json.py -msgid "survivor runner pack" -msgid_plural "survivor runner packs" -msgstr[0] "생존용 러너팩" - -#. ~ Description for survivor runner pack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built lightweight runner pack. Durable and carefully crafted to " -"hold as much stuff as possible." -msgstr "맞춤형 경량 러너팩. 최대한 많은 물건을 집어넣을 수 있도록 튼튼하고 세심하게 만들어졌다." - #: lang/json/ARMOR_from_json.py msgid "survivor suit" msgid_plural "survivor suits" @@ -10607,29 +10452,29 @@ msgstr "길고, 루즈한 핏의 폭넓은 소매가 달린 로브로, 아랍 #: lang/json/ARMOR_from_json.py msgid "bow tie" msgid_plural "bow ties" -msgstr[0] "" +msgstr[0] "보우타이" #. ~ Description for bow tie #: lang/json/ARMOR_from_json.py msgid "A simple black bow tie. Best worn with a suit." -msgstr "" +msgstr "세련된 검은색 보우타이. 정장과 잘 어울린다." #: lang/json/ARMOR_from_json.py msgid "clip-on tie" msgid_plural "clip-on ties" -msgstr[0] "" +msgstr[0] "클립 넥타이" #. ~ Description for clip-on tie #: lang/json/ARMOR_from_json.py msgid "" "A clip-on necktie, with blue and silver stripes. It's quick and easy to put" " on, and much better than the necktie." -msgstr "" +msgstr "청색과 은색 줄무늬가 그려진 넥타이. 클립이 달려 있어 일반 넥타이보다 사용하기 훨씬 편하다." #: lang/json/ARMOR_from_json.py msgid "necktie" msgid_plural "neckties" -msgstr[0] "" +msgstr[0] "넥타이" #. ~ Description for necktie #: lang/json/ARMOR_from_json.py @@ -10637,7 +10482,7 @@ msgid "" "An ordinary, green necktie. It's more difficult to put on, but it takes " "real skill to do so. Wearing a necktie is much better than wearing a clip-" "on tie." -msgstr "" +msgstr "평범한 녹색 넥타이. 이걸 혼자 맬 줄 안다면 당신은 진정한 비즈니스맨." #: lang/json/ARMOR_from_json.py msgid "tights" @@ -10808,39 +10653,41 @@ msgstr "" #: lang/json/ARMOR_from_json.py msgid "tour t-shirt" msgid_plural "tour t-shirts" -msgstr[0] "" +msgstr[0] "그림 티셔츠" #: lang/json/ARMOR_from_json.py msgid "" "A short-sleeved cotton shirt with a death metal band's spidery, " "indecipherable logo printed on the front." -msgstr "" +msgstr "코믹월드 같은 데에서 보일만한 반팔 면티. 애니 그림이 그려져 있다." #: lang/json/ARMOR_from_json.py msgid "" "A short-sleeved cotton shirt with a muscle-bound, long-haired man printed on" " the front. He is riding a red dragon and wielding a flaming sword with " "malicious glee." -msgstr "" +msgstr "밴드 콘서트에서 팔듯한 반팔 면티. 드래곤에 탄 채 화염 칼을 휘두르는 마초맨이 그려져 있다." #: lang/json/ARMOR_from_json.py msgid "" "A short-sleeved cotton shirt with a gore-spattered, guitar-playing zombie " "printed on the front. It's rather tasteless in light of current events." msgstr "" +"밴드 콘서트에서 볼 만한 반팔 면티. 그로스테크하게 생긴 좀비가 기타를 치고 있다. 요즘 분위기를 보아 이런 거 입고 다니면 욕 먹기 딱" +" 좋을 것 같다." #: lang/json/ARMOR_from_json.py msgid "" "A short-sleeved cotton shirt with a pattern of complex geometric shapes and " "transcendental imagery printed on the front." -msgstr "" +msgstr "테마파크 기념품점에서 팔 만한 반팔 면티. 난해한 기하학적 모양이 가득하다. 뒷면에는 어느 로고가 박혀 있다." #: lang/json/ARMOR_from_json.py msgid "" "A short-sleeved cotton shirt with an image of a woman's face in portrait " "printed on the front. She is wearing a large blue mohawk, her face is set " "in a snarl." -msgstr "" +msgstr "락 밴드 콘서트에서 팔 만한 반팔 면티. 온갖 피어싱과 문신을 한 여성이 기괴한 표정을 짓고 있다." #: lang/json/ARMOR_from_json.py msgid "" @@ -11174,7 +11021,7 @@ msgstr "" #: lang/json/ARMOR_from_json.py msgid "XL heavy survivor suit" msgid_plural "XL heavy survivor suits" -msgstr[0] "" +msgstr[0] "특대 중형 생존자 슈트" #. ~ Description for XL heavy survivor suit #: lang/json/ARMOR_from_json.py @@ -11183,6 +11030,8 @@ msgid "" "bulletproof vest and a metal-plated leather jumpsuit. Protects from the " "elements as well as from harm." msgstr "" +"육중한 무게의 수제 갑옷. 거대한 가죽 전신 슈트에 방탄복과 금속 장갑이 덧대어 있다. 각종 피해로부터 몸을 보호해주지만 몸이 작은 " +"일반인에게는 맞지 않는다." #: lang/json/ARMOR_from_json.py msgid "zubon" @@ -11240,7 +11089,7 @@ msgstr "" #: lang/json/ARMOR_from_json.py msgid "Hub 01 enviromental suit" msgid_plural "Hub 01 enviromental suits" -msgstr[0] "" +msgstr[0] "허브 01 환경차폐복" #. ~ Description for Hub 01 enviromental suit #: lang/json/ARMOR_from_json.py @@ -11250,6 +11099,8 @@ msgid "" "embroidered on both of its upper arms. It requires a separate gas mask for " "full protection." msgstr "" +"허브 01 대원들이 입는 가벼운 환경차폐복. 갈색과 푸른색으로 칠해져 있으며 어깨에 커다랗게 허브 01 로고가 박혀 있다. 완전한 보호를" +" 위해선 방독면이 따로 필요하다." #: lang/json/ARMOR_from_json.py msgid "entry suit" @@ -11289,29 +11140,6 @@ msgid "" "stereotypical cap golfers wear." msgstr "이게 정말 골프모자라고 부르는지 모르겠지만 흔히 골프치는 사람들이 쓰는 전형적인 모자." -#: lang/json/ARMOR_from_json.py -msgid "golf bag" -msgid_plural "golf bags" -msgstr[0] "골프 가방" - -#. ~ Use action holster_msg for golf bag. -#: lang/json/ARMOR_from_json.py -#, no-python-format -msgid "You awkwardly sheath your %s" -msgstr "서투르게 %s을(를) 집어넣었다." - -#. ~ Use action holster_prompt for golf bag. -#: lang/json/ARMOR_from_json.py -msgid "Sheath golf club" -msgstr "골프채 집어넣기" - -#. ~ Description for golf bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A tall canvas and plastic bag with fold-out legs used for golfing. It even " -"has straps to be worn on the back." -msgstr "골프에서 쓰이는 접이식 다리가 달린 캔버스천과 플라스틱으로 만들어진 긴 가방. 등에 매기 위한 스트랩도 있습니다." - #: lang/json/ARMOR_from_json.py msgid "javelin bag" msgid_plural "javelin bags" @@ -11406,62 +11234,6 @@ msgid "" "Useful for improvised rain protection." msgstr "비닐 시트에 밧줄과 끈을 매달 고리를 달아 놓은것. 급하게 비를 막아야 할 때 유용하게 쓰입니다." -#: lang/json/ARMOR_from_json.py -msgid "high-volume rucksack" -msgid_plural "high-volume rucksacks" -msgstr[0] "" - -#. ~ Description for high-volume rucksack -#: lang/json/ARMOR_from_json.py -msgid "" -"Also know as a \"bigpack\", this rucksack is prized by pack rats but may " -"lead to a bad back." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "hiking backpack" -msgid_plural "hiking backpacks" -msgstr[0] "" - -#. ~ Description for hiking backpack -#: lang/json/ARMOR_from_json.py -msgid "A large sized hiking backpack with plenty of storage space." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "petpack" -msgid_plural "petpacks" -msgstr[0] "" - -#. ~ Description for petpack -#: lang/json/ARMOR_from_json.py -msgid "" -"Before the Cataclysm this would allow your four-legged friend to see the " -"world, now it's used to shield them from the world." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "large tactical backpack" -msgid_plural "large tactical backpacks" -msgstr[0] "" - -#. ~ Description for large tactical backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A large tactical multi-compartment backpack that has great lower back " -"support." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "travelpack" -msgid_plural "travelpacks" -msgstr[0] "" - -#. ~ Description for travelpack -#: lang/json/ARMOR_from_json.py -msgid "A hiking pack used for short trips." -msgstr "" - #: lang/json/ARMOR_from_json.py msgid "survivor utility belt" msgid_plural "survivor utility belts" @@ -11659,13 +11431,295 @@ msgstr "" #: lang/json/ARMOR_from_json.py msgid "XL kevlar vest" msgid_plural "XL kevlar vests" -msgstr[0] "" +msgstr[0] "특대 케블라 조끼" #. ~ Description for XL kevlar vest #: lang/json/ARMOR_from_json.py msgid "" "A massive, hand-built kevlar vest based on the design of existing bullet " "resistant vests. It has four pouches capable of carrying magazines." +msgstr "일반인용 방탄복을 본따 만든 거대한 수제 케블라 조끼. 탄창 수납용 파우치가 4개 달려 있다. 일반인에게는 맞지 않는다." + +#: lang/json/ARMOR_from_json.py +msgid "backpack" +msgid_plural "backpacks" +msgstr[0] "배낭" + +#. ~ Description for backpack +#: lang/json/ARMOR_from_json.py +msgid "A small backpack. Good storage for a little encumbrance." +msgstr "작은 배낭. 적은 방해도에 괜찮은 저장공간이 있습니다." + +#: lang/json/ARMOR_from_json.py +msgid "hiking backpack" +msgid_plural "hiking backpacks" +msgstr[0] "산악용 백팩" + +#. ~ Description for hiking backpack +#: lang/json/ARMOR_from_json.py +msgid "A large sized hiking backpack with plenty of storage space." +msgstr "산악이나 아웃도어 활동을 위한 백팩. 수납 공간이 넓고 무게 분산이 뛰어나다." + +#: lang/json/ARMOR_from_json.py +msgid "giant novelty backpack" +msgid_plural "giant novelty backpacks" +msgstr[0] "거대한 노벨티 배낭" + +#. ~ Description for giant novelty backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A huge fabric backpack made mostly as a joke before the cataclysm. Now, " +"it's still rather silly, but it can store a lot of stuff." +msgstr "대재앙 이전에 장난으로 만들어진 거대한 천 가방입니다. 지금도 바보같아 보이지만 많은 것들을 넣을 수 있습니다." + +#: lang/json/ARMOR_from_json.py +msgid "leather backpack" +msgid_plural "leather backpacks" +msgstr[0] "가죽 배낭" + +#. ~ Description for leather backpack +#: lang/json/ARMOR_from_json.py +msgid "A small leather backpack. Good storage for a little encumbrance." +msgstr "작은 가죽 배낭. 조금 불편하지만, 준수한 저장공간을 제공합니다." + +#: lang/json/ARMOR_from_json.py +msgid "large tactical backpack" +msgid_plural "large tactical backpacks" +msgstr[0] "대형 택티컬 배낭" + +#. ~ Description for large tactical backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A large tactical multi-compartment backpack that has great lower back " +"support." +msgstr "허리 지지대와 고정끈이 있는 커다란 배낭. 수납 공간이 넓고 사용하기 편하게 칸막이가 있다." + +#: lang/json/ARMOR_from_json.py +msgid "high-volume rucksack" +msgid_plural "high-volume rucksacks" +msgstr[0] "대용량 배낭" + +#. ~ Description for high-volume rucksack +#: lang/json/ARMOR_from_json.py +msgid "" +"Also know as a \"bigpack\", this rucksack is prized by pack rats but may " +"lead to a bad back." +msgstr "\"대낭\" 이라고도 불리는 커다란 배낭. 뭐 옮기기에는 이만한 게 없지만, 발 삐끗해서 허리가 아작난 사람들이 한둘이 아니다." + +#: lang/json/ARMOR_from_json.py +msgid "dive bag" +msgid_plural "dive bags" +msgstr[0] "잠수용 가방" + +#. ~ Description for dive bag +#: lang/json/ARMOR_from_json.py +msgid "A lightweight mesh backpack, commonly worn by swimmers and divers." +msgstr "흔히 수영하는 사람이나 잠수부가 사용하는 가벼운 그물 가방입니다." + +#: lang/json/ARMOR_from_json.py +msgid "duffel bag" +msgid_plural "duffel bags" +msgstr[0] "더플백" + +#. ~ Description for duffel bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A huge duffel bag. Provides plenty of storage, but is severely encumbering." +msgstr "커다란 더플백. 대용량의 저장공간을 제공하지만, 상당히 불편합니다." + +#: lang/json/ARMOR_from_json.py +msgid "petpack" +msgid_plural "petpacks" +msgstr[0] "반려동물 가방" + +#. ~ Description for petpack +#: lang/json/ARMOR_from_json.py +msgid "" +"Before the Cataclysm this would allow your four-legged friend to see the " +"world, now it's used to shield them from the world." +msgstr "중소형 반려동물이 편하게 들어갈 사이즈의 가방." + +#: lang/json/ARMOR_from_json.py +msgid "jerrypack" +msgid_plural "jerrypacks" +msgstr[0] "기름통 가방" + +#. ~ Description for jerrypack +#: lang/json/ARMOR_from_json.py +msgid "A jerrycan modified to be worn in a similar manner to a backpack." +msgstr "가방 처럼 착용 할 수 있도록 개조한 기름통." + +#: lang/json/ARMOR_from_json.py +msgid "makeshift knapsack" +msgid_plural "makeshift knapsacks" +msgstr[0] "급조 배낭" + +#. ~ Description for makeshift knapsack +#: lang/json/ARMOR_from_json.py +msgid "" +"A pair of pants with the bottom ends tied with string, and then passed " +"through the belt loops so the knapsack can be carried on the back." +msgstr "바지 밑단을 끈으로 묶고, 벨트로 어깨 줄을 만든 가방." + +#: lang/json/ARMOR_from_json.py +msgid "makeshift sling" +msgid_plural "makeshift slings" +msgstr[0] "대충 만든 포대" + +#. ~ Description for makeshift sling +#: lang/json/ARMOR_from_json.py +msgid "A large sheet tied into a crude, over-the-shoulder sling." +msgstr "큰 천을 묶어서 임시 슬링으로 만든것." + +#: lang/json/ARMOR_from_json.py +msgid "messenger bag" +msgid_plural "messenger bags" +msgstr[0] "메신저백" + +#. ~ Description for messenger bag +#: lang/json/ARMOR_from_json.py +msgid "Light and easy to wear, but doesn't offer much storage." +msgstr "가방의 한쪽 줄을 어깨에 매는 형태의 가방. 가볍고 착용하기 편하지만, 저장공간이 많지 않습니다." + +#: lang/json/ARMOR_from_json.py +msgid "MOLLE pack" +msgid_plural "MOLLE packs" +msgstr[0] "MOLLE 팩" + +#. ~ Description for MOLLE pack +#: lang/json/ARMOR_from_json.py +msgid "" +"The Modular Lightweight Load-carrying Equipment is an advanced military " +"backpack. Covered with pockets and straps, it strikes a fine balance " +"between storage space and encumbrance." +msgstr "" +"모듈형 경량 적재 운반 장비(Modular Lightweight Load-carrying Equipment)는 첨단 군용 배낭입니다. " +"주머니와 끈들로 뒤덮여있고, 저장 공간의 방해도 대비 효율이 뛰어납니다." + +#: lang/json/ARMOR_from_json.py +msgid "purse" +msgid_plural "purses" +msgstr[0] "손가방" + +#. ~ Description for purse +#: lang/json/ARMOR_from_json.py +msgid "A bit cumbersome to wear, but provides some storage." +msgstr "착용하면 약간 불편하지만, 저장공간을 약간 제공합니다." + +#: lang/json/ARMOR_from_json.py +msgid "military rucksack" +msgid_plural "military rucksacks" +msgstr[0] "군용 큰 배낭" + +#. ~ Description for military rucksack +#: lang/json/ARMOR_from_json.py +msgid "A huge military rucksack, provides a lot of storage." +msgstr "럭색이라고 불리기도 하는 커다란 군용 배낭으로, 대용량의 저장공간을 제공합니다." + +#: lang/json/ARMOR_from_json.py +msgid "runner pack" +msgid_plural "runner packs" +msgstr[0] "러너팩" + +#. ~ Description for runner pack +#: lang/json/ARMOR_from_json.py +msgid "" +"The obvious choice for outdoor athletes, this ergonomic backpack is light " +"and easy to wear, ensuring comfort when carrying heavy and bulky items." +msgstr "" +"야외 활동가에게 있어서 최선의 선택인 이 인체공학적 배낭은 가볍고 착용하기 쉬우며, 무겁고 부피가 큰 물건도 편하게 운반할 수 있습니다." + +#: lang/json/ARMOR_from_json.py +msgid "sling pack" +msgid_plural "sling packs" +msgstr[0] "슬링백" + +#. ~ Description for sling pack +#: lang/json/ARMOR_from_json.py +msgid "" +"A simple single-sling backpack. Easier to access than a normal backpack, " +"but can't comfortably hold as much." +msgstr "어깨걸이가 하나인 평범한 가방. 일반적인 배낭보다 메기 편하지만 그만큼 많이 담을 수는 없습니다." + +#: lang/json/ARMOR_from_json.py +msgid "survivor duffel bag" +msgid_plural "survivor duffel bags" +msgstr[0] "생존용 더플백" + +#. ~ Description for survivor duffel bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built heavy duffel bag. Durable and carefully crafted to hold as " +"much stuff as possible." +msgstr "큼직한 맞춤형 더플백. 최대한 많은 물건을 집어넣을 수 있도록 튼튼하고 세심하게 만들어졌다." + +#: lang/json/ARMOR_from_json.py +msgid "survivor backpack" +msgid_plural "survivor backpacks" +msgstr[0] "생존용 배낭" + +#. ~ Description for survivor backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built backpack. Durable and carefully crafted to hold as much " +"stuff as possible." +msgstr "맞춤형 배낭. 최대한 많은 물건을 집어넣을 수 있도록 튼튼하고 세심하게 만들어졌다." + +#: lang/json/ARMOR_from_json.py +msgid "survivor rucksack" +msgid_plural "survivor rucksacks" +msgstr[0] "생존용 큰 배낭" + +#. ~ Description for survivor rucksack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built heavy backpack. Durable and carefully crafted to hold as " +"much stuff as possible." +msgstr "큼직한 맞춤형 배낭. 최대한 많은 물건을 집어넣을 수 있도록 튼튼하고 세심하게 만들어졌다." + +#: lang/json/ARMOR_from_json.py +msgid "survivor runner pack" +msgid_plural "survivor runner packs" +msgstr[0] "생존용 러너팩" + +#. ~ Description for survivor runner pack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built lightweight runner pack. Durable and carefully crafted to " +"hold as much stuff as possible." +msgstr "맞춤형 경량 러너팩. 최대한 많은 물건을 집어넣을 수 있도록 튼튼하고 세심하게 만들어졌다." + +#: lang/json/ARMOR_from_json.py +msgid "golf bag" +msgid_plural "golf bags" +msgstr[0] "골프 가방" + +#. ~ Use action holster_msg for golf bag. +#: lang/json/ARMOR_from_json.py +#, no-python-format +msgid "You awkwardly sheath your %s" +msgstr "서투르게 %s을(를) 집어넣었다." + +#. ~ Use action holster_prompt for golf bag. +#: lang/json/ARMOR_from_json.py +msgid "Sheath golf club" +msgstr "골프채 집어넣기" + +#. ~ Description for golf bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A tall canvas and plastic bag with fold-out legs used for golfing. It even " +"has straps to be worn on the back." +msgstr "골프에서 쓰이는 접이식 다리가 달린 캔버스천과 플라스틱으로 만들어진 긴 가방. 등에 매기 위한 스트랩도 있습니다." + +#: lang/json/ARMOR_from_json.py +msgid "travelpack" +msgid_plural "travelpacks" +msgstr[0] "" + +#. ~ Description for travelpack +#: lang/json/ARMOR_from_json.py +msgid "A hiking pack used for short trips." msgstr "" #: lang/json/ARMOR_from_json.py @@ -11693,26 +11747,26 @@ msgstr "소총탄을 빠르게 꺼낼 수 있게 만들어진 가죽 탄약대." #: lang/json/ARMOR_from_json.py msgid "waist shotgun bandolier" msgid_plural "waist shotgun bandoliers" -msgstr[0] "" +msgstr[0] "손목 산탄총 탄띠" #. ~ Description for waist shotgun bandolier #: lang/json/ARMOR_from_json.py msgid "" "A leather bandolier worn around the waist for keeping shotgun shells close " "to hand." -msgstr "" +msgstr "빠른 재장전을 위해 손목에 두르는 가죽 탄띠." #: lang/json/ARMOR_from_json.py msgid "torso shotgun bandolier" msgid_plural "torso shotgun bandoliers" -msgstr[0] "" +msgstr[0] "흉부 산탄총 탄띠" #. ~ Description for torso shotgun bandolier #: lang/json/ARMOR_from_json.py msgid "" "A leather bandolier strapped around the torso for keeping shotgun shells " "close to hand." -msgstr "" +msgstr "빠른 재장전을 위해 몸통에 두르는 가죽 탄띠." #: lang/json/ARMOR_from_json.py msgid "paper cartridge pouch" @@ -11948,12 +12002,12 @@ msgstr "고무장화 한 쌍으로, 주로 부식성 물질을 사용하여 청 #: lang/json/ARMOR_from_json.py msgid "pair of scrap boots" msgid_plural "pairs of scrap boots" -msgstr[0] "" +msgstr[0] "고철 부츠" #. ~ Description for pair of scrap boots #: lang/json/ARMOR_from_json.py msgid "Boots made of random scraps." -msgstr "" +msgstr "고철로 만든 신발 비슷한 무언가. 굉장히 거추장스럽다." #: lang/json/ARMOR_from_json.py msgid "pair of steeltoed boots" @@ -12941,14 +12995,14 @@ msgstr "" #: lang/json/ARMOR_from_json.py msgid "platinum dental grill" msgid_plural "platinum dental grills" -msgstr[0] "" +msgstr[0] "백금니" #. ~ Description for platinum dental grill #: lang/json/ARMOR_from_json.py msgid "" "Fake platinum-and-silver teeth. They may be cheaper than fake gold teeth, " "but they're much more rare. Fits horribly, but looks very shiny." -msgstr "" +msgstr "이에 끼우는 백금과 은 장식. 나름 멋져 보이지만 뭔가 먹을 땐 걸리적거린다." #. ~ Description for gold earring #: lang/json/ARMOR_from_json.py @@ -14471,18 +14525,6 @@ msgid "" " turn more often than massive objects." msgstr "" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Advanced Microreactor CBM" -msgid_plural "Advanced Microreactor CBMs" -msgstr[0] "CBM:개선형 소형반응로" - -#. ~ Description for Advanced Microreactor CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"This module upgrades a pre-installed microreactor with enhanced maximum " -"yield and limited automatic radiation scrubbing capabilities." -msgstr "" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Alarm System CBM" msgid_plural "Alarm System CBMs" @@ -15185,18 +15227,6 @@ msgid "" "cause delayed reaction times and drowsiness." msgstr "" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Plutonium Filter CBM" -msgid_plural "Plutonium Filter CBMs" -msgstr[0] "CBM:플루토늄 필터" - -#. ~ Description for Plutonium Filter CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A system of tanks and filters that are connected to a microreactor to " -"extract plutonium from radioactive slurry." -msgstr "" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Power Armor Interface CBM" msgid_plural "Power Armor Interface CBMs" @@ -15315,31 +15345,6 @@ msgid "" "unarmed slashing damage whenever the user's fingertips are uncovered." msgstr "" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Internal Microreactor CBM" -msgid_plural "Internal Microreactor CBMs" -msgstr[0] "CBM:내장 소형반응로" - -#. ~ Description for Internal Microreactor CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"This stripped down mini-reactor will generate impressive amounts of bionic " -"power, but may not be the safest thing to install. Once active, it cannot " -"be shut down and will slowly contaminate the user's body with radiation." -msgstr "" - -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Microreactor Upgrade CBM" -msgid_plural "Microreactor Upgrade CBMs" -msgstr[0] "CBM:소형반응로 업그레이드" - -#. ~ Description for Microreactor Upgrade CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A kit for upgrading a pre-installed microreactor with enhanced maximum yield" -" and limited automatic radiation scrubbing capabilities." -msgstr "" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Recycler Unit CBM" msgid_plural "Recycler Unit CBMs" @@ -15928,6 +15933,55 @@ msgid "" "may carry an extra 2 liters of volume." msgstr "상체 내부 공간을 저장공간으로 개조하였습니다. 2리터 만큼의 저장공간을 추가로 얻습니다." +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Advanced Microreactor CBM" +msgid_plural "Advanced Microreactor CBMs" +msgstr[0] "CBM:개선형 소형반응로" + +#. ~ Description for Advanced Microreactor CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"This module upgrades a pre-installed microreactor with enhanced maximum " +"yield and limited automatic radiation scrubbing capabilities." +msgstr "" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Plutonium Filter CBM" +msgid_plural "Plutonium Filter CBMs" +msgstr[0] "CBM:플루토늄 필터" + +#. ~ Description for Plutonium Filter CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A system of tanks and filters that are connected to a microreactor to " +"extract plutonium from radioactive slurry." +msgstr "" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Internal Microreactor CBM" +msgid_plural "Internal Microreactor CBMs" +msgstr[0] "CBM:내장 소형반응로" + +#. ~ Description for Internal Microreactor CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"This stripped down mini-reactor will generate impressive amounts of bionic " +"power, but may not be the safest thing to install. Once active, it cannot " +"be shut down and will slowly contaminate the user's body with radiation." +msgstr "" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Microreactor Upgrade CBM" +msgid_plural "Microreactor Upgrade CBMs" +msgstr[0] "CBM:소형반응로 업그레이드" + +#. ~ Description for Microreactor Upgrade CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A kit for upgrading a pre-installed microreactor with enhanced maximum yield" +" and limited automatic radiation scrubbing capabilities." +msgstr "" + #. ~ Description for Solar Panels CBM #: lang/json/BIONIC_ITEM_from_json.py msgid "" @@ -18242,26 +18296,26 @@ msgstr "인식론과 논리에 중점을 둔, 도덕성에 대한 심도있는 #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Nietzsche's \"Beyond Good and Evil\". Its cover is dog-" +"This is a copy of Nietzsche's \"Beyond Good and Evil\". Its cover is dog-" "eared and creased." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"The Unique and Its Property\" by Max Stirner. A modern " +"This is a copy of \"The Unique and Its Property\" by Max Stirner. A modern " "translation by Wolfi Landstreicher." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Jean-Paul Sartre's \"Being and Nothingness\". A key work " +"This is a copy of Jean-Paul Sartre's \"Being and Nothingness\". A key work " "in the existentialist tradition." msgstr "" #: lang/json/BOOK_from_json.py msgid "" "A large, extended version of \"Madness and Civilisation\" by Michel " -"Foucault. The cover features a striking image of a Panopticonic Prison." +"Foucault. The cover features a striking image of a Panopticonic Prison." msgstr "" #: lang/json/BOOK_from_json.py @@ -18272,13 +18326,13 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"A collection of texts and essays by Jacques Derrida. It's pages loose and " +"A collection of texts and essays by Jacques Derrida. It's pages loose and " "yellowed, you should probably handle it with care." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Society of the Spectacle\" by Guy Debord. Its cover " +"This is a copy of \"Society of the Spectacle\" by Guy Debord. Its cover " "shows rows of adults staring placidly into a screen." msgstr "" @@ -18290,36 +18344,36 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Baudrillard's \"Simulation and Simulacra\". The cover " +"This is a copy of Baudrillard's \"Simulation and Simulacra\". The cover " "contains an image of a man holding a colored pill in each hand, with the " -"caption \"Welcome to the Desert of the Real.\". You think you've seen this " +"caption \"Welcome to the Desert of the Real.\". You think you've seen this " "movie." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a small, pocket version of Sartre's \"Existentialism and Humanism.\"" -" It looks to have been used as a coaster in a past life." +"This is a small, pocket version of Sartre's \"Existentialism and Humanism\"." +" It looks to have been used as a coaster in a past life." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Practical Ethics\" by Peter Singer. From the local " +"This is a copy of \"Practical Ethics\" by Peter Singer. From the local " "university press." msgstr "" #: lang/json/BOOK_from_json.py msgid "" "This is a photocopied spiral-bound copy of \"Industrial Society and Its " -"Future\" by 'Freedom Club'. The original looks to have been written on a " +"Future\" by 'Freedom Club'. The original looks to have been written on a " "typewriter before being copied." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Industrial Society and Its Future\" by Ted Kaczynski. " +"This is a copy of \"Industrial Society and Its Future\" by Ted Kaczynski. " "Its cover is an image of a hand-crafted wooden box filled with wiring and an" -" ominous looking metal tube. Provocative." +" ominous looking metal tube. Provocative." msgstr "" #: lang/json/BOOK_from_json.py @@ -18328,23 +18382,23 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"The State and Revolution\" by Vladimir Lenin. In " +"This is a copy of \"The State and Revolution\" by Vladimir Lenin. In " "English, thankfully." msgstr "" #: lang/json/BOOK_from_json.py -msgid "This is a copy of \"In Defence of Terrorism\" by Leon Trotsky." +msgid "This is a copy of \"In Defense of Marxism\" by Leon Trotsky." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Steal This Book\" by Abbie Hoffman. There is a security " -"tag on the back cover. It appears to still be active." +"This is a copy of \"Steal This Book\" by Abbie Hoffman. There is a security" +" tag on the back cover. It appears to still be active." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Walden: Or Life In The Woods\" by Henry David Thoreau. " +"This is a copy of \"Walden: Or Life In The Woods\" by Henry David Thoreau. " "It contains a dried and pressed leaf as a bookmark." msgstr "" @@ -18365,7 +18419,7 @@ msgid "" msgstr "" #: lang/json/BOOK_from_json.py -msgid "This is a copy of Machiavelli's \"The Prince\". With intro by Q. Skinner." +msgid "This is a copy of Machiavelli's \"The Prince\". With intro by Q. Skinner." msgstr "" #: lang/json/BOOK_from_json.py @@ -18375,12 +18429,12 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a pocket copy of \"An Essay on Liberation\" by Herbert Marcuse. The " -"cover contains an image of a pelican." +"This is a pocket copy of \"An Essay on Liberation\" by Herbert Marcuse. The" +" cover contains an image of a pelican." msgstr "" #: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Either-Or\" by Sören Kierkegaard." +msgid "This is a copy of \"Either-Or\" by Søren Kierkegaard." msgstr "" #: lang/json/BOOK_from_json.py @@ -18405,6 +18459,69 @@ msgid "" "Science\" by Friederich Nietzsche." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Myth of Sisyphus\", and other essays, by Albert " +"Camus. The cover depicts a bare-chested man and a large boulder." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Sickness Unto Death\" by Søren Kierkegaard. The " +"pages are dotted with post-it notes." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Defence of Terrorism\" by Leon Trotsky. Despite the" +" title, it does not actually appear to be defending terrorism." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Enquiry Concerning Political Justice\" by William " +"Godwin. This thick book is filled with antiquated phrases." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Abolition of Work and Other Essays\" by Bob Black. " +"It is likely that \"The Abolition of Work\" is the most famous essay in this" +" book." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"What is Property?\" by Pierre-Joseph Proudhon. It looks" +" like this book has a surprisingly long track record of owners." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Conquest of Bread\" by Peter Kropotkin. There is a " +"picture of an old philosopher with magnificent beard, instead of bread, on " +"the cover." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Trouble with Being Born\" by Emil Cioran. This book" +" might have been printed decades before the cataclysm since the cover is " +"quite weathered." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The World as Will and Representation\" by Arthur " +"Schopenhauer. It contains a few undecipherable notes and scribbles." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Up-Wingers: A Futurist Manifesto\" by FM-2030. It seems" +" that the author's real name is Fereidoun M. Esfandiary." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "phone book" msgid_plural "phone books" @@ -20008,8 +20125,8 @@ msgstr[0] "" msgid "" "This useful stuff is a potent solvent and has a wide range of reactive " "applications. It can be used to make a huge number of plastics and " -"polymers, it can be a disinfectant, it can strip paint and break down epoxy," -" and it can burn your skin away like tissue paper under a heat gun. Wear " +"polymers, it can be an antiseptic, it can strip paint and break down epoxy, " +"and it can burn your skin away like tissue paper under a heat gun. Wear " "gloves." msgstr "" @@ -24963,9 +25080,9 @@ msgstr[0] "가루 소독제" #. ~ Description for antiseptic powder #: lang/json/COMESTIBLE_from_json.py msgid "" -"A powdered form of chemical disinfectant, this bismuth formic iodide cleans " +"A powdered form of chemical antiseptic, this bismuth formic iodide cleans " "wounds quickly and painlessly." -msgstr "가루형 소독제. 비스무트 요오드포름은 상처를 빠르고 고통 없이 치료하는데 쓰인다." +msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "caffeinated chewing gum" @@ -25011,10 +25128,10 @@ msgstr[0] "과산화수소" #. ~ Description for hydrogen peroxide #: lang/json/COMESTIBLE_from_json.py msgid "" -"Dilute hydrogen peroxide, for use as a disinfectant and for bleaching hair " -"or textiles. Foams a little when in contact with organic matter, but " +"Dilute hydrogen peroxide, for use as an antiseptic and for bleaching hair or" +" textiles. Foams a little when in contact with organic matter, but " "otherwise harmless." -msgstr "희석한 과산화 수소. 감염을 막거나 머리카락 또는 실을 탈색하는데 쓰인다. 유기물과 접촉하면 거품이 일지만 해는 없다." +msgstr "" #: lang/json/COMESTIBLE_from_json.py lang/json/GENERIC_from_json.py msgid "cigarette" @@ -25162,23 +25279,23 @@ msgstr "" " 먹는다 해도 여전히 많은 휴식과 따뜻한 음료가 필요합니다." #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant" -msgstr "소독약" +msgid "antiseptic" +msgstr "" -#. ~ Description for disinfectant +#. ~ Description for antiseptic #: lang/json/COMESTIBLE_from_json.py -msgid "A powerful disinfectant commonly used for contaminated wounds." -msgstr "일반적으로 오염된 상처에 사용되는, 강력한 소독약입니다." +msgid "A powerful antiseptic commonly used for contaminated wounds." +msgstr "" #: lang/json/COMESTIBLE_from_json.py -msgid "makeshift disinfectant" -msgstr "간이 소독약" +msgid "makeshift antiseptic" +msgstr "" -#. ~ Description for makeshift disinfectant +#. ~ Description for makeshift antiseptic #: lang/json/COMESTIBLE_from_json.py msgid "" -"Makeshift disinfectant made from ethanol. Can be used to disinfect a wound." -msgstr "에탄올로 만든 소독약. 상처를 소독하는데 사용한다." +"Makeshift antiseptic made from ethanol. Can be used to disinfect a wound." +msgstr "" #: lang/json/COMESTIBLE_from_json.py src/addiction.cpp msgid "diazepam" @@ -25529,8 +25646,8 @@ msgstr "백리향 기름" #: lang/json/COMESTIBLE_from_json.py msgid "" "Some essential oil made from thyme, which can act as a mildly irritating " -"disinfectant." -msgstr "백리향에서 추출한 기름. 조금 약하지만 소독약으로 쓸 수 있습니다." +"antiseptic." +msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "rolling tobacco" @@ -25719,26 +25836,26 @@ msgstr "" " 보통은 알프라졸람이라고 부른다." #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant soaked rag" -msgid_plural "disinfectant soaked rags" -msgstr[0] "소독한 천 조각" +msgid "antiseptic soaked rag" +msgid_plural "antiseptic soaked rags" +msgstr[0] "" -#. ~ Description for disinfectant soaked rag +#. ~ Description for antiseptic soaked rag #: lang/json/COMESTIBLE_from_json.py msgid "" -"A rag soaked in disinfectant. Useful for light wounds, probaby won't help " -"with deep bites." +"A rag soaked in antiseptic. Useful for light wounds, probaby won't help with" +" deep bites." msgstr "" #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant soaked cotton balls" -msgid_plural "disinfectant soaked cotton balls" -msgstr[0] "소독한 목화송이" +msgid "antiseptic soaked cotton balls" +msgid_plural "antiseptic soaked cotton balls" +msgstr[0] "" -#. ~ Description for disinfectant soaked cotton balls +#. ~ Description for antiseptic soaked cotton balls #: lang/json/COMESTIBLE_from_json.py msgid "" -"Fluffy balls of clean white cotton. Now soaked with disinfectant, they are " +"Fluffy balls of clean white cotton. Now soaked with antiseptic, they are " "somewhat useful to disinfect a wound." msgstr "" @@ -28235,6 +28352,19 @@ msgstr[0] "잼 샌드위치" msgid "A delicious jam sandwich." msgstr "맛있는 잼 샌드위치." +#: lang/json/COMESTIBLE_from_json.py +msgid "fairy bread" +msgid_plural "fairy bread" +msgstr[0] "" + +#. ~ Description for fairy bread +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"An 'open-faced sandwich' consisting of sliced white bread, a healthy crust-" +"to-crust slathering of butter, and sprinkles. Supposedly a staple of " +"birthday parties in Australia." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "honey sandwich" msgid_plural "honey sandwiches" @@ -29358,6 +29488,20 @@ msgid "" "its own." msgstr "달콤하고도, 달콤한 설탕. 치아 건강에 좋지 않으며, 놀랍게도 이것 자체는 그다지 맛이 없다." +#: lang/json/COMESTIBLE_from_json.py +msgid "sprinkles" +msgid_plural "sprinkles" +msgstr[0] "" + +#. ~ Description for sprinkles +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Known as nonpareils, sprinkles, jimmies, sugar strands or 'hundreds-and-" +"thousands', these colorful balls, rods or flakes of sugar and starch are " +"intended for use decorating soft surfaces of sweets. Like sugar, they are " +"bad for your teeth and surprisingly not very tasty on their own." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "wild herbs" msgid_plural "wild herbs" @@ -33627,6 +33771,20 @@ msgstr "" "최첨단 광학 스토리지 시스템. 작은 무늬로 새겨진 이 작은 투명 유리 판은 나노 제조기를 통해 물건을 만드는 데 필요한 지침을 담고 " "있다." +#: lang/json/GENERIC_from_json.py +msgid "nanofabricator template (silicon photonics)" +msgid_plural "nanofabricator template (silicon photonics)s" +msgstr[0] "" + +#. ~ Description for nanofabricator template (silicon photonics) +#: lang/json/GENERIC_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "antenna" msgid_plural "antennas" @@ -37963,7 +38121,7 @@ msgstr[0] "" #. ~ Description for .300BLK casing #: lang/json/GENERIC_from_json.py -msgid "An empty casing from a .300BLK round." +msgid "An empty casing from a .300 AAC Blackout round." msgstr "" #: lang/json/GENERIC_from_json.py @@ -39472,6 +39630,34 @@ msgid "" "had fake black soot painted on." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "blackjack" +msgid_plural "blackjacks" +msgstr[0] "" + +#. ~ Description for blackjack +#: lang/json/GENERIC_from_json.py +msgid "" +"This is a short, easily concealed bludgeoning weapon consisting of a weight " +"embedded at the end of a short leather shaft. Formerly used by law " +"enforcement, this weapon is meant to stun or knock out the subject, although" +" head strikes have a high risk of causing a permanent, disabling brain " +"injury or being fatal." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "makeshift sap" +msgid_plural "makeshift saps" +msgstr[0] "" + +#. ~ Description for makeshift sap +#: lang/json/GENERIC_from_json.py +msgid "" +"This is an improvised sap, also known as a cosh, slapjack and slapper. A " +"short and flat bludgeoning weapon consisting of a weight embedded between " +"two patches of leather." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "pointy stick" msgid_plural "pointy sticks" @@ -39927,6 +40113,28 @@ msgstr "" "모든 스포츠 중에서 가장 귀족적인 스포츠인 펜싱에 사용되는 무기. 펜싱용 사브르는 플뢰레와 에페에 비해 조금 짧긴 하기만, 그렇다고 해서" " 심하게 효율이 떨어지지는 않는다." +#: lang/json/GENERIC_from_json.py +msgid "hollow cane" +msgid_plural "hollow canes" +msgstr[0] "" + +#. ~ Description for hollow cane +#: lang/json/GENERIC_from_json.py +msgid "" +"A cane designed to conceal blade. This was a popular fashion accessory for " +"the wealthy during the 18th and 19th centuries." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "sword cane" +msgid_plural "sword canes" +msgstr[0] "" + +#. ~ Description for sword cane +#: lang/json/GENERIC_from_json.py +msgid "A sword with a thin blade designed to be hidden inside an hollow cane." +msgstr "" + #: lang/json/GENERIC_from_json.py lang/json/TOOL_from_json.py #: lang/json/TOOL_from_json.py msgid "cutlass" @@ -46483,6 +46691,15 @@ msgstr "" msgid "A cheap 6-round steel box magazine for the Jennings J-22." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "Walther P22 magazine" +msgstr "" + +#. ~ Description for Walther P22 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round box magazine for the Walther P22." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "LW-5 speedloader" msgstr "" @@ -46891,6 +47108,20 @@ msgstr "" msgid "A cheap 32-round steel box magazine for use with the MAC-11 SMG." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "CF-380 magazine" +msgstr "" + +#. ~ Description for CF-380 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Hi-Point CF-380." +msgstr "" + +#. ~ Description for CF-380 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point CF-380." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "M1911 .38 Super magazine" msgstr "" @@ -46954,6 +47185,43 @@ msgid "" "expect much reliability." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "Hi-Power magazine .40 S&W" +msgstr "" + +#. ~ Description for Hi-Power magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Browning Hi-Power .40 S&W." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine .40 S&W" +msgstr "" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 12 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 14 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "Model JCP magazine" +msgstr "" + +#. ~ Description for Model JCP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point Model JCP." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "grenade belt" msgstr "유탄 벨트" @@ -47107,6 +47375,24 @@ msgstr "USP .45 탄창" msgid "A standard capacity magazine for use with the H&K USP handgun." msgstr "H&K USP .45 권총에 사용되는 표준 탄창입니다." +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine .45 ACP" +msgstr "" + +#. ~ Description for PPQ magazine .45 ACP +#: lang/json/MAGAZINE_from_json.py +msgid "A 12 round steel box magazine for the Walther PPQ .45 ACP." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "Model JHP magazine" +msgstr "" + +#. ~ Description for Model JHP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 9-round steel box magazine for use with the Hi-Point Model JHP." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid ".454 5-round speedloader" msgstr "" @@ -47577,6 +47863,95 @@ msgstr "" msgid "A 17 round double stack box magazine for the SIG Sauer P320." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "Hi-Power magazine 9x19mm" +msgstr "" + +#. ~ Description for Hi-Power magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 13 round steel box magazine for the Browning Hi-Power 9x19mm." +msgstr "" + +#. ~ Description for Hi-Power magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 15 round steel box magazine for the Browning Hi-Power 9x19mm." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "P38 magazine" +msgstr "" + +#. ~ Description for P38 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8 round steel box magazine for the Walther P38." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine 9x19mm" +msgstr "" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Walther PPQ 9mm." +msgstr "" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 15 round steel box magazine for the Walther PPQ 9mm." +msgstr "" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 17 round steel box magazine for the Walther PPQ 9mm." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "C-9 magazine" +msgstr "" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Hi-Point C-9." +msgstr "" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point C-9." +msgstr "" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 15-round steel box magazine for use with the Hi-Point C-9." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "CZ 75 magazine" +msgstr "" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 12-round steel box magazine for use with the CZ 75." +msgstr "" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 20-round steel box magazine for use with the CZ 75." +msgstr "" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 26-round steel box magazine for use with the CZ 75." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "CCP magazine" +msgstr "" + +#. ~ Description for CCP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Walther CCP." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "Makarov PM magazine" msgstr "마카로프 PM 탄창" @@ -51258,10 +51633,8 @@ msgstr "군용 터렛" #: lang/json/MONSTER_from_json.py msgid "" "Leadworks LLC's T-4A1 Sentry. It features improved firmware over General " -"Atomics' TX-1 9x19mm model and an automated M4 carbine." +"Atomics' TX-1 9x19mm model and an automated 5.56mm carbine." msgstr "" -"레드웍스 LLC(Leadworks LLC) 사의 T-4A1 보초 로봇. 제너럴 아토믹스(General Atomics) 사의 TX-1 " -"9x19mm 모델에 비해 개선된 펌웨어와 자동화된 M4 카빈 소총을 갖추고 있습니다." #: lang/json/MONSTER_from_json.py msgid "debug monster" @@ -52693,6 +53066,47 @@ msgid "" "between walls and ceiling with limbs grown from its own disjointed ribs." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "gangrenous impaler" +msgstr "" + +#. ~ Description for gangrenous impaler +#: lang/json/MONSTER_from_json.py +msgid "" +"A corpse hideously twisted into an insect-like form. A hollow tendril " +"reaches out from its open thorax." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "The impaler launches a barb!" +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "trapped tendril" +msgstr "" + +#. ~ Description for trapped tendril +#: lang/json/MONSTER_from_json.py +msgid "" +"A great tendril of mutated flesh and sharpened bone. Emergent from a " +"crevice in the ruined floor, hundreds of human limbs seek freedom and writhe" +" incessantly from underneath its grotesque carapace. As enormous as it may " +"already be, you feel certain that this is just part of a creature much " +"bigger, for when it moves, you can feel this whole ruin tremble, as if an " +"unseen giant struggled against the weight of its concrete tomb." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "flesh wall" +msgstr "" + +#. ~ Description for flesh wall +#: lang/json/MONSTER_from_json.py +msgid "" +"A great lump of mutated flesh. It resembles the innards of some gigantic " +"creature and is covered in a grid of diminutive veins." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "bloated fungal zombie" msgstr "" @@ -56014,6 +56428,24 @@ msgid "" "effect. Starts very short range, increases rapidly with level." msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Summon Gangrenous Crawlers" +msgstr "" + +#. ~ Description for Summon Gangrenous Crawlers +#: lang/json/SPELL_from_json.py +msgid "Summons 2 permanent gangrenous crawlers." +msgstr "" + +#: lang/json/SPELL_from_json.py +msgid "Summon Gangrenous Monsters" +msgstr "" + +#. ~ Description for Summon Gangrenous Monsters +#: lang/json/SPELL_from_json.py +msgid "Summons 2 permanent gangrenous impalers." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Smite" msgstr "" @@ -62053,6 +62485,18 @@ msgid "" "used for cleaning impervious surfaces." msgstr "" +#: lang/json/TOOL_from_json.py +msgid "washing kit" +msgid_plural "washing kits" +msgstr[0] "" + +#. ~ Description for washing kit +#: lang/json/TOOL_from_json.py +msgid "" +"A combination kit of a washboard and a sponge. Everything you need to clean" +" items after the apocalypse." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "reading light" msgid_plural "reading lights" @@ -69205,6 +69649,10 @@ msgstr "" msgid "nails" msgstr "못" +#: lang/json/ammunition_type_from_json.py +msgid "barb" +msgstr "" + #: lang/json/ammunition_type_from_json.py msgid "BBs" msgstr "BB탄" @@ -69412,8 +69860,8 @@ msgid "components" msgstr "부품" #: lang/json/ammunition_type_from_json.py -msgid "93mm RPG-7" -msgstr "93mm RPG-7" +msgid "RPG-7 rocket" +msgstr "" #: lang/json/ammunition_type_from_json.py msgid "rebreather filter" @@ -69544,18 +69992,6 @@ msgid "" "those in turn more often than massive objects." msgstr "" -#: lang/json/bionic_from_json.py -msgid "Advanced Microreactor System" -msgstr "개선형 소형반응로" - -#. ~ Description for Advanced Microreactor System -#: lang/json/bionic_from_json.py -msgid "" -"This stripped down mini-reactor is more efficient and safer than the base " -"model due to integrated radiation cleansers. There is no way to shut it " -"down once active, but you can toggle additional fuel intake." -msgstr "" - #: lang/json/bionic_from_json.py msgid "Alarm System" msgstr "경보 시스템" @@ -70330,28 +70766,6 @@ msgid "" msgstr "" "기계화된 신경계로 고통 신호를 억제해, 고통에 무디게 할 수 있습니다. 하지만, 사용시 반응시간 저하와 나른함을 유발할 수 있습니다." -#: lang/json/bionic_from_json.py -msgid "Plutonium Filter" -msgstr "플루토늄 필터" - -#. ~ Description for Plutonium Filter -#: lang/json/bionic_from_json.py -msgid "" -"This set of tanks and filters allows you to extract plutonium from " -"radioactive slurry." -msgstr "" - -#: lang/json/bionic_from_json.py -msgid "Plutonium Purger" -msgstr "플루토늄 배출기" - -#. ~ Description for Plutonium Purger -#: lang/json/bionic_from_json.py -msgid "" -"Triggers an emergency reactor fuel purge that ejects all fuel from your " -"reactor." -msgstr "" - #. ~ Description for Bionic Visual Impairment #: lang/json/bionic_from_json.py msgid "" @@ -70476,18 +70890,6 @@ msgid "" "amount of unarmed slashing damage whenever your fingertips are uncovered." msgstr "" -#: lang/json/bionic_from_json.py -msgid "Microreactor System" -msgstr "소형반응로" - -#. ~ Description for Microreactor System -#: lang/json/bionic_from_json.py -msgid "" -"This stripped down mini-reactor generates impressive amounts of bionic " -"power. There is no way to shut it down, but you can toggle additional fuel " -"intake. Irradiates your body when active." -msgstr "" - #: lang/json/bionic_from_json.py msgid "Recycler Unit" msgstr "재활용 장치" @@ -70894,6 +71296,52 @@ msgid "" "artificial but effective sensation of fatigue." msgstr "" +#: lang/json/bionic_from_json.py +msgid "Advanced Microreactor System" +msgstr "개선형 소형반응로" + +#. ~ Description for Advanced Microreactor System +#: lang/json/bionic_from_json.py +msgid "" +"This stripped down mini-reactor is more efficient and safer than the base " +"model due to integrated radiation cleansers. There is no way to shut it " +"down once active, but you can toggle additional fuel intake." +msgstr "" + +#: lang/json/bionic_from_json.py +msgid "Plutonium Filter" +msgstr "플루토늄 필터" + +#. ~ Description for Plutonium Filter +#: lang/json/bionic_from_json.py +msgid "" +"This set of tanks and filters allows you to extract plutonium from " +"radioactive slurry." +msgstr "" + +#: lang/json/bionic_from_json.py +msgid "Plutonium Purger" +msgstr "플루토늄 배출기" + +#. ~ Description for Plutonium Purger +#: lang/json/bionic_from_json.py +msgid "" +"Triggers an emergency reactor fuel purge that ejects all fuel from your " +"reactor." +msgstr "" + +#: lang/json/bionic_from_json.py +msgid "Microreactor System" +msgstr "소형반응로" + +#. ~ Description for Microreactor System +#: lang/json/bionic_from_json.py +msgid "" +"This stripped down mini-reactor generates impressive amounts of bionic " +"power. There is no way to shut it down, but you can toggle additional fuel " +"intake. Irradiates your body when active." +msgstr "" + #: lang/json/bionic_from_json.py msgid "Internal Furnace" msgstr "내장 연소기" @@ -71015,8 +71463,7 @@ msgstr "회피와 근접 공격에 방해됩니다." #: lang/json/bodypart_from_json.py src/armor_layers.cpp src/character.cpp #: src/debug_menu.cpp msgid "Torso" -msgid_plural "Torso" -msgstr[0] "상체" +msgstr "상체" #. ~ Crafting recipes subcategory of 'ARMOR' category #: lang/json/bodypart_from_json.py lang/json/recipe_category_from_json.py @@ -71035,8 +71482,7 @@ msgstr "머리" #: lang/json/bodypart_from_json.py src/armor_layers.cpp src/character.cpp #: src/debug_menu.cpp msgid "Head" -msgid_plural "Head" -msgstr[0] "머리" +msgstr "머리" #. ~ Crafting recipes subcategory of 'ARMOR' category #: lang/json/bodypart_from_json.py lang/json/recipe_category_from_json.py @@ -71058,8 +71504,7 @@ msgstr "원거리 전투에 방해됩니다." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "Eyes" -msgid_plural "Eyes" -msgstr[0] "눈" +msgstr "눈" #: lang/json/bodypart_from_json.py msgid "mouth" @@ -71076,8 +71521,7 @@ msgstr "달리기가 느려졌습니다." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "Mouth" -msgid_plural "Mouth" -msgstr[0] "입" +msgstr "입" #: lang/json/bodypart_from_json.py msgid "left arm" @@ -71088,14 +71532,26 @@ msgctxt "bodypart_accusative" msgid "left arm" msgstr "왼팔" +#: lang/json/bodypart_from_json.py +msgid "arms" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "arms" +msgstr "" + #: lang/json/bodypart_from_json.py msgid "Melee and ranged combat is hampered." msgstr "근접 전투와 원거리 전투에 방해됩니다." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Arm" -msgid_plural "Arms" -msgstr[0] "좌팔" +msgstr "왼팔" + +#: lang/json/bodypart_from_json.py +msgid "Arms" +msgstr "우팔" #: lang/json/bodypart_from_json.py msgid "L ARM" @@ -71112,8 +71568,7 @@ msgstr "오른팔" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Arm" -msgid_plural "Arms" -msgstr[0] "우팔" +msgstr "오른팔" #: lang/json/bodypart_from_json.py msgid "R ARM" @@ -71128,14 +71583,26 @@ msgctxt "bodypart_accusative" msgid "left hand" msgstr "왼손" +#: lang/json/bodypart_from_json.py +msgid "hands" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "hands" +msgstr "" + #: lang/json/bodypart_from_json.py msgid "Manual tasks are slowed." msgstr "손을 사용하는 일들이 느려졌습니다." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Hand" -msgid_plural "Hands" -msgstr[0] "손" +msgstr "왼손" + +#: lang/json/bodypart_from_json.py +msgid "Hands" +msgstr "손" #: lang/json/bodypart_from_json.py msgid "right hand" @@ -71148,8 +71615,7 @@ msgstr "오른손" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Hand" -msgid_plural "Hands" -msgstr[0] "손" +msgstr "오른손" #: lang/json/bodypart_from_json.py msgid "left leg" @@ -71160,14 +71626,26 @@ msgctxt "bodypart_accusative" msgid "left leg" msgstr "왼쪽 다리" +#: lang/json/bodypart_from_json.py +msgid "legs" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "legs" +msgstr "" + #: lang/json/bodypart_from_json.py msgid "Running and swimming are slowed." msgstr "달리기와 수영이 느려졌습니다." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Leg" -msgid_plural "Legs" -msgstr[0] "다리" +msgstr "좌다리" + +#: lang/json/bodypart_from_json.py +msgid "Legs" +msgstr "다리" #: lang/json/bodypart_from_json.py msgid "L LEG" @@ -71184,8 +71662,7 @@ msgstr "오른쪽 다리" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Leg" -msgid_plural "Legs" -msgstr[0] "다리" +msgstr "우다리" #: lang/json/bodypart_from_json.py msgid "R LEG" @@ -71200,10 +71677,22 @@ msgctxt "bodypart_accusative" msgid "left foot" msgstr "왼발" +#: lang/json/bodypart_from_json.py +msgid "feet" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "feet" +msgstr "" + #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Foot" -msgid_plural "Feet" -msgstr[0] "발" +msgstr "왼발" + +#: lang/json/bodypart_from_json.py +msgid "Feet" +msgstr "발" #: lang/json/bodypart_from_json.py msgid "right foot" @@ -71216,13 +71705,11 @@ msgstr "오른발" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Foot" -msgid_plural "Feet" -msgstr[0] "발" +msgstr "오른발" #: lang/json/bodypart_from_json.py msgid "appendix" -msgid_plural "Appendices" -msgstr[0] "기타부위" +msgstr "기타부위" #: lang/json/bodypart_from_json.py msgctxt "bodypart_accusative" @@ -71233,6 +71720,10 @@ msgstr "기타부위" msgid "It's inflamed." msgstr "염증이 생겼습니다." +#: lang/json/bodypart_from_json.py +msgid "Appendices" +msgstr "기타부위" + #: lang/json/clothing_mod_from_json.py msgid "Pad with leather" msgstr "가죽 덧대기" @@ -79786,7 +80277,9 @@ msgstr "" "작고 숨기기 쉬운 권총 같은 쇠뇌. 작은 크기와 시위거리 때문에 위력이 약해서 작은 사냥감을 잡는게 좋습니다. 이 무기에서 발사된 볼트는" " 재사용 확률이 높습니다." -#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py src/item.cpp +#: lang/json/gun_from_json.py lang/json/gun_from_json.py +#: lang/json/gunmod_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gunmod_from_json.py src/item.cpp msgctxt "gun_type_type" msgid "pistol" msgstr "권총" @@ -79900,6 +80393,17 @@ msgid "" " side allows for repressurization, though this process takes a few minutes." msgstr "" +#: lang/json/gun_from_json.py +msgid "simple flamethrower" +msgid_plural "simple flamethrowers" +msgstr[0] "간이 화염방사기" + +#: lang/json/gun_from_json.py +msgid "" +"A simple, home-made flamethrower. While its capacity is not superb, it is " +"more than capable of igniting terrain and monsters alike." +msgstr "직접 만든 단순한 구조의 화염방사기입니다. 장탄량이 많지는 않지만, 나무나 괴물 등에게 불을 붙일 수 있습니다." + #: lang/json/gun_from_json.py msgid "BB gun" msgid_plural "BB guns" @@ -80481,6 +80985,18 @@ msgid "" "safety issues." msgstr "" +#: lang/json/gun_from_json.py +msgid "Walther P22" +msgid_plural "Walther P22s" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"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" +msgstr "" + #: lang/json/gun_from_json.py msgid "Remington ACR" msgid_plural "Remington ACRs" @@ -81350,6 +81866,19 @@ msgid "" " make for a moderately poor handling pistol." msgstr "" +#: lang/json/gun_from_json.py +msgid "Hi-Point CF-380" +msgid_plural "Hi-Point CF-380s" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "M1911A1" msgid_plural "M1911A1s" @@ -81430,6 +81959,44 @@ msgstr "" "스미스 앤 웨슨 (Smith & Wesson) M610은 고전적인 6연발 리볼버로서, 10mm탄이나 S&W사의 독자적인 .40 탄을 " "사용할 수 있습니다." +#: lang/json/gun_from_json.py +msgid "Browning Hi-Power .40 S&W" +msgid_plural "Browning Hi-Power .40 S&Ws" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Browning Hi-Power is a semi-automatic handgun developed shortly before " +"the second world war. Widely issued since then, it remains in use by India, " +"Canada and Australia. This is a commercial variant produced by Browning Arms" +" in .40 S&W." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther PPQ .40 S&W" +msgid_plural "Walther PPQ .40 S&Ws" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in .40 S&W." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Hi-Point Model JCP" +msgid_plural "Hi-Point Model JCPs" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "tube 40mm launcher" msgid_plural "tube 40mm launchers" @@ -81732,6 +82299,31 @@ msgid "USP .45" msgid_plural "USP .45s" msgstr[0] "USP .45" +#: lang/json/gun_from_json.py +msgid "Walther PPQ .45 ACP" +msgid_plural "Walther PPQ .45 ACPs" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in .45 ACP." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Hi-Point Model JHP" +msgid_plural "Hi-Point Model JHPs" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "Taurus Raging Bull" msgid_plural "Taurus Raging Bull" @@ -82569,6 +83161,88 @@ msgid "" "SIG Sauer P320." msgstr "" +#: lang/json/gun_from_json.py +msgid "Browning Hi-Power 9x19mm" +msgid_plural "Browning Hi-Power 9x19mms" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Browning Hi-Power is a semi-automatic handgun developed shortly before " +"the second world war. Widely issued since then, it remains in use by India, " +"Canada and Australia. This is a commercial variant produced by Browning Arms" +" in 9x19mm Parabellum." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther P38" +msgid_plural "Walther P38s" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther PPQ 9mm" +msgid_plural "Walther PPQ 9mms" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in 9x19mm Parabellum." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Hi-Point C-9" +msgid_plural "Hi-Point C-9s" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "CZ-75" +msgid_plural "CZ-75s" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"The CZ-75 is a semi-automatic pistol developed in Czechoslovakia, and is one" +" of the original wonder nines. Though designed for export to western " +"countries, it was declared a state secret; lack of international patent " +"protection meant that many clones and variants were produced and distributed" +" around the world, with Česká zbrojovka only joining in the 90's. This " +"pistol remains wildly popular among competition shooters." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther CCP" +msgid_plural "Walther CCPs" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "Makarov PM" msgid_plural "Makarov PMs" @@ -82654,17 +83328,6 @@ msgid "" "deadly." msgstr "상당한 양의 가스를 담을 수 있는 커다란 화염방사기. 매우 위협적이고 치명적입니다." -#: lang/json/gun_from_json.py -msgid "simple flamethrower" -msgid_plural "simple flamethrowers" -msgstr[0] "간이 화염방사기" - -#: lang/json/gun_from_json.py -msgid "" -"A simple, home-made flamethrower. While its capacity is not superb, it is " -"more than capable of igniting terrain and monsters alike." -msgstr "직접 만든 단순한 구조의 화염방사기입니다. 장탄량이 많지는 않지만, 나무나 괴물 등에게 불을 붙일 수 있습니다." - #: lang/json/gun_from_json.py msgid "RM451 flamethrower" msgid_plural "RM451 flamethrowers" @@ -82765,6 +83428,15 @@ msgstr "" "전기로 추진되며 고철을 이용해 제작한 단발식 강철 레일발사기입니다. 로렌츠 힘의 전자기 유도로 인해 자발적으로 연소되어 강철 말뚝이 " "초고속으로 발사됩니다. 기본형 UPS 로 충전됩니다." +#: lang/json/gun_from_json.py +msgid "barb launching organ" +msgid_plural "barb launching organs" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "A mutated organ capable of launching bony barbs at great speed." +msgstr "" + #: lang/json/gun_from_json.py msgid "coilgun" msgid_plural "coilguns" @@ -83305,6 +83977,18 @@ msgid "" "on impact." msgstr "" +#: lang/json/gun_from_json.py +msgid "Yeet Cannon" +msgid_plural "Yeet Cannons" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"You can YEET all the bullets with this baby. YEET them right into all of the" +" zombies in your path, all the hulks, the spiders, and those damned mole " +"rats." +msgstr "" + #: lang/json/gun_from_json.py msgid "SVS-24" msgid_plural "SVS-24" @@ -84806,26 +85490,6 @@ msgid "" msgstr "" ".454 Casull 탄환을 사용하는 5연발 리볼버. .410 산탄 탄환과 .45 Long Colt 탄환을 사용할 수 있습니다." -#: lang/json/gunmod_from_json.py -msgid ".300 AAC Blackout caliber conversion kit" -msgid_plural ".300 AAC Blackout caliber conversion kits" -msgstr[0] "" - -#: lang/json/gunmod_from_json.py -msgid "" -"This kit is used to convert an AR-15 .223/5.56mm rifle to the new .300BLK " -"caliber." -msgstr "" - -#: lang/json/gunmod_from_json.py -msgid "bore" -msgstr "구경전환" - -#: lang/json/gunmod_from_json.py -msgctxt "gun_type_type" -msgid "ar15" -msgstr "" - #: lang/json/gunmod_from_json.py msgid "barrel extension" msgid_plural "barrel extensions" @@ -84903,6 +85567,10 @@ msgid "" "slight reduction to accuracy." msgstr "" +#: lang/json/gunmod_from_json.py +msgid "bore" +msgstr "구경전환" + #: lang/json/gunmod_from_json.py msgid ".223 caliber conversion kit" msgid_plural ".223 caliber conversion kits" @@ -85202,6 +85870,35 @@ msgid "" " don't have to pick them up." msgstr "총 옆에 달아 배출되는 탄피를 모으는 가방입니다. 따라서 탄피를 하나씩 주워담을 필요가 없어집니다." +#: lang/json/gunmod_from_json.py +msgid ".300 AAC Blackout AR-15 conversion kit" +msgid_plural ".300 AAC Blackout AR-15 conversion kits" +msgstr[0] "" + +#: lang/json/gunmod_from_json.py +msgid "A complete AR-15 upper assembly with a .300 AAC Blackout barrel." +msgstr "" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "ar15" +msgstr "" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "m4a1" +msgstr "" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "h&k416a5" +msgstr "" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "m27iar" +msgstr "" + #: lang/json/gunmod_from_json.py msgid "lightweight replacement furniture" msgid_plural "lightweight replacement furnitures" @@ -87177,11 +87874,11 @@ msgstr "" #: lang/json/help_from_json.py msgid "" -"While magazines are often firearm-specific, on some occasions a magazine is compatible with several other firearms. The firearms in the game often reflect real-world prototypes in terms of caliber and compatibility. Below are some examples of interchangeable ammo:\n" -".308 = 7.62x51mm,\n" -".223 = 5.56 NATO,\n" -".270 = .30-06,\n" -".40 S&W = 10mm." +"While magazines and clips are often firearm-specific, on some occasions a magazine/speedloader is compatible with several other firearms or calibers. Below are some examples of calibers that might share magazines or speedloaders:\n" +".380 ACP and 9mm Luger,\n" +" .40 S&W and 10mm Auto 3\n" +".45 ACP and .460 Rowland,\n" +".45 Colt and .454 Casull." msgstr "" #: lang/json/help_from_json.py @@ -88267,8 +88964,9 @@ msgid "Measure radiation" msgstr "방사선 측정" #: lang/json/item_action_from_json.py lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py #: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py -#: lang/json/talk_topic_from_json.py src/game_inventory.cpp +#: src/game_inventory.cpp msgid "..." msgstr "..." @@ -88330,11 +89028,15 @@ msgid "Well, you know" msgstr "그거" #: lang/json/item_action_from_json.py -msgid "Wash clothes" -msgstr "세탁" +msgid "Wash soft items" +msgstr "" + +#: lang/json/item_action_from_json.py +msgid "Wash hard items" +msgstr "" #: lang/json/item_action_from_json.py -msgid "Wash CBMs" +msgid "Wash items" msgstr "" #: lang/json/item_action_from_json.py @@ -91837,6 +92539,41 @@ msgstr "많은 양을 저장할수있는 배터리가 할인중입니다!" msgid "the name is gone but a slogan remains: 'We'll repair you all the way'" msgstr "" +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "EnviroCom OS v2.03 - Basement Access" +msgstr "" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Unlock stairs" +msgstr "계단 개방" + +#. ~ Sign +#: lang/json/mapgen_from_json.py +msgid "Authorized personnel only" +msgstr "" + +#. ~ Sign +#: lang/json/mapgen_from_json.py +msgid " sewage treatment plant" +msgstr "" + +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "EnviroCom OS v2.03" +msgstr "EnviroCom OS v2.03" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Download Sewer Maps" +msgstr "하수도 지도 다운로드" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Divert sample" +msgstr "샘플 채취" + #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Evac shelter computer" @@ -92445,6 +93182,43 @@ msgid "" "Blocked damage reduced by 50%% of Dexterity." msgstr "" +#. ~ Description for martial art 'Fior Di Battaglia' +#: lang/json/martial_art_from_json.py +msgid "" +"Medieval Europe's martial techniques for fighting with polearms. The " +"\"Flower of Battle\" places great focus on countering one's opponent and " +"knocking them down before landing a killing blow" +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stand Your Ground" +msgstr "" + +#. ~ Description of buff 'Stand Your Ground' for martial art 'Fior Di +#. Battaglia' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You stalwart and will not budge against any threat.\n" +"\n" +"+2 Block attempts, -1.0 Dodge skill, blocked damage reduced by 50%% of Strength." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Tactical Retreat" +msgstr "" + +#. ~ Description of buff 'Tactical Retreat' for martial art 'Fior Di +#. Battaglia' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You moved and nullified the effects of Stand Your Ground!\n" +"\n" +"-2 Block attempts, +1.0 Dodge skill, blocked damaged increased by 50%% of Strength.\n" +"Lasts 1 turn." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Karate" msgstr "가라테" @@ -92906,35 +93680,6 @@ msgstr "" msgid "Perception increases dodging ability, +1 dodges per turn" msgstr "" -#. ~ Description for martial art 'Fior Di Battaglia' -#: lang/json/martial_art_from_json.py -msgid "" -"Medieval Europe's martial techniques for fighting with polearms, great focus" -" is given in countering one's opponent and knocking them down before landing" -" a killing blow" -msgstr "" - -#: lang/json/martial_art_from_json.py -msgid "Stand Your Ground" -msgstr "" - -#. ~ Description of buff 'Stand Your Ground' for martial art 'Fior Di -#. Battaglia' -#: lang/json/martial_art_from_json.py -msgid "" -"+2 blocks -1 dodge, halves your dodge and damage is reduced by your strength" -" when blocking" -msgstr "" - -#: lang/json/martial_art_from_json.py -msgid "You moved" -msgstr "" - -#. ~ Description of buff 'You moved' for martial art 'Fior Di Battaglia' -#: lang/json/martial_art_from_json.py -msgid "Nullifies Stand Your Ground, don't move, stand there and counter!" -msgstr "" - #: lang/json/martial_art_from_json.py msgid "Medieval Swordsmanship" msgstr "중세 검술" @@ -94814,39 +95559,6 @@ msgstr "찾아주셔서 정말 고마워요!" msgid "Oh no! My poor puppy..." msgstr "아, 안돼! 내 가여운 강아지가..." -#: lang/json/mission_def_from_json.py -msgid "Find 100 Cigarettes" -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "Come on man, I just need a smoke." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "" -"With all that's been going on, it's been more and more difficult to find a " -"smoke. My stash has been running low for a while now. Think you could help" -" me out here? A few packs is all I need." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "Thanks, it's great to see someone willing to help a guy out." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "" -"Plenty of smokers in towns. Gotta be some left over cigs in some of them " -"houses." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "Got the smokes?" -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "Thanks! I'll be sure to put in a good word for you around the center." -msgstr "" - #: lang/json/mission_def_from_json.py msgid "Break into armory to retrieve family photo" msgstr "" @@ -96124,7 +96836,7 @@ msgid "" msgstr "" #: lang/json/mission_def_from_json.py -msgid "Find 50 3L jars" +msgid "In a Pickle Pt. 2" msgstr "" #: lang/json/mission_def_from_json.py @@ -96153,6 +96865,39 @@ msgid "" "payment." msgstr "" +#: lang/json/mission_def_from_json.py +msgid "Smokes, let's go." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Come on man, I just need a smoke." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"With all that's been going on, it's been more and more difficult to find a " +"smoke. My stash has been running low for a while now. Think you could help" +" me out here? A few packs is all I need." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Thanks, it's great to see someone willing to help a guy out." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Plenty of smokers in towns. Gotta be some left over cigs in some of them " +"houses." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Got the smokes?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Thanks! I'll be sure to put in a good word for you around the center." +msgstr "" + #: lang/json/mission_def_from_json.py msgid "Clear Back Bay" msgstr "격리구 소탕" @@ -96264,7 +97009,7 @@ msgid "" msgstr "" #: lang/json/mission_def_from_json.py -msgid "Find 10 solar panels" +msgid "Solar Power" msgstr "" #: lang/json/mission_def_from_json.py @@ -96292,7 +97037,7 @@ msgid "" msgstr "" #: lang/json/mission_def_from_json.py -msgid "Find 100 canning jars" +msgid "In a Pickle" msgstr "" #: lang/json/mission_def_from_json.py @@ -96545,8 +97290,8 @@ msgid "Thank you, I'll do the explaining if anyone else asks about it." msgstr "" #: lang/json/mission_def_from_json.py -msgid "Kill ???" -msgstr "??? 죽이기" +msgid "Secure Trade Route" +msgstr "" #: lang/json/mission_def_from_json.py msgid "" @@ -96571,8 +97316,8 @@ msgid "Great work, wasn't sure what I was sending you after." msgstr "" #: lang/json/mission_def_from_json.py -msgid "Kill Raider Leader" -msgstr "침략단 대장 죽이기" +msgid "Assassinate Raider Leader" +msgstr "" #: lang/json/mission_def_from_json.py msgid "" @@ -96686,8 +97431,8 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" -"Remember, do extraction /exactly/ as specified, otherwise the bionic will " -"self-destruct." +"Remember, perform the extraction /exactly/ as specified, otherwise the " +"bionic will self-destruct." msgstr "" #: lang/json/mission_def_from_json.py @@ -96711,6 +97456,37 @@ msgstr "" msgid "You have our thanks and payment." msgstr "" +#: lang/json/mission_def_from_json.py +msgid "Light retrieval" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Our facility once sourced advanced photonic circuitry from a nearby robotics manufacturer. Their building suffered major damage during the portal storms, and collapsed almost entirely. However, preliminary scouting reveals that the basement prototyping lab likely remains intact.\n" +"\n" +"the intercom: We ask you to investigate the ruins, and if possible, retrieve a template for the fabrication of said photonic circuitry." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "We expect your success, mercenary." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Return if you change your mind." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"The scout drone also revealed extensive heat signatures and high " +"concentrations of toxic compounds within the ruins, plan accordingly. We " +"are willing to sell you some protective gear at a discount, if you require " +"it." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Have you retrieved the blueprints?" +msgstr "" + #: lang/json/mission_def_from_json.py msgid "Make 2 Stills" msgstr "증류기 2개 제작" @@ -107375,6 +108151,10 @@ msgstr "제당 과자점" msgid "sugar house roof" msgstr "" +#: lang/json/overmap_terrain_from_json.py +msgid "rural road" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "farm field" msgstr "경작지" @@ -109199,8 +109979,16 @@ msgid "parking garage" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "sewage treatment" -msgstr "하수 처리장" +msgid "sewage treatment plant" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment plant roof" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment plant - underground" +msgstr "" #: lang/json/overmap_terrain_from_json.py msgid "toxic waste dump" @@ -109507,6 +110295,10 @@ msgstr "" msgid "mechanics garage" msgstr "자동차 정비소" +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment" +msgstr "하수 처리장" + #: lang/json/overmap_terrain_from_json.py msgid "mechanic garage" msgstr "자동차 정비소" @@ -110453,6 +111245,34 @@ msgstr "" "무슨 일이 일어났는지 확실히는 모릅니다. 하지만 어째선지 전부 망해버렸다는 것은 알고 있으며, 당신의 뇌리를 스쳐 지나가는 유일한 생각은" " 다음에 복용할 마약을 찾으러 어디로 갈 것인지에 대해서입니다." +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Pillhead" +msgstr "" + +#. ~ Profession (male Pillhead) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"After an accident in your youth, you got addicted to the opiates treating " +"your pain. With the pharmacies shut down and dealers turned undead, " +"satisfying your fix just got a lot more difficult." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Pillhead" +msgstr "" + +#. ~ Profession (female Pillhead) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"After an accident in your youth, you got addicted to the opiates treating " +"your pain. With the pharmacies shut down and dealers turned undead, " +"satisfying your fix just got a lot more difficult." +msgstr "" + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "K9 Officer" @@ -116547,7 +117367,6 @@ msgid "WEAPON" msgstr "무기" #. ~ Crafting recipes subcategory all -#. ~ Crafting recipes subcategory of 'ENCHANTED' category #: lang/json/recipe_category_from_json.py #: lang/json/recipe_category_from_json.py src/crafting_gui.cpp msgid "ALL" @@ -119814,7 +120633,7 @@ msgid "" msgstr "" #: lang/json/snippet_from_json.py -msgid "Wounds heal over time. Bandages and disinfectant speeds that up." +msgid "Wounds heal over time. Bandages and antiseptic speeds that up." msgstr "" #: lang/json/snippet_from_json.py @@ -120603,8 +121422,8 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "" -"If you have extra disinfectant, use it to disinfect your wounds, even if " -"they aren't infected. They will recover faster that way." +"If you have extra antiseptic, use it to disinfect your wounds, even if they " +"aren't infected. They will recover faster that way." msgstr "" #: lang/json/snippet_from_json.py @@ -126915,13 +127734,6 @@ msgid "" "expert." msgstr "" -#: lang/json/snippet_from_json.py -msgid "" -"WAR ON DRUGS DEAD: The government has finally reacted to long accumulated " -"evidence that suggests that decriminalized drugs cause fewer health problems" -" and are generally better managed while providing valuable tax revenues." -msgstr "" - #: lang/json/snippet_from_json.py msgid "" "FEELING BLUE? Try \"Greens\" for Magazines! Your local Supermarket! " @@ -131699,8 +132511,7 @@ msgid "" "Bionics are augmentation packages, right? They come in these installable Compact Bionic Modules or CBMs, and I can use some CBMs - if you examine a CBM, it will tell you if I can use it.\n" " Find a programmable surgical installer or autodoc, position me on the couch, and activate it, and you can install a suitable CBM to me - or if I think I'll do a better job, I'll do. I'll take over installing CBMs into you if I'm better at it.\n" " I can use almost all passive bionics and some active bionics. If I have any active bionics, I'll try to use them sensibly, but if we're in danger, I'm going to activate anything that might give me an edge. I'll use any weapon bionics if they're better than the weapons you gave me, but if you think I should reserve my bionic energy for my defensive and healing bionics, you can tell me how much to reserve. I'll try to keep my bionic energy topped off, but if we're running low on supplies, you can tell me to stop recharging when I'm not full.\n" -" I'll tell you if I'm low on bionic energy and can't recharge, and what fuel I need.\n" -" Sothere are some internal atomic reactor bionics - I can use those, but I can only recharge them with plutonium slurry. That stuff is radioactive, so do us both a favor and don't give me an internal reactor unless you really like glowing in the dark." +" I'll tell you if I'm low on bionic energy and can't recharge, and what fuel I need." msgstr "" #: lang/json/talk_topic_from_json.py @@ -131880,11 +132691,11 @@ msgid "Go back to sleep." msgstr "다시 자러가." #: lang/json/talk_topic_from_json.py -msgid " *pshhhttt* I'm reading you boss, over." +msgid "What is it, friend?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "What is it, friend?" +msgid " *pshhhttt* I'm reading you boss, over." msgstr "" #: lang/json/talk_topic_from_json.py @@ -132123,11 +132934,11 @@ msgid "Show me what needs to be done at the camp." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I'm currently ." +msgid "I'm not doing much currently." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I'm not doing much currently." +msgid "I'm currently ." msgstr "" #: lang/json/talk_topic_from_json.py @@ -132182,13 +132993,13 @@ msgid "OK, maybe it'll stop me from freezing in this weather, what's up?" msgstr "그래, 이런 날씨에 내가 얼지 않게 해줄지도 몰라, 무슨 일이야?" #: lang/json/talk_topic_from_json.py -msgid "" -"Well, it's the time of day for a quick break surely! How are you holding " -"up?" +msgid "Man it's dark out isn't it? what's up?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Man it's dark out isn't it? what's up?" +msgid "" +"Well, it's the time of day for a quick break surely! How are you holding " +"up?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -132197,14 +133008,14 @@ msgstr "음, 난 꽤 아픈데... 그래도 잘 지내고 있니?" #: lang/json/talk_topic_from_json.py msgid "" -"Definitely, by the way, thanks for helping me so much with my tasks! " -"Anyway, you coping OK, ? " +"OK, let's take a moment, oh, and thanks for helping me with that thing, " +"so... what's up?" msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"OK, let's take a moment, oh, and thanks for helping me with that thing, " -"so... what's up?" +"Definitely, by the way, thanks for helping me so much with my tasks! " +"Anyway, you coping OK, ? " msgstr "" #: lang/json/talk_topic_from_json.py @@ -132280,14 +133091,14 @@ msgstr "좋아, 가만히 있으라고..." msgid "Keep your distance!" msgstr "가까이 오지마!" -#: lang/json/talk_topic_from_json.py -msgid "" -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "This is my territory, ." msgstr ", 여긴 내 구역이야." +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Calm down. I'm not going to hurt you." msgstr "진정해. 난 너에게 해코지할 생각이 없어." @@ -132340,14 +133151,6 @@ msgstr "뭐가 문제야?" msgid "I don't care." msgstr "내가 알 바 아냐." -#: lang/json/talk_topic_from_json.py -msgid "I don't have any jobs for you." -msgstr "너한테 시킬 일 없어." - -#: lang/json/talk_topic_from_json.py -msgid "I don't have any more jobs for you." -msgstr "더 시킬 일은 없어." - #: lang/json/talk_topic_from_json.py msgid "I have other jobs for you. Want to hear about them?" msgstr "" @@ -132356,13 +133159,21 @@ msgstr "" msgid "I have more jobs for you. Want to hear about them?" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "I just have one job for you. Want to hear about it?" +msgstr "해줬으면 하는 일이 있어. 들어볼래?" + #: lang/json/talk_topic_from_json.py msgid "I have another job for you. Want to hear about it?" msgstr "또 해줬으면 하는 일이 있어. 들어볼래?" #: lang/json/talk_topic_from_json.py -msgid "I just have one job for you. Want to hear about it?" -msgstr "해줬으면 하는 일이 있어. 들어볼래?" +msgid "I don't have any more jobs for you." +msgstr "더 시킬 일은 없어." + +#: lang/json/talk_topic_from_json.py +msgid "I don't have any jobs for you." +msgstr "너한테 시킬 일 없어." #: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py #: src/npctalk.cpp @@ -132374,16 +133185,16 @@ msgid "Never mind, I'm not interested." msgstr "아무것도 아냐, 난 관심 없어." #: lang/json/talk_topic_from_json.py -msgid "You're not working on anything for me now." -msgstr "" +msgid "What about it?" +msgstr "이건 어때?" #: lang/json/talk_topic_from_json.py msgid "Which job?" msgstr "무슨 일?" #: lang/json/talk_topic_from_json.py -msgid "What about it?" -msgstr "이건 어때?" +msgid "You're not working on anything for me now." +msgstr "" #: lang/json/talk_topic_from_json.py msgid "I'll do it!" @@ -137922,8 +138733,8 @@ msgid "All right! Let's get going." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "We've done it! We've solved the list!" -msgstr "" +msgid "Have I told you about cardboard, friend? Do you have any?" +msgstr "내가 너에게 판지가 있나고 물었나, 친구? 가지고있어?" #: lang/json/talk_topic_from_json.py msgid "" @@ -137931,8 +138742,8 @@ msgid "" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Have I told you about cardboard, friend? Do you have any?" -msgstr "내가 너에게 판지가 있나고 물었나, 친구? 가지고있어?" +msgid "We've done it! We've solved the list!" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "About that shopping list of yours..." @@ -142257,6 +143068,10 @@ msgstr "" msgid "What the hell were you testing out there?" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "So, about that protective gear?" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "No. Now leave." msgstr "" @@ -142272,6 +143087,21 @@ msgid "" "Shame about what happened, with the evisceration and all..." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"Given the current context, we are willing to sell you a set of our protective gear: gas mask, suit and gear, at a considerable discount. We will sell it for two of our coins.\n" +"\n" +"the intercom: Hmm wait, we might not have your size..." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "[ 2 Hub 01 Gold Coins ] Deal!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I have to give it a thought." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Just leave." msgstr "" @@ -143991,6 +144821,86 @@ msgstr "" msgid " delivers a perfect riposte to %s" msgstr "" +#: lang/json/technique_from_json.py +msgid "Displace and Hook" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You parry and hook %s down" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " parries and hooks %s down" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "High Round Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You swing high and strike at %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " swings high and strikes %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "High Round Feint" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You fake a high round strike at %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " feints at %s" +msgstr "이(가) %s에 페인트를 걸었다." + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab you, but you push away!" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab , but they push away!" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Hook and Drag" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You hook and drag %s down" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " hooks and drags %s down" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Colpo di Grazia" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You swing down hard and execute %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " swings down hard and executes %s" +msgstr "" + #: lang/json/technique_from_json.py msgid "quick punch" msgstr "빠른 펀치" @@ -144168,11 +145078,6 @@ msgstr "페인트 동작" msgid "You feint at %s" msgstr "%s에 페인트를 걸었다." -#: lang/json/technique_from_json.py -#, python-format -msgid " feints at %s" -msgstr "이(가) %s에 페인트를 걸었다." - #: lang/json/technique_from_json.py #, python-format msgid "You jab %s" @@ -144621,57 +145526,6 @@ msgstr "" msgid " receives %s's attack, and counters" msgstr "" -#: lang/json/technique_from_json.py -msgid "Displace and Hook" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You parry %s attack and hook them down" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid " parries %s attack and hooks them down" -msgstr "" - -#: lang/json/technique_from_json.py -msgid "High Round Strike" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You swing high and strike at %s" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid " swings high and strikes %s" -msgstr "" - -#: lang/json/technique_from_json.py -msgid "High Round Feint" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You fake a high round strike at %s" -msgstr "" - -#: lang/json/technique_from_json.py -msgid "High Round Stab" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You quickly stab %s" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid " quickly stabs %s" -msgstr "" - #: lang/json/technique_from_json.py msgid "grab and pommel strike" msgstr "" @@ -146339,6 +147193,16 @@ msgstr "" msgid "SMASH!" msgstr "쾅!" +#: lang/json/terrain_from_json.py +msgid "metal floor" +msgstr "금속 바닥" + +#. ~ Description for metal floor +#: lang/json/terrain_from_json.py +msgid "" +"High-quality and tough checkered flooring to reduce risk of slips and falls." +msgstr "" + #: lang/json/terrain_from_json.py msgid "linoleum tile" msgstr "리놀륨 타일" @@ -146436,10 +147300,6 @@ msgid "" "smoothed and the roof isn't quite filled in yet." msgstr "" -#: lang/json/terrain_from_json.py -msgid "metal floor" -msgstr "금속 바닥" - #. ~ Description for metal floor #: lang/json/terrain_from_json.py msgid "" @@ -151743,6 +152603,16 @@ msgstr "" msgid "biosilicfied chitin ram" msgstr "" +#: lang/json/vehicle_part_from_json.py +msgid "tied mattress" +msgstr "" + +#. ~ Description for tied mattress +#: lang/json/vehicle_part_from_json.py +msgid "" +"A mattress, strapped onto the vehicle. It could serve to blunt any impact." +msgstr "" + #. ~ Description for shredder #: lang/json/vehicle_part_from_json.py msgid "" @@ -156015,6 +156885,10 @@ msgstr "" msgid "Stop %s?" msgstr "" +#: src/activity_type.h +msgid "THIS IS A BUG" +msgstr "" + #: src/addiction.cpp msgid "You need some nicotine." msgstr "니코틴이 필요하다." @@ -157537,10 +158411,6 @@ msgstr "%1$s %2$s" msgid "artifact file" msgstr "아티팩트 파일" -#: src/auto_pickup.cpp -msgid " AUTO PICKUP MANAGER " -msgstr " 자동 줍기 관리자 " - #: src/auto_pickup.cpp src/game.cpp src/safemode_ui.cpp msgid "dd" msgstr "추가" @@ -157589,14 +158459,6 @@ msgstr "규칙" msgid "I/E" msgstr "I/E" -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "[]" -msgstr "[<전체 적용>]" - -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "[]" -msgstr "[<캐릭터 적용>]" - #: src/auto_pickup.cpp msgid "Auto pickup enabled:" msgstr "자동 줍기 설정:" @@ -157613,10 +158475,6 @@ msgstr "켬" msgid "witch" msgstr "전환" -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "Please load a character first to use this page!" -msgstr "먼저 캐릭터를 만들고 로드를 사용해주세요!" - #: src/auto_pickup.cpp src/safemode_ui.cpp msgid "" msgstr "<규칙 없음>" @@ -157654,6 +158512,18 @@ msgstr "줍기 규칙:" msgid "Save changes?" msgstr "변경사항을 저장할까요?" +#: src/auto_pickup.cpp +msgid " AUTO PICKUP MANAGER " +msgstr " 자동 줍기 관리자 " + +#: src/auto_pickup.cpp src/safemode_ui.cpp +msgid "[]" +msgstr "[<전체 적용>]" + +#: src/auto_pickup.cpp src/safemode_ui.cpp +msgid "[]" +msgstr "[<캐릭터 적용>]" + #: src/auto_pickup.cpp #, c-format msgid "%1$d item matches: %2$s" @@ -157672,6 +158542,11 @@ msgstr "자동 줍기 설정이 켜져 있지 않습니다. 지금 설정할까 msgid "autopickup configuration" msgstr "자동줍기 설정" +#: src/auto_pickup.cpp +#, c-format +msgid "Pickup rules for %s" +msgstr "%s의 줍기 규칙" + #: src/avatar.cpp src/iuse.cpp msgid "He" msgstr "그는" @@ -158901,7 +159776,37 @@ msgstr "%s을(를) 다시 넣었다." #: src/bionics.cpp #, c-format -msgid "%s withdraws %s %s." +msgid " withdraws %s %s." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Your %s does not have enought fuel to start." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "'s %s does not have enought fuel to start." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Your %s turns off to not waste fuel." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "'s %s turns off to not waste fuel." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Your %s runs out of fuel and turn off." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "'s %s runs out of fuel and turn off." msgstr "" #: src/bionics.cpp @@ -159267,6 +160172,10 @@ msgid "" "enjoy the operation." msgstr "" +#: src/bionics_ui.cpp +msgid "Available Fuel: " +msgstr "" + #: src/bionics_ui.cpp #, c-format msgid "" @@ -162360,6 +163269,18 @@ msgid " digests a %s and recharges %d point of energy." msgid_plural " digests a %s and recharges %d points of energy." msgstr[0] "이(가) %s을(를) 녹여서 전력을 %d만큼 충전했다." +#: src/consumption.cpp +#, c-format +msgid "You load %i charge of %s in your %s." +msgid_plural "You load %i charges of %s in your %s." +msgstr[0] "" + +#: src/consumption.cpp +#, c-format +msgid " load %i charge of %s in their %s." +msgid_plural " load %i charges of %s in their %s." +msgstr[0] "" + #: src/craft_command.cpp src/crafting.cpp src/veh_interact.cpp msgid " (nearby)" msgstr " (주변)" @@ -162443,8 +163364,10 @@ msgstr "더 이상 만들 수 없다!" #: src/crafting.cpp #, c-format -msgid "You don't have anything to store %s in!" -msgstr "%s을(를) 보관할 곳이 없다!" +msgid "" +"You don't have anything in which to store %s and may have to pour it out or " +"consume it as soon as it is prepared! Proceed?" +msgstr "" #: src/crafting.cpp src/pickup.cpp #, c-format @@ -163023,6 +163946,10 @@ msgstr "잘맞음!" msgid "Grazing hit." msgstr "스침" +#: src/creature.cpp +msgid "You feel poison coursing through your body!" +msgstr "" + #: src/creature.cpp msgid "The shot misses!" msgstr "빗나감!" @@ -164574,21 +165501,21 @@ msgid "You can't see the terrain here." msgstr "여기가 어떤 지형인지 보이지 않는다." #: src/descriptions.cpp +#, c-format msgid "" "\n" -"Sign: ???" +"Sign: %s" msgstr "" "\n" -"표지판: ???" +"표지판: %s" #: src/descriptions.cpp -#, c-format msgid "" "\n" -"Sign: %s" +"Sign: ???" msgstr "" "\n" -"표지판: %s" +"표지판: ???" #: src/descriptions.cpp src/iexamine.cpp #, c-format @@ -167554,20 +168481,6 @@ msgstr "UI 상태 데이터" msgid "Failed to save game data" msgstr "게임 데이터를 저장하는데 실패했습니다." -#: src/game.cpp -msgid "You haven't killed any monsters yet!" -msgstr "아직 아무것도 죽이지 않았습니다!" - -#: src/game.cpp -#, c-format -msgid "KILL COUNT: %d" -msgstr "죽인 목록: %d" - -#: src/game.cpp -#, c-format -msgid "Experience: %d (%d points available)" -msgstr "" - #: src/game.cpp msgid " You are forgotten among the billions lost in the cataclysm..." msgstr " 당신은 대재앙에 희생된 무수히 많은 이들 중 하나로서 잊혀졌습니다..." @@ -169519,6 +170432,11 @@ msgstr "쏟아진 액체는 마시지 못함" msgid "You're fully charged" msgstr "완전히 충전됨" +#: src/game_inventory.cpp +#, c-format +msgid "No space to store more %s" +msgstr "" + #: src/game_inventory.cpp msgid "soon!" msgstr "" @@ -169551,6 +170469,18 @@ msgstr "오래됨" msgid "rotten" msgstr "썩은" +#: src/game_inventory.cpp src/panels.cpp +msgid "Food :" +msgstr "" + +#: src/game_inventory.cpp src/panels.cpp +msgid "Drink:" +msgstr "" + +#: src/game_inventory.cpp src/panels.cpp +msgid "Pain :" +msgstr "" + #: src/game_inventory.cpp msgid "Consume item" msgstr "물품 섭취" @@ -172265,6 +173195,14 @@ msgstr "" msgid "ERROR NO SPACE AVAILABLE. Operation impossible. Exiting." msgstr "" +#: src/iexamine.cpp +msgid "Personality_Override" +msgstr "" + +#: src/iexamine.cpp +msgid "C0RR#PTED?D#TA" +msgstr "" + #: src/iexamine.cpp msgid "Choose bionic to uninstall" msgstr "제거할 바이오닉 선택" @@ -173493,8 +174431,8 @@ msgid "Capacity: " msgstr "장탄량:" #: src/item.cpp -msgid " per round" -msgstr "라운드 당 " +msgid " moves per round" +msgstr "" #: src/item.cpp msgid "Reload time: " @@ -173590,8 +174528,8 @@ msgid "" msgstr "" #: src/item.cpp -msgid " seconds" -msgstr "초" +msgid " moves " +msgstr "" #: src/item.cpp msgid "Time to reach aim level: " @@ -173625,10 +174563,6 @@ msgstr "실제 반동: " msgid "Recommended strength (burst): " msgstr "최적 체력수치 (연사시): " -#: src/item.cpp -msgid " seconds per round" -msgstr "라운드 당 초" - #: src/item.cpp msgid "Fire modes: " msgstr "사격 방식: " @@ -173894,6 +174828,14 @@ msgid "" "improve them by repairing this item." msgstr "방어도가 의류의 손상으로 인해 감소되었다. 수리를 통해 다시 원상복구할 수 있다." +#: src/item.cpp +msgid "Weight capacity modifier: " +msgstr "" + +#: src/item.cpp +msgid "Weight capacity bonus: " +msgstr "" + #: src/item.cpp msgid "Just for fun." msgstr "재미로 읽는 것." @@ -174324,6 +175266,14 @@ msgstr "* 이 물품을 라디오 신호로 작동시키면 즉시 msgid "This bionic is installed in the following body part(s):" msgstr "이 바이오닉은 다음 신체 부분에 설치됨:" +#: src/item.cpp +msgid "Encumbrance: " +msgstr "" + +#: src/item.cpp +msgid "Environmental Protection: " +msgstr "" + #: src/item.cpp msgid "* This weapon needs two free hands to fire." msgstr "* 이 무기는 사격하려면 양손이 비어 있어야한다." @@ -177567,6 +178517,11 @@ msgstr "" msgid " illuminated by %s" msgstr "" +#: src/iuse.cpp +#, c-format +msgid " in %s cloud" +msgstr "" + #: src/iuse.cpp #, c-format msgid " with graffiti \"%s\"" @@ -178766,6 +179721,10 @@ msgstr "%s에 사용할 전력원(일반적인 UPS 등)이 필요하다." msgid "There is also a certain bionic that helps with this kind of armor." msgstr "" +#: src/iuse_actor.cpp +msgid "No lock to pick." +msgstr "" + #: src/iuse_actor.cpp msgid "Use your lockpick where?" msgstr "어디에 자물쇠따개를 씁니까?" @@ -180800,6 +181759,20 @@ msgstr "<-> 이전단계" msgid "ndo move" msgstr "이동 전으로" +#: src/kill_tracker.cpp +msgid "You haven't killed any monsters yet!" +msgstr "아직 아무것도 죽이지 않았습니다!" + +#: src/kill_tracker.cpp +#, c-format +msgid "KILL COUNT: %d" +msgstr "죽인 목록: %d" + +#: src/kill_tracker.cpp +#, c-format +msgid "Experience: %d (%d points available)" +msgstr "" + #. ~ abbreviated direction names and long direction names #: src/line.cpp msgid "N " @@ -181069,6 +182042,16 @@ msgstr "" msgid "an explosion" msgstr "" +#: src/magic.cpp +#, c-format +msgid "%s and %s" +msgstr "" + +#: src/magic.cpp src/player.cpp +#, c-format +msgid "%s, %s" +msgstr "%s,%s" + #: src/magic.cpp #, c-format msgid "" @@ -181105,6 +182088,11 @@ msgstr "" msgid "Popup Distractions" msgstr "" +#: src/magic.cpp +#, c-format +msgid "%d moves" +msgstr "" + #: src/magic.cpp msgid "requires concentration" msgstr "" @@ -181623,7 +182611,7 @@ msgstr "" #: src/map.cpp #, c-format -msgid "The autoclave in the %s has finished washing." +msgid "The autoclave in the %s has finished its cycle." msgstr "" #: src/map.cpp @@ -181889,22 +182877,6 @@ msgstr "보관문 개방" msgid "Missile Controls" msgstr "미사일 제어기" -#: src/mapgen.cpp -msgid "EnviroCom OS v2.03" -msgstr "EnviroCom OS v2.03" - -#: src/mapgen.cpp -msgid "Unlock stairs" -msgstr "계단 개방" - -#: src/mapgen.cpp -msgid "Download Sewer Maps" -msgstr "하수도 지도 다운로드" - -#: src/mapgen.cpp -msgid "Divert sample" -msgstr "샘플 채취" - #: src/mapgen.cpp msgid "NEPowerOS" msgstr "NEPowerOS" @@ -184477,6 +185449,11 @@ msgstr "%s의 팔이 날아왔지만 은(는) 피했다!" msgid "The %1$s's arms fly out and pull and grab %2$s!" msgstr "%1$s가 팔을 뻗어%2$s에 덤벼들어, 몸을 잡았다!" +#: src/monattack.cpp +#, c-format +msgid "The %1$s reaches out and pulls %2$s!" +msgstr "" + #: src/monattack.cpp #, c-format msgid "The %s gropes at you, but you dodge!" @@ -185182,6 +186159,19 @@ msgstr "손에 든 무기를 내려놓고 제자리에 멈춰주십시오!" msgid "fzzzzzt" msgstr "파지지직" +#: src/monattack.cpp +msgid "The floor trembles underneath your feet." +msgstr "" + +#: src/monattack.cpp +msgid "a deafening roar!" +msgstr "" + +#: src/monattack.cpp +#, c-format +msgid "A %s struggles to pull itself free from the %s!" +msgstr "" + #: src/monattack.cpp #, c-format msgid "The %1$s mechanically grabs at %2$s!" @@ -187810,6 +188800,11 @@ msgstr "%1$s이(가) %2$s을(를) 버렸다." msgid "Hold on, I want to pulp that %s." msgstr "기다려, %s을(를) 부수고 싶어." +#: src/npcmove.cpp +#, c-format +msgid "%s completed the assigned task." +msgstr "" + #: src/npcmove.cpp #, c-format msgid "%1$s throws a %2$s." @@ -188319,6 +189314,10 @@ msgstr "주먹" msgid "BADAMMO" msgstr "BADAMMO" +#: src/npctalk.cpp +msgid "doing this and that" +msgstr "" + #: src/npctalk.cpp msgctxt "punctuation" msgid "." @@ -188422,6 +189421,11 @@ msgstr "" msgid "%1$s doesn't have a %2$s!" msgstr "" +#: src/npctalk.cpp +#, c-format +msgid "%1$s gives you %2$s." +msgstr "" + #: src/npctalk.cpp msgid "I don't trust you enough to eat THIS..." msgstr "나는 이런 걸 먹을 정도로 널 불신한다..." @@ -188675,11 +189679,6 @@ msgstr "지불:" msgid "Select a follower" msgstr "동료 선택" -#: src/npctalk_funcs.cpp -#, c-format -msgid "Pickup rules for %s" -msgstr "%s의 줍기 규칙" - #: src/npctrade.cpp #, c-format msgid "Volume: %s %s, Weight: %.1f %s" @@ -191408,10 +192407,6 @@ msgstr "" msgid "Freezing!" msgstr "" -#: src/panels.cpp -msgid "Pain " -msgstr "" - #: src/panels.cpp msgid "Bad" msgstr "" @@ -191579,22 +192574,10 @@ msgstr "" msgid "Style:" msgstr "" -#: src/panels.cpp -msgid "Food :" -msgstr "" - -#: src/panels.cpp -msgid "Drink:" -msgstr "" - #: src/panels.cpp msgid "Rest :" msgstr "" -#: src/panels.cpp -msgid "Pain :" -msgstr "" - #: src/panels.cpp msgid "Heat :" msgstr "" @@ -193346,11 +194329,6 @@ msgstr "%s(%d)" msgid "%s with %s (%d)" msgstr "%s-%s(%d)" -#: src/player.cpp -#, c-format -msgid "%s, %s" -msgstr "%s,%s" - #: src/player.cpp msgid "| Location " msgstr "| 위치" @@ -194087,6 +195065,10 @@ msgstr "" msgid "Peckish" msgstr "" +#: src/player.cpp +msgid "Pain " +msgstr "" + #: src/player_activity.cpp msgid "You pause for a moment to catch your breath." msgstr "" @@ -195521,6 +196503,10 @@ msgstr "B/W" msgid "Safe Mode enabled:" msgstr "안전모드 작동:" +#: src/safemode_ui.cpp +msgid "Please load a character first to use this page!" +msgstr "먼저 캐릭터를 만들고 로드를 사용해주세요!" + #: src/safemode_ui.cpp msgid "Safe Mode manager currently inactive." msgstr "안전모드 관리자 현재 비활성 상태." @@ -198339,6 +199325,10 @@ msgid "" "door." msgstr "" +#: src/vehicle_use.cpp +msgid "The autoclave is empty, there's no point in starting it." +msgstr "" + #: src/vehicle_use.cpp #, c-format msgid "" @@ -198365,6 +199355,10 @@ msgid "" "its lid." msgstr "세탁과정이 끝나기 전에 세탁기의 전원을 내리고 뚜껑을 열었다." +#: src/vehicle_use.cpp +msgid "The washing machine is empty, there's no point in starting it." +msgstr "" + #: src/vehicle_use.cpp #, c-format msgid "" @@ -198403,6 +199397,10 @@ msgid "" "lid." msgstr "" +#: src/vehicle_use.cpp +msgid "The dishwasher is empty, there's no point in starting it." +msgstr "" + #: src/vehicle_use.cpp #, c-format msgid "" diff --git a/lang/po/pl.po b/lang/po/pl.po index a746f5444316c..6eb66f3b8a4bb 100644 --- a/lang/po/pl.po +++ b/lang/po/pl.po @@ -5,18 +5,18 @@ # Faalagorn, 2018 # Radomir Kozłowski , 2018 # Artur Gromek , 2019 +# Chris Bittner , 2019 # Brett Dong , 2019 # Ewa Cichosz , 2019 # Aleksander Sienkiewicz , 2019 -# Chris Bittner , 2019 # msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.D\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-16 17:39+0800\n" +"POT-Creation-Date: 2019-08-23 23:11+0800\n" "PO-Revision-Date: 2018-04-26 14:47+0000\n" -"Last-Translator: Chris Bittner , 2019\n" +"Last-Translator: Aleksander Sienkiewicz , 2019\n" "Language-Team: Polish (https://www.transifex.com/cataclysm-dda-translators/teams/2217/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -448,27 +448,6 @@ msgstr "" "Kawałki miedzi. Można ich użyć do wytworzenia czegoś, np. prowizorycznych " "loftek do strzelby." -#: lang/json/AMMO_from_json.py -msgid "solder" -msgstr "lut" - -#. ~ Description for solder -#: lang/json/AMMO_from_json.py -msgid "" -"A small spool of solder, able to be used in ammunition and electronics." -msgstr "" -"Mała szpula metalu lutowniczego, stosowana w elektronice i produkcji " -"amunicji." - -#: lang/json/AMMO_from_json.py -msgid "tin" -msgstr "cyna" - -#. ~ Description for tin -#: lang/json/AMMO_from_json.py -msgid "Tin and pewter scraps. Usable in making ammo." -msgstr "Kawałki cyny i jej stopów. Przydatny do produkcji amunicji." - #: lang/json/AMMO_from_json.py msgid "medical tape" msgstr "taśma medyczna" @@ -489,6 +468,34 @@ msgstr "" "93 milimetrowy, jednoczęściowy, eksplodujący, rakietowo napędzany granat do " "RPG-7." +#: lang/json/AMMO_from_json.py +msgid "PG-7VR 64mm/105mm rocket" +msgstr "" + +#. ~ Description for PG-7VR 64mm/105mm rocket +#: lang/json/AMMO_from_json.py +msgid "64mm/105mm high-explosive tandem ammunition for the RPG-7." +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid "TBG-7V 105mm rocket" +msgstr "" + +#. ~ Description for TBG-7V 105mm rocket +#: lang/json/AMMO_from_json.py +msgid "105mm thermobaric ammunition for the RPG-7." +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid "OG-7V 40mm rocket" +msgstr "" + +#. ~ Description for OG-7V 40mm rocket +#: lang/json/AMMO_from_json.py +msgid "" +"40mm high-explosive fragmentation antipersonnel ammunition for the RPG-7." +msgstr "" + #: lang/json/AMMO_from_json.py msgid "M235 66mm TPA rocket" msgstr "rakieta 66mm M235 TPA" @@ -2586,21 +2593,19 @@ msgstr "" #. ~ Description for .300 AAC Blackout #: lang/json/AMMO_from_json.py msgid "" -".300 AAC Blackout is an intermediate cartridge that achieves ballistics " -"similar to the 7.62x39 but allows use on the AR-15 platform. The round is " -"necked-up from the 5.56mm NATO, but feeds from a STANAG magazine. It " -"requires a specific barrel, so will not work in a standard M4 or similar " -"carbine. This loading is supersonic." +"A .300 AAC Blackout round with a 125gr open tip match bullet. 300 BLK is an" +" intermediate cartridge necked up from 5.56x45mm, designed to achieve " +"similar ballistics to 7.62x39mm. It is compatible with standard AR-15 lower" +" receivers and will feed from STANAG magazines." msgstr "" #. ~ Description for .300 AAC Blackout #: lang/json/AMMO_from_json.py msgid "" -".300 AAC Blackout is an intermediate cartridge that achieves ballistics " -"similar to the 7.62x39 but allows use on the AR-15 platform. The round is " -"necked-up from the 5.56mm NATO, but feeds from a STANAG magazine. It " -"requires a specific barrel, so will not work in a standard M4 or similar " -"carbine. This loading is subsonic." +"A subsonic .300 AAC Blackout round with a 220gr open tip match bullet. 300 " +"BLK is an intermediate cartridge necked up from 5.56x45mm, designed to " +"achieve similar ballistics to 7.62x39mm. It is compatible with standard " +"AR-15 lower receivers and will feed from STANAG magazines." msgstr "" #: lang/json/AMMO_from_json.py @@ -4141,6 +4146,17 @@ msgid "" " tube. Designed to be highly effective against vehicles and structures." msgstr "" +#: lang/json/AMMO_from_json.py +msgid "paralyzing barb" +msgstr "" + +#. ~ Description for paralyzing barb +#: lang/json/AMMO_from_json.py +msgid "" +"Tiny droplets of venom trickle out of the sponge-like tissue of this sharp " +"barb." +msgstr "" + #: lang/json/AMMO_from_json.py msgid "sprayable toxic gas" msgstr "toksyczny gaz w sprayu" @@ -4771,6 +4787,29 @@ msgstr "" "Mały metalowy zawias z dwiema metalowymi płytkami z otworami na śruby. " "Przydatne do robienia drzwi." +#: lang/json/AMMO_from_json.py +msgid "tin powder" +msgstr "" + +#. ~ Description for tin powder +#: lang/json/AMMO_from_json.py +msgid "" +"A fine gray powder composed of tin, usable for making solder and lining " +"containers to prevent corrosion." +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid "solder" +msgstr "lut" + +#. ~ Description for solder +#: lang/json/AMMO_from_json.py +msgid "" +"A small spool of solder, able to be used in ammunition and electronics." +msgstr "" +"Mała szpula metalu lutowniczego, stosowana w elektronice i produkcji " +"amunicji." + #: lang/json/AMMO_from_json.py msgid "incendiary" msgid_plural "incendiaries" @@ -6709,51 +6748,6 @@ msgstr[3] "szorty do koszykówki" msgid "A pair of basketball shorts. Comfortable and light." msgstr "Lekkie i wygodne szorty do koszykówki. " -#: lang/json/ARMOR_from_json.py -msgid "backpack" -msgid_plural "backpacks" -msgstr[0] "plecak" -msgstr[1] "plecak" -msgstr[2] "plecak" -msgstr[3] "plecak" - -#. ~ Description for backpack -#: lang/json/ARMOR_from_json.py -msgid "A small backpack. Good storage for a little encumbrance." -msgstr "Mały plecak. Dobra pojemność przy niewielkim skrępowaniu ruchów." - -#: lang/json/ARMOR_from_json.py -msgid "giant novelty backpack" -msgid_plural "giant novelty backpacks" -msgstr[0] "gigantyczny efekciarski plecak" -msgstr[1] "gigantyczny efekciarski plecak" -msgstr[2] "gigantyczny efekciarski plecak" -msgstr[3] "gigantyczne efekciarskie plecaki" - -#. ~ Description for giant novelty backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A huge fabric backpack made mostly as a joke before the cataclysm. Now, " -"it's still rather silly, but it can store a lot of stuff." -msgstr "" -"Olbrzymi plecak uszyty z materiału, wyprodukowany zasadniczo jako żart przed" -" kataklizmem. Obecnie nadal wygląda śmiesznie, ale może pomieścić wiele " -"rzeczy." - -#: lang/json/ARMOR_from_json.py -msgid "leather backpack" -msgid_plural "leather backpacks" -msgstr[0] "skórzany plecak" -msgstr[1] "skórzany plecak" -msgstr[2] "skórzany plecak" -msgstr[3] "skórzany plecak" - -#. ~ Description for leather backpack -#: lang/json/ARMOR_from_json.py -msgid "A small leather backpack. Good storage for a little encumbrance." -msgstr "" -"Mały skórzany plecak. Dobra pojemność przy niewielkim skrępowaniu ruchów." - #: lang/json/ARMOR_from_json.py msgid "balaclava" msgid_plural "balaclavas" @@ -6781,8 +6775,8 @@ msgstr[3] "pas piersiowy" #. ~ Use action holster_msg for scabbard. #. ~ Use action holster_msg for sheath. #. ~ Use action holster_msg for survivor belt. -#. ~ Use action holster_msg for hiking backpack. #. ~ Use action holster_msg for survivor utility belt. +#. ~ Use action holster_msg for hiking backpack. #. ~ Use action holster_msg for pair of boots. #. ~ Use action holster_msg for pair of bone armor boots. #. ~ Use action holster_msg for pair of turnout boots. @@ -6807,7 +6801,8 @@ msgstr[3] "pas piersiowy" #. ~ Use action holster_msg for pair of rollerblades. #. ~ Use action holster_msg for pair of rollerskates. #. ~ Use action holster_msg for C.R.I.T web belt. -#: lang/json/ARMOR_from_json.py +#. ~ Use action holster_msg for hollow cane. +#: lang/json/ARMOR_from_json.py lang/json/GENERIC_from_json.py #, no-python-format msgid "You sheath your %s" msgstr "Chowasz swój %s do pochwy" @@ -6815,7 +6810,9 @@ msgstr "Chowasz swój %s do pochwy" #. ~ Use action holster_prompt for baldric. #. ~ Use action holster_prompt for back scabbard. #. ~ Use action holster_prompt for scabbard. -#: lang/json/ARMOR_from_json.py +#. ~ Use action holster_prompt for hollow cane. +#: lang/json/ARMOR_from_json.py lang/json/ARMOR_from_json.py +#: lang/json/GENERIC_from_json.py msgid "Sheath sword" msgstr "Schowaj miecz" @@ -7981,20 +7978,6 @@ msgstr "" "dinozaura. Znacznie krępuje ruchy i nie ma wiele miejsca w kieszeniach, ale " "jest za to bardzo ciepły." -#: lang/json/ARMOR_from_json.py -msgid "dive bag" -msgid_plural "dive bags" -msgstr[0] "plecak nurka" -msgstr[1] "plecak nurka" -msgstr[2] "plecak nurka" -msgstr[3] "plecak nurka" - -#. ~ Description for dive bag -#: lang/json/ARMOR_from_json.py -msgid "A lightweight mesh backpack, commonly worn by swimmers and divers." -msgstr "" -"Lekki plecak z elastycznej siatki, noszony często przez nurków i pływaków." - #: lang/json/ARMOR_from_json.py msgid "down-filled blanket" msgid_plural "down-filled blankets" @@ -8086,20 +8069,6 @@ msgstr[3] "suknia ślubna" msgid "A beautiful white wedding dress. What good will it be now?" msgstr "Śliczna biała suknia ślubna. Na co ona komu teraz?" -#: lang/json/ARMOR_from_json.py -msgid "duffel bag" -msgid_plural "duffel bags" -msgstr[0] "torba podróżna" -msgstr[1] "torba podróżna" -msgstr[2] "torba podróżna" -msgstr[3] "torba podróżna" - -#. ~ Description for duffel bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A huge duffel bag. Provides plenty of storage, but is severely encumbering." -msgstr "Olbrzymia torba podróżna z wielką pojemnością, ale bardzo niewygodna." - #: lang/json/ARMOR_from_json.py msgid "tactical dump pouch" msgid_plural "tactical dump pouches" @@ -10324,19 +10293,6 @@ msgstr "" "Długie zwiewne szaty. Proste i wygodne w noszeniu. Nie zapomnij rozedrzeć " "ich w dramatycznym geście przed walką z wrogiem!" -#: lang/json/ARMOR_from_json.py -msgid "jerrypack" -msgid_plural "jerrypacks" -msgstr[0] "kanister tornister" -msgstr[1] "kanister tornister" -msgstr[2] "kanister tornister" -msgstr[3] "kanister tornister" - -#. ~ Description for jerrypack -#: lang/json/ARMOR_from_json.py -msgid "A jerrycan modified to be worn in a similar manner to a backpack." -msgstr "Kanister zmodyfikowany by go nosić jak tornister." - #: lang/json/ARMOR_from_json.py msgid "sports jersey" msgid_plural "sports jerseys" @@ -11337,36 +11293,6 @@ msgstr[3] "czepek francuskiej pokojówki" msgid "A frilly white headpiece." msgstr "Biały koronkowy czepek na głowę." -#: lang/json/ARMOR_from_json.py -msgid "makeshift knapsack" -msgid_plural "makeshift knapsacks" -msgstr[0] "prowizoryczny plecak" -msgstr[1] "prowizoryczny plecak" -msgstr[2] "prowizoryczny plecak" -msgstr[3] "prowizoryczny plecak" - -#. ~ Description for makeshift knapsack -#: lang/json/ARMOR_from_json.py -msgid "" -"A pair of pants with the bottom ends tied with string, and then passed " -"through the belt loops so the knapsack can be carried on the back." -msgstr "" -"Para spodni z nogawkami zawiązanymi sznurkiem, i następnie przewleczonym " -"przez szlufki aby ten prowizoryczny plecak można było nosić na plecach." - -#: lang/json/ARMOR_from_json.py -msgid "makeshift sling" -msgid_plural "makeshift slings" -msgstr[0] "improwizowana uprząż" -msgstr[1] "improwizowana uprząż" -msgstr[2] "improwizowana uprząż" -msgstr[3] "improwizowana uprząż" - -#. ~ Description for makeshift sling -#: lang/json/ARMOR_from_json.py -msgid "A large sheet tied into a crude, over-the-shoulder sling." -msgstr "Duży kawałek materiału zwinięty by utworzyć naramienną uprząż." - #: lang/json/ARMOR_from_json.py msgid "ballistic mask" msgid_plural "ballistic masks" @@ -11449,19 +11375,6 @@ msgstr "" "T-shirt zmieniony w prowizoryczną maskę przez zawiązanie z tyłu rękawów. " "Używany w zamieszkach dla ukrycia tożsamości." -#: lang/json/ARMOR_from_json.py -msgid "messenger bag" -msgid_plural "messenger bags" -msgstr[0] "torba listonosza" -msgstr[1] "torba listonosza" -msgstr[2] "torba listonosza" -msgstr[3] "torba listonosza" - -#. ~ Description for messenger bag -#: lang/json/ARMOR_from_json.py -msgid "Light and easy to wear, but doesn't offer much storage." -msgstr "Lekka i łatwa w noszeniu, ale pojemność nie jest przesadna." - #: lang/json/ARMOR_from_json.py msgid "pair of mittens" msgid_plural "pairs of mittens" @@ -11477,25 +11390,6 @@ msgstr "" "Para ciepłych wełnianych rękawic bez palców. Ich brak sprawia, że bardzo " "krępują dłonie." -#: lang/json/ARMOR_from_json.py -msgid "MOLLE pack" -msgid_plural "MOLLE packs" -msgstr[0] "plecak MOLLE" -msgstr[1] "plecak MOLLE" -msgstr[2] "plecak MOLLE" -msgstr[3] "plecak MOLLE" - -#. ~ Description for MOLLE pack -#: lang/json/ARMOR_from_json.py -msgid "" -"The Modular Lightweight Load-carrying Equipment is an advanced military " -"backpack. Covered with pockets and straps, it strikes a fine balance " -"between storage space and encumbrance." -msgstr "" -"Modułowy system przenoszenia oporządzenia osobistego MOLLE to zaawansowany " -"plecak wojskowy. Zaopatrzony w kieszenie i zaczepy, stanowi zbalansowane " -"rozwiązanie pomiędzy zapewnieniem pojemności a skrępowaniem ruchu." - #: lang/json/ARMOR_from_json.py msgid "motorcycle armor" msgid_plural "motorcycle armors" @@ -12037,19 +11931,6 @@ msgstr "" "Hełm zrobiony z garnka na zupę. Nie chroni zbyt dobrze, ale lepsze to niż " "nic." -#: lang/json/ARMOR_from_json.py -msgid "purse" -msgid_plural "purses" -msgstr[0] "torebka damska" -msgstr[1] "torebka damska" -msgstr[2] "torebka damska" -msgstr[3] "torebka damska" - -#. ~ Description for purse -#: lang/json/ARMOR_from_json.py -msgid "A bit cumbersome to wear, but provides some storage." -msgstr "Niezbyt wygodna, ale zapewnia trochę miejsca w środku." - #: lang/json/ARMOR_from_json.py msgid "quiver" msgid_plural "quivers" @@ -12155,36 +12036,6 @@ msgstr "" "Luźne okrycie wierzchnie z rękawami i sporą ilością tajemniczych ukrytych " "kieszonek." -#: lang/json/ARMOR_from_json.py -msgid "military rucksack" -msgid_plural "military rucksacks" -msgstr[0] "pojemny plecak wojskowy" -msgstr[1] "pojemny plecak wojskowy" -msgstr[2] "pojemny plecak wojskowy" -msgstr[3] "pojemny plecak wojskowy" - -#. ~ Description for military rucksack -#: lang/json/ARMOR_from_json.py -msgid "A huge military rucksack, provides a lot of storage." -msgstr "Olbrzymi plecak wojskowy zapewniający mnóstwo miejsca." - -#: lang/json/ARMOR_from_json.py -msgid "runner pack" -msgid_plural "runner packs" -msgstr[0] "sakwa biegacza" -msgstr[1] "sakwa biegacza" -msgstr[2] "sakwa biegacza" -msgstr[3] "sakwa biegacza" - -#. ~ Description for runner pack -#: lang/json/ARMOR_from_json.py -msgid "" -"The obvious choice for outdoor athletes, this ergonomic backpack is light " -"and easy to wear, ensuring comfort when carrying heavy and bulky items." -msgstr "" -"Oczywisty wybór sportowca. Ergonomiczna lekka sakwa wygodna w noszeniu, " -"zapewniająca komfort w noszeniu ciężkich lub dużych przedmiotów." - #: lang/json/ARMOR_from_json.py msgid "scabbard" msgid_plural "scabbards" @@ -12649,23 +12500,6 @@ msgid "A sleeveless cloth garment that covers the torso and legs." msgstr "" "Pozbawiony rękawów ubiór z materiału, okrywający klatkę piersiową i nogi." -#: lang/json/ARMOR_from_json.py -msgid "sling pack" -msgid_plural "sling packs" -msgstr[0] "plecaczek jednoramienny" -msgstr[1] "plecaczek jednoramienny" -msgstr[2] "plecaczek jednoramienny" -msgstr[3] "plecaczek jednoramienny" - -#. ~ Description for sling pack -#: lang/json/ARMOR_from_json.py -msgid "" -"A simple single-sling backpack. Easier to access than a normal backpack, " -"but can't comfortably hold as much." -msgstr "" -"Prosty plecaczek o jednym ramiączku. Zapewnia łatwiejszy dostęp od zwykłego " -"plecaka, ale nie można komfortowo zmieścić w nim równie tyle rzeczy." - #: lang/json/ARMOR_from_json.py msgid "snuggie" msgid_plural "snuggies" @@ -12997,8 +12831,8 @@ msgstr[2] "pas ocalonych" msgstr[3] "pas ocalonych" #. ~ Use action holster_prompt for survivor belt. -#. ~ Use action holster_prompt for hiking backpack. #. ~ Use action holster_prompt for survivor utility belt. +#. ~ Use action holster_prompt for hiking backpack. #. ~ Use action holster_prompt for C.R.I.T web belt. #: lang/json/ARMOR_from_json.py msgid "Sheath blade" @@ -13015,23 +12849,6 @@ msgstr "" " małe ostrze. Wytrzymały i uszyty na miarę by był wygodny w noszeniu. " "Aktywuj by wyjąć/schować broń." -#: lang/json/ARMOR_from_json.py -msgid "survivor duffel bag" -msgid_plural "survivor duffel bags" -msgstr[0] "pojemna torba podróżna ocalonych" -msgstr[1] "pojemna torba podróżna ocalonych" -msgstr[2] "pojemna torba podróżna ocalonych" -msgstr[3] "pojemna torba podróżna ocalonych" - -#. ~ Description for survivor duffel bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built heavy duffel bag. Durable and carefully crafted to hold as " -"much stuff as possible." -msgstr "" -"Spersonalizowana torba podróżna ocalonych. Wytrzymała i przemyślnie " -"skonstruowana by pomieścić tyle sprzętu ile się da." - #: lang/json/ARMOR_from_json.py msgid "survivor goggles" msgid_plural "pairs of survivor goggles" @@ -13050,57 +12867,6 @@ msgstr "" "i wytrzymałe, zapewniają doskonałą ochronę przed niebezpieczeństwami " "środowiskowymi." -#: lang/json/ARMOR_from_json.py -msgid "survivor backpack" -msgid_plural "survivor backpacks" -msgstr[0] "plecak ocalonych" -msgstr[1] "plecak ocalonych" -msgstr[2] "plecak ocalonych" -msgstr[3] "plecak ocalonych" - -#. ~ Description for survivor backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built backpack. Durable and carefully crafted to hold as much " -"stuff as possible." -msgstr "" -"Spersonalizowany plecak. Wytrzymały i przemyślnie skonstruowany by pomieścić" -" tyle sprzętu ile się da." - -#: lang/json/ARMOR_from_json.py -msgid "survivor rucksack" -msgid_plural "survivor rucksacks" -msgstr[0] "plecak podróżny ocalonych" -msgstr[1] "plecak podróżny ocalonych" -msgstr[2] "plecak podróżny ocalonych" -msgstr[3] "plecak podróżny ocalonych" - -#. ~ Description for survivor rucksack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built heavy backpack. Durable and carefully crafted to hold as " -"much stuff as possible." -msgstr "" -"Spersonalizowany pojemny plecak podróżny. Wytrzymały i przemyślnie " -"skonstruowany by pomieścić tyle sprzętu ile się da." - -#: lang/json/ARMOR_from_json.py -msgid "survivor runner pack" -msgid_plural "survivor runner packs" -msgstr[0] "sakwa biegacza ocalonych" -msgstr[1] "sakwa biegacza ocalonych" -msgstr[2] "sakwa biegacza ocalonych" -msgstr[3] "sakwa biegacza ocalonych" - -#. ~ Description for survivor runner pack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built lightweight runner pack. Durable and carefully crafted to " -"hold as much stuff as possible." -msgstr "" -"Spersonalizowana noszona w talii lekka sakwa biegacza. Wytrzymała i " -"przemyślnie skonstruowana by pomieścić tyle sprzętu ile się da." - #: lang/json/ARMOR_from_json.py msgid "survivor suit" msgid_plural "survivor suits" @@ -14210,34 +13976,6 @@ msgstr "" "Nie jesteś w sumie pewny czy to nazywa się czapką golfową, ale jest to " "stereotypowa czapka którą noszą golfiści." -#: lang/json/ARMOR_from_json.py -msgid "golf bag" -msgid_plural "golf bags" -msgstr[0] "torba golfowa" -msgstr[1] "torby golfowe" -msgstr[2] "toreb golfowych" -msgstr[3] "toreb golfowych" - -#. ~ Use action holster_msg for golf bag. -#: lang/json/ARMOR_from_json.py -#, no-python-format -msgid "You awkwardly sheath your %s" -msgstr "Niezgrabnie chowasz swój %s do pochwy" - -#. ~ Use action holster_prompt for golf bag. -#: lang/json/ARMOR_from_json.py -msgid "Sheath golf club" -msgstr "Schowaj kij golfowy" - -#. ~ Description for golf bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A tall canvas and plastic bag with fold-out legs used for golfing. It even " -"has straps to be worn on the back." -msgstr "" -"Wysoki płócienny i plastikowy worek z rozkładanymi nóżkami, używany do " -"golfu. Ma nawet paski do noszenia na plecach." - #: lang/json/ARMOR_from_json.py msgid "javelin bag" msgid_plural "javelin bags" @@ -14358,77 +14096,6 @@ msgstr "" "Plastikowa płachta z kilkoma metalowymi oczkami do przywiązywania sznurkiem " "lub kablem. Dobra do improwizowanej ochrony przed deszczem." -#: lang/json/ARMOR_from_json.py -msgid "high-volume rucksack" -msgid_plural "high-volume rucksacks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for high-volume rucksack -#: lang/json/ARMOR_from_json.py -msgid "" -"Also know as a \"bigpack\", this rucksack is prized by pack rats but may " -"lead to a bad back." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "hiking backpack" -msgid_plural "hiking backpacks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for hiking backpack -#: lang/json/ARMOR_from_json.py -msgid "A large sized hiking backpack with plenty of storage space." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "petpack" -msgid_plural "petpacks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for petpack -#: lang/json/ARMOR_from_json.py -msgid "" -"Before the Cataclysm this would allow your four-legged friend to see the " -"world, now it's used to shield them from the world." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "large tactical backpack" -msgid_plural "large tactical backpacks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for large tactical backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A large tactical multi-compartment backpack that has great lower back " -"support." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "travelpack" -msgid_plural "travelpacks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#. ~ Description for travelpack -#: lang/json/ARMOR_from_json.py -msgid "A hiking pack used for short trips." -msgstr "" - #: lang/json/ARMOR_from_json.py msgid "survivor utility belt" msgid_plural "survivor utility belts" @@ -14703,6 +14370,381 @@ msgid "" "resistant vests. It has four pouches capable of carrying magazines." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "backpack" +msgid_plural "backpacks" +msgstr[0] "plecak" +msgstr[1] "plecak" +msgstr[2] "plecak" +msgstr[3] "plecak" + +#. ~ Description for backpack +#: lang/json/ARMOR_from_json.py +msgid "A small backpack. Good storage for a little encumbrance." +msgstr "Mały plecak. Dobra pojemność przy niewielkim skrępowaniu ruchów." + +#: lang/json/ARMOR_from_json.py +msgid "hiking backpack" +msgid_plural "hiking backpacks" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for hiking backpack +#: lang/json/ARMOR_from_json.py +msgid "A large sized hiking backpack with plenty of storage space." +msgstr "" + +#: lang/json/ARMOR_from_json.py +msgid "giant novelty backpack" +msgid_plural "giant novelty backpacks" +msgstr[0] "gigantyczny efekciarski plecak" +msgstr[1] "gigantyczny efekciarski plecak" +msgstr[2] "gigantyczny efekciarski plecak" +msgstr[3] "gigantyczne efekciarskie plecaki" + +#. ~ Description for giant novelty backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A huge fabric backpack made mostly as a joke before the cataclysm. Now, " +"it's still rather silly, but it can store a lot of stuff." +msgstr "" +"Olbrzymi plecak uszyty z materiału, wyprodukowany zasadniczo jako żart przed" +" kataklizmem. Obecnie nadal wygląda śmiesznie, ale może pomieścić wiele " +"rzeczy." + +#: lang/json/ARMOR_from_json.py +msgid "leather backpack" +msgid_plural "leather backpacks" +msgstr[0] "skórzany plecak" +msgstr[1] "skórzany plecak" +msgstr[2] "skórzany plecak" +msgstr[3] "skórzany plecak" + +#. ~ Description for leather backpack +#: lang/json/ARMOR_from_json.py +msgid "A small leather backpack. Good storage for a little encumbrance." +msgstr "" +"Mały skórzany plecak. Dobra pojemność przy niewielkim skrępowaniu ruchów." + +#: lang/json/ARMOR_from_json.py +msgid "large tactical backpack" +msgid_plural "large tactical backpacks" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for large tactical backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A large tactical multi-compartment backpack that has great lower back " +"support." +msgstr "" + +#: lang/json/ARMOR_from_json.py +msgid "high-volume rucksack" +msgid_plural "high-volume rucksacks" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for high-volume rucksack +#: lang/json/ARMOR_from_json.py +msgid "" +"Also know as a \"bigpack\", this rucksack is prized by pack rats but may " +"lead to a bad back." +msgstr "" + +#: lang/json/ARMOR_from_json.py +msgid "dive bag" +msgid_plural "dive bags" +msgstr[0] "plecak nurka" +msgstr[1] "plecak nurka" +msgstr[2] "plecak nurka" +msgstr[3] "plecak nurka" + +#. ~ Description for dive bag +#: lang/json/ARMOR_from_json.py +msgid "A lightweight mesh backpack, commonly worn by swimmers and divers." +msgstr "" +"Lekki plecak z elastycznej siatki, noszony często przez nurków i pływaków." + +#: lang/json/ARMOR_from_json.py +msgid "duffel bag" +msgid_plural "duffel bags" +msgstr[0] "torba podróżna" +msgstr[1] "torba podróżna" +msgstr[2] "torba podróżna" +msgstr[3] "torba podróżna" + +#. ~ Description for duffel bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A huge duffel bag. Provides plenty of storage, but is severely encumbering." +msgstr "Olbrzymia torba podróżna z wielką pojemnością, ale bardzo niewygodna." + +#: lang/json/ARMOR_from_json.py +msgid "petpack" +msgid_plural "petpacks" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for petpack +#: lang/json/ARMOR_from_json.py +msgid "" +"Before the Cataclysm this would allow your four-legged friend to see the " +"world, now it's used to shield them from the world." +msgstr "" + +#: lang/json/ARMOR_from_json.py +msgid "jerrypack" +msgid_plural "jerrypacks" +msgstr[0] "kanister tornister" +msgstr[1] "kanister tornister" +msgstr[2] "kanister tornister" +msgstr[3] "kanister tornister" + +#. ~ Description for jerrypack +#: lang/json/ARMOR_from_json.py +msgid "A jerrycan modified to be worn in a similar manner to a backpack." +msgstr "Kanister zmodyfikowany by go nosić jak tornister." + +#: lang/json/ARMOR_from_json.py +msgid "makeshift knapsack" +msgid_plural "makeshift knapsacks" +msgstr[0] "prowizoryczny plecak" +msgstr[1] "prowizoryczny plecak" +msgstr[2] "prowizoryczny plecak" +msgstr[3] "prowizoryczny plecak" + +#. ~ Description for makeshift knapsack +#: lang/json/ARMOR_from_json.py +msgid "" +"A pair of pants with the bottom ends tied with string, and then passed " +"through the belt loops so the knapsack can be carried on the back." +msgstr "" +"Para spodni z nogawkami zawiązanymi sznurkiem, i następnie przewleczonym " +"przez szlufki aby ten prowizoryczny plecak można było nosić na plecach." + +#: lang/json/ARMOR_from_json.py +msgid "makeshift sling" +msgid_plural "makeshift slings" +msgstr[0] "improwizowana uprząż" +msgstr[1] "improwizowana uprząż" +msgstr[2] "improwizowana uprząż" +msgstr[3] "improwizowana uprząż" + +#. ~ Description for makeshift sling +#: lang/json/ARMOR_from_json.py +msgid "A large sheet tied into a crude, over-the-shoulder sling." +msgstr "Duży kawałek materiału zwinięty by utworzyć naramienną uprząż." + +#: lang/json/ARMOR_from_json.py +msgid "messenger bag" +msgid_plural "messenger bags" +msgstr[0] "torba listonosza" +msgstr[1] "torba listonosza" +msgstr[2] "torba listonosza" +msgstr[3] "torba listonosza" + +#. ~ Description for messenger bag +#: lang/json/ARMOR_from_json.py +msgid "Light and easy to wear, but doesn't offer much storage." +msgstr "Lekka i łatwa w noszeniu, ale pojemność nie jest przesadna." + +#: lang/json/ARMOR_from_json.py +msgid "MOLLE pack" +msgid_plural "MOLLE packs" +msgstr[0] "plecak MOLLE" +msgstr[1] "plecak MOLLE" +msgstr[2] "plecak MOLLE" +msgstr[3] "plecak MOLLE" + +#. ~ Description for MOLLE pack +#: lang/json/ARMOR_from_json.py +msgid "" +"The Modular Lightweight Load-carrying Equipment is an advanced military " +"backpack. Covered with pockets and straps, it strikes a fine balance " +"between storage space and encumbrance." +msgstr "" +"Modułowy system przenoszenia oporządzenia osobistego MOLLE to zaawansowany " +"plecak wojskowy. Zaopatrzony w kieszenie i zaczepy, stanowi zbalansowane " +"rozwiązanie pomiędzy zapewnieniem pojemności a skrępowaniem ruchu." + +#: lang/json/ARMOR_from_json.py +msgid "purse" +msgid_plural "purses" +msgstr[0] "torebka damska" +msgstr[1] "torebka damska" +msgstr[2] "torebka damska" +msgstr[3] "torebka damska" + +#. ~ Description for purse +#: lang/json/ARMOR_from_json.py +msgid "A bit cumbersome to wear, but provides some storage." +msgstr "Niezbyt wygodna, ale zapewnia trochę miejsca w środku." + +#: lang/json/ARMOR_from_json.py +msgid "military rucksack" +msgid_plural "military rucksacks" +msgstr[0] "pojemny plecak wojskowy" +msgstr[1] "pojemny plecak wojskowy" +msgstr[2] "pojemny plecak wojskowy" +msgstr[3] "pojemny plecak wojskowy" + +#. ~ Description for military rucksack +#: lang/json/ARMOR_from_json.py +msgid "A huge military rucksack, provides a lot of storage." +msgstr "Olbrzymi plecak wojskowy zapewniający mnóstwo miejsca." + +#: lang/json/ARMOR_from_json.py +msgid "runner pack" +msgid_plural "runner packs" +msgstr[0] "sakwa biegacza" +msgstr[1] "sakwa biegacza" +msgstr[2] "sakwa biegacza" +msgstr[3] "sakwa biegacza" + +#. ~ Description for runner pack +#: lang/json/ARMOR_from_json.py +msgid "" +"The obvious choice for outdoor athletes, this ergonomic backpack is light " +"and easy to wear, ensuring comfort when carrying heavy and bulky items." +msgstr "" +"Oczywisty wybór sportowca. Ergonomiczna lekka sakwa wygodna w noszeniu, " +"zapewniająca komfort w noszeniu ciężkich lub dużych przedmiotów." + +#: lang/json/ARMOR_from_json.py +msgid "sling pack" +msgid_plural "sling packs" +msgstr[0] "plecaczek jednoramienny" +msgstr[1] "plecaczek jednoramienny" +msgstr[2] "plecaczek jednoramienny" +msgstr[3] "plecaczek jednoramienny" + +#. ~ Description for sling pack +#: lang/json/ARMOR_from_json.py +msgid "" +"A simple single-sling backpack. Easier to access than a normal backpack, " +"but can't comfortably hold as much." +msgstr "" +"Prosty plecaczek o jednym ramiączku. Zapewnia łatwiejszy dostęp od zwykłego " +"plecaka, ale nie można komfortowo zmieścić w nim równie tyle rzeczy." + +#: lang/json/ARMOR_from_json.py +msgid "survivor duffel bag" +msgid_plural "survivor duffel bags" +msgstr[0] "pojemna torba podróżna ocalonych" +msgstr[1] "pojemna torba podróżna ocalonych" +msgstr[2] "pojemna torba podróżna ocalonych" +msgstr[3] "pojemna torba podróżna ocalonych" + +#. ~ Description for survivor duffel bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built heavy duffel bag. Durable and carefully crafted to hold as " +"much stuff as possible." +msgstr "" +"Spersonalizowana torba podróżna ocalonych. Wytrzymała i przemyślnie " +"skonstruowana by pomieścić tyle sprzętu ile się da." + +#: lang/json/ARMOR_from_json.py +msgid "survivor backpack" +msgid_plural "survivor backpacks" +msgstr[0] "plecak ocalonych" +msgstr[1] "plecak ocalonych" +msgstr[2] "plecak ocalonych" +msgstr[3] "plecak ocalonych" + +#. ~ Description for survivor backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built backpack. Durable and carefully crafted to hold as much " +"stuff as possible." +msgstr "" +"Spersonalizowany plecak. Wytrzymały i przemyślnie skonstruowany by pomieścić" +" tyle sprzętu ile się da." + +#: lang/json/ARMOR_from_json.py +msgid "survivor rucksack" +msgid_plural "survivor rucksacks" +msgstr[0] "plecak podróżny ocalonych" +msgstr[1] "plecak podróżny ocalonych" +msgstr[2] "plecak podróżny ocalonych" +msgstr[3] "plecak podróżny ocalonych" + +#. ~ Description for survivor rucksack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built heavy backpack. Durable and carefully crafted to hold as " +"much stuff as possible." +msgstr "" +"Spersonalizowany pojemny plecak podróżny. Wytrzymały i przemyślnie " +"skonstruowany by pomieścić tyle sprzętu ile się da." + +#: lang/json/ARMOR_from_json.py +msgid "survivor runner pack" +msgid_plural "survivor runner packs" +msgstr[0] "sakwa biegacza ocalonych" +msgstr[1] "sakwa biegacza ocalonych" +msgstr[2] "sakwa biegacza ocalonych" +msgstr[3] "sakwa biegacza ocalonych" + +#. ~ Description for survivor runner pack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built lightweight runner pack. Durable and carefully crafted to " +"hold as much stuff as possible." +msgstr "" +"Spersonalizowana noszona w talii lekka sakwa biegacza. Wytrzymała i " +"przemyślnie skonstruowana by pomieścić tyle sprzętu ile się da." + +#: lang/json/ARMOR_from_json.py +msgid "golf bag" +msgid_plural "golf bags" +msgstr[0] "torba golfowa" +msgstr[1] "torby golfowe" +msgstr[2] "toreb golfowych" +msgstr[3] "toreb golfowych" + +#. ~ Use action holster_msg for golf bag. +#: lang/json/ARMOR_from_json.py +#, no-python-format +msgid "You awkwardly sheath your %s" +msgstr "Niezgrabnie chowasz swój %s do pochwy" + +#. ~ Use action holster_prompt for golf bag. +#: lang/json/ARMOR_from_json.py +msgid "Sheath golf club" +msgstr "Schowaj kij golfowy" + +#. ~ Description for golf bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A tall canvas and plastic bag with fold-out legs used for golfing. It even " +"has straps to be worn on the back." +msgstr "" +"Wysoki płócienny i plastikowy worek z rozkładanymi nóżkami, używany do " +"golfu. Ma nawet paski do noszenia na plecach." + +#: lang/json/ARMOR_from_json.py +msgid "travelpack" +msgid_plural "travelpacks" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for travelpack +#: lang/json/ARMOR_from_json.py +msgid "A hiking pack used for short trips." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "pistol bandolier" msgid_plural "pistol bandoliers" @@ -18367,21 +18409,6 @@ msgid "" " turn more often than massive objects." msgstr "" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Advanced Microreactor CBM" -msgid_plural "Advanced Microreactor CBMs" -msgstr[0] "Zaawansowany Mikroreaktor CBM" -msgstr[1] "Zaawansowany Mikroreaktor CBM" -msgstr[2] "Zaawansowany Mikroreaktor CBM" -msgstr[3] "Zaawansowany Mikroreaktor CBM" - -#. ~ Description for Advanced Microreactor CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"This module upgrades a pre-installed microreactor with enhanced maximum " -"yield and limited automatic radiation scrubbing capabilities." -msgstr "" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Alarm System CBM" msgid_plural "Alarm System CBMs" @@ -19249,21 +19276,6 @@ msgid "" "cause delayed reaction times and drowsiness." msgstr "" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Plutonium Filter CBM" -msgid_plural "Plutonium Filter CBMs" -msgstr[0] "Filtr Plutonu CBM" -msgstr[1] "Filtr Plutonu CBM" -msgstr[2] "Filtr Plutonu CBM" -msgstr[3] "Filtr Plutonu CBM" - -#. ~ Description for Plutonium Filter CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A system of tanks and filters that are connected to a microreactor to " -"extract plutonium from radioactive slurry." -msgstr "" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Power Armor Interface CBM" msgid_plural "Power Armor Interface CBMs" @@ -19409,37 +19421,6 @@ msgid "" "unarmed slashing damage whenever the user's fingertips are uncovered." msgstr "" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Internal Microreactor CBM" -msgid_plural "Internal Microreactor CBMs" -msgstr[0] "Wewnętrzny Mikroreaktor CBM" -msgstr[1] "Wewnętrzny Mikroreaktor CBM" -msgstr[2] "Wewnętrzny Mikroreaktor CBM" -msgstr[3] "Wewnętrzny Mikroreaktor CBM" - -#. ~ Description for Internal Microreactor CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"This stripped down mini-reactor will generate impressive amounts of bionic " -"power, but may not be the safest thing to install. Once active, it cannot " -"be shut down and will slowly contaminate the user's body with radiation." -msgstr "" - -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Microreactor Upgrade CBM" -msgid_plural "Microreactor Upgrade CBMs" -msgstr[0] "Ulepszenie Mikroreaktora CBM" -msgstr[1] "Ulepszenie Mikroreaktora CBM" -msgstr[2] "Ulepszenie Mikroreaktora CBM" -msgstr[3] "Ulepszenie Mikroreaktora CBM" - -#. ~ Description for Microreactor Upgrade CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A kit for upgrading a pre-installed microreactor with enhanced maximum yield" -" and limited automatic radiation scrubbing capabilities." -msgstr "" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Recycler Unit CBM" msgid_plural "Recycler Unit CBMs" @@ -20183,6 +20164,67 @@ msgstr "" "Wolna przestrzeń w twojej klatce piersiowej zastała zamieniona na magazyn. " "Możesz w nim przenosić dwa litry objętości." +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Advanced Microreactor CBM" +msgid_plural "Advanced Microreactor CBMs" +msgstr[0] "Zaawansowany Mikroreaktor CBM" +msgstr[1] "Zaawansowany Mikroreaktor CBM" +msgstr[2] "Zaawansowany Mikroreaktor CBM" +msgstr[3] "Zaawansowany Mikroreaktor CBM" + +#. ~ Description for Advanced Microreactor CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"This module upgrades a pre-installed microreactor with enhanced maximum " +"yield and limited automatic radiation scrubbing capabilities." +msgstr "" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Plutonium Filter CBM" +msgid_plural "Plutonium Filter CBMs" +msgstr[0] "Filtr Plutonu CBM" +msgstr[1] "Filtr Plutonu CBM" +msgstr[2] "Filtr Plutonu CBM" +msgstr[3] "Filtr Plutonu CBM" + +#. ~ Description for Plutonium Filter CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A system of tanks and filters that are connected to a microreactor to " +"extract plutonium from radioactive slurry." +msgstr "" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Internal Microreactor CBM" +msgid_plural "Internal Microreactor CBMs" +msgstr[0] "Wewnętrzny Mikroreaktor CBM" +msgstr[1] "Wewnętrzny Mikroreaktor CBM" +msgstr[2] "Wewnętrzny Mikroreaktor CBM" +msgstr[3] "Wewnętrzny Mikroreaktor CBM" + +#. ~ Description for Internal Microreactor CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"This stripped down mini-reactor will generate impressive amounts of bionic " +"power, but may not be the safest thing to install. Once active, it cannot " +"be shut down and will slowly contaminate the user's body with radiation." +msgstr "" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Microreactor Upgrade CBM" +msgid_plural "Microreactor Upgrade CBMs" +msgstr[0] "Ulepszenie Mikroreaktora CBM" +msgstr[1] "Ulepszenie Mikroreaktora CBM" +msgstr[2] "Ulepszenie Mikroreaktora CBM" +msgstr[3] "Ulepszenie Mikroreaktora CBM" + +#. ~ Description for Microreactor Upgrade CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A kit for upgrading a pre-installed microreactor with enhanced maximum yield" +" and limited automatic radiation scrubbing capabilities." +msgstr "" + #. ~ Description for Solar Panels CBM #: lang/json/BIONIC_ITEM_from_json.py msgid "" @@ -23270,26 +23312,26 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Nietzsche's \"Beyond Good and Evil\". Its cover is dog-" +"This is a copy of Nietzsche's \"Beyond Good and Evil\". Its cover is dog-" "eared and creased." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"The Unique and Its Property\" by Max Stirner. A modern " +"This is a copy of \"The Unique and Its Property\" by Max Stirner. A modern " "translation by Wolfi Landstreicher." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Jean-Paul Sartre's \"Being and Nothingness\". A key work " +"This is a copy of Jean-Paul Sartre's \"Being and Nothingness\". A key work " "in the existentialist tradition." msgstr "" #: lang/json/BOOK_from_json.py msgid "" "A large, extended version of \"Madness and Civilisation\" by Michel " -"Foucault. The cover features a striking image of a Panopticonic Prison." +"Foucault. The cover features a striking image of a Panopticonic Prison." msgstr "" #: lang/json/BOOK_from_json.py @@ -23300,13 +23342,13 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"A collection of texts and essays by Jacques Derrida. It's pages loose and " +"A collection of texts and essays by Jacques Derrida. It's pages loose and " "yellowed, you should probably handle it with care." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Society of the Spectacle\" by Guy Debord. Its cover " +"This is a copy of \"Society of the Spectacle\" by Guy Debord. Its cover " "shows rows of adults staring placidly into a screen." msgstr "" @@ -23318,36 +23360,36 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Baudrillard's \"Simulation and Simulacra\". The cover " +"This is a copy of Baudrillard's \"Simulation and Simulacra\". The cover " "contains an image of a man holding a colored pill in each hand, with the " -"caption \"Welcome to the Desert of the Real.\". You think you've seen this " +"caption \"Welcome to the Desert of the Real.\". You think you've seen this " "movie." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a small, pocket version of Sartre's \"Existentialism and Humanism.\"" -" It looks to have been used as a coaster in a past life." +"This is a small, pocket version of Sartre's \"Existentialism and Humanism\"." +" It looks to have been used as a coaster in a past life." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Practical Ethics\" by Peter Singer. From the local " +"This is a copy of \"Practical Ethics\" by Peter Singer. From the local " "university press." msgstr "" #: lang/json/BOOK_from_json.py msgid "" "This is a photocopied spiral-bound copy of \"Industrial Society and Its " -"Future\" by 'Freedom Club'. The original looks to have been written on a " +"Future\" by 'Freedom Club'. The original looks to have been written on a " "typewriter before being copied." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Industrial Society and Its Future\" by Ted Kaczynski. " +"This is a copy of \"Industrial Society and Its Future\" by Ted Kaczynski. " "Its cover is an image of a hand-crafted wooden box filled with wiring and an" -" ominous looking metal tube. Provocative." +" ominous looking metal tube. Provocative." msgstr "" #: lang/json/BOOK_from_json.py @@ -23356,23 +23398,23 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"The State and Revolution\" by Vladimir Lenin. In " +"This is a copy of \"The State and Revolution\" by Vladimir Lenin. In " "English, thankfully." msgstr "" #: lang/json/BOOK_from_json.py -msgid "This is a copy of \"In Defence of Terrorism\" by Leon Trotsky." +msgid "This is a copy of \"In Defense of Marxism\" by Leon Trotsky." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Steal This Book\" by Abbie Hoffman. There is a security " -"tag on the back cover. It appears to still be active." +"This is a copy of \"Steal This Book\" by Abbie Hoffman. There is a security" +" tag on the back cover. It appears to still be active." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Walden: Or Life In The Woods\" by Henry David Thoreau. " +"This is a copy of \"Walden: Or Life In The Woods\" by Henry David Thoreau. " "It contains a dried and pressed leaf as a bookmark." msgstr "" @@ -23393,7 +23435,7 @@ msgid "" msgstr "" #: lang/json/BOOK_from_json.py -msgid "This is a copy of Machiavelli's \"The Prince\". With intro by Q. Skinner." +msgid "This is a copy of Machiavelli's \"The Prince\". With intro by Q. Skinner." msgstr "" #: lang/json/BOOK_from_json.py @@ -23403,12 +23445,12 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a pocket copy of \"An Essay on Liberation\" by Herbert Marcuse. The " -"cover contains an image of a pelican." +"This is a pocket copy of \"An Essay on Liberation\" by Herbert Marcuse. The" +" cover contains an image of a pelican." msgstr "" #: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Either-Or\" by Sören Kierkegaard." +msgid "This is a copy of \"Either-Or\" by Søren Kierkegaard." msgstr "" #: lang/json/BOOK_from_json.py @@ -23433,6 +23475,69 @@ msgid "" "Science\" by Friederich Nietzsche." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Myth of Sisyphus\", and other essays, by Albert " +"Camus. The cover depicts a bare-chested man and a large boulder." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Sickness Unto Death\" by Søren Kierkegaard. The " +"pages are dotted with post-it notes." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Defence of Terrorism\" by Leon Trotsky. Despite the" +" title, it does not actually appear to be defending terrorism." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Enquiry Concerning Political Justice\" by William " +"Godwin. This thick book is filled with antiquated phrases." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Abolition of Work and Other Essays\" by Bob Black. " +"It is likely that \"The Abolition of Work\" is the most famous essay in this" +" book." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"What is Property?\" by Pierre-Joseph Proudhon. It looks" +" like this book has a surprisingly long track record of owners." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Conquest of Bread\" by Peter Kropotkin. There is a " +"picture of an old philosopher with magnificent beard, instead of bread, on " +"the cover." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Trouble with Being Born\" by Emil Cioran. This book" +" might have been printed decades before the cataclysm since the cover is " +"quite weathered." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The World as Will and Representation\" by Arthur " +"Schopenhauer. It contains a few undecipherable notes and scribbles." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Up-Wingers: A Futurist Manifesto\" by FM-2030. It seems" +" that the author's real name is Fereidoun M. Esfandiary." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "phone book" msgid_plural "phone books" @@ -25495,15 +25600,10 @@ msgstr[3] "fenoli" msgid "" "This useful stuff is a potent solvent and has a wide range of reactive " "applications. It can be used to make a huge number of plastics and " -"polymers, it can be a disinfectant, it can strip paint and break down epoxy," -" and it can burn your skin away like tissue paper under a heat gun. Wear " +"polymers, it can be an antiseptic, it can strip paint and break down epoxy, " +"and it can burn your skin away like tissue paper under a heat gun. Wear " "gloves." msgstr "" -"Ten użyteczny materiał jest silnym rozpuszczalnikiem i ma szeroki zakres " -"zastosowań reaktywnych. Może być używany do wytwarzania ogromnej liczby " -"tworzyw sztucznych i polimerów, może być środkiem dezynfekującym, może " -"usuwać farbę i rozkładać żywicę epoksydową, a także może wypalić skórę jak " -"bibułkę pod opalarką. Noś rękawice." #: lang/json/COMESTIBLE_from_json.py msgid "glycerol" @@ -31598,11 +31698,9 @@ msgstr[3] "proszek antyseptyczny" #. ~ Description for antiseptic powder #: lang/json/COMESTIBLE_from_json.py msgid "" -"A powdered form of chemical disinfectant, this bismuth formic iodide cleans " +"A powdered form of chemical antiseptic, this bismuth formic iodide cleans " "wounds quickly and painlessly." msgstr "" -"Sproszkowana forma chemicznego środka dezynfekującego, na bazie bizmutu, " -"kwasu mrówkowego i jodyny szybko i bezboleśnie oczyszcza rany." #: lang/json/COMESTIBLE_from_json.py msgid "caffeinated chewing gum" @@ -31655,13 +31753,10 @@ msgstr[3] "woda utleniona" #. ~ Description for hydrogen peroxide #: lang/json/COMESTIBLE_from_json.py msgid "" -"Dilute hydrogen peroxide, for use as a disinfectant and for bleaching hair " -"or textiles. Foams a little when in contact with organic matter, but " +"Dilute hydrogen peroxide, for use as an antiseptic and for bleaching hair or" +" textiles. Foams a little when in contact with organic matter, but " "otherwise harmless." msgstr "" -"Butelka rozcieńczonej wody utlenionej czyli nadtlenku wodoru, używanego do " -"dezynfekcji i wybielania włosów i tekstyliów. Nieco się pieni w kontakcie z " -"materiałem organicznym, ale poza tym jest nieszkodliwy." #: lang/json/COMESTIBLE_from_json.py lang/json/GENERIC_from_json.py msgid "cigarette" @@ -31845,27 +31940,23 @@ msgstr "" "powinieneś uzupełniać płyny i odpoczywać." #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant" -msgstr "środek dezynfekujący" +msgid "antiseptic" +msgstr "" -#. ~ Description for disinfectant +#. ~ Description for antiseptic #: lang/json/COMESTIBLE_from_json.py -msgid "A powerful disinfectant commonly used for contaminated wounds." +msgid "A powerful antiseptic commonly used for contaminated wounds." msgstr "" -"Silny środek o właściwościach dezynfekujących, używany do oczyszczania " -"zainfekowanych ran." #: lang/json/COMESTIBLE_from_json.py -msgid "makeshift disinfectant" -msgstr "improwizowany środek dezynfekujący" +msgid "makeshift antiseptic" +msgstr "" -#. ~ Description for makeshift disinfectant +#. ~ Description for makeshift antiseptic #: lang/json/COMESTIBLE_from_json.py msgid "" -"Makeshift disinfectant made from ethanol. Can be used to disinfect a wound." +"Makeshift antiseptic made from ethanol. Can be used to disinfect a wound." msgstr "" -"Improwizowany środek dezynfekujący wytworzony z etanolu. Może zostać użyty " -"do odkażenia rany." #: lang/json/COMESTIBLE_from_json.py src/addiction.cpp msgid "diazepam" @@ -32289,10 +32380,8 @@ msgstr "olej z tymianku" #: lang/json/COMESTIBLE_from_json.py msgid "" "Some essential oil made from thyme, which can act as a mildly irritating " -"disinfectant." +"antiseptic." msgstr "" -"Olej będący ekstraktem z tymianku. Może służyć jako lekko drażniący środek " -"do dezynfekcji." #: lang/json/COMESTIBLE_from_json.py msgid "rolling tobacco" @@ -32505,32 +32594,32 @@ msgstr "" "alprazolam." #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant soaked rag" -msgid_plural "disinfectant soaked rags" -msgstr[0] "szmatka nasączona dezynfekantem" -msgstr[1] "szmatki nasączone dezynfekantem" -msgstr[2] "szmatek nasączonych dezynfekantem" -msgstr[3] "szmatek nasączonych dezynfekantem" +msgid "antiseptic soaked rag" +msgid_plural "antiseptic soaked rags" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" -#. ~ Description for disinfectant soaked rag +#. ~ Description for antiseptic soaked rag #: lang/json/COMESTIBLE_from_json.py msgid "" -"A rag soaked in disinfectant. Useful for light wounds, probaby won't help " -"with deep bites." +"A rag soaked in antiseptic. Useful for light wounds, probaby won't help with" +" deep bites." msgstr "" #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant soaked cotton balls" -msgid_plural "disinfectant soaked cotton balls" -msgstr[0] "zdezynfekowana kulka bawełny" -msgstr[1] "zdezynfekowane kulki bawełny" -msgstr[2] "zdezynfekowane kulki bawełny" -msgstr[3] "zdezynfekowane kulki bawełny" +msgid "antiseptic soaked cotton balls" +msgid_plural "antiseptic soaked cotton balls" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" -#. ~ Description for disinfectant soaked cotton balls +#. ~ Description for antiseptic soaked cotton balls #: lang/json/COMESTIBLE_from_json.py msgid "" -"Fluffy balls of clean white cotton. Now soaked with disinfectant, they are " +"Fluffy balls of clean white cotton. Now soaked with antiseptic, they are " "somewhat useful to disinfect a wound." msgstr "" @@ -35508,6 +35597,22 @@ msgstr[3] "kanapek z dżemem" msgid "A delicious jam sandwich." msgstr "Pyszna kanapka posmarowana dżemem." +#: lang/json/COMESTIBLE_from_json.py +msgid "fairy bread" +msgid_plural "fairy bread" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for fairy bread +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"An 'open-faced sandwich' consisting of sliced white bread, a healthy crust-" +"to-crust slathering of butter, and sprinkles. Supposedly a staple of " +"birthday parties in Australia." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "honey sandwich" msgid_plural "honey sandwiches" @@ -36311,7 +36416,7 @@ msgstr[3] "nasiona tymianku" #. ~ Description for thyme seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some thyme seeds." -msgstr "" +msgstr "Nieco nasion tymianku." #: lang/json/COMESTIBLE_from_json.py msgid "thyme" @@ -36328,7 +36433,7 @@ msgstr[3] "nasiona rzepaku" #. ~ Description for canola seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some canola seeds. You could press them into oil." -msgstr "" +msgstr "Garść nasion rzepaku. Mógłbyś wytłoczyć z nich olej." #: lang/json/COMESTIBLE_from_json.py msgid "pumpkin seeds" @@ -36376,7 +36481,7 @@ msgstr[3] "nasiona psitruja" #. ~ Description for dogbane seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some dogbane seeds." -msgstr "" +msgstr "Nieco nasion psitruja." #: lang/json/COMESTIBLE_from_json.py msgid "bee balm seeds" @@ -36389,7 +36494,7 @@ msgstr[3] "nasiona pysznogłówki" #. ~ Description for bee balm seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some bee balm seeds." -msgstr "" +msgstr "Nieco nasion pysznogłówki." #: lang/json/COMESTIBLE_from_json.py msgid "mugwort seeds" @@ -36402,7 +36507,7 @@ msgstr[3] "nasiona bylicy" #. ~ Description for mugwort seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some mugwort seeds." -msgstr "" +msgstr "Nieco nasion bylicy." #: lang/json/COMESTIBLE_from_json.py msgid "buckwheat seeds" @@ -36415,7 +36520,7 @@ msgstr[3] "nasiona gryki" #. ~ Description for buckwheat seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some buckwheat seeds." -msgstr "" +msgstr "Nieco nasion gryki." #: lang/json/COMESTIBLE_from_json.py msgid "wild herb seeds" @@ -36428,7 +36533,7 @@ msgstr[3] "nasiona dzikich ziół" #. ~ Description for wild herb seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some seeds harvested from wild herbs." -msgstr "" +msgstr "Garść nasion zebranych z dziko rosnących ziół." #: lang/json/COMESTIBLE_from_json.py msgid "wild herb" @@ -36445,7 +36550,7 @@ msgstr[3] "sadzonki dzikich warzyw" #. ~ Description for wild vegetable stems #: lang/json/COMESTIBLE_from_json.py msgid "Some wild vegetable stems." -msgstr "" +msgstr "Kilka sadzonek dzikich warzyw." #: lang/json/COMESTIBLE_from_json.py msgid "wild vegetable" @@ -36462,7 +36567,7 @@ msgstr[3] "nasiona mleczy" #. ~ Description for dandelion seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some dandelion seeds." -msgstr "" +msgstr "Nieco nasion mleczy." #: lang/json/COMESTIBLE_from_json.py lang/json/furniture_from_json.py msgid "dandelion" @@ -36479,7 +36584,7 @@ msgstr[3] "sadzonki rabarbaru" #. ~ Description for rhubarb stems #: lang/json/COMESTIBLE_from_json.py msgid "Some rhubarb stems." -msgstr "" +msgstr "Kilka sadzonek rabarbaru." #: lang/json/COMESTIBLE_from_json.py msgid "morel mushroom spores" @@ -36492,7 +36597,7 @@ msgstr[3] "zarodniki smardzów" #. ~ Description for morel mushroom spores #: lang/json/COMESTIBLE_from_json.py msgid "Some morel mushroom spores." -msgstr "" +msgstr "Nieco zarodników smardzów." #: lang/json/COMESTIBLE_from_json.py msgid "datura seeds" @@ -36509,6 +36614,10 @@ msgid "" "psychoactive chemicals, these tiny seeds are a potent analgesic and " "deliriant, and can be deadly in cases of overdose." msgstr "" +"Małe ciemne nasiona z kolczastych sakiewek bielunia. Pełne silnych " +"psychoaktywnych chemikaliów, te małe nasionka są mocnymi środkami " +"przeciwbólowymi powodującymi delirium, i mogą być zabójcze po " +"przedawkowaniu." #: lang/json/COMESTIBLE_from_json.py lang/json/furniture_from_json.py msgid "datura" @@ -36922,6 +37031,23 @@ msgid "" msgstr "" "Słodki, słodki cukier. Zły dla zębów i zadziwiająco niesmaczny sam w sobie." +#: lang/json/COMESTIBLE_from_json.py +msgid "sprinkles" +msgid_plural "sprinkles" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for sprinkles +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Known as nonpareils, sprinkles, jimmies, sugar strands or 'hundreds-and-" +"thousands', these colorful balls, rods or flakes of sugar and starch are " +"intended for use decorating soft surfaces of sweets. Like sugar, they are " +"bad for your teeth and surprisingly not very tasty on their own." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "wild herbs" msgid_plural "wild herbs" @@ -42320,6 +42446,23 @@ msgstr "" "przezroczystego szkła przechowuje zapisane w postaci miniaturowych wzorów " "instrukcje, wymagane do stworzenia przedmiotu w nanofabrykatorze." +#: lang/json/GENERIC_from_json.py +msgid "nanofabricator template (silicon photonics)" +msgid_plural "nanofabricator template (silicon photonics)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for nanofabricator template (silicon photonics) +#: lang/json/GENERIC_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "antenna" msgid_plural "antennas" @@ -47977,7 +48120,7 @@ msgstr[3] "" #. ~ Description for .300BLK casing #: lang/json/GENERIC_from_json.py -msgid "An empty casing from a .300BLK round." +msgid "An empty casing from a .300 AAC Blackout round." msgstr "" #: lang/json/GENERIC_from_json.py @@ -49894,6 +50037,40 @@ msgid "" "had fake black soot painted on." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "blackjack" +msgid_plural "blackjacks" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for blackjack +#: lang/json/GENERIC_from_json.py +msgid "" +"This is a short, easily concealed bludgeoning weapon consisting of a weight " +"embedded at the end of a short leather shaft. Formerly used by law " +"enforcement, this weapon is meant to stun or knock out the subject, although" +" head strikes have a high risk of causing a permanent, disabling brain " +"injury or being fatal." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "makeshift sap" +msgid_plural "makeshift saps" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for makeshift sap +#: lang/json/GENERIC_from_json.py +msgid "" +"This is an improvised sap, also known as a cosh, slapjack and slapper. A " +"short and flat bludgeoning weapon consisting of a weight embedded between " +"two patches of leather." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "pointy stick" msgid_plural "pointy sticks" @@ -50484,6 +50661,34 @@ msgstr "" "szermiercza jest niewiele krótsza od floretu i szpady, ale nie mniej " "efektywna." +#: lang/json/GENERIC_from_json.py +msgid "hollow cane" +msgid_plural "hollow canes" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for hollow cane +#: lang/json/GENERIC_from_json.py +msgid "" +"A cane designed to conceal blade. This was a popular fashion accessory for " +"the wealthy during the 18th and 19th centuries." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "sword cane" +msgid_plural "sword canes" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for sword cane +#: lang/json/GENERIC_from_json.py +msgid "A sword with a thin blade designed to be hidden inside an hollow cane." +msgstr "" + #: lang/json/GENERIC_from_json.py lang/json/TOOL_from_json.py #: lang/json/TOOL_from_json.py msgid "cutlass" @@ -51321,15 +51526,15 @@ msgstr "Wiosła do łódki." #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "sail" msgid_plural "sails" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "żagiel" +msgstr[1] "żagle" +msgstr[2] "żagli" +msgstr[3] "żagli" #. ~ Description for sail #: lang/json/GENERIC_from_json.py msgid "Sails for a boat." -msgstr "" +msgstr "Żagle do łodzi." #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "inflatable section" @@ -51947,15 +52152,15 @@ msgstr "Reflektor samochodowy oświetlający drogę." #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "motorcycle headlight" msgid_plural "motorcycle headlights" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "reflektor motocyklowy" +msgstr[1] "reflektory motocyklowe" +msgstr[2] "reflektorów motocyklowych" +msgstr[3] "reflektorów motocyklowych" #. ~ Description for motorcycle headlight #: lang/json/GENERIC_from_json.py msgid "A motorcycle headlight to light up the way." -msgstr "" +msgstr "Reflektor motocyklowy do oświetlania drogi." #: lang/json/GENERIC_from_json.py msgid "wide-angle car headlight" @@ -52113,23 +52318,23 @@ msgstr "Mała turbina, która może konwertować siłę wiatru w moc elektryczn #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "large wind turbine" msgid_plural "large wind turbines" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "duża turbina wiatrowa" +msgstr[1] "duże turbiny wiatrowe" +msgstr[2] "dużych turbin wiatrowych" +msgstr[3] "dużych turbin wiatrowych" #. ~ Description for large wind turbine #: lang/json/GENERIC_from_json.py msgid "A large turbine that can convert wind into electric power." -msgstr "" +msgstr "Duża turbina, która może przekształcać wiatr w energię elektryczną." #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "water wheel" msgid_plural "water wheels" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "koło wodne" +msgstr[1] "koła wodne" +msgstr[2] "kół wodnych" +msgstr[3] "kół wodnych" #. ~ Description for water wheel #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py @@ -52137,14 +52342,16 @@ msgid "" "A water wheel. Will slowly recharge the vehicle's electrical power when " "built over shallow moving water." msgstr "" +"Koło wodne. Powoli będzie ładować energię elektryczną pojazdu, gdy zostanie " +"zbudowane na płytkiej, poruszającej się wodzie." #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "large water wheel" msgid_plural "large water wheels" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "duże koło wodne" +msgstr[1] "duże koła wodne" +msgstr[2] "dużych kół wodnych" +msgstr[3] "dużych kół wodnych" #. ~ Description for large water wheel #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py @@ -52152,6 +52359,8 @@ msgid "" "A large water wheel with wooden supports. Will recharge the vehicle's " "electrical power when built over shallow moving water." msgstr "" +"Duże koło wodne z drewnianymi podporami. Ponownie naładuje energię " +"elektryczną pojazdu, gdy zostanie zbudowane na płytkiej wodzie w ruchu." #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py #: lang/json/vehicle_part_from_json.py @@ -52807,10 +53016,10 @@ msgstr "Prosty drewniany stół." #: lang/json/vehicle_part_from_json.py msgid "workbench" msgid_plural "workbenchs" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "stół warsztatowy" +msgstr[1] "stoły warsztatowe" +msgstr[2] "stołów warsztatowych" +msgstr[3] "stołów warsztatowych" #. ~ Description for workbench #: lang/json/GENERIC_from_json.py lang/json/furniture_from_json.py @@ -52818,6 +53027,8 @@ msgid "" "A sturdy workbench built out of metal. It is perfect for crafting large and" " heavy things." msgstr "" +"Solidny stół warsztatowy zbudowany z metalu. Jest idealny do tworzenia " +"dużych i ciężkich przedmiotów." #: lang/json/GENERIC_from_json.py lang/json/furniture_from_json.py #: lang/json/vehicle_part_from_json.py @@ -59147,6 +59358,15 @@ msgstr "" msgid "A cheap 6-round steel box magazine for the Jennings J-22." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "Walther P22 magazine" +msgstr "" + +#. ~ Description for Walther P22 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round box magazine for the Walther P22." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "LW-5 speedloader" msgstr "" @@ -59574,6 +59794,20 @@ msgstr "" msgid "A cheap 32-round steel box magazine for use with the MAC-11 SMG." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "CF-380 magazine" +msgstr "" + +#. ~ Description for CF-380 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Hi-Point CF-380." +msgstr "" + +#. ~ Description for CF-380 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point CF-380." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "M1911 .38 Super magazine" msgstr "" @@ -59637,6 +59871,43 @@ msgid "" "expect much reliability." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "Hi-Power magazine .40 S&W" +msgstr "" + +#. ~ Description for Hi-Power magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Browning Hi-Power .40 S&W." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine .40 S&W" +msgstr "" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 12 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 14 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "Model JCP magazine" +msgstr "" + +#. ~ Description for Model JCP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point Model JCP." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "grenade belt" msgstr "pas z granatami 40mm" @@ -59798,6 +60069,24 @@ msgstr "magazynek USP .45" msgid "A standard capacity magazine for use with the H&K USP handgun." msgstr "Standardowej pojemności magazynek do pistoletu H&K USP." +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine .45 ACP" +msgstr "" + +#. ~ Description for PPQ magazine .45 ACP +#: lang/json/MAGAZINE_from_json.py +msgid "A 12 round steel box magazine for the Walther PPQ .45 ACP." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "Model JHP magazine" +msgstr "" + +#. ~ Description for Model JHP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 9-round steel box magazine for use with the Hi-Point Model JHP." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid ".454 5-round speedloader" msgstr "" @@ -60308,6 +60597,95 @@ msgstr "" msgid "A 17 round double stack box magazine for the SIG Sauer P320." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "Hi-Power magazine 9x19mm" +msgstr "" + +#. ~ Description for Hi-Power magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 13 round steel box magazine for the Browning Hi-Power 9x19mm." +msgstr "" + +#. ~ Description for Hi-Power magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 15 round steel box magazine for the Browning Hi-Power 9x19mm." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "P38 magazine" +msgstr "" + +#. ~ Description for P38 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8 round steel box magazine for the Walther P38." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine 9x19mm" +msgstr "" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Walther PPQ 9mm." +msgstr "" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 15 round steel box magazine for the Walther PPQ 9mm." +msgstr "" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 17 round steel box magazine for the Walther PPQ 9mm." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "C-9 magazine" +msgstr "" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Hi-Point C-9." +msgstr "" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point C-9." +msgstr "" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 15-round steel box magazine for use with the Hi-Point C-9." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "CZ 75 magazine" +msgstr "" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 12-round steel box magazine for use with the CZ 75." +msgstr "" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 20-round steel box magazine for use with the CZ 75." +msgstr "" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 26-round steel box magazine for use with the CZ 75." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "CCP magazine" +msgstr "" + +#. ~ Description for CCP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Walther CCP." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "Makarov PM magazine" msgstr "magazynek Makarow PM" @@ -64349,11 +64727,8 @@ msgstr "wieżyczka wojskowa" #: lang/json/MONSTER_from_json.py msgid "" "Leadworks LLC's T-4A1 Sentry. It features improved firmware over General " -"Atomics' TX-1 9x19mm model and an automated M4 carbine." +"Atomics' TX-1 9x19mm model and an automated 5.56mm carbine." msgstr "" -"Wieżyczka firmy Leadworks Sp z o.o. T-4A1 Strażnik. Posiada ulepszone " -"oprogramowanie wewnętrzne względem modelu General Atomics TX-1 9x19mm oraz " -"zautomatyzowany karabinek M4." #: lang/json/MONSTER_from_json.py msgid "debug monster" @@ -65959,6 +66334,47 @@ msgid "" "between walls and ceiling with limbs grown from its own disjointed ribs." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "gangrenous impaler" +msgstr "" + +#. ~ Description for gangrenous impaler +#: lang/json/MONSTER_from_json.py +msgid "" +"A corpse hideously twisted into an insect-like form. A hollow tendril " +"reaches out from its open thorax." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "The impaler launches a barb!" +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "trapped tendril" +msgstr "" + +#. ~ Description for trapped tendril +#: lang/json/MONSTER_from_json.py +msgid "" +"A great tendril of mutated flesh and sharpened bone. Emergent from a " +"crevice in the ruined floor, hundreds of human limbs seek freedom and writhe" +" incessantly from underneath its grotesque carapace. As enormous as it may " +"already be, you feel certain that this is just part of a creature much " +"bigger, for when it moves, you can feel this whole ruin tremble, as if an " +"unseen giant struggled against the weight of its concrete tomb." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "flesh wall" +msgstr "" + +#. ~ Description for flesh wall +#: lang/json/MONSTER_from_json.py +msgid "" +"A great lump of mutated flesh. It resembles the innards of some gigantic " +"creature and is covered in a grid of diminutive veins." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "bloated fungal zombie" msgstr "" @@ -69808,6 +70224,24 @@ msgid "" "effect. Starts very short range, increases rapidly with level." msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Summon Gangrenous Crawlers" +msgstr "" + +#. ~ Description for Summon Gangrenous Crawlers +#: lang/json/SPELL_from_json.py +msgid "Summons 2 permanent gangrenous crawlers." +msgstr "" + +#: lang/json/SPELL_from_json.py +msgid "Summon Gangrenous Monsters" +msgstr "" + +#. ~ Description for Summon Gangrenous Monsters +#: lang/json/SPELL_from_json.py +msgid "Summons 2 permanent gangrenous impalers." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Smite" msgstr "" @@ -77362,6 +77796,21 @@ msgid "" "used for cleaning impervious surfaces." msgstr "" +#: lang/json/TOOL_from_json.py +msgid "washing kit" +msgid_plural "washing kits" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#. ~ Description for washing kit +#: lang/json/TOOL_from_json.py +msgid "" +"A combination kit of a washboard and a sponge. Everything you need to clean" +" items after the apocalypse." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "reading light" msgid_plural "reading lights" @@ -86472,6 +86921,10 @@ msgstr ".45-70" msgid "nails" msgstr "gwoździe" +#: lang/json/ammunition_type_from_json.py +msgid "barb" +msgstr "" + #: lang/json/ammunition_type_from_json.py msgid "BBs" msgstr "śrut" @@ -86682,8 +87135,8 @@ msgid "components" msgstr "komponenty" #: lang/json/ammunition_type_from_json.py -msgid "93mm RPG-7" -msgstr "93mm RPG-7" +msgid "RPG-7 rocket" +msgstr "" #: lang/json/ammunition_type_from_json.py msgid "rebreather filter" @@ -86817,18 +87270,6 @@ msgid "" "those in turn more often than massive objects." msgstr "" -#: lang/json/bionic_from_json.py -msgid "Advanced Microreactor System" -msgstr "System Zaawansowanego Mikroreaktora" - -#. ~ Description for Advanced Microreactor System -#: lang/json/bionic_from_json.py -msgid "" -"This stripped down mini-reactor is more efficient and safer than the base " -"model due to integrated radiation cleansers. There is no way to shut it " -"down once active, but you can toggle additional fuel intake." -msgstr "" - #: lang/json/bionic_from_json.py msgid "Alarm System" msgstr "System Alarmowy" @@ -87706,28 +88147,6 @@ msgstr "" " na skinienie woli. Skutkiem ubocznym może być spowolnienie reakcji i " "senność." -#: lang/json/bionic_from_json.py -msgid "Plutonium Filter" -msgstr "Filtr Plutonu" - -#. ~ Description for Plutonium Filter -#: lang/json/bionic_from_json.py -msgid "" -"This set of tanks and filters allows you to extract plutonium from " -"radioactive slurry." -msgstr "" - -#: lang/json/bionic_from_json.py -msgid "Plutonium Purger" -msgstr "Zrzut Plutonu" - -#. ~ Description for Plutonium Purger -#: lang/json/bionic_from_json.py -msgid "" -"Triggers an emergency reactor fuel purge that ejects all fuel from your " -"reactor." -msgstr "" - #. ~ Description for Bionic Visual Impairment #: lang/json/bionic_from_json.py msgid "" @@ -87862,18 +88281,6 @@ msgid "" "amount of unarmed slashing damage whenever your fingertips are uncovered." msgstr "" -#: lang/json/bionic_from_json.py -msgid "Microreactor System" -msgstr "System Mikroreaktora" - -#. ~ Description for Microreactor System -#: lang/json/bionic_from_json.py -msgid "" -"This stripped down mini-reactor generates impressive amounts of bionic " -"power. There is no way to shut it down, but you can toggle additional fuel " -"intake. Irradiates your body when active." -msgstr "" - #: lang/json/bionic_from_json.py msgid "Recycler Unit" msgstr "Jednostka Recyklingu" @@ -88342,6 +88749,52 @@ msgid "" "artificial but effective sensation of fatigue." msgstr "" +#: lang/json/bionic_from_json.py +msgid "Advanced Microreactor System" +msgstr "System Zaawansowanego Mikroreaktora" + +#. ~ Description for Advanced Microreactor System +#: lang/json/bionic_from_json.py +msgid "" +"This stripped down mini-reactor is more efficient and safer than the base " +"model due to integrated radiation cleansers. There is no way to shut it " +"down once active, but you can toggle additional fuel intake." +msgstr "" + +#: lang/json/bionic_from_json.py +msgid "Plutonium Filter" +msgstr "Filtr Plutonu" + +#. ~ Description for Plutonium Filter +#: lang/json/bionic_from_json.py +msgid "" +"This set of tanks and filters allows you to extract plutonium from " +"radioactive slurry." +msgstr "" + +#: lang/json/bionic_from_json.py +msgid "Plutonium Purger" +msgstr "Zrzut Plutonu" + +#. ~ Description for Plutonium Purger +#: lang/json/bionic_from_json.py +msgid "" +"Triggers an emergency reactor fuel purge that ejects all fuel from your " +"reactor." +msgstr "" + +#: lang/json/bionic_from_json.py +msgid "Microreactor System" +msgstr "System Mikroreaktora" + +#. ~ Description for Microreactor System +#: lang/json/bionic_from_json.py +msgid "" +"This stripped down mini-reactor generates impressive amounts of bionic " +"power. There is no way to shut it down, but you can toggle additional fuel " +"intake. Irradiates your body when active." +msgstr "" + #: lang/json/bionic_from_json.py msgid "Internal Furnace" msgstr "Wewnętrzny Piec" @@ -88476,11 +88929,7 @@ msgstr "Uniki i walka wręcz są utrudnione." #: lang/json/bodypart_from_json.py src/armor_layers.cpp src/character.cpp #: src/debug_menu.cpp msgid "Torso" -msgid_plural "Torso" -msgstr[0] "Tors" -msgstr[1] "Tors" -msgstr[2] "Tors" -msgstr[3] "Tors" +msgstr "Tors" #. ~ Crafting recipes subcategory of 'ARMOR' category #: lang/json/bodypart_from_json.py lang/json/recipe_category_from_json.py @@ -88499,11 +88948,7 @@ msgstr "głowę" #: lang/json/bodypart_from_json.py src/armor_layers.cpp src/character.cpp #: src/debug_menu.cpp msgid "Head" -msgid_plural "Head" -msgstr[0] "Głowa" -msgstr[1] "Głowa" -msgstr[2] "Głowa" -msgstr[3] "Głowa" +msgstr "Głowa" #. ~ Crafting recipes subcategory of 'ARMOR' category #: lang/json/bodypart_from_json.py lang/json/recipe_category_from_json.py @@ -88525,11 +88970,7 @@ msgstr "Walka dystansowa jest utrudnione." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "Eyes" -msgid_plural "Eyes" -msgstr[0] "Oczy" -msgstr[1] "Oczy" -msgstr[2] "Oczy" -msgstr[3] "Oczy" +msgstr "Oczy" #: lang/json/bodypart_from_json.py msgid "mouth" @@ -88546,11 +88987,7 @@ msgstr "Bieganie jest spowolnione." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "Mouth" -msgid_plural "Mouth" -msgstr[0] "Usta" -msgstr[1] "Usta" -msgstr[2] "Usta" -msgstr[3] "Usta" +msgstr "Usta" #: lang/json/bodypart_from_json.py msgid "left arm" @@ -88561,17 +88998,26 @@ msgctxt "bodypart_accusative" msgid "left arm" msgstr "lewą rękę" +#: lang/json/bodypart_from_json.py +msgid "arms" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "arms" +msgstr "" + #: lang/json/bodypart_from_json.py msgid "Melee and ranged combat is hampered." msgstr "Walka wręcz i dystansowa są utrudnione." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Arm" -msgid_plural "Arms" -msgstr[0] "L. Ręka" -msgstr[1] "Ręce" -msgstr[2] "Rąk" -msgstr[3] "Ręki" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgid "Arms" +msgstr "Ręki" #: lang/json/bodypart_from_json.py msgid "L ARM" @@ -88588,11 +89034,7 @@ msgstr "prawa ręka" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Arm" -msgid_plural "Arms" -msgstr[0] "P. Ręka" -msgstr[1] "Ręce" -msgstr[2] "Rąk" -msgstr[3] "Ręki" +msgstr "" #: lang/json/bodypart_from_json.py msgid "R ARM" @@ -88607,17 +89049,26 @@ msgctxt "bodypart_accusative" msgid "left hand" msgstr "lewą dłoń" +#: lang/json/bodypart_from_json.py +msgid "hands" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "hands" +msgstr "" + #: lang/json/bodypart_from_json.py msgid "Manual tasks are slowed." msgstr "Prace ręczne są zwolnione." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Hand" -msgid_plural "Hands" -msgstr[0] "L.Dłoń" -msgstr[1] "Dłonie" -msgstr[2] "Dłonie" -msgstr[3] "Dłonie" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgid "Hands" +msgstr "Dłonie" #: lang/json/bodypart_from_json.py msgid "right hand" @@ -88630,11 +89081,7 @@ msgstr "prawą dłoń" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Hand" -msgid_plural "Hands" -msgstr[0] "P.Dłoń" -msgstr[1] "Dłonie" -msgstr[2] "Dłonie" -msgstr[3] "Dłonie" +msgstr "" #: lang/json/bodypart_from_json.py msgid "left leg" @@ -88645,17 +89092,26 @@ msgctxt "bodypart_accusative" msgid "left leg" msgstr "lewą nogę" +#: lang/json/bodypart_from_json.py +msgid "legs" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "legs" +msgstr "" + #: lang/json/bodypart_from_json.py msgid "Running and swimming are slowed." msgstr "Bieganie i pływanie są zwolnione." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Leg" -msgid_plural "Legs" -msgstr[0] "L.Noga" -msgstr[1] "Nogi" -msgstr[2] "Nogi" -msgstr[3] "Nogi" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgid "Legs" +msgstr "Nogi" #: lang/json/bodypart_from_json.py msgid "L LEG" @@ -88672,11 +89128,7 @@ msgstr "prawą nogę" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Leg" -msgid_plural "Legs" -msgstr[0] "P.Noga" -msgstr[1] "Nogi" -msgstr[2] "Nogi" -msgstr[3] "Nogi" +msgstr "" #: lang/json/bodypart_from_json.py msgid "R LEG" @@ -88691,13 +89143,22 @@ msgctxt "bodypart_accusative" msgid "left foot" msgstr "lewą stopę" +#: lang/json/bodypart_from_json.py +msgid "feet" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "feet" +msgstr "" + #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Foot" -msgid_plural "Feet" -msgstr[0] "L.Stopa" -msgstr[1] "Stopy" -msgstr[2] "Stopy" -msgstr[3] "Stopy" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgid "Feet" +msgstr "Stopy" #: lang/json/bodypart_from_json.py msgid "right foot" @@ -88710,19 +89171,11 @@ msgstr "prawą stopę" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Foot" -msgid_plural "Feet" -msgstr[0] "P.Stopa" -msgstr[1] "Stopy" -msgstr[2] "Stopy" -msgstr[3] "Stopy" +msgstr "" #: lang/json/bodypart_from_json.py msgid "appendix" -msgid_plural "Appendices" -msgstr[0] "wyrostek" -msgstr[1] "Wyrostki" -msgstr[2] "Wyrostki" -msgstr[3] "Wyrostki" +msgstr "wyrostek" #: lang/json/bodypart_from_json.py msgctxt "bodypart_accusative" @@ -88733,6 +89186,10 @@ msgstr "wyrostek" msgid "It's inflamed." msgstr "Cierpi zapalenie." +#: lang/json/bodypart_from_json.py +msgid "Appendices" +msgstr "Wyrostki" + #: lang/json/clothing_mod_from_json.py msgid "Pad with leather" msgstr "Wszyj skórzane podbicie" @@ -97861,7 +98318,9 @@ msgstr "" " Bełty z niej wystrzelone mają dobrą szansę pozostanie w jednym kawałku i " "mogą być ponownie użyte." -#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py src/item.cpp +#: lang/json/gun_from_json.py lang/json/gun_from_json.py +#: lang/json/gunmod_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gunmod_from_json.py src/item.cpp msgctxt "gun_type_type" msgid "pistol" msgstr "pistolet" @@ -98020,6 +98479,22 @@ msgstr "" " pompka u boku pozwala uzupełnić ciśnienie, choć proces ten zajmuje kilka " "minut." +#: lang/json/gun_from_json.py +msgid "simple flamethrower" +msgid_plural "simple flamethrowers" +msgstr[0] "prosty miotacz ognia" +msgstr[1] "prosty miotacz ognia" +msgstr[2] "prosty miotacz ognia" +msgstr[3] "prosty miotacz ognia" + +#: lang/json/gun_from_json.py +msgid "" +"A simple, home-made flamethrower. While its capacity is not superb, it is " +"more than capable of igniting terrain and monsters alike." +msgstr "" +"Prosty miotacz ognia domowej produkcji. Choć jego pojemność nie jest " +"doskonała, to jest zdolny palić zarówno potwory jak i otoczenie." + #: lang/json/gun_from_json.py msgid "BB gun" msgid_plural "BB guns" @@ -98801,6 +99276,21 @@ msgstr "" " pistoletów kieszonkowych, były one częściej wykorzystywane przez " "przestępców niezrażonych ich rażącymi kwestiami bezpieczeństwa." +#: lang/json/gun_from_json.py +msgid "Walther P22" +msgid_plural "Walther P22s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: lang/json/gun_from_json.py +msgid "" +"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" +msgstr "" + #: lang/json/gun_from_json.py msgid "Remington ACR" msgid_plural "Remington ACRs" @@ -99950,6 +100440,22 @@ msgid "" " make for a moderately poor handling pistol." msgstr "" +#: lang/json/gun_from_json.py +msgid "Hi-Point CF-380" +msgid_plural "Hi-Point CF-380s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "M1911A1" msgid_plural "M1911A1s" @@ -100056,6 +100562,53 @@ msgstr "" "Smith and Wesson 610 to klasyczny sześciostrzałowy rewolwer kalibru 10mm, " "lub własnej amunicji S&W kalibru .40." +#: lang/json/gun_from_json.py +msgid "Browning Hi-Power .40 S&W" +msgid_plural "Browning Hi-Power .40 S&Ws" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Browning Hi-Power is a semi-automatic handgun developed shortly before " +"the second world war. Widely issued since then, it remains in use by India, " +"Canada and Australia. This is a commercial variant produced by Browning Arms" +" in .40 S&W." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther PPQ .40 S&W" +msgid_plural "Walther PPQ .40 S&Ws" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in .40 S&W." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Hi-Point Model JCP" +msgid_plural "Hi-Point Model JCPs" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "tube 40mm launcher" msgid_plural "tube 40mm launchers" @@ -100464,6 +101017,37 @@ msgstr[1] "USP .45" msgstr[2] "USP .45" msgstr[3] "USP .45" +#: lang/json/gun_from_json.py +msgid "Walther PPQ .45 ACP" +msgid_plural "Walther PPQ .45 ACPs" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in .45 ACP." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Hi-Point Model JHP" +msgid_plural "Hi-Point Model JHPs" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "Taurus Raging Bull" msgid_plural "Taurus Raging Bull" @@ -101599,6 +102183,106 @@ msgid "" "SIG Sauer P320." msgstr "" +#: lang/json/gun_from_json.py +msgid "Browning Hi-Power 9x19mm" +msgid_plural "Browning Hi-Power 9x19mms" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Browning Hi-Power is a semi-automatic handgun developed shortly before " +"the second world war. Widely issued since then, it remains in use by India, " +"Canada and Australia. This is a commercial variant produced by Browning Arms" +" in 9x19mm Parabellum." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther P38" +msgid_plural "Walther P38s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther PPQ 9mm" +msgid_plural "Walther PPQ 9mms" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in 9x19mm Parabellum." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Hi-Point C-9" +msgid_plural "Hi-Point C-9s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "CZ-75" +msgid_plural "CZ-75s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: lang/json/gun_from_json.py +msgid "" +"The CZ-75 is a semi-automatic pistol developed in Czechoslovakia, and is one" +" of the original wonder nines. Though designed for export to western " +"countries, it was declared a state secret; lack of international patent " +"protection meant that many clones and variants were produced and distributed" +" around the world, with Česká zbrojovka only joining in the 90's. This " +"pistol remains wildly popular among competition shooters." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther CCP" +msgid_plural "Walther CCPs" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "Makarov PM" msgid_plural "Makarov PMs" @@ -101719,22 +102403,6 @@ msgid "" msgstr "" "Duży miotacz ognia ze znaczną rezerwą paliwa. Bardzo groźny i zabójczy." -#: lang/json/gun_from_json.py -msgid "simple flamethrower" -msgid_plural "simple flamethrowers" -msgstr[0] "prosty miotacz ognia" -msgstr[1] "prosty miotacz ognia" -msgstr[2] "prosty miotacz ognia" -msgstr[3] "prosty miotacz ognia" - -#: lang/json/gun_from_json.py -msgid "" -"A simple, home-made flamethrower. While its capacity is not superb, it is " -"more than capable of igniting terrain and monsters alike." -msgstr "" -"Prosty miotacz ognia domowej produkcji. Choć jego pojemność nie jest " -"doskonała, to jest zdolny palić zarówno potwory jak i otoczenie." - #: lang/json/gun_from_json.py msgid "RM451 flamethrower" msgid_plural "RM451 flamethrowers" @@ -101873,6 +102541,18 @@ msgstr "" "rozpędzany do progu spontanicznego zapłonu przez siłę Lorenza generowaną " "indukcją elektromagnetyczną, zasilaną ze standardowego UPS'a." +#: lang/json/gun_from_json.py +msgid "barb launching organ" +msgid_plural "barb launching organs" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: lang/json/gun_from_json.py +msgid "A mutated organ capable of launching bony barbs at great speed." +msgstr "" + #: lang/json/gun_from_json.py msgid "coilgun" msgid_plural "coilguns" @@ -102606,6 +103286,21 @@ msgstr "" "przechodzi przez różne cele. Strzał energii rozpala tlen tworząc pożary na " "swej drodze, i powoduje eksplozje przy uderzeniu w cel." +#: lang/json/gun_from_json.py +msgid "Yeet Cannon" +msgid_plural "Yeet Cannons" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: lang/json/gun_from_json.py +msgid "" +"You can YEET all the bullets with this baby. YEET them right into all of the" +" zombies in your path, all the hulks, the spiders, and those damned mole " +"rats." +msgstr "" + #: lang/json/gun_from_json.py msgid "SVS-24" msgid_plural "SVS-24" @@ -104771,29 +105466,6 @@ msgstr "" "Taurus Raging Judge Magnum to 5-strzałowy rewolwer w kalibrze .454 Casull. " "Może też strzelać nabojami kalibru .410 i .45 Long Colt." -#: lang/json/gunmod_from_json.py -msgid ".300 AAC Blackout caliber conversion kit" -msgid_plural ".300 AAC Blackout caliber conversion kits" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#: lang/json/gunmod_from_json.py -msgid "" -"This kit is used to convert an AR-15 .223/5.56mm rifle to the new .300BLK " -"caliber." -msgstr "" - -#: lang/json/gunmod_from_json.py -msgid "bore" -msgstr "kaliber" - -#: lang/json/gunmod_from_json.py -msgctxt "gun_type_type" -msgid "ar15" -msgstr "ar15" - #: lang/json/gunmod_from_json.py msgid "barrel extension" msgid_plural "barrel extensions" @@ -104904,6 +105576,10 @@ msgstr "" "7.62x39mm or .223 konwertuje ją w kaliber .22. Konwersja skutkuje nieco " "zmniejszoną celnością." +#: lang/json/gunmod_from_json.py +msgid "bore" +msgstr "kaliber" + #: lang/json/gunmod_from_json.py msgid ".223 caliber conversion kit" msgid_plural ".223 caliber conversion kits" @@ -105301,6 +105977,38 @@ msgstr "" "Torba, która zwisa z boku broni i chwyta wyrzucane łuski, których nie musisz" " już potem zbierać." +#: lang/json/gunmod_from_json.py +msgid ".300 AAC Blackout AR-15 conversion kit" +msgid_plural ".300 AAC Blackout AR-15 conversion kits" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: lang/json/gunmod_from_json.py +msgid "A complete AR-15 upper assembly with a .300 AAC Blackout barrel." +msgstr "" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "ar15" +msgstr "ar15" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "m4a1" +msgstr "" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "h&k416a5" +msgstr "" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "m27iar" +msgstr "" + #: lang/json/gunmod_from_json.py msgid "lightweight replacement furniture" msgid_plural "lightweight replacement furnitures" @@ -107730,11 +108438,11 @@ msgstr "" #: lang/json/help_from_json.py msgid "" -"While magazines are often firearm-specific, on some occasions a magazine is compatible with several other firearms. The firearms in the game often reflect real-world prototypes in terms of caliber and compatibility. Below are some examples of interchangeable ammo:\n" -".308 = 7.62x51mm,\n" -".223 = 5.56 NATO,\n" -".270 = .30-06,\n" -".40 S&W = 10mm." +"While magazines and clips are often firearm-specific, on some occasions a magazine/speedloader is compatible with several other firearms or calibers. Below are some examples of calibers that might share magazines or speedloaders:\n" +".380 ACP and 9mm Luger,\n" +" .40 S&W and 10mm Auto 3\n" +".45 ACP and .460 Rowland,\n" +".45 Colt and .454 Casull." msgstr "" #: lang/json/help_from_json.py @@ -108858,8 +109566,9 @@ msgid "Measure radiation" msgstr "Zmierz promieniowanie" #: lang/json/item_action_from_json.py lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py #: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py -#: lang/json/talk_topic_from_json.py src/game_inventory.cpp +#: src/game_inventory.cpp msgid "..." msgstr "..." @@ -108921,11 +109630,15 @@ msgid "Well, you know" msgstr "Cóż, no wiesz" #: lang/json/item_action_from_json.py -msgid "Wash clothes" -msgstr "Umyj ubrania" +msgid "Wash soft items" +msgstr "" + +#: lang/json/item_action_from_json.py +msgid "Wash hard items" +msgstr "" #: lang/json/item_action_from_json.py -msgid "Wash CBMs" +msgid "Wash items" msgstr "" #: lang/json/item_action_from_json.py @@ -112592,6 +113305,41 @@ msgstr "Szeroki wybór akumulatorów! Rabaty!" msgid "the name is gone but a slogan remains: 'We'll repair you all the way'" msgstr "nazwa zniknęła ale slogan pozostał: \"Naprawimy cię wzdłuż i wszerz\"" +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "EnviroCom OS v2.03 - Basement Access" +msgstr "" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Unlock stairs" +msgstr "Odblokuj schody" + +#. ~ Sign +#: lang/json/mapgen_from_json.py +msgid "Authorized personnel only" +msgstr "" + +#. ~ Sign +#: lang/json/mapgen_from_json.py +msgid " sewage treatment plant" +msgstr "" + +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "EnviroCom OS v2.03" +msgstr "EnviroCom OS v2.03" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Download Sewer Maps" +msgstr "Pobierz Mapę Kanałów" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Divert sample" +msgstr "Odwróć próbkę" + #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Evac shelter computer" @@ -113205,6 +113953,43 @@ msgid "" "Blocked damage reduced by 50%% of Dexterity." msgstr "" +#. ~ Description for martial art 'Fior Di Battaglia' +#: lang/json/martial_art_from_json.py +msgid "" +"Medieval Europe's martial techniques for fighting with polearms. The " +"\"Flower of Battle\" places great focus on countering one's opponent and " +"knocking them down before landing a killing blow" +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stand Your Ground" +msgstr "" + +#. ~ Description of buff 'Stand Your Ground' for martial art 'Fior Di +#. Battaglia' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You stalwart and will not budge against any threat.\n" +"\n" +"+2 Block attempts, -1.0 Dodge skill, blocked damage reduced by 50%% of Strength." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Tactical Retreat" +msgstr "" + +#. ~ Description of buff 'Tactical Retreat' for martial art 'Fior Di +#. Battaglia' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You moved and nullified the effects of Stand Your Ground!\n" +"\n" +"-2 Block attempts, +1.0 Dodge skill, blocked damaged increased by 50%% of Strength.\n" +"Lasts 1 turn." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Karate" msgstr "Karate" @@ -113689,35 +114474,6 @@ msgstr "" msgid "Perception increases dodging ability, +1 dodges per turn" msgstr "" -#. ~ Description for martial art 'Fior Di Battaglia' -#: lang/json/martial_art_from_json.py -msgid "" -"Medieval Europe's martial techniques for fighting with polearms, great focus" -" is given in countering one's opponent and knocking them down before landing" -" a killing blow" -msgstr "" - -#: lang/json/martial_art_from_json.py -msgid "Stand Your Ground" -msgstr "" - -#. ~ Description of buff 'Stand Your Ground' for martial art 'Fior Di -#. Battaglia' -#: lang/json/martial_art_from_json.py -msgid "" -"+2 blocks -1 dodge, halves your dodge and damage is reduced by your strength" -" when blocking" -msgstr "" - -#: lang/json/martial_art_from_json.py -msgid "You moved" -msgstr "" - -#. ~ Description of buff 'You moved' for martial art 'Fior Di Battaglia' -#: lang/json/martial_art_from_json.py -msgid "Nullifies Stand Your Ground, don't move, stand there and counter!" -msgstr "" - #: lang/json/martial_art_from_json.py msgid "Medieval Swordsmanship" msgstr "Średniowieczna Sztuka Władania Mieczem" @@ -115752,39 +116508,6 @@ msgstr "Urzejmie ci dzięuję za jego odnalezienie." msgid "Oh no! My poor puppy..." msgstr "Och nie! Mój biedny, biedny piesek...." -#: lang/json/mission_def_from_json.py -msgid "Find 100 Cigarettes" -msgstr "Znajdź 100 Papierosów" - -#: lang/json/mission_def_from_json.py -msgid "Come on man, I just need a smoke." -msgstr "No dalej stary, potrzebuję tylko zapalić." - -#: lang/json/mission_def_from_json.py -msgid "" -"With all that's been going on, it's been more and more difficult to find a " -"smoke. My stash has been running low for a while now. Think you could help" -" me out here? A few packs is all I need." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "Thanks, it's great to see someone willing to help a guy out." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "" -"Plenty of smokers in towns. Gotta be some left over cigs in some of them " -"houses." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "Got the smokes?" -msgstr "Masz te papierosy?" - -#: lang/json/mission_def_from_json.py -msgid "Thanks! I'll be sure to put in a good word for you around the center." -msgstr "Dziękuję! Nie zapomnę szepnąć kilku miłych słów o tobie w centrum." - #: lang/json/mission_def_from_json.py msgid "Break into armory to retrieve family photo" msgstr "" @@ -117142,7 +117865,7 @@ msgid "" msgstr "" #: lang/json/mission_def_from_json.py -msgid "Find 50 3L jars" +msgid "In a Pickle Pt. 2" msgstr "" #: lang/json/mission_def_from_json.py @@ -117171,6 +117894,39 @@ msgid "" "payment." msgstr "" +#: lang/json/mission_def_from_json.py +msgid "Smokes, let's go." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Come on man, I just need a smoke." +msgstr "No dalej stary, potrzebuję tylko zapalić." + +#: lang/json/mission_def_from_json.py +msgid "" +"With all that's been going on, it's been more and more difficult to find a " +"smoke. My stash has been running low for a while now. Think you could help" +" me out here? A few packs is all I need." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Thanks, it's great to see someone willing to help a guy out." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Plenty of smokers in towns. Gotta be some left over cigs in some of them " +"houses." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Got the smokes?" +msgstr "Masz te papierosy?" + +#: lang/json/mission_def_from_json.py +msgid "Thanks! I'll be sure to put in a good word for you around the center." +msgstr "Dziękuję! Nie zapomnę szepnąć kilku miłych słów o tobie w centrum." + #: lang/json/mission_def_from_json.py msgid "Clear Back Bay" msgstr "Oczyść Boczną Zatokę" @@ -117286,7 +118042,7 @@ msgid "" msgstr "" #: lang/json/mission_def_from_json.py -msgid "Find 10 solar panels" +msgid "Solar Power" msgstr "" #: lang/json/mission_def_from_json.py @@ -117318,7 +118074,7 @@ msgstr "" "dzięki twoim staraniom." #: lang/json/mission_def_from_json.py -msgid "Find 100 canning jars" +msgid "In a Pickle" msgstr "" #: lang/json/mission_def_from_json.py @@ -117619,8 +118375,8 @@ msgid "Thank you, I'll do the explaining if anyone else asks about it." msgstr "Dziękuję. Wyjaśnię sprawę gdyby ktoś dopytywał." #: lang/json/mission_def_from_json.py -msgid "Kill ???" -msgstr "Zabić ???" +msgid "Secure Trade Route" +msgstr "" #: lang/json/mission_def_from_json.py msgid "" @@ -117651,8 +118407,8 @@ msgid "Great work, wasn't sure what I was sending you after." msgstr "Dobra robota, nie wiedziałem czego każę ci szukać." #: lang/json/mission_def_from_json.py -msgid "Kill Raider Leader" -msgstr "Zabij Przywódcę Bandytów" +msgid "Assassinate Raider Leader" +msgstr "" #: lang/json/mission_def_from_json.py msgid "" @@ -117791,8 +118547,8 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" -"Remember, do extraction /exactly/ as specified, otherwise the bionic will " -"self-destruct." +"Remember, perform the extraction /exactly/ as specified, otherwise the " +"bionic will self-destruct." msgstr "" #: lang/json/mission_def_from_json.py @@ -117816,6 +118572,37 @@ msgstr "" msgid "You have our thanks and payment." msgstr "" +#: lang/json/mission_def_from_json.py +msgid "Light retrieval" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Our facility once sourced advanced photonic circuitry from a nearby robotics manufacturer. Their building suffered major damage during the portal storms, and collapsed almost entirely. However, preliminary scouting reveals that the basement prototyping lab likely remains intact.\n" +"\n" +"the intercom: We ask you to investigate the ruins, and if possible, retrieve a template for the fabrication of said photonic circuitry." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "We expect your success, mercenary." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Return if you change your mind." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"The scout drone also revealed extensive heat signatures and high " +"concentrations of toxic compounds within the ruins, plan accordingly. We " +"are willing to sell you some protective gear at a discount, if you require " +"it." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Have you retrieved the blueprints?" +msgstr "" + #: lang/json/mission_def_from_json.py msgid "Make 2 Stills" msgstr "Zbuduj 2 Destylarnie" @@ -129623,6 +130410,10 @@ msgstr "kabina cukrowa" msgid "sugar house roof" msgstr "dach kabiny cukrowej" +#: lang/json/overmap_terrain_from_json.py +msgid "rural road" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "farm field" msgstr "pole uprawne" @@ -131447,8 +132238,16 @@ msgid "parking garage" msgstr "garaż parkingowy" #: lang/json/overmap_terrain_from_json.py -msgid "sewage treatment" -msgstr "oczyszczalnia ścieków" +msgid "sewage treatment plant" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment plant roof" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment plant - underground" +msgstr "" #: lang/json/overmap_terrain_from_json.py msgid "toxic waste dump" @@ -131755,6 +132554,10 @@ msgstr "biblioteka publiczna, 2-gie piętro" msgid "mechanics garage" msgstr "garaż mechaników" +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment" +msgstr "oczyszczalnia ścieków" + #: lang/json/overmap_terrain_from_json.py msgid "mechanic garage" msgstr "garaż mechanika" @@ -132769,6 +133572,34 @@ msgstr "" "Nie wiesz do końca co się stało, ale wszytko poszło w diabły, a jedyne co " "przelatuje ci przez głowę to skąd wziąć następną działkę mety." +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Pillhead" +msgstr "" + +#. ~ Profession (male Pillhead) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"After an accident in your youth, you got addicted to the opiates treating " +"your pain. With the pharmacies shut down and dealers turned undead, " +"satisfying your fix just got a lot more difficult." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Pillhead" +msgstr "" + +#. ~ Profession (female Pillhead) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"After an accident in your youth, you got addicted to the opiates treating " +"your pain. With the pharmacies shut down and dealers turned undead, " +"satisfying your fix just got a lot more difficult." +msgstr "" + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "K9 Officer" @@ -139354,7 +140185,6 @@ msgid "WEAPON" msgstr "BROŃ" #. ~ Crafting recipes subcategory all -#. ~ Crafting recipes subcategory of 'ENCHANTED' category #: lang/json/recipe_category_from_json.py #: lang/json/recipe_category_from_json.py src/crafting_gui.cpp msgid "ALL" @@ -142767,9 +143597,8 @@ msgstr "" "cię w to co potrzebujesz." #: lang/json/snippet_from_json.py -msgid "Wounds heal over time. Bandages and disinfectant speeds that up." +msgid "Wounds heal over time. Bandages and antiseptic speeds that up." msgstr "" -"Rany goją się z czasem. Bandażowanie i dezynfekcja przyspieszają ten proces." #: lang/json/snippet_from_json.py msgid "Don't get grabbed by zombies. Their bites can be infectious." @@ -143673,8 +144502,8 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "" -"If you have extra disinfectant, use it to disinfect your wounds, even if " -"they aren't infected. They will recover faster that way." +"If you have extra antiseptic, use it to disinfect your wounds, even if they " +"aren't infected. They will recover faster that way." msgstr "" #: lang/json/snippet_from_json.py @@ -150757,17 +151586,6 @@ msgstr "" "\"Ludzie boją się o pracę, swój kraj, nawet swoje życie... więc jasne jest " "że część sięgnie po narkotyki\", mówi ekspert w tej dziedzinie." -#: lang/json/snippet_from_json.py -msgid "" -"WAR ON DRUGS DEAD: The government has finally reacted to long accumulated " -"evidence that suggests that decriminalized drugs cause fewer health problems" -" and are generally better managed while providing valuable tax revenues." -msgstr "" -"KONIEC WOJNY Z NARKOTYKAMI: Rząd w końcu zareagował na długo zbierane dowody" -" sugerujące że depenalizowanie narkotyków powoduje mniej problemów " -"zdrowotnych i lepsze nimi zarządzanie, z jednoczesnym powstaniem " -"lukratywnego źródła podatkowego." - #: lang/json/snippet_from_json.py msgid "" "FEELING BLUE? Try \"Greens\" for Magazines! Your local Supermarket! " @@ -155842,8 +156660,7 @@ msgid "" "Bionics are augmentation packages, right? They come in these installable Compact Bionic Modules or CBMs, and I can use some CBMs - if you examine a CBM, it will tell you if I can use it.\n" " Find a programmable surgical installer or autodoc, position me on the couch, and activate it, and you can install a suitable CBM to me - or if I think I'll do a better job, I'll do. I'll take over installing CBMs into you if I'm better at it.\n" " I can use almost all passive bionics and some active bionics. If I have any active bionics, I'll try to use them sensibly, but if we're in danger, I'm going to activate anything that might give me an edge. I'll use any weapon bionics if they're better than the weapons you gave me, but if you think I should reserve my bionic energy for my defensive and healing bionics, you can tell me how much to reserve. I'll try to keep my bionic energy topped off, but if we're running low on supplies, you can tell me to stop recharging when I'm not full.\n" -" I'll tell you if I'm low on bionic energy and can't recharge, and what fuel I need.\n" -" Sothere are some internal atomic reactor bionics - I can use those, but I can only recharge them with plutonium slurry. That stuff is radioactive, so do us both a favor and don't give me an internal reactor unless you really like glowing in the dark." +" I'll tell you if I'm low on bionic energy and can't recharge, and what fuel I need." msgstr "" #: lang/json/talk_topic_from_json.py @@ -156022,14 +156839,14 @@ msgstr "Pobudka!" msgid "Go back to sleep." msgstr "Śpij dalej." -#: lang/json/talk_topic_from_json.py -msgid " *pshhhttt* I'm reading you boss, over." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "What is it, friend?" msgstr "O co chodzi, przyjacielu?" +#: lang/json/talk_topic_from_json.py +msgid " *pshhhttt* I'm reading you boss, over." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Combat commands..." msgstr "Rozkazy walki..." @@ -156266,11 +157083,11 @@ msgid "Show me what needs to be done at the camp." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I'm currently ." +msgid "I'm not doing much currently." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I'm not doing much currently." +msgid "I'm currently ." msgstr "" #: lang/json/talk_topic_from_json.py @@ -156327,13 +157144,13 @@ msgid "OK, maybe it'll stop me from freezing in this weather, what's up?" msgstr "Ok, może to pozwoli mi nie zamarznąć w tą pogodę, co słychać?" #: lang/json/talk_topic_from_json.py -msgid "" -"Well, it's the time of day for a quick break surely! How are you holding " -"up?" +msgid "Man it's dark out isn't it? what's up?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Man it's dark out isn't it? what's up?" +msgid "" +"Well, it's the time of day for a quick break surely! How are you holding " +"up?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -156342,14 +157159,14 @@ msgstr "Cóż, czuję się dość chory... może chociaż ty się miewasz okej?" #: lang/json/talk_topic_from_json.py msgid "" -"Definitely, by the way, thanks for helping me so much with my tasks! " -"Anyway, you coping OK, ? " +"OK, let's take a moment, oh, and thanks for helping me with that thing, " +"so... what's up?" msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"OK, let's take a moment, oh, and thanks for helping me with that thing, " -"so... what's up?" +"Definitely, by the way, thanks for helping me so much with my tasks! " +"Anyway, you coping OK, ? " msgstr "" #: lang/json/talk_topic_from_json.py @@ -156425,14 +157242,14 @@ msgstr "Okej, żadnych gwałtownych ruchów..." msgid "Keep your distance!" msgstr "Trzymaj dystans!" -#: lang/json/talk_topic_from_json.py -msgid "" -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "This is my territory, ." msgstr "To moje terytorium, ." +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Calm down. I'm not going to hurt you." msgstr "Uspokój się. Nie zrobię ci krzywdy." @@ -156485,14 +157302,6 @@ msgstr "Co się dzieje?" msgid "I don't care." msgstr "Nie obchodzi mnie to." -#: lang/json/talk_topic_from_json.py -msgid "I don't have any jobs for you." -msgstr "Nie mam żadnych prac dla ciebie." - -#: lang/json/talk_topic_from_json.py -msgid "I don't have any more jobs for you." -msgstr "Nie mam już więcej prac dla ciebie." - #: lang/json/talk_topic_from_json.py msgid "I have other jobs for you. Want to hear about them?" msgstr "" @@ -156501,13 +157310,21 @@ msgstr "" msgid "I have more jobs for you. Want to hear about them?" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "I just have one job for you. Want to hear about it?" +msgstr "Mam tylko jedną robotę. Chcesz posłuchać?" + #: lang/json/talk_topic_from_json.py msgid "I have another job for you. Want to hear about it?" msgstr "Mam kolejną robotę dla ciebie. Chcesz o niej usłyszeć?" #: lang/json/talk_topic_from_json.py -msgid "I just have one job for you. Want to hear about it?" -msgstr "Mam tylko jedną robotę. Chcesz posłuchać?" +msgid "I don't have any more jobs for you." +msgstr "Nie mam już więcej prac dla ciebie." + +#: lang/json/talk_topic_from_json.py +msgid "I don't have any jobs for you." +msgstr "Nie mam żadnych prac dla ciebie." #: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py #: src/npctalk.cpp @@ -156519,16 +157336,16 @@ msgid "Never mind, I'm not interested." msgstr "Nieważne, nie jestem zainteresowany." #: lang/json/talk_topic_from_json.py -msgid "You're not working on anything for me now." -msgstr "" +msgid "What about it?" +msgstr "Co ty na to?" #: lang/json/talk_topic_from_json.py msgid "Which job?" msgstr "Która praca?" #: lang/json/talk_topic_from_json.py -msgid "What about it?" -msgstr "Co ty na to?" +msgid "You're not working on anything for me now." +msgstr "" #: lang/json/talk_topic_from_json.py msgid "I'll do it!" @@ -163113,8 +163930,8 @@ msgid "All right! Let's get going." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "We've done it! We've solved the list!" -msgstr "" +msgid "Have I told you about cardboard, friend? Do you have any?" +msgstr "Czy mówiłem ci już o kartonie przyjacielu? Czy masz może jakiś?" #: lang/json/talk_topic_from_json.py msgid "" @@ -163122,8 +163939,8 @@ msgid "" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Have I told you about cardboard, friend? Do you have any?" -msgstr "Czy mówiłem ci już o kartonie przyjacielu? Czy masz może jakiś?" +msgid "We've done it! We've solved the list!" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "About that shopping list of yours..." @@ -167692,6 +168509,10 @@ msgstr "" msgid "What the hell were you testing out there?" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "So, about that protective gear?" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "No. Now leave." msgstr "" @@ -167707,6 +168528,21 @@ msgid "" "Shame about what happened, with the evisceration and all..." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"Given the current context, we are willing to sell you a set of our protective gear: gas mask, suit and gear, at a considerable discount. We will sell it for two of our coins.\n" +"\n" +"the intercom: Hmm wait, we might not have your size..." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "[ 2 Hub 01 Gold Coins ] Deal!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I have to give it a thought." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Just leave." msgstr "" @@ -169516,6 +170352,86 @@ msgstr "" msgid " delivers a perfect riposte to %s" msgstr "" +#: lang/json/technique_from_json.py +msgid "Displace and Hook" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You parry and hook %s down" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " parries and hooks %s down" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "High Round Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You swing high and strike at %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " swings high and strikes %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "High Round Feint" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You fake a high round strike at %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " feints at %s" +msgstr " markujesz zmyłkę w kierunku %s" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab you, but you push away!" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab , but they push away!" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Hook and Drag" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You hook and drag %s down" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " hooks and drags %s down" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Colpo di Grazia" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You swing down hard and execute %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " swings down hard and executes %s" +msgstr "" + #: lang/json/technique_from_json.py msgid "quick punch" msgstr "szybki cios" @@ -169693,11 +170609,6 @@ msgstr "zmyłka w " msgid "You feint at %s" msgstr "Markujesz zmyłkę w kierunku %s" -#: lang/json/technique_from_json.py -#, python-format -msgid " feints at %s" -msgstr " markujesz zmyłkę w kierunku %s" - #: lang/json/technique_from_json.py #, python-format msgid "You jab %s" @@ -170146,57 +171057,6 @@ msgstr "" msgid " receives %s's attack, and counters" msgstr "" -#: lang/json/technique_from_json.py -msgid "Displace and Hook" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You parry %s attack and hook them down" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid " parries %s attack and hooks them down" -msgstr "" - -#: lang/json/technique_from_json.py -msgid "High Round Strike" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You swing high and strike at %s" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid " swings high and strikes %s" -msgstr "" - -#: lang/json/technique_from_json.py -msgid "High Round Feint" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You fake a high round strike at %s" -msgstr "" - -#: lang/json/technique_from_json.py -msgid "High Round Stab" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You quickly stab %s" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid " quickly stabs %s" -msgstr "" - #: lang/json/technique_from_json.py msgid "grab and pommel strike" msgstr "" @@ -172014,6 +172874,16 @@ msgstr "" msgid "SMASH!" msgstr "SMASH!" +#: lang/json/terrain_from_json.py +msgid "metal floor" +msgstr "metalowa podłoga" + +#. ~ Description for metal floor +#: lang/json/terrain_from_json.py +msgid "" +"High-quality and tough checkered flooring to reduce risk of slips and falls." +msgstr "" + #: lang/json/terrain_from_json.py msgid "linoleum tile" msgstr "płyta linoleum" @@ -172126,10 +172996,6 @@ msgstr "" "Nieukończona budowa z prętów zbrojeniowych i wylanego betonu; podłoga nie " "jest jeszcze wygładzona a dach nie jest w pełni odlany." -#: lang/json/terrain_from_json.py -msgid "metal floor" -msgstr "metalowa podłoga" - #. ~ Description for metal floor #: lang/json/terrain_from_json.py msgid "" @@ -177925,6 +178791,16 @@ msgstr "chitynowy taran" msgid "biosilicfied chitin ram" msgstr "biosilifikowany chitynowy taran" +#: lang/json/vehicle_part_from_json.py +msgid "tied mattress" +msgstr "" + +#. ~ Description for tied mattress +#: lang/json/vehicle_part_from_json.py +msgid "" +"A mattress, strapped onto the vehicle. It could serve to blunt any impact." +msgstr "" + #. ~ Description for shredder #: lang/json/vehicle_part_from_json.py msgid "" @@ -182524,6 +183400,10 @@ msgstr "" msgid "Stop %s?" msgstr "" +#: src/activity_type.h +msgid "THIS IS A BUG" +msgstr "" + #: src/addiction.cpp msgid "You need some nicotine." msgstr "Potrzebujesz trochę nikotyny." @@ -184102,10 +184982,6 @@ msgstr "%1$s z %2$s" msgid "artifact file" msgstr "plik artefakt" -#: src/auto_pickup.cpp -msgid " AUTO PICKUP MANAGER " -msgstr "MANAGER AUTO PODNOSZENIA" - #: src/auto_pickup.cpp src/game.cpp src/safemode_ui.cpp msgid "dd" msgstr ": dodaj" @@ -184154,14 +185030,6 @@ msgstr "Zasady" msgid "I/E" msgstr "I/E" -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "[]" -msgstr "[]" - -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "[]" -msgstr "[]" - #: src/auto_pickup.cpp msgid "Auto pickup enabled:" msgstr "Auto podnoszenie włączone:" @@ -184178,10 +185046,6 @@ msgstr "Prawda" msgid "witch" msgstr ": przełącz" -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "Please load a character first to use this page!" -msgstr "Proszę wczytać postać by użyć tej strony!" - #: src/auto_pickup.cpp src/safemode_ui.cpp msgid "" msgstr "" @@ -184231,6 +185095,18 @@ msgstr "Zasada Podnoszenia:" msgid "Save changes?" msgstr "Zapisać zmiany?" +#: src/auto_pickup.cpp +msgid " AUTO PICKUP MANAGER " +msgstr "MANAGER AUTO PODNOSZENIA" + +#: src/auto_pickup.cpp src/safemode_ui.cpp +msgid "[]" +msgstr "[]" + +#: src/auto_pickup.cpp src/safemode_ui.cpp +msgid "[]" +msgstr "[]" + #: src/auto_pickup.cpp #, c-format msgid "%1$d item matches: %2$s" @@ -184252,6 +185128,11 @@ msgstr "Auto-podnoszenie wyłączone w opcjach. Włączyć?" msgid "autopickup configuration" msgstr "konfiguracja auto podnoszenia" +#: src/auto_pickup.cpp +#, c-format +msgid "Pickup rules for %s" +msgstr "Zasady podnoszenia rzeczy dla %s" + #: src/avatar.cpp src/iuse.cpp msgid "He" msgstr "On" @@ -185508,7 +186389,37 @@ msgstr "Wycofujesz twój %s." #: src/bionics.cpp #, c-format -msgid "%s withdraws %s %s." +msgid " withdraws %s %s." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Your %s does not have enought fuel to start." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "'s %s does not have enought fuel to start." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Your %s turns off to not waste fuel." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "'s %s turns off to not waste fuel." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Your %s runs out of fuel and turn off." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "'s %s runs out of fuel and turn off." msgstr "" #: src/bionics.cpp @@ -185899,6 +186810,10 @@ msgstr "" "Gdy twoja świadomość odpływa, czujesz żal, że nie będziesz już mógł dłużej " "cieszyć się widokiem zabiegu." +#: src/bionics_ui.cpp +msgid "Available Fuel: " +msgstr "" + #: src/bionics_ui.cpp #, c-format msgid "" @@ -189136,6 +190051,24 @@ msgstr[1] " trawi %s, uzyskując %d punkty energii." msgstr[2] " trawi %s, uzyskując %d punktów energii." msgstr[3] " trawi %s, uzyskując %d punktów energii." +#: src/consumption.cpp +#, c-format +msgid "You load %i charge of %s in your %s." +msgid_plural "You load %i charges of %s in your %s." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: src/consumption.cpp +#, c-format +msgid " load %i charge of %s in their %s." +msgid_plural " load %i charges of %s in their %s." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + #: src/craft_command.cpp src/crafting.cpp src/veh_interact.cpp msgid " (nearby)" msgstr "(pobliski)" @@ -189221,8 +190154,10 @@ msgstr "Już nie możesz już wytwarzać tego!" #: src/crafting.cpp #, c-format -msgid "You don't have anything to store %s in!" -msgstr "Nie masz niczego w czym mógłbyś umieścić %s!" +msgid "" +"You don't have anything in which to store %s and may have to pour it out or " +"consume it as soon as it is prepared! Proceed?" +msgstr "" #: src/crafting.cpp src/pickup.cpp #, c-format @@ -189824,6 +190759,10 @@ msgstr "Dobre trafienie!" msgid "Grazing hit." msgstr "Draśnięcie." +#: src/creature.cpp +msgid "You feel poison coursing through your body!" +msgstr "" + #: src/creature.cpp msgid "The shot misses!" msgstr "Strzał pudłuje!" @@ -191404,21 +192343,21 @@ msgid "You can't see the terrain here." msgstr "Nie widzisz tam żadnego terenu." #: src/descriptions.cpp +#, c-format msgid "" "\n" -"Sign: ???" +"Sign: %s" msgstr "" "\n" -"Znak: ???" +"Znak: %s" #: src/descriptions.cpp -#, c-format msgid "" "\n" -"Sign: %s" +"Sign: ???" msgstr "" "\n" -"Znak: %s" +"Znak: ???" #: src/descriptions.cpp src/iexamine.cpp #, c-format @@ -194664,20 +195603,6 @@ msgstr "dane stanu UI" msgid "Failed to save game data" msgstr "Nie udało się zapisać danych gry" -#: src/game.cpp -msgid "You haven't killed any monsters yet!" -msgstr "Nie zabiłeś jeszcze żadnych potworów!" - -#: src/game.cpp -#, c-format -msgid "KILL COUNT: %d" -msgstr "LICZNIK TRUPÓW: %d" - -#: src/game.cpp -#, c-format -msgid "Experience: %d (%d points available)" -msgstr "" - #: src/game.cpp msgid " You are forgotten among the billions lost in the cataclysm..." msgstr "" @@ -196758,6 +197683,11 @@ msgstr "Nie możesz wypić rozlanych napojów" msgid "You're fully charged" msgstr "Jesteś w pełni naładowany" +#: src/game_inventory.cpp +#, c-format +msgid "No space to store more %s" +msgstr "" + #: src/game_inventory.cpp msgid "soon!" msgstr "wkrótce!" @@ -196790,6 +197720,18 @@ msgstr "old" msgid "rotten" msgstr "zepsute" +#: src/game_inventory.cpp src/panels.cpp +msgid "Food :" +msgstr "Pożyw:" + +#: src/game_inventory.cpp src/panels.cpp +msgid "Drink:" +msgstr "Napoj:" + +#: src/game_inventory.cpp src/panels.cpp +msgid "Pain :" +msgstr "Ból :" + #: src/game_inventory.cpp msgid "Consume item" msgstr "Skonsumuj przedmiot" @@ -199572,6 +200514,14 @@ msgstr "Wybierz zainstalowaną bionikę do usunięcia." msgid "ERROR NO SPACE AVAILABLE. Operation impossible. Exiting." msgstr "" +#: src/iexamine.cpp +msgid "Personality_Override" +msgstr "" + +#: src/iexamine.cpp +msgid "C0RR#PTED?D#TA" +msgstr "" + #: src/iexamine.cpp msgid "Choose bionic to uninstall" msgstr "Wybierz bionikę do usunięcia" @@ -200855,8 +201805,8 @@ msgid "Capacity: " msgstr "Pojemność: " #: src/item.cpp -msgid " per round" -msgstr " na sztukę" +msgid " moves per round" +msgstr "" #: src/item.cpp msgid "Reload time: " @@ -200955,8 +201905,8 @@ msgid "" msgstr "" #: src/item.cpp -msgid " seconds" -msgstr " sekund" +msgid " moves " +msgstr "" #: src/item.cpp msgid "Time to reach aim level: " @@ -200990,10 +201940,6 @@ msgstr "Efektywny odrzut:" msgid "Recommended strength (burst): " msgstr "Rekomendowana siła (seria):" -#: src/item.cpp -msgid " seconds per round" -msgstr " sekund na pocisk" - #: src/item.cpp msgid "Fire modes: " msgstr "Tryby ognia: " @@ -201268,6 +202214,14 @@ msgstr "" "Wartość ochrony maleje z uszkodzeniami i możesz ją " "ulepszyć naprawiając ten przedmiot." +#: src/item.cpp +msgid "Weight capacity modifier: " +msgstr "" + +#: src/item.cpp +msgid "Weight capacity bonus: " +msgstr "" + #: src/item.cpp msgid "Just for fun." msgstr "Dla zabawy." @@ -201736,6 +202690,14 @@ msgstr "" msgid "This bionic is installed in the following body part(s):" msgstr "Ta bionika jest zainstalowana w następującej(ych) części(ach) ciała:" +#: src/item.cpp +msgid "Encumbrance: " +msgstr "" + +#: src/item.cpp +msgid "Environmental Protection: " +msgstr "" + #: src/item.cpp msgid "* This weapon needs two free hands to fire." msgstr "* Ta broń wymaga obu wolnych rąk do strzelania." @@ -205089,6 +206051,11 @@ msgstr "" msgid " illuminated by %s" msgstr "" +#: src/iuse.cpp +#, c-format +msgid " in %s cloud" +msgstr "" + #: src/iuse.cpp #, c-format msgid " with graffiti \"%s\"" @@ -205368,24 +206335,24 @@ msgstr "" #: src/iuse.cpp msgid "It is sunrise. " -msgstr "" +msgstr "Jest wschód słońca." #: src/iuse.cpp msgid "It is sunset. " -msgstr "" +msgstr "Jest zachód słońca." #: src/iuse.cpp msgid "It is night. " -msgstr "" +msgstr "Jest noc." #: src/iuse.cpp msgid "It is day. " -msgstr "" +msgstr "Jest dzień." #: src/iuse.cpp #, c-format msgid "The weather is %s." -msgstr "" +msgstr "Pogoda jest %s." #: src/iuse.cpp #, c-format @@ -206335,6 +207302,10 @@ msgstr "Potrzebujesz źródła zasilania do %s (zwykły UPS wystarczy)." msgid "There is also a certain bionic that helps with this kind of armor." msgstr "Jest też pewna bionika która współpracuje z tym rodzajem zbroi." +#: src/iuse_actor.cpp +msgid "No lock to pick." +msgstr "" + #: src/iuse_actor.cpp msgid "Use your lockpick where?" msgstr "Użyć wytrycha gdzie?" @@ -206769,11 +207740,11 @@ msgstr "" #: src/iuse_actor.cpp #, c-format msgid "Level %u" -msgstr "" +msgstr "Poziom %u" #: src/iuse_actor.cpp msgid " (Max)" -msgstr "" +msgstr " (Max)" #: src/iuse_actor.cpp msgid "Study to Learn" @@ -206797,23 +207768,23 @@ msgstr "" #: src/iuse_actor.cpp msgid "30 minutes" -msgstr "" +msgstr "30 minut" #: src/iuse_actor.cpp msgid "1 hour" -msgstr "" +msgstr "1 godzina" #: src/iuse_actor.cpp msgid "2 hours" -msgstr "" +msgstr "2 godziny" #: src/iuse_actor.cpp msgid "4 hours" -msgstr "" +msgstr "4 godzin" #: src/iuse_actor.cpp msgid "8 hours" -msgstr "" +msgstr "8 godzin" #: src/iuse_actor.cpp msgid "Until you gain a spell level" @@ -208416,6 +209387,20 @@ msgstr "<-> poprzedni" msgid "ndo move" msgstr "[]cofnij ruch" +#: src/kill_tracker.cpp +msgid "You haven't killed any monsters yet!" +msgstr "Nie zabiłeś jeszcze żadnych potworów!" + +#: src/kill_tracker.cpp +#, c-format +msgid "KILL COUNT: %d" +msgstr "LICZNIK TRUPÓW: %d" + +#: src/kill_tracker.cpp +#, c-format +msgid "Experience: %d (%d points available)" +msgstr "" + #. ~ abbreviated direction names and long direction names #: src/line.cpp msgid "N " @@ -208685,6 +209670,16 @@ msgstr "nieskończone" msgid "an explosion" msgstr "" +#: src/magic.cpp +#, c-format +msgid "%s and %s" +msgstr "" + +#: src/magic.cpp src/player.cpp +#, c-format +msgid "%s, %s" +msgstr "%s, %s" + #: src/magic.cpp #, c-format msgid "" @@ -208721,6 +209716,11 @@ msgstr "" msgid "Popup Distractions" msgstr "" +#: src/magic.cpp +#, c-format +msgid "%d moves" +msgstr "" + #: src/magic.cpp msgid "requires concentration" msgstr "" @@ -209239,7 +210239,7 @@ msgstr "" #: src/map.cpp #, c-format -msgid "The autoclave in the %s has finished washing." +msgid "The autoclave in the %s has finished its cycle." msgstr "" #: src/map.cpp @@ -209505,22 +210505,6 @@ msgstr "Otwórz Komory" msgid "Missile Controls" msgstr "Kontrola Rakiet" -#: src/mapgen.cpp -msgid "EnviroCom OS v2.03" -msgstr "EnviroCom OS v2.03" - -#: src/mapgen.cpp -msgid "Unlock stairs" -msgstr "Odblokuj schody" - -#: src/mapgen.cpp -msgid "Download Sewer Maps" -msgstr "Pobierz Mapę Kanałów" - -#: src/mapgen.cpp -msgid "Divert sample" -msgstr "Odwróć próbkę" - #: src/mapgen.cpp msgid "NEPowerOS" msgstr "NEPowerOS" @@ -209597,23 +210581,23 @@ msgstr "Przekieruj mod do windy" #: src/martialarts.cpp msgid "easy" -msgstr "" +msgstr "łatwe" #: src/martialarts.cpp msgid "moderately hard" -msgstr "" +msgstr "umiarkowanie trudne" #: src/martialarts.cpp msgid "hard" -msgstr "" +msgstr "trudne" #: src/martialarts.cpp msgid "very hard" -msgstr "" +msgstr "bardzo trudne" #: src/martialarts.cpp msgid "extremely hard" -msgstr "" +msgstr "ekstremalnie trudne" #: src/martialarts.cpp #, c-format @@ -212183,6 +213167,11 @@ msgstr "Ramiona %s wystrzeliwują na , ale robi unik!" msgid "The %1$s's arms fly out and pull and grab %2$s!" msgstr "Ramiona %1$s wystrzeliwują, łapią i ciągną %2$s!" +#: src/monattack.cpp +#, c-format +msgid "The %1$s reaches out and pulls %2$s!" +msgstr "" + #: src/monattack.cpp #, c-format msgid "The %s gropes at you, but you dodge!" @@ -212913,6 +213902,19 @@ msgstr "Opróżnij dłonie i zachowaj pozycję, obywatelu!" msgid "fzzzzzt" msgstr "fzzzzzt" +#: src/monattack.cpp +msgid "The floor trembles underneath your feet." +msgstr "" + +#: src/monattack.cpp +msgid "a deafening roar!" +msgstr "" + +#: src/monattack.cpp +#, c-format +msgid "A %s struggles to pull itself free from the %s!" +msgstr "" + #: src/monattack.cpp #, c-format msgid "The %1$s mechanically grabs at %2$s!" @@ -214073,11 +215075,11 @@ msgstr "Zarodniki przekształcają %1$s w %2$s!" #: src/morale.cpp msgid "Total morale:" -msgstr "" +msgstr "Łączne morale:" #: src/morale.cpp msgid "Focus trends towards:" -msgstr "" +msgstr "Skupienie dąży do:" #: src/morale.cpp msgid "Nothing affects your morale" @@ -214097,11 +215099,11 @@ msgstr "Wartość" #: src/morale.cpp msgid "Total positive morale" -msgstr "" +msgstr "Łączne pozytywne morale" #: src/morale.cpp msgid "Total negative morale" -msgstr "" +msgstr "Łączne negatywne morale" #: src/mutation.cpp #, c-format @@ -215602,6 +216604,11 @@ msgstr "%1$s upuszcza %2$s." msgid "Hold on, I want to pulp that %s." msgstr "Zaczekaj, chcę zmiażdżyć to %s." +#: src/npcmove.cpp +#, c-format +msgid "%s completed the assigned task." +msgstr "" + #: src/npcmove.cpp #, c-format msgid "%1$s throws a %2$s." @@ -216124,6 +217131,10 @@ msgstr "pięści" msgid "BADAMMO" msgstr "ZŁAAMUNICJA" +#: src/npctalk.cpp +msgid "doing this and that" +msgstr "" + #: src/npctalk.cpp msgctxt "punctuation" msgid "." @@ -216227,6 +217238,11 @@ msgstr "" msgid "%1$s doesn't have a %2$s!" msgstr "%1$s nie ma %2$s!" +#: src/npctalk.cpp +#, c-format +msgid "%1$s gives you %2$s." +msgstr "" + #: src/npctalk.cpp msgid "I don't trust you enough to eat THIS..." msgstr "Nie ufam ci na tyle, żeby zjeść TO..." @@ -216480,11 +217496,6 @@ msgstr "Zapłać:" msgid "Select a follower" msgstr "Wybierz towarzysza" -#: src/npctalk_funcs.cpp -#, c-format -msgid "Pickup rules for %s" -msgstr "Zasady podnoszenia rzeczy dla %s" - #: src/npctrade.cpp #, c-format msgid "Volume: %s %s, Weight: %.1f %s" @@ -216497,12 +217508,12 @@ msgstr "Wymiana" #: src/npctrade.cpp #, c-format msgid "Credit %s" -msgstr "" +msgstr "Saldo %s" #: src/npctrade.cpp #, c-format msgid "Debt %s" -msgstr "" +msgstr "Dług %s" #: src/npctrade.cpp #, c-format @@ -219404,10 +220415,6 @@ msgstr "Bardzo zimno!" msgid "Freezing!" msgstr "Mróz!" -#: src/panels.cpp -msgid "Pain " -msgstr "Ból" - #: src/panels.cpp msgid "Bad" msgstr "" @@ -219575,22 +220582,10 @@ msgstr "Dzier:" msgid "Style:" msgstr "Styl:" -#: src/panels.cpp -msgid "Food :" -msgstr "Pożyw:" - -#: src/panels.cpp -msgid "Drink:" -msgstr "Napoj:" - #: src/panels.cpp msgid "Rest :" msgstr "Zmęcz:" -#: src/panels.cpp -msgid "Pain :" -msgstr "Ból :" - #: src/panels.cpp msgid "Heat :" msgstr "Ciepł:" @@ -221373,11 +222368,6 @@ msgstr "%s (%d)" msgid "%s with %s (%d)" msgstr "%s używając %s (%d)" -#: src/player.cpp -#, c-format -msgid "%s, %s" -msgstr "%s, %s" - #: src/player.cpp msgid "| Location " msgstr "| Lokacja" @@ -222128,6 +223118,10 @@ msgstr "Bardzo Głodny" msgid "Peckish" msgstr "Głodnawy" +#: src/player.cpp +msgid "Pain " +msgstr "Ból" + #: src/player_activity.cpp msgid "You pause for a moment to catch your breath." msgstr "" @@ -223615,6 +224609,10 @@ msgstr "B/W" msgid "Safe Mode enabled:" msgstr "Bezpieczny Tryb włączony:" +#: src/safemode_ui.cpp +msgid "Please load a character first to use this page!" +msgstr "Proszę wczytać postać by użyć tej strony!" + #: src/safemode_ui.cpp msgid "Safe Mode manager currently inactive." msgstr "Menedżer Bezpiecznego Trybu obecnie wyłączony." @@ -226469,6 +227467,10 @@ msgid "" "door." msgstr "" +#: src/vehicle_use.cpp +msgid "The autoclave is empty, there's no point in starting it." +msgstr "" + #: src/vehicle_use.cpp #, c-format msgid "" @@ -226495,6 +227497,10 @@ msgid "" "its lid." msgstr "Wyłączasz pralkę zanim zakończyła program, i otwierasz jej wieko." +#: src/vehicle_use.cpp +msgid "The washing machine is empty, there's no point in starting it." +msgstr "" + #: src/vehicle_use.cpp #, c-format msgid "" @@ -226538,6 +227544,10 @@ msgid "" "lid." msgstr "" +#: src/vehicle_use.cpp +msgid "The dishwasher is empty, there's no point in starting it." +msgstr "" + #: src/vehicle_use.cpp #, c-format msgid "" @@ -226628,7 +227638,7 @@ msgstr "Wypełnij pojemnik wodą" #: src/vehicle_use.cpp msgid "Use a towel" -msgstr "" +msgstr "Użyj ręcznika" #: src/vehicle_use.cpp msgid "Use the welding rig?" @@ -226825,71 +227835,71 @@ msgstr "%s kPa" #: src/weather.cpp msgid "North-East" -msgstr "" +msgstr "Północny-Wschód" #: src/weather.cpp msgid "South-East" -msgstr "" +msgstr "Południowy-Wschód" #: src/weather.cpp msgid "South-West" -msgstr "" +msgstr "Południowy-Zachód" #: src/weather.cpp msgid "North-West" -msgstr "" +msgstr "Północny-Zachód" #: src/weather.cpp msgid "Calm" -msgstr "" +msgstr "Cisza" #: src/weather.cpp msgid "Light Air" -msgstr "" +msgstr "Powiew" #: src/weather.cpp msgid "Light Breeze" -msgstr "" +msgstr "Lekka Bryza" #: src/weather.cpp msgid "Gentle Breeze" -msgstr "" +msgstr "Łagodna Bryza" #: src/weather.cpp msgid "Moderate Breeze" -msgstr "" +msgstr "Umiarkowany Wiatr" #: src/weather.cpp msgid "Fresh Breeze" -msgstr "" +msgstr "Rześki Wiatr" #: src/weather.cpp msgid "Strong Breeze" -msgstr "" +msgstr "Silny Wiatr" #: src/weather.cpp msgid "Moderate Gale" -msgstr "" +msgstr "Wichura" #: src/weather.cpp msgid "Gale" -msgstr "" +msgstr "Sztorm" #: src/weather.cpp msgid "Strong Gale" -msgstr "" +msgstr "Silny Sztorm" #: src/weather.cpp msgid "Whole Gale" -msgstr "" +msgstr "Bardzo Silny Sztorm" #: src/weather.cpp msgid "Violent Storm" -msgstr "" +msgstr "Gwałtowny Sztorm" #: src/weather.cpp msgid "Hurricane" -msgstr "" +msgstr "Huragan" #: src/weather.cpp #, c-format diff --git a/lang/po/pt_BR.po b/lang/po/pt_BR.po index e33bd4952c9c7..dac0c23397dfa 100644 --- a/lang/po/pt_BR.po +++ b/lang/po/pt_BR.po @@ -1,6 +1,6 @@ # Translators: -# diesel riot , 2018 # Joao Pedro de Campos Magalhaes , 2018 +# diesel riot , 2018 # Anti-Seis Joga , 2018 # Brett Dong , 2018 # Marco Przybysz , 2018 @@ -17,14 +17,15 @@ # Hugo Santos , 2019 # C. J. , 2019 # Douglas Onofre Rosas dos Santos , 2019 +# Yuri Laskowski , 2019 # msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.D\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-16 17:39+0800\n" +"POT-Creation-Date: 2019-08-23 23:11+0800\n" "PO-Revision-Date: 2018-04-26 14:47+0000\n" -"Last-Translator: Douglas Onofre Rosas dos Santos , 2019\n" +"Last-Translator: Yuri Laskowski , 2019\n" "Language-Team: Portuguese (Brazil) (https://www.transifex.com/cataclysm-dda-translators/teams/2217/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -44,9 +45,8 @@ msgid "" "delivering bolts of superheated gas at near light speed with no recoil." msgstr "" "Em meados do século 21 , as potências militares começaram a estudar armas " -"baseadas em energia. O resultado foi o pacote de fusão padrão , capaz de " -"fornecer raios de gás superaquecido próximos a velocidade da luz e sem " -"recuo." +"baseadas em energia. O resultado foi o pacote de fusão padrão, capaz de " +"emitir raios de gás superaquecido próximos a velocidade da luz e sem recuo." #: lang/json/AMMO_from_json.py msgid "bootleg fusion pack" @@ -60,10 +60,10 @@ msgid "" "delivering bolts of superheated gas at near light speed with no recoil. " "This one has been hand-crafted from spare parts." msgstr "" -" Em meados do século XXI, as potências militares começaram a " -"procurararmasbaseadas na energia. O resultado foi o pacote de fusão padrão, " -"capazdefornecer parafusos de gás superaquecido a uma velocidade próxima da " -"luzsemrecuo. Este foi feito a mão a partir de peças de reposição." +" Em meados do século XXI, as potências militares começaram a procurar armas " +"baseadas em energia. O resultado foi o pacote de fusão padrão, capaz de " +"emitir raios de gás superaquecido a uma velocidade próxima da luz sem recuo." +" Este foi feito a mão a partir de peças de reposição." #: lang/json/AMMO_from_json.py msgid "battery" @@ -439,26 +439,6 @@ msgstr "" "Sucatas de cobre. Podem ser usadas para criar algo, cartuchos de espingarda " "improvisados, por exemplo." -#: lang/json/AMMO_from_json.py -msgid "solder" -msgstr "solda" - -#. ~ Description for solder -#: lang/json/AMMO_from_json.py -msgid "" -"A small spool of solder, able to be used in ammunition and electronics." -msgstr "" -"Um pequeno carretel de solda, capas de ser usado como munição e eletrônicos." - -#: lang/json/AMMO_from_json.py -msgid "tin" -msgstr "estanho" - -#. ~ Description for tin -#: lang/json/AMMO_from_json.py -msgid "Tin and pewter scraps. Usable in making ammo." -msgstr "Sucatas de alumínio e estanho. Utilizáveis na fabricação de munição." - #: lang/json/AMMO_from_json.py msgid "medical tape" msgstr "fita médica" @@ -477,6 +457,34 @@ msgstr "foguete 93mm PG-7VL" msgid "93mm single-stage high-explosive ammunition for the RPG-7." msgstr "Uma munição Alto-Explosiva de único estágio de 93mm para o RPG-7." +#: lang/json/AMMO_from_json.py +msgid "PG-7VR 64mm/105mm rocket" +msgstr "" + +#. ~ Description for PG-7VR 64mm/105mm rocket +#: lang/json/AMMO_from_json.py +msgid "64mm/105mm high-explosive tandem ammunition for the RPG-7." +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid "TBG-7V 105mm rocket" +msgstr "" + +#. ~ Description for TBG-7V 105mm rocket +#: lang/json/AMMO_from_json.py +msgid "105mm thermobaric ammunition for the RPG-7." +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid "OG-7V 40mm rocket" +msgstr "" + +#. ~ Description for OG-7V 40mm rocket +#: lang/json/AMMO_from_json.py +msgid "" +"40mm high-explosive fragmentation antipersonnel ammunition for the RPG-7." +msgstr "" + #: lang/json/AMMO_from_json.py msgid "M235 66mm TPA rocket" msgstr "foguete TPA 66mm M235" @@ -2460,21 +2468,19 @@ msgstr "" #. ~ Description for .300 AAC Blackout #: lang/json/AMMO_from_json.py msgid "" -".300 AAC Blackout is an intermediate cartridge that achieves ballistics " -"similar to the 7.62x39 but allows use on the AR-15 platform. The round is " -"necked-up from the 5.56mm NATO, but feeds from a STANAG magazine. It " -"requires a specific barrel, so will not work in a standard M4 or similar " -"carbine. This loading is supersonic." +"A .300 AAC Blackout round with a 125gr open tip match bullet. 300 BLK is an" +" intermediate cartridge necked up from 5.56x45mm, designed to achieve " +"similar ballistics to 7.62x39mm. It is compatible with standard AR-15 lower" +" receivers and will feed from STANAG magazines." msgstr "" #. ~ Description for .300 AAC Blackout #: lang/json/AMMO_from_json.py msgid "" -".300 AAC Blackout is an intermediate cartridge that achieves ballistics " -"similar to the 7.62x39 but allows use on the AR-15 platform. The round is " -"necked-up from the 5.56mm NATO, but feeds from a STANAG magazine. It " -"requires a specific barrel, so will not work in a standard M4 or similar " -"carbine. This loading is subsonic." +"A subsonic .300 AAC Blackout round with a 220gr open tip match bullet. 300 " +"BLK is an intermediate cartridge necked up from 5.56x45mm, designed to " +"achieve similar ballistics to 7.62x39mm. It is compatible with standard " +"AR-15 lower receivers and will feed from STANAG magazines." msgstr "" #: lang/json/AMMO_from_json.py @@ -4010,6 +4016,17 @@ msgid "" " tube. Designed to be highly effective against vehicles and structures." msgstr "" +#: lang/json/AMMO_from_json.py +msgid "paralyzing barb" +msgstr "" + +#. ~ Description for paralyzing barb +#: lang/json/AMMO_from_json.py +msgid "" +"Tiny droplets of venom trickle out of the sponge-like tissue of this sharp " +"barb." +msgstr "" + #: lang/json/AMMO_from_json.py msgid "sprayable toxic gas" msgstr "gás tóxico pulverizado" @@ -4610,6 +4627,28 @@ msgid "" "making doors." msgstr "" +#: lang/json/AMMO_from_json.py +msgid "tin powder" +msgstr "" + +#. ~ Description for tin powder +#: lang/json/AMMO_from_json.py +msgid "" +"A fine gray powder composed of tin, usable for making solder and lining " +"containers to prevent corrosion." +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid "solder" +msgstr "solda" + +#. ~ Description for solder +#: lang/json/AMMO_from_json.py +msgid "" +"A small spool of solder, able to be used in ammunition and electronics." +msgstr "" +"Um pequeno carretel de solda, capas de ser usado como munição e eletrônicos." + #: lang/json/AMMO_from_json.py msgid "incendiary" msgid_plural "incendiaries" @@ -6427,47 +6466,6 @@ msgstr[1] "" msgid "A pair of basketball shorts. Comfortable and light." msgstr "short de basquete Um par de shorts de basquete. Confortável e leve." -#: lang/json/ARMOR_from_json.py -msgid "backpack" -msgid_plural "backpacks" -msgstr[0] "mochila" -msgstr[1] "mochilas" - -#. ~ Description for backpack -#: lang/json/ARMOR_from_json.py -msgid "A small backpack. Good storage for a little encumbrance." -msgstr "" -"backpackA pequena mochila. Bom armazenamento por um pequeno empecilho." - -#: lang/json/ARMOR_from_json.py -msgid "giant novelty backpack" -msgid_plural "giant novelty backpacks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for giant novelty backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A huge fabric backpack made mostly as a joke before the cataclysm. Now, " -"it's still rather silly, but it can store a lot of stuff." -msgstr "" -" Mochila de novidade giganteUma mochila de tecido enorme " -"feitaprincipalmentecomo uma piada antes do cataclismo. Agora, ainda é um " -"poucobobo, mas podearmazenar muitas coisas." - -#: lang/json/ARMOR_from_json.py -msgid "leather backpack" -msgid_plural "leather backpacks" -msgstr[0] "mochila de couro" -msgstr[1] "mochilas de couro" - -#. ~ Description for leather backpack -#: lang/json/ARMOR_from_json.py -msgid "A small leather backpack. Good storage for a little encumbrance." -msgstr "" -" mochila de couroUma mochila de couro pequena. Bom armazenamento " -"porumpequeno empecilho." - #: lang/json/ARMOR_from_json.py msgid "balaclava" msgid_plural "balaclavas" @@ -6491,8 +6489,8 @@ msgstr[1] "" #. ~ Use action holster_msg for scabbard. #. ~ Use action holster_msg for sheath. #. ~ Use action holster_msg for survivor belt. -#. ~ Use action holster_msg for hiking backpack. #. ~ Use action holster_msg for survivor utility belt. +#. ~ Use action holster_msg for hiking backpack. #. ~ Use action holster_msg for pair of boots. #. ~ Use action holster_msg for pair of bone armor boots. #. ~ Use action holster_msg for pair of turnout boots. @@ -6517,7 +6515,8 @@ msgstr[1] "" #. ~ Use action holster_msg for pair of rollerblades. #. ~ Use action holster_msg for pair of rollerskates. #. ~ Use action holster_msg for C.R.I.T web belt. -#: lang/json/ARMOR_from_json.py +#. ~ Use action holster_msg for hollow cane. +#: lang/json/ARMOR_from_json.py lang/json/GENERIC_from_json.py #, no-python-format msgid "You sheath your %s" msgstr "" @@ -6525,7 +6524,9 @@ msgstr "" #. ~ Use action holster_prompt for baldric. #. ~ Use action holster_prompt for back scabbard. #. ~ Use action holster_prompt for scabbard. -#: lang/json/ARMOR_from_json.py +#. ~ Use action holster_prompt for hollow cane. +#: lang/json/ARMOR_from_json.py lang/json/ARMOR_from_json.py +#: lang/json/GENERIC_from_json.py msgid "Sheath sword" msgstr "Espada de bainha" @@ -7572,18 +7573,6 @@ msgstr "" "umdinossauroantropomórfico. É bastante oneroso e tem pouco armazenamento, " "masé muitoquente." -#: lang/json/ARMOR_from_json.py -msgid "dive bag" -msgid_plural "dive bags" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for dive bag -#: lang/json/ARMOR_from_json.py -msgid "A lightweight mesh backpack, commonly worn by swimmers and divers." -msgstr "" -"mochila de malha leve, geralmente usada por nadadores e mergulhadores." - #: lang/json/ARMOR_from_json.py msgid "down-filled blanket" msgid_plural "down-filled blankets" @@ -7669,20 +7658,6 @@ msgid "A beautiful white wedding dress. What good will it be now?" msgstr "" " vestido de noivaUm lindo vestido de noiva branco. Que bem vai ser agora?" -#: lang/json/ARMOR_from_json.py -msgid "duffel bag" -msgid_plural "duffel bags" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for duffel bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A huge duffel bag. Provides plenty of storage, but is severely encumbering." -msgstr "" -" mochila Uma mochila enorme. Fornece muito armazenamento, mas " -"estágravementeonerando." - #: lang/json/ARMOR_from_json.py msgid "tactical dump pouch" msgid_plural "tactical dump pouches" @@ -9704,19 +9679,6 @@ msgstr "" " Jedi manto Longos trajes esvoaçantes. Simples e confortável deusar. " "Certifique-se de rasgá-lo dramaticamente antes de lutar contra osinimigos!" -#: lang/json/ARMOR_from_json.py -msgid "jerrypack" -msgid_plural "jerrypacks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for jerrypack -#: lang/json/ARMOR_from_json.py -msgid "A jerrycan modified to be worn in a similar manner to a backpack." -msgstr "" -" jerrypack Um jerrycan modificado para ser usado de forma semelhante " -"aumamochila." - #: lang/json/ARMOR_from_json.py msgid "sports jersey" msgid_plural "sports jerseys" @@ -10645,35 +10607,6 @@ msgstr[1] "" msgid "A frilly white headpiece." msgstr "Chapéu de empregada francesa hatA branco com babados." -#: lang/json/ARMOR_from_json.py -msgid "makeshift knapsack" -msgid_plural "makeshift knapsacks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for makeshift knapsack -#: lang/json/ARMOR_from_json.py -msgid "" -"A pair of pants with the bottom ends tied with string, and then passed " -"through the belt loops so the knapsack can be carried on the back." -msgstr "" -" mochila improvisada Um par de calças com as extremidadesinferioresamarradas" -" com barbante e, em seguida, passadas pelas alças dacinta, paraque a mochila" -" possa ser levada pelas costas." - -#: lang/json/ARMOR_from_json.py -msgid "makeshift sling" -msgid_plural "makeshift slings" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for makeshift sling -#: lang/json/ARMOR_from_json.py -msgid "A large sheet tied into a crude, over-the-shoulder sling." -msgstr "" -" estilingue improvisadoUma folha grande amarrada em um estilinguebruto, " -"over- the-ombro." - #: lang/json/ARMOR_from_json.py msgid "ballistic mask" msgid_plural "ballistic masks" @@ -10745,17 +10678,6 @@ msgstr "" " máscara de trapaceiroEsta é uma t-shirt com mangas amarradas nascostas. " "Estes são geralmente usados pelos desordeiros para esconder suaidentidade." -#: lang/json/ARMOR_from_json.py -msgid "messenger bag" -msgid_plural "messenger bags" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for messenger bag -#: lang/json/ARMOR_from_json.py -msgid "Light and easy to wear, but doesn't offer much storage." -msgstr "bagageiro leve e fácil de usar, mas não oferece muito armazenamento." - #: lang/json/ARMOR_from_json.py msgid "pair of mittens" msgid_plural "pairs of mittens" @@ -10768,23 +10690,6 @@ msgid "A pair of warm mittens. They are extremely cumbersome." msgstr "" "par de luvas Um par de luvas quentes. Eles são extremamente incômodos." -#: lang/json/ARMOR_from_json.py -msgid "MOLLE pack" -msgid_plural "MOLLE packs" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for MOLLE pack -#: lang/json/ARMOR_from_json.py -msgid "" -"The Modular Lightweight Load-carrying Equipment is an advanced military " -"backpack. Covered with pockets and straps, it strikes a fine balance " -"between storage space and encumbrance." -msgstr "" -" MOLLE packThe Modular Lightweight Load-carrying Equipment é " -"umamochilamilitar avançada. Coberto com bolsos e correias, consegue um " -"bomequilíbrioentre espaço de armazenamento e sobrecarga." - #: lang/json/ARMOR_from_json.py msgid "motorcycle armor" msgid_plural "motorcycle armors" @@ -11270,17 +11175,6 @@ msgstr "" " capacete de poteUm capacete feito de uma panela de sopa. Não é " "umaproteçãomuito boa, mas é melhor que nada." -#: lang/json/ARMOR_from_json.py -msgid "purse" -msgid_plural "purses" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for purse -#: lang/json/ARMOR_from_json.py -msgid "A bit cumbersome to wear, but provides some storage." -msgstr "bolsa Um pouco complicado de usar, mas fornece algum armazenamento." - #: lang/json/ARMOR_from_json.py msgid "quiver" msgid_plural "quivers" @@ -11374,34 +11268,6 @@ msgstr "" " robeUm vestuário exterior solto com mangas e uma quantidade " "misteriosadebolsos bem escondidos." -#: lang/json/ARMOR_from_json.py -msgid "military rucksack" -msgid_plural "military rucksacks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for military rucksack -#: lang/json/ARMOR_from_json.py -msgid "A huge military rucksack, provides a lot of storage." -msgstr "" -" mochila militarUma mochila militar enorme, fornece muito armazenamento." - -#: lang/json/ARMOR_from_json.py -msgid "runner pack" -msgid_plural "runner packs" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for runner pack -#: lang/json/ARMOR_from_json.py -msgid "" -"The obvious choice for outdoor athletes, this ergonomic backpack is light " -"and easy to wear, ensuring comfort when carrying heavy and bulky items." -msgstr "" -" pack de corrida A escolha óbvia para os atletas ao ar livre, " -"estamochilaergonómica é leve e fácil de usar, garantindo conforto " -"aotransportar itenspesados e volumosos." - #: lang/json/ARMOR_from_json.py msgid "scabbard" msgid_plural "scabbards" @@ -11828,21 +11694,6 @@ msgstr "" " túnica sem mangasUma peça de tecido sem mangas que cobre o tronco " "easpernas." -#: lang/json/ARMOR_from_json.py -msgid "sling pack" -msgid_plural "sling packs" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for sling pack -#: lang/json/ARMOR_from_json.py -msgid "" -"A simple single-sling backpack. Easier to access than a normal backpack, " -"but can't comfortably hold as much." -msgstr "" -" sling packUma mochila simples de uma linga. Mais fácil de acessar do " -"queumamochila normal, mas que não pode aguentar muito." - #: lang/json/ARMOR_from_json.py msgid "snuggie" msgid_plural "snuggies" @@ -12141,8 +11992,8 @@ msgstr[0] "" msgstr[1] "" #. ~ Use action holster_prompt for survivor belt. -#. ~ Use action holster_prompt for hiking backpack. #. ~ Use action holster_prompt for survivor utility belt. +#. ~ Use action holster_prompt for hiking backpack. #. ~ Use action holster_prompt for C.R.I.T web belt. #: lang/json/ARMOR_from_json.py msgid "Sheath blade" @@ -12160,22 +12011,6 @@ msgstr "" "Durávelecuidadosamente trabalhada para ser confortável de usar. " "Ativeparaembainhar / sacar uma arma." -#: lang/json/ARMOR_from_json.py -msgid "survivor duffel bag" -msgid_plural "survivor duffel bags" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for survivor duffel bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built heavy duffel bag. Durable and carefully crafted to hold as " -"much stuff as possible." -msgstr "" -" saco de lona do sobrevivente Uma mochila pesada custom-built. " -"Durávelecuidadosamente trabalhada para armazenar o máximo de material " -"possível." - #: lang/json/ARMOR_from_json.py msgid "survivor goggles" msgid_plural "pairs of survivor goggles" @@ -12192,53 +12027,6 @@ msgstr "" "medidacomlentes coloridas. Confortável e construído para durar, " "elesfornecemexcelente proteção contra os perigos ambientais." -#: lang/json/ARMOR_from_json.py -msgid "survivor backpack" -msgid_plural "survivor backpacks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for survivor backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built backpack. Durable and carefully crafted to hold as much " -"stuff as possible." -msgstr "" -" Sobrevivente backpackA mochila personalizada. Durável " -"ecuidadosamentetrabalhada para armazenar o máximo de material possível." - -#: lang/json/ARMOR_from_json.py -msgid "survivor rucksack" -msgid_plural "survivor rucksacks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for survivor rucksack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built heavy backpack. Durable and carefully crafted to hold as " -"much stuff as possible." -msgstr "" -" Mochila de sobreviventeUma mochila pesada personalizada. " -"Durávelecuidadosamente trabalhada para armazenar o máximo de material " -"possível." - -#: lang/json/ARMOR_from_json.py -msgid "survivor runner pack" -msgid_plural "survivor runner packs" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for survivor runner pack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built lightweight runner pack. Durable and carefully crafted to " -"hold as much stuff as possible." -msgstr "" -" pack runner sobreviventeUm pack runner leve e personalizado. " -"Durávelecuidadosamente trabalhada para armazenar o máximo de material " -"possível." - #: lang/json/ARMOR_from_json.py msgid "survivor suit" msgid_plural "survivor suits" @@ -13232,32 +13020,6 @@ msgstr "" " Você não tem certeza se isso é chamado de boné de golfe, mas é o usodebonés" " estereotipados." -#: lang/json/ARMOR_from_json.py -msgid "golf bag" -msgid_plural "golf bags" -msgstr[0] "" -msgstr[1] "" - -#. ~ Use action holster_msg for golf bag. -#: lang/json/ARMOR_from_json.py -#, no-python-format -msgid "You awkwardly sheath your %s" -msgstr "" - -#. ~ Use action holster_prompt for golf bag. -#: lang/json/ARMOR_from_json.py -msgid "Sheath golf club" -msgstr "Clube de golfe bainha" - -#. ~ Description for golf bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A tall canvas and plastic bag with fold-out legs used for golfing. It even " -"has straps to be worn on the back." -msgstr "" -" Uma lona alta e saco de plástico com pernas dobráveis usadas " -"parajogargolfe. Ele ainda tem correias para serem usadas nas costas." - #: lang/json/ARMOR_from_json.py msgid "javelin bag" msgid_plural "javelin bags" @@ -13368,67 +13130,6 @@ msgstr "" " lona de plástico com vários ilhós para prendê-lo com corda ou cabo.Útilpara" " proteção contra chuva improvisada." -#: lang/json/ARMOR_from_json.py -msgid "high-volume rucksack" -msgid_plural "high-volume rucksacks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for high-volume rucksack -#: lang/json/ARMOR_from_json.py -msgid "" -"Also know as a \"bigpack\", this rucksack is prized by pack rats but may " -"lead to a bad back." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "hiking backpack" -msgid_plural "hiking backpacks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for hiking backpack -#: lang/json/ARMOR_from_json.py -msgid "A large sized hiking backpack with plenty of storage space." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "petpack" -msgid_plural "petpacks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for petpack -#: lang/json/ARMOR_from_json.py -msgid "" -"Before the Cataclysm this would allow your four-legged friend to see the " -"world, now it's used to shield them from the world." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "large tactical backpack" -msgid_plural "large tactical backpacks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for large tactical backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A large tactical multi-compartment backpack that has great lower back " -"support." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "travelpack" -msgid_plural "travelpacks" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for travelpack -#: lang/json/ARMOR_from_json.py -msgid "A hiking pack used for short trips." -msgstr "" - #: lang/json/ARMOR_from_json.py msgid "survivor utility belt" msgid_plural "survivor utility belts" @@ -13678,6 +13379,347 @@ msgid "" "resistant vests. It has four pouches capable of carrying magazines." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "backpack" +msgid_plural "backpacks" +msgstr[0] "mochila" +msgstr[1] "mochilas" + +#. ~ Description for backpack +#: lang/json/ARMOR_from_json.py +msgid "A small backpack. Good storage for a little encumbrance." +msgstr "" +"backpackA pequena mochila. Bom armazenamento por um pequeno empecilho." + +#: lang/json/ARMOR_from_json.py +msgid "hiking backpack" +msgid_plural "hiking backpacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for hiking backpack +#: lang/json/ARMOR_from_json.py +msgid "A large sized hiking backpack with plenty of storage space." +msgstr "" + +#: lang/json/ARMOR_from_json.py +msgid "giant novelty backpack" +msgid_plural "giant novelty backpacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for giant novelty backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A huge fabric backpack made mostly as a joke before the cataclysm. Now, " +"it's still rather silly, but it can store a lot of stuff." +msgstr "" +" Mochila de novidade giganteUma mochila de tecido enorme " +"feitaprincipalmentecomo uma piada antes do cataclismo. Agora, ainda é um " +"poucobobo, mas podearmazenar muitas coisas." + +#: lang/json/ARMOR_from_json.py +msgid "leather backpack" +msgid_plural "leather backpacks" +msgstr[0] "mochila de couro" +msgstr[1] "mochilas de couro" + +#. ~ Description for leather backpack +#: lang/json/ARMOR_from_json.py +msgid "A small leather backpack. Good storage for a little encumbrance." +msgstr "" +" mochila de couroUma mochila de couro pequena. Bom armazenamento " +"porumpequeno empecilho." + +#: lang/json/ARMOR_from_json.py +msgid "large tactical backpack" +msgid_plural "large tactical backpacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for large tactical backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A large tactical multi-compartment backpack that has great lower back " +"support." +msgstr "" + +#: lang/json/ARMOR_from_json.py +msgid "high-volume rucksack" +msgid_plural "high-volume rucksacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for high-volume rucksack +#: lang/json/ARMOR_from_json.py +msgid "" +"Also know as a \"bigpack\", this rucksack is prized by pack rats but may " +"lead to a bad back." +msgstr "" + +#: lang/json/ARMOR_from_json.py +msgid "dive bag" +msgid_plural "dive bags" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for dive bag +#: lang/json/ARMOR_from_json.py +msgid "A lightweight mesh backpack, commonly worn by swimmers and divers." +msgstr "" +"mochila de malha leve, geralmente usada por nadadores e mergulhadores." + +#: lang/json/ARMOR_from_json.py +msgid "duffel bag" +msgid_plural "duffel bags" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for duffel bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A huge duffel bag. Provides plenty of storage, but is severely encumbering." +msgstr "" +" mochila Uma mochila enorme. Fornece muito armazenamento, mas " +"estágravementeonerando." + +#: lang/json/ARMOR_from_json.py +msgid "petpack" +msgid_plural "petpacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for petpack +#: lang/json/ARMOR_from_json.py +msgid "" +"Before the Cataclysm this would allow your four-legged friend to see the " +"world, now it's used to shield them from the world." +msgstr "" + +#: lang/json/ARMOR_from_json.py +msgid "jerrypack" +msgid_plural "jerrypacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for jerrypack +#: lang/json/ARMOR_from_json.py +msgid "A jerrycan modified to be worn in a similar manner to a backpack." +msgstr "" +" jerrypack Um jerrycan modificado para ser usado de forma semelhante " +"aumamochila." + +#: lang/json/ARMOR_from_json.py +msgid "makeshift knapsack" +msgid_plural "makeshift knapsacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for makeshift knapsack +#: lang/json/ARMOR_from_json.py +msgid "" +"A pair of pants with the bottom ends tied with string, and then passed " +"through the belt loops so the knapsack can be carried on the back." +msgstr "" +" mochila improvisada Um par de calças com as extremidadesinferioresamarradas" +" com barbante e, em seguida, passadas pelas alças dacinta, paraque a mochila" +" possa ser levada pelas costas." + +#: lang/json/ARMOR_from_json.py +msgid "makeshift sling" +msgid_plural "makeshift slings" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for makeshift sling +#: lang/json/ARMOR_from_json.py +msgid "A large sheet tied into a crude, over-the-shoulder sling." +msgstr "" +" estilingue improvisadoUma folha grande amarrada em um estilinguebruto, " +"over- the-ombro." + +#: lang/json/ARMOR_from_json.py +msgid "messenger bag" +msgid_plural "messenger bags" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for messenger bag +#: lang/json/ARMOR_from_json.py +msgid "Light and easy to wear, but doesn't offer much storage." +msgstr "bagageiro leve e fácil de usar, mas não oferece muito armazenamento." + +#: lang/json/ARMOR_from_json.py +msgid "MOLLE pack" +msgid_plural "MOLLE packs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for MOLLE pack +#: lang/json/ARMOR_from_json.py +msgid "" +"The Modular Lightweight Load-carrying Equipment is an advanced military " +"backpack. Covered with pockets and straps, it strikes a fine balance " +"between storage space and encumbrance." +msgstr "" +" MOLLE packThe Modular Lightweight Load-carrying Equipment é " +"umamochilamilitar avançada. Coberto com bolsos e correias, consegue um " +"bomequilíbrioentre espaço de armazenamento e sobrecarga." + +#: lang/json/ARMOR_from_json.py +msgid "purse" +msgid_plural "purses" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for purse +#: lang/json/ARMOR_from_json.py +msgid "A bit cumbersome to wear, but provides some storage." +msgstr "bolsa Um pouco complicado de usar, mas fornece algum armazenamento." + +#: lang/json/ARMOR_from_json.py +msgid "military rucksack" +msgid_plural "military rucksacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for military rucksack +#: lang/json/ARMOR_from_json.py +msgid "A huge military rucksack, provides a lot of storage." +msgstr "" +" mochila militarUma mochila militar enorme, fornece muito armazenamento." + +#: lang/json/ARMOR_from_json.py +msgid "runner pack" +msgid_plural "runner packs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for runner pack +#: lang/json/ARMOR_from_json.py +msgid "" +"The obvious choice for outdoor athletes, this ergonomic backpack is light " +"and easy to wear, ensuring comfort when carrying heavy and bulky items." +msgstr "" +" pack de corrida A escolha óbvia para os atletas ao ar livre, " +"estamochilaergonómica é leve e fácil de usar, garantindo conforto " +"aotransportar itenspesados e volumosos." + +#: lang/json/ARMOR_from_json.py +msgid "sling pack" +msgid_plural "sling packs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for sling pack +#: lang/json/ARMOR_from_json.py +msgid "" +"A simple single-sling backpack. Easier to access than a normal backpack, " +"but can't comfortably hold as much." +msgstr "" +" sling packUma mochila simples de uma linga. Mais fácil de acessar do " +"queumamochila normal, mas que não pode aguentar muito." + +#: lang/json/ARMOR_from_json.py +msgid "survivor duffel bag" +msgid_plural "survivor duffel bags" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for survivor duffel bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built heavy duffel bag. Durable and carefully crafted to hold as " +"much stuff as possible." +msgstr "" +" saco de lona do sobrevivente Uma mochila pesada custom-built. " +"Durávelecuidadosamente trabalhada para armazenar o máximo de material " +"possível." + +#: lang/json/ARMOR_from_json.py +msgid "survivor backpack" +msgid_plural "survivor backpacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for survivor backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built backpack. Durable and carefully crafted to hold as much " +"stuff as possible." +msgstr "" +" Sobrevivente backpackA mochila personalizada. Durável " +"ecuidadosamentetrabalhada para armazenar o máximo de material possível." + +#: lang/json/ARMOR_from_json.py +msgid "survivor rucksack" +msgid_plural "survivor rucksacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for survivor rucksack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built heavy backpack. Durable and carefully crafted to hold as " +"much stuff as possible." +msgstr "" +" Mochila de sobreviventeUma mochila pesada personalizada. " +"Durávelecuidadosamente trabalhada para armazenar o máximo de material " +"possível." + +#: lang/json/ARMOR_from_json.py +msgid "survivor runner pack" +msgid_plural "survivor runner packs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for survivor runner pack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built lightweight runner pack. Durable and carefully crafted to " +"hold as much stuff as possible." +msgstr "" +" pack runner sobreviventeUm pack runner leve e personalizado. " +"Durávelecuidadosamente trabalhada para armazenar o máximo de material " +"possível." + +#: lang/json/ARMOR_from_json.py +msgid "golf bag" +msgid_plural "golf bags" +msgstr[0] "" +msgstr[1] "" + +#. ~ Use action holster_msg for golf bag. +#: lang/json/ARMOR_from_json.py +#, no-python-format +msgid "You awkwardly sheath your %s" +msgstr "" + +#. ~ Use action holster_prompt for golf bag. +#: lang/json/ARMOR_from_json.py +msgid "Sheath golf club" +msgstr "Clube de golfe bainha" + +#. ~ Description for golf bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A tall canvas and plastic bag with fold-out legs used for golfing. It even " +"has straps to be worn on the back." +msgstr "" +" Uma lona alta e saco de plástico com pernas dobráveis usadas " +"parajogargolfe. Ele ainda tem correias para serem usadas nas costas." + +#: lang/json/ARMOR_from_json.py +msgid "travelpack" +msgid_plural "travelpacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for travelpack +#: lang/json/ARMOR_from_json.py +msgid "A hiking pack used for short trips." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "pistol bandolier" msgid_plural "pistol bandoliers" @@ -16935,19 +16977,6 @@ msgid "" " turn more often than massive objects." msgstr "" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Advanced Microreactor CBM" -msgid_plural "Advanced Microreactor CBMs" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for Advanced Microreactor CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"This module upgrades a pre-installed microreactor with enhanced maximum " -"yield and limited automatic radiation scrubbing capabilities." -msgstr "" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Alarm System CBM" msgid_plural "Alarm System CBMs" @@ -17706,19 +17735,6 @@ msgid "" "cause delayed reaction times and drowsiness." msgstr "" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Plutonium Filter CBM" -msgid_plural "Plutonium Filter CBMs" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for Plutonium Filter CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A system of tanks and filters that are connected to a microreactor to " -"extract plutonium from radioactive slurry." -msgstr "" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Power Armor Interface CBM" msgid_plural "Power Armor Interface CBMs" @@ -17846,33 +17862,6 @@ msgid "" "unarmed slashing damage whenever the user's fingertips are uncovered." msgstr "" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Internal Microreactor CBM" -msgid_plural "Internal Microreactor CBMs" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for Internal Microreactor CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"This stripped down mini-reactor will generate impressive amounts of bionic " -"power, but may not be the safest thing to install. Once active, it cannot " -"be shut down and will slowly contaminate the user's body with radiation." -msgstr "" - -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Microreactor Upgrade CBM" -msgid_plural "Microreactor Upgrade CBMs" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for Microreactor Upgrade CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A kit for upgrading a pre-installed microreactor with enhanced maximum yield" -" and limited automatic radiation scrubbing capabilities." -msgstr "" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Recycler Unit CBM" msgid_plural "Recycler Unit CBMs" @@ -18517,6 +18506,59 @@ msgstr "" "torácicafoiconvertido em uma área de armazenamento. Você pode levar mais 2 " "litrosdevolume." +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Advanced Microreactor CBM" +msgid_plural "Advanced Microreactor CBMs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for Advanced Microreactor CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"This module upgrades a pre-installed microreactor with enhanced maximum " +"yield and limited automatic radiation scrubbing capabilities." +msgstr "" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Plutonium Filter CBM" +msgid_plural "Plutonium Filter CBMs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for Plutonium Filter CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A system of tanks and filters that are connected to a microreactor to " +"extract plutonium from radioactive slurry." +msgstr "" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Internal Microreactor CBM" +msgid_plural "Internal Microreactor CBMs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for Internal Microreactor CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"This stripped down mini-reactor will generate impressive amounts of bionic " +"power, but may not be the safest thing to install. Once active, it cannot " +"be shut down and will slowly contaminate the user's body with radiation." +msgstr "" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Microreactor Upgrade CBM" +msgid_plural "Microreactor Upgrade CBMs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for Microreactor Upgrade CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A kit for upgrading a pre-installed microreactor with enhanced maximum yield" +" and limited automatic radiation scrubbing capabilities." +msgstr "" + #. ~ Description for Solar Panels CBM #: lang/json/BIONIC_ITEM_from_json.py msgid "" @@ -21318,26 +21360,26 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Nietzsche's \"Beyond Good and Evil\". Its cover is dog-" +"This is a copy of Nietzsche's \"Beyond Good and Evil\". Its cover is dog-" "eared and creased." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"The Unique and Its Property\" by Max Stirner. A modern " +"This is a copy of \"The Unique and Its Property\" by Max Stirner. A modern " "translation by Wolfi Landstreicher." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Jean-Paul Sartre's \"Being and Nothingness\". A key work " +"This is a copy of Jean-Paul Sartre's \"Being and Nothingness\". A key work " "in the existentialist tradition." msgstr "" #: lang/json/BOOK_from_json.py msgid "" "A large, extended version of \"Madness and Civilisation\" by Michel " -"Foucault. The cover features a striking image of a Panopticonic Prison." +"Foucault. The cover features a striking image of a Panopticonic Prison." msgstr "" #: lang/json/BOOK_from_json.py @@ -21348,13 +21390,13 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"A collection of texts and essays by Jacques Derrida. It's pages loose and " +"A collection of texts and essays by Jacques Derrida. It's pages loose and " "yellowed, you should probably handle it with care." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Society of the Spectacle\" by Guy Debord. Its cover " +"This is a copy of \"Society of the Spectacle\" by Guy Debord. Its cover " "shows rows of adults staring placidly into a screen." msgstr "" @@ -21366,36 +21408,36 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Baudrillard's \"Simulation and Simulacra\". The cover " +"This is a copy of Baudrillard's \"Simulation and Simulacra\". The cover " "contains an image of a man holding a colored pill in each hand, with the " -"caption \"Welcome to the Desert of the Real.\". You think you've seen this " +"caption \"Welcome to the Desert of the Real.\". You think you've seen this " "movie." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a small, pocket version of Sartre's \"Existentialism and Humanism.\"" -" It looks to have been used as a coaster in a past life." +"This is a small, pocket version of Sartre's \"Existentialism and Humanism\"." +" It looks to have been used as a coaster in a past life." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Practical Ethics\" by Peter Singer. From the local " +"This is a copy of \"Practical Ethics\" by Peter Singer. From the local " "university press." msgstr "" #: lang/json/BOOK_from_json.py msgid "" "This is a photocopied spiral-bound copy of \"Industrial Society and Its " -"Future\" by 'Freedom Club'. The original looks to have been written on a " +"Future\" by 'Freedom Club'. The original looks to have been written on a " "typewriter before being copied." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Industrial Society and Its Future\" by Ted Kaczynski. " +"This is a copy of \"Industrial Society and Its Future\" by Ted Kaczynski. " "Its cover is an image of a hand-crafted wooden box filled with wiring and an" -" ominous looking metal tube. Provocative." +" ominous looking metal tube. Provocative." msgstr "" #: lang/json/BOOK_from_json.py @@ -21404,23 +21446,23 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"The State and Revolution\" by Vladimir Lenin. In " +"This is a copy of \"The State and Revolution\" by Vladimir Lenin. In " "English, thankfully." msgstr "" #: lang/json/BOOK_from_json.py -msgid "This is a copy of \"In Defence of Terrorism\" by Leon Trotsky." +msgid "This is a copy of \"In Defense of Marxism\" by Leon Trotsky." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Steal This Book\" by Abbie Hoffman. There is a security " -"tag on the back cover. It appears to still be active." +"This is a copy of \"Steal This Book\" by Abbie Hoffman. There is a security" +" tag on the back cover. It appears to still be active." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Walden: Or Life In The Woods\" by Henry David Thoreau. " +"This is a copy of \"Walden: Or Life In The Woods\" by Henry David Thoreau. " "It contains a dried and pressed leaf as a bookmark." msgstr "" @@ -21441,7 +21483,7 @@ msgid "" msgstr "" #: lang/json/BOOK_from_json.py -msgid "This is a copy of Machiavelli's \"The Prince\". With intro by Q. Skinner." +msgid "This is a copy of Machiavelli's \"The Prince\". With intro by Q. Skinner." msgstr "" #: lang/json/BOOK_from_json.py @@ -21451,12 +21493,12 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a pocket copy of \"An Essay on Liberation\" by Herbert Marcuse. The " -"cover contains an image of a pelican." +"This is a pocket copy of \"An Essay on Liberation\" by Herbert Marcuse. The" +" cover contains an image of a pelican." msgstr "" #: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Either-Or\" by Sören Kierkegaard." +msgid "This is a copy of \"Either-Or\" by Søren Kierkegaard." msgstr "" #: lang/json/BOOK_from_json.py @@ -21481,6 +21523,69 @@ msgid "" "Science\" by Friederich Nietzsche." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Myth of Sisyphus\", and other essays, by Albert " +"Camus. The cover depicts a bare-chested man and a large boulder." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Sickness Unto Death\" by Søren Kierkegaard. The " +"pages are dotted with post-it notes." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Defence of Terrorism\" by Leon Trotsky. Despite the" +" title, it does not actually appear to be defending terrorism." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Enquiry Concerning Political Justice\" by William " +"Godwin. This thick book is filled with antiquated phrases." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Abolition of Work and Other Essays\" by Bob Black. " +"It is likely that \"The Abolition of Work\" is the most famous essay in this" +" book." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"What is Property?\" by Pierre-Joseph Proudhon. It looks" +" like this book has a surprisingly long track record of owners." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Conquest of Bread\" by Peter Kropotkin. There is a " +"picture of an old philosopher with magnificent beard, instead of bread, on " +"the cover." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Trouble with Being Born\" by Emil Cioran. This book" +" might have been printed decades before the cataclysm since the cover is " +"quite weathered." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The World as Will and Representation\" by Arthur " +"Schopenhauer. It contains a few undecipherable notes and scribbles." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Up-Wingers: A Futurist Manifesto\" by FM-2030. It seems" +" that the author's real name is Fereidoun M. Esfandiary." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "phone book" msgid_plural "phone books" @@ -23352,8 +23457,8 @@ msgstr[1] "" msgid "" "This useful stuff is a potent solvent and has a wide range of reactive " "applications. It can be used to make a huge number of plastics and " -"polymers, it can be a disinfectant, it can strip paint and break down epoxy," -" and it can burn your skin away like tissue paper under a heat gun. Wear " +"polymers, it can be an antiseptic, it can strip paint and break down epoxy, " +"and it can burn your skin away like tissue paper under a heat gun. Wear " "gloves." msgstr "" @@ -29096,11 +29201,9 @@ msgstr[1] "" #. ~ Description for antiseptic powder #: lang/json/COMESTIBLE_from_json.py msgid "" -"A powdered form of chemical disinfectant, this bismuth formic iodide cleans " +"A powdered form of chemical antiseptic, this bismuth formic iodide cleans " "wounds quickly and painlessly." msgstr "" -" Pó anti-sépticoUma forma em pó de desinfetante químico, este " -"iodetofórmicode bismuto limpa as feridas rapidamente e sem dor." #: lang/json/COMESTIBLE_from_json.py msgid "caffeinated chewing gum" @@ -29125,12 +29228,12 @@ msgid "" "No-doz brand caffeine pills, maximum strength. Useful in pulling an all-" "nighter, one pill is about equivalent to a strong cup of coffee." msgstr "" -" Pílulas de cafeína da marca No-doz, força máxima. Útil em puxar " -"umanoitetoda, uma pílula é equivalente a uma xícara de café forte." +" Pílulas de cafeína da marca No-doz, força máxima. Útil para passar uma " +"noite em claro, uma pílula é equivalente a uma xícara de café forte." #: lang/json/COMESTIBLE_from_json.py msgid "chewing tobacco" -msgstr "mastigar tabaco" +msgstr "tabaco de mascar" #. ~ Description for chewing tobacco #: lang/json/COMESTIBLE_from_json.py @@ -29139,33 +29242,29 @@ msgid "" "health, it was once a favorite amongst baseball players, cowboys, and other " "macho types." msgstr "" -" Mint tabaco de mascar com sabor. Embora ainda seja " -"absolutamenteterrívelpara sua saúde, já foi um favorito entre os jogadores " -"de beisebol, cowboyse outros tipos machistas." +"Tabaco de mascar com sabor de menta. Embora ainda seja absolutamente " +"terrível para sua saúde, já foi um favorito entre os jogadores de beisebol, " +"cowboys e outros tipos machões." #: lang/json/COMESTIBLE_from_json.py msgid "hydrogen peroxide" msgid_plural "hydrogen peroxide" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "peróxido de hidrogênio" +msgstr[1] "peróxido de hidrogênio" #. ~ Description for hydrogen peroxide #: lang/json/COMESTIBLE_from_json.py msgid "" -"Dilute hydrogen peroxide, for use as a disinfectant and for bleaching hair " -"or textiles. Foams a little when in contact with organic matter, but " +"Dilute hydrogen peroxide, for use as an antiseptic and for bleaching hair or" +" textiles. Foams a little when in contact with organic matter, but " "otherwise harmless." msgstr "" -" peróxido de hidrogênioPeróxido de hidrogênio diluído, para " -"usocomodesinfetante e para branqueamento de cabelos ou têxteis. Espuma " -"umpoucoquando em contato com a matéria orgânica, mas de outra " -"formainofensivo." #: lang/json/COMESTIBLE_from_json.py lang/json/GENERIC_from_json.py msgid "cigarette" msgid_plural "cigarettes" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "cigarro" +msgstr[1] "cigarros" #. ~ Description for cigarette #: lang/json/COMESTIBLE_from_json.py @@ -29174,15 +29273,15 @@ msgid "" "into a filtered paper tube. Stimulates mental acuity and reduces appetite." " Highly addictive and hazardous to health." msgstr "" -" Uma mistura de folhas secas de tabaco, pesticidas e aditivosquímicos, " -"enrolados em um tubo de papel filtrado. Estimula a acuidade mentale reduzo " -"apetite. Altamente viciante e perigoso para a saúde." +" Uma mistura de folhas secas de tabaco, pesticidas e aditivos químicos, " +"enrolados em um tubo de papel com filtro. Estimula a acuidade mental e reduz" +" o apetite. Altamente viciante e perigoso para a saúde." #: lang/json/COMESTIBLE_from_json.py lang/json/GENERIC_from_json.py msgid "cigar" msgid_plural "cigars" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "charuto" +msgstr[1] "charutos" #. ~ Description for cigar #: lang/json/COMESTIBLE_from_json.py @@ -29190,8 +29289,8 @@ msgid "" "Rolled, cured tobacco leaf, addictive and hazardous to health.\n" "A gentleman's vice, cigars set the civil man apart from the savage." msgstr "" -" tabaco, folha de tabaco curada, viciante e perigosa para a saúde. \n" -" Umvício do cavalheiro, charutos diferenciam o homem civil do selvagem.\n" +" Folha de tabaco curada e enrolada, viciante e perigosa para a saúde. \n" +" Um vício do cavalheiro, charutos diferenciam o homem civil do selvagem." #: lang/json/COMESTIBLE_from_json.py msgid "chloroform soaked rag" @@ -29201,19 +29300,19 @@ msgstr "pano embebido em clorofórmio" #: lang/json/COMESTIBLE_from_json.py msgid "A debug item that lets you put NPCs (or yourself) to sleep." msgstr "" -" Um item de depuração que permite que você coloque NPCs (ou você " -"mesmo)paradormir." +" Um item de depuração que permite que você coloque NPCs (ou você mesmo) para" +" dormir." #: lang/json/COMESTIBLE_from_json.py msgid "codeine" msgid_plural "codeine" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "codeína" +msgstr[1] "codeína" #. ~ Use action activation_message for codeine. #: lang/json/COMESTIBLE_from_json.py msgid "You take some codeine." -msgstr "codeineVocê pega alguma codeína." +msgstr "Você pega um pouco de codeína." #. ~ Description for codeine #: lang/json/COMESTIBLE_from_json.py @@ -29222,15 +29321,15 @@ msgid "" "While relatively weak for a narcotic, it is still addictive, with a " "potential for overdose." msgstr "" -" Um opiáceo leve usado na supressão da dor, tosse e outras doenças. " -"Emborarelativamente fraco para um narcótico, ainda é viciante, compotencial " -"paraoverdose." +" Um opiáceo leve usado na supressão da dor, tosse e outras doenças. Embora " +"relativamente fraco para um narcótico, ainda é viciante, com potencial para " +"overdose." #: lang/json/COMESTIBLE_from_json.py src/addiction.cpp msgid "cocaine" msgid_plural "cocaine" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "cocaína" +msgstr[1] "cocaína" #. ~ Description for cocaine #: lang/json/COMESTIBLE_from_json.py @@ -29239,9 +29338,9 @@ msgid "" "of that in it. A topical analgesic, it is more commonly used for its " "stimulatory properties. Highly addictive." msgstr "" -" cocaínaExtrato cristalino da folha de coca, ou pelo menos, um pó " -"brancocomum pouco disso. Um analgésico tópico, é mais comumente usado " -"porsuaspropriedades estimulatórias. Altamente viciante." +"Extrato cristalino da folha de coca, ou pelo menos, um pó branco com um " +"pouco disso. Um analgésico tópico, é mais comumente usado por suas " +"propriedades estimulantes. Altamente viciante." #: lang/json/COMESTIBLE_from_json.py msgid "methacola" @@ -29329,25 +29428,23 @@ msgstr "" "narizescorrendo, mas você ainda vai precisar de muito líquido edescansar." #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant" -msgstr "desinfetante" +msgid "antiseptic" +msgstr "" -#. ~ Description for disinfectant +#. ~ Description for antiseptic #: lang/json/COMESTIBLE_from_json.py -msgid "A powerful disinfectant commonly used for contaminated wounds." -msgstr "Um desinfetante poderoso comumente usado para feridas contaminadas." +msgid "A powerful antiseptic commonly used for contaminated wounds." +msgstr "" #: lang/json/COMESTIBLE_from_json.py -msgid "makeshift disinfectant" -msgstr "desinfetante improvisado" +msgid "makeshift antiseptic" +msgstr "" -#. ~ Description for makeshift disinfectant +#. ~ Description for makeshift antiseptic #: lang/json/COMESTIBLE_from_json.py msgid "" -"Makeshift disinfectant made from ethanol. Can be used to disinfect a wound." +"Makeshift antiseptic made from ethanol. Can be used to disinfect a wound." msgstr "" -" Desinfetante improvisado feito de etanol. Pode ser usado para " -"desinfetarumaferida." #: lang/json/COMESTIBLE_from_json.py src/addiction.cpp msgid "diazepam" @@ -29757,10 +29854,8 @@ msgstr "óleo de tomilho" #: lang/json/COMESTIBLE_from_json.py msgid "" "Some essential oil made from thyme, which can act as a mildly irritating " -"disinfectant." +"antiseptic." msgstr "" -" Algum óleo essencial feito de tomilho, que pode atuar como um desinfetante " -"levemente irritante." #: lang/json/COMESTIBLE_from_json.py msgid "rolling tobacco" @@ -29970,28 +30065,28 @@ msgstr "" "retiradadouso regular deve ser gradual. Seu nome genérico é alprazolam." #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant soaked rag" -msgid_plural "disinfectant soaked rags" +msgid "antiseptic soaked rag" +msgid_plural "antiseptic soaked rags" msgstr[0] "" msgstr[1] "" -#. ~ Description for disinfectant soaked rag +#. ~ Description for antiseptic soaked rag #: lang/json/COMESTIBLE_from_json.py msgid "" -"A rag soaked in disinfectant. Useful for light wounds, probaby won't help " -"with deep bites." +"A rag soaked in antiseptic. Useful for light wounds, probaby won't help with" +" deep bites." msgstr "" #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant soaked cotton balls" -msgid_plural "disinfectant soaked cotton balls" +msgid "antiseptic soaked cotton balls" +msgid_plural "antiseptic soaked cotton balls" msgstr[0] "" msgstr[1] "" -#. ~ Description for disinfectant soaked cotton balls +#. ~ Description for antiseptic soaked cotton balls #: lang/json/COMESTIBLE_from_json.py msgid "" -"Fluffy balls of clean white cotton. Now soaked with disinfectant, they are " +"Fluffy balls of clean white cotton. Now soaked with antiseptic, they are " "somewhat useful to disinfect a wound." msgstr "" @@ -32678,8 +32773,8 @@ msgstr "medula vegetal" #: lang/json/COMESTIBLE_from_json.py msgid "A nutrient rich chunk of plant matter, could be eaten raw or cooked." msgstr "" -" Um pedaço rico em nutrientes da matéria vegetal pode ser consumido " -"cruoucozido." +" Um pedaço rico em nutrientes de matéria vegetal, pode ser consumido cru ou " +"cozido." #: lang/json/COMESTIBLE_from_json.py msgid "alien fungus chunk" @@ -32695,8 +32790,8 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "wild vegetables" msgid_plural "wild vegetables" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "vegetais silvestres" +msgstr[1] "vegetais silvestres" #. ~ Description for wild vegetables #: lang/json/COMESTIBLE_from_json.py @@ -32704,8 +32799,8 @@ msgid "" "An assortment of edible-looking wild plants. Most are quite bitter-tasting." " Some are inedible until cooked." msgstr "" -" vegetais selvagens Uma variedade de plantas silvestres deaspectocomestível." -" A maioria é muito amarga. Alguns não são comestíveisatéficarem cozidos." +"Uma variedade de plantas silvestres de aspecto comestível. A maioria é muito" +" amarga. Alguns não são comestíveis até ficarem cozidos." #: lang/json/COMESTIBLE_from_json.py msgid "zucchini" @@ -32728,8 +32823,8 @@ msgstr "Um belo talo de canola. Suas sementes podem ser pressionadas em óleo." #: lang/json/COMESTIBLE_from_json.py msgid "raw beans" msgid_plural "raw beans" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "feijões crus" +msgstr[1] "feijões crus" #. ~ Description for raw beans #: lang/json/COMESTIBLE_from_json.py @@ -32741,8 +32836,8 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "raw lentils" msgid_plural "raw lentils" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "lentilhas cruas" +msgstr[1] "lentilhas cruas" #. ~ Description for raw lentils #: lang/json/COMESTIBLE_from_json.py @@ -32806,49 +32901,63 @@ msgstr "sanduíche de queijo Um sanduíche de queijo simples." #: lang/json/COMESTIBLE_from_json.py msgid "jam sandwich" msgid_plural "jam sandwiches" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sanduíche de geléia" +msgstr[1] "sanduíches de geléia" #. ~ Description for jam sandwich #: lang/json/COMESTIBLE_from_json.py msgid "A delicious jam sandwich." -msgstr "sanduíche de geléia Um sanduíche de geléia delicioso." +msgstr "Um sanduíche de geléia delicioso." #: lang/json/COMESTIBLE_from_json.py -msgid "honey sandwich" -msgid_plural "honey sandwiches" +msgid "fairy bread" +msgid_plural "fairy bread" msgstr[0] "" msgstr[1] "" +#. ~ Description for fairy bread +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"An 'open-faced sandwich' consisting of sliced white bread, a healthy crust-" +"to-crust slathering of butter, and sprinkles. Supposedly a staple of " +"birthday parties in Australia." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "honey sandwich" +msgid_plural "honey sandwiches" +msgstr[0] "sanduíche de mel" +msgstr[1] "sanduíches de mel" + #. ~ Description for honey sandwich #: lang/json/COMESTIBLE_from_json.py msgid "A delicious honey sandwich." -msgstr "sanduíche de melUm sanduíche de mel delicioso." +msgstr "Um sanduíche de mel delicioso." #: lang/json/COMESTIBLE_from_json.py msgid "boring sandwich" msgid_plural "boring sandwiches" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sanduíche chato" +msgstr[1] "sanduíches chatos" #. ~ Description for boring sandwich #: lang/json/COMESTIBLE_from_json.py msgid "" "A simple sauce sandwich. Not very filling but beats eating just the bread." msgstr "" -" sanduíche chato Um sanduíche de molho simples. Não muito recheio " -"masbatecomer apenas o pão." +"Um sanduíche de molho simples. Não enche muito, mas é melhor do que comer só" +" o pão." #: lang/json/COMESTIBLE_from_json.py msgid "vegetable sandwich" msgid_plural "vegetable sandwiches" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sanduíche de vegetais" +msgstr[1] "sanduíches de vegetais" #. ~ Description for vegetable sandwich #: lang/json/COMESTIBLE_from_json.py msgid "Bread and vegetables, that's it." -msgstr "sanduíche de legumesCaçar e legumes, é isso." +msgstr "Pão e legumes, é isso." #: lang/json/COMESTIBLE_from_json.py msgid "meat sandwich" @@ -32910,8 +33019,8 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "PB&M sandwich" msgid_plural "PB&M sandwiches" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Sanduíche de xarope de bordo e mant. de amendoim" +msgstr[1] "Sanduíches de xarope de bordo e mant. de amendoim" #. ~ Description for PB&M sandwich #: lang/json/COMESTIBLE_from_json.py @@ -32919,19 +33028,19 @@ msgid "" "Who knew you could mix maple syrup and peanut butter to create yet another " "different sandwich?" msgstr "" -" Sanduíche PB & MQuem sabia que você poderia misturar xarope de " -"bordoemanteiga de amendoim para criar outro sanduíche diferente?" +"Quem diria que você poderia misturar xarope de bordo e manteiga de amendoim " +"para criar outro sanduíche diferente?" #: lang/json/COMESTIBLE_from_json.py msgid "fish sandwich" msgid_plural "fish sandwiches" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sanduíche de peixe" +msgstr[1] "sanduíches de peixe" #. ~ Description for fish sandwich #: lang/json/COMESTIBLE_from_json.py msgid "A delicious fish sandwich." -msgstr "sanduíche de peixe Um sanduíche de peixe delicioso." +msgstr "Um sanduíche de peixe delicioso." #: lang/json/COMESTIBLE_from_json.py msgid "BLT" @@ -32945,35 +33054,34 @@ msgstr "Um sanduíche de bacon, alface e tomate no pão torrado." #: lang/json/COMESTIBLE_from_json.py msgid "seeds" msgid_plural "seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes" +msgstr[1] "sementes" #: lang/json/COMESTIBLE_from_json.py msgid "fruit seeds" -msgstr "sementes de sementes" +msgstr "sementes de frutas" #: lang/json/COMESTIBLE_from_json.py msgid "mushroom spores" msgid_plural "mushroom spores" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "esporos de cogumelo" +msgstr[1] "esporos de cogumelo" #. ~ Description for mushroom spores #: lang/json/COMESTIBLE_from_json.py msgid "Some mushroom spores." -msgstr "" +msgstr "Alguns esporos de cogumelo." #: lang/json/COMESTIBLE_from_json.py msgid "hop rhizomes" msgid_plural "hop rhizomes" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "rizoma de lúpulo" +msgstr[1] "rizomas de lúpulo" #. ~ Description for hop rhizomes #: lang/json/COMESTIBLE_from_json.py msgid "Roots of a hop plant, for growing your own." -msgstr "" -"hop rizomasRoots de uma planta de lúpulo, para cultivar a sua própria." +msgstr "Raízes de uma planta de lúpulo, para cultivar a sua própria." #: lang/json/COMESTIBLE_from_json.py msgid "hops" @@ -32982,13 +33090,13 @@ msgstr "lúpulo" #: lang/json/COMESTIBLE_from_json.py msgid "blackberry seeds" msgid_plural "blackberry seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de amora-preta" +msgstr[1] "sementes de amora-preta" #. ~ Description for blackberry seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some blackberry seeds." -msgstr "sementes de amora-pretaAlgumas sementes de amora-preta." +msgstr "Algumas sementes de amora-preta." #: lang/json/COMESTIBLE_from_json.py msgid "blackberry" @@ -32997,13 +33105,13 @@ msgstr "Amora" #: lang/json/COMESTIBLE_from_json.py msgid "blueberry seeds" msgid_plural "blueberry seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de mirtilo" +msgstr[1] "sementes de mirtilo" #. ~ Description for blueberry seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some blueberry seeds." -msgstr "sementes de mirtiloAlgumas sementes de mirtilo." +msgstr "Algumas sementes de mirtilo." #: lang/json/COMESTIBLE_from_json.py msgid "blueberry" @@ -33012,13 +33120,13 @@ msgstr "mirtilo" #: lang/json/COMESTIBLE_from_json.py msgid "cranberry seeds" msgid_plural "cranberry seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de oxicoco" +msgstr[1] "sementes de oxicoco" #. ~ Description for cranberry seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some cranberry seeds." -msgstr "sementes de cranberryAlgumas sementes de cranberry." +msgstr "Algumas sementes de oxicoco." #: lang/json/COMESTIBLE_from_json.py msgid "cranberry" @@ -33057,13 +33165,13 @@ msgstr "amora" #: lang/json/COMESTIBLE_from_json.py msgid "elderberry seeds" msgid_plural "elderberry seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de sabugueiro" +msgstr[1] "sementes de sabugueiro" #. ~ Description for elderberry seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some elderberry seeds." -msgstr "sementes de sabugueiroAlgumas sementes de sabugueiro." +msgstr "Algumas sementes de sabugueiro." #: lang/json/COMESTIBLE_from_json.py msgid "elderberry" @@ -33072,13 +33180,13 @@ msgstr "sabugueiro" #: lang/json/COMESTIBLE_from_json.py msgid "raspberry seeds" msgid_plural "raspberry seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de framboesa" +msgstr[1] "sementes de framboesa" #. ~ Description for raspberry seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some raspberry seeds." -msgstr "sementes de framboesaAlgumas sementes de framboesa." +msgstr "Algumas sementes de framboesa." #: lang/json/COMESTIBLE_from_json.py msgid "raspberry" @@ -33087,13 +33195,13 @@ msgstr "framboesa" #: lang/json/COMESTIBLE_from_json.py msgid "strawberry seeds" msgid_plural "strawberry seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "semente de morango" +msgstr[1] "sementes de morango" #. ~ Description for strawberry seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some strawberry seeds." -msgstr "sementes de morango" +msgstr "Algumas sementes de morango." #: lang/json/COMESTIBLE_from_json.py msgid "strawberry" @@ -33102,13 +33210,13 @@ msgstr "morango" #: lang/json/COMESTIBLE_from_json.py msgid "grape seeds" msgid_plural "grape seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "semente de uva" +msgstr[1] "sementes de uva" #. ~ Description for grape seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some grape seeds." -msgstr "Sementes de uvaAlgumas sementes de uva." +msgstr "Algumas sementes de uva." #: lang/json/COMESTIBLE_from_json.py msgid "grape" @@ -33117,30 +33225,30 @@ msgstr "uva" #: lang/json/COMESTIBLE_from_json.py msgid "rose seeds" msgid_plural "rose seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "semente de rosa" +msgstr[1] "sementes de rosa" #. ~ Description for rose seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some rose seeds." -msgstr "rose seedsSome subiu sementes." +msgstr "Algumas sementes de roseira." #: lang/json/COMESTIBLE_from_json.py lang/json/GENERIC_from_json.py msgid "rose" msgid_plural "roses" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "rosa" +msgstr[1] "rosas" #: lang/json/COMESTIBLE_from_json.py msgid "tobacco seeds" msgid_plural "tobacco seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de tabaco" +msgstr[1] "sementes de tabaco" #. ~ Description for tobacco seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some tobacco seeds." -msgstr "sementes de rosetobaccoAlgumas sementes de tabaco." +msgstr "Algumas sementes de tabaco." #: lang/json/COMESTIBLE_from_json.py msgid "tobacco" @@ -33149,71 +33257,70 @@ msgstr "tabaco" #: lang/json/COMESTIBLE_from_json.py msgid "barley seeds" msgid_plural "barley seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de cevada" +msgstr[1] "sementes de cevada" #. ~ Description for barley seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some barley seeds." -msgstr "sementes de cevadaAlgumas sementes de cevada." +msgstr "Algumas sementes de cevada." #: lang/json/COMESTIBLE_from_json.py msgid "sugar beet seeds" msgid_plural "sugar beet seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de beterraba-sacarina" +msgstr[1] "sementes de beterraba-sacarina" #. ~ Description for sugar beet seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some sugar beet seeds." -msgstr "" -" sementes de beterraba açucareiraAlgumas sementes de beterraba sacarina." +msgstr "Algumas sementes de beterraba-sacarina." #: lang/json/COMESTIBLE_from_json.py msgid "lettuce seeds" msgid_plural "lettuce seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de alface" +msgstr[1] "sementes de alface" #. ~ Description for lettuce seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some lettuce seeds." -msgstr "sementes de alfaceAlgumas sementes de alface." +msgstr "Algumas sementes de alface." #: lang/json/COMESTIBLE_from_json.py msgid "cabbage seeds" msgid_plural "cabbage seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de repolho" +msgstr[1] "sementes de repolho" #. ~ Description for cabbage seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some white cabbage seeds." -msgstr "sementes de repolhoAlgumas sementes de repolho branco." +msgstr "Algumas sementes de repolho-liso." #: lang/json/COMESTIBLE_from_json.py msgid "tomato seeds" msgid_plural "tomato seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de tomate" +msgstr[1] "sementes de tomate" #. ~ Description for tomato seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some tomato seeds." -msgstr "sementes de tomateAlgumas sementes de tomate." +msgstr "Algumas sementes de tomate." #: lang/json/COMESTIBLE_from_json.py msgid "cotton seeds" msgid_plural "cotton seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] " sementes de algodão" +msgstr[1] " sementes de algodão" #. ~ Description for cotton seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some cotton seeds. Can be processed to produce an edible oil." msgstr "" -" sementes de algodãoAlgumas sementes de algodão. Pode ser " -"processadoparaproduzir um óleo comestível." +"Algumas sementes de algodão. Pode ser processado para produzir um óleo " +"comestível." #: lang/json/COMESTIBLE_from_json.py msgid "cotton" @@ -33222,46 +33329,46 @@ msgstr "algodão" #: lang/json/COMESTIBLE_from_json.py msgid "broccoli seeds" msgid_plural "broccoli seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de brócolis" +msgstr[1] "sementes de brócolis" #. ~ Description for broccoli seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some broccoli seeds." -msgstr "sementes de brócolisAlgumas sementes de brócolis." +msgstr "Algumas sementes de brócolis." #: lang/json/COMESTIBLE_from_json.py msgid "zucchini seeds" msgid_plural "zucchini seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de abobrinha" +msgstr[1] "sementes de abobrinha" #. ~ Description for zucchini seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some zucchini seeds." -msgstr "sementes de abobrinhaAlgumas sementes de abobrinha." +msgstr "Algumas sementes de abobrinha." #: lang/json/COMESTIBLE_from_json.py msgid "onion seeds" msgid_plural "onion seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de cebola" +msgstr[1] "sementes de cebola" #. ~ Description for onion seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some onion seeds." -msgstr "sementes de cebolaAlgumas sementes de cebola." +msgstr "Algumas sementes de cebola." #: lang/json/COMESTIBLE_from_json.py msgid "garlic seeds" msgid_plural "garlic seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de alho" +msgstr[1] "sementes de alho" #. ~ Description for garlic seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some garlic seeds." -msgstr "sementes de alhoAlgumas sementes de alho." +msgstr "Algumas sementes de alho." #: lang/json/COMESTIBLE_from_json.py msgid "garlic" @@ -33314,30 +33421,30 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "chicory seeds" msgid_plural "chicory seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de chicória" +msgstr[1] "sementes de chicória" #. ~ Description for chicory seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some chicory seeds." -msgstr "" +msgstr "Algumas sementes de chicória." #: lang/json/COMESTIBLE_from_json.py msgid "wild root seeds" msgid_plural "wild root seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de raiz silvestre" +msgstr[1] "sementes de raiz silvestre" #. ~ Description for wild root seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some seeds from a white flower." -msgstr "" +msgstr "Algumas sementes de uma flor branca." #: lang/json/COMESTIBLE_from_json.py msgid "decorative plant seeds" msgid_plural "decorative plant seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de planta decorativa" +msgstr[1] "sementes de planta decorativa" #. ~ Description for decorative plant seeds #: lang/json/COMESTIBLE_from_json.py @@ -33345,93 +33452,95 @@ msgid "" "Some small decorative plant seeds, likely grass or flower. Don't expect " "them to be useful for anything other than dry plant material." msgstr "" +"Algumas sementes de plantas pequenas e decorativas, provavelmente grama ou " +"flores. Não espere que sejam úteis para nada a não ser material vegetal " +"seco." #: lang/json/COMESTIBLE_from_json.py msgid "decorative plant" -msgstr "" +msgstr "planta decorativa" #: lang/json/COMESTIBLE_from_json.py msgid "cactus seeds" msgid_plural "cactus seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de cacto" +msgstr[1] "sementes de cacto" #. ~ Description for cactus seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some cactus seeds." -msgstr "" +msgstr "Algumas sementes de cacto." #: lang/json/COMESTIBLE_from_json.py lang/json/terrain_from_json.py msgid "cactus" -msgstr "" +msgstr "cacto" #: lang/json/COMESTIBLE_from_json.py msgid "garlic clove" msgid_plural "garlic cloves" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "dente de alho" +msgstr[1] "dentes de alho" #. ~ Description for garlic clove #: lang/json/COMESTIBLE_from_json.py msgid "Cloves of garlic. Useful as a seasoning, or for planting." -msgstr "dente de alhoCloves de alho. Útil como tempero ou para plantio." +msgstr "Dentes de alho. Útil como tempero ou para plantio." #: lang/json/COMESTIBLE_from_json.py msgid "carrot seeds" msgid_plural "carrot seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de cenoura" +msgstr[1] "sementes de cenoura" #. ~ Description for carrot seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some carrot seeds." -msgstr "sementes de cenouraAlgumas sementes de cenoura." +msgstr "Algumas sementes de cenoura." #: lang/json/COMESTIBLE_from_json.py msgid "corn seeds" msgid_plural "corn seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de milho" +msgstr[1] "sementes de milho" #. ~ Description for corn seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some corn seeds." -msgstr "sementes de milhoAlgumas sementes de milho." +msgstr "Algumas sementes de milho." #: lang/json/COMESTIBLE_from_json.py msgid "chili pepper seeds" msgid_plural "chili pepper seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de pimenta" +msgstr[1] "sementes de pimenta" #. ~ Description for chili pepper seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some chili pepper seeds." -msgstr "sementes de pimenta pimentaAlgumas sementes de pimenta." +msgstr "Algumas sementes de pimenta." #: lang/json/COMESTIBLE_from_json.py msgid "cucumber seeds" msgid_plural "cucumber seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de pepino" +msgstr[1] "sementes de pepino" #. ~ Description for cucumber seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some cucumber seeds." -msgstr "sementes de pepinoAlgumas sementes de pepino." +msgstr "Algumas sementes de pepino." #: lang/json/COMESTIBLE_from_json.py msgid "seed potato" msgid_plural "seed potatoes" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "batata de plantio" +msgstr[1] "batatas de plantio" #. ~ Description for seed potato #: lang/json/COMESTIBLE_from_json.py msgid "A raw potato, cut into pieces, separating each bud for planting." msgstr "" -" batata de sementeUma batata crua, cortada em pedaços, separando " -"cadabotãopara o plantio." +"Uma batata crua, cortada em pedaços, separando cada botão para o plantio." #: lang/json/COMESTIBLE_from_json.py msgid "potatoes" @@ -33440,8 +33549,8 @@ msgstr "batatas" #: lang/json/COMESTIBLE_from_json.py msgid "cannabis seeds" msgid_plural "cannabis seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de cannabis" +msgstr[1] "sementes de cannabis" #. ~ Description for cannabis seeds #: lang/json/COMESTIBLE_from_json.py @@ -33449,8 +33558,8 @@ msgid "" "Seeds of the cannabis plant. Filled with vitamins, they can be roasted or " "eaten raw." msgstr "" -" sementes de maconhaSementes da planta de cannabis. Cheios devitaminas, " -"podem ser torrados ou comidos crus." +"Sementes da planta de cannabis. Cheias de vitaminas, podem ser torradas ou " +"comidas cruas." #: lang/json/COMESTIBLE_from_json.py msgid "cannabis" @@ -33469,56 +33578,59 @@ msgid "" " delicious aroma, but is clearly either mutated or of alien origin. You " "could probably plant it." msgstr "" +"Isso se parece com uma semente de girassol do tamanho da sua mão. Ela tem um" +" aroma forte porém delicioso, mas é claramente de origem extraterrestre ou " +"produto de uma mutação. Você provavelmente poderia plantá-la." #: lang/json/COMESTIBLE_from_json.py msgid "bean seeds" msgid_plural "bean seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de feijão" +msgstr[1] "sementes de feijão" #. ~ Description for bean seeds #: lang/json/COMESTIBLE_from_json.py msgid "Raw, uncooked beans, ready for planting." -msgstr "" +msgstr "Feijões crus, prontos para o plantio." #: lang/json/COMESTIBLE_from_json.py msgid "beans" -msgstr "" +msgstr "feijões" #: lang/json/COMESTIBLE_from_json.py msgid "soybean seeds" msgid_plural "soybean seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de soja" +msgstr[1] "sementes de soja" #. ~ Description for soybean seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some soybean seeds." -msgstr "" +msgstr "Algumas sementes de soja." #: lang/json/COMESTIBLE_from_json.py msgid "soybean" -msgstr "" +msgstr "soja" #. ~ Description for raw lentils #: lang/json/COMESTIBLE_from_json.py msgid "Raw, uncooked lentils, ready for planting." -msgstr "" +msgstr "Lentilhas cruas, prontas para o plantio." #: lang/json/COMESTIBLE_from_json.py msgid "lentils" -msgstr "" +msgstr "lentilhas" #: lang/json/COMESTIBLE_from_json.py msgid "thyme seeds" msgid_plural "thyme seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de tomilho" +msgstr[1] "sementes de tomilho" #. ~ Description for thyme seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some thyme seeds." -msgstr "" +msgstr "Algumas sementes de tomilho." #: lang/json/COMESTIBLE_from_json.py msgid "thyme" @@ -33538,33 +33650,33 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "pumpkin seeds" msgid_plural "pumpkin seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de abóbora" +msgstr[1] "sementes de abóbora" #. ~ Description for pumpkin seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some raw pumpkin seeds. Could be fried and eaten." -msgstr "" +msgstr "Algumas sementes cruas de abóbora. Poderiam ser torradas e comidas." #: lang/json/COMESTIBLE_from_json.py msgid "sunflower seeds" msgid_plural "sunflower seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de girassol" +msgstr[1] "sementes de girassol" #. ~ Description for sunflower seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some raw sunflower seeds. Could be pressed into oil." msgstr "" -" sementes de girassolAlgumas sementes de girassol cruas. " -"Poderiaserpressionado em óleo." +"Algumas sementes de girassol cruas. Poderiam ser pressionadas para obter " +"óleo." #: lang/json/COMESTIBLE_from_json.py lang/json/GENERIC_from_json.py #: lang/json/furniture_from_json.py msgid "sunflower" msgid_plural "sunflowers" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "girassol" +msgstr[1] "girassóis" #: lang/json/COMESTIBLE_from_json.py msgid "dogbane seeds" @@ -33628,8 +33740,8 @@ msgstr "erva selvagem" #: lang/json/COMESTIBLE_from_json.py msgid "wild vegetable stems" msgid_plural "wild vegetable stems" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "caules de vegetal silvestre" +msgstr[1] "caules de vegetal silvestre" #. ~ Description for wild vegetable stems #: lang/json/COMESTIBLE_from_json.py @@ -33658,13 +33770,13 @@ msgstr "dente de leão" #: lang/json/COMESTIBLE_from_json.py msgid "rhubarb stems" msgid_plural "rhubarb stems" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "caules de ruibarbo" +msgstr[1] "caules de ruibarbo" #. ~ Description for rhubarb stems #: lang/json/COMESTIBLE_from_json.py msgid "Some rhubarb stems." -msgstr "" +msgstr "Alguns caules de ruibarbo." #: lang/json/COMESTIBLE_from_json.py msgid "morel mushroom spores" @@ -33698,53 +33810,53 @@ msgstr "datura" #: lang/json/COMESTIBLE_from_json.py msgid "celery seeds" msgid_plural "celery seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de aipo" +msgstr[1] "sementes de aipo" #. ~ Description for celery seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some celery seeds." -msgstr "sementes de aipoAlgumas sementes de aipo." +msgstr "Algumas sementes de aipo." #: lang/json/COMESTIBLE_from_json.py msgid "oat seeds" msgid_plural "oat seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de aveia" +msgstr[1] "sementes de aveia" #. ~ Description for oat seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some oat seeds." -msgstr "sementes de aveiaAlgumas sementes de aveia." +msgstr "Algumas sementes de aveia." #: lang/json/COMESTIBLE_from_json.py msgid "oats" msgid_plural "oats" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "aveia" +msgstr[1] "aveia" #: lang/json/COMESTIBLE_from_json.py msgid "wheat seeds" msgid_plural "wheat seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de trigo" +msgstr[1] "sementes de trigo" #. ~ Description for wheat seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some wheat seeds." -msgstr "Sementes de trigo e aveiaAlgumas sementes de trigo." +msgstr "Algumas sementes de trigo." #: lang/json/COMESTIBLE_from_json.py msgid "wheat" msgid_plural "wheat" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "trigo" +msgstr[1] "trigo" #: lang/json/COMESTIBLE_from_json.py msgid "fried seeds" msgid_plural "fried seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes fritas" +msgstr[1] "sementes fritas" #. ~ Description for fried seeds #: lang/json/COMESTIBLE_from_json.py @@ -33752,8 +33864,8 @@ msgid "" "Some fried seeds of a sunflower, pumpkin or other plant. Quite nutritious " "and tasty." msgstr "" -" sementes de trigo fritoAlgumas sementes fritas de um girassol, " -"abóboraououtra planta. Bastante nutritivo e saboroso." +"Algumas sementes fritas de um girassol, abóbora ou outra planta. Bastante " +"nutritivo e saboroso." #: lang/json/COMESTIBLE_from_json.py msgid "Kentucky coffee pod" @@ -33771,36 +33883,35 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "coffee beans" msgid_plural "coffee beans" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "grãos de café" +msgstr[1] "grãos de café" #. ~ Description for coffee beans #: lang/json/COMESTIBLE_from_json.py msgid "Some coffee beans, can be roasted." -msgstr "grãos de caféAlguns grãos de café podem ser torrados." +msgstr "Alguns grãos de café. Podem ser torrados." #: lang/json/COMESTIBLE_from_json.py msgid "roasted coffee beans" msgid_plural "roasted coffee beans" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "grãos de café torrados" +msgstr[1] "grãos de café torrados" #. ~ Description for roasted coffee beans #: lang/json/COMESTIBLE_from_json.py msgid "Some roasted coffee beans, can be ground into powder." -msgstr "" -" grãos de café torradosAlguns grãos de café torrados podem ser moídos em pó." +msgstr "Alguns grãos de café torrados, podem ser moídos em pó." #: lang/json/COMESTIBLE_from_json.py msgid "chamomile seeds" msgid_plural "chamomile seeds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sementes de camomila" +msgstr[1] "sementes de camomila" #. ~ Description for chamomile seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some chamomile seeds." -msgstr "" +msgstr "Algumas sementes de camomila." #: lang/json/COMESTIBLE_from_json.py lang/json/furniture_from_json.py msgid "chamomile" @@ -33813,7 +33924,7 @@ msgstr "caldo" #. ~ Description for broth #: lang/json/COMESTIBLE_from_json.py msgid "Vegetable stock. Tasty and fairly nutritious." -msgstr "Estoque vegetal. Saboroso e razoavelmente nutritivo." +msgstr "Caldo vegetal. Saboroso e razoavelmente nutritivo." #: lang/json/COMESTIBLE_from_json.py msgid "bone broth" @@ -33863,25 +33974,24 @@ msgstr "Uma nutritiva e deliciosa sopa de peixe." #: lang/json/COMESTIBLE_from_json.py msgid "curry" msgid_plural "curries" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "curry" +msgstr[1] "curry" #. ~ Description for curry #: lang/json/COMESTIBLE_from_json.py msgid "Spicy, and filled with bits of peppers. It's pretty good." -msgstr "currySpicy, e cheio de pedaços de pimenta. É muito bom." +msgstr "Apimentado e cheio de pedaços de pimenta. É muito bom." #: lang/json/COMESTIBLE_from_json.py msgid "curry with meat" msgid_plural "curries with meat" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "curry com carne" +msgstr[1] "curry com carne" #. ~ Description for curry with meat #: lang/json/COMESTIBLE_from_json.py msgid "Spicy, and filled with bits of peppers and meat! It's pretty good." -msgstr "" -" caril com carneSpicy e cheio de pedaços de pimentão e carne! É muito bom." +msgstr "Apimentado e cheio de pedaços de pimentão e carne! É muito bom." #: lang/json/COMESTIBLE_from_json.py msgid "woods soup" @@ -33894,13 +34004,13 @@ msgstr "Uma sopa nutritiva e deliciosa, feita de presentes da natureza." #: lang/json/COMESTIBLE_from_json.py msgid "sap soup" -msgstr "sabe a sopa" +msgstr "sopa de seiva" #. ~ Description for sap soup #: lang/json/COMESTIBLE_from_json.py msgid "A soup made from someone who is a far better meal than person." msgstr "" -" Uma sopa feita de alguém que é uma refeição muito melhor do que a pessoa." +" Uma sopa feita de alguém que é uma refeição muito melhor do que uma pessoa." #: lang/json/COMESTIBLE_from_json.py msgid "chicken noodle soup" @@ -33912,8 +34022,8 @@ msgid "" "Chicken chunks and noodles swimming in a salty broth. Rumored to help cure " "colds." msgstr "" -" Pedaços de frango e macarrão nadando em um caldo salgado. Rumoresparaajudar" -" a curar resfriados." +" Pedaços de frango e macarrão nadando em um caldo salgado. Supostamente " +"ajuda a curar resfriados." #: lang/json/COMESTIBLE_from_json.py msgid "mushroom soup" @@ -33933,20 +34043,18 @@ msgstr "sopa de tomate" msgid "" "It smells of tomatoes. Not very filling, but it goes well with grilled " "cheese." -msgstr "Cheira de tomate. Não muito recheio, mas vai bem com queijo grelhado." +msgstr "Cheira a tomate. Não enche muito, mas vai bem com queijo grelhado." #: lang/json/COMESTIBLE_from_json.py msgid "chicken and dumplings" msgid_plural "chicken and dumplings" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "canja com massa" +msgstr[1] "canja com massa" #. ~ Description for chicken and dumplings #: lang/json/COMESTIBLE_from_json.py msgid "A soup with chicken chunks and balls of dough. Not bad." -msgstr "" -" frango e bolinhos Uma sopa com pedaços de frango e bolas de massa. " -"Nãoéruim." +msgstr "Uma sopa com pedaços de frango e bolas de massa. Não é ruim." #: lang/json/COMESTIBLE_from_json.py msgid "cullen skink" @@ -33964,8 +34072,8 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "chili powder" msgid_plural "chili powder" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "pimenta em pó" +msgstr[1] "pimenta em pó" #. ~ Description for chili powder #: lang/json/COMESTIBLE_from_json.py @@ -33973,26 +34081,25 @@ msgid "" "Chilly P, Yo! Not edible on its own, but it could be used to make " "seasoning." msgstr "" -" pimentão em póChilly P, Yo! Não é comestível sozinho, mas pode serusadopara" -" fazer temperos." +"Chilly P, Yo! Não é comestível sozinho, mas pode ser usado para fazer " +"temperos." #: lang/json/COMESTIBLE_from_json.py msgid "cinnamon" msgid_plural "cinnamon" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "canela em pó" +msgstr[1] "canela em pó" #. ~ Description for cinnamon #: lang/json/COMESTIBLE_from_json.py msgid "Ground cinnamon bark with a sweet but slightly spicy aroma." -msgstr "" -" canela Casca de canela em grão com um aroma doce mas ligeiramente picante." +msgstr "Casca de canela em pó com um aroma doce mas ligeiramente picante." #: lang/json/COMESTIBLE_from_json.py msgid "curry powder" msgid_plural "curry powder" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Pó de caril" +msgstr[1] "Pó de caril" #. ~ Description for curry powder #: lang/json/COMESTIBLE_from_json.py @@ -34000,25 +34107,25 @@ msgid "" "A blend of spices meant to be used in some South Asian dishes. Can't be " "eaten raw, why would you even try that?" msgstr "" -" Pó de caril Uma mistura de especiarias destinada a ser usada emalgunspratos" -" do sul da Ásia. Não pode ser comido cru, por que você tentariaisso?" +"Uma mistura de especiarias destinada a ser usada em alguns pratos do sul da " +"Ásia. Não pode ser comido cru, por que você tentaria isso?" #: lang/json/COMESTIBLE_from_json.py msgid "black pepper" msgid_plural "black pepper" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Pimenta preta" +msgstr[1] "Pimenta preta" #. ~ Description for black pepper #: lang/json/COMESTIBLE_from_json.py msgid "Ground black spice berries with a pungent aroma." -msgstr "Pimenta pretaCrigão preto com um aroma forte." +msgstr "Grãos moídos de pimenta preta com um aroma forte." #: lang/json/COMESTIBLE_from_json.py msgid "salt" msgid_plural "salt" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sal" +msgstr[1] "sal" #. ~ Description for salt #: lang/json/COMESTIBLE_from_json.py @@ -34026,40 +34133,40 @@ msgid "" "Yuck! You surely wouldn't want to eat this. It's good for preserving meat " "and cooking, though." msgstr "" -" salgado! Você certamente não gostaria de comer isso. É bom " -"parapreservarcarne e cozinhar, no entanto." +"Salgado! Você certamente não gostaria de comer isso. É bom para preservar " +"carne e cozinhar, no entanto." #: lang/json/COMESTIBLE_from_json.py msgid "Italian seasoning" msgid_plural "Italian seasoning" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "tempero italiano" +msgstr[1] "tempero italiano" #. ~ Description for Italian seasoning #: lang/json/COMESTIBLE_from_json.py msgid "A fragrant mix of dried oregano, basil, thyme and other spices." msgstr "" -" Tempero italiano Uma mistura perfumada de orégano seco, manjericão, " -"tomilhoe outras especiarias." +"Uma mistura perfumada de orégano seco, manjericão, tomilho e outras " +"especiarias." #: lang/json/COMESTIBLE_from_json.py msgid "seasoned salt" msgid_plural "seasoned salt" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sal temperado" +msgstr[1] "sal temperado" #. ~ Description for seasoned salt #: lang/json/COMESTIBLE_from_json.py msgid "Salt mixed with a fragrant blend of secret herbs and spices." msgstr "" -" sal temperado misturado com uma mistura perfumada de ervas " -"eespeciariassecretas." +"Sal temperado, misturado com uma mistura fragrante de ervas e especiarias " +"secretas." #: lang/json/COMESTIBLE_from_json.py msgid "sugar" msgid_plural "sugar" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "açúcar" +msgstr[1] "açúcar" #. ~ Description for sugar #: lang/json/COMESTIBLE_from_json.py @@ -34067,34 +34174,49 @@ msgid "" "Sweet, sweet sugar. Bad for your teeth and surprisingly not very tasty on " "its own." msgstr "" -" açucar Doce, doce açucar. Ruim para seus dentes e " -"surpreendentementenãomuito saboroso por conta própria." +"Doce, doce açúcar. Ruim para seus dentes e surpreendentemente não muito " +"saboroso por conta própria." #: lang/json/COMESTIBLE_from_json.py -msgid "wild herbs" -msgid_plural "wild herbs" +msgid "sprinkles" +msgid_plural "sprinkles" msgstr[0] "" msgstr[1] "" +#. ~ Description for sprinkles +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Known as nonpareils, sprinkles, jimmies, sugar strands or 'hundreds-and-" +"thousands', these colorful balls, rods or flakes of sugar and starch are " +"intended for use decorating soft surfaces of sweets. Like sugar, they are " +"bad for your teeth and surprisingly not very tasty on their own." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "wild herbs" +msgid_plural "wild herbs" +msgstr[0] "ervas silvestres" +msgstr[1] "ervas silvestres" + #. ~ Description for wild herbs #: lang/json/COMESTIBLE_from_json.py msgid "" "A tasty collection of wild herbs including violet, sassafras, mint, clover, " "purslane, fireweed, and burdock." msgstr "" -" ervas selvagensUma coleção saborosa de ervas selvagens, incluindovioleta, " -"sassafrás, hortelã, trevo, beldroegas, erva-de-fogo e bardana." +"Uma coleção saborosa de ervas selvagens, incluindo violeta, sassafrás, " +"hortelã, trevo, beldroegas, erva-de-fogo e bardana." #: lang/json/COMESTIBLE_from_json.py msgid "soy sauce" msgid_plural "soy sauce" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "molho de soja" +msgstr[1] "molho de soja" #. ~ Description for soy sauce #: lang/json/COMESTIBLE_from_json.py msgid "Salty fermented soybean sauce." -msgstr "molho de sojaSalty fermentado de molho de soja." +msgstr "Molho salgado e fermentado de soja." #. ~ Description for thyme #: lang/json/COMESTIBLE_from_json.py @@ -34104,8 +34226,8 @@ msgstr "Um talo de tomilho. Cheira delicioso." #: lang/json/COMESTIBLE_from_json.py msgid "cooked cattail stalk" msgid_plural "cooked cattail stalks" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "caule de taboa cozido" +msgstr[1] "caules de taboa cozidos" #. ~ Description for cooked cattail stalk #: lang/json/COMESTIBLE_from_json.py @@ -34113,14 +34235,14 @@ msgid "" "A cooked stalk from a cattail plant. Its fibrous outer leaves have been " "stripped away and now it is quite delicious." msgstr "" -" guisado cozido stalkA cozinhou a haste de uma planta de taboa. " -"Suasfolhasexternas fibrosas foram arrancadas e agora é bem delicioso." +"Uma haste cozida de uma planta de taboa. Suas folhas externas fibrosas foram" +" arrancadas e agora é bem delicioso." #: lang/json/COMESTIBLE_from_json.py msgid "starch" msgid_plural "starch" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "amido" +msgstr[1] "amido" #. ~ Description for starch #: lang/json/COMESTIBLE_from_json.py @@ -34128,27 +34250,25 @@ msgid "" "Sticky, gooey carbohydrate paste extracted from plants. Spoils rather " "quickly if not prepared for storage." msgstr "" -" starchSticky, pasta de carboidratos gooey extraída de plantas. " -"Estragarapidamente se não estiver preparado para armazenamento." +"Uma pasta de carboidratos gosmenta extraída de plantas. Estraga rapidamente " +"se não estiver preparado para armazenamento." #: lang/json/COMESTIBLE_from_json.py msgid "cooked dandelion greens" msgid_plural "cooked dandelion greens" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "folhas de dente-de-leão cozidas" +msgstr[1] "folhas de dente-de-leão cozidas" #. ~ Description for cooked dandelion greens #: lang/json/COMESTIBLE_from_json.py msgid "Cooked leaves from wild dandelions. Tasty and nutritious." -msgstr "" -" verduras cozidas de dente de leãoCozinhar folhas de leão selvagem. " -"Saborosae nutritiva." +msgstr "Folhas cozidas de dente-de-leão selvagem. Saborosas e nutritivas." #: lang/json/COMESTIBLE_from_json.py msgid "fried dandelions" msgid_plural "fried dandelions" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "dentes-de-leão frito" +msgstr[1] "dentes-de-leão frito" #. ~ Description for fried dandelions #: lang/json/COMESTIBLE_from_json.py @@ -34156,8 +34276,8 @@ msgid "" "Wild dandelion flowers that have been battered and deep fried. Very tasty " "and nutritious." msgstr "" -" Dandelions fritos Flores de dente-de-leão selvagens que foram " -"maltratadasefritas. Muito saboroso e nutritivo." +"Flores de dente-de-leão selvagens que foram amassadas e fritas. Muito " +"saboroso e nutritivo." #: lang/json/COMESTIBLE_from_json.py msgid "cooked plant marrow" @@ -34171,15 +34291,14 @@ msgstr "Um pedaço recém cozido de matéria vegetal, saborosa e nutritiva." #: lang/json/COMESTIBLE_from_json.py msgid "cooked wild vegetables" msgid_plural "cooked wild vegetables" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "vegetais silvestres cozidos" +msgstr[1] "vegetais silvestres cozidos" #. ~ Description for cooked wild vegetables #: lang/json/COMESTIBLE_from_json.py msgid "Cooked wild edible plants. An interesting mix of flavors." msgstr "" -" Vegetais silvestres cozidosCozinhas silvestres comestíveis. " -"Umamisturainteressante de sabores." +"Plantas silvestres comestíveis cozidas. Uma mistura interessante de sabores." #: lang/json/COMESTIBLE_from_json.py msgid "vegetable aspic" @@ -34196,16 +34315,16 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "cooked buckwheat" msgid_plural "cooked buckwheat" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "trigo sarraceno cozido" +msgstr[1] "trigo sarraceno cozido" #. ~ Description for cooked buckwheat #: lang/json/COMESTIBLE_from_json.py msgid "" "A serving of cooked buckwheat groats. Healthy and nutritious but bland." msgstr "" -" buckwheat cozinhado Uma porção de grumos de trigo sarracenocozidos. " -"Saudável e nutritiva, mas sem graça." +"Uma porção de grumos de trigo sarraceno cozidos. Saudável e nutritiva, mas " +"sem graça." #. ~ Description for corn #: lang/json/COMESTIBLE_from_json.py @@ -34224,21 +34343,19 @@ msgstr "Este fubá amarelo é útil para assar." #: lang/json/COMESTIBLE_from_json.py msgid "vegetarian baked beans" msgid_plural "vegetarian baked beans" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "feijões cozidos vegetarianos" +msgstr[1] "feijões cozidos vegetarianos" #. ~ Description for vegetarian baked beans #: lang/json/COMESTIBLE_from_json.py msgid "Slow-cooked beans with vegetables. Tasty and very filling." -msgstr "" -" feijões cozidos vegetarianos Feijões cozidos lentamente comvegetais. " -"Saboroso e muito recheio." +msgstr "Feijões cozidos lentamente com vegetais. Saboroso e muito nutritivo." #: lang/json/COMESTIBLE_from_json.py msgid "dried rice" msgid_plural "dried rice" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "arroz seco" +msgstr[1] "arroz seco" #. ~ Description for dried rice #: lang/json/COMESTIBLE_from_json.py @@ -34246,38 +34363,36 @@ msgid "" "Dehydrated long-grain rice. Tasty and nutritious when cooked, virtually " "inedible when dry." msgstr "" -" arroz secoArroz desidratado de grãos longos. Saborosa e " -"nutritivaquandocozida, praticamente não comestível quando seca." +"Arroz desidratado de grãos longos. Saboroso e nutritivo quando cozido, " +"praticamente não comestível quando seco." #: lang/json/COMESTIBLE_from_json.py msgid "cooked rice" msgid_plural "cooked rice" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "arroz cozido" +msgstr[1] "arroz cozido" #. ~ Description for cooked rice #: lang/json/COMESTIBLE_from_json.py msgid "A hearty serving of cooked long-grain white rice." -msgstr "" -" arroz cozidoUm serviço saudável de arroz branco cozido de grãos longos." +msgstr "Uma porção saudável de arroz branco cozido de grãos longos." #: lang/json/COMESTIBLE_from_json.py msgid "fried rice" msgid_plural "fried rice" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "arroz frito" +msgstr[1] "arroz frito" #. ~ Description for fried rice #: lang/json/COMESTIBLE_from_json.py msgid "Delicious fried rice with vegetables. Tasty and very filling." -msgstr "" -" arroz fritoDelicious arroz frito com legumes. Saboroso e muito recheio." +msgstr "Um delicioso arroz frito com legumes. Saboroso e muito satisfatório." #: lang/json/COMESTIBLE_from_json.py msgid "beans and rice" msgid_plural "beans and rice" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "feijão e arroz" +msgstr[1] "feijão e arroz" #. ~ Description for beans and rice #: lang/json/COMESTIBLE_from_json.py @@ -34285,19 +34400,19 @@ msgid "" "A serving of beans and rice that has been cooked together. Delicious and " "healthy!" msgstr "" -" feijão e arrozUma porção de feijão e arroz que foi cozido juntos. " -"Deliciosoe saudável!" +"Uma porção de feijão e arroz que foram cozidos juntos. Delicioso e saudável!" #: lang/json/COMESTIBLE_from_json.py msgid "tofu fried rice" msgid_plural "tofu fried rice" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "arroz com tofu frito" +msgstr[1] "arroz com tofu frito" #. ~ Description for tofu fried rice #: lang/json/COMESTIBLE_from_json.py msgid "Delicious tofu fried rice with vegetables. Tasty and very filling." msgstr "" +"Um delicioso arroz frito com tofu e vegetais. Gostoso e muito nutritivo." #: lang/json/COMESTIBLE_from_json.py msgid "tofu stirfry" @@ -34324,19 +34439,19 @@ msgid "" "Slow-cooked beans and rice with vegetables and seasonings. Tasty and very " "filling." msgstr "" -" feijão e arroz vegetariano deluxeFeijão cozido e arroz com " -"legumesetemperos. Saboroso e muito recheio." +"Feijão e arroz cozidos lentamente, com legumes e temperos. Saboroso e muito " +"satisfatório." #: lang/json/COMESTIBLE_from_json.py msgid "baked potato" msgid_plural "baked potatoes" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "batata assada" +msgstr[1] "batatas assadas" #. ~ Description for baked potato #: lang/json/COMESTIBLE_from_json.py msgid "A delicious baked potato. Got any sour cream?" -msgstr "batata cozidaUma batata cozida deliciosa. Tem algum creme azedo?" +msgstr "Uma batata assada deliciosa. Tem algum creme azedo?" #: lang/json/COMESTIBLE_from_json.py msgid "mashed pumpkin" @@ -34347,8 +34462,8 @@ msgstr "abóbora amassada" msgid "" "This is a simple dish made by cooking the pumpkin pulp and then mashing." msgstr "" -" Este é um prato simples feito cozinhando a polpa da abóbora " -"eentãoesmagando." +" Este é um prato simples feito cozinhando a polpa da abóbora e então " +"esmagando." #: lang/json/COMESTIBLE_from_json.py msgid "vegetable pie" @@ -34384,8 +34499,8 @@ msgstr "Azeite, manjericão, alho, pinhões. Simples e delicioso." #: lang/json/COMESTIBLE_from_json.py msgid "canned veggy" msgid_plural "canned veggies" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "vegetais enlatados" +msgstr[1] "vegetais enlatados" #. ~ Description for canned veggy #: lang/json/COMESTIBLE_from_json.py @@ -34393,8 +34508,8 @@ msgid "" "This mushy pile of vegetable matter was boiled and canned in an earlier " "life. Better eat it before it oozes through your fingers." msgstr "" -" veggy enlatadoEsta pilha mole de matéria vegetal foi cozida e enlatadaemuma" -" vida anterior. Melhor comê-lo antes que ele escorra pelos seus dedos." +"Esta pilha mole de matéria vegetal foi cozida e enlatada em uma vida " +"anterior. Melhor comê-la antes que ela escorra pelos seus dedos." #: lang/json/COMESTIBLE_from_json.py msgid "salted veggy chunk" @@ -34406,37 +34521,37 @@ msgid "" "Vegetable chunks pickled in a salt bath. Goes well with burgers, if only " "you can find one." msgstr "" -" Pedaços de vegetais em conserva em um banho de sal. Vai bemcomhambúrgueres," -" se você puder encontrar um." +" Pedaços de vegetais em conserva em um banho de sal. Vai bem com " +"hambúrgueres, se você puder encontrar um." #: lang/json/COMESTIBLE_from_json.py msgid "spaghetti al pesto" msgid_plural "spaghetti al pesto" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "espaguete al pesto" +msgstr[1] "espaguete al pesto" #. ~ Description for spaghetti al pesto #: lang/json/COMESTIBLE_from_json.py msgid "Spaghetti, with a generous helping of pesto on top. Yum!" -msgstr "" -" spaghetti al pestoSpaghetti, com uma porção generosa de pesto no topo. Yum!" +msgstr "Espaguete, com uma porção generosa de pesto no topo. Eba!" #: lang/json/COMESTIBLE_from_json.py msgid "pickle" -msgstr "salmoura" +msgstr "picles" #. ~ Description for pickle #: lang/json/COMESTIBLE_from_json.py msgid "" "A pickled cucumber. Rather sour, but tastes good and lasts for a long time." msgstr "" -" Um pepino em conserva. Um pouco azedo, mas bom gosto e dura muito tempo." +" Um pepino em conserva. Um pouco azedo, mas tem bom gosto e dura muito " +"tempo." #: lang/json/COMESTIBLE_from_json.py msgid "sauerkraut w/ sautee'd onions" msgid_plural "sauerkraut w/ sautee'd onions" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "chucrute com cebolas sautee" +msgstr[1] "chucrute com cebolas sautee" #. ~ Description for sauerkraut w/ sautee'd onions #: lang/json/COMESTIBLE_from_json.py @@ -34444,15 +34559,14 @@ msgid "" "This is a delicious sautee of lovely diced onions and sauerkraut. The smell" " alone is enough to make your mouth water." msgstr "" -" chucrute com cebola sautee'dEste é um delicioso sautee de " -"cebolasemcubos e chucrute. O cheiro sozinho é suficiente para deixar sua " -"bocacomágua." +"Este é um delicioso sautee de cebolas em cubos e chucrute. O cheiro sozinho " +"já é suficiente para deixar você com água na boca." #: lang/json/COMESTIBLE_from_json.py msgid "pickled veggy" msgid_plural "pickled veggies" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "vegetais em conserva" +msgstr[1] "vegetais em conserva" #. ~ Description for pickled veggy #: lang/json/COMESTIBLE_from_json.py @@ -34460,8 +34574,7 @@ msgid "" "This is a serving of crisply brined and canned vegetable matter. Tasty and " "nutritious." msgstr "" -" veggyThis em conserva é uma porção de matéria vegetal enlatada esalgada. " -"Saborosa e nutritiva." +"Uma porção de matéria vegetal enlatada e salgada. Saborosa e nutritiva." #: lang/json/COMESTIBLE_from_json.py msgid "dehydrated vegetable" @@ -34473,8 +34586,8 @@ msgid "" "Dehydrated vegetable flakes. With proper storage, this dried food will " "remain edible for an incredibly long time." msgstr "" -" Flocos vegetais desidratados. Com o armazenamento adequado, " -"estealimentoseco permanecerá comestível por um tempo incrivelmente longo." +" Flocos vegetais desidratados. Com armazenamento adequado, este alimento " +"seco permanecerá comestível por um tempo incrivelmente longo." #: lang/json/COMESTIBLE_from_json.py msgid "rehydrated vegetable" @@ -34486,8 +34599,8 @@ msgid "" "Reconstituted vegetable flakes, which are much more enjoyable to eat now " "that they have been rehydrated." msgstr "" -" Flocos vegetais reconstituídos, que são muito mais agradáveis de " -"comeragoraque foram reidratados." +"Flocos vegetais reconstituídos, que são muito mais agradáveis de comer agora" +" que foram reidratados." #: lang/json/COMESTIBLE_from_json.py msgid "vegetable salad" @@ -34508,8 +34621,8 @@ msgid "" "Dried salad packed in a box with mayonnaise and ketchup. Add water to " "enjoy." msgstr "" -" Salada seca embalada em uma caixa com maionese e ketchup. Adicione " -"aáguapara desfrutar." +" Salada seca embalada em uma caixa com maionese e ketchup. Adicione água " +"para desfrutar." #: lang/json/COMESTIBLE_from_json.py msgid "insta-salad" @@ -34521,8 +34634,8 @@ msgid "" "Dried salad with water added, not very tasty but still a decent substitution" " for real salad." msgstr "" -" Salada seca com água adicionada, não muito saborosa mas " -"aindaumasubstituição decente para salada real." +"Salada seca com água adicionada, não muito saborosa mas ainda é um " +"substituto decente para salada real." #: lang/json/COMESTIBLE_from_json.py msgid "baked dahlia root" @@ -34534,6 +34647,7 @@ msgid "" "Baking this dahlia root has broken down the starch, making it softer and " "sweeter." msgstr "" +"Assar esta raiz de dália desfez o amido, tornando-a mais macia e doce." #: lang/json/COMESTIBLE_from_json.py msgid "roasted salsify" @@ -34549,21 +34663,19 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "sushi rice" msgid_plural "sushi rice" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "arroz de sushi" +msgstr[1] "arroz de sushi" #. ~ Description for sushi rice #: lang/json/COMESTIBLE_from_json.py msgid "A serving of sticky vinegared rice commonly used in sushi." -msgstr "" -" arroz de sushiUm serviço de arroz vinegared pegajoso comumente " -"usadoemsushi." +msgstr "Uma porção de arroz pegajoso no vinagre, comumente usado em sushi." #: lang/json/COMESTIBLE_from_json.py msgid "onigiri" msgid_plural "onigiri" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "onigiri" +msgstr[1] "onigiri" #. ~ Description for onigiri #: lang/json/COMESTIBLE_from_json.py @@ -34571,14 +34683,14 @@ msgid "" "A triangular block of tasty sushi rice with a healthy green vegetable folded" " around it." msgstr "" -" onigiriUm bloco triangular de arroz de sushi saboroso com um " -"vegetalverdesaudável dobrado em torno dele." +"Um bloco triangular de arroz de sushi saboroso com um vegetal verde saudável" +" dobrado em torno dele." #: lang/json/COMESTIBLE_from_json.py msgid "vegetable hosomaki" msgid_plural "vegetable hosomaki" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "hosomaki vegetal" +msgstr[1] "hosomaki vegetal" #. ~ Description for vegetable hosomaki #: lang/json/COMESTIBLE_from_json.py @@ -34586,12 +34698,12 @@ msgid "" "Delicious chopped vegetables wrapped in tasty sushi rice and rolled up in a " "healthy green vegetable." msgstr "" -" vegetais hosomakiDelicious legumes picados envoltos em arroz " -"desushisaboroso e enrolado em um vegetal verde saudável." +"Legumes picados deliciosos envoltos em arroz de sushi saboroso e enrolado em" +" um vegetal verde saudável." #: lang/json/COMESTIBLE_from_json.py msgid "dehydrated alien fungus chunk" -msgstr "" +msgstr "pedaço de fungo alien desidratado" #. ~ Description for dehydrated alien fungus chunk #: lang/json/COMESTIBLE_from_json.py @@ -34603,8 +34715,8 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "sauerkraut" msgid_plural "sauerkraut" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "chucrute" +msgstr[1] "chucrute" #. ~ Description for sauerkraut #: lang/json/COMESTIBLE_from_json.py @@ -34612,9 +34724,9 @@ msgid "" "This crunchy, sour topping made from lettuce or cabbage is perfect for your " "hot dogs and hamburgers, or, if you're desperate, straight to your stomach." msgstr "" -" chucruteEsta cobertura crocante e amarga feita com alface ou " -"repolhoéperfeita para cachorros-quentes e hambúrgueres ou, se " -"estiverdesesperada, diretamente para o estômago." +"Esta cobertura crocante e amarga feita com alface ou repolho é perfeita para" +" cachorros-quentes e hambúrgueres ou, em caso de desespero, diretamente para" +" o estômago." #: lang/json/COMESTIBLE_from_json.py msgid "nopalito" @@ -34623,7 +34735,7 @@ msgstr "" #. ~ Description for nopalito #: lang/json/COMESTIBLE_from_json.py msgid "A less prickly version of cactus pads." -msgstr "" +msgstr "Uma versão preparada e menos espinhenta de discos de cacto." #: lang/json/COMESTIBLE_from_json.py msgid "wheat cereal" @@ -34635,8 +34747,8 @@ msgid "" "Whole-grain wheat cereal. It's surprisingly good, and allegedly good for " "your heart." msgstr "" -" Cereais de trigo integral. É surpreendentemente bom e supostamente bomparao" -" seu coração." +" Cereais de trigo integral. É surpreendentemente bom, e supostamente faz bem" +" para o coração." #. ~ Description for wheat #: lang/json/COMESTIBLE_from_json.py @@ -34646,8 +34758,8 @@ msgstr "Trigo cru, não muito saboroso." #: lang/json/COMESTIBLE_from_json.py msgid "raw spaghetti pasta" msgid_plural "raw spaghetti pasta" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "espaguete cru" +msgstr[1] "espaguete cru" #. ~ Description for raw spaghetti pasta #: lang/json/COMESTIBLE_from_json.py @@ -34655,6 +34767,8 @@ msgid "" "A type of pasta usually used when preparing spaghetti. It could be eaten raw" " if you're desperate, but is much better cooked." msgstr "" +"Um tipo de massa normalmente usada para preparar espaguete. Poderia ser " +"comida crua em caso de desespero, mas é muito melhor quando cozida." #: lang/json/COMESTIBLE_from_json.py msgid "raw lasagne pasta" @@ -34672,14 +34786,13 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "boiled noodles" msgid_plural "boiled noodles" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "macarrão fervido" +msgstr[1] "macarrão fervido" #. ~ Description for boiled noodles #: lang/json/COMESTIBLE_from_json.py msgid "Fresh wet noodles. Fairly bland, but fills you up." -msgstr "" -" Macarrão cozido Macarrão molhado refrigerado. Bastante branda, mas teenche." +msgstr "Macarrão molhado refrigerado. Bastante brando, mas te enche." #: lang/json/COMESTIBLE_from_json.py msgid "raw macaroni" @@ -34710,13 +34823,13 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "flour" msgid_plural "flour" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "farinha" +msgstr[1] "farinha" #. ~ Description for flour #: lang/json/COMESTIBLE_from_json.py msgid "This enriched white flour is useful for baking." -msgstr "farinhaEsta farinha branca enriquecida é útil para assar." +msgstr "Esta farinha branca enriquecida é útil para assar." #: lang/json/COMESTIBLE_from_json.py msgid "oatmeal" @@ -34879,13 +34992,13 @@ msgstr "Uma torta cozida doce e deliciosa com xarope de bordo puro." #: lang/json/COMESTIBLE_from_json.py msgid "fast noodles" msgid_plural "fast noodles" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "miojo" +msgstr[1] "miojo" #. ~ Description for fast noodles #: lang/json/COMESTIBLE_from_json.py msgid "So-called ramen noodles. Can be eaten raw." -msgstr "macarrão rápidoSo chamado macarrão instantâneo. Pode ser comido cru." +msgstr "O chamado \"macarrão instantâneo\". Pode ser comido cru." #: lang/json/COMESTIBLE_from_json.py msgid "cloutie dumpling" @@ -34897,8 +35010,8 @@ msgid "" "This traditional Scottish treat is a sweet and filling little boiled cake " "studded with dried fruit." msgstr "" -" Este tradicional petisco escocês é um doce e recheado bolo " -"recheadocomfrutas secas." +" Este tradicional petisco escocês é um bolo doce e recheado com frutas " +"secas." #: lang/json/COMESTIBLE_from_json.py msgid "brioche" @@ -34963,11 +35076,11 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "" "This round loaf of bread has a thick, dark crust, and smells very enticing." -msgstr "" +msgstr "Este pão redondo tem uma casca grossa e escura, e cheira muito bem." #: lang/json/COMESTIBLE_from_json.py msgid "cheap wine must" -msgstr "vinho barato deve" +msgstr "mosto de vinho barato" #. ~ Description for cheap wine must #: lang/json/COMESTIBLE_from_json.py @@ -34975,12 +35088,12 @@ msgid "" "Unfermented grape wine. A hearty mix of pressed grapes, with some added " "brandy to fortify it." msgstr "" -" Vinho de uva não fermentado. Uma mistura saudável de uvas prensadas, " -"comalguns adicionados brandy para fortificá-lo." +" Vinho de uva não fermentado. Uma mistura saudável de uvas prensadas, comum " +"pouco de brandy adicionado para fortificá-la." #: lang/json/COMESTIBLE_from_json.py msgid "stimgas inhaler" -msgstr "estimgas inalador" +msgstr "inalador de estimgás" #. ~ Description for stimgas inhaler #: lang/json/COMESTIBLE_from_json.py @@ -35003,7 +35116,7 @@ msgstr "Um poderoso alucinógeno com baixo risco de dependência." #: lang/json/COMESTIBLE_from_json.py msgid "plain cake" -msgstr "" +msgstr "bolo básico" #. ~ Description for plain cake #: lang/json/COMESTIBLE_from_json.py @@ -35011,6 +35124,8 @@ msgid "" "A modest chocolate cake with no icing added. Nothing special, but some of " "the best you can get nowadays. Besides, cake is cake!" msgstr "" +"Um bolo de chocolate modesto sem cobertura. Nada especial, mas é quase o " +"melhor que se pode encontrar hoje em dia. Além disso, bolo é bolo!" #: lang/json/COMESTIBLE_from_json.py msgid "nutriment" @@ -35037,7 +35152,7 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "dough" -msgstr "" +msgstr "massa" #. ~ Description for dough #: lang/json/COMESTIBLE_from_json.py @@ -35045,6 +35160,8 @@ msgid "" "Flour mixed with water, kneaded into a gooey paste. This dough can be used " "to bake bread more efficiently than with just flour." msgstr "" +"Farinha misturada com água, amassada até virar pasta. Pode ser usada pra " +"fazer pão mais eficientemente do que apenas usando farinha." #: lang/json/COMESTIBLE_from_json.py msgid "fried donut holes" @@ -35156,8 +35273,9 @@ msgid "" " Marloss, Chanterelle, and The Encroaching, Unavoidable Death of Human " "Civilization." msgstr "" -" O cookie de sucesso da Mycus Industries! Agora vem em saboresviciantes, " -"como Marloss, Chanterelle e A Incrível Morte Inevitável daCivilizaçãoHumana." +" O cookie de sucesso da Mycus Industries! Agora vem em sabores viciantes, " +"como Marloss, Chanterelle e A Incrível Morte Inevitável da Civilização " +"Humana." #: lang/json/COMESTIBLE_from_json.py msgid "potion starter" @@ -35332,8 +35450,8 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "hairball" msgid_plural "hairballs" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "bola de pelo" +msgstr[1] "bolas de pelo" #. ~ Description for hairball #: lang/json/COMESTIBLE_from_json.py @@ -35344,8 +35462,8 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "dragon meat" msgid_plural "dragon meat" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "carne de dragão" +msgstr[1] "carnes de dragão" #. ~ Description for dragon meat #: lang/json/COMESTIBLE_from_json.py @@ -35365,14 +35483,14 @@ msgid "" "Primitive binding material made of cords and natural glue. Use it to repair" " items made of wood, paper, bone, or chitin." msgstr "" -" Material de ligação primitivo feito de cordões e cola natural. Use- " -"oparareparar itens feitos de madeira, papel, osso ou quitina." +" Material de ligação primitivo feito de cordões e cola natural. Use-o para " +"reparar itens feitos de madeira, papel, osso ou quitina." #: lang/json/COMESTIBLE_from_json.py msgid "berry-shaped anomaly" msgid_plural "berry-shaped anomalies" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "anomalia em forma de frutinha" +msgstr[1] "anomalias em forma de frutinha" #. ~ Description for berry-shaped anomaly #: lang/json/COMESTIBLE_from_json.py @@ -35387,8 +35505,8 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "seed-shaped anomaly" msgid_plural "seed-shaped anomalies" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "anomalia em forma de semente" +msgstr[1] "anomalias em forma de semente" #. ~ Description for seed-shaped anomaly #: lang/json/COMESTIBLE_from_json.py @@ -35396,9 +35514,8 @@ msgid "" "If we left this as it should be, one could just walk into the Garden " "uncontested and partake of the Seed. We can't have that, can we?" msgstr "" -" anomalia em forma de semente Se deixássemos isto como deveriaser, " -"poderíamos apenas entrar no Jardim incontestavelmente e participardaSemente." -" Não podemos ter isso, podemos?" +"Se deixássemos isto como deveria ser, poderíamos apenas entrar no Jardim " +"incontestavelmente e aproveitar a Semente. Não podemos ter isso, podemos?" #: lang/json/COMESTIBLE_from_json.py msgid "gelatin" @@ -35419,8 +35536,8 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "fruit-shaped anomaly" msgid_plural "fruit-shaped anomalies" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "anomalia em forma de fruta" +msgstr[1] "anomalias em forma de fruta" #. ~ Description for fruit-shaped anomaly #: lang/json/COMESTIBLE_from_json.py @@ -35428,9 +35545,9 @@ msgid "" "We do not exist at the moment. Clever little human, no doubt debugging to " "see this? We will not permit you to join us while we are modded out." msgstr "" -" anomalia em forma de frutaNão existimos no momento. " -"Pequenohumanointeligente, sem dúvida depurando para ver isso? Nós não " -"permitiremosquevocê se junte a nós enquanto estivermos fora." +"Não existimos no momento. Pequeno humano inteligente, sem dúvida depurando " +"para ver isso? Nós não permitiremos que você se junte a nós enquanto " +"estivermos fora." #: lang/json/COMESTIBLE_from_json.py msgid "necrotic head" @@ -35442,8 +35559,8 @@ msgid "" "The severed head of a zombie necromancer. Its eyes still roll in its head " "and its jaws snap menacingly." msgstr "" -" A cabeça decepada de um necromante zumbi. Seus olhos ainda rolam " -"emsuacabeça e suas mandíbulas se esticam ameaçadoramente." +" A cabeça decepada de um necromante zumbi. Seus olhos ainda rolam em sua " +"cabeça e suas mandíbulas batem ameaçadoramente." #: lang/json/COMESTIBLE_from_json.py msgid "mutagenic glob" @@ -35457,13 +35574,13 @@ msgstr "Um glóbulo gelatinoso de mutagênico." #: lang/json/COMESTIBLE_from_json.py msgid "honey" msgid_plural "honey" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "mel" +msgstr[1] "mel" #. ~ Description for honey #: lang/json/COMESTIBLE_from_json.py msgid "Honey, that stuff bees make." -msgstr "Querido, essas coisas fazem as abelhas." +msgstr "Mel, essa coisa que as abelhas fazem." #: lang/json/COMESTIBLE_from_json.py msgid "magnesium tablet" @@ -35476,22 +35593,21 @@ msgid "" "deprivation and to mitigate its effects. One tablet a day combined with a " "good night's sleep will help you recover faster." msgstr "" -" Suplementos de magnésio vendidos sem receita médica, " -"geralmenteprescritospara tratar a privação do sono e para mitigar seus " -"efeitos. Umcomprimidopor dia combinado com uma boa noite de sono irá ajudá- " -"lo arecuperar maisrapidamente." +" Suplementos de magnésio vendidos sem receita médica, geralmente prescritos " +"para tratar a insônia e para mitigar seus efeitos. Um comprimido por dia " +"combinado com uma boa noite de sono irá ajudá-lo a se recuperar mais " +"rapidamente." #: lang/json/COMESTIBLE_from_json.py msgid "gluten free fish sandwich" msgid_plural "gluten free fish sandwiches" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "sanduíche de peixe sem glúten" +msgstr[1] "sanduíches de peixe sem glúten" #. ~ Description for gluten free fish sandwich #: lang/json/COMESTIBLE_from_json.py msgid "Gluten free and a delicious fish sandwich." -msgstr "" -" Sanduíche de peixe sem glúten Sem glúten e um delicioso sanduíche de peixe." +msgstr "Sem glúten e um delicioso sanduíche de peixe." #: lang/json/COMESTIBLE_from_json.py msgid "gluten free vegetable sandwich" @@ -39047,6 +39163,21 @@ msgstr "" "miniatura, as instruções necessárias para criar um itematravésde um " "nanofabricador." +#: lang/json/GENERIC_from_json.py +msgid "nanofabricator template (silicon photonics)" +msgid_plural "nanofabricator template (silicon photonics)s" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for nanofabricator template (silicon photonics) +#: lang/json/GENERIC_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "antenna" msgid_plural "antennas" @@ -44116,7 +44247,7 @@ msgstr[1] "" #. ~ Description for .300BLK casing #: lang/json/GENERIC_from_json.py -msgid "An empty casing from a .300BLK round." +msgid "An empty casing from a .300 AAC Blackout round." msgstr "" #: lang/json/GENERIC_from_json.py @@ -45845,6 +45976,36 @@ msgid "" "had fake black soot painted on." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "blackjack" +msgid_plural "blackjacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for blackjack +#: lang/json/GENERIC_from_json.py +msgid "" +"This is a short, easily concealed bludgeoning weapon consisting of a weight " +"embedded at the end of a short leather shaft. Formerly used by law " +"enforcement, this weapon is meant to stun or knock out the subject, although" +" head strikes have a high risk of causing a permanent, disabling brain " +"injury or being fatal." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "makeshift sap" +msgid_plural "makeshift saps" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for makeshift sap +#: lang/json/GENERIC_from_json.py +msgid "" +"This is an improvised sap, also known as a cosh, slapjack and slapper. A " +"short and flat bludgeoning weapon consisting of a weight embedded between " +"two patches of leather." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "pointy stick" msgid_plural "pointy sticks" @@ -46389,6 +46550,30 @@ msgstr "" " O sabre de esgrima é ligeiramente mais curto que o papel alumínioe aespada," " mas não menos eficaz." +#: lang/json/GENERIC_from_json.py +msgid "hollow cane" +msgid_plural "hollow canes" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for hollow cane +#: lang/json/GENERIC_from_json.py +msgid "" +"A cane designed to conceal blade. This was a popular fashion accessory for " +"the wealthy during the 18th and 19th centuries." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "sword cane" +msgid_plural "sword canes" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for sword cane +#: lang/json/GENERIC_from_json.py +msgid "A sword with a thin blade designed to be hidden inside an hollow cane." +msgstr "" + #: lang/json/GENERIC_from_json.py lang/json/TOOL_from_json.py #: lang/json/TOOL_from_json.py msgid "cutlass" @@ -54047,6 +54232,15 @@ msgstr "" msgid "A cheap 6-round steel box magazine for the Jennings J-22." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "Walther P22 magazine" +msgstr "" + +#. ~ Description for Walther P22 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round box magazine for the Walther P22." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "LW-5 speedloader" msgstr "" @@ -54480,6 +54674,20 @@ msgstr "" msgid "A cheap 32-round steel box magazine for use with the MAC-11 SMG." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "CF-380 magazine" +msgstr "" + +#. ~ Description for CF-380 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Hi-Point CF-380." +msgstr "" + +#. ~ Description for CF-380 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point CF-380." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "M1911 .38 Super magazine" msgstr "" @@ -54543,6 +54751,43 @@ msgid "" "expect much reliability." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "Hi-Power magazine .40 S&W" +msgstr "" + +#. ~ Description for Hi-Power magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Browning Hi-Power .40 S&W." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine .40 S&W" +msgstr "" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 12 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 14 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "Model JCP magazine" +msgstr "" + +#. ~ Description for Model JCP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point Model JCP." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "grenade belt" msgstr "cinto de granada" @@ -54703,6 +54948,24 @@ msgid "A standard capacity magazine for use with the H&K USP handgun." msgstr "" "Um magazine de capacidade padrão para uso com a pistola H & K USP." +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine .45 ACP" +msgstr "" + +#. ~ Description for PPQ magazine .45 ACP +#: lang/json/MAGAZINE_from_json.py +msgid "A 12 round steel box magazine for the Walther PPQ .45 ACP." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "Model JHP magazine" +msgstr "" + +#. ~ Description for Model JHP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 9-round steel box magazine for use with the Hi-Point Model JHP." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid ".454 5-round speedloader" msgstr "" @@ -55235,6 +55498,95 @@ msgstr "" msgid "A 17 round double stack box magazine for the SIG Sauer P320." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "Hi-Power magazine 9x19mm" +msgstr "" + +#. ~ Description for Hi-Power magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 13 round steel box magazine for the Browning Hi-Power 9x19mm." +msgstr "" + +#. ~ Description for Hi-Power magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 15 round steel box magazine for the Browning Hi-Power 9x19mm." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "P38 magazine" +msgstr "" + +#. ~ Description for P38 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8 round steel box magazine for the Walther P38." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine 9x19mm" +msgstr "" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Walther PPQ 9mm." +msgstr "" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 15 round steel box magazine for the Walther PPQ 9mm." +msgstr "" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 17 round steel box magazine for the Walther PPQ 9mm." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "C-9 magazine" +msgstr "" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Hi-Point C-9." +msgstr "" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point C-9." +msgstr "" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 15-round steel box magazine for use with the Hi-Point C-9." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "CZ 75 magazine" +msgstr "" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 12-round steel box magazine for use with the CZ 75." +msgstr "" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 20-round steel box magazine for use with the CZ 75." +msgstr "" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 26-round steel box magazine for use with the CZ 75." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "CCP magazine" +msgstr "" + +#. ~ Description for CCP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Walther CCP." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "Makarov PM magazine" msgstr "Revista Makarov PM" @@ -59237,11 +59589,8 @@ msgstr "torre milspec" #: lang/json/MONSTER_from_json.py msgid "" "Leadworks LLC's T-4A1 Sentry. It features improved firmware over General " -"Atomics' TX-1 9x19mm model and an automated M4 carbine." +"Atomics' TX-1 9x19mm model and an automated 5.56mm carbine." msgstr "" -" Sentinela T-4A1 da Leadworks LLC. Possui firmware aprimorado em " -"relaçãoaomodelo TX-1 9x19mm da General Atomics e uma carabina M4 " -"automatizada." #: lang/json/MONSTER_from_json.py msgid "debug monster" @@ -60828,6 +61177,47 @@ msgid "" "between walls and ceiling with limbs grown from its own disjointed ribs." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "gangrenous impaler" +msgstr "" + +#. ~ Description for gangrenous impaler +#: lang/json/MONSTER_from_json.py +msgid "" +"A corpse hideously twisted into an insect-like form. A hollow tendril " +"reaches out from its open thorax." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "The impaler launches a barb!" +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "trapped tendril" +msgstr "" + +#. ~ Description for trapped tendril +#: lang/json/MONSTER_from_json.py +msgid "" +"A great tendril of mutated flesh and sharpened bone. Emergent from a " +"crevice in the ruined floor, hundreds of human limbs seek freedom and writhe" +" incessantly from underneath its grotesque carapace. As enormous as it may " +"already be, you feel certain that this is just part of a creature much " +"bigger, for when it moves, you can feel this whole ruin tremble, as if an " +"unseen giant struggled against the weight of its concrete tomb." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "flesh wall" +msgstr "" + +#. ~ Description for flesh wall +#: lang/json/MONSTER_from_json.py +msgid "" +"A great lump of mutated flesh. It resembles the innards of some gigantic " +"creature and is covered in a grid of diminutive veins." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "bloated fungal zombie" msgstr "" @@ -64654,6 +65044,24 @@ msgid "" "effect. Starts very short range, increases rapidly with level." msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Summon Gangrenous Crawlers" +msgstr "" + +#. ~ Description for Summon Gangrenous Crawlers +#: lang/json/SPELL_from_json.py +msgid "Summons 2 permanent gangrenous crawlers." +msgstr "" + +#: lang/json/SPELL_from_json.py +msgid "Summon Gangrenous Monsters" +msgstr "" + +#. ~ Description for Summon Gangrenous Monsters +#: lang/json/SPELL_from_json.py +msgid "Summons 2 permanent gangrenous impalers." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Smite" msgstr "" @@ -71669,6 +72077,19 @@ msgid "" "used for cleaning impervious surfaces." msgstr "" +#: lang/json/TOOL_from_json.py +msgid "washing kit" +msgid_plural "washing kits" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for washing kit +#: lang/json/TOOL_from_json.py +msgid "" +"A combination kit of a washboard and a sponge. Everything you need to clean" +" items after the apocalypse." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "reading light" msgid_plural "reading lights" @@ -80104,6 +80525,10 @@ msgstr "" msgid "nails" msgstr "pregos" +#: lang/json/ammunition_type_from_json.py +msgid "barb" +msgstr "" + #: lang/json/ammunition_type_from_json.py msgid "BBs" msgstr "chumbinhos" @@ -80312,8 +80737,8 @@ msgid "components" msgstr "componentes" #: lang/json/ammunition_type_from_json.py -msgid "93mm RPG-7" -msgstr "RPG-7 de 93 mm" +msgid "RPG-7 rocket" +msgstr "" #: lang/json/ammunition_type_from_json.py msgid "rebreather filter" @@ -80447,18 +80872,6 @@ msgid "" "those in turn more often than massive objects." msgstr "" -#: lang/json/bionic_from_json.py -msgid "Advanced Microreactor System" -msgstr "Sistema Avançado de Microreatores" - -#. ~ Description for Advanced Microreactor System -#: lang/json/bionic_from_json.py -msgid "" -"This stripped down mini-reactor is more efficient and safer than the base " -"model due to integrated radiation cleansers. There is no way to shut it " -"down once active, but you can toggle additional fuel intake." -msgstr "" - #: lang/json/bionic_from_json.py msgid "Alarm System" msgstr "Sistema de alarme" @@ -81348,28 +81761,6 @@ msgstr "" "entanto, o uso deste sistema pode causar atraso no tempo de reação e " "sonolência." -#: lang/json/bionic_from_json.py -msgid "Plutonium Filter" -msgstr "Filtro de plutônio" - -#. ~ Description for Plutonium Filter -#: lang/json/bionic_from_json.py -msgid "" -"This set of tanks and filters allows you to extract plutonium from " -"radioactive slurry." -msgstr "" - -#: lang/json/bionic_from_json.py -msgid "Plutonium Purger" -msgstr "Purga de Plutônio" - -#. ~ Description for Plutonium Purger -#: lang/json/bionic_from_json.py -msgid "" -"Triggers an emergency reactor fuel purge that ejects all fuel from your " -"reactor." -msgstr "" - #. ~ Description for Bionic Visual Impairment #: lang/json/bionic_from_json.py msgid "" @@ -81501,18 +81892,6 @@ msgid "" "amount of unarmed slashing damage whenever your fingertips are uncovered." msgstr "" -#: lang/json/bionic_from_json.py -msgid "Microreactor System" -msgstr "Sistema de Microrreatores" - -#. ~ Description for Microreactor System -#: lang/json/bionic_from_json.py -msgid "" -"This stripped down mini-reactor generates impressive amounts of bionic " -"power. There is no way to shut it down, but you can toggle additional fuel " -"intake. Irradiates your body when active." -msgstr "" - #: lang/json/bionic_from_json.py msgid "Recycler Unit" msgstr "Unidade de Reciclagem" @@ -81982,6 +82361,52 @@ msgid "" "artificial but effective sensation of fatigue." msgstr "" +#: lang/json/bionic_from_json.py +msgid "Advanced Microreactor System" +msgstr "Sistema Avançado de Microreatores" + +#. ~ Description for Advanced Microreactor System +#: lang/json/bionic_from_json.py +msgid "" +"This stripped down mini-reactor is more efficient and safer than the base " +"model due to integrated radiation cleansers. There is no way to shut it " +"down once active, but you can toggle additional fuel intake." +msgstr "" + +#: lang/json/bionic_from_json.py +msgid "Plutonium Filter" +msgstr "Filtro de plutônio" + +#. ~ Description for Plutonium Filter +#: lang/json/bionic_from_json.py +msgid "" +"This set of tanks and filters allows you to extract plutonium from " +"radioactive slurry." +msgstr "" + +#: lang/json/bionic_from_json.py +msgid "Plutonium Purger" +msgstr "Purga de Plutônio" + +#. ~ Description for Plutonium Purger +#: lang/json/bionic_from_json.py +msgid "" +"Triggers an emergency reactor fuel purge that ejects all fuel from your " +"reactor." +msgstr "" + +#: lang/json/bionic_from_json.py +msgid "Microreactor System" +msgstr "Sistema de Microrreatores" + +#. ~ Description for Microreactor System +#: lang/json/bionic_from_json.py +msgid "" +"This stripped down mini-reactor generates impressive amounts of bionic " +"power. There is no way to shut it down, but you can toggle additional fuel " +"intake. Irradiates your body when active." +msgstr "" + #: lang/json/bionic_from_json.py msgid "Internal Furnace" msgstr "Fornalha Interna" @@ -82115,9 +82540,7 @@ msgstr "Desviando e corpo a corpo é dificultado." #: lang/json/bodypart_from_json.py src/armor_layers.cpp src/character.cpp #: src/debug_menu.cpp msgid "Torso" -msgid_plural "Torso" -msgstr[0] "" -msgstr[1] "" +msgstr "Tronco" #. ~ Crafting recipes subcategory of 'ARMOR' category #: lang/json/bodypart_from_json.py lang/json/recipe_category_from_json.py @@ -82136,9 +82559,7 @@ msgstr "cabeça" #: lang/json/bodypart_from_json.py src/armor_layers.cpp src/character.cpp #: src/debug_menu.cpp msgid "Head" -msgid_plural "Head" -msgstr[0] "" -msgstr[1] "" +msgstr "Cabeça" #. ~ Crafting recipes subcategory of 'ARMOR' category #: lang/json/bodypart_from_json.py lang/json/recipe_category_from_json.py @@ -82160,9 +82581,7 @@ msgstr "Combate à distância é dificultado." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "Eyes" -msgid_plural "Eyes" -msgstr[0] "" -msgstr[1] "" +msgstr "Olhos" #: lang/json/bodypart_from_json.py msgid "mouth" @@ -82179,9 +82598,7 @@ msgstr "Correndo é retardado." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "Mouth" -msgid_plural "Mouth" -msgstr[0] "" -msgstr[1] "" +msgstr "Boca" #: lang/json/bodypart_from_json.py msgid "left arm" @@ -82192,15 +82609,26 @@ msgctxt "bodypart_accusative" msgid "left arm" msgstr "Braço esquerdo da boca" +#: lang/json/bodypart_from_json.py +msgid "arms" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "arms" +msgstr "" + #: lang/json/bodypart_from_json.py msgid "Melee and ranged combat is hampered." msgstr "Combate corpo a corpo e à distância é dificultado." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Arm" -msgid_plural "Arms" -msgstr[0] "" -msgstr[1] "" +msgstr "Braço Esq." + +#: lang/json/bodypart_from_json.py +msgid "Arms" +msgstr "" #: lang/json/bodypart_from_json.py msgid "L ARM" @@ -82217,9 +82645,7 @@ msgstr "braço direito" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Arm" -msgid_plural "Arms" -msgstr[0] "" -msgstr[1] "" +msgstr "Braço Dir." #: lang/json/bodypart_from_json.py msgid "R ARM" @@ -82234,15 +82660,26 @@ msgctxt "bodypart_accusative" msgid "left hand" msgstr "mão esquerda" +#: lang/json/bodypart_from_json.py +msgid "hands" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "hands" +msgstr "" + #: lang/json/bodypart_from_json.py msgid "Manual tasks are slowed." msgstr "Tarefas manuais são retardadas." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Hand" -msgid_plural "Hands" -msgstr[0] "" -msgstr[1] "" +msgstr "Mão Esq." + +#: lang/json/bodypart_from_json.py +msgid "Hands" +msgstr "" #: lang/json/bodypart_from_json.py msgid "right hand" @@ -82255,9 +82692,7 @@ msgstr "L. Mão direita" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Hand" -msgid_plural "Hands" -msgstr[0] "" -msgstr[1] "" +msgstr "Mão Dir." #: lang/json/bodypart_from_json.py msgid "left leg" @@ -82268,15 +82703,26 @@ msgctxt "bodypart_accusative" msgid "left leg" msgstr "R. Mão esquerda" +#: lang/json/bodypart_from_json.py +msgid "legs" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "legs" +msgstr "" + #: lang/json/bodypart_from_json.py msgid "Running and swimming are slowed." msgstr "Correr e nadar são retardados." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Leg" -msgid_plural "Legs" -msgstr[0] "" -msgstr[1] "" +msgstr "Perna Esq." + +#: lang/json/bodypart_from_json.py +msgid "Legs" +msgstr "" #: lang/json/bodypart_from_json.py msgid "L LEG" @@ -82293,9 +82739,7 @@ msgstr "perna direita" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Leg" -msgid_plural "Legs" -msgstr[0] "" -msgstr[1] "" +msgstr "Perna Dir." #: lang/json/bodypart_from_json.py msgid "R LEG" @@ -82310,11 +82754,22 @@ msgctxt "bodypart_accusative" msgid "left foot" msgstr "pé esquerdo" +#: lang/json/bodypart_from_json.py +msgid "feet" +msgstr "" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "feet" +msgstr "" + #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Foot" -msgid_plural "Feet" -msgstr[0] "" -msgstr[1] "" +msgstr "Pé Esq." + +#: lang/json/bodypart_from_json.py +msgid "Feet" +msgstr "" #: lang/json/bodypart_from_json.py msgid "right foot" @@ -82327,15 +82782,11 @@ msgstr "L. pé direito pé" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Foot" -msgid_plural "Feet" -msgstr[0] "" -msgstr[1] "" +msgstr "Pé Dir" #: lang/json/bodypart_from_json.py msgid "appendix" -msgid_plural "Appendices" -msgstr[0] "" -msgstr[1] "" +msgstr "R. Apêndice apêndice pé" #: lang/json/bodypart_from_json.py msgctxt "bodypart_accusative" @@ -82346,6 +82797,10 @@ msgstr "R. Apêndice apêndice pé" msgid "It's inflamed." msgstr "Está inflamado." +#: lang/json/bodypart_from_json.py +msgid "Appendices" +msgstr "" + #: lang/json/clothing_mod_from_json.py msgid "Pad with leather" msgstr "Almofada com pele" @@ -91491,7 +91946,9 @@ msgstr "" " caçamenor. Os parafusos disparados dessa arma têm uma boa chance de " "permanecerintactos para reutilização." -#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py src/item.cpp +#: lang/json/gun_from_json.py lang/json/gun_from_json.py +#: lang/json/gunmod_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gunmod_from_json.py src/item.cpp msgctxt "gun_type_type" msgid "pistol" msgstr "pistola" @@ -91634,6 +92091,21 @@ msgstr "" "gasolina, e uma pequena bomba presa ao lado permite a repressurização, " "embora esse processo leve alguns minutos." +#: lang/json/gun_from_json.py +msgid "simple flamethrower" +msgid_plural "simple flamethrowers" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"A simple, home-made flamethrower. While its capacity is not superb, it is " +"more than capable of igniting terrain and monsters alike." +msgstr "" +" lança-chamas simples Um lança-chamas simples e caseiro. Embora " +"suacapacidade não seja excelente, é mais do que capaz de acender terreno " +"emonstros." + #: lang/json/gun_from_json.py msgid "BB gun" msgid_plural "BB guns" @@ -92324,6 +92796,19 @@ msgid "" "safety issues." msgstr "" +#: lang/json/gun_from_json.py +msgid "Walther P22" +msgid_plural "Walther P22s" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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" +msgstr "" + #: lang/json/gun_from_json.py msgid "Remington ACR" msgid_plural "Remington ACRs" @@ -93360,6 +93845,20 @@ msgid "" " make for a moderately poor handling pistol." msgstr "" +#: lang/json/gun_from_json.py +msgid "Hi-Point CF-380" +msgid_plural "Hi-Point CF-380s" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "M1911A1" msgid_plural "M1911A1s" @@ -93455,6 +93954,47 @@ msgstr "" "tiroscom câmara para rodadas de 10 mm, ou para a própria ronda de 0,40 da " "S& W." +#: lang/json/gun_from_json.py +msgid "Browning Hi-Power .40 S&W" +msgid_plural "Browning Hi-Power .40 S&Ws" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Browning Hi-Power is a semi-automatic handgun developed shortly before " +"the second world war. Widely issued since then, it remains in use by India, " +"Canada and Australia. This is a commercial variant produced by Browning Arms" +" in .40 S&W." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther PPQ .40 S&W" +msgid_plural "Walther PPQ .40 S&Ws" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in .40 S&W." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Hi-Point Model JCP" +msgid_plural "Hi-Point Model JCPs" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "tube 40mm launcher" msgid_plural "tube 40mm launchers" @@ -93820,6 +94360,33 @@ msgid_plural "USP .45s" msgstr[0] "" msgstr[1] "" +#: lang/json/gun_from_json.py +msgid "Walther PPQ .45 ACP" +msgid_plural "Walther PPQ .45 ACPs" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in .45 ACP." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Hi-Point Model JHP" +msgid_plural "Hi-Point Model JHPs" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "Taurus Raging Bull" msgid_plural "Taurus Raging Bull" @@ -94853,6 +95420,94 @@ msgid "" "SIG Sauer P320." msgstr "" +#: lang/json/gun_from_json.py +msgid "Browning Hi-Power 9x19mm" +msgid_plural "Browning Hi-Power 9x19mms" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Browning Hi-Power is a semi-automatic handgun developed shortly before " +"the second world war. Widely issued since then, it remains in use by India, " +"Canada and Australia. This is a commercial variant produced by Browning Arms" +" in 9x19mm Parabellum." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther P38" +msgid_plural "Walther P38s" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther PPQ 9mm" +msgid_plural "Walther PPQ 9mms" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in 9x19mm Parabellum." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Hi-Point C-9" +msgid_plural "Hi-Point C-9s" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "CZ-75" +msgid_plural "CZ-75s" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The CZ-75 is a semi-automatic pistol developed in Czechoslovakia, and is one" +" of the original wonder nines. Though designed for export to western " +"countries, it was declared a state secret; lack of international patent " +"protection meant that many clones and variants were produced and distributed" +" around the world, with Česká zbrojovka only joining in the 90's. This " +"pistol remains wildly popular among competition shooters." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther CCP" +msgid_plural "Walther CCPs" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "Makarov PM" msgid_plural "Makarov PMs" @@ -94960,21 +95615,6 @@ msgstr "" " lança-chamas Um grande lança-chamas com reservas substanciais de gás. " "Muitoameaçador e mortal." -#: lang/json/gun_from_json.py -msgid "simple flamethrower" -msgid_plural "simple flamethrowers" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/gun_from_json.py -msgid "" -"A simple, home-made flamethrower. While its capacity is not superb, it is " -"more than capable of igniting terrain and monsters alike." -msgstr "" -" lança-chamas simples Um lança-chamas simples e caseiro. Embora " -"suacapacidade não seja excelente, é mais do que capaz de acender terreno " -"emonstros." - #: lang/json/gun_from_json.py msgid "RM451 flamethrower" msgid_plural "RM451 flamethrowers" @@ -95105,6 +95745,16 @@ msgstr "" "combustãoespontânea por uma força de Lorentz gerada por indução " "eletromagnética, alimentada por um no-break padrão." +#: lang/json/gun_from_json.py +msgid "barb launching organ" +msgid_plural "barb launching organs" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "A mutated organ capable of launching bony barbs at great speed." +msgstr "" + #: lang/json/gun_from_json.py msgid "coilgun" msgid_plural "coilguns" @@ -95768,6 +96418,19 @@ msgstr "" "alvos. Odisparo de energia inflama o oxigênio, criando incêndios à medida " "que semove e uma explosão no impacto." +#: lang/json/gun_from_json.py +msgid "Yeet Cannon" +msgid_plural "Yeet Cannons" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"You can YEET all the bullets with this baby. YEET them right into all of the" +" zombies in your path, all the hulks, the spiders, and those damned mole " +"rats." +msgstr "" + #: lang/json/gun_from_json.py msgid "SVS-24" msgid_plural "SVS-24" @@ -97749,27 +98412,6 @@ msgstr "" "5tiros que está no Casull .454. Ele tem a capacidade de disparar tiros " "deshot.410 e cartuchos Long Colt .45." -#: lang/json/gunmod_from_json.py -msgid ".300 AAC Blackout caliber conversion kit" -msgid_plural ".300 AAC Blackout caliber conversion kits" -msgstr[0] "" -msgstr[1] "" - -#: lang/json/gunmod_from_json.py -msgid "" -"This kit is used to convert an AR-15 .223/5.56mm rifle to the new .300BLK " -"caliber." -msgstr "" - -#: lang/json/gunmod_from_json.py -msgid "bore" -msgstr "furo" - -#: lang/json/gunmod_from_json.py -msgctxt "gun_type_type" -msgid "ar15" -msgstr "ar15" - #: lang/json/gunmod_from_json.py msgid "barrel extension" msgid_plural "barrel extensions" @@ -97871,6 +98513,10 @@ msgstr "" "0,227converte-a para uma arma de fogo .22. A conversão resulta em uma " "pequenaredução na precisão." +#: lang/json/gunmod_from_json.py +msgid "bore" +msgstr "furo" + #: lang/json/gunmod_from_json.py msgid ".223 caliber conversion kit" msgid_plural ".223 caliber conversion kits" @@ -98240,6 +98886,36 @@ msgstr "" " Um saco que pendura do lado da sua arma e pega as carcaças ejetadas paraque" " você não tenha que pegá-las." +#: lang/json/gunmod_from_json.py +msgid ".300 AAC Blackout AR-15 conversion kit" +msgid_plural ".300 AAC Blackout AR-15 conversion kits" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gunmod_from_json.py +msgid "A complete AR-15 upper assembly with a .300 AAC Blackout barrel." +msgstr "" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "ar15" +msgstr "ar15" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "m4a1" +msgstr "" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "h&k416a5" +msgstr "" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "m27iar" +msgstr "" + #: lang/json/gunmod_from_json.py msgid "lightweight replacement furniture" msgid_plural "lightweight replacement furnitures" @@ -100524,11 +101200,11 @@ msgstr "" #: lang/json/help_from_json.py msgid "" -"While magazines are often firearm-specific, on some occasions a magazine is compatible with several other firearms. The firearms in the game often reflect real-world prototypes in terms of caliber and compatibility. Below are some examples of interchangeable ammo:\n" -".308 = 7.62x51mm,\n" -".223 = 5.56 NATO,\n" -".270 = .30-06,\n" -".40 S&W = 10mm." +"While magazines and clips are often firearm-specific, on some occasions a magazine/speedloader is compatible with several other firearms or calibers. Below are some examples of calibers that might share magazines or speedloaders:\n" +".380 ACP and 9mm Luger,\n" +" .40 S&W and 10mm Auto 3\n" +".45 ACP and .460 Rowland,\n" +".45 Colt and .454 Casull." msgstr "" #: lang/json/help_from_json.py @@ -101652,8 +102328,9 @@ msgid "Measure radiation" msgstr "Medir radiação" #: lang/json/item_action_from_json.py lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py #: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py -#: lang/json/talk_topic_from_json.py src/game_inventory.cpp +#: src/game_inventory.cpp msgid "..." msgstr "..." @@ -101715,11 +102392,15 @@ msgid "Well, you know" msgstr "Bem, você sabe" #: lang/json/item_action_from_json.py -msgid "Wash clothes" -msgstr "Lavar roupas" +msgid "Wash soft items" +msgstr "" #: lang/json/item_action_from_json.py -msgid "Wash CBMs" +msgid "Wash hard items" +msgstr "" + +#: lang/json/item_action_from_json.py +msgid "Wash items" msgstr "" #: lang/json/item_action_from_json.py @@ -105388,6 +106069,41 @@ msgstr "" " o nome desapareceu, mas permanece um slogan:'Vamos consertá-lo por todo o " "caminho'" +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "EnviroCom OS v2.03 - Basement Access" +msgstr "" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Unlock stairs" +msgstr "Desbloquear escadas" + +#. ~ Sign +#: lang/json/mapgen_from_json.py +msgid "Authorized personnel only" +msgstr "" + +#. ~ Sign +#: lang/json/mapgen_from_json.py +msgid " sewage treatment plant" +msgstr "" + +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "EnviroCom OS v2.03" +msgstr "EnviroCom OS v2.03" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Download Sewer Maps" +msgstr "Faça o download de mapas de esgoto" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Divert sample" +msgstr "Divertir amostra" + #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Evac shelter computer" @@ -106001,6 +106717,43 @@ msgid "" "Blocked damage reduced by 50%% of Dexterity." msgstr "" +#. ~ Description for martial art 'Fior Di Battaglia' +#: lang/json/martial_art_from_json.py +msgid "" +"Medieval Europe's martial techniques for fighting with polearms. The " +"\"Flower of Battle\" places great focus on countering one's opponent and " +"knocking them down before landing a killing blow" +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stand Your Ground" +msgstr "" + +#. ~ Description of buff 'Stand Your Ground' for martial art 'Fior Di +#. Battaglia' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You stalwart and will not budge against any threat.\n" +"\n" +"+2 Block attempts, -1.0 Dodge skill, blocked damage reduced by 50%% of Strength." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Tactical Retreat" +msgstr "" + +#. ~ Description of buff 'Tactical Retreat' for martial art 'Fior Di +#. Battaglia' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You moved and nullified the effects of Stand Your Ground!\n" +"\n" +"-2 Block attempts, +1.0 Dodge skill, blocked damaged increased by 50%% of Strength.\n" +"Lasts 1 turn." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Karate" msgstr "Karatê" @@ -106489,35 +107242,6 @@ msgstr "" msgid "Perception increases dodging ability, +1 dodges per turn" msgstr "" -#. ~ Description for martial art 'Fior Di Battaglia' -#: lang/json/martial_art_from_json.py -msgid "" -"Medieval Europe's martial techniques for fighting with polearms, great focus" -" is given in countering one's opponent and knocking them down before landing" -" a killing blow" -msgstr "" - -#: lang/json/martial_art_from_json.py -msgid "Stand Your Ground" -msgstr "" - -#. ~ Description of buff 'Stand Your Ground' for martial art 'Fior Di -#. Battaglia' -#: lang/json/martial_art_from_json.py -msgid "" -"+2 blocks -1 dodge, halves your dodge and damage is reduced by your strength" -" when blocking" -msgstr "" - -#: lang/json/martial_art_from_json.py -msgid "You moved" -msgstr "" - -#. ~ Description of buff 'You moved' for martial art 'Fior Di Battaglia' -#: lang/json/martial_art_from_json.py -msgid "Nullifies Stand Your Ground, don't move, stand there and counter!" -msgstr "" - #: lang/json/martial_art_from_json.py msgid "Medieval Swordsmanship" msgstr "Esgrima medieval" @@ -108577,39 +109301,6 @@ msgstr "Muito obrigado por encontrá-lo!" msgid "Oh no! My poor puppy..." msgstr "Ah não! Meu pobre cachorrinho ..." -#: lang/json/mission_def_from_json.py -msgid "Find 100 Cigarettes" -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "Come on man, I just need a smoke." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "" -"With all that's been going on, it's been more and more difficult to find a " -"smoke. My stash has been running low for a while now. Think you could help" -" me out here? A few packs is all I need." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "Thanks, it's great to see someone willing to help a guy out." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "" -"Plenty of smokers in towns. Gotta be some left over cigs in some of them " -"houses." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "Got the smokes?" -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "Thanks! I'll be sure to put in a good word for you around the center." -msgstr "" - #: lang/json/mission_def_from_json.py msgid "Break into armory to retrieve family photo" msgstr "" @@ -109965,7 +110656,7 @@ msgid "" msgstr "" #: lang/json/mission_def_from_json.py -msgid "Find 50 3L jars" +msgid "In a Pickle Pt. 2" msgstr "" #: lang/json/mission_def_from_json.py @@ -109994,6 +110685,39 @@ msgid "" "payment." msgstr "" +#: lang/json/mission_def_from_json.py +msgid "Smokes, let's go." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Come on man, I just need a smoke." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"With all that's been going on, it's been more and more difficult to find a " +"smoke. My stash has been running low for a while now. Think you could help" +" me out here? A few packs is all I need." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Thanks, it's great to see someone willing to help a guy out." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Plenty of smokers in towns. Gotta be some left over cigs in some of them " +"houses." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Got the smokes?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Thanks! I'll be sure to put in a good word for you around the center." +msgstr "" + #: lang/json/mission_def_from_json.py msgid "Clear Back Bay" msgstr "Clear Back Bay" @@ -110112,7 +110836,7 @@ msgid "" msgstr "" #: lang/json/mission_def_from_json.py -msgid "Find 10 solar panels" +msgid "Solar Power" msgstr "" #: lang/json/mission_def_from_json.py @@ -110144,7 +110868,7 @@ msgstr "" "àsua ajuda." #: lang/json/mission_def_from_json.py -msgid "Find 100 canning jars" +msgid "In a Pickle" msgstr "" #: lang/json/mission_def_from_json.py @@ -110454,8 +111178,8 @@ msgid "Thank you, I'll do the explaining if anyone else asks about it." msgstr "Obrigado, eu farei a explicação se alguém perguntar sobre isso." #: lang/json/mission_def_from_json.py -msgid "Kill ???" -msgstr "Mate ???" +msgid "Secure Trade Route" +msgstr "" #: lang/json/mission_def_from_json.py msgid "" @@ -110487,8 +111211,8 @@ msgid "Great work, wasn't sure what I was sending you after." msgstr "Ótimo trabalho, não tinha certeza do que eu estava enviando depois." #: lang/json/mission_def_from_json.py -msgid "Kill Raider Leader" -msgstr "Kill Raider Leader" +msgid "Assassinate Raider Leader" +msgstr "" #: lang/json/mission_def_from_json.py msgid "" @@ -110623,8 +111347,8 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" -"Remember, do extraction /exactly/ as specified, otherwise the bionic will " -"self-destruct." +"Remember, perform the extraction /exactly/ as specified, otherwise the " +"bionic will self-destruct." msgstr "" #: lang/json/mission_def_from_json.py @@ -110648,6 +111372,37 @@ msgstr "" msgid "You have our thanks and payment." msgstr "" +#: lang/json/mission_def_from_json.py +msgid "Light retrieval" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Our facility once sourced advanced photonic circuitry from a nearby robotics manufacturer. Their building suffered major damage during the portal storms, and collapsed almost entirely. However, preliminary scouting reveals that the basement prototyping lab likely remains intact.\n" +"\n" +"the intercom: We ask you to investigate the ruins, and if possible, retrieve a template for the fabrication of said photonic circuitry." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "We expect your success, mercenary." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Return if you change your mind." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"The scout drone also revealed extensive heat signatures and high " +"concentrations of toxic compounds within the ruins, plan accordingly. We " +"are willing to sell you some protective gear at a discount, if you require " +"it." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Have you retrieved the blueprints?" +msgstr "" + #: lang/json/mission_def_from_json.py msgid "Make 2 Stills" msgstr "Faça 2 Stills" @@ -122485,6 +123240,10 @@ msgstr "casa de açúcar" msgid "sugar house roof" msgstr "" +#: lang/json/overmap_terrain_from_json.py +msgid "rural road" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "farm field" msgstr "campo de fazenda" @@ -124309,8 +125068,16 @@ msgid "parking garage" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "sewage treatment" -msgstr "tratamento de esgoto" +msgid "sewage treatment plant" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment plant roof" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment plant - underground" +msgstr "" #: lang/json/overmap_terrain_from_json.py msgid "toxic waste dump" @@ -124617,6 +125384,10 @@ msgstr "" msgid "mechanics garage" msgstr "garagem mecânica" +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment" +msgstr "tratamento de esgoto" + #: lang/json/overmap_terrain_from_json.py msgid "mechanic garage" msgstr "garagem mecânica" @@ -125629,6 +126400,34 @@ msgstr "" " Você não tem certeza do que aconteceu, mas tudo se foi, e a única coisa que" " passa pela sua cabeça é onde você vai encontrar seu próximo sucesso." +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Pillhead" +msgstr "" + +#. ~ Profession (male Pillhead) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"After an accident in your youth, you got addicted to the opiates treating " +"your pain. With the pharmacies shut down and dealers turned undead, " +"satisfying your fix just got a lot more difficult." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Pillhead" +msgstr "" + +#. ~ Profession (female Pillhead) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"After an accident in your youth, you got addicted to the opiates treating " +"your pain. With the pharmacies shut down and dealers turned undead, " +"satisfying your fix just got a lot more difficult." +msgstr "" + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "K9 Officer" @@ -132233,7 +133032,6 @@ msgid "WEAPON" msgstr "ARMA" #. ~ Crafting recipes subcategory all -#. ~ Crafting recipes subcategory of 'ENCHANTED' category #: lang/json/recipe_category_from_json.py #: lang/json/recipe_category_from_json.py src/crafting_gui.cpp msgid "ALL" @@ -135669,9 +136467,8 @@ msgstr "" " você precisa." #: lang/json/snippet_from_json.py -msgid "Wounds heal over time. Bandages and disinfectant speeds that up." +msgid "Wounds heal over time. Bandages and antiseptic speeds that up." msgstr "" -" As feridas cicatrizam com o tempo. Ataduras e desinfetantes aceleram isso." #: lang/json/snippet_from_json.py msgid "Don't get grabbed by zombies. Their bites can be infectious." @@ -136590,8 +137387,8 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "" -"If you have extra disinfectant, use it to disinfect your wounds, even if " -"they aren't infected. They will recover faster that way." +"If you have extra antiseptic, use it to disinfect your wounds, even if they " +"aren't infected. They will recover faster that way." msgstr "" #: lang/json/snippet_from_json.py @@ -143698,17 +144495,6 @@ msgid "" "expert." msgstr "" -#: lang/json/snippet_from_json.py -msgid "" -"WAR ON DRUGS DEAD: The government has finally reacted to long accumulated " -"evidence that suggests that decriminalized drugs cause fewer health problems" -" and are generally better managed while providing valuable tax revenues." -msgstr "" -" GUERRA SOBRE AS DROGAS MORTOS: O governo finalmente reagiu a evidências " -"acumuladas há muito tempo que sugerem que os medicamentos descriminalizados " -"causam menos problemas de saúde e geralmente são mais bem administrados, ao " -"mesmo tempo em que proporcionam receitas tributárias valiosas." - #: lang/json/snippet_from_json.py msgid "" "FEELING BLUE? Try \"Greens\" for Magazines! Your local Supermarket! " @@ -148822,8 +149608,7 @@ msgid "" "Bionics are augmentation packages, right? They come in these installable Compact Bionic Modules or CBMs, and I can use some CBMs - if you examine a CBM, it will tell you if I can use it.\n" " Find a programmable surgical installer or autodoc, position me on the couch, and activate it, and you can install a suitable CBM to me - or if I think I'll do a better job, I'll do. I'll take over installing CBMs into you if I'm better at it.\n" " I can use almost all passive bionics and some active bionics. If I have any active bionics, I'll try to use them sensibly, but if we're in danger, I'm going to activate anything that might give me an edge. I'll use any weapon bionics if they're better than the weapons you gave me, but if you think I should reserve my bionic energy for my defensive and healing bionics, you can tell me how much to reserve. I'll try to keep my bionic energy topped off, but if we're running low on supplies, you can tell me to stop recharging when I'm not full.\n" -" I'll tell you if I'm low on bionic energy and can't recharge, and what fuel I need.\n" -" Sothere are some internal atomic reactor bionics - I can use those, but I can only recharge them with plutonium slurry. That stuff is radioactive, so do us both a favor and don't give me an internal reactor unless you really like glowing in the dark." +" I'll tell you if I'm low on bionic energy and can't recharge, and what fuel I need." msgstr "" #: lang/json/talk_topic_from_json.py @@ -149003,11 +149788,11 @@ msgid "Go back to sleep." msgstr "Volta a dormir." #: lang/json/talk_topic_from_json.py -msgid " *pshhhttt* I'm reading you boss, over." +msgid "What is it, friend?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "What is it, friend?" +msgid " *pshhhttt* I'm reading you boss, over." msgstr "" #: lang/json/talk_topic_from_json.py @@ -149246,11 +150031,11 @@ msgid "Show me what needs to be done at the camp." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I'm currently ." +msgid "I'm not doing much currently." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I'm not doing much currently." +msgid "I'm currently ." msgstr "" #: lang/json/talk_topic_from_json.py @@ -149308,13 +150093,13 @@ msgstr "" " OK, talvez isso me impeça de congelar nesse clima, o que está acontecendo?" #: lang/json/talk_topic_from_json.py -msgid "" -"Well, it's the time of day for a quick break surely! How are you holding " -"up?" +msgid "Man it's dark out isn't it? what's up?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Man it's dark out isn't it? what's up?" +msgid "" +"Well, it's the time of day for a quick break surely! How are you holding " +"up?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -149323,14 +150108,14 @@ msgstr "Bem, estou me sentindo muito mal ... você está bem?" #: lang/json/talk_topic_from_json.py msgid "" -"Definitely, by the way, thanks for helping me so much with my tasks! " -"Anyway, you coping OK, ? " +"OK, let's take a moment, oh, and thanks for helping me with that thing, " +"so... what's up?" msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"OK, let's take a moment, oh, and thanks for helping me with that thing, " -"so... what's up?" +"Definitely, by the way, thanks for helping me so much with my tasks! " +"Anyway, you coping OK, ? " msgstr "" #: lang/json/talk_topic_from_json.py @@ -149407,11 +150192,11 @@ msgid "Keep your distance!" msgstr "Mantenha distância!" #: lang/json/talk_topic_from_json.py -msgid "" +msgid "This is my territory, ." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "This is my territory, ." +msgid "" msgstr "" #: lang/json/talk_topic_from_json.py @@ -149467,27 +150252,27 @@ msgid "I don't care." msgstr "Eu não me importo." #: lang/json/talk_topic_from_json.py -msgid "I don't have any jobs for you." +msgid "I have other jobs for you. Want to hear about them?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I don't have any more jobs for you." +msgid "I have more jobs for you. Want to hear about them?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I have other jobs for you. Want to hear about them?" +msgid "I just have one job for you. Want to hear about it?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I have more jobs for you. Want to hear about them?" +msgid "I have another job for you. Want to hear about it?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I have another job for you. Want to hear about it?" +msgid "I don't have any more jobs for you." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I just have one job for you. Want to hear about it?" +msgid "I don't have any jobs for you." msgstr "" #: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py @@ -149500,7 +150285,7 @@ msgid "Never mind, I'm not interested." msgstr "Não importa, não estou interessado." #: lang/json/talk_topic_from_json.py -msgid "You're not working on anything for me now." +msgid "What about it?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -149508,7 +150293,7 @@ msgid "Which job?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "What about it?" +msgid "You're not working on anything for me now." msgstr "" #: lang/json/talk_topic_from_json.py @@ -156182,8 +156967,8 @@ msgid "All right! Let's get going." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "We've done it! We've solved the list!" -msgstr "" +msgid "Have I told you about cardboard, friend? Do you have any?" +msgstr "Já te falei de papelão, amigo? Voc ~ e tem algum?" #: lang/json/talk_topic_from_json.py msgid "" @@ -156191,8 +156976,8 @@ msgid "" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Have I told you about cardboard, friend? Do you have any?" -msgstr "Já te falei de papelão, amigo? Voc ~ e tem algum?" +msgid "We've done it! We've solved the list!" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "About that shopping list of yours..." @@ -160764,6 +161549,10 @@ msgstr "" msgid "What the hell were you testing out there?" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "So, about that protective gear?" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "No. Now leave." msgstr "" @@ -160779,6 +161568,21 @@ msgid "" "Shame about what happened, with the evisceration and all..." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"Given the current context, we are willing to sell you a set of our protective gear: gas mask, suit and gear, at a considerable discount. We will sell it for two of our coins.\n" +"\n" +"the intercom: Hmm wait, we might not have your size..." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "[ 2 Hub 01 Gold Coins ] Deal!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I have to give it a thought." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Just leave." msgstr "" @@ -162600,6 +163404,86 @@ msgstr "" msgid " delivers a perfect riposte to %s" msgstr "" +#: lang/json/technique_from_json.py +msgid "Displace and Hook" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You parry and hook %s down" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " parries and hooks %s down" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "High Round Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You swing high and strike at %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " swings high and strikes %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "High Round Feint" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You fake a high round strike at %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " feints at %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab you, but you push away!" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab , but they push away!" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Hook and Drag" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You hook and drag %s down" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " hooks and drags %s down" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Colpo di Grazia" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You swing down hard and execute %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " swings down hard and executes %s" +msgstr "" + #: lang/json/technique_from_json.py msgid "quick punch" msgstr "soco rápido" @@ -162777,11 +163661,6 @@ msgstr "Finta em" msgid "You feint at %s" msgstr "" -#: lang/json/technique_from_json.py -#, python-format -msgid " feints at %s" -msgstr "" - #: lang/json/technique_from_json.py #, python-format msgid "You jab %s" @@ -163230,57 +164109,6 @@ msgstr "" msgid " receives %s's attack, and counters" msgstr "" -#: lang/json/technique_from_json.py -msgid "Displace and Hook" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You parry %s attack and hook them down" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid " parries %s attack and hooks them down" -msgstr "" - -#: lang/json/technique_from_json.py -msgid "High Round Strike" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You swing high and strike at %s" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid " swings high and strikes %s" -msgstr "" - -#: lang/json/technique_from_json.py -msgid "High Round Feint" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You fake a high round strike at %s" -msgstr "" - -#: lang/json/technique_from_json.py -msgid "High Round Stab" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You quickly stab %s" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid " quickly stabs %s" -msgstr "" - #: lang/json/technique_from_json.py msgid "grab and pommel strike" msgstr "" @@ -165109,6 +165937,16 @@ msgstr "" msgid "SMASH!" msgstr "ESMAGAR!" +#: lang/json/terrain_from_json.py +msgid "metal floor" +msgstr "chão de metal" + +#. ~ Description for metal floor +#: lang/json/terrain_from_json.py +msgid "" +"High-quality and tough checkered flooring to reduce risk of slips and falls." +msgstr "" + #: lang/json/terrain_from_json.py msgid "linoleum tile" msgstr "telha do linóleo" @@ -165221,10 +166059,6 @@ msgstr "" " Série inacabada de vergalhões e concreto derramado; o chão não foi alisado " "e o telhado ainda não está totalmente preenchido." -#: lang/json/terrain_from_json.py -msgid "metal floor" -msgstr "chão de metal" - #. ~ Description for metal floor #: lang/json/terrain_from_json.py msgid "" @@ -171070,6 +171904,16 @@ msgstr "quitina ram" msgid "biosilicfied chitin ram" msgstr "Ram de quitina biosilicfied" +#: lang/json/vehicle_part_from_json.py +msgid "tied mattress" +msgstr "" + +#. ~ Description for tied mattress +#: lang/json/vehicle_part_from_json.py +msgid "" +"A mattress, strapped onto the vehicle. It could serve to blunt any impact." +msgstr "" + #. ~ Description for shredder #: lang/json/vehicle_part_from_json.py msgid "" @@ -175658,6 +176502,10 @@ msgstr "" msgid "Stop %s?" msgstr "" +#: src/activity_type.h +msgid "THIS IS A BUG" +msgstr "" + #: src/addiction.cpp msgid "You need some nicotine." msgstr "Você precisa de um pouco de nicotina." @@ -177182,10 +178030,6 @@ msgstr "" msgid "artifact file" msgstr "arquivo de artefato" -#: src/auto_pickup.cpp -msgid " AUTO PICKUP MANAGER " -msgstr "GERENTE DE COLOCAÇÃO AUTOMÁTICA" - #: src/auto_pickup.cpp src/game.cpp src/safemode_ui.cpp msgid "dd" msgstr "dd" @@ -177234,14 +178078,6 @@ msgstr "Regras" msgid "I/E" msgstr "I/E" -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "[]" -msgstr "[ ]" - -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "[]" -msgstr "[ ]" - #: src/auto_pickup.cpp msgid "Auto pickup enabled:" msgstr "Auto pickup habilitado:" @@ -177258,10 +178094,6 @@ msgstr "Verdadeiro" msgid "witch" msgstr "bruxa" -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "Please load a character first to use this page!" -msgstr "Por favor, carregue um personagem primeiro para usar esta página!" - #: src/auto_pickup.cpp src/safemode_ui.cpp msgid "" msgstr "" @@ -177299,6 +178131,18 @@ msgstr "Regra de recebimento:" msgid "Save changes?" msgstr "Salvar alterações?" +#: src/auto_pickup.cpp +msgid " AUTO PICKUP MANAGER " +msgstr "GERENTE DE COLOCAÇÃO AUTOMÁTICA" + +#: src/auto_pickup.cpp src/safemode_ui.cpp +msgid "[]" +msgstr "[ ]" + +#: src/auto_pickup.cpp src/safemode_ui.cpp +msgid "[]" +msgstr "[ ]" + #: src/auto_pickup.cpp #, c-format msgid "%1$d item matches: %2$s" @@ -177318,6 +178162,11 @@ msgstr "O autopupup não está habilitado nas opções. Ativá-lo agora?" msgid "autopickup configuration" msgstr "configuração de autopickup" +#: src/auto_pickup.cpp +#, c-format +msgid "Pickup rules for %s" +msgstr "" + #: src/avatar.cpp src/iuse.cpp msgid "He" msgstr "Ele" @@ -178562,7 +179411,37 @@ msgstr "" #: src/bionics.cpp #, c-format -msgid "%s withdraws %s %s." +msgid " withdraws %s %s." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Your %s does not have enought fuel to start." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "'s %s does not have enought fuel to start." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Your %s turns off to not waste fuel." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "'s %s turns off to not waste fuel." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Your %s runs out of fuel and turn off." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "'s %s runs out of fuel and turn off." msgstr "" #: src/bionics.cpp @@ -178940,6 +179819,10 @@ msgstr "" " À medida que sua consciência se esvai, você se sente arrependido por não " "poder aproveitar a operação." +#: src/bionics_ui.cpp +msgid "Available Fuel: " +msgstr "" + #: src/bionics_ui.cpp #, c-format msgid "" @@ -182110,6 +182993,20 @@ msgid_plural " digests a %s and recharges %d points of energy." msgstr[0] "" msgstr[1] "" +#: src/consumption.cpp +#, c-format +msgid "You load %i charge of %s in your %s." +msgid_plural "You load %i charges of %s in your %s." +msgstr[0] "" +msgstr[1] "" + +#: src/consumption.cpp +#, c-format +msgid " load %i charge of %s in their %s." +msgid_plural " load %i charges of %s in their %s." +msgstr[0] "" +msgstr[1] "" + #: src/craft_command.cpp src/crafting.cpp src/veh_interact.cpp msgid " (nearby)" msgstr "(perto)" @@ -182195,8 +183092,10 @@ msgstr "Você não pode mais fabricar isto!" #: src/crafting.cpp #, c-format -msgid "You don't have anything to store %s in!" -msgstr "Você não tem nada para guardar %s!" +msgid "" +"You don't have anything in which to store %s and may have to pour it out or " +"consume it as soon as it is prepared! Proceed?" +msgstr "" #: src/crafting.cpp src/pickup.cpp #, c-format @@ -182781,6 +183680,10 @@ msgstr "Bom acerto!" msgid "Grazing hit." msgstr "Acertou raspando." +#: src/creature.cpp +msgid "You feel poison coursing through your body!" +msgstr "" + #: src/creature.cpp msgid "The shot misses!" msgstr "O tiro erra!" @@ -184343,21 +185246,21 @@ msgid "You can't see the terrain here." msgstr "Você não pode ver o terreno aqui." #: src/descriptions.cpp +#, c-format msgid "" "\n" -"Sign: ???" +"Sign: %s" msgstr "" "\n" -"Inscreva: ???" +"Aviso: %s" #: src/descriptions.cpp -#, c-format msgid "" "\n" -"Sign: %s" +"Sign: ???" msgstr "" "\n" -"Aviso: %s" +"Inscreva: ???" #: src/descriptions.cpp src/iexamine.cpp #, c-format @@ -187409,20 +188312,6 @@ msgstr "olhe a data" msgid "Failed to save game data" msgstr "Falha ao salvar dados do jogo" -#: src/game.cpp -msgid "You haven't killed any monsters yet!" -msgstr "Você não matou nenhum monstro ainda!" - -#: src/game.cpp -#, c-format -msgid "KILL COUNT: %d" -msgstr "" - -#: src/game.cpp -#, c-format -msgid "Experience: %d (%d points available)" -msgstr "" - #: src/game.cpp msgid " You are forgotten among the billions lost in the cataclysm..." msgstr "Você está esquecido entre os bilhões perdidos no cataclismo ..." @@ -189466,6 +190355,11 @@ msgstr "Não pode beber líquidos derramados" msgid "You're fully charged" msgstr "Você está totalmente carregado" +#: src/game_inventory.cpp +#, c-format +msgid "No space to store more %s" +msgstr "" + #: src/game_inventory.cpp msgid "soon!" msgstr "logo!" @@ -189498,6 +190392,18 @@ msgstr "velho" msgid "rotten" msgstr "podre" +#: src/game_inventory.cpp src/panels.cpp +msgid "Food :" +msgstr "" + +#: src/game_inventory.cpp src/panels.cpp +msgid "Drink:" +msgstr "" + +#: src/game_inventory.cpp src/panels.cpp +msgid "Pain :" +msgstr "" + #: src/game_inventory.cpp msgid "Consume item" msgstr "Consumir item" @@ -192254,6 +193160,14 @@ msgstr "Escolha bionic instalado para desinstalar." msgid "ERROR NO SPACE AVAILABLE. Operation impossible. Exiting." msgstr "" +#: src/iexamine.cpp +msgid "Personality_Override" +msgstr "" + +#: src/iexamine.cpp +msgid "C0RR#PTED?D#TA" +msgstr "" + #: src/iexamine.cpp msgid "Choose bionic to uninstall" msgstr "Escolha biônico para desinstalar" @@ -193520,8 +194434,8 @@ msgid "Capacity: " msgstr "" #: src/item.cpp -msgid " per round" -msgstr " por rodada" +msgid " moves per round" +msgstr "" #: src/item.cpp msgid "Reload time: " @@ -193618,8 +194532,8 @@ msgid "" msgstr "" #: src/item.cpp -msgid " seconds" -msgstr " segundos" +msgid " moves " +msgstr "" #: src/item.cpp msgid "Time to reach aim level: " @@ -193653,10 +194567,6 @@ msgstr "Recuo Efetivo:" msgid "Recommended strength (burst): " msgstr "Força recomendada (rajada):" -#: src/item.cpp -msgid " seconds per round" -msgstr " segundos por rodada" - #: src/item.cpp msgid "Fire modes: " msgstr " Modos de fogo: " @@ -193927,6 +194837,14 @@ msgstr "" " Valores de proteção são reduzido por dano e você pode ser " "capaz de melhorá-los reparando este item ." +#: src/item.cpp +msgid "Weight capacity modifier: " +msgstr "" + +#: src/item.cpp +msgid "Weight capacity bonus: " +msgstr "" + #: src/item.cpp msgid "Just for fun." msgstr "Apenas por diversão." @@ -194379,6 +195297,14 @@ msgstr "" msgid "This bionic is installed in the following body part(s):" msgstr "Este biônico está instalado nas seguintes partes do corpo:" +#: src/item.cpp +msgid "Encumbrance: " +msgstr "" + +#: src/item.cpp +msgid "Environmental Protection: " +msgstr "" + #: src/item.cpp msgid "* This weapon needs two free hands to fire." msgstr "* Esta arma precisa duas mãos livres para disparar." @@ -197703,6 +198629,11 @@ msgstr "" msgid " illuminated by %s" msgstr "" +#: src/iuse.cpp +#, c-format +msgid " in %s cloud" +msgstr "" + #: src/iuse.cpp #, c-format msgid " with graffiti \"%s\"" @@ -198924,6 +199855,10 @@ msgstr "" msgid "There is also a certain bionic that helps with this kind of armor." msgstr "Há também um certo biônico que ajuda com esse tipo de armadura." +#: src/iuse_actor.cpp +msgid "No lock to pick." +msgstr "" + #: src/iuse_actor.cpp msgid "Use your lockpick where?" msgstr "Use o seu lockpick onde?" @@ -201019,6 +201954,20 @@ msgstr "<-> prev" msgid "ndo move" msgstr "então mova" +#: src/kill_tracker.cpp +msgid "You haven't killed any monsters yet!" +msgstr "Você não matou nenhum monstro ainda!" + +#: src/kill_tracker.cpp +#, c-format +msgid "KILL COUNT: %d" +msgstr "" + +#: src/kill_tracker.cpp +#, c-format +msgid "Experience: %d (%d points available)" +msgstr "" + #. ~ abbreviated direction names and long direction names #: src/line.cpp msgid "N " @@ -201288,6 +202237,16 @@ msgstr "" msgid "an explosion" msgstr "" +#: src/magic.cpp +#, c-format +msgid "%s and %s" +msgstr "%s e %s" + +#: src/magic.cpp src/player.cpp +#, c-format +msgid "%s, %s" +msgstr "" + #: src/magic.cpp #, c-format msgid "" @@ -201324,6 +202283,11 @@ msgstr "" msgid "Popup Distractions" msgstr "" +#: src/magic.cpp +#, c-format +msgid "%d moves" +msgstr "" + #: src/magic.cpp msgid "requires concentration" msgstr "" @@ -201843,7 +202807,7 @@ msgstr "" #: src/map.cpp #, c-format -msgid "The autoclave in the %s has finished washing." +msgid "The autoclave in the %s has finished its cycle." msgstr "" #: src/map.cpp @@ -202109,22 +203073,6 @@ msgstr "Câmaras Abertas" msgid "Missile Controls" msgstr "Controles de Mísseis" -#: src/mapgen.cpp -msgid "EnviroCom OS v2.03" -msgstr "EnviroCom OS v2.03" - -#: src/mapgen.cpp -msgid "Unlock stairs" -msgstr "Desbloquear escadas" - -#: src/mapgen.cpp -msgid "Download Sewer Maps" -msgstr "Faça o download de mapas de esgoto" - -#: src/mapgen.cpp -msgid "Divert sample" -msgstr "Divertir amostra" - #: src/mapgen.cpp msgid "NEPowerOS" msgstr "NEPowerOS" @@ -204730,6 +205678,11 @@ msgstr "" msgid "The %1$s's arms fly out and pull and grab %2$s!" msgstr "" +#: src/monattack.cpp +#, c-format +msgid "The %1$s reaches out and pulls %2$s!" +msgstr "" + #: src/monattack.cpp #, c-format msgid "The %s gropes at you, but you dodge!" @@ -205452,6 +206405,19 @@ msgstr "Esvazie suas mãos e segure sua posição, cidadão!" msgid "fzzzzzt" msgstr "fzzzzzt" +#: src/monattack.cpp +msgid "The floor trembles underneath your feet." +msgstr "" + +#: src/monattack.cpp +msgid "a deafening roar!" +msgstr "" + +#: src/monattack.cpp +#, c-format +msgid "A %s struggles to pull itself free from the %s!" +msgstr "" + #: src/monattack.cpp #, c-format msgid "The %1$s mechanically grabs at %2$s!" @@ -208116,6 +209082,11 @@ msgstr "" msgid "Hold on, I want to pulp that %s." msgstr "" +#: src/npcmove.cpp +#, c-format +msgid "%s completed the assigned task." +msgstr "" + #: src/npcmove.cpp #, c-format msgid "%1$s throws a %2$s." @@ -208626,6 +209597,10 @@ msgstr "punhos" msgid "BADAMMO" msgstr "POR FAVOR" +#: src/npctalk.cpp +msgid "doing this and that" +msgstr "" + #: src/npctalk.cpp msgctxt "punctuation" msgid "." @@ -208729,6 +209704,11 @@ msgstr "" msgid "%1$s doesn't have a %2$s!" msgstr "" +#: src/npctalk.cpp +#, c-format +msgid "%1$s gives you %2$s." +msgstr "" + #: src/npctalk.cpp msgid "I don't trust you enough to eat THIS..." msgstr "Eu não confie em você o suficiente para comer isso ..." @@ -208982,11 +209962,6 @@ msgstr "Pagar:" msgid "Select a follower" msgstr "Selecione um seguidor" -#: src/npctalk_funcs.cpp -#, c-format -msgid "Pickup rules for %s" -msgstr "" - #: src/npctrade.cpp #, c-format msgid "Volume: %s %s, Weight: %.1f %s" @@ -211901,10 +212876,6 @@ msgstr "" msgid "Freezing!" msgstr "" -#: src/panels.cpp -msgid "Pain " -msgstr "" - #: src/panels.cpp msgid "Bad" msgstr "" @@ -212072,22 +213043,10 @@ msgstr "" msgid "Style:" msgstr "" -#: src/panels.cpp -msgid "Food :" -msgstr "" - -#: src/panels.cpp -msgid "Drink:" -msgstr "" - #: src/panels.cpp msgid "Rest :" msgstr "" -#: src/panels.cpp -msgid "Pain :" -msgstr "" - #: src/panels.cpp msgid "Heat :" msgstr "" @@ -213852,11 +214811,6 @@ msgstr "%s (%d)" msgid "%s with %s (%d)" msgstr "" -#: src/player.cpp -#, c-format -msgid "%s, %s" -msgstr "" - #: src/player.cpp msgid "| Location " msgstr "| Localização" @@ -214614,6 +215568,10 @@ msgstr "" msgid "Peckish" msgstr "" +#: src/player.cpp +msgid "Pain " +msgstr "" + #: src/player_activity.cpp msgid "You pause for a moment to catch your breath." msgstr "" @@ -215814,7 +216772,7 @@ msgstr "" #: src/ranged.cpp #, c-format msgid "Really attack %s?" -msgstr "" +msgstr "Realmente atacar %s?" #: src/ranged.cpp #, c-format @@ -216084,6 +217042,10 @@ msgstr "P / B" msgid "Safe Mode enabled:" msgstr "Modo seguro ativado:" +#: src/safemode_ui.cpp +msgid "Please load a character first to use this page!" +msgstr "Por favor, carregue um personagem primeiro para usar esta página!" + #: src/safemode_ui.cpp msgid "Safe Mode manager currently inactive." msgstr "Gerenciador de modo de segurança atualmente inativo." @@ -217471,7 +218433,7 @@ msgstr "Quem" #: src/veh_interact.cpp #, c-format msgid "Faulty %1$s" -msgstr "" +msgstr "%1$s defeituoso" #: src/veh_interact.cpp msgid "'{' to scroll up" @@ -218919,6 +219881,10 @@ msgid "" "door." msgstr "" +#: src/vehicle_use.cpp +msgid "The autoclave is empty, there's no point in starting it." +msgstr "" + #: src/vehicle_use.cpp #, c-format msgid "" @@ -218945,6 +219911,10 @@ msgid "" "its lid." msgstr "Você desliga a lavadora antes de terminar o programa e abre a tampa." +#: src/vehicle_use.cpp +msgid "The washing machine is empty, there's no point in starting it." +msgstr "" + #: src/vehicle_use.cpp #, c-format msgid "" @@ -218988,6 +219958,10 @@ msgid "" "lid." msgstr "" +#: src/vehicle_use.cpp +msgid "The dishwasher is empty, there's no point in starting it." +msgstr "" + #: src/vehicle_use.cpp #, c-format msgid "" diff --git a/lang/po/ru.po b/lang/po/ru.po index cc3edae714c50..628add97793d7 100644 --- a/lang/po/ru.po +++ b/lang/po/ru.po @@ -26,7 +26,7 @@ # Oleksii Filonenko , 2018 # Tymur Valiiev , 2019 # Максим <2.6makc@gmail.com>, 2019 -# Sergey Surname , 2019 +# Sergey Kolotushkin , 2019 # Jose , 2019 # Diana Seysmova , 2019 # Stepan Kashuba , 2019 @@ -37,35 +37,37 @@ # Timofey Kostenko , 2019 # Валентин Литовченко , 2019 # flin4 , 2019 -# Александр , 2019 # d1909449b5a6b5b275919a9512c8e7ef, 2019 # Darketed , 2019 # AndyProhor , 2019 # Victor_U , 2019 # Даниил Шаверов , 2019 # Eila Attwood , 2019 -# Brett Dong , 2019 # Zhar the Mad , 2019 # Gamp Forest, 2019 # Михаил Семенчин , 2019 # Alexey Mostovoy , 2019 # Jin Velddrinn, 2019 # korick3 korick3 , 2019 -# Vlasov Vitaly , 2019 # WX , 2019 # Darkon Rabbit, 2019 # Arex , 2019 -# Midas , 2019 # Fran faов , 2019 +# Александр , 2019 # Антон Бурмистров <22.valiant@gmail.com>, 2019 +# Vlasov Vitaly , 2019 +# Brett Dong , 2019 +# Artem Baranov , 2019 +# Chor Hung , 2019 +# Midas , 2019 # msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.D\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-16 17:39+0800\n" +"POT-Creation-Date: 2019-08-23 23:11+0800\n" "PO-Revision-Date: 2018-04-26 14:47+0000\n" -"Last-Translator: Антон Бурмистров <22.valiant@gmail.com>, 2019\n" +"Last-Translator: Midas , 2019\n" "Language-Team: Russian (https://www.transifex.com/cataclysm-dda-translators/teams/2217/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -486,27 +488,6 @@ msgstr "" "Медный металлолом. Можно использовать для изготовления чего-либо, например, " "самодельных патронов для дробовика." -#: lang/json/AMMO_from_json.py -msgid "solder" -msgstr "припой" - -#. ~ Description for solder -#: lang/json/AMMO_from_json.py -msgid "" -"A small spool of solder, able to be used in ammunition and electronics." -msgstr "" -"Небольшая катушка припоя. Может быть использована для изготовления " -"боеприпасов и в электронике." - -#: lang/json/AMMO_from_json.py -msgid "tin" -msgstr "олово" - -#. ~ Description for tin -#: lang/json/AMMO_from_json.py -msgid "Tin and pewter scraps. Usable in making ammo." -msgstr "Кусочки олова. Можно использовать для изготовления боеприпасов." - #: lang/json/AMMO_from_json.py msgid "medical tape" msgstr "лейкопластырь" @@ -525,6 +506,34 @@ msgstr "ракета PG-7VL 93 мм" msgid "93mm single-stage high-explosive ammunition for the RPG-7." msgstr "93-мм одноступенчатый фугасный боеприпас для РПГ-7." +#: lang/json/AMMO_from_json.py +msgid "PG-7VR 64mm/105mm rocket" +msgstr "ракета PG-7VL 64 мм/105 мм" + +#. ~ Description for PG-7VR 64mm/105mm rocket +#: lang/json/AMMO_from_json.py +msgid "64mm/105mm high-explosive tandem ammunition for the RPG-7." +msgstr "Фугасный тандемный 64 мм/105 мм боеприпас для РПГ-7." + +#: lang/json/AMMO_from_json.py +msgid "TBG-7V 105mm rocket" +msgstr "ракета TBG-7V 105 мм" + +#. ~ Description for TBG-7V 105mm rocket +#: lang/json/AMMO_from_json.py +msgid "105mm thermobaric ammunition for the RPG-7." +msgstr "105 мм термобарический боеприпас для РПГ-7." + +#: lang/json/AMMO_from_json.py +msgid "OG-7V 40mm rocket" +msgstr "ракета OG-7V 40 мм" + +#. ~ Description for OG-7V 40mm rocket +#: lang/json/AMMO_from_json.py +msgid "" +"40mm high-explosive fragmentation antipersonnel ammunition for the RPG-7." +msgstr "Фугасный осколочный противопехотный 40 мм боеприпас для РПГ-7." + #: lang/json/AMMO_from_json.py msgid "M235 66mm TPA rocket" msgstr "ракета M235 TPA 66 мм" @@ -2642,32 +2651,28 @@ msgstr ".300 AAC Blackout" #. ~ Description for .300 AAC Blackout #: lang/json/AMMO_from_json.py msgid "" -".300 AAC Blackout is an intermediate cartridge that achieves ballistics " -"similar to the 7.62x39 but allows use on the AR-15 platform. The round is " -"necked-up from the 5.56mm NATO, but feeds from a STANAG magazine. It " -"requires a specific barrel, so will not work in a standard M4 or similar " -"carbine. This loading is supersonic." +"A .300 AAC Blackout round with a 125gr open tip match bullet. 300 BLK is an" +" intermediate cartridge necked up from 5.56x45mm, designed to achieve " +"similar ballistics to 7.62x39mm. It is compatible with standard AR-15 lower" +" receivers and will feed from STANAG magazines." msgstr "" -".300 AAC Blackout - промежуточный патрон с баллистическими свойствами, " -"подобными 7.62x39, однако пригодный для платформы AR-15. Патрон происходит " -"от суженного 5.56 мм НАТО и подходит к магазину STANAG. Для него требуется " -"особый ствол, так что им нельзя зарядить стандартную М4 или похожий карабин." -" Этот патрон сверхзвуковой." +"Патрон .300 AAC Blackout с 125-грановой матчевой пулей с открытым кончиком. " +"Это промежуточный патрон, происходящий от суженного 5.56х45 мм, " +"разработанный для воспроизведения баллистических свойств 7.62х39 мм. Он " +"совместим со стандартными ствольными коробками AR-15 и магазинами STANAG." #. ~ Description for .300 AAC Blackout #: lang/json/AMMO_from_json.py msgid "" -".300 AAC Blackout is an intermediate cartridge that achieves ballistics " -"similar to the 7.62x39 but allows use on the AR-15 platform. The round is " -"necked-up from the 5.56mm NATO, but feeds from a STANAG magazine. It " -"requires a specific barrel, so will not work in a standard M4 or similar " -"carbine. This loading is subsonic." +"A subsonic .300 AAC Blackout round with a 220gr open tip match bullet. 300 " +"BLK is an intermediate cartridge necked up from 5.56x45mm, designed to " +"achieve similar ballistics to 7.62x39mm. It is compatible with standard " +"AR-15 lower receivers and will feed from STANAG magazines." msgstr "" -".300 AAC Blackout - промежуточный патрон с баллистическими свойствами, " -"подобными 7.62x39, однако пригодный для платформы AR-15. Патрон происходит " -"от суженного 5.56 мм НАТО и подходит к магазину STANAG. Для него требуется " -"особый ствол, так что им нельзя зарядить стандартную М4 или похожий карабин." -" Этот патрон дозвуковой." +"Дозвуковой патрон .300 AAC Blackout с 220-грановой матчевой пулей с открытым" +" кончиком. Это промежуточный патрон, происходящий от суженного 5.56х45 мм, " +"разработанный для воспроизведения баллистических свойств 7.62х39 мм. Он " +"совместим со стандартными ствольными коробками AR-15 и магазинами STANAG." #: lang/json/AMMO_from_json.py msgid "reloaded .300 AAC Blackout" @@ -4281,6 +4286,18 @@ msgstr "" " пусковой установке. Разработана для эффективного поражения техники и " "строений." +#: lang/json/AMMO_from_json.py +msgid "paralyzing barb" +msgstr "парализующий шип" + +#. ~ Description for paralyzing barb +#: lang/json/AMMO_from_json.py +msgid "" +"Tiny droplets of venom trickle out of the sponge-like tissue of this sharp " +"barb." +msgstr "" +"Острая колючка с губчатыми внутренностями, истекающими капельками яда." + #: lang/json/AMMO_from_json.py msgid "sprayable toxic gas" msgstr "распыляемый токсичный газ" @@ -4927,6 +4944,31 @@ msgstr "" "Небольшой металлический шарнир из двух металлических пластин с отверстиями " "для шурупов. Применяется для навески дверей." +#: lang/json/AMMO_from_json.py +msgid "tin powder" +msgstr "оловянный порошок" + +#. ~ Description for tin powder +#: lang/json/AMMO_from_json.py +msgid "" +"A fine gray powder composed of tin, usable for making solder and lining " +"containers to prevent corrosion." +msgstr "" +"Мелкая серая оловянная пыль, пригодная для изготовления припоя и лужения " +"ёмкостей во избежание коррозии." + +#: lang/json/AMMO_from_json.py +msgid "solder" +msgstr "припой" + +#. ~ Description for solder +#: lang/json/AMMO_from_json.py +msgid "" +"A small spool of solder, able to be used in ammunition and electronics." +msgstr "" +"Небольшая катушка припоя. Может быть использована для изготовления " +"боеприпасов и в электронике." + #: lang/json/AMMO_from_json.py msgid "incendiary" msgid_plural "incendiaries" @@ -6886,50 +6928,6 @@ msgstr[3] "баскетбольные шорты" msgid "A pair of basketball shorts. Comfortable and light." msgstr "Баскетбольные шорты. Удобные и лёгкие." -#: lang/json/ARMOR_from_json.py -msgid "backpack" -msgid_plural "backpacks" -msgstr[0] "рюкзак" -msgstr[1] "рюкзака" -msgstr[2] "рюкзаков" -msgstr[3] "рюкзак" - -#. ~ Description for backpack -#: lang/json/ARMOR_from_json.py -msgid "A small backpack. Good storage for a little encumbrance." -msgstr "Небольшой рюкзак. Не слишком тяжёлый и довольно вместительный." - -#: lang/json/ARMOR_from_json.py -msgid "giant novelty backpack" -msgid_plural "giant novelty backpacks" -msgstr[0] "гигантский инновационный рюкзак" -msgstr[1] "гигантских инновационных рюкзака" -msgstr[2] "гигантских инновационных рюкзаков" -msgstr[3] "гигантский инновационный рюкзак" - -#. ~ Description for giant novelty backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A huge fabric backpack made mostly as a joke before the cataclysm. Now, " -"it's still rather silly, but it can store a lot of stuff." -msgstr "" -"Огромный тканевый рюкзак, сделанный перед катаклизмом в основном шутки ради." -" Он всё ещё довольно нелепый, но может хранить много вещей." - -#: lang/json/ARMOR_from_json.py -msgid "leather backpack" -msgid_plural "leather backpacks" -msgstr[0] "кожаный рюкзак" -msgstr[1] "кожаных рюкзака" -msgstr[2] "кожаных рюкзаков" -msgstr[3] "кожаный рюкзак" - -#. ~ Description for leather backpack -#: lang/json/ARMOR_from_json.py -msgid "A small leather backpack. Good storage for a little encumbrance." -msgstr "" -"Небольшой кожаный рюкзак. Не слишком тяжёлый и довольно вместительный." - #: lang/json/ARMOR_from_json.py msgid "balaclava" msgid_plural "balaclavas" @@ -6957,8 +6955,8 @@ msgstr[3] "перевязи" #. ~ Use action holster_msg for scabbard. #. ~ Use action holster_msg for sheath. #. ~ Use action holster_msg for survivor belt. -#. ~ Use action holster_msg for hiking backpack. #. ~ Use action holster_msg for survivor utility belt. +#. ~ Use action holster_msg for hiking backpack. #. ~ Use action holster_msg for pair of boots. #. ~ Use action holster_msg for pair of bone armor boots. #. ~ Use action holster_msg for pair of turnout boots. @@ -6983,7 +6981,8 @@ msgstr[3] "перевязи" #. ~ Use action holster_msg for pair of rollerblades. #. ~ Use action holster_msg for pair of rollerskates. #. ~ Use action holster_msg for C.R.I.T web belt. -#: lang/json/ARMOR_from_json.py +#. ~ Use action holster_msg for hollow cane. +#: lang/json/ARMOR_from_json.py lang/json/GENERIC_from_json.py #, no-python-format msgid "You sheath your %s" msgstr "Вы убираете %s." @@ -6991,7 +6990,9 @@ msgstr "Вы убираете %s." #. ~ Use action holster_prompt for baldric. #. ~ Use action holster_prompt for back scabbard. #. ~ Use action holster_prompt for scabbard. -#: lang/json/ARMOR_from_json.py +#. ~ Use action holster_prompt for hollow cane. +#: lang/json/ARMOR_from_json.py lang/json/ARMOR_from_json.py +#: lang/json/GENERIC_from_json.py msgid "Sheath sword" msgstr "Вложить меч в ножны" @@ -8156,19 +8157,6 @@ msgstr "" "Костюм, покрывающий всё тело. Выполнен в форме человекоподобного динозавра. " "Громоздкий и почти без карманов, но в нём очень тепло." -#: lang/json/ARMOR_from_json.py -msgid "dive bag" -msgid_plural "dive bags" -msgstr[0] "сумка ныряльщика" -msgstr[1] "сумки ныряльщика" -msgstr[2] "сумок ныряльщика" -msgstr[3] "сумка ныряльщика" - -#. ~ Description for dive bag -#: lang/json/ARMOR_from_json.py -msgid "A lightweight mesh backpack, commonly worn by swimmers and divers." -msgstr "Лёгкий рюкзак, обычно используемый пловцами и ныряльщиками." - #: lang/json/ARMOR_from_json.py msgid "down-filled blanket" msgid_plural "down-filled blankets" @@ -8262,22 +8250,6 @@ msgstr[3] "свадебное платье" msgid "A beautiful white wedding dress. What good will it be now?" msgstr "Прекрасное белое свадебное платье. На что оно теперь сгодится?" -#: lang/json/ARMOR_from_json.py -msgid "duffel bag" -msgid_plural "duffel bags" -msgstr[0] "вещмешок" -msgstr[1] "вещмешка" -msgstr[2] "вещмешков" -msgstr[3] "вещмешок" - -#. ~ Description for duffel bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A huge duffel bag. Provides plenty of storage, but is severely encumbering." -msgstr "" -"Большой вещевой мешок. В нём много свободного места, но он значительно " -"увеличивает скованность." - #: lang/json/ARMOR_from_json.py msgid "tactical dump pouch" msgid_plural "tactical dump pouches" @@ -10496,21 +10468,6 @@ msgstr "" "Длинные струящиеся одежды. Просто и удобно носить. Обязательно драматично " "сорвите их перед сражением!" -#: lang/json/ARMOR_from_json.py -msgid "jerrypack" -msgid_plural "jerrypacks" -msgstr[0] "рюкзак-канистра" -msgstr[1] "рюкзака-канистры" -msgstr[2] "рюкзаков-канистр" -msgstr[3] "рюкзак-канистра" - -#. ~ Description for jerrypack -#: lang/json/ARMOR_from_json.py -msgid "A jerrycan modified to be worn in a similar manner to a backpack." -msgstr "" -"Канистра, модифицированная таким образом, чтобы её можно было носить как " -"рюкзак." - #: lang/json/ARMOR_from_json.py msgid "sports jersey" msgid_plural "sports jerseys" @@ -11539,37 +11496,6 @@ msgstr[3] "шляпка французских горничных" msgid "A frilly white headpiece." msgstr "Вычурная белая шляпка" -#: lang/json/ARMOR_from_json.py -msgid "makeshift knapsack" -msgid_plural "makeshift knapsacks" -msgstr[0] "самодельный заплечный мешок" -msgstr[1] "самодельных заплечных мешка" -msgstr[2] "самодельных заплечных мешков" -msgstr[3] "самодельный заплечный мешок" - -#. ~ Description for makeshift knapsack -#: lang/json/ARMOR_from_json.py -msgid "" -"A pair of pants with the bottom ends tied with string, and then passed " -"through the belt loops so the knapsack can be carried on the back." -msgstr "" -"Пара штанов, концы которых завязаны верёвкой. Затем верёвку пропускают через" -" ременные петли таким образом, чтобы мешок можно было носить за спиной." - -#: lang/json/ARMOR_from_json.py -msgid "makeshift sling" -msgid_plural "makeshift slings" -msgstr[0] "самодельная перевязь" -msgstr[1] "самодельных перевязи" -msgstr[2] "самодельных перевязей" -msgstr[3] "самодельная перевязь" - -#. ~ Description for makeshift sling -#: lang/json/ARMOR_from_json.py -msgid "A large sheet tied into a crude, over-the-shoulder sling." -msgstr "" -"Большой кусок ткани, связанный в грубую перевязь для ношения через плечо." - #: lang/json/ARMOR_from_json.py msgid "ballistic mask" msgid_plural "ballistic masks" @@ -11651,19 +11577,6 @@ msgstr "" "Это футболка с рукавами, связанными за спиной. Обычно её носят бунтовщики " "для сокрытия своей личности." -#: lang/json/ARMOR_from_json.py -msgid "messenger bag" -msgid_plural "messenger bags" -msgstr[0] "сумка" -msgstr[1] "сумки" -msgstr[2] "сумок" -msgstr[3] "сумка" - -#. ~ Description for messenger bag -#: lang/json/ARMOR_from_json.py -msgid "Light and easy to wear, but doesn't offer much storage." -msgstr "Небольшая и лёгкая сумка, но много вещей в неё не засунуть." - #: lang/json/ARMOR_from_json.py msgid "pair of mittens" msgid_plural "pairs of mittens" @@ -11678,24 +11591,6 @@ msgid "A pair of warm mittens. They are extremely cumbersome." msgstr "" "Пара тёплых варежек. Сделать что-либо с варежками на руках очень непросто." -#: lang/json/ARMOR_from_json.py -msgid "MOLLE pack" -msgid_plural "MOLLE packs" -msgstr[0] "рюкзак MOLLE" -msgstr[1] "рюкзака MOLLE" -msgstr[2] "рюкзаков MOLLE" -msgstr[3] "рюкзак MOLLE" - -#. ~ Description for MOLLE pack -#: lang/json/ARMOR_from_json.py -msgid "" -"The Modular Lightweight Load-carrying Equipment is an advanced military " -"backpack. Covered with pockets and straps, it strikes a fine balance " -"between storage space and encumbrance." -msgstr "" -"Лёгкий военный рюкзак продвинутого модульного типа. Весь увешан карманами и " -"ремнями. Прекрасный баланс между местом для хранения и скованностью." - #: lang/json/ARMOR_from_json.py msgid "motorcycle armor" msgid_plural "motorcycle armors" @@ -12224,19 +12119,6 @@ msgstr "" "Шлем, сделанный из суповой кастрюли. Защищает не сильно, но лучше, чем " "ничего." -#: lang/json/ARMOR_from_json.py -msgid "purse" -msgid_plural "purses" -msgstr[0] "сумочка" -msgstr[1] "сумочки" -msgstr[2] "сумочек" -msgstr[3] "сумочка" - -#. ~ Description for purse -#: lang/json/ARMOR_from_json.py -msgid "A bit cumbersome to wear, but provides some storage." -msgstr "Не совсем удобная для ношения, зато даёт немного места для вещей." - #: lang/json/ARMOR_from_json.py msgid "quiver" msgid_plural "quivers" @@ -12341,36 +12223,6 @@ msgstr "" "Свободная верхняя одежда с рукавами и неизвестным числом хорошо спрятанных " "карманов." -#: lang/json/ARMOR_from_json.py -msgid "military rucksack" -msgid_plural "military rucksacks" -msgstr[0] "военный рюкзак" -msgstr[1] "военных рюкзака" -msgstr[2] "военных рюкзаков" -msgstr[3] "военный рюкзак" - -#. ~ Description for military rucksack -#: lang/json/ARMOR_from_json.py -msgid "A huge military rucksack, provides a lot of storage." -msgstr "Огромный рюкзак военного образца, очень вместительный." - -#: lang/json/ARMOR_from_json.py -msgid "runner pack" -msgid_plural "runner packs" -msgstr[0] "рюкзак бегуна" -msgstr[1] "рюкзака бегуна" -msgstr[2] "рюкзаков бегуна" -msgstr[3] "рюкзак бегуна" - -#. ~ Description for runner pack -#: lang/json/ARMOR_from_json.py -msgid "" -"The obvious choice for outdoor athletes, this ergonomic backpack is light " -"and easy to wear, ensuring comfort when carrying heavy and bulky items." -msgstr "" -"Очевидный выбор для спорта на природе. Это лёгкий, удобный, эргономичный " -"рюкзак, в котором можно переносить тяжёлые и громоздкие предметы." - #: lang/json/ARMOR_from_json.py msgid "scabbard" msgid_plural "scabbards" @@ -12834,23 +12686,6 @@ msgstr[3] "туника без рукавов" msgid "A sleeveless cloth garment that covers the torso and legs." msgstr "Тканевое одеяние без рукавов, прикрывающее торс и ноги." -#: lang/json/ARMOR_from_json.py -msgid "sling pack" -msgid_plural "sling packs" -msgstr[0] "однолямочный ранец" -msgstr[1] "однолямочных ранца" -msgstr[2] "однолямочных ранцев" -msgstr[3] "однолямочный ранец" - -#. ~ Description for sling pack -#: lang/json/ARMOR_from_json.py -msgid "" -"A simple single-sling backpack. Easier to access than a normal backpack, " -"but can't comfortably hold as much." -msgstr "" -"Простой ранец с одной лямкой. Не такой обременительный, как обычный рюкзак, " -"но и вмещает не так много." - #: lang/json/ARMOR_from_json.py msgid "snuggie" msgid_plural "snuggies" @@ -13183,8 +13018,8 @@ msgstr[2] "поясов выживальщика" msgstr[3] "пояс выживальщика" #. ~ Use action holster_prompt for survivor belt. -#. ~ Use action holster_prompt for hiking backpack. #. ~ Use action holster_prompt for survivor utility belt. +#. ~ Use action holster_prompt for hiking backpack. #. ~ Use action holster_prompt for C.R.I.T web belt. #: lang/json/ARMOR_from_json.py msgid "Sheath blade" @@ -13202,23 +13037,6 @@ msgstr "" "тщательно обработанный для удобства ношения. Активируйте, чтобы " "вложить/обнажить оружие." -#: lang/json/ARMOR_from_json.py -msgid "survivor duffel bag" -msgid_plural "survivor duffel bags" -msgstr[0] "вещмешок выживальщика" -msgstr[1] "вещмешка выживальщика" -msgstr[2] "вещмешков выживальщика" -msgstr[3] "вещмешок выживальщика" - -#. ~ Description for survivor duffel bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built heavy duffel bag. Durable and carefully crafted to hold as " -"much stuff as possible." -msgstr "" -"Специально спроектированный тяжёлый вещевой мешок. Сделан, чтобы носить как " -"можно больше вещей, прочный." - #: lang/json/ARMOR_from_json.py msgid "survivor goggles" msgid_plural "pairs of survivor goggles" @@ -13237,57 +13055,6 @@ msgstr "" "Удобные и долговечные, они обеспечивают отличную защиту от опасностей " "окружающей среды." -#: lang/json/ARMOR_from_json.py -msgid "survivor backpack" -msgid_plural "survivor backpacks" -msgstr[0] "ранец выживальщика" -msgstr[1] "ранца выживальщика" -msgstr[2] "ранцев выживальщика" -msgstr[3] "ранец выживальщика" - -#. ~ Description for survivor backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built backpack. Durable and carefully crafted to hold as much " -"stuff as possible." -msgstr "" -"Специально спроектированный рюкзак. Сделан, чтобы носить как можно больше " -"вещей, прочный." - -#: lang/json/ARMOR_from_json.py -msgid "survivor rucksack" -msgid_plural "survivor rucksacks" -msgstr[0] "рюкзак выживальщика" -msgstr[1] "рюкзака выживальщика" -msgstr[2] "рюкзаков выживальщика" -msgstr[3] "рюкзак выживальщика" - -#. ~ Description for survivor rucksack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built heavy backpack. Durable and carefully crafted to hold as " -"much stuff as possible." -msgstr "" -"Специально спроектированный тяжёлый рюкзак. Сделан, чтобы носить как можно " -"больше вещей, прочный." - -#: lang/json/ARMOR_from_json.py -msgid "survivor runner pack" -msgid_plural "survivor runner packs" -msgstr[0] "беговой рюкзак выживальщика" -msgstr[1] "беговых рюкзака выживальщика" -msgstr[2] "беговых рюкзаков выживальщика" -msgstr[3] "беговой рюкзак выживальщика" - -#. ~ Description for survivor runner pack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built lightweight runner pack. Durable and carefully crafted to " -"hold as much stuff as possible." -msgstr "" -"Специально спроектированный лёгкий рюкзак для бега. Сделан, чтобы носить как" -" можно больше вещей, прочный." - #: lang/json/ARMOR_from_json.py msgid "survivor suit" msgid_plural "survivor suits" @@ -14415,35 +14182,6 @@ msgstr "" "гольфа, но в том, что гольфисты носят этот головной убор, уверены на сто " "процентов." -#: lang/json/ARMOR_from_json.py -msgid "golf bag" -msgid_plural "golf bags" -msgstr[0] "сумка для гольфа" -msgstr[1] "сумки для гольфа" -msgstr[2] "сумок для гольфа" -msgstr[3] "сумка для гольфа" - -#. ~ Use action holster_msg for golf bag. -#: lang/json/ARMOR_from_json.py -#, no-python-format -msgid "You awkwardly sheath your %s" -msgstr "Вы неловко убираете %s." - -#. ~ Use action holster_prompt for golf bag. -#: lang/json/ARMOR_from_json.py -msgid "Sheath golf club" -msgstr "Убрать клюшку для гольфа" - -#. ~ Description for golf bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A tall canvas and plastic bag with fold-out legs used for golfing. It even " -"has straps to be worn on the back." -msgstr "" -"Длинная сумка из ткани и пластика с выдвижными ножками, в которой обычно " -"переносят клюшки для гольфа. У неё есть лямки, чтобы можно было носить на " -"спине." - #: lang/json/ARMOR_from_json.py msgid "javelin bag" msgid_plural "javelin bags" @@ -14564,80 +14302,6 @@ msgstr "" "Пластиковое полотно с несколькими кольцами для закрепления при помощи " "верёвки или шнура. Пригодится как самодельная защита от дождя." -#: lang/json/ARMOR_from_json.py -msgid "high-volume rucksack" -msgid_plural "high-volume rucksacks" -msgstr[0] "вместительный рюкзак" -msgstr[1] "вместительных рюкзака" -msgstr[2] "вместительных рюкзаков" -msgstr[3] "вместительные рюкзаки" - -#. ~ Description for high-volume rucksack -#: lang/json/ARMOR_from_json.py -msgid "" -"Also know as a \"bigpack\", this rucksack is prized by pack rats but may " -"lead to a bad back." -msgstr "Этот рюкзак ценят барахольщики, но от него может заболеть спина." - -#: lang/json/ARMOR_from_json.py -msgid "hiking backpack" -msgid_plural "hiking backpacks" -msgstr[0] "походный рюкзак" -msgstr[1] "походных рюкзака" -msgstr[2] "походных рюкзаков" -msgstr[3] "походные рюкзаки" - -#. ~ Description for hiking backpack -#: lang/json/ARMOR_from_json.py -msgid "A large sized hiking backpack with plenty of storage space." -msgstr "Большой походный рюкзак с уймой свободного места." - -#: lang/json/ARMOR_from_json.py -msgid "petpack" -msgid_plural "petpacks" -msgstr[0] "рюкзак-переноска" -msgstr[1] "рюкзака-переноски" -msgstr[2] "рюкзаков-переносок" -msgstr[3] "рюкзаки-переноски" - -#. ~ Description for petpack -#: lang/json/ARMOR_from_json.py -msgid "" -"Before the Cataclysm this would allow your four-legged friend to see the " -"world, now it's used to shield them from the world." -msgstr "" -"До Катаклизма такой рюкзак показывал вашему четвероногому другу мир, сейчас " -"рюкзак его от мира защищает." - -#: lang/json/ARMOR_from_json.py -msgid "large tactical backpack" -msgid_plural "large tactical backpacks" -msgstr[0] "большой тактический рюкзак" -msgstr[1] "больших тактических рюкзака" -msgstr[2] "больших тактических рюкзаков" -msgstr[3] "большие тактические рюкзаки" - -#. ~ Description for large tactical backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A large tactical multi-compartment backpack that has great lower back " -"support." -msgstr "" -"Большой тактический рюкзак с несколькими отсеками и с поддержкой поясницы." - -#: lang/json/ARMOR_from_json.py -msgid "travelpack" -msgid_plural "travelpacks" -msgstr[0] "дорожный рюкзак" -msgstr[1] "дорожных рюкзака" -msgstr[2] "дорожных рюкзаков" -msgstr[3] "дорожные рюкзаки" - -#. ~ Description for travelpack -#: lang/json/ARMOR_from_json.py -msgid "A hiking pack used for short trips." -msgstr "Походный рюкзак для коротких путешествий." - #: lang/json/ARMOR_from_json.py msgid "survivor utility belt" msgid_plural "survivor utility belts" @@ -14909,6 +14573,387 @@ msgstr "" "Огромный бронежилет, изготовленный вручную по подобию обычных пулестойких " "бронежилетов. Содержит четыре кармана для хранения магазинов." +#: lang/json/ARMOR_from_json.py +msgid "backpack" +msgid_plural "backpacks" +msgstr[0] "рюкзак" +msgstr[1] "рюкзака" +msgstr[2] "рюкзаков" +msgstr[3] "рюкзак" + +#. ~ Description for backpack +#: lang/json/ARMOR_from_json.py +msgid "A small backpack. Good storage for a little encumbrance." +msgstr "Небольшой рюкзак. Не слишком тяжёлый и довольно вместительный." + +#: lang/json/ARMOR_from_json.py +msgid "hiking backpack" +msgid_plural "hiking backpacks" +msgstr[0] "походный рюкзак" +msgstr[1] "походных рюкзака" +msgstr[2] "походных рюкзаков" +msgstr[3] "походные рюкзаки" + +#. ~ Description for hiking backpack +#: lang/json/ARMOR_from_json.py +msgid "A large sized hiking backpack with plenty of storage space." +msgstr "Большой походный рюкзак с уймой свободного места." + +#: lang/json/ARMOR_from_json.py +msgid "giant novelty backpack" +msgid_plural "giant novelty backpacks" +msgstr[0] "гигантский инновационный рюкзак" +msgstr[1] "гигантских инновационных рюкзака" +msgstr[2] "гигантских инновационных рюкзаков" +msgstr[3] "гигантский инновационный рюкзак" + +#. ~ Description for giant novelty backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A huge fabric backpack made mostly as a joke before the cataclysm. Now, " +"it's still rather silly, but it can store a lot of stuff." +msgstr "" +"Огромный тканевый рюкзак, сделанный перед катаклизмом в основном шутки ради." +" Он всё ещё довольно нелепый, но может хранить много вещей." + +#: lang/json/ARMOR_from_json.py +msgid "leather backpack" +msgid_plural "leather backpacks" +msgstr[0] "кожаный рюкзак" +msgstr[1] "кожаных рюкзака" +msgstr[2] "кожаных рюкзаков" +msgstr[3] "кожаный рюкзак" + +#. ~ Description for leather backpack +#: lang/json/ARMOR_from_json.py +msgid "A small leather backpack. Good storage for a little encumbrance." +msgstr "" +"Небольшой кожаный рюкзак. Не слишком тяжёлый и довольно вместительный." + +#: lang/json/ARMOR_from_json.py +msgid "large tactical backpack" +msgid_plural "large tactical backpacks" +msgstr[0] "большой тактический рюкзак" +msgstr[1] "больших тактических рюкзака" +msgstr[2] "больших тактических рюкзаков" +msgstr[3] "большие тактические рюкзаки" + +#. ~ Description for large tactical backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A large tactical multi-compartment backpack that has great lower back " +"support." +msgstr "" +"Большой тактический рюкзак с несколькими отсеками и с поддержкой поясницы." + +#: lang/json/ARMOR_from_json.py +msgid "high-volume rucksack" +msgid_plural "high-volume rucksacks" +msgstr[0] "вместительный рюкзак" +msgstr[1] "вместительных рюкзака" +msgstr[2] "вместительных рюкзаков" +msgstr[3] "вместительные рюкзаки" + +#. ~ Description for high-volume rucksack +#: lang/json/ARMOR_from_json.py +msgid "" +"Also know as a \"bigpack\", this rucksack is prized by pack rats but may " +"lead to a bad back." +msgstr "Этот рюкзак ценят барахольщики, но от него может заболеть спина." + +#: lang/json/ARMOR_from_json.py +msgid "dive bag" +msgid_plural "dive bags" +msgstr[0] "сумка ныряльщика" +msgstr[1] "сумки ныряльщика" +msgstr[2] "сумок ныряльщика" +msgstr[3] "сумка ныряльщика" + +#. ~ Description for dive bag +#: lang/json/ARMOR_from_json.py +msgid "A lightweight mesh backpack, commonly worn by swimmers and divers." +msgstr "Лёгкий рюкзак, обычно используемый пловцами и ныряльщиками." + +#: lang/json/ARMOR_from_json.py +msgid "duffel bag" +msgid_plural "duffel bags" +msgstr[0] "вещмешок" +msgstr[1] "вещмешка" +msgstr[2] "вещмешков" +msgstr[3] "вещмешок" + +#. ~ Description for duffel bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A huge duffel bag. Provides plenty of storage, but is severely encumbering." +msgstr "" +"Большой вещевой мешок. В нём много свободного места, но он значительно " +"увеличивает скованность." + +#: lang/json/ARMOR_from_json.py +msgid "petpack" +msgid_plural "petpacks" +msgstr[0] "рюкзак-переноска" +msgstr[1] "рюкзака-переноски" +msgstr[2] "рюкзаков-переносок" +msgstr[3] "рюкзаки-переноски" + +#. ~ Description for petpack +#: lang/json/ARMOR_from_json.py +msgid "" +"Before the Cataclysm this would allow your four-legged friend to see the " +"world, now it's used to shield them from the world." +msgstr "" +"До Катаклизма такой рюкзак показывал вашему четвероногому другу мир, сейчас " +"рюкзак его от мира защищает." + +#: lang/json/ARMOR_from_json.py +msgid "jerrypack" +msgid_plural "jerrypacks" +msgstr[0] "рюкзак-канистра" +msgstr[1] "рюкзака-канистры" +msgstr[2] "рюкзаков-канистр" +msgstr[3] "рюкзак-канистра" + +#. ~ Description for jerrypack +#: lang/json/ARMOR_from_json.py +msgid "A jerrycan modified to be worn in a similar manner to a backpack." +msgstr "" +"Канистра, модифицированная таким образом, чтобы её можно было носить как " +"рюкзак." + +#: lang/json/ARMOR_from_json.py +msgid "makeshift knapsack" +msgid_plural "makeshift knapsacks" +msgstr[0] "самодельный заплечный мешок" +msgstr[1] "самодельных заплечных мешка" +msgstr[2] "самодельных заплечных мешков" +msgstr[3] "самодельный заплечный мешок" + +#. ~ Description for makeshift knapsack +#: lang/json/ARMOR_from_json.py +msgid "" +"A pair of pants with the bottom ends tied with string, and then passed " +"through the belt loops so the knapsack can be carried on the back." +msgstr "" +"Пара штанов, концы которых завязаны верёвкой. Затем верёвку пропускают через" +" ременные петли таким образом, чтобы мешок можно было носить за спиной." + +#: lang/json/ARMOR_from_json.py +msgid "makeshift sling" +msgid_plural "makeshift slings" +msgstr[0] "самодельная перевязь" +msgstr[1] "самодельных перевязи" +msgstr[2] "самодельных перевязей" +msgstr[3] "самодельная перевязь" + +#. ~ Description for makeshift sling +#: lang/json/ARMOR_from_json.py +msgid "A large sheet tied into a crude, over-the-shoulder sling." +msgstr "" +"Большой кусок ткани, связанный в грубую перевязь для ношения через плечо." + +#: lang/json/ARMOR_from_json.py +msgid "messenger bag" +msgid_plural "messenger bags" +msgstr[0] "сумка" +msgstr[1] "сумки" +msgstr[2] "сумок" +msgstr[3] "сумка" + +#. ~ Description for messenger bag +#: lang/json/ARMOR_from_json.py +msgid "Light and easy to wear, but doesn't offer much storage." +msgstr "Небольшая и лёгкая сумка, но много вещей в неё не засунуть." + +#: lang/json/ARMOR_from_json.py +msgid "MOLLE pack" +msgid_plural "MOLLE packs" +msgstr[0] "рюкзак MOLLE" +msgstr[1] "рюкзака MOLLE" +msgstr[2] "рюкзаков MOLLE" +msgstr[3] "рюкзак MOLLE" + +#. ~ Description for MOLLE pack +#: lang/json/ARMOR_from_json.py +msgid "" +"The Modular Lightweight Load-carrying Equipment is an advanced military " +"backpack. Covered with pockets and straps, it strikes a fine balance " +"between storage space and encumbrance." +msgstr "" +"Лёгкий военный рюкзак продвинутого модульного типа. Весь увешан карманами и " +"ремнями. Прекрасный баланс между местом для хранения и скованностью." + +#: lang/json/ARMOR_from_json.py +msgid "purse" +msgid_plural "purses" +msgstr[0] "сумочка" +msgstr[1] "сумочки" +msgstr[2] "сумочек" +msgstr[3] "сумочка" + +#. ~ Description for purse +#: lang/json/ARMOR_from_json.py +msgid "A bit cumbersome to wear, but provides some storage." +msgstr "Не совсем удобная для ношения, зато даёт немного места для вещей." + +#: lang/json/ARMOR_from_json.py +msgid "military rucksack" +msgid_plural "military rucksacks" +msgstr[0] "военный рюкзак" +msgstr[1] "военных рюкзака" +msgstr[2] "военных рюкзаков" +msgstr[3] "военный рюкзак" + +#. ~ Description for military rucksack +#: lang/json/ARMOR_from_json.py +msgid "A huge military rucksack, provides a lot of storage." +msgstr "Огромный рюкзак военного образца, очень вместительный." + +#: lang/json/ARMOR_from_json.py +msgid "runner pack" +msgid_plural "runner packs" +msgstr[0] "рюкзак бегуна" +msgstr[1] "рюкзака бегуна" +msgstr[2] "рюкзаков бегуна" +msgstr[3] "рюкзак бегуна" + +#. ~ Description for runner pack +#: lang/json/ARMOR_from_json.py +msgid "" +"The obvious choice for outdoor athletes, this ergonomic backpack is light " +"and easy to wear, ensuring comfort when carrying heavy and bulky items." +msgstr "" +"Очевидный выбор для спорта на природе. Это лёгкий, удобный, эргономичный " +"рюкзак, в котором можно переносить тяжёлые и громоздкие предметы." + +#: lang/json/ARMOR_from_json.py +msgid "sling pack" +msgid_plural "sling packs" +msgstr[0] "однолямочный ранец" +msgstr[1] "однолямочных ранца" +msgstr[2] "однолямочных ранцев" +msgstr[3] "однолямочный ранец" + +#. ~ Description for sling pack +#: lang/json/ARMOR_from_json.py +msgid "" +"A simple single-sling backpack. Easier to access than a normal backpack, " +"but can't comfortably hold as much." +msgstr "" +"Простой ранец с одной лямкой. Не такой обременительный, как обычный рюкзак, " +"но и вмещает не так много." + +#: lang/json/ARMOR_from_json.py +msgid "survivor duffel bag" +msgid_plural "survivor duffel bags" +msgstr[0] "вещмешок выживальщика" +msgstr[1] "вещмешка выживальщика" +msgstr[2] "вещмешков выживальщика" +msgstr[3] "вещмешок выживальщика" + +#. ~ Description for survivor duffel bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built heavy duffel bag. Durable and carefully crafted to hold as " +"much stuff as possible." +msgstr "" +"Специально спроектированный тяжёлый вещевой мешок. Сделан, чтобы носить как " +"можно больше вещей, прочный." + +#: lang/json/ARMOR_from_json.py +msgid "survivor backpack" +msgid_plural "survivor backpacks" +msgstr[0] "ранец выживальщика" +msgstr[1] "ранца выживальщика" +msgstr[2] "ранцев выживальщика" +msgstr[3] "ранец выживальщика" + +#. ~ Description for survivor backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built backpack. Durable and carefully crafted to hold as much " +"stuff as possible." +msgstr "" +"Специально спроектированный рюкзак. Сделан, чтобы носить как можно больше " +"вещей, прочный." + +#: lang/json/ARMOR_from_json.py +msgid "survivor rucksack" +msgid_plural "survivor rucksacks" +msgstr[0] "рюкзак выживальщика" +msgstr[1] "рюкзака выживальщика" +msgstr[2] "рюкзаков выживальщика" +msgstr[3] "рюкзак выживальщика" + +#. ~ Description for survivor rucksack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built heavy backpack. Durable and carefully crafted to hold as " +"much stuff as possible." +msgstr "" +"Специально спроектированный тяжёлый рюкзак. Сделан, чтобы носить как можно " +"больше вещей, прочный." + +#: lang/json/ARMOR_from_json.py +msgid "survivor runner pack" +msgid_plural "survivor runner packs" +msgstr[0] "беговой рюкзак выживальщика" +msgstr[1] "беговых рюкзака выживальщика" +msgstr[2] "беговых рюкзаков выживальщика" +msgstr[3] "беговой рюкзак выживальщика" + +#. ~ Description for survivor runner pack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built lightweight runner pack. Durable and carefully crafted to " +"hold as much stuff as possible." +msgstr "" +"Специально спроектированный лёгкий рюкзак для бега. Сделан, чтобы носить как" +" можно больше вещей, прочный." + +#: lang/json/ARMOR_from_json.py +msgid "golf bag" +msgid_plural "golf bags" +msgstr[0] "сумка для гольфа" +msgstr[1] "сумки для гольфа" +msgstr[2] "сумок для гольфа" +msgstr[3] "сумка для гольфа" + +#. ~ Use action holster_msg for golf bag. +#: lang/json/ARMOR_from_json.py +#, no-python-format +msgid "You awkwardly sheath your %s" +msgstr "Вы неловко убираете %s." + +#. ~ Use action holster_prompt for golf bag. +#: lang/json/ARMOR_from_json.py +msgid "Sheath golf club" +msgstr "Убрать клюшку для гольфа" + +#. ~ Description for golf bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A tall canvas and plastic bag with fold-out legs used for golfing. It even " +"has straps to be worn on the back." +msgstr "" +"Длинная сумка из ткани и пластика с выдвижными ножками, в которой обычно " +"переносят клюшки для гольфа. У неё есть лямки, чтобы можно было носить на " +"спине." + +#: lang/json/ARMOR_from_json.py +msgid "travelpack" +msgid_plural "travelpacks" +msgstr[0] "дорожный рюкзак" +msgstr[1] "дорожных рюкзака" +msgstr[2] "дорожных рюкзаков" +msgstr[3] "дорожные рюкзаки" + +#. ~ Description for travelpack +#: lang/json/ARMOR_from_json.py +msgid "A hiking pack used for short trips." +msgstr "Походный рюкзак для коротких путешествий." + #: lang/json/ARMOR_from_json.py msgid "pistol bandolier" msgid_plural "pistol bandoliers" @@ -18317,16 +18362,18 @@ msgstr "" #: lang/json/ARMOR_from_json.py msgid "pair of black dragonscale boots" msgid_plural "pairs of black dragonscale boots" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "пара черных ботинок из чешуи дракона" +msgstr[1] "пар черных ботинок из чешуи дракона" +msgstr[2] "пар черных ботинок из чешуи дракона" +msgstr[3] "пар черных ботинок из чешуи дракона" #. ~ Description for pair of black dragonscale boots #: lang/json/ARMOR_from_json.py msgid "" "Boots made of black dragonscale. Very protective, and surprisingly light." msgstr "" +"Ботинки сделаны из черной чешуи дракона. Очень защищенные, и, на удивление, " +"лёгкие." #: lang/json/ARMOR_from_json.py msgid "pair of black dragonhide boots" @@ -18345,10 +18392,10 @@ msgstr "" #: lang/json/ARMOR_from_json.py msgid "black dragonscale helmet" msgid_plural "black dragonscale helmets" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "шлем из драконей чешуи" +msgstr[1] "шлемов из драконей чешуи" +msgstr[2] "черных шлемов из драконей чешуи" +msgstr[3] "черные шлемы из драконей чешуи" #. ~ Description for black dragonscale helmet #: lang/json/ARMOR_from_json.py @@ -18780,23 +18827,6 @@ msgstr "" "дополнительных затрат энергии. Останавливает пули чаще, чем мечи, а мечи " "чаще, чем тяжёлые предметы." -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Advanced Microreactor CBM" -msgid_plural "Advanced Microreactor CBMs" -msgstr[0] "КБМ: Улучшенный микрореактор" -msgstr[1] "КБМ: Улучшенный микрореактор" -msgstr[2] "КБМ: Улучшенный микрореактор" -msgstr[3] "КБМ: Улучшенный микрореактор" - -#. ~ Description for Advanced Microreactor CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"This module upgrades a pre-installed microreactor with enhanced maximum " -"yield and limited automatic radiation scrubbing capabilities." -msgstr "" -"Модуль для улучшения установленного микрореактора: увеличенный максимальный " -"выход и ограниченные возможности автоматической радиационной очистки." - #: lang/json/BIONIC_ITEM_from_json.py msgid "Alarm System CBM" msgid_plural "Alarm System CBMs" @@ -19805,23 +19835,6 @@ msgstr "" " желанию притуплять ощущения. Однако использование этого импланта может " "вызвать сонливость и снижение реакции." -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Plutonium Filter CBM" -msgid_plural "Plutonium Filter CBMs" -msgstr[0] "КБМ: Плутониевый фильтр" -msgstr[1] "КБМ: Плутониевый фильтр" -msgstr[2] "КБМ: Плутониевый фильтр" -msgstr[3] "КБМ: Плутониевый фильтр" - -#. ~ Description for Plutonium Filter CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A system of tanks and filters that are connected to a microreactor to " -"extract plutonium from radioactive slurry." -msgstr "" -"Система подключённых к микрореактору баков и фильтров для извлечения " -"плутония из радиоактивного шлама." - #: lang/json/BIONIC_ITEM_from_json.py msgid "Power Armor Interface CBM" msgid_plural "Power Armor Interface CBMs" @@ -19996,42 +20009,6 @@ msgstr "" "ногти. Наносят небольшой режущий урон в рукопашном бою, если кончики пальцев" " неприкрыты." -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Internal Microreactor CBM" -msgid_plural "Internal Microreactor CBMs" -msgstr[0] "КБМ: Встроенный микрореактор" -msgstr[1] "КБМ: Встроенный микрореактор" -msgstr[2] "КБМ: Встроенный микрореактор" -msgstr[3] "КБМ: Встроенный микрореактор" - -#. ~ Description for Internal Microreactor CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"This stripped down mini-reactor will generate impressive amounts of bionic " -"power, but may not be the safest thing to install. Once active, it cannot " -"be shut down and will slowly contaminate the user's body with radiation." -msgstr "" -"Этот упрощённый миниреактор вырабатывает впечатляющее количество бионической" -" энергии, но это не самая безопасная штука. После активации его нельзя " -"заглушить, и он будет медленно загрязнять тело радиацией." - -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Microreactor Upgrade CBM" -msgid_plural "Microreactor Upgrade CBMs" -msgstr[0] "КБМ: Улучшение микрореактора" -msgstr[1] "КБМ: Улучшение микрореактора" -msgstr[2] "КБМ: Улучшение микрореактора" -msgstr[3] "КБМ: Улучшение микрореактора" - -#. ~ Description for Microreactor Upgrade CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A kit for upgrading a pre-installed microreactor with enhanced maximum yield" -" and limited automatic radiation scrubbing capabilities." -msgstr "" -"Модуль для улучшения установленного микрореактора: увеличенный максимальный " -"выход и ограниченные возможности автоматической радиационной очистки." - #: lang/json/BIONIC_ITEM_from_json.py msgid "Recycler Unit CBM" msgid_plural "Recycler Unit CBMs" @@ -20858,6 +20835,76 @@ msgstr "" "Пространство внутри вашей брюшной полости было преобразовано в область " "хранения в объёме двух литров." +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Advanced Microreactor CBM" +msgid_plural "Advanced Microreactor CBMs" +msgstr[0] "КБМ: Улучшенный микрореактор" +msgstr[1] "КБМ: Улучшенный микрореактор" +msgstr[2] "КБМ: Улучшенный микрореактор" +msgstr[3] "КБМ: Улучшенный микрореактор" + +#. ~ Description for Advanced Microreactor CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"This module upgrades a pre-installed microreactor with enhanced maximum " +"yield and limited automatic radiation scrubbing capabilities." +msgstr "" +"Модуль для улучшения установленного микрореактора: увеличенный максимальный " +"выход и ограниченные возможности автоматической радиационной очистки." + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Plutonium Filter CBM" +msgid_plural "Plutonium Filter CBMs" +msgstr[0] "КБМ: Плутониевый фильтр" +msgstr[1] "КБМ: Плутониевый фильтр" +msgstr[2] "КБМ: Плутониевый фильтр" +msgstr[3] "КБМ: Плутониевый фильтр" + +#. ~ Description for Plutonium Filter CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A system of tanks and filters that are connected to a microreactor to " +"extract plutonium from radioactive slurry." +msgstr "" +"Система подключённых к микрореактору баков и фильтров для извлечения " +"плутония из радиоактивного шлама." + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Internal Microreactor CBM" +msgid_plural "Internal Microreactor CBMs" +msgstr[0] "КБМ: Встроенный микрореактор" +msgstr[1] "КБМ: Встроенный микрореактор" +msgstr[2] "КБМ: Встроенный микрореактор" +msgstr[3] "КБМ: Встроенный микрореактор" + +#. ~ Description for Internal Microreactor CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"This stripped down mini-reactor will generate impressive amounts of bionic " +"power, but may not be the safest thing to install. Once active, it cannot " +"be shut down and will slowly contaminate the user's body with radiation." +msgstr "" +"Этот упрощённый миниреактор вырабатывает впечатляющее количество бионической" +" энергии, но это не самая безопасная штука. После активации его нельзя " +"заглушить, и он будет медленно загрязнять тело радиацией." + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Microreactor Upgrade CBM" +msgid_plural "Microreactor Upgrade CBMs" +msgstr[0] "КБМ: Улучшение микрореактора" +msgstr[1] "КБМ: Улучшение микрореактора" +msgstr[2] "КБМ: Улучшение микрореактора" +msgstr[3] "КБМ: Улучшение микрореактора" + +#. ~ Description for Microreactor Upgrade CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A kit for upgrading a pre-installed microreactor with enhanced maximum yield" +" and limited automatic radiation scrubbing capabilities." +msgstr "" +"Модуль для улучшения установленного микрореактора: увеличенный максимальный " +"выход и ограниченные возможности автоматической радиационной очистки." + #. ~ Description for Solar Panels CBM #: lang/json/BIONIC_ITEM_from_json.py msgid "" @@ -23983,14 +24030,14 @@ msgstr "Глубокие рассуждения о морали с уклоно #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Nietzsche's \"Beyond Good and Evil\". Its cover is dog-" +"This is a copy of Nietzsche's \"Beyond Good and Evil\". Its cover is dog-" "eared and creased." msgstr "" "Экземпляр \"По ту сторону добра и зла\" Ницше в мятой и потрёпанной обложке." #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"The Unique and Its Property\" by Max Stirner. A modern " +"This is a copy of \"The Unique and Its Property\" by Max Stirner. A modern " "translation by Wolfi Landstreicher." msgstr "" "\"Единственный и его собственность\" Макс Штирнера в современном переводе " @@ -23998,7 +24045,7 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Jean-Paul Sartre's \"Being and Nothingness\". A key work " +"This is a copy of Jean-Paul Sartre's \"Being and Nothingness\". A key work " "in the existentialist tradition." msgstr "" "\"Бытие и ничто\" Жан-Поля Сартра, ключевая работа в традиции " @@ -24007,7 +24054,7 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" "A large, extended version of \"Madness and Civilisation\" by Michel " -"Foucault. The cover features a striking image of a Panopticonic Prison." +"Foucault. The cover features a striking image of a Panopticonic Prison." msgstr "" "Большое расширенное издание \"Безумия и неразумия\" Мишеля Фуко. На обложке " "красочно нарисована тюрьма-паноптикум." @@ -24020,7 +24067,7 @@ msgstr "\"Состояние Постмодерна\" Жана-Франсуа Л #: lang/json/BOOK_from_json.py msgid "" -"A collection of texts and essays by Jacques Derrida. It's pages loose and " +"A collection of texts and essays by Jacques Derrida. It's pages loose and " "yellowed, you should probably handle it with care." msgstr "" "Сборник текстов и эссе за авторством Жака Деррида. Пожелтевшие страницы едва" @@ -24028,7 +24075,7 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Society of the Spectacle\" by Guy Debord. Its cover " +"This is a copy of \"Society of the Spectacle\" by Guy Debord. Its cover " "shows rows of adults staring placidly into a screen." msgstr "" "\"Общество спектакля\" Ги Дебора. На обложке изображены ряды людей, " @@ -24042,9 +24089,9 @@ msgstr "\"Этика полового различия\" и \"Пол, котор #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Baudrillard's \"Simulation and Simulacra\". The cover " +"This is a copy of Baudrillard's \"Simulation and Simulacra\". The cover " "contains an image of a man holding a colored pill in each hand, with the " -"caption \"Welcome to the Desert of the Real.\". You think you've seen this " +"caption \"Welcome to the Desert of the Real.\". You think you've seen this " "movie." msgstr "" "\"Симулякры и симуляция\" Бодрийяра. На обложке изображён человек, держащий " @@ -24053,22 +24100,22 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a small, pocket version of Sartre's \"Existentialism and Humanism.\"" -" It looks to have been used as a coaster in a past life." +"This is a small, pocket version of Sartre's \"Existentialism and Humanism\"." +" It looks to have been used as a coaster in a past life." msgstr "" "Маленькая карманная версия \"Экзистенциализма и гуманизма\" Сартра. Похоже, " "в прошлой жизни она служила подставкой под кружку." #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Practical Ethics\" by Peter Singer. From the local " +"This is a copy of \"Practical Ethics\" by Peter Singer. From the local " "university press." msgstr "\"Практическая этика\" Питера Сингера. Отпечатано в местном университете." #: lang/json/BOOK_from_json.py msgid "" "This is a photocopied spiral-bound copy of \"Industrial Society and Its " -"Future\" by 'Freedom Club'. The original looks to have been written on a " +"Future\" by 'Freedom Club'. The original looks to have been written on a " "typewriter before being copied." msgstr "" "Отксерокопированная книга на пружинке - \"Индустриальное общество и его " @@ -24077,9 +24124,9 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Industrial Society and Its Future\" by Ted Kaczynski. " +"This is a copy of \"Industrial Society and Its Future\" by Ted Kaczynski. " "Its cover is an image of a hand-crafted wooden box filled with wiring and an" -" ominous looking metal tube. Provocative." +" ominous looking metal tube. Provocative." msgstr "" "\"Индустриальное общество и его будущее\" Теодора Казински. На обложке " "изображён грубый деревянный ящик с проводами и зловещей металлической " @@ -24091,25 +24138,25 @@ msgstr "Маленький томик диалетики Гегеля." #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"The State and Revolution\" by Vladimir Lenin. In " +"This is a copy of \"The State and Revolution\" by Vladimir Lenin. In " "English, thankfully." msgstr "\"Государство и революция\" Владимира Ленина. К счастью, на английском." #: lang/json/BOOK_from_json.py -msgid "This is a copy of \"In Defence of Terrorism\" by Leon Trotsky." -msgstr "\"В защиту терроризма\" Льва Троцкого." +msgid "This is a copy of \"In Defense of Marxism\" by Leon Trotsky." +msgstr "\"В защиту марксизма\" Льва Троцкого." #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Steal This Book\" by Abbie Hoffman. There is a security " -"tag on the back cover. It appears to still be active." +"This is a copy of \"Steal This Book\" by Abbie Hoffman. There is a security" +" tag on the back cover. It appears to still be active." msgstr "" "\"Укради эту книгу\" Эбби Хоффмана. На задней обложке есть магнитная бирка. " "Похоже, она ещё работает." #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Walden: Or Life In The Woods\" by Henry David Thoreau. " +"This is a copy of \"Walden: Or Life In The Woods\" by Henry David Thoreau. " "It contains a dried and pressed leaf as a bookmark." msgstr "" "\"Уолден, или Жизнь в лесу\" под авторством Генри Дэвида Торо. Между страниц" @@ -24134,7 +24181,7 @@ msgid "" msgstr "\"Четыре основные понятия психоанализа\" Жака Лакана." #: lang/json/BOOK_from_json.py -msgid "This is a copy of Machiavelli's \"The Prince\". With intro by Q. Skinner." +msgid "This is a copy of Machiavelli's \"The Prince\". With intro by Q. Skinner." msgstr "Экземпляр \"Государя\" Макиавелли. Включает вступление К. Скиннера." #: lang/json/BOOK_from_json.py @@ -24144,14 +24191,14 @@ msgstr "\"Революция повседневной жизни\" Рауля В #: lang/json/BOOK_from_json.py msgid "" -"This is a pocket copy of \"An Essay on Liberation\" by Herbert Marcuse. The " -"cover contains an image of a pelican." +"This is a pocket copy of \"An Essay on Liberation\" by Herbert Marcuse. The" +" cover contains an image of a pelican." msgstr "" "Карманный экземпляр \"Эссе об освобождении\" Герберта Маркузе. На обложке " "нарисован пеликан." #: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Either-Or\" by Sören Kierkegaard." +msgid "This is a copy of \"Either-Or\" by Søren Kierkegaard." msgstr "\"Или-или\" Сёрена Кьеркегора." #: lang/json/BOOK_from_json.py @@ -24176,6 +24223,89 @@ msgid "" "Science\" by Friederich Nietzsche." msgstr "Собрание из \"К генеалогии морали\" и \"Весёлой науки\" Фридриха Ницше." +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Myth of Sisyphus\", and other essays, by Albert " +"Camus. The cover depicts a bare-chested man and a large boulder." +msgstr "" +"\"Миф о Сизифе\" за авторством Альберта Камю. На обложке нарисованы " +"полуобнажённый мужчина и огромный валун." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Sickness Unto Death\" by Søren Kierkegaard. The " +"pages are dotted with post-it notes." +msgstr "" +"\"Болезнь к смерти\" Сёрена Кьеркегора. На страницах полно липучек с " +"записками." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Defence of Terrorism\" by Leon Trotsky. Despite the" +" title, it does not actually appear to be defending terrorism." +msgstr "" +"\"В защиту терроризма\" Льва Троцкого. Несмотря на название, терроризм в " +"книге не защищают." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Enquiry Concerning Political Justice\" by William " +"Godwin. This thick book is filled with antiquated phrases." +msgstr "" +"\"Исследование о политической справедливости\" Уильяма Голдвина. Толстая " +"книга в старомодных выражениях." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Abolition of Work and Other Essays\" by Bob Black. " +"It is likely that \"The Abolition of Work\" is the most famous essay in this" +" book." +msgstr "" +"\"Упразднение работы и другие сочинения\" Боба Блэка. Похоже, \"Упразднение " +"работы\" - самое знаменитое сочинение в этой книге." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"What is Property?\" by Pierre-Joseph Proudhon. It looks" +" like this book has a surprisingly long track record of owners." +msgstr "" +"\"Что такое собственность?\" Пьер-Жозефа Прудона. Судя по всему, это книга " +"сменила удивительно много владельцев." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Conquest of Bread\" by Peter Kropotkin. There is a " +"picture of an old philosopher with magnificent beard, instead of bread, on " +"the cover." +msgstr "" +"\"Хлеб и воля\" Петра Кропоткина. На обложке вместо хлеба изображён пожилой " +"философ с роскошной бородой." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Trouble with Being Born\" by Emil Cioran. This book" +" might have been printed decades before the cataclysm since the cover is " +"quite weathered." +msgstr "" +"\"Несчастье родиться\" Эмиля Чорана. Должно быть, эту книгу напечатали за " +"десятилетия до Катаклизма - её обложка довольно истрепалась." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The World as Will and Representation\" by Arthur " +"Schopenhauer. It contains a few undecipherable notes and scribbles." +msgstr "" +"\"Мир как воля и представление\" Артура Шопенгауэра. Среди страниц несколько" +" неразборчивых записей и каракулей." + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Up-Wingers: A Futurist Manifesto\" by FM-2030. It seems" +" that the author's real name is Fereidoun M. Esfandiary." +msgstr "" +"\"Манифест футурологов\" за авторством FM-2030. Похоже, настоящее имя автора" +" - Ферейдун М. Эсфендиари." + #: lang/json/BOOK_from_json.py msgid "phone book" msgid_plural "phone books" @@ -26316,13 +26446,13 @@ msgstr[3] "фенол" msgid "" "This useful stuff is a potent solvent and has a wide range of reactive " "applications. It can be used to make a huge number of plastics and " -"polymers, it can be a disinfectant, it can strip paint and break down epoxy," -" and it can burn your skin away like tissue paper under a heat gun. Wear " +"polymers, it can be an antiseptic, it can strip paint and break down epoxy, " +"and it can burn your skin away like tissue paper under a heat gun. Wear " "gloves." msgstr "" "Полезное вещество и отличный растворитель с широким спектром практического " "применения. Он используется в производстве бесчисленных видов пластмасс и " -"полимеров, он годится как дезинфектант, с его помощью снимают краску и " +"полимеров, он годится как антисептик, с его помощью снимают краску и " "растворяют эпоксидые смолы, а ещё он прожжёт вашу кожу как бумагу. Надевайте" " перчатки." @@ -32470,11 +32600,11 @@ msgstr[3] "антисептический порошок" #. ~ Description for antiseptic powder #: lang/json/COMESTIBLE_from_json.py msgid "" -"A powdered form of chemical disinfectant, this bismuth formic iodide cleans " +"A powdered form of chemical antiseptic, this bismuth formic iodide cleans " "wounds quickly and painlessly." msgstr "" -"Порошковая форма химического дезинфектанта. Муравьинокислого висмута иодид " -"очистит раны быстро и безболезненно." +"Порошковый химический антисептик. Муравьинокислого висмута йодид очищает " +"раны быстро и безболезненно." #: lang/json/COMESTIBLE_from_json.py msgid "caffeinated chewing gum" @@ -32527,13 +32657,13 @@ msgstr[3] "перекись водорода" #. ~ Description for hydrogen peroxide #: lang/json/COMESTIBLE_from_json.py msgid "" -"Dilute hydrogen peroxide, for use as a disinfectant and for bleaching hair " -"or textiles. Foams a little when in contact with organic matter, but " +"Dilute hydrogen peroxide, for use as an antiseptic and for bleaching hair or" +" textiles. Foams a little when in contact with organic matter, but " "otherwise harmless." msgstr "" -"Разбавленная перекись водорода, для использования в качестве " -"дезинфицирующего средства или для обесцвечивания волос или ткани. Немного " -"пенится при контакте с органическими веществами, но в остальном безвредна." +"Разбавленная перекись водорода годится как антисептик или средство для " +"обесцвечивания волос или ткани. Немного пенится при контакте с органическими" +" веществами, но в остальном безвредна." #: lang/json/COMESTIBLE_from_json.py lang/json/GENERIC_from_json.py msgid "cigarette" @@ -32715,26 +32845,25 @@ msgstr "" " потребуется отдых и много жидкости." #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant" -msgstr "дезинфектант" +msgid "antiseptic" +msgstr "антисептик" -#. ~ Description for disinfectant +#. ~ Description for antiseptic #: lang/json/COMESTIBLE_from_json.py -msgid "A powerful disinfectant commonly used for contaminated wounds." +msgid "A powerful antiseptic commonly used for contaminated wounds." msgstr "" -"Мощное дезинфицирующее средство, часто применяемое для промывания заражённых" +"Мощное антисептическое средство, часто применяемое для промывания заражённых" " ран." #: lang/json/COMESTIBLE_from_json.py -msgid "makeshift disinfectant" -msgstr "самодельный дезинфектант" +msgid "makeshift antiseptic" +msgstr "самодельный антисептик" -#. ~ Description for makeshift disinfectant +#. ~ Description for makeshift antiseptic #: lang/json/COMESTIBLE_from_json.py msgid "" -"Makeshift disinfectant made from ethanol. Can be used to disinfect a wound." -msgstr "" -"Самодельный дезинфектант из спирта. Можно использовать для дезинфекции раны." +"Makeshift antiseptic made from ethanol. Can be used to disinfect a wound." +msgstr "Самодельный спиртовой антисептик. Годится для дезинфекции ран." #: lang/json/COMESTIBLE_from_json.py src/addiction.cpp msgid "diazepam" @@ -33156,10 +33285,8 @@ msgstr "тимьяновое масло" #: lang/json/COMESTIBLE_from_json.py msgid "" "Some essential oil made from thyme, which can act as a mildly irritating " -"disinfectant." -msgstr "" -"Эфирное масло тимьяна, которое может служить в роли слегка раздражающего " -"дезинфицирующего средства." +"antiseptic." +msgstr "Эфирное масло тимьяна. Слегка раздражающий антисептик." #: lang/json/COMESTIBLE_from_json.py msgid "rolling tobacco" @@ -33372,38 +33499,38 @@ msgstr "" "алпразолам." #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant soaked rag" -msgid_plural "disinfectant soaked rags" -msgstr[0] "продезинфицированная тряпка" -msgstr[1] "продезинфицированные тряпки" -msgstr[2] "продезинфицированных тряпок" -msgstr[3] "продезинфицированная тряпка" +msgid "antiseptic soaked rag" +msgid_plural "antiseptic soaked rags" +msgstr[0] "тряпка с антисептиком" +msgstr[1] "тряпки с антисептиком" +msgstr[2] "тряпок с антисептиком" +msgstr[3] "тряпки с антисептиком" -#. ~ Description for disinfectant soaked rag +#. ~ Description for antiseptic soaked rag #: lang/json/COMESTIBLE_from_json.py msgid "" -"A rag soaked in disinfectant. Useful for light wounds, probaby won't help " -"with deep bites." +"A rag soaked in antiseptic. Useful for light wounds, probaby won't help with" +" deep bites." msgstr "" -"Тряпка, смоченная в дезинфектанте. Поможет с небольшими ранами, но с " -"глубокими укусами не справится." +"Тряпка, смоченная в антисептике. Поможет с небольшими ранами, но с глубокими" +" укусами не справится." #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant soaked cotton balls" -msgid_plural "disinfectant soaked cotton balls" -msgstr[0] "продезинфицированный ватный шарик" -msgstr[1] "продезинфицированных ватных шарика" -msgstr[2] "продезинфицированных ватных шариков" -msgstr[3] "продезинфицированный ватный шарик" +msgid "antiseptic soaked cotton balls" +msgid_plural "antiseptic soaked cotton balls" +msgstr[0] "ватный шарик с антисептиком" +msgstr[1] "ватных шарика с антисептиком" +msgstr[2] "ватных шариков с антисептиком" +msgstr[3] "ватные шарики с антисептиком" -#. ~ Description for disinfectant soaked cotton balls +#. ~ Description for antiseptic soaked cotton balls #: lang/json/COMESTIBLE_from_json.py msgid "" -"Fluffy balls of clean white cotton. Now soaked with disinfectant, they are " +"Fluffy balls of clean white cotton. Now soaked with antiseptic, they are " "somewhat useful to disinfect a wound." msgstr "" -"Пушистые шарики чистого белого хлопка. Они пропитаны дезинфектантом, поэтому" -" с их помощью можно в некоторой степени обеззараживать раны." +"Пушистые шарики чистого белого хлопка. Они пропитаны антисептиком, поэтому с" +" их помощью можно в некоторой степени обеззараживать раны." #: lang/json/COMESTIBLE_from_json.py msgid "Atreyupan" @@ -36439,6 +36566,24 @@ msgstr[3] "сэндвич с джемом" msgid "A delicious jam sandwich." msgstr "Вкусный сэндвич с джемом." +#: lang/json/COMESTIBLE_from_json.py +msgid "fairy bread" +msgid_plural "fairy bread" +msgstr[0] "волшебный хлеб" +msgstr[1] "волшебного хлеба" +msgstr[2] "волшебного хлеба" +msgstr[3] "волшебный хлеб" + +#. ~ Description for fairy bread +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"An 'open-faced sandwich' consisting of sliced white bread, a healthy crust-" +"to-crust slathering of butter, and sprinkles. Supposedly a staple of " +"birthday parties in Australia." +msgstr "" +"Бутерброд из ломтика белого хлеба с толстым слоем масла и кондитерской " +"посыпкой. Стереотипное угощение на день рождения в Австралии." + #: lang/json/COMESTIBLE_from_json.py msgid "honey sandwich" msgid_plural "honey sandwiches" @@ -37869,6 +38014,26 @@ msgstr "" "Сладкий, сладкий сахар. Вреден для зубов и, как ни удивительно, не очень " "вкусен сам по себе." +#: lang/json/COMESTIBLE_from_json.py +msgid "sprinkles" +msgid_plural "sprinkles" +msgstr[0] "кондитерская посыпка" +msgstr[1] "кондитерской посыпки" +msgstr[2] "кондитерской посыпки" +msgstr[3] "кондитерская посыпка" + +#. ~ Description for sprinkles +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Known as nonpareils, sprinkles, jimmies, sugar strands or 'hundreds-and-" +"thousands', these colorful balls, rods or flakes of sugar and starch are " +"intended for use decorating soft surfaces of sweets. Like sugar, they are " +"bad for your teeth and surprisingly not very tasty on their own." +msgstr "" +"Нопарель, посыпка, сахарная крошка - разноцветные шарики, палочки и хлопья " +"сахара с крахмалом для украшения мягких кондитерских изделий. Как и сахар, " +"вредны для зубов и не очень вкусные сами по себе." + #: lang/json/COMESTIBLE_from_json.py msgid "wild herbs" msgid_plural "wild herbs" @@ -43396,6 +43561,26 @@ msgstr "" "пластинка прозрачного стекла содержит чертежи для создания вещей с помощью " "нанофабрикатора, записанные в виде микроскопических узоров." +#: lang/json/GENERIC_from_json.py +msgid "nanofabricator template (silicon photonics)" +msgid_plural "nanofabricator template (silicon photonics)s" +msgstr[0] "шаблон нанофабрикатора (кремниевая фотоника)" +msgstr[1] "шаблона нанофабрикатора (кремниевая фотоника)" +msgstr[2] "шаблонов нанофабрикатора (кремниевая фотоника)" +msgstr[3] "шаблоны нанофабрикатора (кремниевая фотоника)" + +#. ~ Description for nanofabricator template (silicon photonics) +#: lang/json/GENERIC_from_json.py +msgid "" +"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." +msgstr "" +"Высокотехнологичная оптическая система хранения данных с чертежами для " +"создания сложной кремниевой фотонной схемы. Когда-то эти данные стоили " +"миллионы, но теперь вряд ли сгодятся на более, чем крутое пресс-папье." + #: lang/json/GENERIC_from_json.py msgid "antenna" msgid_plural "antennas" @@ -49169,8 +49354,8 @@ msgstr[3] "гильзы .300BLK" #. ~ Description for .300BLK casing #: lang/json/GENERIC_from_json.py -msgid "An empty casing from a .300BLK round." -msgstr "Пустая гильза от патрона .300BLK." +msgid "An empty casing from a .300 AAC Blackout round." +msgstr "Пустая гильза от патрона .300 AAC Blackout." #: lang/json/GENERIC_from_json.py msgid "Merch" @@ -51163,6 +51348,45 @@ msgstr "" "сучковатая палка не вулканизировалась в камине, в отличии от традиционной " "шилейлы, но имеет поддельную сажу на себе" +#: lang/json/GENERIC_from_json.py +msgid "blackjack" +msgid_plural "blackjacks" +msgstr[0] "блэкджек" +msgstr[1] "блэкджека" +msgstr[2] "блэкджеков" +msgstr[3] "блэкджеки" + +#. ~ Description for blackjack +#: lang/json/GENERIC_from_json.py +msgid "" +"This is a short, easily concealed bludgeoning weapon consisting of a weight " +"embedded at the end of a short leather shaft. Formerly used by law " +"enforcement, this weapon is meant to stun or knock out the subject, although" +" head strikes have a high risk of causing a permanent, disabling brain " +"injury or being fatal." +msgstr "" +"Короткая дубинка для скрытого ношения с грузиком на конце кожаной ручки. Её " +"использовали полицейские для оглушения при задержании, хотя удар в голову " +"сильно рискует привести к непоправимому увечью головного мозга или смерти." + +#: lang/json/GENERIC_from_json.py +msgid "makeshift sap" +msgid_plural "makeshift saps" +msgstr[0] "самодельный слеппер" +msgstr[1] "самодельных слеппера" +msgstr[2] "самодельных слепперов" +msgstr[3] "самодельные слепперы" + +#. ~ Description for makeshift sap +#: lang/json/GENERIC_from_json.py +msgid "" +"This is an improvised sap, also known as a cosh, slapjack and slapper. A " +"short and flat bludgeoning weapon consisting of a weight embedded between " +"two patches of leather." +msgstr "" +"Самодельная дубинка, её называют блэкджек или слеппер. Короткое плоское " +"дробящее оружие, состоящее из грузика, вшитого между кожаными лоскутами." + #: lang/json/GENERIC_from_json.py msgid "pointy stick" msgid_plural "pointy sticks" @@ -51773,6 +51997,36 @@ msgstr "" "Оружие для фехтования, благороднейшего из всех видов спорта. Сабля немного " "короче рапиры и шпаги, но не менее эффективна." +#: lang/json/GENERIC_from_json.py +msgid "hollow cane" +msgid_plural "hollow canes" +msgstr[0] "полая трость" +msgstr[1] "полых трости" +msgstr[2] "полых тростей" +msgstr[3] "полые трости" + +#. ~ Description for hollow cane +#: lang/json/GENERIC_from_json.py +msgid "" +"A cane designed to conceal blade. This was a popular fashion accessory for " +"the wealthy during the 18th and 19th centuries." +msgstr "" +"Трость для сокрытия клинка. Популярный модный аксессуар среди богачей в 18 и" +" 19 веках." + +#: lang/json/GENERIC_from_json.py +msgid "sword cane" +msgid_plural "sword canes" +msgstr[0] "трость-клинок" +msgstr[1] "трости-клинка" +msgstr[2] "тростей-клинков" +msgstr[3] "трости-клинки" + +#. ~ Description for sword cane +#: lang/json/GENERIC_from_json.py +msgid "A sword with a thin blade designed to be hidden inside an hollow cane." +msgstr "Узкий клинок для скрытого ношения внутри полой трости." + #: lang/json/GENERIC_from_json.py lang/json/TOOL_from_json.py #: lang/json/TOOL_from_json.py msgid "cutlass" @@ -56397,6 +56651,8 @@ msgid "" "A large gleaming metal gauntlet covered in magical symbols that allows you " "to land astoundingly powerful blows." msgstr "" +"Большая блестящая металлическая рукавица, покрытая магическими символами, " +"которая позволяет наносить поразительно мощные удары." #: lang/json/GENERIC_from_json.py msgid "stone shell" @@ -56776,10 +57032,10 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "Scroll of Summon Zombie" msgid_plural "Scroll of Summon Zombies" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "Свиток Призыва Зомби" +msgstr[1] "Свитков Призыва Зомби" +msgstr[2] "Свитков Призыва Зомби" +msgstr[3] "Свитков Призыва Зомби" #. ~ Description for Scroll of Summon Zombie #. ~ Description for Summon Zombie @@ -56794,10 +57050,10 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "Scroll of Summon Skeleton" msgid_plural "Scroll of Summon Skeletons" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "Свиток Призыва Скелета" +msgstr[1] "Свиток Призыва Скелетов" +msgstr[2] "Свиток Призыва Скелетов" +msgstr[3] "Свиток Призыва Скелетов" #. ~ Description for Scroll of Summon Skeleton #. ~ Description for Summon Skeleton @@ -56967,10 +57223,10 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "Scroll of Magical Light" msgid_plural "Scroll of Magical Lights" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "Свиток Магического Света" +msgstr[1] "Свитков Магического Света" +msgstr[2] "Свитков Магического Света" +msgstr[3] "Свитков Магического Света" #. ~ Description for Scroll of Magical Light #. ~ Description for Magical Light @@ -57424,10 +57680,10 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "Scroll of Ice Shield" msgid_plural "Scroll of Ice Shields" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "Свиток Ледяного Щита" +msgstr[1] "Свитков Ледяных Щитов" +msgstr[2] "Свитков ледяных щитов" +msgstr[3] "Свиток Ледяных Щитов" #. ~ Description for Scroll of Ice Shield #. ~ Description for Ice Shield @@ -60809,6 +61065,15 @@ msgstr "Jennings J-22 магазин" msgid "A cheap 6-round steel box magazine for the Jennings J-22." msgstr "Простой стальной коробчатый магазин на 6 патронов для Jennings J-22." +#: lang/json/MAGAZINE_from_json.py +msgid "Walther P22 magazine" +msgstr "Walther P22 магазин" + +#. ~ Description for Walther P22 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round box magazine for the Walther P22." +msgstr "Коробчатый магазин на 10 патронов для Walther P22." + #: lang/json/MAGAZINE_from_json.py msgid "LW-5 speedloader" msgstr "обойма LW-5" @@ -61267,6 +61532,20 @@ msgstr "" "Дешёвый стальной коробчатый магазин на 32 патрона для использования с MAC-11" " SMG." +#: lang/json/MAGAZINE_from_json.py +msgid "CF-380 magazine" +msgstr "CF-380 магазин" + +#. ~ Description for CF-380 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Hi-Point CF-380." +msgstr "Стальной коробчатый магазин на 8 патронов для Hi-Point CF-380." + +#. ~ Description for CF-380 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point CF-380." +msgstr "Стальной коробчатый магазин на 10 патронов для Hi-Point CF-380." + #: lang/json/MAGAZINE_from_json.py msgid "M1911 .38 Super magazine" msgstr "M1991 .38 Супер магазин" @@ -61340,6 +61619,44 @@ msgstr "" "пистолету Glock 22, но может подойти и к другому самодельному магазинному " "оружию. Особой надёжности ожидать не стоит." +#: lang/json/MAGAZINE_from_json.py +msgid "Hi-Power magazine .40 S&W" +msgstr "Hi-Power .40 S&W магазин" + +#. ~ Description for Hi-Power magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Browning Hi-Power .40 S&W." +msgstr "" +"Стальной коробчатый магазин на 10 патронов для Browning Hi-Power .40 S&W." + +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine .40 S&W" +msgstr "PPQ .40 S&W магазин" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "Стальной коробчатый магазин на 10 патронов для Walther PPQ .40 S&W." + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 12 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "Стальной коробчатый магазин на 12 патронов для Walther PPQ .40 S&W." + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 14 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "Стальной коробчатый магазин на 14 патронов для Walther PPQ .40 S&W." + +#: lang/json/MAGAZINE_from_json.py +msgid "Model JCP magazine" +msgstr "Model JCP магазин" + +#. ~ Description for Model JCP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point Model JCP." +msgstr "Стальной коробчатый магазин на 10 патронов для Hi-Point Model JCP." + #: lang/json/MAGAZINE_from_json.py msgid "grenade belt" msgstr "гранатная лента" @@ -61514,6 +61831,24 @@ msgstr "USP .45 магазин" msgid "A standard capacity magazine for use with the H&K USP handgun." msgstr "Магазин стандартной ёмкости для использования с пистолетом H&K USP." +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine .45 ACP" +msgstr "PPQ .45 ACP магазин" + +#. ~ Description for PPQ magazine .45 ACP +#: lang/json/MAGAZINE_from_json.py +msgid "A 12 round steel box magazine for the Walther PPQ .45 ACP." +msgstr "Стальной коробчатый магазин на 12 патронов для Walther PPQ .45 ACP." + +#: lang/json/MAGAZINE_from_json.py +msgid "Model JHP magazine" +msgstr "Model JHP магазин" + +#. ~ Description for Model JHP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 9-round steel box magazine for use with the Hi-Point Model JHP." +msgstr "Стальной коробчатый магазин на 9 патронов для Hi-Point Model JHP." + #: lang/json/MAGAZINE_from_json.py msgid ".454 5-round speedloader" msgstr ".454 обойма на 5 патронов" @@ -62060,6 +62395,97 @@ msgstr "P320 9х19 мм магазин" msgid "A 17 round double stack box magazine for the SIG Sauer P320." msgstr "Двухрядный коробчатый магазин на 17 патронов для SIG Sauer P320." +#: lang/json/MAGAZINE_from_json.py +msgid "Hi-Power magazine 9x19mm" +msgstr "Hi-Power 9х19 мм магазин" + +#. ~ Description for Hi-Power magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 13 round steel box magazine for the Browning Hi-Power 9x19mm." +msgstr "" +"Стальной коробчатый магазин на 13 патронов для Browning Hi-Power 9x19 мм." + +#. ~ Description for Hi-Power magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 15 round steel box magazine for the Browning Hi-Power 9x19mm." +msgstr "" +"Стальной коробчатый магазин на 15 патронов для Browning Hi-Power 9x19 мм." + +#: lang/json/MAGAZINE_from_json.py +msgid "P38 magazine" +msgstr "P38 магазин" + +#. ~ Description for P38 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8 round steel box magazine for the Walther P38." +msgstr "Стальной коробчатый магазин на 8 патронов для Walther P38." + +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine 9x19mm" +msgstr "PPQ 9х19 мм магазин" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Walther PPQ 9mm." +msgstr "Стальной коробчатый магазин на 10 патронов для Walther PPQ 9 мм." + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 15 round steel box magazine for the Walther PPQ 9mm." +msgstr "Стальной коробчатый магазин на 15 патронов для Walther PPQ 9 мм." + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 17 round steel box magazine for the Walther PPQ 9mm." +msgstr "Стальной коробчатый магазин на 17 патронов для Walther PPQ 9 мм." + +#: lang/json/MAGAZINE_from_json.py +msgid "C-9 magazine" +msgstr "C-9 магазин" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Hi-Point C-9." +msgstr "Стальной коробчатый магазин на 8 патронов для Hi-Point C-9." + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point C-9." +msgstr "Стальной коробчатый магазин на 10 патронов для Hi-Point C-9." + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 15-round steel box magazine for use with the Hi-Point C-9." +msgstr "Стальной коробчатый магазин на 15 патронов для Hi-Point C-9." + +#: lang/json/MAGAZINE_from_json.py +msgid "CZ 75 magazine" +msgstr "CZ 75 магазин" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 12-round steel box magazine for use with the CZ 75." +msgstr "Стальной коробчатый магазин на 12 патронов для CZ 75." + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 20-round steel box magazine for use with the CZ 75." +msgstr "Стальной коробчатый магазин на 20 патронов для CZ 75." + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 26-round steel box magazine for use with the CZ 75." +msgstr "Стальной коробчатый магазин на 26 патронов для CZ 75." + +#: lang/json/MAGAZINE_from_json.py +msgid "CCP magazine" +msgstr "CCP магазин" + +#. ~ Description for CCP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Walther CCP." +msgstr "Стальной коробчатый магазин на 8 патронов для Walther CCP." + #: lang/json/MAGAZINE_from_json.py msgid "Makarov PM magazine" msgstr "ПМ магазин" @@ -63662,13 +64088,15 @@ msgstr "" #: lang/json/MOD_INFO_from_json.py msgid "EZ-Mode Medical" -msgstr "" +msgstr "Ускоренное лечение" #. ~ Description for EZ-Mode Medical #: lang/json/MOD_INFO_from_json.py msgid "" "Increases broken limb mending speed and the effectiveness of healing items." msgstr "" +"Повышает скорость восстановления сломанных конечностей и эффективность " +"лечебных предметов." #: lang/json/MOD_INFO_from_json.py msgid "Makeshift Items Mod" @@ -66317,11 +66745,11 @@ msgstr "оборонная турель" #: lang/json/MONSTER_from_json.py msgid "" "Leadworks LLC's T-4A1 Sentry. It features improved firmware over General " -"Atomics' TX-1 9x19mm model and an automated M4 carbine." +"Atomics' TX-1 9x19mm model and an automated 5.56mm carbine." msgstr "" "T-4A1 Часовой от «Лидворкс». Оснащена улучшенным, по сравнению с 9х19-мм " "моделью TX-1 от «Дженерал Атомикс», встроенным ПО, а также автоматическим " -"карабином M4." +"карабином 5.56 мм." #: lang/json/MONSTER_from_json.py msgid "debug monster" @@ -67957,6 +68385,57 @@ msgstr "" " карабкается по стенам и потолку при помощи конечностей, растущих из его " "вывихнутых рёбер." +#: lang/json/MONSTER_from_json.py +msgid "gangrenous impaler" +msgstr "гангренозный пронзатель" + +#. ~ Description for gangrenous impaler +#: lang/json/MONSTER_from_json.py +msgid "" +"A corpse hideously twisted into an insect-like form. A hollow tendril " +"reaches out from its open thorax." +msgstr "" +"Обезображенный труп, превратившийся во что-то мерзкое и насекомоподобное. Из" +" его раскрытой грудной клетки растёт полое щупальце." + +#: lang/json/MONSTER_from_json.py +msgid "The impaler launches a barb!" +msgstr "Пронзатель выстреливает колючкой!" + +#: lang/json/MONSTER_from_json.py +msgid "trapped tendril" +msgstr "зажатое щупальце" + +#. ~ Description for trapped tendril +#: lang/json/MONSTER_from_json.py +msgid "" +"A great tendril of mutated flesh and sharpened bone. Emergent from a " +"crevice in the ruined floor, hundreds of human limbs seek freedom and writhe" +" incessantly from underneath its grotesque carapace. As enormous as it may " +"already be, you feel certain that this is just part of a creature much " +"bigger, for when it moves, you can feel this whole ruin tremble, as if an " +"unseen giant struggled against the weight of its concrete tomb." +msgstr "" +"Большущее щупальце из мутировавшей плоти и острых костей. Оно прорастает из " +"трещины в разрушенном полу, сотни человеческих конечностей яростно бьются и " +"извиваются в попытках вырваться из-под мерзкого панциря. Хотя щупальце и так" +" довольно велико, вы уверены, что это только часть гигантского существа - " +"когда оно движется, всё разрушенное здание содрогается, будто невидимый " +"гигант извивается в бетонной могиле." + +#: lang/json/MONSTER_from_json.py +msgid "flesh wall" +msgstr "мясистая стена" + +#. ~ Description for flesh wall +#: lang/json/MONSTER_from_json.py +msgid "" +"A great lump of mutated flesh. It resembles the innards of some gigantic " +"creature and is covered in a grid of diminutive veins." +msgstr "" +"Огромный кусок мутировавшей плоти. Это внутренности какого-то гигантского " +"существа, покрытые сеткой крошечных сосудов." + #: lang/json/MONSTER_from_json.py msgid "bloated fungal zombie" msgstr "раздутый грибной зомби" @@ -70088,6 +70567,11 @@ msgid "" "this creature is evil to its very core. Even though this dragon is not " "fully grown, it is the size of a full-grown bull." msgstr "" +"Этот черный дракон, кажется, все еще находится на ранней стадии жизни. Его " +"глаза только начали погружаться в гнезда, а его сегментированные рога только" +" начали темнеть на кончиках. Вы можете сказать, просто взглянув на него, что" +" это существо является злом по своей сути. Хотя этот дракон не вырос " +"полностью, он размером с взрослого быка." #: lang/json/MONSTER_from_json.py msgid "owlbear" @@ -70118,6 +70602,8 @@ msgid "" "A baleful eye peers out from the darkness, its gleam hinting at a weird " "intelligence and unnerving malevolence." msgstr "" +"Зловещий глаз выглядывает из темноты, и его свет намекает на странный ум и " +"нервирующую недоброжелательность" #: lang/json/MONSTER_from_json.py msgid "owlbear cub" @@ -71979,7 +72465,7 @@ msgstr "Боль" #. ~ Description for Pain #: lang/json/SPELL_from_json.py msgid "Increases pain" -msgstr "" +msgstr "Повышает боль" #: lang/json/SPELL_from_json.py src/character.cpp src/npctalk.cpp msgid "Tired" @@ -71988,7 +72474,7 @@ msgstr "Усталость" #. ~ Description for Tired #: lang/json/SPELL_from_json.py msgid "decreases stamina" -msgstr "" +msgstr "Уменьшает запас сил" #: lang/json/SPELL_from_json.py msgid "mi-go slaver beam" @@ -72004,6 +72490,24 @@ msgstr "" "кратковременному оглушению. Дальность поражения значительно увеличивается с " "уровнем." +#: lang/json/SPELL_from_json.py +msgid "Summon Gangrenous Crawlers" +msgstr "" + +#. ~ Description for Summon Gangrenous Crawlers +#: lang/json/SPELL_from_json.py +msgid "Summons 2 permanent gangrenous crawlers." +msgstr "" + +#: lang/json/SPELL_from_json.py +msgid "Summon Gangrenous Monsters" +msgstr "" + +#. ~ Description for Summon Gangrenous Monsters +#: lang/json/SPELL_from_json.py +msgid "Summons 2 permanent gangrenous impalers." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Smite" msgstr "Кара" @@ -72287,6 +72791,8 @@ msgid "" "You summon a gift of the earth which will purify water. Rapidly degrades if " "not utilized." msgstr "" +"Вы призываете дар земли, который очистит воду. Быстро деградируется, если не" +" используется." #: lang/json/SPELL_from_json.py msgid "Stonefist" @@ -72323,7 +72829,7 @@ msgstr "" #. ~ Description for Move Earth #: lang/json/SPELL_from_json.py msgid "Your essense flows around you, and the earth follows." -msgstr "" +msgstr "Ваша сущность течет вокруг вас, и земля следует." #: lang/json/SPELL_from_json.py msgid "Earthshaper Rune" @@ -72349,6 +72855,9 @@ msgid "" "unwise to use this in immediate danger, and may be fatal if done in critical" " condition." msgstr "" +"Это заклинание разгоняет ваше сердце, генерируя новую плоть и мышцы. " +"Неразумно использовать это в прямой опасности, и может быть смертельным, " +"если сделано в критическом состоянии." #: lang/json/SPELL_from_json.py msgid "Improved Twisted Restoration" @@ -72361,6 +72870,10 @@ msgid "" "unwise to use this in immediate danger, and may be fatal if done in critical" " condition. Improved brewing mitigates the strain of the spell." msgstr "" +"Это заклинание разгоняет ваше сердце, генерируя новую плоть и мышцы. " +"Неразумно использовать это в прямой опасности, и может быть смертельным, " +"если сделано в критическом состоянии. Улучшенное заваривание смягчает " +"напряжение заклинания." #: lang/json/SPELL_from_json.py msgid "Point Flare" @@ -79757,6 +80270,22 @@ msgstr "" "Губка - это чистящий инструмент из мягкого пористого материала. Обычно ею " "моют водооталкивающие поверхности." +#: lang/json/TOOL_from_json.py +msgid "washing kit" +msgid_plural "washing kits" +msgstr[0] "помывочный набор" +msgstr[1] "помывочных набора" +msgstr[2] "помывочных наборов" +msgstr[3] "помывочные наборы" + +#. ~ Description for washing kit +#: lang/json/TOOL_from_json.py +msgid "" +"A combination kit of a washboard and a sponge. Everything you need to clean" +" items after the apocalypse." +msgstr "" +"Стиральная доска и губка - то, что надо для мытья вещей после апокалипсиса." + #: lang/json/TOOL_from_json.py msgid "reading light" msgid_plural "reading lights" @@ -81951,10 +82480,10 @@ msgstr "Маленькие весы для взвешивания голого #: lang/json/TOOL_from_json.py msgid "acetylene-gas machine" msgid_plural "acetylene-gas machines" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "ацетиленовый аппарат" +msgstr[1] "ацетиленовых аппарата" +msgstr[2] "ацетиленовых аппаратов" +msgstr[3] "ацетиленовые аппараты" #. ~ Description for acetylene-gas machine #: lang/json/TOOL_from_json.py @@ -81962,6 +82491,8 @@ msgid "" "This bulky device takes water and calcium carbide and yields unpressurised " "acetylene." msgstr "" +"Громоздкое устройство, превращающее воду и карбид кальция в несжатый " +"ацетилен." #: lang/json/TOOL_from_json.py lang/json/vehicle_part_from_json.py msgid "military black box" @@ -85949,10 +86480,10 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "Magic Wand" msgid_plural "Magic Wands" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "Магическая палочка" +msgstr[1] "Магических палочек" +msgstr[2] "Магических палочек" +msgstr[3] "Магических палочек" #: lang/json/TOOL_from_json.py msgid "minor wand of magic missile" @@ -86003,6 +86534,8 @@ msgid "" "A slender wooden wand with a mana crystal socket at the base that casts a " "spell when activated. This wand casts fireball." msgstr "" +"Тонкая деревянная палочка с гнездом из мана - кристала у основания, которое " +"активирует заклинание. Эта палочка призывает огненный шар." #: lang/json/TOOL_from_json.py msgid "lesser wand of fireball" @@ -89088,7 +89621,7 @@ msgstr "рубка" #: lang/json/activity_type_from_json.py msgid "cutting planks" -msgstr "" +msgstr "нарезание досок" #: lang/json/activity_type_from_json.py lang/json/tool_quality_from_json.py msgid "drilling" @@ -89190,6 +89723,10 @@ msgstr ".45-70" msgid "nails" msgstr "гвозди" +#: lang/json/ammunition_type_from_json.py +msgid "barb" +msgstr "колючка" + #: lang/json/ammunition_type_from_json.py msgid "BBs" msgstr "стальные пульки" @@ -89377,7 +89914,7 @@ msgstr "флешетты 5x50 мм" #: lang/json/ammunition_type_from_json.py msgid "powdered calcium carbide premix" -msgstr "" +msgstr "порошок-премикс карбида кальция" #: lang/json/ammunition_type_from_json.py msgid "ferrous rail projectile" @@ -89400,8 +89937,8 @@ msgid "components" msgstr "компоненты" #: lang/json/ammunition_type_from_json.py -msgid "93mm RPG-7" -msgstr "РПГ-7 93 мм" +msgid "RPG-7 rocket" +msgstr "ракета RPG-7" #: lang/json/ammunition_type_from_json.py msgid "rebreather filter" @@ -89453,7 +89990,7 @@ msgstr "полусгоревшее топливо" #: lang/json/ammunition_type_from_json.py msgid "partially burned calcium carbide" -msgstr "" +msgstr "частично обожжённый карбид кальция" #: lang/json/ammunition_type_from_json.py msgid "sprayable chemical" @@ -89539,21 +90076,6 @@ msgstr "" "дополнительных затрат энергии. Останавливает пули чаще, чем мечи, а мечи " "чаще, чем тяжёлые предметы." -#: lang/json/bionic_from_json.py -msgid "Advanced Microreactor System" -msgstr "Система улучшенного микрореактора" - -#. ~ Description for Advanced Microreactor System -#: lang/json/bionic_from_json.py -msgid "" -"This stripped down mini-reactor is more efficient and safer than the base " -"model due to integrated radiation cleansers. There is no way to shut it " -"down once active, but you can toggle additional fuel intake." -msgstr "" -"Этот упрощённый миниреактор эффективнее и безопаснее базовой модели " -"благодаря встроенным очистителям радиации. Его невозможно заглушить, но вы " -"можете переключать введение дополнительного топлива." - #: lang/json/bionic_from_json.py msgid "Alarm System" msgstr "Сигнализация" @@ -90492,30 +91014,6 @@ msgstr "" " по желанию притуплять ощущения. Однако использование этого импланта может " "вызвать сонливость и снижение реакции." -#: lang/json/bionic_from_json.py -msgid "Plutonium Filter" -msgstr "Плутониевый фильтр" - -#. ~ Description for Plutonium Filter -#: lang/json/bionic_from_json.py -msgid "" -"This set of tanks and filters allows you to extract plutonium from " -"radioactive slurry." -msgstr "" -"Система баков и фильтров для извлечения плутония из радиоактивного шлама." - -#: lang/json/bionic_from_json.py -msgid "Plutonium Purger" -msgstr "Очистка плутония" - -#. ~ Description for Plutonium Purger -#: lang/json/bionic_from_json.py -msgid "" -"Triggers an emergency reactor fuel purge that ejects all fuel from your " -"reactor." -msgstr "" -"Активирует аварийную очистку реактора, выбрасывающую из него всё топливо." - #. ~ Description for Bionic Visual Impairment #: lang/json/bionic_from_json.py msgid "" @@ -90668,21 +91166,6 @@ msgstr "" "Под вашими ногтями есть бритвенно-острые лезвия, наносящие небольшой режущий" " урон в рукопашном бою, если кончики ваших пальцев неприкрыты." -#: lang/json/bionic_from_json.py -msgid "Microreactor System" -msgstr "Система микрореактора" - -#. ~ Description for Microreactor System -#: lang/json/bionic_from_json.py -msgid "" -"This stripped down mini-reactor generates impressive amounts of bionic " -"power. There is no way to shut it down, but you can toggle additional fuel " -"intake. Irradiates your body when active." -msgstr "" -"Этот упрощённый миниреактор вырабатывает впечатляющее количество бионической" -" энергии. Его невозможно заглушить, но вы можете переключать введение " -"дополнительного топлива. При активации облучает ваше тело." - #: lang/json/bionic_from_json.py msgid "Recycler Unit" msgstr "Очистительный агрегат" @@ -91177,6 +91660,60 @@ msgstr "" "автоматически включающийся каждый раз, когда вы пытаетесь заснуть, создавая " "искусственное, но эффективное ощущение усталости." +#: lang/json/bionic_from_json.py +msgid "Advanced Microreactor System" +msgstr "Система улучшенного микрореактора" + +#. ~ Description for Advanced Microreactor System +#: lang/json/bionic_from_json.py +msgid "" +"This stripped down mini-reactor is more efficient and safer than the base " +"model due to integrated radiation cleansers. There is no way to shut it " +"down once active, but you can toggle additional fuel intake." +msgstr "" +"Этот упрощённый миниреактор эффективнее и безопаснее базовой модели " +"благодаря встроенным очистителям радиации. Его невозможно заглушить, но вы " +"можете переключать введение дополнительного топлива." + +#: lang/json/bionic_from_json.py +msgid "Plutonium Filter" +msgstr "Плутониевый фильтр" + +#. ~ Description for Plutonium Filter +#: lang/json/bionic_from_json.py +msgid "" +"This set of tanks and filters allows you to extract plutonium from " +"radioactive slurry." +msgstr "" +"Система баков и фильтров для извлечения плутония из радиоактивного шлама." + +#: lang/json/bionic_from_json.py +msgid "Plutonium Purger" +msgstr "Очистка плутония" + +#. ~ Description for Plutonium Purger +#: lang/json/bionic_from_json.py +msgid "" +"Triggers an emergency reactor fuel purge that ejects all fuel from your " +"reactor." +msgstr "" +"Активирует аварийную очистку реактора, выбрасывающую из него всё топливо." + +#: lang/json/bionic_from_json.py +msgid "Microreactor System" +msgstr "Система микрореактора" + +#. ~ Description for Microreactor System +#: lang/json/bionic_from_json.py +msgid "" +"This stripped down mini-reactor generates impressive amounts of bionic " +"power. There is no way to shut it down, but you can toggle additional fuel " +"intake. Irradiates your body when active." +msgstr "" +"Этот упрощённый миниреактор вырабатывает впечатляющее количество бионической" +" энергии. Его невозможно заглушить, но вы можете переключать введение " +"дополнительного топлива. При активации облучает ваше тело." + #: lang/json/bionic_from_json.py msgid "Internal Furnace" msgstr "Встроенная печь" @@ -91329,11 +91866,7 @@ msgstr "Уклонение и ближний бой затруднены." #: lang/json/bodypart_from_json.py src/armor_layers.cpp src/character.cpp #: src/debug_menu.cpp msgid "Torso" -msgid_plural "Torso" -msgstr[0] "Торс" -msgstr[1] "Торса" -msgstr[2] "Торсов" -msgstr[3] "Торс" +msgstr "Торс" #. ~ Crafting recipes subcategory of 'ARMOR' category #: lang/json/bodypart_from_json.py lang/json/recipe_category_from_json.py @@ -91352,11 +91885,7 @@ msgstr "голова" #: lang/json/bodypart_from_json.py src/armor_layers.cpp src/character.cpp #: src/debug_menu.cpp msgid "Head" -msgid_plural "Head" -msgstr[0] "Голова" -msgstr[1] "Головы" -msgstr[2] "Голов" -msgstr[3] "Голова" +msgstr "Голова" #. ~ Crafting recipes subcategory of 'ARMOR' category #: lang/json/bodypart_from_json.py lang/json/recipe_category_from_json.py @@ -91378,11 +91907,7 @@ msgstr "Дальний бой затруднён." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "Eyes" -msgid_plural "Eyes" -msgstr[0] "Глаза" -msgstr[1] "Глаз" -msgstr[2] "Глаз" -msgstr[3] "Глаза" +msgstr "Глаза" #: lang/json/bodypart_from_json.py msgid "mouth" @@ -91399,11 +91924,7 @@ msgstr "Бег замедлился." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "Mouth" -msgid_plural "Mouth" -msgstr[0] "Рот" -msgstr[1] "Рта" -msgstr[2] "Ртов" -msgstr[3] "Рот" +msgstr "Рот" #: lang/json/bodypart_from_json.py msgid "left arm" @@ -91414,17 +91935,26 @@ msgctxt "bodypart_accusative" msgid "left arm" msgstr "левая рука" +#: lang/json/bodypart_from_json.py +msgid "arms" +msgstr "руки" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "arms" +msgstr "руки" + #: lang/json/bodypart_from_json.py msgid "Melee and ranged combat is hampered." msgstr "Ближний и дальний бой затруднены." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Arm" -msgid_plural "Arms" -msgstr[0] "лРука" -msgstr[1] "Руки" -msgstr[2] "Руки" -msgstr[3] "лРука" +msgstr "лРука" + +#: lang/json/bodypart_from_json.py +msgid "Arms" +msgstr "пРука" #: lang/json/bodypart_from_json.py msgid "L ARM" @@ -91441,11 +91971,7 @@ msgstr "правая рука" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Arm" -msgid_plural "Arms" -msgstr[0] "пРука" -msgstr[1] "Руки" -msgstr[2] "Руки" -msgstr[3] "пРука" +msgstr "пРука" #: lang/json/bodypart_from_json.py msgid "R ARM" @@ -91460,17 +91986,26 @@ msgctxt "bodypart_accusative" msgid "left hand" msgstr "лев. ладонь" +#: lang/json/bodypart_from_json.py +msgid "hands" +msgstr "ладони" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "hands" +msgstr "ладони" + #: lang/json/bodypart_from_json.py msgid "Manual tasks are slowed." msgstr "Работа руками замедлена." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Hand" -msgid_plural "Hands" -msgstr[0] "лЛадонь" -msgstr[1] "Ладони" -msgstr[2] "Ладони" -msgstr[3] "лЛадонь" +msgstr "лЛадонь" + +#: lang/json/bodypart_from_json.py +msgid "Hands" +msgstr "лЛадонь" #: lang/json/bodypart_from_json.py msgid "right hand" @@ -91483,11 +92018,7 @@ msgstr "прав. ладонь" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Hand" -msgid_plural "Hands" -msgstr[0] "пЛадонь" -msgstr[1] "Ладони" -msgstr[2] "Ладони" -msgstr[3] "пЛадонь" +msgstr "пЛадонь" #: lang/json/bodypart_from_json.py msgid "left leg" @@ -91498,17 +92029,26 @@ msgctxt "bodypart_accusative" msgid "left leg" msgstr "лев. нога" +#: lang/json/bodypart_from_json.py +msgid "legs" +msgstr "ноги" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "legs" +msgstr "ноги" + #: lang/json/bodypart_from_json.py msgid "Running and swimming are slowed." msgstr "Бег и плавание замедлены." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Leg" -msgid_plural "Legs" -msgstr[0] "лНога" -msgstr[1] "Ноги" -msgstr[2] "Ноги" -msgstr[3] "лНога" +msgstr "лНога" + +#: lang/json/bodypart_from_json.py +msgid "Legs" +msgstr "пНога" #: lang/json/bodypart_from_json.py msgid "L LEG" @@ -91525,11 +92065,7 @@ msgstr "прав. нога" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Leg" -msgid_plural "Legs" -msgstr[0] "пНога" -msgstr[1] "Ноги" -msgstr[2] "Ноги" -msgstr[3] "пНога" +msgstr "пНога" #: lang/json/bodypart_from_json.py msgid "R LEG" @@ -91544,13 +92080,22 @@ msgctxt "bodypart_accusative" msgid "left foot" msgstr "лев. стопа" +#: lang/json/bodypart_from_json.py +msgid "feet" +msgstr "стопы" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "feet" +msgstr "стопы" + #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Foot" -msgid_plural "Feet" -msgstr[0] "лСтупня" -msgstr[1] "Ступни" -msgstr[2] "Ступни" -msgstr[3] "лСтупня" +msgstr "лСтопа" + +#: lang/json/bodypart_from_json.py +msgid "Feet" +msgstr "лСтупня" #: lang/json/bodypart_from_json.py msgid "right foot" @@ -91563,19 +92108,11 @@ msgstr "прав. стопа" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Foot" -msgid_plural "Feet" -msgstr[0] "пСтупня" -msgstr[1] "Ступни" -msgstr[2] "Ступни" -msgstr[3] "пСтупня" +msgstr "пСтопа" #: lang/json/bodypart_from_json.py msgid "appendix" -msgid_plural "Appendices" -msgstr[0] "аппендикс" -msgstr[1] "аппендикса" -msgstr[2] "аппендиксов" -msgstr[3] "аппендикс" +msgstr "аппендикс" #: lang/json/bodypart_from_json.py msgctxt "bodypart_accusative" @@ -91586,6 +92123,10 @@ msgstr "аппендикс" msgid "It's inflamed." msgstr "воспалено." +#: lang/json/bodypart_from_json.py +msgid "Appendices" +msgstr "аппендикс" + #: lang/json/clothing_mod_from_json.py msgid "Pad with leather" msgstr "Усилить кожаными вставками" @@ -92413,19 +92954,19 @@ msgstr "Построить саманную кирпичную стену" #: lang/json/construction_from_json.py msgid "Extrude Resin Lattice" -msgstr "" +msgstr "Выдавить решётку из смолы" #: lang/json/construction_from_json.py msgid "Extrude Resin Wall" -msgstr "" +msgstr "Выдавить стену из смолы" #: lang/json/construction_from_json.py msgid "Extrude Resin Floor and Roof" -msgstr "" +msgstr "Выдавить пол и крышу из смолы" #: lang/json/construction_from_json.py msgid "Extrude Resin Floor (no roof)" -msgstr "" +msgstr "Выдавить пол из смолы (без крыши)" #: lang/json/construction_from_json.py msgid "Build Pine Lean-To" @@ -92445,7 +92986,7 @@ msgstr "Выкопать глубокую яму" #: lang/json/construction_from_json.py msgid "Build Arc Furnace" -msgstr "" +msgstr "Построить дуговую печь" #: lang/json/construction_from_json.py msgid "Convert Fridge Power Supply" @@ -92490,7 +93031,7 @@ msgstr "Построить Гидропонику" #: lang/json/construction_from_json.py msgid "Build Hydroponics Heater" -msgstr "" +msgstr "Построить гидропонный нагреватель" #: lang/json/construction_from_json.py msgid "Build Translocator Gate" @@ -97083,7 +97624,7 @@ msgstr "клубок из поломанной зелени" #: lang/json/field_type_from_json.py msgid "cowebs" -msgstr "" +msgstr "паутина" #: lang/json/field_type_from_json.py msgid "webs" @@ -97203,7 +97744,7 @@ msgstr "вытяжка" #: lang/json/field_type_from_json.py msgid "fire vent" -msgstr "" +msgstr "источник огня" #: lang/json/field_type_from_json.py msgid "sparks" @@ -97231,15 +97772,15 @@ msgstr "дыра в пространстве" #: lang/json/field_type_from_json.py msgid "push items" -msgstr "" +msgstr "толкание предметов" #: lang/json/field_type_from_json.py msgid "shock vent" -msgstr "" +msgstr "источник электричества" #: lang/json/field_type_from_json.py msgid "acid vent" -msgstr "" +msgstr "источник кислоты" #: lang/json/field_type_from_json.py msgid "faint plasma" @@ -97379,7 +97920,7 @@ msgstr "дым мета" #: lang/json/field_type_from_json.py msgid "thick meth smoke" -msgstr "" +msgstr "густой метамфетаминовый дым" #: lang/json/field_type_from_json.py msgid "some bees" @@ -97447,27 +97988,27 @@ msgstr "горячий воздух 4" #: lang/json/field_type_from_json.py msgid "fungicidal mist" -msgstr "" +msgstr "фунгицидная дымка" #: lang/json/field_type_from_json.py msgid "fungicidal haze" -msgstr "" +msgstr "фунгицидный туман" #: lang/json/field_type_from_json.py msgid "thick fungicidal haze" -msgstr "" +msgstr "густой фунгицидный туман" #: lang/json/field_type_from_json.py msgid "insecticidal mist" -msgstr "" +msgstr "инсектицидная дымка" #: lang/json/field_type_from_json.py msgid "insecticidal haze" -msgstr "" +msgstr "инсектицидный туман" #: lang/json/field_type_from_json.py msgid "thick insecticidal haze" -msgstr "" +msgstr "густой инсектицидный туман" #: lang/json/field_type_from_json.py msgid "smoke vent" @@ -98408,10 +98949,12 @@ msgid "" "An arc furnace designed to burn a powdery mix of coke and limestone to " "create calcium carbide." msgstr "" +"Дуговая печь для пережигания порошковой смеси кокса и известняка в карбид " +"кальция." #: lang/json/furniture_from_json.py msgid "filled arc furnace" -msgstr "" +msgstr "заполненная дуговая печь" #: lang/json/furniture_from_json.py msgid "robotic arm" @@ -99088,7 +99631,7 @@ msgstr "" #: lang/json/furniture_from_json.py msgid "filled autoclave" -msgstr "" +msgstr "заполненный автоклав" #: lang/json/furniture_from_json.py msgid "sample freezer" @@ -100461,12 +101004,12 @@ msgstr "" #: lang/json/furniture_from_json.py msgid "hydroponics heater" -msgstr "" +msgstr "гидропонный нагреватель" #. ~ Description for hydroponics heater #: lang/json/furniture_from_json.py msgid "This is a self-contained heater, used to warm hydroponics units." -msgstr "" +msgstr "Автономный нагреватель для подогрева гидропонных установок." #: lang/json/furniture_from_json.py msgid "Translocator Gate" @@ -101031,7 +101574,9 @@ msgstr "" "размаха плеч. Сгодится для охоты на мелкую дичь. Болты, выпущенные из него, " "имеют хороший шанс уцелеть, и их можно будет повторно использовать" -#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py src/item.cpp +#: lang/json/gun_from_json.py lang/json/gun_from_json.py +#: lang/json/gunmod_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gunmod_from_json.py src/item.cpp msgctxt "gun_type_type" msgid "pistol" msgstr "пистолет" @@ -101159,16 +101704,18 @@ msgstr "" #: lang/json/gun_from_json.py msgid "mi-go bio-gun" msgid_plural "mi-go bio-guns" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "биопушка ми-го" +msgstr[1] "биопушки ми-го" +msgstr[2] "биопушек ми-го" +msgstr[3] "биопушки ми-го" #: lang/json/gun_from_json.py msgid "" "Fake gun that fires some sort of solidified organic matter at very high " "speed by unknown means of propulsion." msgstr "" +"Псевдопушка, неясным образом стреляющая твёрдыми органическими снарядами с " +"высокой скоростью." #: lang/json/gun_from_json.py msgid "spraycan flamethrower" @@ -101190,6 +101737,23 @@ msgstr "" "изменено для распыления бензина, а маленький насос позволяет нагонять " "давление, правда это не быстрый процесс." +#: lang/json/gun_from_json.py +msgid "simple flamethrower" +msgid_plural "simple flamethrowers" +msgstr[0] "простой огнемёт" +msgstr[1] "простых огнемёта" +msgstr[2] "простых огнемётов" +msgstr[3] "простой огнемёт" + +#: lang/json/gun_from_json.py +msgid "" +"A simple, home-made flamethrower. While its capacity is not superb, it is " +"more than capable of igniting terrain and monsters alike." +msgstr "" +"Простой, собранный из подручных материалов огнемёт. И хотя его дальность " +"действия не впечатляет, этого всё же достаточно для сожжения большинства " +"монстров." + #: lang/json/gun_from_json.py msgid "BB gun" msgid_plural "BB guns" @@ -101993,6 +102557,24 @@ msgstr "" "практике стал популярен у преступников, равнодушных к явным проблемам с " "безопасным использованием." +#: lang/json/gun_from_json.py +msgid "Walther P22" +msgid_plural "Walther P22s" +msgstr[0] "Walther P22" +msgstr[1] "Walther P22" +msgstr[2] "Walther P22" +msgstr[3] "Walther P22" + +#: lang/json/gun_from_json.py +msgid "" +"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" +msgstr "" +"Walther P22 - полуавтоматический пистолет со свободным затвором. Примерно " +"вполовину меньше остальных Вальтеров. По большей части сделан из пластика, а" +" затвор-кожух и ключевые детали отлиты под давлением из цинкового сплава." + #: lang/json/gun_from_json.py msgid "Remington ACR" msgid_plural "Remington ACRs" @@ -103205,6 +103787,26 @@ msgstr "" "мощь патрона, в обращении довольно посредственный из-за малого веса и " "небольшого радиуса прицеливания." +#: lang/json/gun_from_json.py +msgid "Hi-Point CF-380" +msgid_plural "Hi-Point CF-380s" +msgstr[0] "Hi-Point CF-380" +msgstr[1] "Hi-Point CF-380" +msgstr[2] "Hi-Point CF-380" +msgstr[3] "Hi-Point CF-380" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" +"Hi-Point CF-380 - полуавтоматический пистолет со свободным затвором от " +"компании \"Hi-Point Firearms\", знаменитой своим дешёвым и неудобным " +"оружием. Затвор сделан из копеечного цинкового сплава, довольно хрупкого по " +"сравнению со стальным." + #: lang/json/gun_from_json.py msgid "M1911A1" msgid_plural "M1911A1s" @@ -103319,6 +103921,63 @@ msgstr "" "Смит и Вессон 610 — классический шестизарядный револьвер, использующий " "патроны калибра 10 мм, либо фирменные патроны .40 S&W." +#: lang/json/gun_from_json.py +msgid "Browning Hi-Power .40 S&W" +msgid_plural "Browning Hi-Power .40 S&Ws" +msgstr[0] "Browning Hi-Power .40 S&W" +msgstr[1] "Browning Hi-Power .40 S&W" +msgstr[2] "Browning Hi-Power .40 S&W" +msgstr[3] "Browning Hi-Power .40 S&W" + +#: lang/json/gun_from_json.py +msgid "" +"The Browning Hi-Power is a semi-automatic handgun developed shortly before " +"the second world war. Widely issued since then, it remains in use by India, " +"Canada and Australia. This is a commercial variant produced by Browning Arms" +" in .40 S&W." +msgstr "" +"Полуавтоматический пистолет, разработанный незадолго до Второй Мировой " +"Войны. С тех пор был довольно популярен и всё ещё встречается в Индии, " +"Канаде и Австралии. Это коммерческий вариант калибра .40 S&W производства " +"\"Browning Arms\"." + +#: lang/json/gun_from_json.py +msgid "Walther PPQ .40 S&W" +msgid_plural "Walther PPQ .40 S&Ws" +msgstr[0] "Walther PPQ .40 S&W" +msgstr[1] "Walther PPQ .40 S&W" +msgstr[2] "Walther PPQ .40 S&W" +msgstr[3] "Walther PPQ .40 S&W" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in .40 S&W." +msgstr "" +"Полуавтоматический пистолет, разработанный на основе Walther P99QA и " +"совместимый с его аксессуарами. Эта модель предназначена под патрон .40 S&W." + +#: lang/json/gun_from_json.py +msgid "Hi-Point Model JCP" +msgid_plural "Hi-Point Model JCPs" +msgstr[0] "Hi-Point Model JCP" +msgstr[1] "Hi-Point Model JCP" +msgstr[2] "Hi-Point Model JCP" +msgstr[3] "Hi-Point Model JCP" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" +"Hi-Point Model JCP - полуавтоматический пистолет со свободным затвором от " +"компании \"Hi-Point Firearms\", знаменитой своим дешёвым и неудобным " +"оружием. Затвор сделан из копеечного цинкового сплава, довольно хрупкого по " +"сравнению со стальным." + #: lang/json/gun_from_json.py msgid "tube 40mm launcher" msgid_plural "tube 40mm launchers" @@ -103735,6 +104394,43 @@ msgstr[1] "USP .45" msgstr[2] "USP .45" msgstr[3] "USP .45" +#: lang/json/gun_from_json.py +msgid "Walther PPQ .45 ACP" +msgid_plural "Walther PPQ .45 ACPs" +msgstr[0] "Walther PPQ .45 ACP" +msgstr[1] "Walther PPQ .45 ACP" +msgstr[2] "Walther PPQ .45 ACP" +msgstr[3] "Walther PPQ .45 ACP" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in .45 ACP." +msgstr "" +"Полуавтоматический пистолет, разработанный на основе Walther P99QA и " +"совместимый с его аксессуарами. Эта модель предназначена под патрон .45 ACP." + +#: lang/json/gun_from_json.py +msgid "Hi-Point Model JHP" +msgid_plural "Hi-Point Model JHPs" +msgstr[0] "Hi-Point Model JHP" +msgstr[1] "Hi-Point Model JHP" +msgstr[2] "Hi-Point Model JHP" +msgstr[3] "Hi-Point Model JHP" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" +"Hi-Point Model JHP - полуавтоматический пистолет со свободным затвором от " +"компании \"Hi-Point Firearms\", знаменитой своим дешёвым и неудобным " +"оружием. Затвор сделан из копеечного цинкового сплава, довольно хрупкого по " +"сравнению со стальным." + #: lang/json/gun_from_json.py msgid "Taurus Raging Bull" msgid_plural "Taurus Raging Bull" @@ -104910,6 +105606,133 @@ msgstr "" "M17 — полуавтоматический пистолет с коротким ходом ствола, потомок SIG Sauer" " P320." +#: lang/json/gun_from_json.py +msgid "Browning Hi-Power 9x19mm" +msgid_plural "Browning Hi-Power 9x19mms" +msgstr[0] "Browning Hi-Power 9x19 мм" +msgstr[1] "Browning Hi-Power 9x19 мм" +msgstr[2] "Browning Hi-Power 9x19 мм" +msgstr[3] "Browning Hi-Power 9x19 мм" + +#: lang/json/gun_from_json.py +msgid "" +"The Browning Hi-Power is a semi-automatic handgun developed shortly before " +"the second world war. Widely issued since then, it remains in use by India, " +"Canada and Australia. This is a commercial variant produced by Browning Arms" +" in 9x19mm Parabellum." +msgstr "" +"Полуавтоматический пистолет, разработанный незадолго до Второй Мировой " +"Войны. С тех пор был довольно популярен и всё ещё встречается в Индии, " +"Канаде и Австралии. Это коммерческий вариант калибра 9х19 мм Парабеллум " +"производства \"Browning Arms\"." + +#: lang/json/gun_from_json.py +msgid "Walther P38" +msgid_plural "Walther P38s" +msgstr[0] "Walther P38" +msgstr[1] "Walther P38" +msgstr[2] "Walther P38" +msgstr[3] "Walther P38" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" +"Полуавтоматический пистолет, выпущенный незадолго до Второй Мировой Войны. " +"Его разработали по причине дороговизны предшественника, Luger P08. Он по-" +"прежнему предназначен под патрон 9 мм Парабеллум. Элементы дизайна с " +"комбинированным ударно-спусковым механизмом и запертой казённой частью нашли" +" применение в современных пистолетах вроде Беретты 92 серии. Этот пистолет " +"стоял на вооружении Германии до 2004 года." + +#: lang/json/gun_from_json.py +msgid "Walther PPQ 9mm" +msgid_plural "Walther PPQ 9mms" +msgstr[0] "Walther PPQ 9 мм" +msgstr[1] "Walther PPQ 9 мм" +msgstr[2] "Walther PPQ 9 мм" +msgstr[3] "Walther PPQ 9 мм" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in 9x19mm Parabellum." +msgstr "" +"Полуавтоматический пистолет, разработанный на основе Walther P99QA и " +"совместимый с его аксессуарами. Эта модель предназначена под патрон 9х19 мм " +"Парабеллум." + +#: lang/json/gun_from_json.py +msgid "Hi-Point C-9" +msgid_plural "Hi-Point C-9s" +msgstr[0] "Hi-Point C-9" +msgstr[1] "Hi-Point C-9" +msgstr[2] "Hi-Point C-9" +msgstr[3] "Hi-Point C-9" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" +"Hi-Point C-9 - полуавтоматический пистолет со свободным затвором от компании" +" \"Hi-Point Firearms\", знаменитой своим дешёвым и неудобным оружием. Затвор" +" сделан из копеечного цинкового сплава, довольно хрупкого по сравнению со " +"стальным." + +#: lang/json/gun_from_json.py +msgid "CZ-75" +msgid_plural "CZ-75s" +msgstr[0] "CZ-75" +msgstr[1] "CZ-75" +msgstr[2] "CZ-75" +msgstr[3] "CZ-75" + +#: lang/json/gun_from_json.py +msgid "" +"The CZ-75 is a semi-automatic pistol developed in Czechoslovakia, and is one" +" of the original wonder nines. Though designed for export to western " +"countries, it was declared a state secret; lack of international patent " +"protection meant that many clones and variants were produced and distributed" +" around the world, with Česká zbrojovka only joining in the 90's. This " +"pistol remains wildly popular among competition shooters." +msgstr "" +"Чехословацкий полуавтоматический пистолет, один из первых \"вандер-найнов\"." +" Хотя его предполагалось продавать западным странам, пистолет объявили " +"государственной тайной. Ввиду отсутствия международного патента по всему " +"миру появились копии и варианты, и только в 90-х его начала производить " +"чешская компания \"Česká zbrojovka\". Этот пистолет широко популярен на " +"соревнованиях стрелков." + +#: lang/json/gun_from_json.py +msgid "Walther CCP" +msgid_plural "Walther CCPs" +msgstr[0] "Walther CCP" +msgstr[1] "Walther CCP" +msgstr[2] "Walther CCP" +msgstr[3] "Walther CCP" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" +"Полуавтоматический пистолет со свободным затвором, предназначенный для " +"скрытого ношения. Внутри он почти идентичен классическому H&K P7. Благодаря " +"фиксированному стволу обладает повышенной точностью, хотя это сложно оценить" +" из-за короткого радиуса прицеливания." + #: lang/json/gun_from_json.py msgid "Makarov PM" msgid_plural "Makarov PMs" @@ -105030,23 +105853,6 @@ msgstr "" "Большой огнемёт с ёмким баком для напалма. Очень грозное и смертельное " "оружие." -#: lang/json/gun_from_json.py -msgid "simple flamethrower" -msgid_plural "simple flamethrowers" -msgstr[0] "простой огнемёт" -msgstr[1] "простых огнемёта" -msgstr[2] "простых огнемётов" -msgstr[3] "простой огнемёт" - -#: lang/json/gun_from_json.py -msgid "" -"A simple, home-made flamethrower. While its capacity is not superb, it is " -"more than capable of igniting terrain and monsters alike." -msgstr "" -"Простой, собранный из подручных материалов огнемёт. И хотя его дальность " -"действия не впечатляет, этого всё же достаточно для сожжения большинства " -"монстров." - #: lang/json/gun_from_json.py msgid "RM451 flamethrower" msgid_plural "RM451 flamethrowers" @@ -105186,6 +105992,20 @@ msgstr "" "к самовозгоранию за счёт силы Лоренца, порождаемой электромагнитной " "индукцией. Работает от обычного УБП." +#: lang/json/gun_from_json.py +msgid "barb launching organ" +msgid_plural "barb launching organs" +msgstr[0] "орган-колючкострел" +msgstr[1] "органа-колючкострела" +msgstr[2] "органов-колючкострелов" +msgstr[3] "органы-колючкострелы" + +#: lang/json/gun_from_json.py +msgid "A mutated organ capable of launching bony barbs at great speed." +msgstr "" +"Мутировавший орган, способный стрелять костяными колючками с высокой " +"скоростью." + #: lang/json/gun_from_json.py msgid "coilgun" msgid_plural "coilguns" @@ -105538,10 +106358,10 @@ msgstr "" #: lang/json/gun_from_json.py msgid "CMES laser cannon" msgid_plural "CMES laser cannons" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "лазерная пушка БМКЭ" +msgstr[1] "лазерных пушки БМКЭ" +msgstr[2] "лазерных пушек БМКЭ" +msgstr[3] "лазерные пушки БМКЭ" #: lang/json/gun_from_json.py msgid "" @@ -105549,20 +106369,24 @@ msgid "" "rotating-barrel active-cooled rapid-fire laser system, can spray death " "downrange with ease." msgstr "" +"Встроенное оружие экзоскелета БМКЭ - лазерная пушка с вращающимися стволами " +"и активным охлаждением. Сеет смерть на раз-два." #: lang/json/gun_from_json.py msgid "RMES marksman system" msgid_plural "RMES marksman systems" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "стрелковая система РМКЭ" +msgstr[1] "стрелковых системы РМКЭ" +msgstr[2] "стрелковых систем РМКЭ" +msgstr[3] "стрелковые системы РМКЭ" #: lang/json/gun_from_json.py msgid "" "This is the integral weapon system for the RMES exoskeleton mech-suit, a " "quiet and accurate marksman laser rifle." msgstr "" +"Встроенное оружие экзоскелета РМКЭ - бесшумное и точное снайперское лазерное" +" ружьё." #: lang/json/gun_from_json.py msgid "handheld laser cannon" @@ -105961,6 +106785,21 @@ msgstr "" "результате ударной силы происходит воспламенение кислорода в воздухе и " "взрыв." +#: lang/json/gun_from_json.py +msgid "Yeet Cannon" +msgid_plural "Yeet Cannons" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: lang/json/gun_from_json.py +msgid "" +"You can YEET all the bullets with this baby. YEET them right into all of the" +" zombies in your path, all the hulks, the spiders, and those damned mole " +"rats." +msgstr "" + #: lang/json/gun_from_json.py msgid "SVS-24" msgid_plural "SVS-24" @@ -108164,30 +109003,6 @@ msgstr "" "Taurus Raging Judge Magnum — пятизарядный револьвер под калибр .454 Casull. " "В нём могут применяться боеприпасы калибров .410 дробь и .45 Long Colt." -#: lang/json/gunmod_from_json.py -msgid ".300 AAC Blackout caliber conversion kit" -msgid_plural ".300 AAC Blackout caliber conversion kits" -msgstr[0] ".300 AAC Blackout переточка калибра" -msgstr[1] ".300 AAC Blackout переточки калибра" -msgstr[2] ".300 AAC Blackout переточек калибра" -msgstr[3] ".300 AAC Blackout переточки калибра" - -#: lang/json/gunmod_from_json.py -msgid "" -"This kit is used to convert an AR-15 .223/5.56mm rifle to the new .300BLK " -"caliber." -msgstr "" -"Комплект для переточки винтовки AR-15 .223/5.56 мм под новый калибр .300BLK." - -#: lang/json/gunmod_from_json.py -msgid "bore" -msgstr "калибр" - -#: lang/json/gunmod_from_json.py -msgctxt "gun_type_type" -msgid "ar15" -msgstr "AR-15" - #: lang/json/gunmod_from_json.py msgid "barrel extension" msgid_plural "barrel extensions" @@ -108298,6 +109113,10 @@ msgstr "" "4,6 мм, 7,62х39 мм или .223 под патрон калибра .22. Замена частей приведёт к" " небольшой потере точности." +#: lang/json/gunmod_from_json.py +msgid "bore" +msgstr "калибр" + #: lang/json/gunmod_from_json.py msgid ".223 caliber conversion kit" msgid_plural ".223 caliber conversion kits" @@ -108702,6 +109521,38 @@ msgstr "" "Сумка, которая висит сбоку от оружия и ловит выбрасываемые гильзы, благодаря" " чему не нужно тратить время, собирая их по округе." +#: lang/json/gunmod_from_json.py +msgid ".300 AAC Blackout AR-15 conversion kit" +msgid_plural ".300 AAC Blackout AR-15 conversion kits" +msgstr[0] ".300 AAC Blackout AR-15 переточка калибра" +msgstr[1] ".300 AAC Blackout AR-15 переточки калибра" +msgstr[2] ".300 AAC Blackout AR-15 переточек калибра" +msgstr[3] ".300 AAC Blackout AR-15 переточки калибра" + +#: lang/json/gunmod_from_json.py +msgid "A complete AR-15 upper assembly with a .300 AAC Blackout barrel." +msgstr "Набор для модификации AR-15 под приём патронов .300 AAC Blackout." + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "ar15" +msgstr "AR-15" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "m4a1" +msgstr "m4a1" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "h&k416a5" +msgstr "h&k416a5" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "m27iar" +msgstr "m27iar" + #: lang/json/gunmod_from_json.py msgid "lightweight replacement furniture" msgid_plural "lightweight replacement furnitures" @@ -111536,17 +112387,17 @@ msgstr "" #: lang/json/help_from_json.py msgid "" -"While magazines are often firearm-specific, on some occasions a magazine is compatible with several other firearms. The firearms in the game often reflect real-world prototypes in terms of caliber and compatibility. Below are some examples of interchangeable ammo:\n" -".308 = 7.62x51mm,\n" -".223 = 5.56 NATO,\n" -".270 = .30-06,\n" -".40 S&W = 10mm." +"While magazines and clips are often firearm-specific, on some occasions a magazine/speedloader is compatible with several other firearms or calibers. Below are some examples of calibers that might share magazines or speedloaders:\n" +".380 ACP and 9mm Luger,\n" +" .40 S&W and 10mm Auto 3\n" +".45 ACP and .460 Rowland,\n" +".45 Colt and .454 Casull." msgstr "" -"Хотя магазины зачастую подходят только к определённым видам оружия, иногда они также могут подходить и к другим видам. Огнестрельное оружие в игре основано на прототипах из реального мира в плане калибра и совместимости. Ниже представлены примеры такой взаимозаменяемости:\n" -".308 = 7.62x51 мм,\n" -".223 = 5.56 NATO,\n" -".270 = .30-06,\n" -".40 S&W = 10 мм." +"Как правило, магазины и обоймы часто подходят только к конкретному оружию, но иногда совместимы с несколькими другими пушками или калибрами. Вот примеры некоторых калибров с общими магазинами или обоймами:\n" +".380 ACP и 9 мм Luger,\n" +" .40 S&W и 10 мм Auto 3\n" +".45 ACP и .460 Rowland,\n" +".45 Colt и .454 Casull." #: lang/json/help_from_json.py msgid "Magazine descriptions also list the compatible ammo." @@ -112596,7 +113447,7 @@ msgstr "Копать через породу" #: lang/json/item_action_from_json.py msgid "Pack CBM in pouch" -msgstr "" +msgstr "Положить КБМ в сумку" #: lang/json/item_action_from_json.py msgid "Burrow through rock" @@ -112721,7 +113572,7 @@ msgstr "Использовать" #: lang/json/item_action_from_json.py msgid "Sterilize" -msgstr "" +msgstr "Стерилизовать" #: lang/json/item_action_from_json.py src/artifact.cpp msgid "Ring" @@ -112912,8 +113763,9 @@ msgid "Measure radiation" msgstr "Измерить радиацию" #: lang/json/item_action_from_json.py lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py #: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py -#: lang/json/talk_topic_from_json.py src/game_inventory.cpp +#: src/game_inventory.cpp msgid "..." msgstr "…" @@ -112975,12 +113827,16 @@ msgid "Well, you know" msgstr "Ну, ты знаешь" #: lang/json/item_action_from_json.py -msgid "Wash clothes" -msgstr "Стирать одежду" +msgid "Wash soft items" +msgstr "Вымыть мягкие вещи" #: lang/json/item_action_from_json.py -msgid "Wash CBMs" -msgstr "" +msgid "Wash hard items" +msgstr "Вымыть твёрдые вещи" + +#: lang/json/item_action_from_json.py +msgid "Wash items" +msgstr "Вымыть вещи" #: lang/json/item_action_from_json.py msgid "Purify some water" @@ -115009,7 +115865,7 @@ msgstr "Посмотреть Карту Видимости" #: lang/json/keybinding_from_json.py msgid "View Radiation Map" -msgstr "" +msgstr "Посмотреть Карту Радиации" #: lang/json/keybinding_from_json.py msgid "Switch Sidebar Style" @@ -116658,6 +117514,41 @@ msgstr "Широкий выбор аккумуляторных батарей! msgid "the name is gone but a slogan remains: 'We'll repair you all the way'" msgstr "название исчезло, но слоган остался: «Мы вас починим»." +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "EnviroCom OS v2.03 - Basement Access" +msgstr "ОС EnviroCom вер. 2.03 - Доступ в подвал" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Unlock stairs" +msgstr "Открыть лестницы" + +#. ~ Sign +#: lang/json/mapgen_from_json.py +msgid "Authorized personnel only" +msgstr "Только уполномоченный персонал" + +#. ~ Sign +#: lang/json/mapgen_from_json.py +msgid " sewage treatment plant" +msgstr "водоочистная станция города " + +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "EnviroCom OS v2.03" +msgstr "ОС EnviCom вер. 2.03" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Download Sewer Maps" +msgstr "Скачать карты канализации" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Divert sample" +msgstr "Взять пробы вод" + #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Evac shelter computer" @@ -116752,7 +117643,7 @@ msgstr "Чайный магазин «Зеленый Лист»" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "RESTRICTED AREA! AUTHORIZED PERSONNEL ONLY" -msgstr "" +msgstr "ЗАПРЕТНАЯ ЗОНА! ТОЛЬКО УПОЛНОМОЧЕННЫЙ ПЕРСОНАЛ" #. ~ Sign #: lang/json/mapgen_from_json.py @@ -116877,7 +117768,7 @@ msgstr "ОТКРЫТЬ ХРАНИЛИЩЕ" #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Prototype DARPA-713 AUTHORIZED PILOTS ONLY" -msgstr "" +msgstr "Прототип DARPA-713 ТОЛЬКО ДЛЯ ПИЛОТОВ С ДОПУСКОМ" #. ~ Computer name #: lang/json/mapgen_from_json.py @@ -116988,10 +117879,13 @@ msgid "" "injury to the attacker. It uses defensive throws and disarms but lacks " "offensive tehcniques." msgstr "" +"Айкидо — японское искусство рукопашного боя, сфокусированное на самообороне " +"и уменьшении травм атакующего. В нём много бросков и обезоруживающих " +"приёмов, но не хватает техник для нападения." #: lang/json/martial_art_from_json.py msgid "Aikido Stance" -msgstr "" +msgstr "Стойка Айкидо" #. ~ Description of buff 'Aikido Stance' for martial art 'Aikido' #: lang/json/martial_art_from_json.py @@ -117000,10 +117894,12 @@ msgid "" "By disregarding offensive in favor of self-defense, you are better at " "protecting. Blocked damage reduced by 100%% of Dexterity." msgstr "" +"Вы пренебрегаете нападением в пользу самозащиты и лучше защищаетесь. " +"Блокируемый урон снижается на 100%% Ловкости." #: lang/json/martial_art_from_json.py msgid "Intermediate Aikido" -msgstr "" +msgstr "Средний боец Айкидо" #. ~ Description of buff 'Intermediate Aikido' for martial art 'Aikido' #: lang/json/martial_art_from_json.py @@ -117012,10 +117908,13 @@ msgid "" "\n" "+1 Block attempts, +1 Dodge attempts." msgstr "" +"Средний боец айкидо умеет защищаться от нескольких противников.\n" +"\n" +"+1 попытка Блока, +1 попытка Уклонения." #: lang/json/martial_art_from_json.py msgid "Advanced Aikido" -msgstr "" +msgstr "Мастер Айкидо" #. ~ Description of buff 'Advanced Aikido' for martial art 'Aikido' #: lang/json/martial_art_from_json.py @@ -117024,6 +117923,9 @@ msgid "" "\n" "+1 Block attempts, +1 Dodge attempts." msgstr "" +"Мастер айкидо умеет защищаться от куда большего числа противников, чем обычно.\n" +"\n" +"+1 попытка Блока, +1 попытка Уклонения." #: lang/json/martial_art_from_json.py msgid "Boxing" @@ -117036,10 +117938,13 @@ msgid "" "of the Victorian era. Strength reduces blocked damage and moving increase " "dodge skill." msgstr "" +"Спорт настоящего джентльмена. Современный бокс развился из кулачных боёв " +"викторианской эпохи. Сила уменьшает блокируемый урон, а движение повышает " +"навык уклонения." #: lang/json/martial_art_from_json.py msgid "Boxing Stance" -msgstr "" +msgstr "Боксерская Стойка" #. ~ Description of buff 'Boxing Stance' for martial art 'Boxing' #: lang/json/martial_art_from_json.py @@ -117049,6 +117954,9 @@ msgid "" "\n" "+2 Bash damage, Blocked damge reduced by 50%% of Strength." msgstr "" +"В надёжной стойке вы блокируете больше урона, чем обычно, и лучше бьёте.\n" +"\n" +"+2 Дробящего урона, блокируемый урон уменьшается на 50%% Силы." #: lang/json/martial_art_from_json.py msgid "Footwork" @@ -117062,6 +117970,10 @@ msgid "" "+1.0 Dodge skill.\n" "Lasts for 1 turns. Stacks 2 times." msgstr "" +"Во время движения вы раскачиваетесь и изгибаетесь, и в вас сложнее попасть.\n" +"\n" +"+1 навык Уклонения.\n" +"Длится 1 ход. Складывается 2 раза." #: lang/json/martial_art_from_json.py msgid "Counter Chance" @@ -117076,6 +117988,10 @@ msgid "" "+25% Bash damage.\n" "Lasts for 1 turn." msgstr "" +"Вы увидели свой шанс. Теперь нанесите удар!\n" +"\n" +"+25% Дробящего урона.\n" +"Длится 1 ход." #: lang/json/martial_art_from_json.py msgid "Brawling" @@ -117088,6 +118004,8 @@ msgid "" "unarmed or with any weapon to a certain extent. It's not stylish or " "sporting, but it gets the job done." msgstr "" +"Вы привыкли драться врукопашную без оружия или практически с любым оружием. " +"Это некрасиво и неспортивно, но приносит результат." #: lang/json/martial_art_from_json.py msgid "Capoeira" @@ -117100,10 +118018,13 @@ msgid "" "on fluid movement and sweeping kicks. Moving briefly enables stronger " "techniques. Missing an attack grants bonus damage for a short time." msgstr "" +"Танцеподобный стиль, берущий свои корни в Бразилии. В капоэйре преобладают " +"плавные движения и размашистые удары ногами. Короткие передвижения приводят " +"к мощным приёмам. Промахи временно увеличивают наносимый урон." #: lang/json/martial_art_from_json.py msgid "Capoeira Stance" -msgstr "" +msgstr "Стойка Капоэйра" #. ~ Description of buff 'Capoeira Stance' for martial art 'Capoeira' #: lang/json/martial_art_from_json.py @@ -117112,6 +118033,9 @@ msgid "" "\n" "+1.0 Dodge skill, +1 Dodge attempts." msgstr "" +"Вы исполняете джингу без единой остановки. Во время драки вы очень подвижны.\n" +"\n" +"+1 навык Уклонения, +1 попытка уклонения." #: lang/json/martial_art_from_json.py msgid "Capoeira Momentum" @@ -117126,6 +118050,11 @@ msgid "" "Enables \"Spin Kick\" and \"Sweep Kick\" techniques.\n" "Lasts 3 turns." msgstr "" +"Вы ощущаете ритм своих движений. Теперь в вас не только сложнее попасть, но и ваши удары намного круче!\n" +"\n" +"+1 навык Уклонения.\n" +"Активирует техники \"Круговой удар\" и \"Размашистый удар\".\n" +"Длится 3 хода." #: lang/json/martial_art_from_json.py msgid "Crane Kung Fu" @@ -117138,6 +118067,10 @@ msgid "" "techniques and jumping dodges. Dexterity determines your damage, rather " "than Strength; you also receive a dodge bonus move or dodge an attack." msgstr "" +"Один из пяти животных стилей Шаолиня. Стиль журавля отличается сложными " +"движениями кисти и уворотами в прыжке. Урон определяется ловкостью, а не " +"силой. Также вы получаете бонусное движение уклонения или уклонение от " +"атаки." #: lang/json/martial_art_from_json.py msgid "Crane's Precision" @@ -117152,6 +118085,10 @@ msgid "" "\n" "Bash damage increased by 75%% of Dexterity but decreased by 75%% of Strength." msgstr "" +"Вы наносите удары в слабые места ваших противников при помощи скорости и точности вместо грубой силы.\n" +"Ловкость повышает рукопашный урон вместо Силы.\n" +"\n" +"Дробящий урон повышается на 75%% Ловкости, но снижается на 75%% Силы." #: lang/json/martial_art_from_json.py msgid "Crane's Flight" @@ -117165,10 +118102,14 @@ msgid "" "+1.0 Dodge skill.\n" "Lasts 2 turns." msgstr "" +"Подобно птице, вы взмываете в воздух от опасности.\n" +"\n" +"+1 навык Уклонения.\n" +"Длится 2 хода." #: lang/json/martial_art_from_json.py msgid "Crane's Grace" -msgstr "" +msgstr "Изящество журавля" #. ~ Description of buff 'Crane's Grace' for martial art 'Crane Kung Fu' #: lang/json/martial_art_from_json.py @@ -117178,6 +118119,10 @@ msgid "" "+1 Dodge attempts, +1.0 Dodge skill.\n" "Lasts 2 turns." msgstr "" +"Подобно журавлю, вы проворно избегаете опасности.\n" +"\n" +"+1 попытка уклонения, +1 навык Уклонения.\n" +"Длится 2 хода." #: lang/json/martial_art_from_json.py msgid "Dragon Kung Fu" @@ -117191,6 +118136,10 @@ msgid "" "Your attacks lead to counterattacks which disable your opponents and set " "them up for a powerful finishing move." msgstr "" +"Один из пяти животных стилей Шаолиня. В стиле дракона применяются плавные " +"движения и жёсткие удары. Точность увеличивается Интеллектом, а не " +"Ловкостью. Ваши атаки переходят в контратаки, которые обезвреживают ваших " +"противников и завершаются мощным ударом." #: lang/json/martial_art_from_json.py msgid "Dragon's Flight" @@ -117205,10 +118154,15 @@ msgid "" "Enables \"Dragon Vortex Block\" and \"Dragon Wing Dodge\"\n" "Lasts 1 turn." msgstr "" +"Жизнь и бой составляют круг. Атака ведёт за собой блок и ещё одну атаку. Ищите конец этого круга.\n" +"\n" +"+1 Точность, +2 Дробящий урон.\n" +"Активирует \"Вихревой блок Дракона\" и \"Уклонение драконьего крыла\"\n" +"Длится 1 ход." #: lang/json/martial_art_from_json.py msgid "Dragon's Knowledge" -msgstr "" +msgstr "Знания Дракона" #. ~ Description of buff 'Dragon's Knowledge' for martial art 'Dragon Kung Fu' #: lang/json/martial_art_from_json.py @@ -117218,6 +118172,9 @@ msgid "" "\n" "Accuracy increased by 25%% of Intelligence but decreased by 25%% of Dexterity." msgstr "" +"Вы продумываете свою атаку на много ходов вперёд и искусно наносите удар, полагаясь на интуицию вместо скорости. Интеллект повышает точность вместо Ловкости.\n" +"\n" +"Точность возрастает на 25%% Интеллекта, но снижается на 25%% Ловкости." #: lang/json/martial_art_from_json.py msgid "Eskrima" @@ -117236,7 +118193,7 @@ msgstr "" #: lang/json/martial_art_from_json.py msgid "Eskrima Stance" -msgstr "" +msgstr "Стойка Эскрима" #. ~ Description of buff 'Eskrima Stance' for martial art 'Eskrima' #: lang/json/martial_art_from_json.py @@ -117245,6 +118202,9 @@ msgid "" "\n" "+2 Accuracy." msgstr "" +"Вы можете получать максимум от своего оружия. Термин «оружие» может быть очень субъективным,\n" +"\n" +"+2 Точность" #: lang/json/martial_art_from_json.py msgid "Fencing" @@ -117258,10 +118218,14 @@ msgid "" "Skilled fencers can take advantage of blocks and feints to deliver accurate " "strikes." msgstr "" +"Благородное искусство фехтования преподается с гибкими соревновательными " +"лезвиями, но методы получены из (и применимы к) более функциональных " +"примеров. Опытные фехтовальщики могут использовать блоки и финты, чтобы " +"наносить точные удары." #: lang/json/martial_art_from_json.py msgid "Fencing Stance" -msgstr "" +msgstr "Фехтовальная стойка" #. ~ Description of buff 'Fencing Stance' for martial art 'Fencing' #: lang/json/martial_art_from_json.py @@ -117271,6 +118235,56 @@ msgid "" "\n" "Blocked damage reduced by 50%% of Dexterity." msgstr "" +"В вашей стойке противнику сложнее причинить вам вред.\n" +"\n" +"Блокируемый урон снижается на 50%% Ловкости." + +#. ~ Description for martial art 'Fior Di Battaglia' +#: lang/json/martial_art_from_json.py +msgid "" +"Medieval Europe's martial techniques for fighting with polearms. The " +"\"Flower of Battle\" places great focus on countering one's opponent and " +"knocking them down before landing a killing blow" +msgstr "" +"Боевая техника средневековой Европы для борьбы с древковым оружием. «Цветок " +"битвы» уделяет большое внимание тому, как противостоять противнику и сбивать" +" его с ног, прежде, чем нанести смертельный удар" + +#: lang/json/martial_art_from_json.py +msgid "Stand Your Ground" +msgstr "Держать позицию" + +#. ~ Description of buff 'Stand Your Ground' for martial art 'Fior Di +#. Battaglia' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You stalwart and will not budge against any threat.\n" +"\n" +"+2 Block attempts, -1.0 Dodge skill, blocked damage reduced by 50%% of Strength." +msgstr "" +"Вы отважно защищаетесь, и никакой угрозе не сдвинуть вас с места.\n" +"\n" +"+2 попытки блока, -1 навык Уклонения, блокируемый урон снижается на 50%% Силы." + +#: lang/json/martial_art_from_json.py +msgid "Tactical Retreat" +msgstr "Тактическое Отступление" + +#. ~ Description of buff 'Tactical Retreat' for martial art 'Fior Di +#. Battaglia' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You moved and nullified the effects of Stand Your Ground!\n" +"\n" +"-2 Block attempts, +1.0 Dodge skill, blocked damaged increased by 50%% of Strength.\n" +"Lasts 1 turn." +msgstr "" +"Вы сдвинулись и потеряли эффекты Удержания позиции!\n" +"\n" +"-2 попытки блока, +1 навык Уклонения, блокируемый урон увеличивается на 50%% Силы.\n" +"Длится 1 ход." #: lang/json/martial_art_from_json.py msgid "Karate" @@ -117766,35 +118780,6 @@ msgstr "Чутьё Чи-Сао" msgid "Perception increases dodging ability, +1 dodges per turn" msgstr "Восприятие увеличивает уклонение, +1 уклонение за ход" -#. ~ Description for martial art 'Fior Di Battaglia' -#: lang/json/martial_art_from_json.py -msgid "" -"Medieval Europe's martial techniques for fighting with polearms, great focus" -" is given in countering one's opponent and knocking them down before landing" -" a killing blow" -msgstr "" - -#: lang/json/martial_art_from_json.py -msgid "Stand Your Ground" -msgstr "" - -#. ~ Description of buff 'Stand Your Ground' for martial art 'Fior Di -#. Battaglia' -#: lang/json/martial_art_from_json.py -msgid "" -"+2 blocks -1 dodge, halves your dodge and damage is reduced by your strength" -" when blocking" -msgstr "" - -#: lang/json/martial_art_from_json.py -msgid "You moved" -msgstr "" - -#. ~ Description of buff 'You moved' for martial art 'Fior Di Battaglia' -#: lang/json/martial_art_from_json.py -msgid "Nullifies Stand Your Ground, don't move, stand there and counter!" -msgstr "" - #: lang/json/martial_art_from_json.py msgid "Medieval Swordsmanship" msgstr "Средневековый бой на мечах" @@ -117825,10 +118810,13 @@ msgid "" "Bionic Combatives combines integrated weaponry, armor and augments into an " "consolidated fighting discipline." msgstr "" +"Современный боевой стиль Биоджитсу для пост-современного человека. " +"Бионические приёмы борьбы сочетают встроенное оружие, броню и имплантаты в " +"сводное боевое искусство." #: lang/json/martial_art_from_json.py msgid "Biojutsu Stance" -msgstr "" +msgstr "Стойка Биоджитсу" #. ~ Description of buff 'Biojutsu Stance' for martial art 'Bionic Combatives' #: lang/json/martial_art_from_json.py @@ -117852,10 +118840,13 @@ msgid "" " an onslaught of rapid strikes. Each attack you land increases your attack " "speed. Critical hits increase your damage further." msgstr "" +"Один из Пяти Смертельных Ядов, им владел Чжэн Яофэнь. Стиль многоножки " +"отличается потоком быстрых ударов. С каждым ударом возрастает скорость " +"атаки. Критические удары повышают дальнейший урон." #: lang/json/martial_art_from_json.py msgid "Centipede's Frenzy" -msgstr "" +msgstr "Бешенство многоножки" #. ~ Description of buff 'Centipede's Frenzy' for martial art 'Centipede Kung #. Fu' @@ -117866,6 +118857,10 @@ msgid "" "-4 move cost.\n" "Lasts 3 turns. Stacks 4 times." msgstr "" +"Ваши атаки - это размытое пятно рук и ног, ускоряющихся всё быстрее, пока вы без устали бьёте ваших врагов.\n" +"\n" +"-4 стоимость движения.\n" +"Длится 3 хода. Складывается 4 раза." #: lang/json/martial_art_from_json.py msgid "Scorpion Kung Fu" @@ -118227,7 +119222,7 @@ msgstr "сломанный" #: lang/json/material_from_json.py msgid "Dragon Scale" -msgstr "" +msgstr "Драконья Чешуя" #: lang/json/material_from_json.py msgid "Chitin" @@ -118431,7 +119426,7 @@ msgstr "суперсплав" #: lang/json/material_from_json.py msgid "Tin" -msgstr "" +msgstr "Олово" #: lang/json/material_from_json.py msgid "Vegetable Matter" @@ -119832,42 +120827,6 @@ msgstr "Спасибо, что нашёл его!" msgid "Oh no! My poor puppy..." msgstr "О нет! Мой щенок…" -#: lang/json/mission_def_from_json.py -msgid "Find 100 Cigarettes" -msgstr "Найти 100 Сигарет" - -#: lang/json/mission_def_from_json.py -msgid "Come on man, I just need a smoke." -msgstr "Да ладно, чувак, мне нужно курнуть." - -#: lang/json/mission_def_from_json.py -msgid "" -"With all that's been going on, it's been more and more difficult to find a " -"smoke. My stash has been running low for a while now. Think you could help" -" me out here? A few packs is all I need." -msgstr "" -"С тем, что сейчас вокруг происходит, стало тяжело находить курево. Мои " -"запасы подходят к концу, сможешь мне помочь, как думаешь? Мне всего-то нужно" -" несколько пачек." - -#: lang/json/mission_def_from_json.py -msgid "Thanks, it's great to see someone willing to help a guy out." -msgstr "Спасибо! Рад видеть, что хоть кто-то решился помочь мне." - -#: lang/json/mission_def_from_json.py -msgid "" -"Plenty of smokers in towns. Gotta be some left over cigs in some of them " -"houses." -msgstr "В городе полно курящих. Кто-то наверняка оставил сиги дома." - -#: lang/json/mission_def_from_json.py -msgid "Got the smokes?" -msgstr "Принес курево?" - -#: lang/json/mission_def_from_json.py -msgid "Thanks! I'll be sure to put in a good word for you around the center." -msgstr "Спасибо! Замолвлю за тебя словечко в центре." - #: lang/json/mission_def_from_json.py msgid "Break into armory to retrieve family photo" msgstr "Взломай сейф, чтобы достать оттуда семейное фото" @@ -121378,8 +122337,8 @@ msgstr "" "Серьёзно? Ты не смог найти *ножницы*? Как же ты шнурки-то завязываешь?" #: lang/json/mission_def_from_json.py -msgid "Find 50 3L jars" -msgstr "Найти 50 трёхлитровых банок" +msgid "In a Pickle Pt. 2" +msgstr "Сбережения в банке, ч. 2" #: lang/json/mission_def_from_json.py msgid "I do have some work for you." @@ -121417,6 +122376,42 @@ msgstr "" "Ого, это куда больше банок, чем казалось на бумаге. Спасибо. Вот твоя " "оплата." +#: lang/json/mission_def_from_json.py +msgid "Smokes, let's go." +msgstr "Пойдём покурим." + +#: lang/json/mission_def_from_json.py +msgid "Come on man, I just need a smoke." +msgstr "Да ладно, чувак, мне нужно курнуть." + +#: lang/json/mission_def_from_json.py +msgid "" +"With all that's been going on, it's been more and more difficult to find a " +"smoke. My stash has been running low for a while now. Think you could help" +" me out here? A few packs is all I need." +msgstr "" +"С тем, что сейчас вокруг происходит, стало тяжело находить курево. Мои " +"запасы подходят к концу, сможешь мне помочь, как думаешь? Мне всего-то нужно" +" несколько пачек." + +#: lang/json/mission_def_from_json.py +msgid "Thanks, it's great to see someone willing to help a guy out." +msgstr "Спасибо! Рад видеть, что хоть кто-то решился помочь мне." + +#: lang/json/mission_def_from_json.py +msgid "" +"Plenty of smokers in towns. Gotta be some left over cigs in some of them " +"houses." +msgstr "В городе полно курящих. Кто-то наверняка оставил сиги дома." + +#: lang/json/mission_def_from_json.py +msgid "Got the smokes?" +msgstr "Принес курево?" + +#: lang/json/mission_def_from_json.py +msgid "Thanks! I'll be sure to put in a good word for you around the center." +msgstr "Спасибо! Замолвлю за тебя словечко в центре." + #: lang/json/mission_def_from_json.py msgid "Clear Back Bay" msgstr "Зачистить задние комнаты" @@ -121559,8 +122554,8 @@ msgstr "" "оплата." #: lang/json/mission_def_from_json.py -msgid "Find 10 solar panels" -msgstr "Найти 10 солнечных батарей" +msgid "Solar Power" +msgstr "Солнечная энергетика" #: lang/json/mission_def_from_json.py msgid "" @@ -121597,8 +122592,8 @@ msgstr "" "Спасибо за помощь." #: lang/json/mission_def_from_json.py -msgid "Find 100 canning jars" -msgstr "Найти 100 банок" +msgid "In a Pickle" +msgstr "Сбережения в банке" #: lang/json/mission_def_from_json.py msgid "" @@ -121923,8 +122918,8 @@ msgid "Thank you, I'll do the explaining if anyone else asks about it." msgstr "Спасибо. Я разъясню всем, кто будет спрашивать об этом." #: lang/json/mission_def_from_json.py -msgid "Kill ???" -msgstr "Убить ???" +msgid "Secure Trade Route" +msgstr "Обезопасить торговый путь" #: lang/json/mission_def_from_json.py msgid "" @@ -121955,8 +122950,8 @@ msgid "Great work, wasn't sure what I was sending you after." msgstr "Отличная работа. Если честно, меня терзали сомнения." #: lang/json/mission_def_from_json.py -msgid "Kill Raider Leader" -msgstr "Убить лидера Рейдеров" +msgid "Assassinate Raider Leader" +msgstr "Убить главаря налётчиков" #: lang/json/mission_def_from_json.py msgid "" @@ -122116,11 +123111,11 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" -"Remember, do extraction /exactly/ as specified, otherwise the bionic will " -"self-destruct." +"Remember, perform the extraction /exactly/ as specified, otherwise the " +"bionic will self-destruct." msgstr "" -"Помни, проведи извлечение /в точности/ как указано, иначе бионический " -"имплант самоуничтожится." +"Помни, извлекай имплантат /в точности/ как указано, иначе он " +"самоуничтожится." #: lang/json/mission_def_from_json.py msgid "" @@ -122148,6 +123143,44 @@ msgstr "У тебя есть копия?" msgid "You have our thanks and payment." msgstr "Передаём нашу благодарность и оплату." +#: lang/json/mission_def_from_json.py +msgid "Light retrieval" +msgstr "Вернуть фотонный накопитель" + +#: lang/json/mission_def_from_json.py +msgid "" +"Our facility once sourced advanced photonic circuitry from a nearby robotics manufacturer. Their building suffered major damage during the portal storms, and collapsed almost entirely. However, preliminary scouting reveals that the basement prototyping lab likely remains intact.\n" +"\n" +"the intercom: We ask you to investigate the ruins, and if possible, retrieve a template for the fabrication of said photonic circuitry." +msgstr "" +"Местный робопроизводитель когда-то поставлял нам продвинутые фотонные схемы. Во время портальных штормов их здание сильно пострадало и почти полностью обвалилось. Однако предварительная разведка докладывает, что в подвале могла уцелеть прототипная лаборатория.\n" +"\n" +"интерком: Мы просим тебя обследовать руины и принести шаблон для фотонной схемы, если получится." + +#: lang/json/mission_def_from_json.py +msgid "We expect your success, mercenary." +msgstr "Мы ожидаем твоих успехов, наёмник." + +#: lang/json/mission_def_from_json.py +msgid "Return if you change your mind." +msgstr "Возвращайся, если передумаешь." + +#: lang/json/mission_def_from_json.py +msgid "" +"The scout drone also revealed extensive heat signatures and high " +"concentrations of toxic compounds within the ruins, plan accordingly. We " +"are willing to sell you some protective gear at a discount, if you require " +"it." +msgstr "" +"Разведывательный дрон также выявил значительное тепловое излучение и высокие" +" концентрации ядовитых веществ внутри руин, так что подготовься " +"соответственно. Если нужно, мы готовы продать защитное снаряжение со " +"скидкой." + +#: lang/json/mission_def_from_json.py +msgid "Have you retrieved the blueprints?" +msgstr "Удалось ли вернуть чертежи?" + #: lang/json/mission_def_from_json.py msgid "Make 2 Stills" msgstr "Изготовить 2 дистиллятора" @@ -125928,7 +126961,7 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "Weight: XS" -msgstr "" +msgstr "Недостаток веса" #. ~ Description for Weight: XS #: lang/json/mutation_from_json.py @@ -125937,10 +126970,13 @@ msgid "" " skeletal figure is now an extra burden, when food is not at hand's reach. " "You need to gain weight or die trying." msgstr "" +"До Катаклизма вы были по какой-то причине чрезвычайно худы. Теперь под рукой" +" мало еды, и ваше тощее тело усложняет жизнь. Вам нужно набрать вес или " +"умереть." #: lang/json/mutation_from_json.py msgid "Weight: XXXL" -msgstr "" +msgstr "Ожирение" #. ~ Description for Weight: XXXL #: lang/json/mutation_from_json.py @@ -125949,6 +126985,9 @@ msgid "" "your bloated figure is now an extra burden, when mobility is a key to " "survival. You need to go on a diet or die trying." msgstr "" +"До Катаклизма у вас по какой-то причине было слишком много лишнего веса. " +"Теперь выживание зависит от подвижности, и ваше разжиревшее тело усложняет " +"жизнь. Вам нужно похудеть или умереть." #: lang/json/mutation_from_json.py msgid "Pretty" @@ -133262,7 +134301,7 @@ msgstr "Фатима аль-Жадир" #: lang/json/npc_from_json.py msgid "Garry Villeneuve" -msgstr "Гарри Вилленю" +msgstr "Гарри Вильнёв" #: lang/json/npc_from_json.py msgid "Guneet Singh" @@ -133848,7 +134887,7 @@ msgstr "аренда лодок" #: lang/json/overmap_terrain_from_json.py msgid "lighthouse" -msgstr "" +msgstr "маяк" #: lang/json/overmap_terrain_from_json.py msgid "forest" @@ -134128,6 +135167,10 @@ msgstr "сахарный дом" msgid "sugar house roof" msgstr "крыша сахарного дома" +#: lang/json/overmap_terrain_from_json.py +msgid "rural road" +msgstr "загородная дорога" + #: lang/json/overmap_terrain_from_json.py msgid "farm field" msgstr "пашня" @@ -135952,8 +136995,16 @@ msgid "parking garage" msgstr "парковочный гараж" #: lang/json/overmap_terrain_from_json.py -msgid "sewage treatment" -msgstr "очистное сооружение" +msgid "sewage treatment plant" +msgstr "водоочистная станция" + +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment plant roof" +msgstr "крыша водоочистной станции" + +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment plant - underground" +msgstr "подвал водоочистной станции" #: lang/json/overmap_terrain_from_json.py msgid "toxic waste dump" @@ -136093,7 +137144,7 @@ msgstr "крыша магической лавки" #: lang/json/overmap_terrain_from_json.py msgid "used bookstore" -msgstr "" +msgstr "старый книжный магазин" #: lang/json/overmap_terrain_from_json.py msgid "apartment towers" @@ -136260,6 +137311,10 @@ msgstr "общественная библиотека, второй этаж" msgid "mechanics garage" msgstr "гараж механика" +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment" +msgstr "очистное сооружение" + #: lang/json/overmap_terrain_from_json.py msgid "mechanic garage" msgstr "гараж механика" @@ -137276,6 +138331,40 @@ msgstr "" "Ты не особо поняла, что произошло, но случилось дерьмо, а единственная мысль" " в твоей голове это: «Где бы ещё обдолбаться?»." +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Pillhead" +msgstr "Торчок" + +#. ~ Profession (male Pillhead) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"After an accident in your youth, you got addicted to the opiates treating " +"your pain. With the pharmacies shut down and dealers turned undead, " +"satisfying your fix just got a lot more difficult." +msgstr "" +"После несчастного случая в молодости вы подсели на опиаты, облегчающие вашу " +"боль. Аптеки теперь закрыты, продавцы превратились в зомби, и достать " +"лекарство стало намного сложнее." + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Pillhead" +msgstr "Торчок" + +#. ~ Profession (female Pillhead) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"After an accident in your youth, you got addicted to the opiates treating " +"your pain. With the pharmacies shut down and dealers turned undead, " +"satisfying your fix just got a lot more difficult." +msgstr "" +"После несчастного случая в молодости вы подсели на опиаты, облегчающие вашу " +"боль. Аптеки теперь закрыты, продавцы превратились в зомби, и достать " +"лекарство стало намного сложнее." + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "K9 Officer" @@ -144184,7 +145273,6 @@ msgid "WEAPON" msgstr "ОРУЖИЕ" #. ~ Crafting recipes subcategory all -#. ~ Crafting recipes subcategory of 'ENCHANTED' category #: lang/json/recipe_category_from_json.py #: lang/json/recipe_category_from_json.py src/crafting_gui.cpp msgid "ALL" @@ -146296,6 +147384,8 @@ msgid "" "You've found some distant safe place, devoid of the living dead. Looks like" " you're on your own..." msgstr "" +"Вы добрались до какого-то безопасного места вдали от живых мертвецов. " +"Похоже, теперь вы сами за себя..." #. ~ Description for scenario 'Safe Place' for a female character. #: lang/json/scenario_from_json.py @@ -146304,6 +147394,8 @@ msgid "" "You've found some distant safe place, devoid of the living dead. Looks like" " you're on your own..." msgstr "" +"Вы добрались до какого-то безопасного места вдали от живых мертвецов. " +"Похоже, теперь вы сами за себя..." #. ~ Starting location for scenario 'Safe Place'. #: lang/json/scenario_from_json.py @@ -146473,6 +147565,8 @@ msgid "" " while they evacuated before lockdown. Find a way to escape or starve to " "death." msgstr "" +"Учёные резко свернули эксперименты над вами, бросили вас во время эвакуации " +"и запечатали здание. Найдите способ сбежать или умрите от голода." #. ~ Description for scenario 'Challenge - Lab Patient' for a female #. character. @@ -146483,6 +147577,8 @@ msgid "" " while they evacuated before lockdown. Find a way to escape or starve to " "death." msgstr "" +"Учёные резко свернули эксперименты над вами, бросили вас во время эвакуации " +"и запечатали здание. Найдите способ сбежать или умрите от голода." #. ~ Starting location for scenario 'Challenge - Lab Patient'. #. ~ Starting location for scenario 'Challenge - Lab Staff'. @@ -146510,6 +147606,8 @@ msgid "" "You were deemed non-essential and made to stay behind during the lab " "evacuation. Find a way to escape or starve to death." msgstr "" +"Во время эвакуации лаборатории вас посчитали слишком незначительным и " +"оставили позади. Найдите способ сбежать или умрите от голода." #. ~ Description for scenario 'Challenge - Lab Staff' for a female character. #: lang/json/scenario_from_json.py @@ -146518,6 +147616,8 @@ msgid "" "You were deemed non-essential and made to stay behind during the lab " "evacuation. Find a way to escape or starve to death." msgstr "" +"Во время эвакуации лаборатории вас посчитали слишком незначительной и " +"оставили позади. Найдите способ сбежать или умрите от голода." #. ~ Name for scenario 'Ambush' for a male character #: lang/json/scenario_from_json.py @@ -146538,6 +147638,8 @@ msgid "" "It is the winter after zero hour. As you were scavenging for food and a " "warm place to stay at, you heard the sound of lots of movement nearby." msgstr "" +"Зима после часа ноль. Вы искали еду и тёплый ночлег и услышали, как " +"поблизости кто-то движется." #. ~ Description for scenario 'Ambush' for a female character. #: lang/json/scenario_from_json.py @@ -146546,6 +147648,8 @@ msgid "" "It is the winter after zero hour. As you were scavenging for food and a " "warm place to stay at, you heard the sound of lots of movement nearby." msgstr "" +"Зима после часа ноль. Вы искали еду и тёплый ночлег и услышали, как " +"поблизости кто-то движется." #. ~ Starting location for scenario 'Ambush'. #. ~ Starting location for scenario 'The Next Summer'. @@ -146694,6 +147798,10 @@ msgid "" " the prisoners have turned into mindless horrors and the security bots are " "shooting on sight... you might need to expedite your escape plans." msgstr "" +"Когда случился катаклизм, вы находились в тюрьме, будучи преступником или " +"кем-то из работников. Заключённые превратились в безмозглые ходячие ужасы, а" +" охранные боты стреляют на поражение... Возможно, вам стоит поторопиться с " +"вашими планами побега." #. ~ Description for scenario 'Prison' for a female character. #: lang/json/scenario_from_json.py @@ -146703,6 +147811,10 @@ msgid "" " the prisoners have turned into mindless horrors and the security bots are " "shooting on sight... you might need to expedite your escape plans." msgstr "" +"Когда случился катаклизм, вы находились в тюрьме, будучи преступницей или " +"кем-то из работников. Заключённые превратились в безмозглые ходячие ужасы, а" +" охранные боты стреляют на поражение... Возможно, вам стоит поторопиться с " +"вашими планами побега." #. ~ Starting location for scenario 'Prison'. #: lang/json/scenario_from_json.py @@ -147928,10 +149040,8 @@ msgstr "" "может быть то, что вам на данный момент нужнее всего." #: lang/json/snippet_from_json.py -msgid "Wounds heal over time. Bandages and disinfectant speeds that up." -msgstr "" -"Раны заживают со временем. Своевременная перевязка и дезинфекция ускоряют " -"этот процесс." +msgid "Wounds heal over time. Bandages and antiseptic speeds that up." +msgstr "Раны заживают со временем. Бинты и антисептик ускоряют процесс." #: lang/json/snippet_from_json.py msgid "Don't get grabbed by zombies. Their bites can be infectious." @@ -148871,11 +149981,11 @@ msgstr "Я могу перевязать твои раны, так что дай #: lang/json/snippet_from_json.py msgid "" -"If you have extra disinfectant, use it to disinfect your wounds, even if " -"they aren't infected. They will recover faster that way." +"If you have extra antiseptic, use it to disinfect your wounds, even if they " +"aren't infected. They will recover faster that way." msgstr "" -"Если у тебя есть дезинфектант, обработай им своим раны, даже если они не " -"заражены. Они заживут куда быстрее." +"Если у тебя есть антисептик, обработай свои раны, даже если они не заражены." +" Они заживут куда быстрее." #: lang/json/snippet_from_json.py msgid "" @@ -153959,6 +155069,9 @@ msgid "" "attention \"/!\\Always place your tools into an autoclave pouch before " "autoclaving./!\\\"" msgstr "" +"Листок с указаниями по процедуре автоклавирования. Вы замечаете одну фразу " +"\"/!\\Перед автоклавированием обязательно поместите инструменты в сумку для " +"автоклавирования/!\\\"" #: lang/json/snippet_from_json.py msgid "" @@ -156107,17 +157220,6 @@ msgstr "" "свою работу, свою страну, даже за свою жизнь… конечно, некоторые из них " "обратят свой взор на наркотики», — говорит эксперт." -#: lang/json/snippet_from_json.py -msgid "" -"WAR ON DRUGS DEAD: The government has finally reacted to long accumulated " -"evidence that suggests that decriminalized drugs cause fewer health problems" -" and are generally better managed while providing valuable tax revenues." -msgstr "" -"ВОЙНА С НАРКОТИКАМИ ЗАКОНЧЕНА: Правительство наконец отреагировало на долго " -"накапливавшиеся свидетельства того, что легально продающиеся наркотики " -"вызывают меньше проблем со здоровьем и в целом легче поддаются контролю, в " -"то же время их продажа обеспечивает хорошие налоговые отчисления." - #: lang/json/snippet_from_json.py msgid "" "FEELING BLUE? Try \"Greens\" for Magazines! Your local Supermarket! " @@ -161360,14 +162462,12 @@ msgid "" "Bionics are augmentation packages, right? They come in these installable Compact Bionic Modules or CBMs, and I can use some CBMs - if you examine a CBM, it will tell you if I can use it.\n" " Find a programmable surgical installer or autodoc, position me on the couch, and activate it, and you can install a suitable CBM to me - or if I think I'll do a better job, I'll do. I'll take over installing CBMs into you if I'm better at it.\n" " I can use almost all passive bionics and some active bionics. If I have any active bionics, I'll try to use them sensibly, but if we're in danger, I'm going to activate anything that might give me an edge. I'll use any weapon bionics if they're better than the weapons you gave me, but if you think I should reserve my bionic energy for my defensive and healing bionics, you can tell me how much to reserve. I'll try to keep my bionic energy topped off, but if we're running low on supplies, you can tell me to stop recharging when I'm not full.\n" -" I'll tell you if I'm low on bionic energy and can't recharge, and what fuel I need.\n" -" Sothere are some internal atomic reactor bionics - I can use those, but I can only recharge them with plutonium slurry. That stuff is radioactive, so do us both a favor and don't give me an internal reactor unless you really like glowing in the dark." +" I'll tell you if I'm low on bionic energy and can't recharge, and what fuel I need." msgstr "" "Бионика — это наборы с имплантатами, верно? Они выпускаются как устанавливаемые Компактные Бионические Модули, или КБМ, и я могу пользоваться некоторыми — если ты осмотришь КБМ, то увидишь указание, годится он или нет.\n" " Найди программируемую хирургическую машину-автодока, положи меня на кушетку и активируй её, чтобы установить подходящий КБМ — или я всё сделаю сам, если сумею справиться лучше. Ещё я смогу установить в тебя КБМ, если лучше в этом разбираюсь.\n" " Я могу пользоваться почти всей пассивной и некоторой активной бионикой. Если у меня есть активная, я буду её применять со здравым смыслом, но в случае опасности активирую всё, что может дать преимущество. Я воспользуюсь любым бионическим оружием, если оно лучше того, что ты мне дал, но ты можешь приказать мне беречь энергию для защитной и лечебной бионики. Я буду стараться держать энергию на максимуме, но если топлива мало, ты можешь приказать не заряжаться.\n" -" Я дам знать, если у меня мало энергии и нечем зарядиться и укажу, какое топливо нужно.\n" -" Где-то есть встроенные бионические реакторы — они мне годятся, но перезаряжаются только плутониевым шламом. Он радиоактивный, так что будь любезен и не встраивай в меня реактор, если не хочешь светиться в темноте." +" Я дам знать, если у меня мало энергии и нечем зарядиться и укажу, какое топливо нужно." #: lang/json/talk_topic_from_json.py msgid "Tell me how I give you fuel for your bionics." @@ -161576,14 +162676,14 @@ msgstr "Подъём!" msgid "Go back to sleep." msgstr "Спи дальше." -#: lang/json/talk_topic_from_json.py -msgid " *pshhhttt* I'm reading you boss, over." -msgstr "*пшшш-пшшш* я тебя слушаю, босс, приём." - #: lang/json/talk_topic_from_json.py msgid "What is it, friend?" msgstr "Что такое, друг?" +#: lang/json/talk_topic_from_json.py +msgid " *pshhhttt* I'm reading you boss, over." +msgstr "*пшшш-пшшш* я тебя слушаю, босс, приём." + #: lang/json/talk_topic_from_json.py msgid "Combat commands..." msgstr "Боевые команды…" @@ -161829,14 +162929,14 @@ msgstr "Оставайся на том же месте." msgid "Show me what needs to be done at the camp." msgstr "Покажи, что нужно сделать в лагере." -#: lang/json/talk_topic_from_json.py -msgid "I'm currently ." -msgstr "Сейчас моё занятие - ." - #: lang/json/talk_topic_from_json.py msgid "I'm not doing much currently." msgstr "Я сейчас ничего не делаю." +#: lang/json/talk_topic_from_json.py +msgid "I'm currently ." +msgstr "Сейчас моё занятие - ." + #: lang/json/talk_topic_from_json.py msgid "Carry on." msgstr "Продолжай." @@ -161893,34 +162993,34 @@ msgid "OK, maybe it'll stop me from freezing in this weather, what's up?" msgstr "" "Ладно, пусть это поможет мне не замёрзнуть при такой погоде. Как дела?" +#: lang/json/talk_topic_from_json.py +msgid "Man it's dark out isn't it? what's up?" +msgstr "Блин, тут же так темно? Что случилось?" + #: lang/json/talk_topic_from_json.py msgid "" "Well, it's the time of day for a quick break surely! How are you holding " "up?" msgstr "Что ж, как раз подходящее время немного отдохнуть! Как у тебя дела?" -#: lang/json/talk_topic_from_json.py -msgid "Man it's dark out isn't it? what's up?" -msgstr "Блин, тут же так темно? Что случилось?" - #: lang/json/talk_topic_from_json.py msgid "Well, I'm feeling pretty sick... are you doing OK though?" msgstr "Ну, мне не совсем хорошо… а у тебя там всё нормально?" #: lang/json/talk_topic_from_json.py msgid "" -"Definitely, by the way, thanks for helping me so much with my tasks! " -"Anyway, you coping OK, ? " +"OK, let's take a moment, oh, and thanks for helping me with that thing, " +"so... what's up?" msgstr "" -"Конечно, и кстати, спасибо тебе, ты мне столько помогаешь! Ладно, , " -"всё нормально?" +"ОК, давай на минутку, о, и спасибо за помощь с тем делом, так что… как дела?" #: lang/json/talk_topic_from_json.py msgid "" -"OK, let's take a moment, oh, and thanks for helping me with that thing, " -"so... what's up?" +"Definitely, by the way, thanks for helping me so much with my tasks! " +"Anyway, you coping OK, ? " msgstr "" -"ОК, давай на минутку, о, и спасибо за помощь с тем делом, так что… как дела?" +"Конечно, и кстати, спасибо тебе, ты мне столько помогаешь! Ладно, , " +"всё нормально?" #: lang/json/talk_topic_from_json.py msgid "" @@ -161996,14 +163096,14 @@ msgstr "Ладно, не делай резких движений…" msgid "Keep your distance!" msgstr "Не подходи ближе!" -#: lang/json/talk_topic_from_json.py -msgid "" -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "This is my territory, ." msgstr "Это моя территория, ." +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Calm down. I'm not going to hurt you." msgstr "Успокойся. Я не причиню тебе зла." @@ -162056,14 +163156,6 @@ msgstr "Что случилось?" msgid "I don't care." msgstr "Мне всё равно." -#: lang/json/talk_topic_from_json.py -msgid "I don't have any jobs for you." -msgstr "У меня нет работы для тебя." - -#: lang/json/talk_topic_from_json.py -msgid "I don't have any more jobs for you." -msgstr "У меня больше нет для тебя работы." - #: lang/json/talk_topic_from_json.py msgid "I have other jobs for you. Want to hear about them?" msgstr "У меня для тебя есть и другая работа. Хочешь послушать?" @@ -162072,13 +163164,21 @@ msgstr "У меня для тебя есть и другая работа. Хо msgid "I have more jobs for you. Want to hear about them?" msgstr "У меня для тебя есть ещё работа. Хочешь послушать?" +#: lang/json/talk_topic_from_json.py +msgid "I just have one job for you. Want to hear about it?" +msgstr "У меня есть работа для тебя. Хочешь послушать?" + #: lang/json/talk_topic_from_json.py msgid "I have another job for you. Want to hear about it?" msgstr "У меня есть другая работа для тебя. Хочешь послушать?" #: lang/json/talk_topic_from_json.py -msgid "I just have one job for you. Want to hear about it?" -msgstr "У меня есть работа для тебя. Хочешь послушать?" +msgid "I don't have any more jobs for you." +msgstr "У меня больше нет для тебя работы." + +#: lang/json/talk_topic_from_json.py +msgid "I don't have any jobs for you." +msgstr "У меня нет работы для тебя." #: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py #: src/npctalk.cpp @@ -162090,16 +163190,16 @@ msgid "Never mind, I'm not interested." msgstr "Неважно, мне не интересно." #: lang/json/talk_topic_from_json.py -msgid "You're not working on anything for me now." -msgstr "Ты сейчас на меня не работаешь." +msgid "What about it?" +msgstr "Что насчёт него?" #: lang/json/talk_topic_from_json.py msgid "Which job?" msgstr "Какое задание?" #: lang/json/talk_topic_from_json.py -msgid "What about it?" -msgstr "Что насчёт него?" +msgid "You're not working on anything for me now." +msgstr "Ты сейчас на меня не работаешь." #: lang/json/talk_topic_from_json.py msgid "I'll do it!" @@ -168902,8 +170002,8 @@ msgid "All right! Let's get going." msgstr "Хорошо! Давай идти." #: lang/json/talk_topic_from_json.py -msgid "We've done it! We've solved the list!" -msgstr "Мы сделали это! Мы закончили список!" +msgid "Have I told you about cardboard, friend? Do you have any?" +msgstr "Дружище, говорил ли я тебе про картон? Нет ли у тебя его с собой?" #: lang/json/talk_topic_from_json.py msgid "" @@ -168911,8 +170011,8 @@ msgid "" msgstr "Как продвигаются дела? У меня уже впечатляющее количество картона." #: lang/json/talk_topic_from_json.py -msgid "Have I told you about cardboard, friend? Do you have any?" -msgstr "Дружище, говорил ли я тебе про картон? Нет ли у тебя его с собой?" +msgid "We've done it! We've solved the list!" +msgstr "Мы сделали это! Мы закончили список!" #: lang/json/talk_topic_from_json.py msgid "About that shopping list of yours..." @@ -171344,19 +172444,19 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "Nice to meet you, Gunny." -msgstr "Рад встрече с тобой, Джут" +msgstr "Рад встрече с тобой, Гунни." #: lang/json/talk_topic_from_json.py msgid "Hi, Gunny. What's up?" -msgstr "Привет, Джут, случилось что?" +msgstr "Привет, Гунни, случилось что?" #: lang/json/talk_topic_from_json.py msgid "Hi Gunny, nice to meet you. I gotta go though." -msgstr "Привет, Джут, рад знакомству, но мне пора." +msgstr "Привет, Гунни, рад знакомству, но мне пора." #: lang/json/talk_topic_from_json.py msgid "Hi Gunny. I can't stay to talk." -msgstr "Привет, Джут. Я не могу остаться поговорить." +msgstr "Привет, Гунни. Я не могу остаться поговорить." #: lang/json/talk_topic_from_json.py msgid "" @@ -174136,6 +175236,10 @@ msgstr "Есть ли какая-нибудь работа?" msgid "What the hell were you testing out there?" msgstr "Какого хрена вы там изучаете?" +#: lang/json/talk_topic_from_json.py +msgid "So, about that protective gear?" +msgstr "Что там про защитное снаряжение?" + #: lang/json/talk_topic_from_json.py msgid "No. Now leave." msgstr "Нет. Теперь уходи." @@ -174155,6 +175259,24 @@ msgstr "" "курсе, что получилось… Жалко, что так вышло, со всем этим расчленением и " "прочим…" +#: lang/json/talk_topic_from_json.py +msgid "" +"Given the current context, we are willing to sell you a set of our protective gear: gas mask, suit and gear, at a considerable discount. We will sell it for two of our coins.\n" +"\n" +"the intercom: Hmm wait, we might not have your size..." +msgstr "" +"В текущих условиях мы можем продать наш комплект: противогаз, костюм и снаряжение со значительной скидкой. Цена - две наших монеты.\n" +"\n" +"интерком: Хммм, погоди, у нас может не найтись твоего размера..." + +#: lang/json/talk_topic_from_json.py +msgid "[ 2 Hub 01 Gold Coins ] Deal!" +msgstr "[ 2 золотые монеты Центра 01 ] По рукам!" + +#: lang/json/talk_topic_from_json.py +msgid "I have to give it a thought." +msgstr "Мне надо подумать." + #: lang/json/talk_topic_from_json.py msgid "Just leave." msgstr "Просто уходи." @@ -174940,63 +176062,63 @@ msgstr " без труда обезоруживает и оглушае #: lang/json/technique_from_json.py msgid "Measured Strike (melee)" -msgstr "" +msgstr "Точный удар (ближний бой)" #: lang/json/technique_from_json.py #, python-format msgid "You make an efficent strike against %s" -msgstr "" +msgstr "Вы наносите %s отличный удар" #: lang/json/technique_from_json.py #, python-format msgid " makes an efficent strike against %s" -msgstr "" +msgstr " наносит %s отличный удар" #: lang/json/technique_from_json.py msgid "Measured Strike (unarmed)" -msgstr "" +msgstr "Точный удар (без оружия)" #: lang/json/technique_from_json.py msgid "Biojutsu Impale" -msgstr "" +msgstr "Пронзание био-джитсу" #: lang/json/technique_from_json.py #, python-format msgid "You brutally impale %s with your weapon" -msgstr "" +msgstr "Вы жестоко пронзаете %s своим оружием" #: lang/json/technique_from_json.py #, python-format msgid " brutally impales %s with their weapon" -msgstr "" +msgstr " жестоко пронзает %s своим оружием" #: lang/json/technique_from_json.py msgid "Biojutsu Takedown" -msgstr "" +msgstr "Захват био-джитсу" #: lang/json/technique_from_json.py #, python-format msgid "You kick and slam %s to the ground" -msgstr "" +msgstr "Вы пинаете %s и швыряете на землю" #: lang/json/technique_from_json.py #, python-format msgid " kicks and slams %s to the ground" -msgstr "" +msgstr " пинает %s и швыряет на землю" #: lang/json/technique_from_json.py msgid "Biojutsu Cleave" -msgstr "" +msgstr "Рассечение био-джитсу" #: lang/json/technique_from_json.py #, python-format msgid "You quickly cleave through %s and those nearby" -msgstr "" +msgstr "Вы стремительно прорубаетесь сквозь %s и окружающих " #: lang/json/technique_from_json.py #, python-format msgid " quickly cleaves through %s and those nearby" -msgstr "" +msgstr " стремительно прорубается сквозь %s и окружающих " #: lang/json/technique_from_json.py msgid "Viper Hiss" @@ -175107,16 +176229,16 @@ msgstr "Разрыв захвата" #: lang/json/technique_from_json.py #, python-format msgid "The %s tries to grab you, but you skitter free!" -msgstr "" +msgstr "%s пытается вас схватить, но вы выворачиваетесь!" #: lang/json/technique_from_json.py #, python-format msgid "The %s tries to grab , but they skitter free!" -msgstr "" +msgstr "%s пытается схватить , но тот выворачивается!" #: lang/json/technique_from_json.py msgid "Centipede Strike" -msgstr "" +msgstr "Удар многоножки" #: lang/json/technique_from_json.py #, python-format @@ -175130,27 +176252,27 @@ msgstr " наносит быстрый удар по %s" #: lang/json/technique_from_json.py msgid "Centipede Bite" -msgstr "" +msgstr "Укус многоножки" #: lang/json/technique_from_json.py #, python-format msgid "You palm strike %s with a painful Centipede Bite" -msgstr "" +msgstr "Вы наносите %s ладонью болезненный Укус Многоножки" #: lang/json/technique_from_json.py #, python-format msgid " palm strikes %s with a painful Centipede Bite" -msgstr "" +msgstr " наносит %s ладонью болезненный Укус Многоножки" #: lang/json/technique_from_json.py #, python-format msgid "You disarm %s with lightning speed" -msgstr "" +msgstr "Вы молниеносно разоружаете %s" #: lang/json/technique_from_json.py #, python-format msgid " disarms %s with lightning speed" -msgstr "" +msgstr " молниеносно разоружает %s" #: lang/json/technique_from_json.py msgid "Not at technique at all" @@ -175478,69 +176600,69 @@ msgstr " ловко наносит прямой удар %s" #: lang/json/technique_from_json.py msgid "Block Counter Disarm" -msgstr "" +msgstr "Блок и контрразоружение" #: lang/json/technique_from_json.py #, python-format msgid "You block and smoothly disarm %s" -msgstr "" +msgstr "Вы блокируете и плавно разоружаете %s" #: lang/json/technique_from_json.py #, python-format msgid " blocks and smoothly disarms %s" -msgstr "" +msgstr " блокирует и плавно разоружает %s" #: lang/json/technique_from_json.py msgid "Block Counter Throw" -msgstr "" +msgstr "Блок и контрбросок" #: lang/json/technique_from_json.py #, python-format msgid "You block and smoothly throw %s" -msgstr "" +msgstr "Вы блокируете и плавно бросаете %s" #: lang/json/technique_from_json.py #, python-format msgid " blocks and smoothly throws %s" -msgstr "" +msgstr " блокирует и плавно бросает%s" #: lang/json/technique_from_json.py msgid "Dodge Counter Throw" -msgstr "" +msgstr "Уклонение и контрбросок" #: lang/json/technique_from_json.py #, python-format msgid "You dodge and smoothly throw %s" -msgstr "" +msgstr "Вы уклоняетесь и плавно бросаете %s" #: lang/json/technique_from_json.py #, python-format msgid " dodges and smoothly throws %s" -msgstr "" +msgstr " уклоняется и плавно бросает%s" #: lang/json/technique_from_json.py msgid "Dodge Counter Disarm" -msgstr "" +msgstr "Уклонение и контрразоружение" #: lang/json/technique_from_json.py #, python-format msgid "You dodge and smoothly disarm %s" -msgstr "" +msgstr "Вы уклоняетесь и плавно разоружаете %s" #: lang/json/technique_from_json.py #, python-format msgid " dodges and smoothly disarms %s" -msgstr "" +msgstr " уклоняется и плавно разоружает %s" #: lang/json/technique_from_json.py #, python-format msgid "The %s tries to grab you, but you smoothly break free!" -msgstr "" +msgstr "%s пытается вас схватить, но вы плавно выворачиваетесь!" #: lang/json/technique_from_json.py #, python-format msgid "The %s tries to grab , but they smoothly break free!" -msgstr "" +msgstr "%s пытается схватить , но тот плавно выворачивается!" #: lang/json/technique_from_json.py msgid "Cross" @@ -175601,12 +176723,12 @@ msgstr " наносит апперкот %s" #: lang/json/technique_from_json.py #, python-format msgid "The %s tries to grab you, but you force yourself free!" -msgstr "" +msgstr "%s пытается вас схватить, но вы разрываете захват!" #: lang/json/technique_from_json.py #, python-format msgid "The %s tries to grab , but they break free!" -msgstr "" +msgstr "%s пытается схватить , но тот разрывает захват!" #: lang/json/technique_from_json.py msgid "Hit Them Back" @@ -175630,17 +176752,17 @@ msgstr "Вы делаете ложный выпад в сторону %s" #: lang/json/technique_from_json.py #, python-format msgid " fakes a strike at %s" -msgstr "" +msgstr " наносит ложный удар по %s" #: lang/json/technique_from_json.py #, python-format msgid "You knock %s's weapon away" -msgstr "" +msgstr "Вы отпинываете оружие %s прочь" #: lang/json/technique_from_json.py #, python-format msgid " knock %s's weapon away" -msgstr "" +msgstr " отпинывает оружие %s прочь" #: lang/json/technique_from_json.py msgid "Power Hit" @@ -175658,73 +176780,73 @@ msgstr "Вы делаете подножку %s" #: lang/json/technique_from_json.py #, python-format msgid " trip %s" -msgstr "" +msgstr " делает подножку %s" #: lang/json/technique_from_json.py #, python-format msgid "You fake a kick at %s" -msgstr "" +msgstr "Вы наносите ложный удар по %s" #: lang/json/technique_from_json.py #, python-format msgid " fakes a kick at %s" -msgstr "" +msgstr " наносит ложный удар по %s" #: lang/json/technique_from_json.py msgid "Push Kick" -msgstr "" +msgstr "Толкающий удар" #: lang/json/technique_from_json.py #, python-format msgid "You push kick %s" -msgstr "" +msgstr "Вы наносите толкающий удар ногой по %s" #: lang/json/technique_from_json.py #, python-format msgid " push kicks %s" -msgstr "" +msgstr " наносит толкающий удар ногой по %s" #: lang/json/technique_from_json.py msgid "Circle Kick" -msgstr "" +msgstr "Круговой удар ногой" #: lang/json/technique_from_json.py #, python-format msgid "You circle kick %s" -msgstr "" +msgstr "Вы наносите круговой удар ногой по %s" #: lang/json/technique_from_json.py #, python-format msgid " circle kicks %s" -msgstr "" +msgstr " наносит круговой удар ногой по %s" #: lang/json/technique_from_json.py msgid "Sweep Kick" -msgstr "" +msgstr "Размашистый удар" #: lang/json/technique_from_json.py #, python-format msgid "You sweep kick %s" -msgstr "" +msgstr "Вы размашисто бьёте %s" #: lang/json/technique_from_json.py #, python-format msgid " sweep kicks %s" -msgstr "" +msgstr " размашисто бьёт %s" #: lang/json/technique_from_json.py msgid "Spin Kick" -msgstr "" +msgstr "Круговой удар" #: lang/json/technique_from_json.py #, python-format msgid "You spin kick %s" -msgstr "" +msgstr "Вы наносите круговой удар по %s" #: lang/json/technique_from_json.py #, python-format msgid " spin kicks %s" -msgstr "" +msgstr " наносит круговой удар по %s" #: lang/json/technique_from_json.py msgid "Crane Wing" @@ -175770,35 +176892,35 @@ msgstr "" #: lang/json/technique_from_json.py msgid "Crane Kick" -msgstr "" +msgstr "удар Журавля" #: lang/json/technique_from_json.py #, python-format msgid "You leap and kick %s" -msgstr "" +msgstr "Вы подпрыгиваете и бьёте %s ногой" #: lang/json/technique_from_json.py #, python-format msgid " leaps and kicks %s" -msgstr "" +msgstr " подпрыгивает и бьёт %s ногой" #: lang/json/technique_from_json.py msgid "Dragon Claw" -msgstr "" +msgstr "Коготь дракона" #: lang/json/technique_from_json.py #, python-format msgid "You lash out at %s with a Dragon Claw" -msgstr "" +msgstr "Вы набрасываетесь на %s Когтем дракона" #: lang/json/technique_from_json.py #, python-format msgid " lashes out at %s with a Dragon Claw" -msgstr "" +msgstr " набрасывается на %s Когтем дракона" #: lang/json/technique_from_json.py msgid "Dragon Vortex Block" -msgstr "" +msgstr "Вихревой блок Дракона" #: lang/json/technique_from_json.py #, python-format @@ -175812,31 +176934,31 @@ msgstr " блокирует и закручивает %s" #: lang/json/technique_from_json.py msgid "Dragon Wing Dodge" -msgstr "" +msgstr "Уклонение драконьего крыла" #: lang/json/technique_from_json.py #, python-format msgid "You dodge the attack and leave %s off balance" -msgstr "" +msgstr "Вы уворачиваетесь от атаки и выводите %s из равновесия" #: lang/json/technique_from_json.py #, python-format msgid " dodges and leaves %s off balance" -msgstr "" +msgstr " уворачивается от атаки и выводит %s из равновесия" #: lang/json/technique_from_json.py msgid "Dragon Tail" -msgstr "" +msgstr "Драконий Хвост" #: lang/json/technique_from_json.py #, python-format msgid "You sweep %s with a quick Dragon Tail" -msgstr "" +msgstr "Вы размашисто бьёте %s стремительным Хвостом дракона" #: lang/json/technique_from_json.py #, python-format msgid " sweeps %s with a quick Dragon Tail sweep" -msgstr "" +msgstr " размашисто бьёт %s стремительным Хвостом дракона" #: lang/json/technique_from_json.py msgid "Dragon Strike" @@ -175845,16 +176967,16 @@ msgstr "атака дракона" #: lang/json/technique_from_json.py #, python-format msgid "You descend upon %s with a powerful Dragon Strike" -msgstr "" +msgstr "Вы низвергаетесь на %s мощным Ударом дракона" #: lang/json/technique_from_json.py #, python-format msgid " descends upon %s with a powerful Dragon Strike" -msgstr "" +msgstr " низвергается на %s мощным Ударом дракона" #: lang/json/technique_from_json.py msgid "Round Strike" -msgstr "" +msgstr "круговой удар" #: lang/json/technique_from_json.py #, python-format @@ -175868,7 +176990,7 @@ msgstr " наносит %s удар по кругу" #: lang/json/technique_from_json.py msgid "Fan Strike" -msgstr "" +msgstr "веерный удар" #: lang/json/technique_from_json.py #, python-format @@ -175882,7 +177004,7 @@ msgstr " наносит %s веерный удар" #: lang/json/technique_from_json.py msgid "Snap Strike" -msgstr "" +msgstr "хлёсткий удар" #: lang/json/technique_from_json.py #, python-format @@ -175896,7 +177018,7 @@ msgstr " наносит %s удар с отскоком" #: lang/json/technique_from_json.py msgid "Combination Strike" -msgstr "" +msgstr "комбинация ударов" #: lang/json/technique_from_json.py #, python-format @@ -175910,7 +177032,7 @@ msgstr " наносит %s комбинацию ударов" #: lang/json/technique_from_json.py msgid "Puño Strike" -msgstr "" +msgstr "удар пуньо" #: lang/json/technique_from_json.py #, python-format @@ -175924,31 +177046,31 @@ msgstr " бьёт рукояткой %s" #: lang/json/technique_from_json.py msgid "Low Strike" -msgstr "" +msgstr "низкий удар" #: lang/json/technique_from_json.py #, python-format msgid "Your weapon becomes a blur as you ground %s" -msgstr "" +msgstr "Ваше оружие смазанным пятном врезается в %s" #: lang/json/technique_from_json.py #, python-format msgid "'s weapon becomes a blur as they ground %s" -msgstr "" +msgstr "Оружие смазанным пятном врезается в %s" #: lang/json/technique_from_json.py #, python-format msgid "You steady your weapon and fake a thrust at %s" -msgstr "" +msgstr "Вы уверенно совершаете ложный выпад на %s" #: lang/json/technique_from_json.py #, python-format msgid " steadies their weapon and fake a thrust at %s" -msgstr "" +msgstr " уверенно совершает ложный выпад на %s" #: lang/json/technique_from_json.py msgid "Fencing Lunge" -msgstr "" +msgstr "фехтовальный выпад" #: lang/json/technique_from_json.py #, python-format @@ -175962,30 +177084,110 @@ msgstr " делает выпад в сторону %s" #: lang/json/technique_from_json.py msgid "Compound Attack" -msgstr "" +msgstr "сложная атака" #: lang/json/technique_from_json.py #, python-format msgid "Your feint leads to a compound attack against %s" -msgstr "" +msgstr "Ваш финт переходит в сложную атаку против %s" #: lang/json/technique_from_json.py #, python-format msgid "'s feint leads to a compound attack against %s" -msgstr "" +msgstr "Финт переходит в сложную атаку против %s" #: lang/json/technique_from_json.py msgid "Fencing Riposte" -msgstr "" +msgstr "фехтовальный контрудар" #: lang/json/technique_from_json.py #, python-format msgid "You deliver a perfect riposte to %s" -msgstr "" +msgstr "Вы наносите прекрасный контрудар по %s" #: lang/json/technique_from_json.py #, python-format msgid " delivers a perfect riposte to %s" +msgstr " наносит прекрасный контрудар по %s" + +#: lang/json/technique_from_json.py +msgid "Displace and Hook" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You parry and hook %s down" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " parries and hooks %s down" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "High Round Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You swing high and strike at %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " swings high and strikes %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "High Round Feint" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You fake a high round strike at %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " feints at %s" +msgstr " делает обманное движение от %s" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab you, but you push away!" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab , but they push away!" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Hook and Drag" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You hook and drag %s down" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " hooks and drags %s down" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Colpo di Grazia" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You swing down hard and execute %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " swings down hard and executes %s" msgstr "" #: lang/json/technique_from_json.py @@ -176165,11 +177367,6 @@ msgstr "обманный выпад" msgid "You feint at %s" msgstr "Вы делаете обманное движение от %s" -#: lang/json/technique_from_json.py -#, python-format -msgid " feints at %s" -msgstr " делает обманное движение от %s" - #: lang/json/technique_from_json.py #, python-format msgid "You jab %s" @@ -176618,57 +177815,6 @@ msgstr "Вы получаете дар жестокости от %s, и возв msgid " receives %s's attack, and counters" msgstr " атакован %s и наносит ответный удар" -#: lang/json/technique_from_json.py -msgid "Displace and Hook" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You parry %s attack and hook them down" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid " parries %s attack and hooks them down" -msgstr "" - -#: lang/json/technique_from_json.py -msgid "High Round Strike" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You swing high and strike at %s" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid " swings high and strikes %s" -msgstr "" - -#: lang/json/technique_from_json.py -msgid "High Round Feint" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You fake a high round strike at %s" -msgstr "" - -#: lang/json/technique_from_json.py -msgid "High Round Stab" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You quickly stab %s" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid " quickly stabs %s" -msgstr "" - #: lang/json/technique_from_json.py msgid "grab and pommel strike" msgstr "схватить и нанести удар" @@ -178559,6 +179705,16 @@ msgstr "" msgid "SMASH!" msgstr "ГРОХОТ!" +#: lang/json/terrain_from_json.py +msgid "metal floor" +msgstr "металлический пол" + +#. ~ Description for metal floor +#: lang/json/terrain_from_json.py +msgid "" +"High-quality and tough checkered flooring to reduce risk of slips and falls." +msgstr "" + #: lang/json/terrain_from_json.py msgid "linoleum tile" msgstr "линолеум" @@ -178675,10 +179831,6 @@ msgstr "" "Незаконченный ряд арматур, залитых бетоном: пол ещё не выровнен, крыша также" " не установлена." -#: lang/json/terrain_from_json.py -msgid "metal floor" -msgstr "металлический пол" - #. ~ Description for metal floor #: lang/json/terrain_from_json.py msgid "" @@ -184792,6 +185944,16 @@ msgstr "хитиновый таран" msgid "biosilicfied chitin ram" msgstr "таран из биосилицированного хитина" +#: lang/json/vehicle_part_from_json.py +msgid "tied mattress" +msgstr "привязанный матрас" + +#. ~ Description for tied mattress +#: lang/json/vehicle_part_from_json.py +msgid "" +"A mattress, strapped onto the vehicle. It could serve to blunt any impact." +msgstr "Матрас, привязанный к машине. Смягчит любой удар." + #. ~ Description for shredder #: lang/json/vehicle_part_from_json.py msgid "" @@ -189502,6 +190664,10 @@ msgstr "%s рассортировал все доступные предметы msgid "Stop %s?" msgstr "Прекратить %s?" +#: src/activity_type.h +msgid "THIS IS A BUG" +msgstr "ЭТО БАГ" + #: src/addiction.cpp msgid "You need some nicotine." msgstr "Вам нужен никотин." @@ -191092,10 +192258,6 @@ msgstr "%1$s из %2$s" msgid "artifact file" msgstr "файл артефактов" -#: src/auto_pickup.cpp -msgid " AUTO PICKUP MANAGER " -msgstr " НАСТРОЙКА АВТОПОДБОРА " - #: src/auto_pickup.cpp src/game.cpp src/safemode_ui.cpp msgid "dd" msgstr "Добавить" @@ -191144,14 +192306,6 @@ msgstr "Правила" msgid "I/E" msgstr "I/E" -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "[]" -msgstr "[<Общие>]" - -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "[]" -msgstr "[<Персонаж>]" - #: src/auto_pickup.cpp msgid "Auto pickup enabled:" msgstr "Автоподбор включён:" @@ -191168,10 +192322,6 @@ msgstr "Да" msgid "witch" msgstr " сменить" -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "Please load a character first to use this page!" -msgstr "Чтобы использовать эту страницу, требуется загрузить персонажа!" - #: src/auto_pickup.cpp src/safemode_ui.cpp msgid "" msgstr "<пустое правило>" @@ -191221,6 +192371,18 @@ msgstr "Правило подбора:" msgid "Save changes?" msgstr "Сохранить изменения?" +#: src/auto_pickup.cpp +msgid " AUTO PICKUP MANAGER " +msgstr " НАСТРОЙКА АВТОПОДБОРА " + +#: src/auto_pickup.cpp src/safemode_ui.cpp +msgid "[]" +msgstr "[<Общие>]" + +#: src/auto_pickup.cpp src/safemode_ui.cpp +msgid "[]" +msgstr "[<Персонаж>]" + #: src/auto_pickup.cpp #, c-format msgid "%1$d item matches: %2$s" @@ -191242,6 +192404,11 @@ msgstr "Автоподбор не включён в настройках. Вкл msgid "autopickup configuration" msgstr "настройка автоподнятия" +#: src/auto_pickup.cpp +#, c-format +msgid "Pickup rules for %s" +msgstr "Правила сбора для %s" + #: src/avatar.cpp src/iuse.cpp msgid "He" msgstr "Он" @@ -192514,8 +193681,38 @@ msgstr "Вы убираете %s." #: src/bionics.cpp #, c-format -msgid "%s withdraws %s %s." -msgstr "%s изымает у %s %s." +msgid " withdraws %s %s." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Your %s does not have enought fuel to start." +msgstr "У вас не хватает топлива, чтобы запустить %s." + +#: src/bionics.cpp +#, c-format +msgid "'s %s does not have enought fuel to start." +msgstr "У не хватает топлива, чтобы запустить %s." + +#: src/bionics.cpp +#, c-format +msgid "Your %s turns off to not waste fuel." +msgstr "Ваш %s отключается, чтобы не тратить топливо." + +#: src/bionics.cpp +#, c-format +msgid "'s %s turns off to not waste fuel." +msgstr "У отключается %s во избежание траты топлива." + +#: src/bionics.cpp +#, c-format +msgid "Your %s runs out of fuel and turn off." +msgstr "%s истратил всё топливо и отключается." + +#: src/bionics.cpp +#, c-format +msgid "'s %s runs out of fuel and turn off." +msgstr "У %s истратил всё топливо и отключается." #: src/bionics.cpp #, c-format @@ -192908,6 +194105,10 @@ msgstr "" "Сознание ускользает прочь, и вы жалеете, что не сможете насладиться " "операцией." +#: src/bionics_ui.cpp +msgid "Available Fuel: " +msgstr "Доступное Топливо:" + #: src/bionics_ui.cpp #, c-format msgid "" @@ -193056,7 +194257,7 @@ msgstr "Брони" #: src/bonuses.cpp msgid "Armor penetration" -msgstr "" +msgstr "Бронебойность" #: src/bonuses.cpp msgid "Target armor multiplier" @@ -194295,11 +195496,11 @@ msgstr "" #: src/clzones.cpp msgid "Loot: Custom" -msgstr "" +msgstr "Предметы: Настраиваемое" #: src/clzones.cpp msgid "Destination for loot with a custom filter that you can modify." -msgstr "" +msgstr "Место назначения для предметов с настраиваемым изменяемым фильтром." #: src/clzones.cpp msgid "Loot: Ignore" @@ -194350,19 +195551,19 @@ msgstr "Нет семян" #: src/clzones.cpp #, c-format msgid "Loot: Custom : %s" -msgstr "" +msgstr "Предметы: Настраиваемое : %s" #: src/clzones.cpp msgid "Loot: Custom : No Filter" -msgstr "" +msgstr "Предметы: Настраиваемое : Без фильтра" #: src/clzones.cpp msgid "Loot: Custom: " -msgstr "" +msgstr "Предметы: Настраиваемое: " #: src/clzones.cpp msgid "No filter" -msgstr "" +msgstr "Без Фильтра" #: src/clzones.cpp msgid "No construction" @@ -196233,6 +197434,24 @@ msgstr[1] " переваривает %s и получает %d един msgstr[2] " переваривает %s и получает %d единиц энергии." msgstr[3] " переваривает %s и получает %d единицу энергии." +#: src/consumption.cpp +#, c-format +msgid "You load %i charge of %s in your %s." +msgid_plural "You load %i charges of %s in your %s." +msgstr[0] "Вы помещаете %i заряд %s в ваш %s." +msgstr[1] "Вы помещаете %i заряда %s в ваш %s." +msgstr[2] "Вы помещаете %i зарядов %s в ваш %s." +msgstr[3] "Вы помещаете %i зарядов %s в ваш %s." + +#: src/consumption.cpp +#, c-format +msgid " load %i charge of %s in their %s." +msgid_plural " load %i charges of %s in their %s." +msgstr[0] " помещает %i заряд %s в свой %s." +msgstr[1] " помещает %i заряда %s в свой %s." +msgstr[2] " помещает %i зарядов %s в свой %s." +msgstr[3] " помещает %i зарядов %s в свой %s." + #: src/craft_command.cpp src/crafting.cpp src/veh_interact.cpp msgid " (nearby)" msgstr " (поблизости)" @@ -196323,8 +197542,12 @@ msgstr "Вы больше не можете это собрать!" #: src/crafting.cpp #, c-format -msgid "You don't have anything to store %s in!" -msgstr "У вас нет ёмкости для хранения %s!" +msgid "" +"You don't have anything in which to store %s and may have to pour it out or " +"consume it as soon as it is prepared! Proceed?" +msgstr "" +"Вам не во что налить %s, так что по завершению готовки придётся это выпить " +"или вылить! Продолжить?" #: src/crafting.cpp src/pickup.cpp #, c-format @@ -196928,6 +198151,10 @@ msgstr "Хороший выстрел!" msgid "Grazing hit." msgstr "Скользящее попадание." +#: src/creature.cpp +msgid "You feel poison coursing through your body!" +msgstr "Вы чувствуете, как яд разливается по вашему телу!" + #: src/creature.cpp msgid "The shot misses!" msgstr "Мимо!" @@ -197176,7 +198403,7 @@ msgstr "Переключить отображение видимости" #: src/debug_menu.cpp msgid "Toggle display radiation" -msgstr "" +msgstr "Переключить отображение радиации" #: src/debug_menu.cpp msgid "Show mutation category levels" @@ -198513,21 +199740,21 @@ msgid "You can't see the terrain here." msgstr "Вы не можете увидеть, какая здесь местность." #: src/descriptions.cpp +#, c-format msgid "" "\n" -"Sign: ???" +"Sign: %s" msgstr "" "\n" -"Знак: ???" +"Знак: %s" #: src/descriptions.cpp -#, c-format msgid "" "\n" -"Sign: %s" +"Sign: ???" msgstr "" "\n" -"Знак: %s" +"Знак: ???" #: src/descriptions.cpp src/iexamine.cpp #, c-format @@ -201814,20 +203041,6 @@ msgstr "данные о состоянии интерфейса" msgid "Failed to save game data" msgstr "Не удалось сохранить данные игры" -#: src/game.cpp -msgid "You haven't killed any monsters yet!" -msgstr "Вы не убили ни одного монстра!" - -#: src/game.cpp -#, c-format -msgid "KILL COUNT: %d" -msgstr "ВСЕГО УБИТО: %d" - -#: src/game.cpp -#, c-format -msgid "Experience: %d (%d points available)" -msgstr "Опыт: %d (%d очков доступно)" - #: src/game.cpp msgid " You are forgotten among the billions lost in the cataclysm..." msgstr " Вы оказались среди миллиардов других жертв Катаклизма…" @@ -202227,7 +203440,7 @@ msgstr "Вы управляете машиной (%s)." #: src/game.cpp msgid "No vehicle controls found." -msgstr "" +msgstr "Не найдена система управления транспорта." #: src/game.cpp msgid "Control vehicle where?" @@ -202235,7 +203448,7 @@ msgstr "Какой машиной управлять?" #: src/game.cpp msgid "The vehicle doesn't have controls there." -msgstr "" +msgstr "Здесь нет управления транспортом." #: src/game.cpp msgid "No vehicle there." @@ -202548,7 +203761,7 @@ msgstr "Изменить тип" #: src/game.cpp msgid "Edit filter" -msgstr "" +msgstr "Изменить фильтр" #: src/game.cpp msgid "Edit options" @@ -203050,7 +204263,7 @@ msgstr "Не удаётся найти схваченный объект." #: src/game.cpp msgid "You cannot board a vehicle whilst riding." -msgstr "" +msgstr "Вы не можете зайти в транспорт верхом." #: src/game.cpp msgid "You cannot pass obstacles whilst mounted." @@ -203909,6 +205122,11 @@ msgstr "Невозможно выпить пролитые жидкости" msgid "You're fully charged" msgstr "Ваша энергия на максимуме" +#: src/game_inventory.cpp +#, c-format +msgid "No space to store more %s" +msgstr "%s здесь больше не поместится" + #: src/game_inventory.cpp msgid "soon!" msgstr "скоро!" @@ -203941,6 +205159,18 @@ msgstr "старое" msgid "rotten" msgstr "гнилое" +#: src/game_inventory.cpp src/panels.cpp +msgid "Food :" +msgstr "Голод :" + +#: src/game_inventory.cpp src/panels.cpp +msgid "Drink:" +msgstr "Жажда :" + +#: src/game_inventory.cpp src/panels.cpp +msgid "Pain :" +msgstr "Боль :" + #: src/game_inventory.cpp msgid "Consume item" msgstr "Употребить" @@ -205917,59 +207147,63 @@ msgstr "Горение закончилось и принесло %d угля." #: src/iexamine.cpp msgid "This furnace already contains calcium carbide." -msgstr "" +msgstr "Эта печь уже содержит карбид кальция." #: src/iexamine.cpp msgid "Remove it before activating the arc furnace again." -msgstr "" +msgstr "Извлеките его, прежде чем снова активировать дуговую печь." #: src/iexamine.cpp #, c-format msgid "This furnace contains %s, which can't be made into calcium carbide!" msgstr "" +"В дуговой печи находится %s, а из этого нельзя сделать карбид кальция!" #: src/iexamine.cpp msgid "" "This furance is empty. Fill it with powdered coke and lime mix, and try " "again." msgstr "" +"Дуговая печь пуста. Положите в неё измельчённую смесь кокса и извести и " +"попробуйте ещё раз." #: src/iexamine.cpp msgid "" "The batch in this furance is too small to yield usable calcium carbide." msgstr "" +"Сырья, заложенного в печь, слишком мало для получения карбида кальция." #: src/iexamine.cpp msgid "" "This furnace is ready to be turned on, but you lack a UPS with sufficient " "power." -msgstr "" +msgstr "Дуговая печь готова к работе, но вам не хватает зарядов УБП." #: src/iexamine.cpp #, c-format msgid "This furnace contains %s %s of material, and is ready to be turned on." -msgstr "" +msgstr "Печь содержит %s %s материала и готова к работе." #: src/iexamine.cpp msgid "Turn on the furnace?" -msgstr "" +msgstr "Включить печь?" #: src/iexamine.cpp msgid "You turn on the furnace." -msgstr "" +msgstr "Вы включили печь." #: src/iexamine.cpp msgid "This furnace is empty..." -msgstr "" +msgstr "Эта печь пуста..." #: src/iexamine.cpp msgid "There's an arc furnace there." -msgstr "" +msgstr "Это дуговая печь." #: src/iexamine.cpp #, c-format msgid "It has finished burning, yielding %d calcium carbide." -msgstr "" +msgstr "Обжигание закончилось и принесло %d карбида кальция." #: src/iexamine.cpp msgid "This autoclave is empty..." @@ -206020,7 +207254,7 @@ msgstr "Цикл завершён, КБМ теперь стерильны." msgid "" "CBMs in direct contact with the environment will almost immediately become " "contaminated." -msgstr "" +msgstr "После контакта с окружающей средой КБМ почти сразу загрязняются." #: src/iexamine.cpp src/iexamine.cpp src/vehicle_use.cpp msgid "Select an action" @@ -206743,6 +207977,14 @@ msgid "ERROR NO SPACE AVAILABLE. Operation impossible. Exiting." msgstr "" "ОШИБКА — НЕТ СВОБОДНОГО МЕСТА. Операция невозможна. Завершение работы." +#: src/iexamine.cpp +msgid "Personality_Override" +msgstr "Personality_Override" + +#: src/iexamine.cpp +msgid "C0RR#PTED?D#TA" +msgstr "ДА#НЫЕ?ПОВР#ЖДЕНЫ" + #: src/iexamine.cpp msgid "Choose bionic to uninstall" msgstr "Выберите бионику для удаления" @@ -207428,7 +208670,7 @@ msgstr "Локации глобальной карты" #: src/init.cpp msgid "Map extras" -msgstr "" +msgstr "Доп. локации" #: src/init.cpp msgid "Ammunition types" @@ -208039,8 +209281,8 @@ msgid "Capacity: " msgstr "Ёмкость: " #: src/item.cpp -msgid " per round" -msgstr " за заряд" +msgid " moves per round" +msgstr "" #: src/item.cpp msgid "Reload time: " @@ -208143,8 +209385,8 @@ msgid "" msgstr "" #: src/item.cpp -msgid " seconds" -msgstr " секунд" +msgid " moves " +msgstr "" #: src/item.cpp msgid "Time to reach aim level: " @@ -208178,10 +209420,6 @@ msgstr "Эффективная отдача: " msgid "Recommended strength (burst): " msgstr "Рекомендованная сила (очередь): " -#: src/item.cpp -msgid " seconds per round" -msgstr " секунд на патрон" - #: src/item.cpp msgid "Fire modes: " msgstr "Режимы стрельбы: " @@ -208456,6 +209694,14 @@ msgstr "" "Значения защиты снижены, но можно попробовать повысить их, " "отремонтировав этот предмет." +#: src/item.cpp +msgid "Weight capacity modifier: " +msgstr "" + +#: src/item.cpp +msgid "Weight capacity bonus: " +msgstr "" + #: src/item.cpp msgid "Just for fun." msgstr "Просто для развлечения." @@ -208586,17 +209832,17 @@ msgstr "вмещает %s %s." #: src/item.cpp #, c-format msgid "Capacity: %dmJ" -msgstr "" +msgstr "Ёмкость: %dмДж" #: src/item.cpp #, c-format msgid "Capacity: %dJ" -msgstr "" +msgstr "Ёмкость: %dДж" #: src/item.cpp #, c-format msgid "Capacity: %dkJ" -msgstr "" +msgstr "Ёмкость: %dкДж" #: src/item.cpp #, c-format @@ -208950,6 +210196,14 @@ msgstr "" msgid "This bionic is installed in the following body part(s):" msgstr "Эта бионика устанавливается в следующие части тела:" +#: src/item.cpp +msgid "Encumbrance: " +msgstr "Скованность:" + +#: src/item.cpp +msgid "Environmental Protection: " +msgstr "Защита от окружающей среды: " + #: src/item.cpp msgid "* This weapon needs two free hands to fire." msgstr "* Для стрельбы из этого оружия нужны две свободные руки." @@ -209213,11 +210467,11 @@ msgstr " (грязное)" #: src/item.cpp msgid " (sterile)" -msgstr "" +msgstr "(стерильно)" #: src/item.cpp msgid " (packed)" -msgstr "" +msgstr "(упаковано)" #: src/item.cpp msgid " (UPS)" @@ -209925,7 +211179,7 @@ msgstr "Вы чувствуете себя здоровее." #: src/iuse.cpp msgid "You no longer need to fear the flu, at least for some time." -msgstr "" +msgstr "Вы больше не боитесь гриппа. Хотя бы на время." #: src/iuse.cpp msgid "Are you sure you want to eat this? It looks poisonous..." @@ -210160,12 +211414,12 @@ msgstr "" #: src/iuse.cpp msgctxt "memorial_male" msgid "Consumed a marloss product." -msgstr "" +msgstr "Съел марло." #: src/iuse.cpp msgctxt "memorial_female" msgid "Consumed a marloss product." -msgstr "" +msgstr "Съела марло." #: src/iuse.cpp #, c-format @@ -210176,22 +211430,22 @@ msgstr "" #: src/iuse.cpp msgctxt "memorial_male" msgid "Consumed a marloss seed." -msgstr "" +msgstr "Съел семя марло." #: src/iuse.cpp msgctxt "memorial_female" msgid "Consumed a marloss seed." -msgstr "" +msgstr "Съела семя марло." #: src/iuse.cpp msgctxt "memorial_male" msgid "Consumed some marloss jelly." -msgstr "" +msgstr "Съел желе марло." #: src/iuse.cpp msgctxt "memorial_female" msgid "Consumed some marloss jelly." -msgstr "" +msgstr "Съела желе марло." #: src/iuse.cpp msgctxt "memorial_male" @@ -210508,31 +211762,31 @@ msgstr "Вы распаковали %s." #: src/iuse.cpp msgid "Choose CBM to pack" -msgstr "" +msgstr "Выберите КБМ для упаковки" #: src/iuse.cpp msgid "You don't have any CBMs." -msgstr "" +msgstr "У вас нет КБМ." #: src/iuse.cpp msgid "This CBM is faulty. You should mend it first. Do you want to try?" -msgstr "" +msgstr "Этот КБМ неисправен, сперва его надо починить. Хотите попробовать?" #: src/iuse.cpp msgid "This CBM is already packed. Do you want to put it in a new pouch?" -msgstr "" +msgstr "Этот КБМ уже упакован. Хотите поместить его в новую сумку?" #: src/iuse.cpp msgid "You carefully prepare the CBM for sterilization." -msgstr "" +msgstr "Вы тщательно подготавливаете КБМ к стерилизации." #: src/iuse.cpp msgid "You put the CBM in the pouch and close it." -msgstr "" +msgstr "Вы кладёте КБМ в сумку и закрываете её." #: src/iuse.cpp msgid "You're not sure about the quality of your work." -msgstr "" +msgstr "Вы не уверены в качестве своей работы." #: src/iuse.cpp #, c-format @@ -212325,6 +213579,11 @@ msgstr " под %s" msgid " illuminated by %s" msgstr " под светом %s" +#: src/iuse.cpp +#, c-format +msgid " in %s cloud" +msgstr "в облаке %s" + #: src/iuse.cpp #, c-format msgid " with graffiti \"%s\"" @@ -213004,6 +214263,7 @@ msgstr "Вы окружены агрессивными мультиваркам msgid "" "The autoclave ran out of battery and stopped before completing its cycle." msgstr "" +"У автоклава сели батареи, и он выключился до завершения рабочего цикла." #: src/iuse.cpp msgid "Autoclave already contains a CBM. Do you want to remove it?" @@ -213586,6 +214846,10 @@ msgid "There is also a certain bionic that helps with this kind of armor." msgstr "" "Также есть определённая бионика, которая может помочь с этим типом брони." +#: src/iuse_actor.cpp +msgid "No lock to pick." +msgstr "Нет замка для взлома." + #: src/iuse_actor.cpp msgid "Use your lockpick where?" msgstr "Где использовать отмычку?" @@ -213641,38 +214905,41 @@ msgstr "Замок сопротивляется вашим попыткам вз #: src/iuse_actor.cpp msgid "a crafting station" -msgstr "" +msgstr "верстак" #: src/iuse_actor.cpp msgid "a place to hang corpses for butchering" -msgstr "" +msgstr "место для подвешивания туши при разделке" #: src/iuse_actor.cpp msgid "" "a flat surface to butcher onto or eat meals from" msgstr "" +"плоская поверхность, на которой можно разделывать или " +"есть" #: src/iuse_actor.cpp msgid "a place to sit" -msgstr "" +msgstr "место для сидения" #: src/iuse_actor.cpp msgid "a place to hide" -msgstr "" +msgstr "место, где можно спрятаться" #: src/iuse_actor.cpp msgid "a safe place to contain a fire" -msgstr "" +msgstr "место, где можно безопасно развести огонь" #: src/iuse_actor.cpp msgid "a place to smoke or dry food for preservation" -msgstr "" +msgstr "место для копчения или засушивания еды" #: src/iuse_actor.cpp #, c-format msgid "" "Can be activated to deploy as furniture (%s)." msgstr "" +"Можно активировать и превратить в мебель (%s)." #: src/iuse_actor.cpp #, c-format @@ -213680,6 +214947,8 @@ msgid "" "Can be activated to deploy as furniture (%s), " "which can then be used as %s." msgstr "" +"Можно активировать и превратить в мебель (%s), " +"способную служить как %s." #: src/iuse_actor.cpp msgid "Deploy where?" @@ -215685,6 +216954,20 @@ msgstr "<-> пред." msgid "ndo move" msgstr "отмена хода" +#: src/kill_tracker.cpp +msgid "You haven't killed any monsters yet!" +msgstr "Вы не убили ни одного монстра!" + +#: src/kill_tracker.cpp +#, c-format +msgid "KILL COUNT: %d" +msgstr "ВСЕГО УБИТО: %d" + +#: src/kill_tracker.cpp +#, c-format +msgid "Experience: %d (%d points available)" +msgstr "Опыт: %d (%d очков доступно)" + #. ~ abbreviated direction names and long direction names #: src/line.cpp msgid "N " @@ -215956,6 +217239,16 @@ msgstr "бесконечный" msgid "an explosion" msgstr "взрыв" +#: src/magic.cpp +#, c-format +msgid "%s and %s" +msgstr "%s и %s" + +#: src/magic.cpp src/player.cpp +#, c-format +msgid "%s, %s" +msgstr "%s, %s" + #: src/magic.cpp #, c-format msgid "" @@ -216001,6 +217294,11 @@ msgstr "Игнорировать предупреждения" msgid "Popup Distractions" msgstr "Показывать предупреждения" +#: src/magic.cpp +#, c-format +msgid "%d moves" +msgstr "" + #: src/magic.cpp msgid "requires concentration" msgstr "требует концентрации" @@ -216520,8 +217818,8 @@ msgstr "%d минут осталось до окончания цикла сте #: src/map.cpp #, c-format -msgid "The autoclave in the %s has finished washing." -msgstr "Автоклав в транспорте (%s) закончил цикл очистки." +msgid "The autoclave in the %s has finished its cycle." +msgstr "Автоклав в %s завершил рабочий цикл." #: src/map.cpp #, c-format @@ -216786,22 +218084,6 @@ msgstr "Открыть камеры" msgid "Missile Controls" msgstr "Управление ракетой" -#: src/mapgen.cpp -msgid "EnviroCom OS v2.03" -msgstr "ОС EnviCom вер. 2.03" - -#: src/mapgen.cpp -msgid "Unlock stairs" -msgstr "Открыть лестницы" - -#: src/mapgen.cpp -msgid "Download Sewer Maps" -msgstr "Скачать карты канализации" - -#: src/mapgen.cpp -msgid "Divert sample" -msgstr "Взять пробы вод" - #: src/mapgen.cpp msgid "NEPowerOS" msgstr "ОС NEPower" @@ -217037,11 +218319,11 @@ msgstr "* Активируется только при крите" #: src/martialarts.cpp msgid "* Only works on a downed target" -msgstr "" +msgstr "* Работает только на сбитой с ног цели" #: src/martialarts.cpp msgid "* Only works on a stunned target" -msgstr "" +msgstr "* Работает только на оглушённой цели" #: src/martialarts.cpp msgid "* Will counterattack when you dodge" @@ -217308,12 +218590,12 @@ msgstr "Из-за своей дальнозоркости вы не можете #: src/melee.cpp #, c-format msgid "The %s has dead batteries and will not move its arms." -msgstr "" +msgstr "У %s сели батарейки, его руки не могут двигаться." #: src/melee.cpp #, c-format msgid "The %s hisses as its hydraulic arm pumps forward!" -msgstr "" +msgstr "%s с шипением выстреливает гидравлической рукой!" #: src/melee.cpp msgid "You miss and stumble with the momentum." @@ -217847,7 +219129,7 @@ msgstr "%s." #: src/mission.h msgid "Bugged mission type" -msgstr "" +msgstr "Багнутый тип миссии" #: src/mission_companion.cpp msgid "Outpost Missions" @@ -218699,23 +219981,23 @@ msgstr "" #: src/mission_start.cpp msgid "Workstation" -msgstr "" +msgstr "Рабочая станция" #: src/mission_start.cpp msgid "Download Memory Contents" -msgstr "" +msgstr "Скачать содержимое памяти" #: src/mission_start.cpp msgid "Download Encryption Routines" -msgstr "" +msgstr "Скачать коды шифрования" #: src/mission_start.cpp msgid "Durable Storage Archive" -msgstr "" +msgstr "Надёжный архив" #: src/mission_start.cpp msgid "Download Archives" -msgstr "" +msgstr "Скачать архивы" #: src/mission_start.cpp msgid "Download Routing Software" @@ -219484,6 +220766,11 @@ msgid "The %1$s's arms fly out and pull and grab %2$s!" msgstr "" "Руки существа (%1$s) взлетают, хватают и притягивают противника (%2$s)!" +#: src/monattack.cpp +#, c-format +msgid "The %1$s reaches out and pulls %2$s!" +msgstr "%1$s выгибается и подтягивает %2$s!" + #: src/monattack.cpp #, c-format msgid "The %s gropes at you, but you dodge!" @@ -219512,14 +220799,14 @@ msgstr "%s хватает вас!" #: src/monattack.cpp #, c-format msgid "The %s tries to drag you, but you're securely fastened in the autodoc." -msgstr "" +msgstr "%s пытается вас оттащить, но вы надёжно пристёгнуты к автодоку." #: src/monattack.cpp #, c-format msgid "" "The %s tries to drag , but they're securely fastened in the " "autodoc." -msgstr "" +msgstr "%s пытается оттащить , но тот надёжно пристёгнут к автодоку." #: src/monattack.cpp #, c-format @@ -220224,6 +221511,19 @@ msgstr "Уберите всё из рук и оставайтесь на мес msgid "fzzzzzt" msgstr "«фзззззт»" +#: src/monattack.cpp +msgid "The floor trembles underneath your feet." +msgstr "Пол колышется под вашими ногами." + +#: src/monattack.cpp +msgid "a deafening roar!" +msgstr "оглушительный рёв!" + +#: src/monattack.cpp +#, c-format +msgid "A %s struggles to pull itself free from the %s!" +msgstr "%s пытается вывернуться из %s!" + #: src/monattack.cpp #, c-format msgid "The %1$s mechanically grabs at %2$s!" @@ -220470,12 +221770,12 @@ msgstr "Внезапно вокруг появилась куча крыс." #: src/mondeath.cpp #, c-format msgid "The %s inflates and melts away." -msgstr "" +msgstr "%s раздувается и тает." #: src/mondeath.cpp #, c-format msgid "a %s explodes!" -msgstr "" +msgstr "%s взрывается!" #: src/mondeath.cpp #, c-format @@ -220660,7 +221960,7 @@ msgstr "Несмотря на седло, вы всё ещё не знаете, #: src/monexamine.cpp #, c-format msgid "%s battery level is %d%%" -msgstr "" +msgstr "Заряд батарей у %s на уровне%d%%" #: src/monexamine.cpp msgid "Climb into the mech and take control" @@ -221390,11 +222690,11 @@ msgstr "Споры превращают %1$s в %2$s!" #: src/morale.cpp msgid "Total morale:" -msgstr "" +msgstr "Общая мораль:" #: src/morale.cpp msgid "Focus trends towards:" -msgstr "" +msgstr "Фокус смещается в сторону:" #: src/morale.cpp msgid "Nothing affects your morale" @@ -222932,6 +224232,11 @@ msgstr "%1$s бросает %2$s." msgid "Hold on, I want to pulp that %s." msgstr "Погоди, я хочу разделать %s." +#: src/npcmove.cpp +#, c-format +msgid "%s completed the assigned task." +msgstr "%s завершает назначенную задачу." + #: src/npcmove.cpp #, c-format msgid "%1$s throws a %2$s." @@ -223450,6 +224755,10 @@ msgstr "кулаки" msgid "BADAMMO" msgstr "BADAMMO" +#: src/npctalk.cpp +msgid "doing this and that" +msgstr "делаю то да сё" + #: src/npctalk.cpp msgctxt "punctuation" msgid "." @@ -223553,6 +224862,11 @@ msgstr "Вы даёте %1$s %2$d %3$s." msgid "%1$s doesn't have a %2$s!" msgstr "У %1$s нет %2$s!" +#: src/npctalk.cpp +#, c-format +msgid "%1$s gives you %2$s." +msgstr "%1$s даёт вам %2$s." + #: src/npctalk.cpp msgid "I don't trust you enough to eat THIS..." msgstr "Я не верю тебе настолько, чтобы, , есть ЭТО…" @@ -223807,11 +225121,6 @@ msgstr "Плата:" msgid "Select a follower" msgstr "Выбрать спутника" -#: src/npctalk_funcs.cpp -#, c-format -msgid "Pickup rules for %s" -msgstr "Правила сбора для %s" - #: src/npctrade.cpp #, c-format msgid "Volume: %s %s, Weight: %.1f %s" @@ -223824,12 +225133,12 @@ msgstr "Обмен" #: src/npctrade.cpp #, c-format msgid "Credit %s" -msgstr "" +msgstr "Кредит %s" #: src/npctrade.cpp #, c-format msgid "Debt %s" -msgstr "" +msgstr "Долг %s" #: src/npctrade.cpp #, c-format @@ -223860,12 +225169,12 @@ msgstr "Сколько %s обменять [МАКС: %d]: " #: src/npctrade.cpp msgid "You'll need to offer me more than that." -msgstr "" +msgstr "Предложи мне побольше." #: src/npctrade.cpp #, c-format msgid "Sorry, I'm only willing to extend you %s in credit." -msgstr "" +msgstr "Прости, но я могу дать в долг только %s." #: src/npctrade.cpp #, c-format @@ -223879,10 +225188,13 @@ msgid "" "\n" "Continue with trade?" msgstr "" +"Мне с тобой будет не расплатиться. Самое большее, что я могу предложить, это %s.\n" +"\n" +"Продолжить торговать?" #: src/npctrade.cpp msgid "Looks like a deal! Accept this trade?" -msgstr "" +msgstr "Отлично, по рукам! Совершить сделку?" #: src/npctrade.h msgid "" @@ -224696,16 +226008,18 @@ msgstr "" #: src/options.cpp msgid "Pickup position" -msgstr "" +msgstr "Панель подбора" #: src/options.cpp msgid "" "Switch between pickup panel being left, right, or overlapping the sidebar." msgstr "" +"Переключение между положением панели подбора слева, справа или перекрытием " +"боковой панели." #: src/options.cpp msgid "Overlapping" -msgstr "" +msgstr "Перекрытие" #: src/options.cpp msgid "Aim window display style" @@ -225153,13 +226467,15 @@ msgstr "" #: src/options.cpp msgid "Scale pixel minimap" -msgstr "" +msgstr "Масштабирование пиксельной миникарты" #: src/options.cpp msgid "" "Scale pixel minimap to fit its surroundings. May produce crappy results, " "especially in modes other than \"Solid\"." msgstr "" +"Масштабировать пиксельную миникарту согласно окружению. Может привести к " +"странным результатам, особенно в режимах кроме \"Сплошная\"." #: src/options.cpp msgid "Maintain pixel minimap aspect ratio" @@ -225171,21 +226487,23 @@ msgstr "Сохраняет квадратную форму тайлов на п #: src/options.cpp msgid "Creature beacon size" -msgstr "" +msgstr "Размер маркера существ" #: src/options.cpp msgid "Controls how big the creature beacons are. Value is in minimap tiles." -msgstr "" +msgstr "Управление размером маркера существ, значение в тайлах миникарты." #: src/options.cpp msgid "Hostile creature beacon blink speed" -msgstr "" +msgstr "Частота мигания маркера врагов" #: src/options.cpp msgid "" "Controls how fast the hostile creature beacons blink on the pixel minimap. " "Value is multiplied by 200 ms. Set to 0 to disable." msgstr "" +"Определяет, как часто будут мигать маркеры врагов на пиксельной миникарте. " +"Значение умножается на 200 миллисекунд. Установите в 0, чтобы выключить." #: src/options.cpp src/sdltiles.cpp msgid "Display" @@ -226451,12 +227769,12 @@ msgstr "# Неисследованно" #: src/overmap_ui.cpp msgid "Distance to active mission:" -msgstr "" +msgstr "Расстояние до активного задания:" #: src/overmap_ui.cpp #, c-format msgid "%d tiles" -msgstr "" +msgstr "%d тайлов" #: src/overmap_ui.cpp msgid "Above us" @@ -226762,10 +228080,6 @@ msgstr "Очень холодно!" msgid "Freezing!" msgstr "Замерзание!" -#: src/panels.cpp -msgid "Pain " -msgstr "Боль: " - #: src/panels.cpp msgid "Bad" msgstr "Плохо" @@ -226933,22 +228247,10 @@ msgstr "Оружие :" msgid "Style:" msgstr "Стиль :" -#: src/panels.cpp -msgid "Food :" -msgstr "Голод :" - -#: src/panels.cpp -msgid "Drink:" -msgstr "Жажда :" - #: src/panels.cpp msgid "Rest :" msgstr "Усталость:" -#: src/panels.cpp -msgid "Pain :" -msgstr "Боль :" - #: src/panels.cpp msgid "Heat :" msgstr "Тепло :" @@ -226959,7 +228261,7 @@ msgstr "Под землёй" #: src/panels.cpp msgid "Wind" -msgstr "" +msgstr "Ветер" #: src/panels.cpp msgid "Stm" @@ -227108,7 +228410,7 @@ msgstr "Движение" #: src/panels.cpp msgid "Location Alt" -msgstr "" +msgstr "Альт. размещение" #: src/panels.cpp msgid "classic" @@ -227120,7 +228422,7 @@ msgstr "компакт" #: src/panels.cpp msgid "labels-narrow" -msgstr "" +msgstr "узкие метки" #: src/panels.cpp msgid "labels" @@ -228723,11 +230025,6 @@ msgstr "%s (%d)" msgid "%s with %s (%d)" msgstr "%s с %s (%d)" -#: src/player.cpp -#, c-format -msgid "%s, %s" -msgstr "%s, %s" - #: src/player.cpp msgid "| Location " msgstr "| Расположение" @@ -229447,24 +230744,28 @@ msgid "" "Do you want to crush up %s with your %s?\n" "%s" msgstr "" +"Хотите разбить %s при помощи %s?\n" +"%s" #: src/player.cpp msgid "Be wary of fragile items nearby!" -msgstr "" +msgstr "Осторожнее с хрупкими предметами!" #: src/player.cpp #, c-format msgid "You swing your %s wildly!" -msgstr "" +msgstr "Вы берёте %s и дико размахиваетесь!" #: src/player.cpp #, c-format msgid "You crush up and gather %s" -msgstr "" +msgstr "Вы разбиваете и собираете %s" #: src/player.cpp msgid "You need a hammering tool to crush up frozen liquids!" msgstr "" +"Вам понадобится молоток или что-то подобное, чтобы разбить замёрзшие " +"жидкости!" #: src/player.cpp msgid "Your heart races as you recall your most recent hunt." @@ -229490,6 +230791,10 @@ msgstr "Сильный голод" msgid "Peckish" msgstr "Проголодавшийся" +#: src/player.cpp +msgid "Pain " +msgstr "Боль: " + #: src/player_activity.cpp msgid "You pause for a moment to catch your breath." msgstr "Вы на секунду останавливаетесь, чтобы отдышаться." @@ -229608,17 +230913,17 @@ msgstr "" #: src/player_display.cpp #, c-format msgid "Base HP: %d" -msgstr "" +msgstr "Базовые HP: %d" #: src/player_display.cpp #, c-format msgid "Carry weight (%s): %.1f" -msgstr "" +msgstr "Переносимый вес (%s): %.1f" #: src/player_display.cpp #, c-format msgid "Melee damage: %.1f" -msgstr "" +msgstr "Урон в ближнем бою: %.1f" #: src/player_display.cpp msgid "" @@ -229632,17 +230937,17 @@ msgstr "" #: src/player_display.cpp #, c-format msgid "Melee to-hit bonus: %+.1lf" -msgstr "" +msgstr "Модификатор меткости в ББ: %+.1lf" #: src/player_display.cpp #, c-format msgid "Ranged penalty: %+d" -msgstr "" +msgstr "Штраф к стрельбе: %+d" #: src/player_display.cpp #, c-format msgid "Throwing penalty per target's dodge: %+d" -msgstr "" +msgstr "Штраф к броску за ед. уклонения цели: %+d" #: src/player_display.cpp msgid "" @@ -229657,17 +230962,17 @@ msgstr "" #: src/player_display.cpp #, c-format msgid "Read times: %d%%" -msgstr "" +msgstr "Время чтения: %d%%" #: src/player_display.cpp #, c-format msgid "Crafting bonus: %d%%" -msgstr "" +msgstr "Бонус к изготовлению: %d%%" #: src/player_display.cpp #, c-format msgid "Skill rust: %d%%" -msgstr "" +msgstr "Атрофия навыков: %d%%" #: src/player_display.cpp msgid "" @@ -229680,12 +230985,12 @@ msgstr "" #: src/player_display.cpp #, c-format msgid "Trap detection level: %d" -msgstr "" +msgstr "Обнаружение ловушек: %d" #: src/player_display.cpp #, c-format msgid "Aiming penalty: %+d" -msgstr "" +msgstr "Штраф к прицеливанию: %+d" #: src/player_display.cpp msgid "Weight:" @@ -229735,12 +231040,12 @@ msgstr "Жажда %s-%d%%" #: src/player_display.cpp msgid "Underfed" -msgstr "" +msgstr "Недоедание" #: src/player_display.cpp #, c-format msgid "%-20s-%s%d%%" -msgstr "" +msgstr "%-20s-%s%d%%" #: src/player_display.cpp #, c-format @@ -230600,7 +231905,7 @@ msgstr "[%c] Стабилизировать прицел (10 ходов)" #: src/ranged.cpp #, c-format msgid "%sto aim and fire" -msgstr "" +msgstr "%s Прицельный выстрел" #: src/ranged.cpp #, c-format @@ -230972,6 +232277,10 @@ msgstr "Ч/Б" msgid "Safe Mode enabled:" msgstr "Безопасный режим включён:" +#: src/safemode_ui.cpp +msgid "Please load a character first to use this page!" +msgstr "Чтобы использовать эту страницу, требуется загрузить персонажа!" + #: src/safemode_ui.cpp msgid "Safe Mode manager currently inactive." msgstr "Менеджер безопасного режима выключен." @@ -232669,11 +233978,11 @@ msgstr "Название: " #: src/veh_interact.cpp msgid "Yours" -msgstr "" +msgstr "Ваше" #: src/veh_interact.cpp msgid "not owned" -msgstr "" +msgstr "ничейное" #: src/veh_interact.cpp msgid "nstall" @@ -233845,6 +235154,10 @@ msgid "" msgstr "" "Вы выключаете автоклав до завершения программы и открываете его дверцу." +#: src/vehicle_use.cpp +msgid "The autoclave is empty, there's no point in starting it." +msgstr "Автоклав пуст, его незачем запускать." + #: src/vehicle_use.cpp #, c-format msgid "" @@ -233877,6 +235190,10 @@ msgstr "" "Вы выключаете стиральную машину до завершения ею программы стирки и " "открываете её крышку." +#: src/vehicle_use.cpp +msgid "The washing machine is empty, there's no point in starting it." +msgstr "Стиральная машина пуста, её незачем запускать." + #: src/vehicle_use.cpp #, c-format msgid "" @@ -233925,6 +235242,10 @@ msgid "" msgstr "" "Вы выключаете посудомойку до завершения ею программы и открываете её крышку." +#: src/vehicle_use.cpp +msgid "The dishwasher is empty, there's no point in starting it." +msgstr "Посудомойка пуста, её незачем запускать." + #: src/vehicle_use.cpp #, c-format msgid "" diff --git a/lang/po/zh_CN.po b/lang/po/zh_CN.po index c1fae3a8f9947..c4143f6dfad65 100644 --- a/lang/po/zh_CN.po +++ b/lang/po/zh_CN.po @@ -34,24 +34,24 @@ # supernoob super , 2019 # L rient <1972308206@qq.com>, 2019 # 张义钊 , 2019 -# H H , 2019 # LXY 233 , 2019 -# fei li , 2019 # D Laboratory , 2019 -# cainiao , 2019 # 曾泰瑋 , 2019 # Brett Dong , 2019 # Mizu Izumi, 2019 -# Silencess Shakespeare , 2019 -# Amans Tofu , 2019 # Roy Y , 2019 +# cainiao , 2019 +# Heaper327 , 2019 +# Amans Tofu , 2019 +# fei li , 2019 +# Silencess Shakespeare , 2019 # Jianxiang Wang , 2019 # msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.D\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-16 17:39+0800\n" +"POT-Creation-Date: 2019-08-23 23:11+0800\n" "PO-Revision-Date: 2018-04-26 14:47+0000\n" "Last-Translator: Jianxiang Wang , 2019\n" "Language-Team: Chinese (China) (https://www.transifex.com/cataclysm-dda-translators/teams/2217/zh_CN/)\n" @@ -355,7 +355,7 @@ msgid "" "A canister of pressurized hydrogen so heavily compressed it has turned " "solid. With proper equipment, it could be heated to plasma." msgstr "" -"一罐高压氢气,因为高压已成固态。使用适当的设备,可以把它加热到等离子态。\n" +"一罐高压氢气,因为高压已成固态。使用适当的设备可以把它加热到等离子态。\n" "\"这玩意做成微型氢弹肯定比微型核弹够劲!\"" #: lang/json/AMMO_from_json.py @@ -471,27 +471,6 @@ msgstr "" "一些可以用来制造物品的废铜料,比如说自制霰弹。\n" "\"在任何游戏中都是最低等级武器的材料。\"" -#: lang/json/AMMO_from_json.py -msgid "solder" -msgstr "焊料" - -#. ~ Description for solder -#: lang/json/AMMO_from_json.py -msgid "" -"A small spool of solder, able to be used in ammunition and electronics." -msgstr "" -"一小卷可以用来制造弹药和电子制品的焊料,或有其它用途。\n" -"\"焊接时会散发一股沁人心肺的味道。\"" - -#: lang/json/AMMO_from_json.py -msgid "tin" -msgstr "锡块" - -#. ~ Description for tin -#: lang/json/AMMO_from_json.py -msgid "Tin and pewter scraps. Usable in making ammo." -msgstr "一些可以用来制造物品的废锡料,也可用于制造弹药。" - #: lang/json/AMMO_from_json.py msgid "medical tape" msgstr "医用胶带" @@ -512,6 +491,34 @@ msgstr "PG-7VL 93mm 火箭弹" msgid "93mm single-stage high-explosive ammunition for the RPG-7." msgstr "一枚用于RPG-7的93mm 单级高爆火箭弹。" +#: lang/json/AMMO_from_json.py +msgid "PG-7VR 64mm/105mm rocket" +msgstr "PG-7VR 64mm/105mm 火箭弹" + +#. ~ Description for PG-7VR 64mm/105mm rocket +#: lang/json/AMMO_from_json.py +msgid "64mm/105mm high-explosive tandem ammunition for the RPG-7." +msgstr "一枚用于RPG-7的64mm/105mm多级高爆火箭弹。" + +#: lang/json/AMMO_from_json.py +msgid "TBG-7V 105mm rocket" +msgstr "TBG-7V 105mm 火箭弹" + +#. ~ Description for TBG-7V 105mm rocket +#: lang/json/AMMO_from_json.py +msgid "105mm thermobaric ammunition for the RPG-7." +msgstr "一枚用于RPG-7的热压火箭弹。" + +#: lang/json/AMMO_from_json.py +msgid "OG-7V 40mm rocket" +msgstr "OG-7V 40mm 火箭弹" + +#. ~ Description for OG-7V 40mm rocket +#: lang/json/AMMO_from_json.py +msgid "" +"40mm high-explosive fragmentation antipersonnel ammunition for the RPG-7." +msgstr "一枚用于RPG-7的40mm高爆破片反步兵火箭弹。" + #: lang/json/AMMO_from_json.py msgid "M235 66mm TPA rocket" msgstr "M235 66mm TPA 燃烧火箭弹" @@ -538,7 +545,7 @@ msgid "" "A flammable carbon-based material produced by slowly burning wood. Utilized" " in recipes requiring a pure, hot flame. Can also be used in filters to " "remove contaminants out of air and water." -msgstr "一种易燃的碳基材料,由缓慢燃烧的木材产生。在需要纯净的高温火焰的制造配方中使用。也可作为过滤器使用来去除空气和水中的污染物。" +msgstr "一种易燃的碳基材料,由缓慢燃烧的木材产生。可以在制造中提供纯净的高温火焰,也可用于过滤空气和水中的污染物。" #: lang/json/AMMO_from_json.py msgid "calcium carbide premix" @@ -1207,7 +1214,7 @@ msgstr "" #: lang/json/AMMO_from_json.py msgid "calcium carbide" msgid_plural "calcium carbide" -msgstr[0] "碳化钙" +msgstr[0] "电石" #. ~ Description for calcium carbide #: lang/json/AMMO_from_json.py @@ -1218,7 +1225,7 @@ msgid "" "and sealed, it will explode with little strength, but with relatively loud " "noise and could maybe be used as a decoy." msgstr "" -"一把碳化钙块,散发出微弱的大蒜味。在商业上,碳化钙被用于乙炔的现场生产,在历史上还被用来驱动乙炔灯。如果它与水混合密封,会引起杀伤力不大的爆炸,但噪音较大,可以作为诱饵使用。" +"一把电石块,散发出微弱的大蒜味。在商业上,电石被用于乙炔的现场生产,在历史上还被用来驱动乙炔灯。如果它与水混合密封,会引起杀伤力不大的爆炸,但噪音较大,可以作为诱饵使用。" #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid "hexamine" @@ -2214,26 +2221,24 @@ msgstr ".300 BLK 弹" #. ~ Description for .300 AAC Blackout #: lang/json/AMMO_from_json.py msgid "" -".300 AAC Blackout is an intermediate cartridge that achieves ballistics " -"similar to the 7.62x39 but allows use on the AR-15 platform. The round is " -"necked-up from the 5.56mm NATO, but feeds from a STANAG magazine. It " -"requires a specific barrel, so will not work in a standard M4 or similar " -"carbine. This loading is supersonic." +"A .300 AAC Blackout round with a 125gr open tip match bullet. 300 BLK is an" +" intermediate cartridge necked up from 5.56x45mm, designed to achieve " +"similar ballistics to 7.62x39mm. It is compatible with standard AR-15 lower" +" receivers and will feed from STANAG magazines." msgstr "" -".300 BLK 弹是一种中间型弹药,其弹道学性能类似于7.62x39弹,但是能够用于AR-15平台。这种弹药是由5.56mm " -"NATO子弹拓宽后制成,但是通过STANAG弹匣供弹。这种弹药需要特殊的枪管,因此无法用于标准M4或其它卡宾枪。这颗子弹是超音速弹。" +"125 格令的 .300 BLK 空尖比赛弹。.300 BLK 弹是一种中间型弹药,由 5.56x45mm 弹拓宽后制成,设计弹道学性能类似于 " +"7.62x39mm 弹。这种子弹兼容标准 AR-15 下机匣,通过 STANAG 弹匣供弹。" #. ~ Description for .300 AAC Blackout #: lang/json/AMMO_from_json.py msgid "" -".300 AAC Blackout is an intermediate cartridge that achieves ballistics " -"similar to the 7.62x39 but allows use on the AR-15 platform. The round is " -"necked-up from the 5.56mm NATO, but feeds from a STANAG magazine. It " -"requires a specific barrel, so will not work in a standard M4 or similar " -"carbine. This loading is subsonic." +"A subsonic .300 AAC Blackout round with a 220gr open tip match bullet. 300 " +"BLK is an intermediate cartridge necked up from 5.56x45mm, designed to " +"achieve similar ballistics to 7.62x39mm. It is compatible with standard " +"AR-15 lower receivers and will feed from STANAG magazines." msgstr "" -".300 BLK 弹是一种中间型弹药,其弹道学性能类似于7.62x39弹,但是能够用于AR-15平台。这种弹药是由5.56mm " -"NATO子弹拓宽后制成,但是通过STANAG弹匣供弹。这种弹药需要特殊的枪管,因此无法用于标准M4或其它卡宾枪。这颗子弹是亚音速弹。" +"220 格令的 .300 BLK 亚音速空尖比赛弹。.300 BLK 弹是一种中间型弹药,由 5.56x45mm 弹拓宽后制成,设计弹道学性能类似于 " +"7.62x39mm 弹。这种子弹兼容标准 AR-15 下机匣,通过 STANAG 弹匣供弹。" #: lang/json/AMMO_from_json.py msgid "reloaded .300 AAC Blackout" @@ -3600,6 +3605,17 @@ msgid "" " tube. Designed to be highly effective against vehicles and structures." msgstr "一件由发射管发射,具有光学制导的热能追踪的导弹。对车辆及建筑物非常有效。" +#: lang/json/AMMO_from_json.py +msgid "paralyzing barb" +msgstr "麻痹毒刺" + +#. ~ Description for paralyzing barb +#: lang/json/AMMO_from_json.py +msgid "" +"Tiny droplets of venom trickle out of the sponge-like tissue of this sharp " +"barb." +msgstr "小滴的毒液从这根毒刺海绵般的组织中渗出。" + #: lang/json/AMMO_from_json.py msgid "sprayable toxic gas" msgstr "喷雾式毒气剂" @@ -4144,6 +4160,29 @@ msgid "" "making doors." msgstr "由两个带螺孔的金属板组成的小金属铰链。用来制造活页门。" +#: lang/json/AMMO_from_json.py +msgid "tin powder" +msgstr "锡粉" + +#. ~ Description for tin powder +#: lang/json/AMMO_from_json.py +msgid "" +"A fine gray powder composed of tin, usable for making solder and lining " +"containers to prevent corrosion." +msgstr "灰色的细锡粉,可以用来制作焊锡,或者镀在容器上防止腐蚀。" + +#: lang/json/AMMO_from_json.py +msgid "solder" +msgstr "焊料" + +#. ~ Description for solder +#: lang/json/AMMO_from_json.py +msgid "" +"A small spool of solder, able to be used in ammunition and electronics." +msgstr "" +"一小卷可以用来制造弹药和电子制品的焊料,或有其它用途。\n" +"\"焊接时会散发一股沁人心肺的味道。\"" + #: lang/json/AMMO_from_json.py msgid "incendiary" msgid_plural "incendiaries" @@ -5646,38 +5685,6 @@ msgstr[0] "棒球短裤" msgid "A pair of basketball shorts. Comfortable and light." msgstr "一条棒球短裤,多为棒球运动员比赛或训练时所穿。舒适且轻便。" -#: lang/json/ARMOR_from_json.py -msgid "backpack" -msgid_plural "backpacks" -msgstr[0] "背包" - -#. ~ Description for backpack -#: lang/json/ARMOR_from_json.py -msgid "A small backpack. Good storage for a little encumbrance." -msgstr "一个小型布制背包,用一点点累赘换取可观的储存空间。" - -#: lang/json/ARMOR_from_json.py -msgid "giant novelty backpack" -msgid_plural "giant novelty backpacks" -msgstr[0] "巨大新奇背包" - -#. ~ Description for giant novelty backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A huge fabric backpack made mostly as a joke before the cataclysm. Now, " -"it's still rather silly, but it can store a lot of stuff." -msgstr "一个体积巨大的纤维背包,在大灾变前看上去很可笑。现在,虽然看着还是很蠢,但是能储存许多物品。" - -#: lang/json/ARMOR_from_json.py -msgid "leather backpack" -msgid_plural "leather backpacks" -msgstr[0] "皮质背包" - -#. ~ Description for leather backpack -#: lang/json/ARMOR_from_json.py -msgid "A small leather backpack. Good storage for a little encumbrance." -msgstr "一个小型皮制背包,用一点点累赘换取可观的储存空间,相比普通背包更加耐用。" - #: lang/json/ARMOR_from_json.py msgid "balaclava" msgid_plural "balaclavas" @@ -5701,8 +5708,8 @@ msgstr[0] "大刀鞘(肩)" #. ~ Use action holster_msg for scabbard. #. ~ Use action holster_msg for sheath. #. ~ Use action holster_msg for survivor belt. -#. ~ Use action holster_msg for hiking backpack. #. ~ Use action holster_msg for survivor utility belt. +#. ~ Use action holster_msg for hiking backpack. #. ~ Use action holster_msg for pair of boots. #. ~ Use action holster_msg for pair of bone armor boots. #. ~ Use action holster_msg for pair of turnout boots. @@ -5727,7 +5734,8 @@ msgstr[0] "大刀鞘(肩)" #. ~ Use action holster_msg for pair of rollerblades. #. ~ Use action holster_msg for pair of rollerskates. #. ~ Use action holster_msg for C.R.I.T web belt. -#: lang/json/ARMOR_from_json.py +#. ~ Use action holster_msg for hollow cane. +#: lang/json/ARMOR_from_json.py lang/json/GENERIC_from_json.py #, no-python-format msgid "You sheath your %s" msgstr "你将%s收鞘" @@ -5735,7 +5743,9 @@ msgstr "你将%s收鞘" #. ~ Use action holster_prompt for baldric. #. ~ Use action holster_prompt for back scabbard. #. ~ Use action holster_prompt for scabbard. -#: lang/json/ARMOR_from_json.py +#. ~ Use action holster_prompt for hollow cane. +#: lang/json/ARMOR_from_json.py lang/json/ARMOR_from_json.py +#: lang/json/GENERIC_from_json.py msgid "Sheath sword" msgstr "收刀" @@ -6624,16 +6634,6 @@ msgid "" " encumbering and has little storage but is very warm." msgstr "一套全身恐龙外形的服装。十分累赘,而且没多少储存空间,但是非常暖和。" -#: lang/json/ARMOR_from_json.py -msgid "dive bag" -msgid_plural "dive bags" -msgstr[0] "潜水背包" - -#. ~ Description for dive bag -#: lang/json/ARMOR_from_json.py -msgid "A lightweight mesh backpack, commonly worn by swimmers and divers." -msgstr "一件很轻的潜水员用网眼背包,提供比较可观的储物空间。" - #: lang/json/ARMOR_from_json.py msgid "down-filled blanket" msgid_plural "down-filled blankets" @@ -6706,17 +6706,6 @@ msgstr[0] "婚纱" msgid "A beautiful white wedding dress. What good will it be now?" msgstr "一个美丽的白色婚纱。" -#: lang/json/ARMOR_from_json.py -msgid "duffel bag" -msgid_plural "duffel bags" -msgstr[0] "行李袋" - -#. ~ Description for duffel bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A huge duffel bag. Provides plenty of storage, but is severely encumbering." -msgstr "一个巨大的无纺布编织袋,提供了极其可观的储存空间,但相当的累赘。" - #: lang/json/ARMOR_from_json.py msgid "tactical dump pouch" msgid_plural "tactical dump pouches" @@ -8358,18 +8347,6 @@ msgstr "" "一条长而飘逸的长袍,样式简单穿着舒适。\n" "\"记得在对敌之前,将其戏剧性地撕碎!\"" -#: lang/json/ARMOR_from_json.py -msgid "jerrypack" -msgid_plural "jerrypacks" -msgstr[0] "肩背式油桶背包" - -#. ~ Description for jerrypack -#: lang/json/ARMOR_from_json.py -msgid "A jerrycan modified to be worn in a similar manner to a backpack." -msgstr "" -"一个五加仑装的油桶绑上带子,剪个大口,然后背到背上,成为了一个背包。\n" -"\"天才的造物!\"" - #: lang/json/ARMOR_from_json.py msgid "sports jersey" msgid_plural "sports jerseys" @@ -9133,28 +9110,6 @@ msgstr[0] "法式女仆头饰" msgid "A frilly white headpiece." msgstr "一个有着白色镶边的头饰。" -#: lang/json/ARMOR_from_json.py -msgid "makeshift knapsack" -msgid_plural "makeshift knapsacks" -msgstr[0] "简易背包" - -#. ~ Description for makeshift knapsack -#: lang/json/ARMOR_from_json.py -msgid "" -"A pair of pants with the bottom ends tied with string, and then passed " -"through the belt loops so the knapsack can be carried on the back." -msgstr "一条底部被绳索绑起来的裤子,绳索接着穿过皮带扣,使得整条裤子能够像背包背在背上,提供比较可观的储物空间。" - -#: lang/json/ARMOR_from_json.py -msgid "makeshift sling" -msgid_plural "makeshift slings" -msgstr[0] "简易肩背袋" - -#. ~ Description for makeshift sling -#: lang/json/ARMOR_from_json.py -msgid "A large sheet tied into a crude, over-the-shoulder sling." -msgstr "用一块小床单折叠起来的简易过肩吊袋,提供比较可观的储存空间。" - #: lang/json/ARMOR_from_json.py msgid "ballistic mask" msgid_plural "ballistic masks" @@ -9217,16 +9172,6 @@ msgstr "" "一个将头套进T恤的领口,然后把袖子从后面扎住裹在头上而成的简易面罩,通常由制造骚乱的暴徒们隐藏身份使用。\n" "\"推荐使用美国国旗图案的T恤衫。\"" -#: lang/json/ARMOR_from_json.py -msgid "messenger bag" -msgid_plural "messenger bags" -msgstr[0] "信使包" - -#. ~ Description for messenger bag -#: lang/json/ARMOR_from_json.py -msgid "Light and easy to wear, but doesn't offer much storage." -msgstr "一个常见的呈长方形、比较大的挎包,常见于邮递员投送报纸、信件时候所配备,提供比较可观的储存空间。" - #: lang/json/ARMOR_from_json.py msgid "pair of mittens" msgid_plural "pairs of mittens" @@ -9237,19 +9182,6 @@ msgstr[0] "连指羊毛手套" msgid "A pair of warm mittens. They are extremely cumbersome." msgstr "一双相当保暖的、厚重的连指羊毛手套。" -#: lang/json/ARMOR_from_json.py -msgid "MOLLE pack" -msgid_plural "MOLLE packs" -msgstr[0] "MOLLE战术背包" - -#. ~ Description for MOLLE pack -#: lang/json/ARMOR_from_json.py -msgid "" -"The Modular Lightweight Load-carrying Equipment is an advanced military " -"backpack. Covered with pockets and straps, it strikes a fine balance " -"between storage space and encumbrance." -msgstr "一件新一代模块化的改进型军用背包,相比普通背包它更加轻便舒适,且提供更可观的储存空间,取得了储存空间与累赘度之间的完美平衡。" - #: lang/json/ARMOR_from_json.py msgid "motorcycle armor" msgid_plural "motorcycle armors" @@ -9646,16 +9578,6 @@ msgstr "" "一个扣在头上、勉强可以称为头盔的锅子,防护性能不佳,但聊胜于无。\n" "\"流行于中东极端反政府游击队的'爆'款头盔。\"" -#: lang/json/ARMOR_from_json.py -msgid "purse" -msgid_plural "purses" -msgstr[0] "手提包" - -#. ~ Description for purse -#: lang/json/ARMOR_from_json.py -msgid "A bit cumbersome to wear, but provides some storage." -msgstr "一个用于随身携带、有拎带的手提包,拿起来有些不便,提供比较可观的储存空间。" - #: lang/json/ARMOR_from_json.py msgid "quiver" msgid_plural "quivers" @@ -9729,30 +9651,6 @@ msgid "" "hidden pockets." msgstr "一个覆及全身、宽松的长袖外袍,有一些隐藏内侧的小口袋。" -#: lang/json/ARMOR_from_json.py -msgid "military rucksack" -msgid_plural "military rucksacks" -msgstr[0] "军用背包" - -#. ~ Description for military rucksack -#: lang/json/ARMOR_from_json.py -msgid "A huge military rucksack, provides a lot of storage." -msgstr "一个广泛用于士兵行军、远足者旅行的结实耐用的大背包,提供非常可观的储存空间。" - -#: lang/json/ARMOR_from_json.py -msgid "runner pack" -msgid_plural "runner packs" -msgstr[0] "跑步者背包" - -#. ~ Description for runner pack -#: lang/json/ARMOR_from_json.py -msgid "" -"The obvious choice for outdoor athletes, this ergonomic backpack is light " -"and easy to wear, ensuring comfort when carrying heavy and bulky items." -msgstr "" -"一个设计严格符合人体工程学的轻便舒适小背包,提供少量的储存空间。\n" -"\"信不信我可以在里面装着个大铁砧还能来个百米冲刺?\"" - #: lang/json/ARMOR_from_json.py msgid "scabbard" msgid_plural "scabbards" @@ -10096,18 +9994,6 @@ msgstr[0] "无袖上衣" msgid "A sleeveless cloth garment that covers the torso and legs." msgstr "一件覆盖了躯干的无袖布衣。" -#: lang/json/ARMOR_from_json.py -msgid "sling pack" -msgid_plural "sling packs" -msgstr[0] "单肩挎包" - -#. ~ Description for sling pack -#: lang/json/ARMOR_from_json.py -msgid "" -"A simple single-sling backpack. Easier to access than a normal backpack, " -"but can't comfortably hold as much." -msgstr "一个单肩挎包,相比普通背包更加轻便,提供比较可观的储存空间。" - #: lang/json/ARMOR_from_json.py msgid "snuggie" msgid_plural "snuggies" @@ -10353,8 +10239,8 @@ msgid_plural "survivor belts" msgstr[0] "幸存者腰带" #. ~ Use action holster_prompt for survivor belt. -#. ~ Use action holster_prompt for hiking backpack. #. ~ Use action holster_prompt for survivor utility belt. +#. ~ Use action holster_prompt for hiking backpack. #. ~ Use action holster_prompt for C.R.I.T web belt. #: lang/json/ARMOR_from_json.py msgid "Sheath blade" @@ -10368,18 +10254,6 @@ msgid "" "comfortable to wear. Activate to sheathe/draw a weapon." msgstr "一条自制的皮革工具带,上边有满满的皮带和口袋,同时集成着一个小型刀鞘。精细的做工让它又耐用穿起来又舒服。激活它来收拔武器。" -#: lang/json/ARMOR_from_json.py -msgid "survivor duffel bag" -msgid_plural "survivor duffel bags" -msgstr[0] "幸存者行李包" - -#. ~ Description for survivor duffel bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built heavy duffel bag. Durable and carefully crafted to hold as " -"much stuff as possible." -msgstr "量身打造的沉重的编织袋,额外缝了很多口袋上去。值得信赖的手工技术将它打造得至为舒适耐用。" - #: lang/json/ARMOR_from_json.py msgid "survivor goggles" msgid_plural "pairs of survivor goggles" @@ -10392,42 +10266,6 @@ msgid "" "built to last, they provide excellent protection from environmental dangers." msgstr "一个自制的带深色镜片的强化眼镜。舒适且耐用,保护你不会受到环境伤害的影响。" -#: lang/json/ARMOR_from_json.py -msgid "survivor backpack" -msgid_plural "survivor backpacks" -msgstr[0] "幸存者背包" - -#. ~ Description for survivor backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built backpack. Durable and carefully crafted to hold as much " -"stuff as possible." -msgstr "一件自制的背包,经久耐用并且被经过精心制造,使得它能够装下尽可能多的物品。" - -#: lang/json/ARMOR_from_json.py -msgid "survivor rucksack" -msgid_plural "survivor rucksacks" -msgstr[0] "幸存者帆布包" - -#. ~ Description for survivor rucksack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built heavy backpack. Durable and carefully crafted to hold as " -"much stuff as possible." -msgstr "一件自制的重型背包,经久耐用并且被经过精心制造,使得它能够装下尽可能多的物品。" - -#: lang/json/ARMOR_from_json.py -msgid "survivor runner pack" -msgid_plural "survivor runner packs" -msgstr[0] "幸存者跑步包" - -#. ~ Description for survivor runner pack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built lightweight runner pack. Durable and carefully crafted to " -"hold as much stuff as possible." -msgstr "一件量身打造的轻型跑步背包,额外缝了很多口袋上去。值得信赖的手工技术将它打造得至为舒适耐用。" - #: lang/json/ARMOR_from_json.py msgid "survivor suit" msgid_plural "survivor suits" @@ -10807,7 +10645,7 @@ msgstr "一件棉制的短袖衬衫,正面印有一位肌肉发达的长发男 msgid "" "A short-sleeved cotton shirt with a gore-spattered, guitar-playing zombie " "printed on the front. It's rather tasteless in light of current events." -msgstr "一件棉制的短袖衬衫,上面印着浑身鲜血弹吉他的僵尸。考虑到当前的情况,这是相当无趣的。" +msgstr "一件棉制的短袖衬衫,上面印着浑身鲜血弹吉他的丧尸。考虑到当前的情况,这是相当无趣的。" #: lang/json/ARMOR_from_json.py msgid "" @@ -11262,29 +11100,6 @@ msgid "" "stereotypical cap golfers wear." msgstr "一个高尔夫球运动员带的传统帽子。" -#: lang/json/ARMOR_from_json.py -msgid "golf bag" -msgid_plural "golf bags" -msgstr[0] "高尔夫球包" - -#. ~ Use action holster_msg for golf bag. -#: lang/json/ARMOR_from_json.py -#, no-python-format -msgid "You awkwardly sheath your %s" -msgstr "你笨拙地将%s收入球包中。" - -#. ~ Use action holster_prompt for golf bag. -#: lang/json/ARMOR_from_json.py -msgid "Sheath golf club" -msgstr "收起球棍" - -#. ~ Description for golf bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A tall canvas and plastic bag with fold-out legs used for golfing. It even " -"has straps to be worn on the back." -msgstr "一个细长的带有可折叠支架的高尔夫球背包,采用帆布和塑料制成。附有背带可以佩戴在后背。" - #: lang/json/ARMOR_from_json.py msgid "javelin bag" msgid_plural "javelin bags" @@ -11379,62 +11194,6 @@ msgid "" "Useful for improvised rain protection." msgstr "用绳子或线固定的塑料片,还算有效的临时防雨措施。" -#: lang/json/ARMOR_from_json.py -msgid "high-volume rucksack" -msgid_plural "high-volume rucksacks" -msgstr[0] "大容量帆布包" - -#. ~ Description for high-volume rucksack -#: lang/json/ARMOR_from_json.py -msgid "" -"Also know as a \"bigpack\", this rucksack is prized by pack rats but may " -"lead to a bad back." -msgstr "这个帆布包也被称作“大背包”。它巨大的容量受到松鼠党的一致好评,但是也可能会压坏你的背。" - -#: lang/json/ARMOR_from_json.py -msgid "hiking backpack" -msgid_plural "hiking backpacks" -msgstr[0] "旅行背包" - -#. ~ Description for hiking backpack -#: lang/json/ARMOR_from_json.py -msgid "A large sized hiking backpack with plenty of storage space." -msgstr "一个大容量的旅行背包,提供了很大的存储空间。" - -#: lang/json/ARMOR_from_json.py -msgid "petpack" -msgid_plural "petpacks" -msgstr[0] "宠物包" - -#. ~ Description for petpack -#: lang/json/ARMOR_from_json.py -msgid "" -"Before the Cataclysm this would allow your four-legged friend to see the " -"world, now it's used to shield them from the world." -msgstr "在大灾变来临前,这个背包可以让你带着你四条腿的朋友见识这个世界,但现在它也可以用来保护他们免遭世界的伤害。" - -#: lang/json/ARMOR_from_json.py -msgid "large tactical backpack" -msgid_plural "large tactical backpacks" -msgstr[0] "大型战术背包" - -#. ~ Description for large tactical backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A large tactical multi-compartment backpack that has great lower back " -"support." -msgstr "一个大型战术背包,内设多个隔间,对背部下方的支撑性能优异。" - -#: lang/json/ARMOR_from_json.py -msgid "travelpack" -msgid_plural "travelpacks" -msgstr[0] "旅行包" - -#. ~ Description for travelpack -#: lang/json/ARMOR_from_json.py -msgid "A hiking pack used for short trips." -msgstr "用于短途旅行的登山包。" - #: lang/json/ARMOR_from_json.py msgid "survivor utility belt" msgid_plural "survivor utility belts" @@ -11628,6 +11387,289 @@ msgid "" "resistant vests. It has four pouches capable of carrying magazines." msgstr "一件基于现有防弹背心设计制造的大型凯夫拉背心。它有四个能装弹匣的袋子。" +#: lang/json/ARMOR_from_json.py +msgid "backpack" +msgid_plural "backpacks" +msgstr[0] "背包" + +#. ~ Description for backpack +#: lang/json/ARMOR_from_json.py +msgid "A small backpack. Good storage for a little encumbrance." +msgstr "一个小型布制背包,用一点点累赘换取可观的储存空间。" + +#: lang/json/ARMOR_from_json.py +msgid "hiking backpack" +msgid_plural "hiking backpacks" +msgstr[0] "旅行背包" + +#. ~ Description for hiking backpack +#: lang/json/ARMOR_from_json.py +msgid "A large sized hiking backpack with plenty of storage space." +msgstr "一个大容量的旅行背包,提供了很大的存储空间。" + +#: lang/json/ARMOR_from_json.py +msgid "giant novelty backpack" +msgid_plural "giant novelty backpacks" +msgstr[0] "巨大新奇背包" + +#. ~ Description for giant novelty backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A huge fabric backpack made mostly as a joke before the cataclysm. Now, " +"it's still rather silly, but it can store a lot of stuff." +msgstr "一个体积巨大的纤维背包,在大灾变前看上去很可笑。现在,虽然看着还是很蠢,但是能储存许多物品。" + +#: lang/json/ARMOR_from_json.py +msgid "leather backpack" +msgid_plural "leather backpacks" +msgstr[0] "皮质背包" + +#. ~ Description for leather backpack +#: lang/json/ARMOR_from_json.py +msgid "A small leather backpack. Good storage for a little encumbrance." +msgstr "一个小型皮制背包,用一点点累赘换取可观的储存空间,相比普通背包更加耐用。" + +#: lang/json/ARMOR_from_json.py +msgid "large tactical backpack" +msgid_plural "large tactical backpacks" +msgstr[0] "大型战术背包" + +#. ~ Description for large tactical backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A large tactical multi-compartment backpack that has great lower back " +"support." +msgstr "一个大型战术背包,内设多个隔间,对背部下方的支撑性能优异。" + +#: lang/json/ARMOR_from_json.py +msgid "high-volume rucksack" +msgid_plural "high-volume rucksacks" +msgstr[0] "大容量帆布包" + +#. ~ Description for high-volume rucksack +#: lang/json/ARMOR_from_json.py +msgid "" +"Also know as a \"bigpack\", this rucksack is prized by pack rats but may " +"lead to a bad back." +msgstr "这个帆布包也被称作“大背包”。它巨大的容量受到松鼠党的一致好评,但是这也可能让太多的重物压断你的腰。" + +#: lang/json/ARMOR_from_json.py +msgid "dive bag" +msgid_plural "dive bags" +msgstr[0] "潜水背包" + +#. ~ Description for dive bag +#: lang/json/ARMOR_from_json.py +msgid "A lightweight mesh backpack, commonly worn by swimmers and divers." +msgstr "一件很轻的潜水员用网眼背包,提供比较可观的储物空间。" + +#: lang/json/ARMOR_from_json.py +msgid "duffel bag" +msgid_plural "duffel bags" +msgstr[0] "行李袋" + +#. ~ Description for duffel bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A huge duffel bag. Provides plenty of storage, but is severely encumbering." +msgstr "一个巨大的无纺布编织袋,提供了极其可观的储存空间,但相当的累赘。" + +#: lang/json/ARMOR_from_json.py +msgid "petpack" +msgid_plural "petpacks" +msgstr[0] "宠物包" + +#. ~ Description for petpack +#: lang/json/ARMOR_from_json.py +msgid "" +"Before the Cataclysm this would allow your four-legged friend to see the " +"world, now it's used to shield them from the world." +msgstr "在大灾变来临前,这个背包可以让你带着你四条腿的朋友见识这个世界,但现在它也可以用来保护他们免遭世界的伤害。" + +#: lang/json/ARMOR_from_json.py +msgid "jerrypack" +msgid_plural "jerrypacks" +msgstr[0] "肩背式油桶背包" + +#. ~ Description for jerrypack +#: lang/json/ARMOR_from_json.py +msgid "A jerrycan modified to be worn in a similar manner to a backpack." +msgstr "" +"一个五加仑装的油桶绑上带子,剪个大口,然后背到背上,成为了一个背包。\n" +"\"天才的造物!\"" + +#: lang/json/ARMOR_from_json.py +msgid "makeshift knapsack" +msgid_plural "makeshift knapsacks" +msgstr[0] "简易背包" + +#. ~ Description for makeshift knapsack +#: lang/json/ARMOR_from_json.py +msgid "" +"A pair of pants with the bottom ends tied with string, and then passed " +"through the belt loops so the knapsack can be carried on the back." +msgstr "一条底部被绳索绑起来的裤子,绳索接着穿过皮带扣,使得整条裤子能够像背包背在背上,提供比较可观的储物空间。" + +#: lang/json/ARMOR_from_json.py +msgid "makeshift sling" +msgid_plural "makeshift slings" +msgstr[0] "简易肩背袋" + +#. ~ Description for makeshift sling +#: lang/json/ARMOR_from_json.py +msgid "A large sheet tied into a crude, over-the-shoulder sling." +msgstr "用一块小床单折叠起来的简易过肩吊袋,提供比较可观的储存空间。" + +#: lang/json/ARMOR_from_json.py +msgid "messenger bag" +msgid_plural "messenger bags" +msgstr[0] "信使包" + +#. ~ Description for messenger bag +#: lang/json/ARMOR_from_json.py +msgid "Light and easy to wear, but doesn't offer much storage." +msgstr "一个常见的呈长方形、比较大的挎包,常见于邮递员投送报纸、信件时候所配备,提供比较可观的储存空间。" + +#: lang/json/ARMOR_from_json.py +msgid "MOLLE pack" +msgid_plural "MOLLE packs" +msgstr[0] "MOLLE战术背包" + +#. ~ Description for MOLLE pack +#: lang/json/ARMOR_from_json.py +msgid "" +"The Modular Lightweight Load-carrying Equipment is an advanced military " +"backpack. Covered with pockets and straps, it strikes a fine balance " +"between storage space and encumbrance." +msgstr "一件新一代模块化的改进型军用背包,相比普通背包它更加轻便舒适,且提供更可观的储存空间,取得了储存空间与累赘度之间的完美平衡。" + +#: lang/json/ARMOR_from_json.py +msgid "purse" +msgid_plural "purses" +msgstr[0] "手提包" + +#. ~ Description for purse +#: lang/json/ARMOR_from_json.py +msgid "A bit cumbersome to wear, but provides some storage." +msgstr "一个用于随身携带、有拎带的手提包,拿起来有些不便,提供比较可观的储存空间。" + +#: lang/json/ARMOR_from_json.py +msgid "military rucksack" +msgid_plural "military rucksacks" +msgstr[0] "军用背包" + +#. ~ Description for military rucksack +#: lang/json/ARMOR_from_json.py +msgid "A huge military rucksack, provides a lot of storage." +msgstr "一个广泛用于士兵行军、远足者旅行的结实耐用的大背包,提供非常可观的储存空间。" + +#: lang/json/ARMOR_from_json.py +msgid "runner pack" +msgid_plural "runner packs" +msgstr[0] "跑步者背包" + +#. ~ Description for runner pack +#: lang/json/ARMOR_from_json.py +msgid "" +"The obvious choice for outdoor athletes, this ergonomic backpack is light " +"and easy to wear, ensuring comfort when carrying heavy and bulky items." +msgstr "" +"一个设计严格符合人体工程学的轻便舒适小背包,提供少量的储存空间。\n" +"\"信不信我可以在里面装着个大铁砧还能来个百米冲刺?\"" + +#: lang/json/ARMOR_from_json.py +msgid "sling pack" +msgid_plural "sling packs" +msgstr[0] "单肩挎包" + +#. ~ Description for sling pack +#: lang/json/ARMOR_from_json.py +msgid "" +"A simple single-sling backpack. Easier to access than a normal backpack, " +"but can't comfortably hold as much." +msgstr "一个单肩挎包,相比普通背包更加轻便,提供比较可观的储存空间。" + +#: lang/json/ARMOR_from_json.py +msgid "survivor duffel bag" +msgid_plural "survivor duffel bags" +msgstr[0] "幸存者行李包" + +#. ~ Description for survivor duffel bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built heavy duffel bag. Durable and carefully crafted to hold as " +"much stuff as possible." +msgstr "量身打造的沉重的编织袋,额外缝了很多口袋上去。值得信赖的手工技术将它打造得至为舒适耐用。" + +#: lang/json/ARMOR_from_json.py +msgid "survivor backpack" +msgid_plural "survivor backpacks" +msgstr[0] "幸存者背包" + +#. ~ Description for survivor backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built backpack. Durable and carefully crafted to hold as much " +"stuff as possible." +msgstr "一件自制的背包,经久耐用并且被经过精心制造,使得它能够装下尽可能多的物品。" + +#: lang/json/ARMOR_from_json.py +msgid "survivor rucksack" +msgid_plural "survivor rucksacks" +msgstr[0] "幸存者帆布包" + +#. ~ Description for survivor rucksack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built heavy backpack. Durable and carefully crafted to hold as " +"much stuff as possible." +msgstr "一件自制的重型背包,经久耐用并且被经过精心制造,使得它能够装下尽可能多的物品。" + +#: lang/json/ARMOR_from_json.py +msgid "survivor runner pack" +msgid_plural "survivor runner packs" +msgstr[0] "幸存者跑步包" + +#. ~ Description for survivor runner pack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built lightweight runner pack. Durable and carefully crafted to " +"hold as much stuff as possible." +msgstr "一件量身打造的轻型跑步背包,额外缝了很多口袋上去。值得信赖的手工技术将它打造得至为舒适耐用。" + +#: lang/json/ARMOR_from_json.py +msgid "golf bag" +msgid_plural "golf bags" +msgstr[0] "高尔夫球包" + +#. ~ Use action holster_msg for golf bag. +#: lang/json/ARMOR_from_json.py +#, no-python-format +msgid "You awkwardly sheath your %s" +msgstr "你笨拙地将%s收入球包中。" + +#. ~ Use action holster_prompt for golf bag. +#: lang/json/ARMOR_from_json.py +msgid "Sheath golf club" +msgstr "收起球棍" + +#. ~ Description for golf bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A tall canvas and plastic bag with fold-out legs used for golfing. It even " +"has straps to be worn on the back." +msgstr "一个细长的带有可折叠支架的高尔夫球背包,采用帆布和塑料制成。附有背带可以佩戴在后背。" + +#: lang/json/ARMOR_from_json.py +msgid "travelpack" +msgid_plural "travelpacks" +msgstr[0] "旅行包" + +#. ~ Description for travelpack +#: lang/json/ARMOR_from_json.py +msgid "A hiking pack used for short trips." +msgstr "用于短途旅行的登山包。" + #: lang/json/ARMOR_from_json.py msgid "pistol bandolier" msgid_plural "pistol bandoliers" @@ -14442,18 +14484,6 @@ msgid "" msgstr "" "这个生化插件会在使用者身体周围产生一层护盾。任何对使用者的攻击都有几率被这层护盾格挡,同时消耗能量。子弹比刀剑更容易格挡,而刀剑又比更巨大的物体易于格挡。" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Advanced Microreactor CBM" -msgid_plural "Advanced Microreactor CBMs" -msgstr[0] "高级微型体内核反应堆CBM" - -#. ~ Description for Advanced Microreactor CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"This module upgrades a pre-installed microreactor with enhanced maximum " -"yield and limited automatic radiation scrubbing capabilities." -msgstr "这个模组可用于升级体内已有的微型反应堆,提升最大输出功率,并且增加有限的自动核辐射清洁能力。" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Alarm System CBM" msgid_plural "Alarm System CBMs" @@ -15162,18 +15192,6 @@ msgid "" "cause delayed reaction times and drowsiness." msgstr "这个模组通过使受体的神经系统抑制疼痛信号,使受体能够随意抑制感官输入。不过,使用该系统可能会导致反应迟钝和嗜睡等症状。" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Plutonium Filter CBM" -msgid_plural "Plutonium Filter CBMs" -msgstr[0] "钚过滤器CBM" - -#. ~ Description for Plutonium Filter CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A system of tanks and filters that are connected to a microreactor to " -"extract plutonium from radioactive slurry." -msgstr "和微型反应堆相连接的过滤装置,用于从放射性废料中提取出浓缩钚。" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Power Armor Interface CBM" msgid_plural "Power Armor Interface CBMs" @@ -15295,31 +15313,6 @@ msgid "" "unarmed slashing damage whenever the user's fingertips are uncovered." msgstr "受体的指甲之下植入了剃刀般锋利的爪子,由十个四厘米长的利刃组成。当受体的指尖没有被盖住时,可以用它们徒手攻击造成少量的斩击伤害。" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Internal Microreactor CBM" -msgid_plural "Internal Microreactor CBMs" -msgstr[0] "微型体内核反应堆CBM" - -#. ~ Description for Internal Microreactor CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"This stripped down mini-reactor will generate impressive amounts of bionic " -"power, but may not be the safest thing to install. Once active, it cannot " -"be shut down and will slowly contaminate the user's body with radiation." -msgstr "这个小型核反应堆能够提供不少生化能量,但是植入它可能不是非常安全,因为一旦开启,它就不能关闭,并且会缓慢地释放辐射污染使用者的身体。" - -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Microreactor Upgrade CBM" -msgid_plural "Microreactor Upgrade CBMs" -msgstr[0] "升级版微型体内反应堆CBM" - -#. ~ Description for Microreactor Upgrade CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A kit for upgrading a pre-installed microreactor with enhanced maximum yield" -" and limited automatic radiation scrubbing capabilities." -msgstr "这是一个微型反应堆升级套件,用于提升最大输出功率,并增加有限的自动核辐射清洁能力。" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Recycler Unit CBM" msgid_plural "Recycler Unit CBMs" @@ -15473,7 +15466,7 @@ msgid "" "This bionic module contains range finders and synchronizes the movement of " "the user's eyes with their arms, to a degree. Shots they fire will be much " "more accurate, particularly at long ranges." -msgstr "" +msgstr "这个生化插件内含测距仪,并且能在一定程度上使使用者的眼睛与手臂保持同步。使用者的枪击将会更精准,特别是在长距离上。" #: lang/json/BIONIC_ITEM_from_json.py msgid "Teleportation Unit CBM" @@ -15488,6 +15481,7 @@ msgid "" "of much power. Note that prolonged or frequent use may have dangerous side " "effects." msgstr "" +"这个高度实验性质的生化插件可将空间折叠,进行短距离传送。通过消耗大量能量,使用者可以在一定时间内传送至25英尺外的地方。需要注意的是长期或者频繁使用可能有危险的副作用。" #: lang/json/BIONIC_ITEM_from_json.py msgid "Time Dilation CBM" @@ -15501,6 +15495,7 @@ msgid "" "speed and reactions dramatically, essentially freezing time. Violent or " "rapid movements may cause damage due to friction." msgstr "" +"通过消耗体内所有储存的生化插件能量,使用者可以极大的提升自己的速度和反应能力,就好像把时间冻结了一样。但是,剧烈或高速下运动产生的空气摩擦可能会导致受伤。" #: lang/json/BIONIC_ITEM_from_json.py msgid "Integrated Toolset CBM" @@ -15513,7 +15508,7 @@ msgid "" "A surgically implanted set of tools - screwdriver, hammer, wrench, hacksaw, " "hand drill, welder and heating elements. These can be used in place of many" " tools when crafting." -msgstr "" +msgstr "一套手术植入的工具,包括螺丝刀、锤子、扳手、钢锯、手钻、电焊以及加热元件,可以在制作物品时替代对应工具。" #: lang/json/BIONIC_ITEM_from_json.py msgid "Joint Torsion Ratchet CBM" @@ -15526,7 +15521,7 @@ msgid "" "Torsion ratchets that replace the user's joints to slowly generate power " "when they move. These can be toggled to generate more power, but movement " "will require more effort." -msgstr "" +msgstr "一套动力齿轮,用于替换使用者的关节,从而在其移动时缓慢恢复生化能量。启动即可开始产生能量,但是移动会更加费力。" #: lang/json/BIONIC_ITEM_from_json.py msgid "Joint Servo CBM" @@ -15541,6 +15536,7 @@ msgid "" "requires less effort while this bionic is active. However, when it's " "offline it will hamper the user's movement." msgstr "" +"一套伺服电机,安装于腿部关节之上,能为运动提供辅助动力。这套系统主要为跑步优化,但是行走也将更加省力。然而,当它关闭时,未工作的移动部件会阻碍使用者的行动。" #: lang/json/BIONIC_ITEM_from_json.py msgid "Uncanny Dodge CBM" @@ -15552,7 +15548,7 @@ msgstr[0] "神奇闪避CBM" msgid "" "Bionic processors that augment the the user's nervous system, allowing them " "to dodge attacks beyond normal human capability, including bullets." -msgstr "" +msgstr "一套生化处理器,能够增强使用者的神经系统,使其能够以远超常人的水平回避攻击,包括闪避子弹。" #: lang/json/BIONIC_ITEM_from_json.py msgid "Unified Power System CBM" @@ -15565,7 +15561,7 @@ msgid "" "A Unified Power System that is wired into the user's bionic power banks. " "Objects that run on a UPS can now directly draw power from the bionic power " "supply." -msgstr "" +msgstr "一套UPS系统,连接到了使用者的生化能量槽上。使用UPS的物品现在可以直接使用生化能量了。" #: lang/json/BIONIC_ITEM_from_json.py msgid "Internal Chronometer CBM" @@ -15577,7 +15573,7 @@ msgstr[0] "体内计时器CBM" msgid "" "This bionic module contains an atomic clock, complete with silent alarm " "clock function." -msgstr "" +msgstr "这个生化插件包含了一个原子钟,以及无声闹钟功能。" #: lang/json/BIONIC_ITEM_from_json.py msgid "Water Extraction Unit CBM" @@ -15590,7 +15586,7 @@ msgid "" "This module contains nanotubes that are embedded in the palm of the hand to " "pump any available fluid out of a dead body, cleanse it of impurities and " "convert it into potable water. Water container not included." -msgstr "" +msgstr "这个模块包含了一套纳米管,能够植入到掌心,用于从尸体中提取可用的液体,净化并转换为可饮用的净水。不过,你必须有个装水的容器。" #: lang/json/BIONIC_ITEM_from_json.py msgid "Intravenous Needletip CBM" @@ -15604,6 +15600,7 @@ msgid "" "hoses instead of a plunger. Installed, it allows the user to draw " "substances directly into their bloodstream akin to a regular syringe." msgstr "" +"一个带有可伸缩针头的小型注射管,但针管末端是网状细管而非柱状活塞。安装后,使用者可以通过注射管将针剂直接引入血液之中,达成类似注射针筒的功能。" #: lang/json/BIONIC_ITEM_from_json.py msgid "Titanium Skeletal Bracing CBM" @@ -15616,7 +15613,7 @@ msgid "" "A set of hinges, springs, and other synthetic augments for the skeletal " "structure. These artificial enhancers strengthen the knees and elbows, " "allowing the user to carry more weight." -msgstr "" +msgstr "一副由各种铰链,弹簧,和其他合成材料增强过的骨架被植入了使用者的体内。这些生化强化装置加强了膝盖和肘部关节,让使用者能够携带更多的重量。" #: lang/json/BIONIC_ITEM_from_json.py msgid "Kinetic Shock Absorbers CBM" @@ -15631,6 +15628,7 @@ msgid "" "negate damage from severe impacts such as falling, at the cost of reducing " "the user's ability to move effectively." msgstr "" +"一套液压弹簧和折叠衬垫替代了使用者的四肢和上半身的大部分肉体。开启时,这些吸收器将抵消诸如跌落等严重冲击所造成的伤害,但会大大降低使用者的移动能力。" #: lang/json/BIONIC_ITEM_from_json.py msgid "Taste Modifier CBM" @@ -15643,7 +15641,7 @@ msgid "" "A set of highly sensitive sensors implanted in the user's mouth, combined " "with a sophisticated analyzer. While active, it will block all unpleasant " "taste and texture at the cost of bionic energy." -msgstr "" +msgstr "一套极其敏感的传感器被植入到了使用者的口腔,附有一个复杂的分析装置。开启时,它可以通过消耗生化能量来屏蔽不佳的味道和质感。" #: lang/json/BIONIC_ITEM_from_json.py msgid "Soporific Induction CBM" @@ -15655,7 +15653,7 @@ msgstr[0] "催眠诱导CBM" msgid "" "A microscopic electrode designed to gently stimulate a particular cluster of" " neurons in the hypothalamus, helping the user to fall asleep." -msgstr "" +msgstr "一种微小的电极,设计用来轻轻地刺激使用者下丘脑的一组神经元,帮助其入睡。" #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "Squeaky Ankles" @@ -15834,7 +15832,7 @@ msgstr[0] "感电僵硬" #. ~ Description for Wire-Induced Stiffness #: lang/json/BIONIC_ITEM_from_json.py msgid "A length of poorly installed wiring that would cause stiffness." -msgstr "一根错误安装的电线,会造成受体的僵直。" +msgstr "一根错误安装的电线,会造成身体的僵直。" #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "Self-Locking Thumbs" @@ -15908,6 +15906,55 @@ msgid "" "may carry an extra 2 liters of volume." msgstr "你胸部的空腔被转化成了储存区域。你可以额外携带2升的物品。" +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Advanced Microreactor CBM" +msgid_plural "Advanced Microreactor CBMs" +msgstr[0] "高级微型体内核反应堆CBM" + +#. ~ Description for Advanced Microreactor CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"This module upgrades a pre-installed microreactor with enhanced maximum " +"yield and limited automatic radiation scrubbing capabilities." +msgstr "这个模组可用于升级体内已有的微型反应堆,提升最大输出功率,并且增加有限的自动核辐射清洁能力。" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Plutonium Filter CBM" +msgid_plural "Plutonium Filter CBMs" +msgstr[0] "钚过滤器CBM" + +#. ~ Description for Plutonium Filter CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A system of tanks and filters that are connected to a microreactor to " +"extract plutonium from radioactive slurry." +msgstr "和微型反应堆相连接的过滤装置,用于从放射性废料中提取出浓缩钚。" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Internal Microreactor CBM" +msgid_plural "Internal Microreactor CBMs" +msgstr[0] "微型体内核反应堆CBM" + +#. ~ Description for Internal Microreactor CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"This stripped down mini-reactor will generate impressive amounts of bionic " +"power, but may not be the safest thing to install. Once active, it cannot " +"be shut down and will slowly contaminate the user's body with radiation." +msgstr "这个小型核反应堆能够提供不少生化能量,但是植入它可能不是非常安全,因为一旦开启,它就不能关闭,并且会缓慢地释放辐射污染使用者的身体。" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Microreactor Upgrade CBM" +msgid_plural "Microreactor Upgrade CBMs" +msgstr[0] "升级版微型体内反应堆CBM" + +#. ~ Description for Microreactor Upgrade CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A kit for upgrading a pre-installed microreactor with enhanced maximum yield" +" and limited automatic radiation scrubbing capabilities." +msgstr "这是一个微型反应堆升级套件,用于提升最大输出功率,并增加有限的自动核辐射清洁能力。" + #. ~ Description for Solar Panels CBM #: lang/json/BIONIC_ITEM_from_json.py msgid "" @@ -18173,26 +18220,26 @@ msgstr "一本对道德准则进行深入讨论的书,侧重于认识论和逻 #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Nietzsche's \"Beyond Good and Evil\". Its cover is dog-" +"This is a copy of Nietzsche's \"Beyond Good and Evil\". Its cover is dog-" "eared and creased." msgstr "尼采所著的《善恶的彼岸》。它的封面已经折角变皱。" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"The Unique and Its Property\" by Max Stirner. A modern " +"This is a copy of \"The Unique and Its Property\" by Max Stirner. A modern " "translation by Wolfi Landstreicher." msgstr "麦克斯·施蒂纳所著的《唯一者及其所有物》。这本是Wolfi Landstreicher的现代译本。" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Jean-Paul Sartre's \"Being and Nothingness\". A key work " +"This is a copy of Jean-Paul Sartre's \"Being and Nothingness\". A key work " "in the existentialist tradition." msgstr "让-保罗·萨特所著的《存在与虚无》,存在主义的重要著作。" #: lang/json/BOOK_from_json.py msgid "" "A large, extended version of \"Madness and Civilisation\" by Michel " -"Foucault. The cover features a striking image of a Panopticonic Prison." +"Foucault. The cover features a striking image of a Panopticonic Prison." msgstr "米歇尔·福柯所著的《古典时期疯狂史》的大部头增订版。封面上印着一幅极具视觉冲击力的圆形监狱的图像。" #: lang/json/BOOK_from_json.py @@ -18203,13 +18250,13 @@ msgstr "让-弗朗索瓦·利奥塔所著的《后现代状况》。" #: lang/json/BOOK_from_json.py msgid "" -"A collection of texts and essays by Jacques Derrida. It's pages loose and " +"A collection of texts and essays by Jacques Derrida. It's pages loose and " "yellowed, you should probably handle it with care." msgstr "雅克·德里达的散文集。这本书的书页已经松散发黄,需要小心存放。" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Society of the Spectacle\" by Guy Debord. Its cover " +"This is a copy of \"Society of the Spectacle\" by Guy Debord. Its cover " "shows rows of adults staring placidly into a screen." msgstr "居伊·德波所著的《景观社会》。这本书的封面上展示着数排成年人满足地盯着一块屏幕的图像。" @@ -18223,37 +18270,37 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Baudrillard's \"Simulation and Simulacra\". The cover " +"This is a copy of Baudrillard's \"Simulation and Simulacra\". The cover " "contains an image of a man holding a colored pill in each hand, with the " -"caption \"Welcome to the Desert of the Real.\". You think you've seen this " +"caption \"Welcome to the Desert of the Real.\". You think you've seen this " "movie." msgstr "" -"让·鲍德里亚所著的《拟像和模拟》。这本书的封面上印着一名男性,两手握着不同颜色的药丸,图题为“欢迎来到真实的荒漠”。你觉得你好像看过一部这样的电影。" +"让·鲍德里亚所著的《拟像和模拟》。这本书的封面上印着一名男性,两手拿着不同颜色的药丸,图题为“欢迎来到真实的荒漠”。你觉得你好像看过一部这样的电影。" #: lang/json/BOOK_from_json.py msgid "" -"This is a small, pocket version of Sartre's \"Existentialism and Humanism.\"" -" It looks to have been used as a coaster in a past life." +"This is a small, pocket version of Sartre's \"Existentialism and Humanism\"." +" It looks to have been used as a coaster in a past life." msgstr "让-保罗·萨特所著的《存在主义是一种人道主义》的口袋版。这本书看起来曾经被当作杯托用过。" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Practical Ethics\" by Peter Singer. From the local " +"This is a copy of \"Practical Ethics\" by Peter Singer. From the local " "university press." msgstr "彼得·辛格所著的《Practical Ethics(实用伦理学)》,由本地大学的出版社出版。" #: lang/json/BOOK_from_json.py msgid "" "This is a photocopied spiral-bound copy of \"Industrial Society and Its " -"Future\" by 'Freedom Club'. The original looks to have been written on a " +"Future\" by 'Freedom Club'. The original looks to have been written on a " "typewriter before being copied." msgstr "一本“Freedom Club(自由俱乐部)”所著的《论工业社会及其未来》的活页影印本。影印前的原书似乎是用打字机撰写的。" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Industrial Society and Its Future\" by Ted Kaczynski. " +"This is a copy of \"Industrial Society and Its Future\" by Ted Kaczynski. " "Its cover is an image of a hand-crafted wooden box filled with wiring and an" -" ominous looking metal tube. Provocative." +" ominous looking metal tube. Provocative." msgstr "泰德·卡辛斯基所著的《论工业社会及其未来》。这本的封面上印着一个手工制的木盒,里面装有电线和金属管,给人一种不好的预感。极具煽动性。" #: lang/json/BOOK_from_json.py @@ -18262,23 +18309,23 @@ msgstr "这是一本有关黑格尔的辩证法的简短读物。" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"The State and Revolution\" by Vladimir Lenin. In " +"This is a copy of \"The State and Revolution\" by Vladimir Lenin. In " "English, thankfully." msgstr "列宁所著的《国家与革命》。幸好是中译本。" #: lang/json/BOOK_from_json.py -msgid "This is a copy of \"In Defence of Terrorism\" by Leon Trotsky." +msgid "This is a copy of \"In Defense of Marxism\" by Leon Trotsky." msgstr "列夫·达维多维奇·托洛茨基所著的《保卫马克思主义》。" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Steal This Book\" by Abbie Hoffman. There is a security " -"tag on the back cover. It appears to still be active." +"This is a copy of \"Steal This Book\" by Abbie Hoffman. There is a security" +" tag on the back cover. It appears to still be active." msgstr "艾比·霍夫曼所著的《Steal This Book(偷走这本书)》。书背上有一个防盗标签,看起来仍处于工作状态。" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Walden: Or Life In The Woods\" by Henry David Thoreau. " +"This is a copy of \"Walden: Or Life In The Woods\" by Henry David Thoreau. " "It contains a dried and pressed leaf as a bookmark." msgstr "亨利·大卫·梭罗所著的《湖滨散记》,里面夹着一张干燥压扁的树叶书签。" @@ -18300,7 +18347,7 @@ msgstr "" "雅各·拉冈所著的《The Four Fundamental Concepts of Psychoanalysis(精神分析的四个基本概念)》。" #: lang/json/BOOK_from_json.py -msgid "This is a copy of Machiavelli's \"The Prince\". With intro by Q. Skinner." +msgid "This is a copy of Machiavelli's \"The Prince\". With intro by Q. Skinner." msgstr "尼科洛·迪贝尔纳多·代·马基雅维利所著的《君主论》,由昆廷·斯金纳作序。" #: lang/json/BOOK_from_json.py @@ -18310,12 +18357,12 @@ msgstr "Raul Vangeigem所著《The Revolution of Everyday Life(日常生活的 #: lang/json/BOOK_from_json.py msgid "" -"This is a pocket copy of \"An Essay on Liberation\" by Herbert Marcuse. The " -"cover contains an image of a pelican." +"This is a pocket copy of \"An Essay on Liberation\" by Herbert Marcuse. The" +" cover contains an image of a pelican." msgstr "赫伯特·马尔库塞所著《论解放》的口袋版。封面上画着一只鹈鹕。" #: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Either-Or\" by Sören Kierkegaard." +msgid "This is a copy of \"Either-Or\" by Søren Kierkegaard." msgstr "索伦·奥贝·克尔凯郭尔所著的《非此即彼》。" #: lang/json/BOOK_from_json.py @@ -18340,6 +18387,73 @@ msgid "" "Science\" by Friederich Nietzsche." msgstr "弗里德里希·尼采所著《道德谱系学》和《快乐的科学》的合订本。" +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Myth of Sisyphus\", and other essays, by Albert " +"Camus. The cover depicts a bare-chested man and a large boulder." +msgstr "阿尔贝·加缪所著的《西绪弗斯神话》,以及其它散文。封面上画着一个光着膀子的男人和一块巨石。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Sickness Unto Death\" by Søren Kierkegaard. The " +"pages are dotted with post-it notes." +msgstr "索伦·奥贝·克尔凯郭尔所著的《致死的疾病》。书页上贴着许多便利贴。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Defence of Terrorism\" by Leon Trotsky. Despite the" +" title, it does not actually appear to be defending terrorism." +msgstr "" +"列夫·达维多维奇·托洛茨基所著的《The Defence of " +"Terrorism(对恐怖主义的辩护)》。虽然标题如此,但是其内容似乎并不是在辩护恐怖主义。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Enquiry Concerning Political Justice\" by William " +"Godwin. This thick book is filled with antiquated phrases." +msgstr "威廉·戈德温所著的《政治正义论》。这本厚书里面充满了陈旧的用词。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Abolition of Work and Other Essays\" by Bob Black. " +"It is likely that \"The Abolition of Work\" is the most famous essay in this" +" book." +msgstr "鲍勃·布莱克所著的《废除工作与其他文章》。很有可能《废除工作》是这本书里面最有名的一篇文章。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"What is Property?\" by Pierre-Joseph Proudhon. It looks" +" like this book has a surprisingly long track record of owners." +msgstr "皮埃尔-约瑟夫·普鲁东所著的《什么是所有权》。这本看起来曾经经手过不少的人。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Conquest of Bread\" by Peter Kropotkin. There is a " +"picture of an old philosopher with magnificent beard, instead of bread, on " +"the cover." +msgstr "彼得·阿列克谢耶维奇·克鲁泡特金亲王所著的《夺取面包》。封面上只印着一个大胡子老哲学家的照片,并没有什么面包。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Trouble with Being Born\" by Emil Cioran. This book" +" might have been printed decades before the cataclysm since the cover is " +"quite weathered." +msgstr "萧沆所著的《诞生之不便》。这本书应该是大灾变前几十年出版的,封面已经饱经风雨。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The World as Will and Representation\" by Arthur " +"Schopenhauer. It contains a few undecipherable notes and scribbles." +msgstr "阿图尔·叔本华所著的《作为意志和表象的世界》。书上有着一些潦草难解的笔记和涂画。" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Up-Wingers: A Futurist Manifesto\" by FM-2030. It seems" +" that the author's real name is Fereidoun M. Esfandiary." +msgstr "" +"FM-2030所著的《UpWingers: A Futurist Manifesto(上翼:未来主义宣言)》。看上去作者的真名好像是Fereidoun " +"M. Esfandiary(费雷登·伊斯凡迪亚里)" + #: lang/json/BOOK_from_json.py msgid "phone book" msgid_plural "phone books" @@ -18722,7 +18836,7 @@ msgstr "这本雷·布拉德伯雷的《华氏451度》包含一份防伪证书 msgid "" "This high-quality copy of \"Pride and Prejudice and Zombies\" has been " "autographed by the author." -msgstr "这本精装的《傲慢与偏见与僵尸》已由作者亲笔签名。" +msgstr "这本精装的《傲慢与偏见与丧尸》已由作者亲笔签名。" #: lang/json/BOOK_from_json.py msgid "" @@ -18750,7 +18864,7 @@ msgid "" "This is a high-quality leather bound copy of the well-known classic \"Dark " "Days Ahead\", by K. G. Ranade." msgstr "" -"豪华皮革装订本《黑暗之日》,一本经典名著。K·G·拉纳德著。\n" +"豪华皮革装订本《浩劫余生》,一本经典名著。K·G·拉纳德著。\n" "(注:Kevin Granade,本游戏主要作者)" #: lang/json/BOOK_from_json.py @@ -19940,11 +20054,11 @@ msgstr[0] "苯酚" msgid "" "This useful stuff is a potent solvent and has a wide range of reactive " "applications. It can be used to make a huge number of plastics and " -"polymers, it can be a disinfectant, it can strip paint and break down epoxy," -" and it can burn your skin away like tissue paper under a heat gun. Wear " +"polymers, it can be an antiseptic, it can strip paint and break down epoxy, " +"and it can burn your skin away like tissue paper under a heat gun. Wear " "gloves." msgstr "" -"这种有用的物质是一种有效的溶剂,具有广泛的应用。它可以用来制造大量的塑料聚合物,可以是一种消毒剂,可以去除油漆、分解环氧树脂,还可以像烧纸一样烧掉你的皮肤。\n" +"这种有用的物质是一种有效的溶剂,具有广泛的应用。它可以用来制造大量的塑料聚合物,可以是一种抗菌剂,可以去除油漆、分解环氧树脂,还可以像烧纸一样烧掉你的皮肤。\n" "\"碰触前请戴手套。\"" #: lang/json/COMESTIBLE_from_json.py @@ -24883,14 +24997,14 @@ msgstr "简单的由布条撕成的绷带。用沸水煮过,较有效地杀菌 #: lang/json/COMESTIBLE_from_json.py msgid "antiseptic powder" msgid_plural "antiseptic powder" -msgstr[0] "医用消毒粉" +msgstr[0] "医用抗菌粉" #. ~ Description for antiseptic powder #: lang/json/COMESTIBLE_from_json.py msgid "" -"A powdered form of chemical disinfectant, this bismuth formic iodide cleans " +"A powdered form of chemical antiseptic, this bismuth formic iodide cleans " "wounds quickly and painlessly." -msgstr "一些粉末形式的化学消毒剂,这些碘化铋甲酸消毒粉可以轻松无痛的清洁伤口。" +msgstr "一些粉末形式的化学抗菌剂,这些碘化铋甲酸消毒粉可以轻松无痛的清洁伤口。" #: lang/json/COMESTIBLE_from_json.py msgid "caffeinated chewing gum" @@ -24934,10 +25048,10 @@ msgstr[0] "过氧化氢" #. ~ Description for hydrogen peroxide #: lang/json/COMESTIBLE_from_json.py msgid "" -"Dilute hydrogen peroxide, for use as a disinfectant and for bleaching hair " -"or textiles. Foams a little when in contact with organic matter, but " +"Dilute hydrogen peroxide, for use as an antiseptic and for bleaching hair or" +" textiles. Foams a little when in contact with organic matter, but " "otherwise harmless." -msgstr "稀释的过氧化氢,可当消毒剂,或用来漂白头发与织物。与有机物接触时会轻微起泡,不过基本无害。" +msgstr "稀释的过氧化氢,可当抗菌剂,或用来漂白头发与织物。与有机物接触时会轻微起泡,不过基本无害。" #: lang/json/COMESTIBLE_from_json.py lang/json/GENERIC_from_json.py msgid "cigarette" @@ -25074,23 +25188,23 @@ msgid "" msgstr "白天使用的对抗感冒和流感的药物,吃了不瞌睡。可以抑制咳嗽,疼痛,头痛,流鼻涕,但你仍然需要多喝水和休息。" #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant" -msgstr "医用消毒剂" +msgid "antiseptic" +msgstr "抗菌剂" -#. ~ Description for disinfectant +#. ~ Description for antiseptic #: lang/json/COMESTIBLE_from_json.py -msgid "A powerful disinfectant commonly used for contaminated wounds." -msgstr "一份强效的消毒剂,用于清洁伤口。" +msgid "A powerful antiseptic commonly used for contaminated wounds." +msgstr "一份强效的抗菌剂,用于清洁伤口。" #: lang/json/COMESTIBLE_from_json.py -msgid "makeshift disinfectant" -msgstr "简易消毒剂" +msgid "makeshift antiseptic" +msgstr "简易抗菌剂" -#. ~ Description for makeshift disinfectant +#. ~ Description for makeshift antiseptic #: lang/json/COMESTIBLE_from_json.py msgid "" -"Makeshift disinfectant made from ethanol. Can be used to disinfect a wound." -msgstr "一份用乙醇制成的简易消毒剂,可用于伤口消毒。" +"Makeshift antiseptic made from ethanol. Can be used to disinfect a wound." +msgstr "一份用乙醇制成的简易抗菌剂,可用于伤口消毒。" #: lang/json/COMESTIBLE_from_json.py src/addiction.cpp msgid "diazepam" @@ -25433,8 +25547,8 @@ msgstr "百里香精油" #: lang/json/COMESTIBLE_from_json.py msgid "" "Some essential oil made from thyme, which can act as a mildly irritating " -"disinfectant." -msgstr "从百里香中提取的精华成分,可以作为轻度刺激性消毒剂。" +"antiseptic." +msgstr "从百里香中提取的精华成分,可以作为轻度刺激性的抗菌剂。" #: lang/json/COMESTIBLE_from_json.py msgid "rolling tobacco" @@ -25612,28 +25726,28 @@ msgid "" msgstr "具有强烈镇静作用的抗焦虑剂。可能造成注意力不集中和失忆。极易成瘾,而且需要多疗程的渐进式戒断。学名叫做阿普唑仑。" #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant soaked rag" -msgid_plural "disinfectant soaked rags" -msgstr[0] "消毒布条" +msgid "antiseptic soaked rag" +msgid_plural "antiseptic soaked rags" +msgstr[0] "抗菌布条" -#. ~ Description for disinfectant soaked rag +#. ~ Description for antiseptic soaked rag #: lang/json/COMESTIBLE_from_json.py msgid "" -"A rag soaked in disinfectant. Useful for light wounds, probaby won't help " -"with deep bites." -msgstr "浸过消毒剂的布条。对于轻微的伤口很有用,但对于严重的咬伤可能就没用了。" +"A rag soaked in antiseptic. Useful for light wounds, probaby won't help with" +" deep bites." +msgstr "浸过抗菌剂的布条。对于轻微的伤口很有用,但对于严重的咬伤可能就没用了。" #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant soaked cotton balls" -msgid_plural "disinfectant soaked cotton balls" -msgstr[0] "消毒棉花球" +msgid "antiseptic soaked cotton balls" +msgid_plural "antiseptic soaked cotton balls" +msgstr[0] "抗菌棉花球" -#. ~ Description for disinfectant soaked cotton balls +#. ~ Description for antiseptic soaked cotton balls #: lang/json/COMESTIBLE_from_json.py msgid "" -"Fluffy balls of clean white cotton. Now soaked with disinfectant, they are " +"Fluffy balls of clean white cotton. Now soaked with antiseptic, they are " "somewhat useful to disinfect a wound." -msgstr "干净的白色棉球。现在浸泡在消毒剂中,它们对伤口的消毒有些作用。" +msgstr "干净的白色棉球。这个浸泡了抗菌剂,对伤口的消毒有一定作用。" #: lang/json/COMESTIBLE_from_json.py msgid "Atreyupan" @@ -26248,7 +26362,7 @@ msgstr "变形怪诱变血清" msgid "" "A super-concentrated mutagen that looks very much like the black ooze in the" " zombies' eyes. You need a syringe to inject it... if you really want to?" -msgstr "超浓缩诱变剂,看上去非常像僵尸眼睛里的黑泥。需要一根针管来注射它,如果你真的想用…… " +msgstr "超浓缩诱变剂,看上去非常像丧尸眼睛里的黑泥。需要一根针管来注射它,如果你真的想用…… " #: lang/json/COMESTIBLE_from_json.py msgid "spider serum" @@ -27809,7 +27923,7 @@ msgstr "大丽花根" msgid "" "The large, tuberous root of a dahlia flower. It smells spicy, but is too " "starchy to eat without cooking." -msgstr "大丽花的大块根。它闻起来很辣,由于含有太淀粉,不做熟就不能吃。" +msgstr "大丽花的大块根。它闻起来挺辣,但是由于含有太多淀粉,不做熟就不能吃。" #: lang/json/COMESTIBLE_from_json.py msgid "salsify" @@ -28128,6 +28242,19 @@ msgstr[0] "果酱三明治" msgid "A delicious jam sandwich." msgstr "美味的果酱三明治。" +#: lang/json/COMESTIBLE_from_json.py +msgid "fairy bread" +msgid_plural "fairy bread" +msgstr[0] "彩糖面包" + +#. ~ Description for fairy bread +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"An 'open-faced sandwich' consisting of sliced white bread, a healthy crust-" +"to-crust slathering of butter, and sprinkles. Supposedly a staple of " +"birthday parties in Australia." +msgstr "一个“单面三明治”,由一块切片白面包涂上黄油和彩糖做成。据称是澳大利亚生日宴会的保留项目。" + #: lang/json/COMESTIBLE_from_json.py msgid "honey sandwich" msgid_plural "honey sandwiches" @@ -29261,6 +29388,20 @@ msgstr "" "甜甜的糖,多吃容易蛀牙,直接吃时并不是很美味,更适合用作调味品。\n" "\"众所周知,一包糖可以支撑一个成年人生存很多年。\"" +#: lang/json/COMESTIBLE_from_json.py +msgid "sprinkles" +msgid_plural "sprinkles" +msgstr[0] "彩糖" + +#. ~ Description for sprinkles +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Known as nonpareils, sprinkles, jimmies, sugar strands or 'hundreds-and-" +"thousands', these colorful balls, rods or flakes of sugar and starch are " +"intended for use decorating soft surfaces of sweets. Like sugar, they are " +"bad for your teeth and surprisingly not very tasty on their own." +msgstr "又名七彩米或巧克力米,这种彩色的糖丸、糖条或者糖片被用于装饰甜品的表面。和白糖一样对牙齿不好,而且单独尝起来也并不怎么好吃。" + #: lang/json/COMESTIBLE_from_json.py msgid "wild herbs" msgid_plural "wild herbs" @@ -33522,6 +33663,21 @@ msgid "" "create an item through a nanofabricator." msgstr "一套最先进的光学存储系统。这一小块透明玻璃板上,刻着一个微缩图案,集成了纳米制造机制造物品时所需要的指令。" +#: lang/json/GENERIC_from_json.py +msgid "nanofabricator template (silicon photonics)" +msgid_plural "nanofabricator template (silicon photonics)s" +msgstr[0] "纳米制造模板(硅光子电路)" + +#. ~ Description for nanofabricator template (silicon photonics) +#: lang/json/GENERIC_from_json.py +msgid "" +"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." +msgstr "" +"这是一个先进光学存储系统,包含了制造复杂硅光子电路所必须的指令。里面的数据显然曾经价值千万,但是事到如今,你不知道它除了拿来当个花哨的高科技镇纸之外还能用来做什么。" + #: lang/json/GENERIC_from_json.py msgid "antenna" msgid_plural "antennas" @@ -36582,12 +36738,12 @@ msgstr "一本完整的拳击指南。让我们准备好暴揍一些地痞吧! #: lang/json/GENERIC_from_json.py msgid "Capoeira 100" msgid_plural "Capoeira 100" -msgstr[0] "卡波耶拉入门" +msgstr[0] "巴西战舞入门" #. ~ Description for Capoeira 100 #: lang/json/GENERIC_from_json.py msgid "A complete guide to Capoeira." -msgstr "一本完整的卡波耶拉(又称:巴西战舞)指南。" +msgstr "一本完整的巴西战舞指南。" #: lang/json/GENERIC_from_json.py msgid "The Centipede Lu Feng" @@ -37764,8 +37920,8 @@ msgstr[0] ".300 BLK 弹壳" #. ~ Description for .300BLK casing #: lang/json/GENERIC_from_json.py -msgid "An empty casing from a .300BLK round." -msgstr ".300 BLK 弹的空弹壳" +msgid "An empty casing from a .300 AAC Blackout round." +msgstr ".300 BLK 子弹的空弹壳。" #: lang/json/GENERIC_from_json.py msgid "Merch" @@ -39276,7 +39432,36 @@ msgid "" "A fake shillelagh massproduced as a souvenir for tourists. This knotty " "stick has not been cured in a chimney like a traditional shillelagh but has " "had fake black soot painted on." -msgstr "一根仿制的爱尔兰木槌,只是大产量的纪念品。这根木槌没有像传统爱尔兰木槌一样在烟囱内熏制过,而是在上面涂上了假烟灰。" +msgstr "一根仿制的爱尔兰木槌,只是量产的纪念品。这根木槌没有像传统爱尔兰木槌一样在烟囱内熏制过,而是在上面涂上了假烟灰。" + +#: lang/json/GENERIC_from_json.py +msgid "blackjack" +msgid_plural "blackjacks" +msgstr[0] "皮革短槌" + +#. ~ Description for blackjack +#: lang/json/GENERIC_from_json.py +msgid "" +"This is a short, easily concealed bludgeoning weapon consisting of a weight " +"embedded at the end of a short leather shaft. Formerly used by law " +"enforcement, this weapon is meant to stun or knock out the subject, although" +" head strikes have a high risk of causing a permanent, disabling brain " +"injury or being fatal." +msgstr "" +"这是一个便于藏匿的短槌,由皮革制成的手柄加上顶端的配重制成。以前被执法部门使用,主要用于眩晕或击晕目标,但是对头部的攻击仍然有很高的概率造成永久性致残的脑损伤,甚至致命。" + +#: lang/json/GENERIC_from_json.py +msgid "makeshift sap" +msgid_plural "makeshift saps" +msgstr[0] "简易皮革短槌" + +#. ~ Description for makeshift sap +#: lang/json/GENERIC_from_json.py +msgid "" +"This is an improvised sap, also known as a cosh, slapjack and slapper. A " +"short and flat bludgeoning weapon consisting of a weight embedded between " +"two patches of leather." +msgstr "这是一个简易皮革短槌,由两片皮革之间夹上配重制成的扁平钝击武器。" #: lang/json/GENERIC_from_json.py msgid "pointy stick" @@ -39722,6 +39907,28 @@ msgid "" "is marginally shorter than the foil and epee, but no less effective." msgstr "击剑运动用的武器,很高级。这把有开锋的佩剑可能比重剑和花剑要短,但是也有一定的威力。" +#: lang/json/GENERIC_from_json.py +msgid "hollow cane" +msgid_plural "hollow canes" +msgstr[0] "空心手杖" + +#. ~ Description for hollow cane +#: lang/json/GENERIC_from_json.py +msgid "" +"A cane designed to conceal blade. This was a popular fashion accessory for " +"the wealthy during the 18th and 19th centuries." +msgstr "藏了一把剑的手杖。这在18至19世纪的欧洲是富人之间流行的时尚装备。" + +#: lang/json/GENERIC_from_json.py +msgid "sword cane" +msgid_plural "sword canes" +msgstr[0] "手杖剑" + +#. ~ Description for sword cane +#: lang/json/GENERIC_from_json.py +msgid "A sword with a thin blade designed to be hidden inside an hollow cane." +msgstr "薄刃的短剑,用来藏在空心手杖里面。" + #: lang/json/GENERIC_from_json.py lang/json/TOOL_from_json.py #: lang/json/TOOL_from_json.py msgid "cutlass" @@ -43163,38 +43370,38 @@ msgstr "一个石制手套,上面围绕手的四周刻着符文,保护手的 #: lang/json/GENERIC_from_json.py msgid "Kelvinist flamberge" msgid_plural "Kelvinist flamberges" -msgstr[0] "" +msgstr[0] "炽霜法师焰形剑" #. ~ Description for Kelvinist flamberge #: lang/json/GENERIC_from_json.py msgid "" "A sword with an undulating blade, reminiscent of a flame. There is a " "Kelvinist rune embedded in the pommel." -msgstr "" +msgstr "带有形似火焰的起伏刀刃的剑。剑柄头上镶嵌着一个炽霜法师符文。" #: lang/json/GENERIC_from_json.py msgid "Stormshaper axe" msgid_plural "Stormshaper axes" -msgstr[0] "" +msgstr[0] "风暴塑造者之斧" #. ~ Description for Stormshaper axe #: lang/json/GENERIC_from_json.py msgid "" "A forged copper axe with silver trimmings and a wooden handle. There is a " "Stormshaper rune embedded in the eye." -msgstr "" +msgstr "一把镶银边的铸造铜斧,装在一根木柄上面。斧柄洞里镶嵌着一个风暴塑造者符文。" #: lang/json/GENERIC_from_json.py msgid "Animist athame" msgid_plural "Animist athames" -msgstr[0] "" +msgstr[0] "灵论者献祭短刀" #. ~ Description for Animist athame #: lang/json/GENERIC_from_json.py msgid "" "A steel ritual knife used by Animists to draw blood for summoning. Their " "school rune is embedded in the crossguard." -msgstr "" +msgstr "一把仪式用钢刀,灵论者用它来放血进行召唤。剑格上面镶嵌着一个灵论者符文。" #: lang/json/GENERIC_from_json.py msgid "The Stormhammer" @@ -43245,12 +43452,12 @@ msgstr "这是一柄邪恶的长矛,完全是由骨头组成的。" #: lang/json/GENERIC_from_json.py msgid "Spell Scroll" msgid_plural "Spell Scrolls" -msgstr[0] "" +msgstr[0] "法术卷轴" #: lang/json/GENERIC_from_json.py msgid "Scroll of Smite" msgid_plural "Scroll of Smites" -msgstr[0] "" +msgstr[0] "毁灭打击卷轴" #. ~ Description for Scroll of Smite #. ~ Description for Smite @@ -43263,7 +43470,7 @@ msgstr "邪恶已经蔓延到世界各地。让你的力量成为在黑暗中闪 #: lang/json/GENERIC_from_json.py msgid "Scroll of Life Conversion" msgid_plural "Scroll of Life Conversions" -msgstr[0] "" +msgstr[0] "生命转换卷轴" #. ~ Description for Scroll of Life Conversion #. ~ Description for Life Conversion @@ -43276,7 +43483,7 @@ msgstr "将你的生命力量导入你的精神能量。消耗生命恢复法力 #: lang/json/GENERIC_from_json.py msgid "Scroll of Mind Over Pain" msgid_plural "Scroll of Mind Over Pains" -msgstr[0] "" +msgstr[0] "战胜疼痛卷轴" #. ~ Description for Scroll of Mind Over Pain #. ~ Description for Mind over Pain @@ -43289,7 +43496,7 @@ msgstr "这是一种类似于体能训练的激烈仪式,可以帮助你将一 #: lang/json/GENERIC_from_json.py msgid "Scroll of Summon Zombie" msgid_plural "Scroll of Summon Zombies" -msgstr[0] "" +msgstr[0] "召唤丧尸卷轴" #. ~ Description for Scroll of Summon Zombie #. ~ Description for Summon Zombie @@ -43302,7 +43509,7 @@ msgstr "从地底深处冒出来的丧尸会为你而战。你的法术等级越 #: lang/json/GENERIC_from_json.py msgid "Scroll of Summon Skeleton" msgid_plural "Scroll of Summon Skeletons" -msgstr[0] "" +msgstr[0] "召唤骷髅卷轴" #. ~ Description for Scroll of Summon Skeleton #. ~ Description for Summon Skeleton @@ -43315,7 +43522,7 @@ msgstr "一只幽灵似的骷髅,从大地深处被召唤出来为你战斗。 #: lang/json/GENERIC_from_json.py msgid "Scroll of Summon Decayed Pouncer" msgid_plural "Scroll of Summon Decayed Pouncers" -msgstr[0] "" +msgstr[0] "召唤腐烂突袭兽卷轴" #. ~ Description for Scroll of Summon Decayed Pouncer #. ~ Description for Summon Decayed Pouncer @@ -43328,7 +43535,7 @@ msgstr "一只看起来饱经风霜的巨猫,从大地深处被召唤出来为 #: lang/json/GENERIC_from_json.py msgid "Scroll of Cure Light Wounds" msgid_plural "Scroll of Cure Light Woundss" -msgstr[0] "" +msgstr[0] "治疗轻伤卷轴" #. ~ Description for Scroll of Cure Light Wounds #. ~ Description for Cure Light Wounds @@ -43339,7 +43546,7 @@ msgstr "治疗目标的一点点伤害。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Pain Split" msgid_plural "Scroll of Pain Splits" -msgstr[0] "" +msgstr[0] "伤痛分流卷轴" #. ~ Description for Scroll of Pain Split #. ~ Description for Pain Split @@ -43350,7 +43557,7 @@ msgstr "平摊各个肢体受到的伤害。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Vicious Tentacle" msgid_plural "Scroll of Vicious Tentacles" -msgstr[0] "" +msgstr[0] "残暴之鞭卷轴" #. ~ Description for Scroll of Vicious Tentacle #. ~ Description for Vicious Tentacle @@ -43358,12 +43565,12 @@ msgstr[0] "" msgid "" "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." -msgstr "这个法术会从你的身体中伸出一个由锋利的骨头和渗出酸液组成的长而凶猛的鞭子状触须,它有很长的攻击距离和很高的伤害。" +msgstr "这个法术会从你的身体中伸出一个由锋利的骨头和渗出酸液组成的长而凶猛的鞭状触须,它有很长的攻击距离和很高的伤害。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Grotesque Enhancement" msgid_plural "Scroll of Grotesque Enhancements" -msgstr[0] "" +msgstr[0] "扭曲强化卷轴" #. ~ Description for Scroll of Grotesque Enhancement #. ~ Description for Grotesque Enhancement @@ -43376,7 +43583,7 @@ msgstr "以怪异的方式扭曲你的身体并增强你的力量及感知。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Acidic Spray" msgid_plural "Scroll of Acidic Sprays" -msgstr[0] "" +msgstr[0] "酸性喷雾卷轴" #. ~ Description for Scroll of Acidic Spray #. ~ Description for Acidic Spray @@ -43389,7 +43596,7 @@ msgstr "当施法时,法师张开他的嘴,想周围的椭圆形范围内喷 #: lang/json/GENERIC_from_json.py msgid "Scroll of Flesh Pouch" msgid_plural "Scroll of Flesh Pouchs" -msgstr[0] "" +msgstr[0] "肉袋卷轴" #. ~ Description for Scroll of Flesh Pouch #. ~ Description for Flesh Pouch @@ -43402,7 +43609,7 @@ msgstr "这个咒语会在你的背部皮肤上产生一个临时的小袋子, #: lang/json/GENERIC_from_json.py msgid "Scroll of Conjure Bonespear" msgid_plural "Scroll of Conjure Bonespears" -msgstr[0] "" +msgstr[0] "召唤骨矛卷轴" #. ~ Description for Scroll of Conjure Bonespear #. ~ Description for Conjure Bonespear @@ -43415,7 +43622,7 @@ msgstr "这个咒语可以召唤出一只邪恶的骨矛,拥有长长的手柄 #: lang/json/GENERIC_from_json.py msgid "Scroll of Megablast" msgid_plural "Scroll of Megablasts" -msgstr[0] "" +msgstr[0] "炽能冲击波卷轴" #. ~ Description for Scroll of Megablast #. ~ Description for Megablast @@ -43428,7 +43635,7 @@ msgstr "你经常想发射光波,就像小时候看过的动画片里那样, #: lang/json/GENERIC_from_json.py msgid "Scroll of Magical Light" msgid_plural "Scroll of Magical Lights" -msgstr[0] "" +msgstr[0] "魔灯卷轴" #. ~ Description for Scroll of Magical Light #. ~ Description for Magical Light @@ -43439,7 +43646,7 @@ msgstr "创造一个魔法光源。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Blinding Flash" msgid_plural "Scroll of Blinding Flashs" -msgstr[0] "" +msgstr[0] "致盲闪光卷轴" #. ~ Description for Scroll of Blinding Flash #. ~ Description for Blinding Flash @@ -43452,7 +43659,7 @@ msgstr "爆发耀眼的光芒以致盲敌人,等级越高伤害越高。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Ethereal Grasp" msgid_plural "Scroll of Ethereal Grasps" -msgstr[0] "" +msgstr[0] "幽影攫抓卷轴" #. ~ Description for Scroll of Ethereal Grasp #. ~ Description for Ethereal Grasp @@ -43465,7 +43672,7 @@ msgstr "从地面伸出无数幽影手,减慢范围内的一切。等级越高 #: lang/json/GENERIC_from_json.py msgid "Scroll of Aura of Protection" msgid_plural "Scroll of Aura of Protections" -msgstr[0] "" +msgstr[0] "保护光环卷轴" #. ~ Description for Scroll of Aura of Protection #. ~ Description for Aura of Protection @@ -43478,7 +43685,7 @@ msgstr "把你的整个身体包裹在一个神奇的光环里,保护你免受 #: lang/json/GENERIC_from_json.py msgid "Scroll of Vegetative Grasp" msgid_plural "Scroll of Vegetative Grasps" -msgstr[0] "" +msgstr[0] "藤蔓缠绕卷轴" #. ~ Description for Scroll of Vegetative Grasp #. ~ Description for Vegetative Grasp @@ -43491,7 +43698,7 @@ msgstr "这个咒语会从地下长出藤蔓及树根,紧紧的抓住你的敌 #: lang/json/GENERIC_from_json.py msgid "Scroll of Root Strike" msgid_plural "Scroll of Root Strikes" -msgstr[0] "" +msgstr[0] "树根穿刺卷轴" #. ~ Description for Scroll of Root Strike #. ~ Description for Root Strike @@ -43504,7 +43711,7 @@ msgstr "这个咒语使树根刺穿地面,以弧形刺入你的敌人,刺穿 #: lang/json/GENERIC_from_json.py msgid "Scroll of Wooden Shaft" msgid_plural "Scroll of Wooden Shafts" -msgstr[0] "" +msgstr[0] "硬木投掷卷轴" #. ~ Description for Scroll of Wooden Shaft #. ~ Description for Wooden Shaft @@ -43517,7 +43724,7 @@ msgstr "这个咒语会能创造一个硬木投射物,从施法者的手中高 #: lang/json/GENERIC_from_json.py msgid "Scroll of Nature's Bow" msgid_plural "Scroll of Nature's Bows" -msgstr[0] "" +msgstr[0] "乌尔斯之弓卷轴" #. ~ Description for Scroll of Nature's Bow #. ~ Description for Nature's Bow @@ -43530,7 +43737,7 @@ msgstr "这个咒语可以召唤出一个神奇的木弓,它可以发射无尽 #: lang/json/GENERIC_from_json.py msgid "Scroll of Nature's Trance" msgid_plural "Scroll of Nature's Trances" -msgstr[0] "" +msgstr[0] "自然冥想卷轴" #. ~ Description for Scroll of Nature's Trance #. ~ Description for Nature's Trance @@ -43543,7 +43750,7 @@ msgstr "你与其它生命的连接允许你进入一种魔法冥想状态。在 #: lang/json/GENERIC_from_json.py msgid "Scroll of Bag of Cats" msgid_plural "Scroll of Bag of Catss" -msgstr[0] "" +msgstr[0] "袋装猫咪卷轴" #. ~ Description for Scroll of Bag of Cats #. ~ Description for Bag of Cats @@ -43554,7 +43761,7 @@ msgstr "你就是那个和猫讲话的怪婆婆吗?" #: lang/json/GENERIC_from_json.py msgid "Scroll of Stonefist" msgid_plural "Scroll of Stonefists" -msgstr[0] "" +msgstr[0] "大地之拳卷轴" #. ~ Description for Scroll of Stonefist #. ~ Description for Stonefist @@ -43567,7 +43774,7 @@ msgstr "召唤岩石包裹手臂和拳头,使你可以在近战战斗中用它 #: lang/json/GENERIC_from_json.py msgid "Scroll of Seismic Stomp" msgid_plural "Scroll of Seismic Stomps" -msgstr[0] "" +msgstr[0] "战争践踏卷轴" #. ~ Description for Scroll of Seismic Stomp #. ~ Description for Seismic Stomp @@ -43580,7 +43787,7 @@ msgstr "聚集魔力进入你的腿,重重跺脚,发出冲击波,把周围 #: lang/json/GENERIC_from_json.py msgid "Scroll of Stone's Endurance" msgid_plural "Scroll of Stone's Endurances" -msgstr[0] "" +msgstr[0] "坚如磐石卷轴" #. ~ Description for Scroll of Stone's Endurance #. ~ Description for Stone's Endurance @@ -43593,7 +43800,7 @@ msgstr "你专注于你下方的坚岩,从它们的经受时间考验的坚韧 #: lang/json/GENERIC_from_json.py msgid "Scroll of Shardspray" msgid_plural "Scroll of Shardsprays" -msgstr[0] "" +msgstr[0] "碎片散射卷轴" #. ~ Description for Scroll of Shardspray #. ~ Description for Shardspray @@ -43606,7 +43813,7 @@ msgstr "这法术散射出大量锋利的金属碎片,敌友不分的切碎它 #: lang/json/GENERIC_from_json.py msgid "Scroll of Piercing Bolt" msgid_plural "Scroll of Piercing Bolts" -msgstr[0] "" +msgstr[0] "穿刺箭卷轴" #. ~ Description for Scroll of Piercing Bolt #. ~ Description for Piercing Bolt @@ -43619,7 +43826,7 @@ msgstr "这法术具现并发射出一根能穿透敌人的铁条,射穿那些 #: lang/json/GENERIC_from_json.py msgid "Scroll of Shardstorm" msgid_plural "Scroll of Shardstorms" -msgstr[0] "" +msgstr[0] "碎片风暴卷轴" #. ~ Description for Scroll of Shardstorm #. ~ Description for Shardstorm @@ -43631,7 +43838,7 @@ msgstr "向你四周的所有方向喷射剃刀般锋利的金属碎片" #: lang/json/GENERIC_from_json.py msgid "Scroll of Rockbolt" msgid_plural "Scroll of Rockbolts" -msgstr[0] "" +msgstr[0] "石之箭卷轴" #. ~ Description for Scroll of Rockbolt #. ~ Description for Rockbolt @@ -43642,7 +43849,7 @@ msgstr "具现并发射出一个高速飞行的石质投射物" #: lang/json/GENERIC_from_json.py msgid "Scroll of Point Flare" msgid_plural "Scroll of Point Flares" -msgstr[0] "" +msgstr[0] "定点炎爆卷轴" #. ~ Description for Scroll of Point Flare #. ~ Description for Point Flare @@ -43653,7 +43860,7 @@ msgstr "在指定地点制造强烈热能,以伤害目标。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Finger Firelighter" msgid_plural "Scroll of Finger Firelighters" -msgstr[0] "" +msgstr[0] "火焰之指卷轴" #. ~ Description for Scroll of Finger Firelighter #. ~ Description for Finger Firelighter @@ -43667,7 +43874,7 @@ msgstr "召唤出一朵不会烧到你的小火苗,可以用来点燃其它物 #: lang/json/GENERIC_from_json.py msgid "Scroll of Ice Spike" msgid_plural "Scroll of Ice Spikes" -msgstr[0] "" +msgstr[0] "冰刺卷轴" #. ~ Description for Scroll of Ice Spike #. ~ Description for Ice Spike @@ -43680,7 +43887,7 @@ msgstr "在目标上方制造冰刺,坠落造成伤害。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Fireball" msgid_plural "Scroll of Fireballs" -msgstr[0] "" +msgstr[0] "火球卷轴" #. ~ Description for Scroll of Fireball #. ~ Description for Fireball @@ -43693,7 +43900,7 @@ msgstr "投掷一颗豌豆大小的炽热球体,到达目标或遇到障碍物 #: lang/json/GENERIC_from_json.py msgid "Scroll of Cone of Cold" msgid_plural "Scroll of Cone of Colds" -msgstr[0] "" +msgstr[0] "极寒喷射卷轴" #. ~ Description for Scroll of Cone of Cold #. ~ Description for Cone of Cold @@ -43704,7 +43911,7 @@ msgstr "向目标发射一股锥形的极寒空气。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Burning Hands" msgid_plural "Scroll of Burning Handss" -msgstr[0] "" +msgstr[0] "燃烧之手卷轴" #. ~ Description for Scroll of Burning Hands #. ~ Description for Burning Hands @@ -43717,7 +43924,7 @@ msgstr "向一片较小的锥形区域喷射火焰。\"你肯定在其他游戏 #: lang/json/GENERIC_from_json.py msgid "Scroll of Frost Spray" msgid_plural "Scroll of Frost Sprays" -msgstr[0] "" +msgstr[0] "寒霜喷射卷轴" #. ~ Description for Scroll of Frost Spray #. ~ Description for Frost Spray @@ -43730,7 +43937,7 @@ msgstr "向一片较小的锥形区域喷射冰寒。\"你肯定在其他游戏 #: lang/json/GENERIC_from_json.py msgid "Scroll of Chilling Touch" msgid_plural "Scroll of Chilling Touchs" -msgstr[0] "" +msgstr[0] "寒冷之触卷轴" #. ~ Description for Scroll of Chilling Touch #. ~ Description for Chilling Touch @@ -43741,7 +43948,7 @@ msgstr "用严寒冻住被碰过的目标。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Glide on Ice" msgid_plural "Scroll of Glide on Ices" -msgstr[0] "" +msgstr[0] "冰上滑行卷轴" #. ~ Description for Scroll of Glide on Ice #. ~ Description for Glide on Ice @@ -43754,7 +43961,7 @@ msgstr "将你的脚包裹在一层神奇的冰层中,让你更快地沿着光 #: lang/json/GENERIC_from_json.py msgid "Scroll of Hoary Blast" msgid_plural "Scroll of Hoary Blasts" -msgstr[0] "" +msgstr[0] "灰霜爆发卷轴" #. ~ Description for Scroll of Hoary Blast #. ~ Description for Hoary Blast @@ -43767,7 +43974,7 @@ msgstr "投射一颗狂躁的白色冰晶,在撞击之处绽放酷寒。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Ice Shield" msgid_plural "Scroll of Ice Shields" -msgstr[0] "" +msgstr[0] "冰盾卷轴" #. ~ Description for Scroll of Ice Shield #. ~ Description for Ice Shield @@ -43780,7 +43987,7 @@ msgstr "在你的手臂上制造一个神奇的冰盾,你可以用它在近战 #: lang/json/GENERIC_from_json.py msgid "Scroll of Frost Armor" msgid_plural "Scroll of Frost Armors" -msgstr[0] "" +msgstr[0] "霜甲卷轴" #. ~ Description for Scroll of Frost Armor #. ~ Description for Frost Armor @@ -43793,7 +44000,7 @@ msgstr "用薄薄的一层神奇的冰来保护你不受伤害。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Magic Missile" msgid_plural "Scroll of Magic Missiles" -msgstr[0] "" +msgstr[0] "魔法飞弹卷轴" #. ~ Description for Scroll of Magic Missile #. ~ Description for Magic Missile @@ -43804,7 +44011,7 @@ msgstr "我在黑暗中投掷魔法飞弹!" #: lang/json/GENERIC_from_json.py msgid "Scroll of Phase Door" msgid_plural "Scroll of Phase Doors" -msgstr[0] "" +msgstr[0] "相位门卷轴" #. ~ Description for Scroll of Phase Door #. ~ Description for Phase Door @@ -43815,7 +44022,7 @@ msgstr "把你向一个随机的方向传送一小段短距离。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Gravity Well" msgid_plural "Scroll of Gravity Wells" -msgstr[0] "" +msgstr[0] "重力井卷轴" #. ~ Description for Scroll of Gravity Well #. ~ Description for Gravity Well @@ -43828,7 +44035,7 @@ msgstr "在指定地点召唤一口重力井。对受影响地区的所有生物 #: lang/json/GENERIC_from_json.py msgid "Scroll of Mana Blast" msgid_plural "Scroll of Mana Blasts" -msgstr[0] "" +msgstr[0] "奥术冲击卷轴" #. ~ Description for Scroll of Mana Blast #. ~ Description for Mana Blast @@ -43841,7 +44048,7 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "Scroll of Mana Bolt" msgid_plural "Scroll of Mana Bolts" -msgstr[0] "" +msgstr[0] "奥术闪电卷轴" #. ~ Description for Scroll of Mana Bolt #. ~ Description for Mana Bolt @@ -43852,7 +44059,7 @@ msgstr "一束破坏性的魔力,只会伤到你的敌人" #: lang/json/GENERIC_from_json.py msgid "Scroll of Haste" msgid_plural "Scroll of Hastes" -msgstr[0] "" +msgstr[0] "急速卷轴" #. ~ Description for Scroll of Haste #. ~ Description for Haste @@ -43865,7 +44072,7 @@ msgstr "这法术在短时间内大幅度增加你的速度" #: lang/json/GENERIC_from_json.py msgid "Scroll of Mana Beam" msgid_plural "Scroll of Mana Beams" -msgstr[0] "" +msgstr[0] "奥术光束卷轴" #. ~ Description for Scroll of Mana Beam #. ~ Description for Mana Beam @@ -43876,7 +44083,7 @@ msgstr "一束聚焦过的破坏性法力,会伤害到它路径上的所有敌 #: lang/json/GENERIC_from_json.py msgid "Scroll of Escape" msgid_plural "Scroll of Escapes" -msgstr[0] "" +msgstr[0] "逃脱术卷轴" #. ~ Description for Scroll of Escape #. ~ Description for Escape @@ -43889,7 +44096,7 @@ msgstr "将你向随机方向传送一段中等的距离,可以在危险情况 #: lang/json/GENERIC_from_json.py msgid "Scroll of Cat's Grace" msgid_plural "Scroll of Cat's Graces" -msgstr[0] "" +msgstr[0] "猫之优雅卷轴" #. ~ Description for Scroll of Cat's Grace #. ~ Description for Cat's Grace @@ -43900,7 +44107,7 @@ msgstr "你会变得更优雅、更敏捷、更协调。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Eagle's Sight" msgid_plural "Scroll of Eagle's Sights" -msgstr[0] "" +msgstr[0] "鹰眼卷轴" #. ~ Description for Scroll of Eagle's Sight #. ~ Description for Eagle's Sight @@ -43911,7 +44118,7 @@ msgstr "你获得鹰的感知。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Ogre's Strength" msgid_plural "Scroll of Ogre's Strengths" -msgstr[0] "" +msgstr[0] "巨魔之力卷轴" #. ~ Description for Scroll of Ogre's Strength #. ~ Description for Ogre's Strength @@ -43922,7 +44129,7 @@ msgstr "你获得了巨魔的力量。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Fox's Cunning" msgid_plural "Scroll of Fox's Cunnings" -msgstr[0] "" +msgstr[0] "狐之狡黠卷轴" #. ~ Description for Scroll of Fox's Cunning #. ~ Description for Fox's Cunning @@ -43933,7 +44140,7 @@ msgstr "你变得像狐狸一样狡猾。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Jolt" msgid_plural "Scroll of Jolts" -msgstr[0] "" +msgstr[0] "震颤电流卷轴" #. ~ Description for Scroll of Jolt #. ~ Description for Jolt @@ -43944,7 +44151,7 @@ msgstr "从你的指尖发射出几道短距离电流" #: lang/json/GENERIC_from_json.py msgid "Scroll of Lightning Bolt" msgid_plural "Scroll of Lightning Bolts" -msgstr[0] "" +msgstr[0] "闪电雷击卷轴" #. ~ Description for Scroll of Lightning Bolt #. ~ Description for Lightning Bolt @@ -43955,12 +44162,12 @@ msgid "" "is more directed than most lightning, and travels in a line through most " "non-solid targets." msgstr "" -"对于许多风暴制造者来说,这个标志性的咒语正如你所期待的那样:你可以从指尖射出闪电。然而,这种闪电比大多数闪电更有方向性,并以直线穿过大多数非固体目标。" +"对于许多风暴塑造者来说,这个标志性的咒语正如你所期待的那样:你可以从指尖射出闪电。然而,这种闪电比大多数闪电更有方向性,并以直线穿过大多数非固体目标。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Windstrike" msgid_plural "Scroll of Windstrikes" -msgstr[0] "" +msgstr[0] "怒风击卷轴" #. ~ Description for Scroll of Windstrike #. ~ Description for Windstrike @@ -43973,7 +44180,7 @@ msgstr "伸出手掌,喷射强风,冲击面前的一切。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Windrunning" msgid_plural "Scroll of Windrunnings" -msgstr[0] "" +msgstr[0] "风行者卷轴" #. ~ Description for Scroll of Windrunning #. ~ Description for Windrunning @@ -43986,7 +44193,7 @@ msgstr "当你移动的时候,一股神奇的风推动着你前进,让你自 #: lang/json/GENERIC_from_json.py msgid "Scroll of Call Stormhammer" msgid_plural "Scroll of Call Stormhammers" -msgstr[0] "" +msgstr[0] "召唤风暴之锤卷轴" #. ~ Description for Scroll of Call Stormhammer #. ~ Description for Call Stormhammer @@ -43999,7 +44206,7 @@ msgstr "一个充满闪电的魔幻战锤,用闪电击打你的敌人。当然 #: lang/json/GENERIC_from_json.py msgid "Scroll of Bless" msgid_plural "Scroll of Blesss" -msgstr[0] "" +msgstr[0] "祝福卷轴" #. ~ Description for Scroll of Bless #. ~ Description for Bless @@ -44010,7 +44217,7 @@ msgstr "给予你能量和提升你能力的祝福。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Holy Blade" msgid_plural "Scroll of Holy Blades" -msgstr[0] "" +msgstr[0] "光明之刃卷轴" #. ~ Description for Scroll of Holy Blade #. ~ Description for Holy Blade @@ -44021,7 +44228,7 @@ msgstr "这把光之刃将切断它与之接触的任何邪恶!" #: lang/json/GENERIC_from_json.py msgid "Scroll of Spiritual Armor" msgid_plural "Scroll of Spiritual Armors" -msgstr[0] "" +msgstr[0] "心灵装甲卷轴" #. ~ Description for Scroll of Spiritual Armor #. ~ Description for Spiritual Armor @@ -44033,7 +44240,7 @@ msgstr "如果你的信念足够强大,邪恶就无法通过你的防御!" #: lang/json/GENERIC_from_json.py msgid "Scroll of Lamp" msgid_plural "Scroll of Lamps" -msgstr[0] "" +msgstr[0] "魔法灯卷轴" #. ~ Description for Scroll of Lamp #. ~ Description for Lamp @@ -44044,7 +44251,7 @@ msgstr "创造一盏神奇的灯。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Manatricity" msgid_plural "Scroll of Manatricitys" -msgstr[0] "" +msgstr[0] "魔法电流卷轴" #. ~ Description for Scroll of Manatricity #. ~ Description for Manatricity @@ -44057,7 +44264,7 @@ msgstr "你发现了一种将你的魔力转换成CBM能量的方法" #: lang/json/GENERIC_from_json.py msgid "Scroll of Taze" msgid_plural "Scroll of Tazes" -msgstr[0] "" +msgstr[0] "电击卷轴" #. ~ Description for Scroll of Taze #. ~ Description for Taze @@ -44070,7 +44277,7 @@ msgstr "这个法术产生一个非常短的闪电来电击你的敌人。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Lesser Quantum Tunnel" msgid_plural "Scroll of Lesser Quantum Tunnels" -msgstr[0] "" +msgstr[0] "小型量子隧道卷轴" #. ~ Description for Scroll of Lesser Quantum Tunnel #. ~ Description for Lesser Quantum Tunnel @@ -44086,7 +44293,7 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "Scroll of Laze" msgid_plural "Scroll of Lazes" -msgstr[0] "" +msgstr[0] "激光卷轴" #. ~ Description for Scroll of Laze #. ~ Description for Synaptic Stimulation @@ -44109,7 +44316,7 @@ msgstr "你集中并释放一束聚焦的光子到一个目标上,这个也可 #: lang/json/GENERIC_from_json.py msgid "Scroll of Animated Blade" msgid_plural "Scroll of Animated Blades" -msgstr[0] "" +msgstr[0] "召唤飞行刀刃卷轴" #. ~ Description for Scroll of Animated Blade #. ~ Description for Animated Blade @@ -44122,7 +44329,7 @@ msgstr "这个法术召唤会飞的有生命的刀刃,可以把你的敌人砍 #: lang/json/GENERIC_from_json.py msgid "Scroll of Mirror Image" msgid_plural "Scroll of Mirror Images" -msgstr[0] "" +msgstr[0] "召唤镜像卷轴" #. ~ Description for Scroll of Mirror Image #. ~ Description for Mirror Image @@ -44135,7 +44342,7 @@ msgstr "这个法术把光操纵成一个几乎不可触摸的生物的复制品 #: lang/json/GENERIC_from_json.py msgid "Scroll of Lightning Blast" msgid_plural "Scroll of Lightning Blasts" -msgstr[0] "" +msgstr[0] "闪电冲击卷轴" #. ~ Description for Scroll of Lightning Blast #. ~ Description for Lightning Blast @@ -44149,7 +44356,7 @@ msgstr "你向目标发射一个小闪电球。电流扩散很快,所以不会 #: lang/json/GENERIC_from_json.py msgid "Scroll of Necrotic Gaze" msgid_plural "Scroll of Necrotic Gazes" -msgstr[0] "" +msgstr[0] "腐败凝视卷轴" #. ~ Description for Scroll of Necrotic Gaze #. ~ Description for Necrotic Gaze @@ -44157,19 +44364,19 @@ msgstr[0] "" msgid "" "You use the power of your own blood to imbue necrotic energy into your gaze," " damaging the target you look at." -msgstr "" +msgstr "你使用自身血液的力量将腐败能量注入到你的凝视之中,对你注视的目标照成伤害。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Purification Seed" msgid_plural "Scroll of Purification Seeds" -msgstr[0] "" +msgstr[0] "净化之种卷轴" #. ~ Description for Scroll of Purification Seed #: lang/json/GENERIC_from_json.py msgid "" "You summon a gift of the earth which will purify water. Greater levels yield" " greater numbers of seeds." -msgstr "" +msgstr "你召唤大地的馈赠用于净化污水。等级越高,获得的种子数量就越多。" #: lang/json/GENERIC_from_json.py msgid "A Technomancer's Guide to Debugging C:DDA" @@ -44287,7 +44494,7 @@ msgid "" "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." -msgstr "这幅卷轴详细描述了一个被称为“闪电雷暴”的法术是如何被改变成更强大的魔法的,这也将会消耗更多的魔法。" +msgstr "这幅卷轴详细描述了一个被称为“闪电雷暴”的风暴塑造者法术是如何被改变成更强大的魔法的,这也将会消耗更多的魔法。" #: lang/json/GENERIC_from_json.py msgid "Nondescript Spellbook" @@ -46063,7 +46270,7 @@ msgstr "这种电池使用一根钚-244棒来稳定一种奇特的纳米复合 #: lang/json/MAGAZINE_from_json.py msgid "military plutonium fuel cell" -msgstr "" +msgstr "军用钚燃料电池" #. ~ Description for military plutonium fuel cell #: lang/json/MAGAZINE_from_json.py @@ -46073,6 +46280,7 @@ msgid "" "and had no civilian applications. Although it stores a stupendous amount of" " power, it cannot be recharged." msgstr "" +"这种电池使用一根巨大的钚-244棒来稳定一种奇特的纳米复合材料。用于军用外骨骼装甲,高度实验性,未进入民用领域。虽然它储存了大量的能量,但它不能再充电。" #: lang/json/MAGAZINE_from_json.py msgid "heavy disposable battery" @@ -46254,6 +46462,15 @@ msgstr "詹宁斯J-22手枪弹匣" msgid "A cheap 6-round steel box magazine for the Jennings J-22." msgstr "一个廉价的6发钢制盒式弹匣,可用于詹宁斯J-22手枪。" +#: lang/json/MAGAZINE_from_json.py +msgid "Walther P22 magazine" +msgstr "瓦尔特 P22 手枪弹匣" + +#. ~ Description for Walther P22 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round box magazine for the Walther P22." +msgstr "一个 10 发盒式弹匣,可用于瓦尔特 P22 手枪。" + #: lang/json/MAGAZINE_from_json.py msgid "LW-5 speedloader" msgstr "快速装弹器(LW-5)" @@ -46660,6 +46877,20 @@ msgstr "MAC-11 冲锋枪弹匣" msgid "A cheap 32-round steel box magazine for use with the MAC-11 SMG." msgstr "一个标准的32发钢制盒式弹匣,可用于MAC-11冲锋枪。" +#: lang/json/MAGAZINE_from_json.py +msgid "CF-380 magazine" +msgstr "CF-380 手枪弹匣" + +#. ~ Description for CF-380 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Hi-Point CF-380." +msgstr "一个 8 发钢制盒式弹匣,可用于 Hi-Point CF-380 手枪。" + +#. ~ Description for CF-380 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point CF-380." +msgstr "一个 10 发钢制盒式弹匣,可用于 Hi-Point CF-380 手枪。" + #: lang/json/MAGAZINE_from_json.py msgid "M1911 .38 Super magazine" msgstr "M1911 .38超级弹匣" @@ -46723,6 +46954,43 @@ msgid "" "expect much reliability." msgstr "一个自制的20轮单柱钢弹匣,适合Glock 22手枪,但也适合一些自制的弹匣式枪械。不要期望太多的可靠性。" +#: lang/json/MAGAZINE_from_json.py +msgid "Hi-Power magazine .40 S&W" +msgstr "勃朗宁大威力 .40 S&W 手枪弹匣" + +#. ~ Description for Hi-Power magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Browning Hi-Power .40 S&W." +msgstr "一个 10 发钢制盒式弹匣,可用于勃朗宁大威力 .40 S&W 手枪。" + +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine .40 S&W" +msgstr "瓦尔特 PPQ .40 S&W 手枪弹匣" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "一个 10 发钢制盒式弹匣,可用于瓦尔特 PPQ .40 S&W 手枪。" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 12 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "一个 12 发钢制盒式弹匣,可用于瓦尔特 PPQ .40 S&W 手枪。" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 14 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "一个 14 发钢制盒式弹匣,可用于瓦尔特 PPQ .40 S&W 手枪。" + +#: lang/json/MAGAZINE_from_json.py +msgid "Model JCP magazine" +msgstr "Hi-Point JCP 型手枪弹匣" + +#. ~ Description for Model JCP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point Model JCP." +msgstr "一个 10 发钢制盒式弹匣,可用于 Hi-Point JCP 型手枪。" + #: lang/json/MAGAZINE_from_json.py msgid "grenade belt" msgstr "榴弹带" @@ -46874,6 +47142,24 @@ msgstr "USP .45手枪弹匣" msgid "A standard capacity magazine for use with the H&K USP handgun." msgstr "一个标准容量的弹匣,可用于H&K USP手枪。" +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine .45 ACP" +msgstr "瓦尔特 PPQ .45 ACP 手枪弹匣" + +#. ~ Description for PPQ magazine .45 ACP +#: lang/json/MAGAZINE_from_json.py +msgid "A 12 round steel box magazine for the Walther PPQ .45 ACP." +msgstr "一个 12 发钢制盒式弹匣,可用于瓦尔特 PPQ .45 ACP 手枪。" + +#: lang/json/MAGAZINE_from_json.py +msgid "Model JHP magazine" +msgstr "Hi-Point JHP 型手枪弹匣" + +#. ~ Description for Model JHP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 9-round steel box magazine for use with the Hi-Point Model JHP." +msgstr "一个 9 发钢制盒式弹匣,可用于 Hi-Point JHP 型手枪。" + #: lang/json/MAGAZINE_from_json.py msgid ".454 5-round speedloader" msgstr "5发快速装弹器(.454口径)" @@ -47345,6 +47631,95 @@ msgstr "9x19mm P320 弹匣" msgid "A 17 round double stack box magazine for the SIG Sauer P320." msgstr "为SIG Sauer P320设计的17发双排盒式弹匣。" +#: lang/json/MAGAZINE_from_json.py +msgid "Hi-Power magazine 9x19mm" +msgstr "勃朗宁大威力 9x19mm 手枪弹匣" + +#. ~ Description for Hi-Power magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 13 round steel box magazine for the Browning Hi-Power 9x19mm." +msgstr "一个 13 发钢制盒式弹匣,可用于勃朗宁大威力 9x19mm 手枪。" + +#. ~ Description for Hi-Power magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 15 round steel box magazine for the Browning Hi-Power 9x19mm." +msgstr "一个 15 发钢制盒式弹匣,可用于勃朗宁大威力 9x19mm 手枪。" + +#: lang/json/MAGAZINE_from_json.py +msgid "P38 magazine" +msgstr "瓦尔特 P38 手枪弹匣" + +#. ~ Description for P38 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8 round steel box magazine for the Walther P38." +msgstr "一个 8 发钢制盒式弹匣,可用于瓦尔特 P38 手枪。" + +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine 9x19mm" +msgstr "瓦尔特 PPQ 9x19mm 手枪弹匣" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Walther PPQ 9mm." +msgstr "一个 10 发钢制盒式弹匣,可用于瓦尔特 PPQ 9mm 手枪。" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 15 round steel box magazine for the Walther PPQ 9mm." +msgstr "一个 15 发钢制盒式弹匣,可用于瓦尔特 PPQ 9mm 手枪。" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 17 round steel box magazine for the Walther PPQ 9mm." +msgstr "一个 17 发钢制盒式弹匣,可用于瓦尔特 PPQ 9mm 手枪。" + +#: lang/json/MAGAZINE_from_json.py +msgid "C-9 magazine" +msgstr "Hi-Point C-9 手枪弹匣" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Hi-Point C-9." +msgstr "一个 8 发钢制盒式弹匣,可用于 Hi-Point C-9 手枪。" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point C-9." +msgstr "一个 10 发钢制盒式弹匣,可用于 Hi-Point C-9 手枪。" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 15-round steel box magazine for use with the Hi-Point C-9." +msgstr "一个 15 发钢制盒式弹匣,可用于 Hi-Point C-9 手枪。" + +#: lang/json/MAGAZINE_from_json.py +msgid "CZ 75 magazine" +msgstr "CZ-75 手枪弹匣" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 12-round steel box magazine for use with the CZ 75." +msgstr "一个 12 发钢制盒式弹匣,可用于 CZ-75 手枪。" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 20-round steel box magazine for use with the CZ 75." +msgstr "一个 20 发钢制盒式弹匣,可用于 CZ-75 手枪。" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 26-round steel box magazine for use with the CZ 75." +msgstr "一个 26 发钢制盒式弹匣,可用于 CZ-75 手枪。" + +#: lang/json/MAGAZINE_from_json.py +msgid "CCP magazine" +msgstr "瓦尔特 CCP 手枪弹匣" + +#. ~ Description for CCP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Walther CCP." +msgstr "一个 8 发钢制盒式弹匣,可用于瓦尔特 CCP 手枪。" + #: lang/json/MAGAZINE_from_json.py msgid "Makarov PM magazine" msgstr "马卡洛夫PM手枪弹匣" @@ -47462,7 +47837,7 @@ msgstr "不可散式布制弹链,可容纳20发霰弹。明显不如金属弹 #: lang/json/MAGAZINE_from_json.py msgid "shotgun 6-round speedloader" -msgstr "" +msgstr "6 发快速装弹器(霰弹)" #. ~ Description for shotgun 6-round speedloader #: lang/json/MAGAZINE_from_json.py @@ -47470,11 +47845,11 @@ msgid "" "A steel tube with attached handle that when inserted into a 6 round shotgun " "can be used to quickly load the full tube in a much shorter period of time " "than by hand." -msgstr "" +msgstr "一个带手柄的钢管,插入 6 发霰弹枪后能够比手工装填更快地装填满弹仓。" #: lang/json/MAGAZINE_from_json.py msgid "shotgun 8-round speedloader" -msgstr "" +msgstr "8 发快速装弹器(霰弹)" #. ~ Description for shotgun 8-round speedloader #: lang/json/MAGAZINE_from_json.py @@ -47482,7 +47857,7 @@ msgid "" "A steel tube with attached handle that when inserted into an 8 round shotgun" " can be used to quickly load the full tube in a much shorter period of time " "than by hand." -msgstr "" +msgstr "一个带手柄的钢管,插入 8 发霰弹枪后能够比手工装填更快地装填满弹仓。" #: lang/json/MAGAZINE_from_json.py msgid "small welding tank" @@ -47508,14 +47883,14 @@ msgstr "一个大型钢制圆筒,用于保存加压焊接气体。上面有着 #: lang/json/MAGAZINE_from_json.py msgid "oxygen cylinder" -msgstr "" +msgstr "氧气罐" #. ~ Description for oxygen cylinder #: lang/json/MAGAZINE_from_json.py msgid "" "A large steel cylinder used for storing pressurized gas. It is marked with a" " faded, but legible O2 symbol." -msgstr "" +msgstr "一个用于储存高压气体的大型钢罐。上面有着一个依稀可见的 O2 标记。" #: lang/json/MAGAZINE_from_json.py lang/json/vehicle_part_from_json.py msgid "car battery" @@ -48233,7 +48608,7 @@ msgstr "允许玩家在可制作、可携带的花盆中种植作物,非常适 #: lang/json/MOD_INFO_from_json.py msgid "Hydroponics" -msgstr "溶液栽培" +msgstr "水培种植" #. ~ Description for Hydroponics #: lang/json/MOD_INFO_from_json.py @@ -48241,7 +48616,7 @@ msgid "" "Adds hydroponic units, a furniture which can have crops planted in it for " "increased yields. Spawn occasionally in labs or basements. Or build your " "own." -msgstr "" +msgstr "添加水培单元,可以提高种植在内的作物产量的新家具。偶尔会在实验室或地下室生成,也可以自己建造。" #: lang/json/MOD_INFO_from_json.py msgid "Mythical Martial Arts" @@ -48740,13 +49115,13 @@ msgstr "测试性未完工模组,用于展示regional_map_settings的变化" #: lang/json/MOD_INFO_from_json.py msgid "EZ-Mode Medical" -msgstr "" +msgstr "简单模式医学" #. ~ Description for EZ-Mode Medical #: lang/json/MOD_INFO_from_json.py msgid "" "Increases broken limb mending speed and the effectiveness of healing items." -msgstr "" +msgstr "增加断肢愈合速度和治疗物品的效果。" #: lang/json/MOD_INFO_from_json.py msgid "Makeshift Items Mod" @@ -49856,7 +50231,7 @@ msgstr "巨大的织网蜘蛛,在丛林树木间编织这死亡的蛛网,等 #: lang/json/MONSTER_from_json.py msgid "fungal spider" -msgstr "" +msgstr "真菌蜘蛛" #. ~ Description for fungal spider #: lang/json/MONSTER_from_json.py @@ -49864,7 +50239,7 @@ msgid "" "The abdomen of this sickly looking giant spider is now home to many lumps of" " blooming fungi. It is leaving behind a trail of tainted secretions when " "the spider struggles to drag it along the ground." -msgstr "" +msgstr "这只恶心的大蜘蛛的腹部现在旺盛生长着许多真菌。当这只蜘蛛挣扎着拖着这些真菌移动时,它们在地上留下一道感染分泌物。" #: lang/json/MONSTER_from_json.py msgid "immature giant web spider" @@ -50791,7 +51166,7 @@ msgstr "当他狂喜地背诵赞美诗时,他的眼睛空空如也,口吐白 #: lang/json/MONSTER_from_json.py msgid "X-03: 'Spectre' Recon Mech" -msgstr "" +msgstr "X-03:“幽灵”侦察外骨骼装甲" #. ~ Description for X-03: 'Spectre' Recon Mech #: lang/json/MONSTER_from_json.py @@ -50804,10 +51179,12 @@ msgid "" " field. You may be able to hack it to accept you as its pilot. Like all " "mech-suits it can act as a UPS from its large battery." msgstr "" +"这是一套波音-" +"大宇机械式侦察外骨骼装甲,最近才被投入美国军队使用。它被设计使用于侦察或狙击,拥有较好的移动性、集成的激光狙击枪和一套用于目标指示和战场感知的光学系统。在大灾变之前并未大规模部署,但是已有几套原型在战场上使用。你也许可以侵入它使其接受你的驾驶。和所有外骨骼装甲一样,它的大型电池可以作为UPS使用。" #: lang/json/MONSTER_from_json.py msgid "X-02: 'Grunt' Combat Mech" -msgstr "" +msgstr "X-03:“步兵”战斗外骨骼装甲" #. ~ Description for X-02: 'Grunt' Combat Mech #: lang/json/MONSTER_from_json.py @@ -50819,10 +51196,12 @@ msgid "" "You may be able to hack it to accept you as its pilot. Like all mech-suits " "it can act as a UPS from its large battery." msgstr "" +"这是一套波音-" +"大宇机械式战斗外骨骼装甲,最近才被投入美国军队使用。它被设计使用于火力支援,配有一把可怖的集成加特林激光枪。在大灾变之前并未大规模部署,但是已有几套原型在战场上使用。你也许可以侵入它使其接受你的驾驶。和所有外骨骼装甲一样,它的大型电池可以作为UPS使用。" #: lang/json/MONSTER_from_json.py msgid "X-01: 'Jack' Lifting Mech" -msgstr "" +msgstr "X-01:“千斤顶”起重外骨骼装甲" #. ~ Description for X-01: 'Jack' Lifting Mech #: lang/json/MONSTER_from_json.py @@ -50834,6 +51213,8 @@ msgid "" "prototypes in the field. You may be able to hack it to accept you as its " "pilot. Like all mech-suits it can act as a UPS from its large battery." msgstr "" +"这是一套波音-" +"大宇机械式起重外骨骼装甲,最近才被投入美国军队使用。它被设计使用于装卸重型材料,具有有限的战斗支持能力。在大灾变之前并未大规模部署,但是已有几套原型在战场上使用。你也许可以侵入它使其接受你的驾驶。和所有外骨骼装甲一样,它的大型电池可以作为UPS使用。" #: lang/json/MONSTER_from_json.py msgid "mi-go" @@ -50852,7 +51233,7 @@ msgstr "" #: lang/json/MONSTER_from_json.py msgid "mi-go slaver" -msgstr "" +msgstr "米·戈贩奴者" #. ~ Description for mi-go slaver #: lang/json/MONSTER_from_json.py @@ -50864,10 +51245,11 @@ msgid "" "gazing upon the unnatural beast fills you with primordial dread. It is " "carrying an oblong object that hums with an odd keening sound." msgstr "" +"一只来自异界的未知起源的生物。它的结构混乱的粉红色身体带有许多未知功能的成对附肢,还有一对似乎毫无用处的带肋的膜状翅膀。它奇怪的约如金字塔状的头部有许多摇摆的触角,只是看了一眼这只超自然的怪物就让你充满了原始的恐惧。它带着一个狭长的发出奇特呼啸声的物体。" #: lang/json/MONSTER_from_json.py msgid "mi-go surgeon" -msgstr "" +msgstr "米·戈外科医生" #. ~ Description for mi-go surgeon #: lang/json/MONSTER_from_json.py @@ -50875,11 +51257,11 @@ msgid "" "This mi-go has a slender body with snaking carapace along it, and even more " "paired clawed appendages. Its claws are smaller and more delicate looking, " "but that does not make them less unnerving." -msgstr "" +msgstr "这只米·戈有着细长的身体和蜿蜒的甲壳,甚至有着更多的带爪附肢。这些爪子较小,看起来更加纤弱,但是这丝毫没有减轻它们给人带来的不安。" #: lang/json/MONSTER_from_json.py msgid "mi-go guard" -msgstr "" +msgstr "米·戈守卫" #. ~ Description for mi-go guard #: lang/json/MONSTER_from_json.py @@ -50891,10 +51273,11 @@ msgid "" " barnacle-like armor, aside from the bristling antennae that serve as its - " "you must assume sensory devices and mouth." msgstr "" +"和普通米·戈一样,这是一只外星生物,但是有着更厚的护甲。它的躯体如同一堆不定形的怪肉装填在斑斓的甲壳中,上面生长出许多附肢,末端似乎长着某种器官。它锥形的头部被藤壶一般的甲壳包围,仅有一对挺立的触角从其中伸出。你只能假设这是它的感觉器官和口器。" #: lang/json/MONSTER_from_json.py msgid "mi-go myrmidon" -msgstr "" +msgstr "米·戈家仆" #. ~ Description for mi-go myrmidon #: lang/json/MONSTER_from_json.py @@ -50906,10 +51289,11 @@ msgid "" " grace, like an otherworldly dancer. It actually appears to be carrying " "weaponry." msgstr "" +"如果说灰熊有类似人类的地方,这只生物就和米·戈类似。它的巨型躯体上生长着斑斓的节肢甲壳,看上去如同圣甲虫和水虱的杂交体。它有着许多对骇人的爪子和其它附肢,以一种奇异、缓慢的姿态移动,如同一位异界的舞者。实际上,它似乎携带着某种武器。" #: lang/json/MONSTER_from_json.py msgid "mi-go scout" -msgstr "" +msgstr "米·戈侦察兵" #. ~ Description for mi-go scout #: lang/json/MONSTER_from_json.py @@ -50919,10 +51303,11 @@ msgid "" " diaphragm or a membrane on the end. The thing seems like an integral part " "of the mi-go, and all its appendages are supporting it to prevent swaying." msgstr "" +"这只米·戈体型修长,比其它米·戈偏小。它身体正中伸出了一个奇怪的狭长物体,末端有着一块隔膜一般的东西。这个物体似乎是这只米·戈身体的一部分,而它所有的附肢都在支撑着这个物体,以避免晃动。" #: lang/json/MONSTER_from_json.py msgid "The mi-go scout fires its weapon!" -msgstr "" +msgstr "米·戈侦察兵发射了它的武器!" #: lang/json/MONSTER_from_json.py msgid "laser turret" @@ -50959,9 +51344,10 @@ msgstr "军用炮塔" #: lang/json/MONSTER_from_json.py msgid "" "Leadworks LLC's T-4A1 Sentry. It features improved firmware over General " -"Atomics' TX-1 9x19mm model and an automated M4 carbine." +"Atomics' TX-1 9x19mm model and an automated 5.56mm carbine." msgstr "" -"Leadworks LLC公司的 T-4A1 哨兵炮塔。相对于通用原子公司的TX-1 9x19mm型炮塔升级了系统固件并装配了一挺全自动M4卡宾枪。" +"Leadworks LLC公司的 T-4A1 哨兵炮塔。相对于通用原子公司的TX-1 " +"9x19mm型炮塔升级了系统固件并装配了一挺全自动5.56mm卡宾枪。" #: lang/json/MONSTER_from_json.py msgid "debug monster" @@ -51121,7 +51507,7 @@ msgstr "汽油丧尸" msgid "" "A huge bloated zombie that appears to have fed upon gasoline; fumes and " "flames escape from its mouth and fuel leaks from its waddling form." -msgstr "一个巨大的膨胀僵尸,似乎以汽油为食;烟雾和火焰从它的口中喷出,燃料从它的摇摇晃晃的身体中泄漏出来。" +msgstr "一个巨大的膨胀丧尸,似乎以汽油为食;烟雾和火焰从它的口中喷出,燃料从它的摇摇晃晃的身体中泄漏出来。" #: lang/json/MONSTER_from_json.py msgid "fungal boomer" @@ -51883,11 +52269,11 @@ msgstr "骸骨丧尸兽" msgid "" "Distorted outgrowths of calcified bone plates cover this zombie's rotten " "skin. Joints and cracks around its body ooze with black goo." -msgstr "扭曲生长的钙化骨板覆盖了这个僵尸的腐烂皮肤, 关节和遍及全身的裂缝渗出黑色粘液。" +msgstr "扭曲生长的钙化骨板覆盖了这个丧尸的腐烂皮肤, 关节和遍及全身的裂缝渗出黑色粘液。" #: lang/json/MONSTER_from_json.py msgid "skeletal shocker" -msgstr "" +msgstr "放电骷髅" #. ~ Description for skeletal shocker #: lang/json/MONSTER_from_json.py @@ -51895,7 +52281,7 @@ msgid "" "Heavy, jagged bone plates have grown out of the surface of this zombie. " "Underneath, its flesh glows and crackles with the occasional jolt of " "electricity." -msgstr "" +msgstr "参差不齐的沉重骨板从这只丧尸的体表长出。骨板之下的肉体发出闪光,并不时发出一道道电弧。" #: lang/json/MONSTER_from_json.py msgid "sludge crawler" @@ -52236,7 +52622,7 @@ msgid "" " of face now filling with a peculiar gray goo. Human ears hang from the " "sides, enormous and unsettling. Thin slits at the front suggest it may be " "able to see." -msgstr "这只僵尸的头很明显曾经被摧毁过,它脸上的裂口充满了一种特殊的灰色粘液。人类的耳朵从侧面垂下,巨大而令人恶心。它可能还保留着一定的视力。" +msgstr "这只丧尸的头很明显曾经被摧毁过,它脸上的裂口充满了一种特殊的灰色粘液。人类的耳朵从侧面垂下,巨大而令人恶心。它可能还保留着一定的视力。" #: lang/json/MONSTER_from_json.py msgid "shocker zombie" @@ -52305,7 +52691,7 @@ msgstr "一具灰白的皮肤下充满了臌胀的腐败气体的尸体,隆起 #: lang/json/MONSTER_from_json.py msgid "gangrenous flesh" -msgstr "" +msgstr "坏疽肉块" #. ~ Description for gangrenous flesh #: lang/json/MONSTER_from_json.py @@ -52314,21 +52700,64 @@ msgid "" "with putrid gas. Between lumps of unrecognizable gore, a human head lamely " "follows your walking with empty, black eyes." msgstr "" +"这只丧尸由于严重的损伤失去了移动能力,它的灰色皮肤在腐败气体的压力下几乎就要爆炸。在不可辨认的血肉之中,一个人类头颅用空洞的黑色眼珠注视着你的行动。" #: lang/json/MONSTER_from_json.py msgid "gangrenous crawler" -msgstr "" +msgstr "坏疽爬行者" #. ~ Description for gangrenous crawler #: lang/json/MONSTER_from_json.py msgid "" "A nightmarish spidery abomination, born from human gore. It deftly crawls " "between walls and ceiling with limbs grown from its own disjointed ribs." +msgstr "一只噩梦般的蛛形怪物,由人类血肉变成。它敏捷地在墙壁和天花板上爬行,断离的肋骨构成了它的肢体。" + +#: lang/json/MONSTER_from_json.py +msgid "gangrenous impaler" +msgstr "坏疽穿刺者" + +#. ~ Description for gangrenous impaler +#: lang/json/MONSTER_from_json.py +msgid "" +"A corpse hideously twisted into an insect-like form. A hollow tendril " +"reaches out from its open thorax." +msgstr "这个尸体以骇人的方式扭曲,变成了昆虫一般的形状。从它的胸腔之中伸出了一只中空的触手。" + +#: lang/json/MONSTER_from_json.py +msgid "The impaler launches a barb!" +msgstr "坏疽穿刺者发射了一只毒刺!" + +#: lang/json/MONSTER_from_json.py +msgid "trapped tendril" +msgstr "受困触手" + +#. ~ Description for trapped tendril +#: lang/json/MONSTER_from_json.py +msgid "" +"A great tendril of mutated flesh and sharpened bone. Emergent from a " +"crevice in the ruined floor, hundreds of human limbs seek freedom and writhe" +" incessantly from underneath its grotesque carapace. As enormous as it may " +"already be, you feel certain that this is just part of a creature much " +"bigger, for when it moves, you can feel this whole ruin tremble, as if an " +"unseen giant struggled against the weight of its concrete tomb." msgstr "" +"一只血肉和尖骨组成的巨型触手。它从破损的地面的一个缝隙中伸出,缝隙之下无数的人类残肢在怪异的甲壳下不停蠕动,希望重获自由。虽然这只触手已经无比巨大,你仍然确信这只是一只更大生物的一部分,因为当触手移动时,你能感觉到整个废墟的震动,如同一只未知的巨人正在与它的混凝土坟墓抗争。" + +#: lang/json/MONSTER_from_json.py +msgid "flesh wall" +msgstr "肉山" + +#. ~ Description for flesh wall +#: lang/json/MONSTER_from_json.py +msgid "" +"A great lump of mutated flesh. It resembles the innards of some gigantic " +"creature and is covered in a grid of diminutive veins." +msgstr "一块巨大的变异肉体。它看起来像是某种巨型生物的内脏,表面覆盖着纤细血管构成的网络。" #: lang/json/MONSTER_from_json.py msgid "bloated fungal zombie" -msgstr "" +msgstr "爆浆真菌丧尸" #. ~ Description for bloated fungal zombie #: lang/json/MONSTER_from_json.py @@ -52336,7 +52765,7 @@ msgid "" "With its swollen gray skin overgrown by thick layer of mold, this baloon-" "like fungal zombie looks like it could violently burst with a cloud of " "noxious spores." -msgstr "" +msgstr "这只真菌丧尸肿胀的灰白皮肤上长满了一大层霉菌,如同气球一般隆起,随时都有可能爆炸释放出一片孢子云。" #: lang/json/MONSTER_from_json.py msgid "grabber zombie" @@ -52587,14 +53016,14 @@ msgstr "一个黑色扭曲的丧尸,肉块挂在其身上,不停地发出阴 #: lang/json/MONSTER_from_json.py msgid "pollinator zombie" -msgstr "" +msgstr "授粉丧尸" #. ~ Description for pollinator zombie #: lang/json/MONSTER_from_json.py msgid "" "Every breath of this crooked, fungus-ridden zombie emits a fine dust of " "spores, and it constantly looks like it's emerging from a cloud of myst." -msgstr "" +msgstr "这只扭曲的布满真菌的丧尸的每一次呼吸都喷射出一片孢子尘,使它看起来就像是从迷雾中诞生一般。" #: lang/json/MONSTER_from_json.py msgid "spitter zombie" @@ -52668,7 +53097,7 @@ msgstr "这个丧尸的生前矫健的如同一名运动员,如今成为了凶 #: lang/json/MONSTER_from_json.py msgid "zombeaver" -msgstr "僵尸海狸" +msgstr "丧尸海狸" #. ~ Description for zombeaver #: lang/json/MONSTER_from_json.py @@ -52679,6 +53108,7 @@ msgid "" " is oozing out of it. Seems like it isn't interested in trees anymore and " "is looking for some warm flesh to feed." msgstr "" +"这只海狸的侧身有一个很大的伤口,透过它可以看到带肉的肋骨。这种怪物最突出的特征是它那不祥的巨大门牙,奇怪的黑色粘液正从它嘴里渗出。它似乎对树木不再感兴趣,正在寻找温暖的血肉作食。" #: lang/json/MONSTER_from_json.py msgid "antlered horror" @@ -52721,7 +53151,7 @@ msgstr "" #: lang/json/MONSTER_from_json.py msgid "fungal juggernaut" -msgstr "" +msgstr "真菌霸主" #. ~ Description for fungal juggernaut #: lang/json/MONSTER_from_json.py @@ -52729,7 +53159,7 @@ msgid "" "Fungi bloom from the crevices in the ossified plates of this ponderous bone " "titan, and it seems even it's eyes are lost to it. A dust of spores lands on" " the ground with every sluggish stomp of it's heavy legs." -msgstr "" +msgstr "真菌从这只笨重的骷髅巨兽的骨板缝隙中长出,它的眼睛似乎已经被真菌破坏。它移动缓慢,而每一次踏步都使一片孢子尘飘落在地。" #: lang/json/MONSTER_from_json.py msgid "ancient red dragon" @@ -53261,7 +53691,7 @@ msgid "" "Apparently this zombie was doing time when the Cataclysm struck. It wears " "black and white striped prisoner clothes, and tattoos can be seen on his " "decaying skin." -msgstr "显然,当大灾变来临时这只僵尸正在狱中服刑。它穿着黑白条纹的囚衣,腐烂的皮肤上刻有纹身。" +msgstr "显然,当大灾变来临时这只丧尸正在狱中服刑。它穿着黑白条纹的囚衣,腐烂的皮肤上刻有纹身。" #: lang/json/MONSTER_from_json.py msgid "zombie soldier" @@ -53429,7 +53859,7 @@ msgid "" "neck, violently twitching at nearby sounds, and it moves at terrifying speed" " with its grotesquely-swollen hands." msgstr "" -"这个无头僵尸已经肿胀到可怕的比例,几乎九英尺高。六英尺长的黑色软泥触角在它的脖子上盲目地挥动,对身边的声音作出剧烈地抽搐。它以可怕的速度移动,双手肿胀畸形。" +"这个无头丧尸已经肿胀到可怕的比例,几乎九英尺高。六英尺长的黑色软泥触角在它的脖子上盲目地挥动,对身边的声音作出剧烈地抽搐。它以可怕的速度移动,双手肿胀畸形。" #: lang/json/MONSTER_from_json.py msgid "old animatronic fox" @@ -54072,7 +54502,7 @@ msgstr "" #: lang/json/MONSTER_from_json.py msgid "black dragon wyrmling" -msgstr "" +msgstr "幼体黑龙" #. ~ Description for black dragon wyrmling #: lang/json/MONSTER_from_json.py @@ -54080,11 +54510,11 @@ msgid "" "This is a small black dragon, less than five years old. Its scales are " "glossy, and its horns barely peek out of its head. Even from one so young, " "you see the glint of sadism in its eyes." -msgstr "" +msgstr "这是一只不到五岁的小黑龙。它的鳞片光滑,龙角刚刚从头上长出。即使是如此幼小的黑龙,你也能从它的眼中看出一丝残暴。" #: lang/json/MONSTER_from_json.py msgid "young black dragon" -msgstr "" +msgstr "小黑龙" #. ~ Description for young black dragon #: lang/json/MONSTER_from_json.py @@ -54095,6 +54525,7 @@ msgid "" "this creature is evil to its very core. Even though this dragon is not " "fully grown, it is the size of a full-grown bull." msgstr "" +"这只黑龙似乎还处于幼年。它的眼睛已经开始在眼眶中下陷,而它的弯曲的节状龙角的尖端才刚刚开始变暗。你仅仅是看它一眼就知道这种生物邪恶到底。尽管这只龙还没有发育完全,但它已经有一头成年公牛的大小。" #: lang/json/MONSTER_from_json.py msgid "owlbear" @@ -54113,14 +54544,14 @@ msgstr "" #: lang/json/MONSTER_from_json.py msgid "nothic" -msgstr "" +msgstr "诺斯克" #. ~ Description for nothic #: lang/json/MONSTER_from_json.py msgid "" "A baleful eye peers out from the darkness, its gleam hinting at a weird " "intelligence and unnerving malevolence." -msgstr "" +msgstr "一只邪恶的眼珠在黑暗中向外窥探,眼睛的闪光显示出它怪异的智慧和令人不安的恶意。" #: lang/json/MONSTER_from_json.py msgid "owlbear cub" @@ -54936,7 +55367,7 @@ msgid "" "A salvaged cyborg refitted with the head of a zombie necromancer. The " "animate head retains some of its ability to revive zombies. Why on Earth " "would anyone build such an abomination?" -msgstr "一台改装的报废改造人,头部被替换成了死灵法尸的头颅。死而复生的头部保留了一些复活僵尸的能力。为什么会有人想要建造这样一只可怕的怪物呢?" +msgstr "一台改装的报废改造人,头部被替换成了死灵法尸的头颅。死而复生的头部保留了一些复活丧尸的能力。为什么会有人想要建造这样一只可怕的怪物呢?" #. ~ Description for security robot #: lang/json/MONSTER_from_json.py @@ -55367,7 +55798,7 @@ msgstr "沙漠爬行者" msgid "" "A calloused and misshapened form that seems to have adapted to the harsh, " "dry environment." -msgstr "这只畸形的僵尸有着硬化的皮肤,似乎已经适应了这里严酷干燥的环境" +msgstr "这只畸形的丧尸有着硬化的皮肤,似乎已经适应了这里严酷干燥的环境" #: lang/json/MONSTER_from_json.py msgid "Gila monster" @@ -55632,7 +56063,7 @@ msgstr "疼痛" #. ~ Description for Pain #: lang/json/SPELL_from_json.py msgid "Increases pain" -msgstr "" +msgstr "加强疼痛" #: lang/json/SPELL_from_json.py src/character.cpp src/npctalk.cpp msgid "Tired" @@ -55641,18 +56072,36 @@ msgstr "疲倦" #. ~ Description for Tired #: lang/json/SPELL_from_json.py msgid "decreases stamina" -msgstr "" +msgstr "降低体力" #: lang/json/SPELL_from_json.py msgid "mi-go slaver beam" -msgstr "" +msgstr "米·戈贩奴者光束" #. ~ Description for mi-go slaver beam #: lang/json/SPELL_from_json.py msgid "" "Mi-go slaver beams cause pain, lower stamina, and give a short-lasting daze " "effect. Starts very short range, increases rapidly with level." -msgstr "" +msgstr "米·戈贩奴者光束会造成疼痛、降低体力并产生短期的眩晕效果。基础攻击范围很低,但是会随着等级快速提高。" + +#: lang/json/SPELL_from_json.py +msgid "Summon Gangrenous Crawlers" +msgstr "召唤坏疽爬行者" + +#. ~ Description for Summon Gangrenous Crawlers +#: lang/json/SPELL_from_json.py +msgid "Summons 2 permanent gangrenous crawlers." +msgstr "召唤2个永久的坏疽爬行者。" + +#: lang/json/SPELL_from_json.py +msgid "Summon Gangrenous Monsters" +msgstr "召唤坏疽怪物" + +#. ~ Description for Summon Gangrenous Monsters +#: lang/json/SPELL_from_json.py +msgid "Summons 2 permanent gangrenous impalers." +msgstr "召唤2个永久的坏疽穿刺者。" #: lang/json/SPELL_from_json.py msgid "Smite" @@ -55668,7 +56117,7 @@ msgstr "战胜疼痛" #: lang/json/SPELL_from_json.py msgid "Summon Zombie" -msgstr "召唤僵尸" +msgstr "召唤丧尸" #: lang/json/SPELL_from_json.py msgid "Summon Skeleton" @@ -55680,7 +56129,7 @@ msgstr "召唤腐朽突袭兽" #: lang/json/SPELL_from_json.py msgid "Necrotic Gaze" -msgstr "" +msgstr "腐败凝视" #: lang/json/SPELL_from_json.py msgid "Animist Rune" @@ -55703,7 +56152,7 @@ msgstr "伤痛分流" #: lang/json/SPELL_from_json.py msgid "Vicious Tentacle" -msgstr "邪恶触手" +msgstr "残暴之鞭" #: lang/json/SPELL_from_json.py lang/json/effects_from_json.py msgid "Grotesque Enhancement" @@ -55715,7 +56164,7 @@ msgstr "酸性喷雾" #: lang/json/SPELL_from_json.py msgid "Flesh Pouch" -msgstr "临时背包" +msgstr "肉袋" #: lang/json/SPELL_from_json.py msgid "Conjure Bonespear" @@ -55826,39 +56275,39 @@ msgstr "为目标增加一个效果。" #: lang/json/SPELL_from_json.py msgid "Test Area Pull" -msgstr "" +msgstr "测试区域吸引" #. ~ Description for Test Area Pull #: lang/json/SPELL_from_json.py msgid "Pulls all objects inside." -msgstr "" +msgstr "吸引所有物体。" #: lang/json/SPELL_from_json.py msgid "Test Area Pull (Field)" -msgstr "" +msgstr "测试区域吸引(环境效果)" #. ~ Description for Test Area Pull (Field) #: lang/json/SPELL_from_json.py msgid "Pulls field contents tiles inside." -msgstr "" +msgstr "吸引环境效果区块。" #: lang/json/SPELL_from_json.py msgid "Test Area Push" -msgstr "" +msgstr "测试区域排斥" #. ~ Description for Test Area Push #: lang/json/SPELL_from_json.py msgid "Pushes all objects outside." -msgstr "" +msgstr "排斥所有物体。" #: lang/json/SPELL_from_json.py msgid "Black Dragons' Breath" -msgstr "" +msgstr "黑龙之息" #. ~ Description for Black Dragons' Breath #: lang/json/SPELL_from_json.py msgid "Spews a line of acid from your mouth." -msgstr "" +msgstr "从你的口中喷出一道酸液。" #: lang/json/SPELL_from_json.py lang/json/effects_from_json.py msgid "Vegetative Grasp" @@ -55900,12 +56349,12 @@ msgstr "" #: lang/json/SPELL_from_json.py msgid "Kill Fungus" -msgstr "" +msgstr "真菌杀手" #. ~ Description for Kill Fungus #: lang/json/SPELL_from_json.py msgid "Kills fungus affected areas" -msgstr "" +msgstr "消灭一个区域中的真菌感染" #: lang/json/SPELL_from_json.py msgid "Druid Rune" @@ -55920,14 +56369,14 @@ msgstr "这仪式会创造出一块与德鲁伊共鸣的小石块。你可以将 #: lang/json/SPELL_from_json.py msgid "Purification Seed" -msgstr "" +msgstr "净化之种" #. ~ Description for Purification Seed #: lang/json/SPELL_from_json.py msgid "" "You summon a gift of the earth which will purify water. Rapidly degrades if " "not utilized." -msgstr "" +msgstr "你召唤了大地的馈赠,可用于净水。若不及时使用很快就会变质。" #: lang/json/SPELL_from_json.py msgid "Stonefist" @@ -55939,7 +56388,7 @@ msgstr "战争践踏" #: lang/json/SPELL_from_json.py msgid "Stone's Endurance" -msgstr "耐如磐石" +msgstr "坚如磐石" #: lang/json/SPELL_from_json.py msgid "Shardspray" @@ -55959,12 +56408,12 @@ msgstr "石之箭" #: lang/json/SPELL_from_json.py msgid "Move Earth" -msgstr "" +msgstr "移土术" #. ~ Description for Move Earth #: lang/json/SPELL_from_json.py msgid "Your essense flows around you, and the earth follows." -msgstr "" +msgstr "你的精魂在身侧流转,而土地也随之变化。" #: lang/json/SPELL_from_json.py msgid "Earthshaper Rune" @@ -55979,7 +56428,7 @@ msgstr "这仪式会创造出一块与塑地者共鸣的小石块。你可以将 #: lang/json/SPELL_from_json.py msgid "Twisted Restoration" -msgstr "" +msgstr "扭曲恢复" #. ~ Description for Twisted Restoration #: lang/json/SPELL_from_json.py @@ -55987,11 +56436,11 @@ msgid "" "This spell overclocks your heart, generating new flesh and muscle. It is " "unwise to use this in immediate danger, and may be fatal if done in critical" " condition." -msgstr "" +msgstr "这个法术会超载加速你的心脏,以再生皮肤和肌肉。这个法术不应在危险来临时使用,否则可能会造成致命性后果。" #: lang/json/SPELL_from_json.py msgid "Improved Twisted Restoration" -msgstr "" +msgstr "改良扭曲恢复" #. ~ Description for Improved Twisted Restoration #: lang/json/SPELL_from_json.py @@ -56000,6 +56449,7 @@ msgid "" "unwise to use this in immediate danger, and may be fatal if done in critical" " condition. Improved brewing mitigates the strain of the spell." msgstr "" +"这个法术会超载加速你的心脏,以再生皮肤和肌肉。这个法术不应在危险来临时使用,否则可能会造成致命性后果。改良的制药方式降低了法术对身体的负担。" #: lang/json/SPELL_from_json.py msgid "Point Flare" @@ -56082,7 +56532,7 @@ msgstr "奥术闪电" #: lang/json/SPELL_from_json.py msgid "Haste" -msgstr "急迫术" +msgstr "急速" #: lang/json/SPELL_from_json.py msgid "Mana Beam" @@ -56141,14 +56591,14 @@ msgstr "召唤风暴之锤" #: lang/json/SPELL_from_json.py msgid "Stormshaper Rune" -msgstr "风暴召唤者符文" +msgstr "风暴塑造者符文" #. ~ Description for Stormshaper Rune #: lang/json/SPELL_from_json.py msgid "" "This ritual creates a small pebble attuned to Stormshapers. You can use the " "rune as a catalyst for recipes." -msgstr "这仪式会创造出一块与风暴召唤者共鸣的小石块。你可以将符文作为催化剂用于制造其它物品。" +msgstr "这仪式会创造出一块与风暴塑造者共鸣的小石块。你可以将符文作为催化剂用于制造其它物品。" #: lang/json/SPELL_from_json.py msgid "Lightning Blast" @@ -56171,7 +56621,7 @@ msgstr "祝福" #: lang/json/SPELL_from_json.py msgid "Holy Blade" -msgstr "光之刃" +msgstr "光明之刃" #: lang/json/SPELL_from_json.py msgid "Spiritual Armor" @@ -56198,7 +56648,7 @@ msgstr "这仪式会创造出一块与科技法师共鸣的小石块。你可以 #: lang/json/SPELL_from_json.py msgid "Taze" -msgstr "泰兹" +msgstr "电击" #: lang/json/SPELL_from_json.py msgid "Lesser Quantum Tunnel" @@ -56210,7 +56660,7 @@ msgstr "神经突触刺激" #: lang/json/SPELL_from_json.py msgid "Laze" -msgstr "激光束" +msgstr "激光" #: lang/json/SPELL_from_json.py msgid "Animated Blade" @@ -58143,7 +58593,7 @@ msgstr "一种用于营地的假落锤。" #: lang/json/TOOL_from_json.py lang/json/furniture_from_json.py msgid "arc furnace" msgid_plural "arc furnaces" -msgstr[0] "" +msgstr[0] "电弧炉" #: lang/json/TOOL_from_json.py msgid "teeth and claws" @@ -59424,7 +59874,7 @@ msgstr "一个细玻璃管,底部可以点火。用来享用某些,你懂的 #: lang/json/TOOL_from_json.py msgid "crash axe" msgid_plural "crash axes" -msgstr[0] "" +msgstr[0] "应急斧" #. ~ Description for crash axe #: lang/json/TOOL_from_json.py @@ -59432,7 +59882,7 @@ msgid "" "A short lightweight emergency tool with a quarter circular blade, a short " "pick opposite the blade and an insulated handle. Used on airplanes to chop " "down or pry walls or cabinets to gain access in case of fire." -msgstr "" +msgstr "一个轻便应急用短斧,由一个扇形的斧刃、与斧刃相对的锄尖和一根绝缘手柄组成。用于在飞机火灾时砍开或撬开墙壁或机舱。" #: lang/json/TOOL_from_json.py lang/json/trap_from_json.py msgid "crossbow trap" @@ -60291,7 +60741,7 @@ msgstr "这是一把消磁的钢制羊角锤,有一个木头手把。使用铁 #: lang/json/TOOL_from_json.py msgid "claw bar" msgid_plural "claw bars" -msgstr[0] "" +msgstr[0] "带爪撬棍" #. ~ Description for claw bar #: lang/json/TOOL_from_json.py @@ -60299,7 +60749,7 @@ msgid "" "This is a small prying tool with a clawed bend at one end for pulling " "spikes. Use it to open locked doors without destroying them or to lift " "manhole covers. You could also wield it to bash some heads in." -msgstr "" +msgstr "这是一个小型撬棍,一端有一个带爪的弯曲用于拔出铁钉,可以轻易进出别人的家里而不破坏门或者用来开启下水沟井盖,还可以潇洒的敲开丧尸的脑袋。" #: lang/json/TOOL_from_json.py msgid "hand drill" @@ -60589,19 +61039,19 @@ msgstr "一个用来收集雨水的小型皮革漏斗状装置。在户外激活 #: lang/json/vehicle_part_from_json.py msgid "birchbark funnel" msgid_plural "birchbark funnels" -msgstr[0] "" +msgstr[0] "桦皮集雨器" #. ~ Use action done_message for birchbark funnel. #: lang/json/TOOL_from_json.py msgid "You place the birchbark funnel, waiting to collect rain." -msgstr "" +msgstr "你安置了桦皮集雨器,等待收集雨水。" #. ~ Description for birchbark funnel #: lang/json/TOOL_from_json.py msgid "" "This is a small birchbark funnel. Place it above an outdoor container to " "collect rainwater." -msgstr "" +msgstr "这是一个小型桦树集雨器。放置在室外的容器上来收集雨水。" #: lang/json/TOOL_from_json.py msgid "lighter" @@ -61061,7 +61511,7 @@ msgid "" "electronic device with some amplifier circuits. It has now no other use " "beside emitting loud cracling static noise, that could distract zombies." msgstr "" -"这个装置主要是一个增强的扬声器,这个扬声器连接着一些从电子装置上拆下的放大器电路。除了发出刺耳的噪音之外,它没有其他用途。噪音会分散僵尸的注意力。" +"这个装置主要是一个增强的扬声器,这个扬声器连接着一些从电子装置上拆下的放大器电路。除了发出刺耳的噪音之外,它没有其他用途。噪音会分散丧尸的注意力。" #: lang/json/TOOL_from_json.py msgid "noise emitter (on)" @@ -61074,7 +61524,7 @@ msgid "" "This device has been turned on and is emitting horrible crackles, pops and " "other static sounds. Quick, get away from it before it draws zombies to " "you!" -msgstr "这个装置已经打开,发出可怕的噼啪声、碰撞声和其他嘈杂的声音。快点,在它把僵尸吸引过来之前离开它!" +msgstr "这个装置已经打开,发出可怕的噼啪声、碰撞声和其他嘈杂的声音。快点,在它把丧尸吸引过来之前离开它!" #: lang/json/TOOL_from_json.py msgid "lamp oil cooker" @@ -61202,14 +61652,14 @@ msgstr "一个塑料笼子,可以用来运输小型宠物。激活它后选择 #: lang/json/TOOL_from_json.py msgid "wooden pet carrier" msgid_plural "wooden pet carriers" -msgstr[0] "" +msgstr[0] "木制宠物笼" #. ~ Description for wooden pet carrier #: lang/json/TOOL_from_json.py msgid "" "A wooden container meant to hold pets for transport. Use it on a suitable " "animal to capture, use it on an empty tile to release." -msgstr "" +msgstr "一个木制笼子,可以用来运输小型宠物。激活它后选择需要捕获的动物,或者选择空地放出笼中动物。" #: lang/json/TOOL_from_json.py msgid "chicken cage" @@ -61513,14 +61963,26 @@ msgstr "布条,制作时很有用,也可以绑在流血处,或许能止血 #: lang/json/TOOL_from_json.py msgid "sponge" msgid_plural "sponges" -msgstr[0] "" +msgstr[0] "海绵" #. ~ Description for sponge #: lang/json/TOOL_from_json.py msgid "" "A sponge is a tool or cleaning aid made of soft, porous material. Typically " "used for cleaning impervious surfaces." -msgstr "" +msgstr "海绵由多孔的软材料制成,可以拿来做清洁。通常用于清洁不透水的表面。" + +#: lang/json/TOOL_from_json.py +msgid "washing kit" +msgid_plural "washing kits" +msgstr[0] "洗衣工具" + +#. ~ Description for washing kit +#: lang/json/TOOL_from_json.py +msgid "" +"A combination kit of a washboard and a sponge. Everything you need to clean" +" items after the apocalypse." +msgstr "洗衣板和海绵组成的工具套装,这就是大灾变后洗衣所需的一切用具。" #: lang/json/TOOL_from_json.py msgid "reading light" @@ -63164,14 +63626,14 @@ msgstr "这是一个小型的浴室秤,用来称一个人裸体时的体重。 #: lang/json/TOOL_from_json.py msgid "acetylene-gas machine" msgid_plural "acetylene-gas machines" -msgstr[0] "" +msgstr[0] "乙炔制造机" #. ~ Description for acetylene-gas machine #: lang/json/TOOL_from_json.py msgid "" "This bulky device takes water and calcium carbide and yields unpressurised " "acetylene." -msgstr "" +msgstr "这个大型设备接受水和电石,产出常压的乙炔气。" #: lang/json/TOOL_from_json.py lang/json/vehicle_part_from_json.py msgid "military black box" @@ -64157,7 +64619,7 @@ msgstr "这种农用镰刀的刀刃旋转了90度,被改造成一种简易的 #: lang/json/TOOL_from_json.py msgid "spike on a stick" msgid_plural "spike on a sticks" -msgstr[0] "" +msgstr[0] "铁刺木棍" #. ~ Description for spike on a stick #: lang/json/TOOL_from_json.py @@ -64166,11 +64628,12 @@ msgid "" " sharp, and crudely constructed, but it will keep the zombies out of arm's " "reach until you can find something better." msgstr "" +"一个脆弱的长柄武器,由木棍上面绑上一个金属刺做成。不怎么锋利,制造水平不佳,但是在你找到更好的武器之前可以用来把丧尸拒于手臂的攻击范围之外。" #: lang/json/TOOL_from_json.py msgid "simple knife spear" msgid_plural "simple knife spears" -msgstr[0] "" +msgstr[0] "简易刺刀长矛" #. ~ Description for simple knife spear #: lang/json/TOOL_from_json.py @@ -64180,6 +64643,7 @@ msgid "" " take a bit more time to carefully split the shaft and attach the knife " "blade more permanently." msgstr "" +"一个脆弱的长柄武器,由木棍上面绑上一把刀制成。它的长度让你能够从较远距离攻击,但是刀绑得并不是很牢固。要是你多花一些时间,也许可以仔细劈开矛柄,然后更加持久地把刀刃固定到上面。" #: lang/json/TOOL_from_json.py msgid "knife spear" @@ -64192,7 +64656,7 @@ msgid "" "A sturdy wooden pole that has been carefully split and reinforced. At the " "split point, a sharp blade has been bolted into place and reinforced with " "layers of sturdy wrapped bindings." -msgstr "" +msgstr "一个坚固的木制长柄武器,在一端劈开并栓接了一把锋利的刀刃,并且用几层结实的材料绑稳。" #: lang/json/TOOL_from_json.py msgid "homemade halfpike" @@ -65046,7 +65510,7 @@ msgstr[0] "金属屠宰架" msgid "" "Metal butchering rack designed to hang a carcass in the air. It is folded " "for easy transportation." -msgstr "" +msgstr "一个金属屠宰架子,可以将清理内脏后的胴体悬挂在半空中。它已经被折叠起来以便携带。" #: lang/json/TOOL_from_json.py lang/json/vehicle_from_json.py msgid "inflatable boat" @@ -65076,7 +65540,7 @@ msgstr[0] "金属烟熏架" msgid "" "A metal rack designed to smoke food for better preservation and taste. It " "is folded for easy transportation." -msgstr "" +msgstr "设计用于熏制食物的金属架,可以获得更好的保存和口感。它已经被折叠起来以便携带。" #: lang/json/TOOL_from_json.py lang/json/furniture_from_json.py msgid "tourist table" @@ -65088,7 +65552,7 @@ msgstr[0] "旅行餐桌" msgid "" "Metal tourist table for off-road trips. It is folded for easy " "transportation." -msgstr "" +msgstr "一个金属制的旅行餐桌,用于野外旅行使用。它已经被折叠起来以便携带。" #: lang/json/TOOL_from_json.py lang/json/furniture_from_json.py msgid "leather tarp" @@ -66127,12 +66591,12 @@ msgstr "看上去像是些基因工程生命和操作系统,被连在一个马 #: lang/json/TOOL_from_json.py msgid "Magic Wand" msgid_plural "Magic Wands" -msgstr[0] "" +msgstr[0] "魔法杖" #: lang/json/TOOL_from_json.py msgid "minor wand of magic missile" msgid_plural "minor wand of magic missiles" -msgstr[0] "" +msgstr[0] "下级魔法飞弹法杖" #. ~ Description for minor wand of magic missile #. ~ Description for lesser wand of magic missile @@ -66141,22 +66605,22 @@ msgstr[0] "" msgid "" "A slender wooden wand with a mana crystal socket at the base that casts a " "spell when activated. This wand casts magic missile." -msgstr "" +msgstr "一根细长的木制法杖,在底端有一个魔法水晶插槽,激活时会施放一次法术。这根法杖发射的是魔法飞弹。" #: lang/json/TOOL_from_json.py msgid "lesser wand of magic missile" msgid_plural "lesser wand of magic missiles" -msgstr[0] "" +msgstr[0] "次级魔法飞弹法杖" #: lang/json/TOOL_from_json.py msgid "greater wand of magic missile" msgid_plural "greater wand of magic missiles" -msgstr[0] "" +msgstr[0] "高级魔法飞弹法杖" #: lang/json/TOOL_from_json.py msgid "minor wand of fireball" msgid_plural "minor wand of fireballs" -msgstr[0] "" +msgstr[0] "下级火球法杖" #. ~ Description for minor wand of fireball #. ~ Description for lesser wand of fireball @@ -66165,22 +66629,22 @@ msgstr[0] "" msgid "" "A slender wooden wand with a mana crystal socket at the base that casts a " "spell when activated. This wand casts fireball." -msgstr "" +msgstr "一根细长的木制法杖,在底端有一个魔法水晶插槽,激活时会施放一次法术。这根法杖发射的是火球。" #: lang/json/TOOL_from_json.py msgid "lesser wand of fireball" msgid_plural "lesser wand of fireballs" -msgstr[0] "" +msgstr[0] "次级火球法杖" #: lang/json/TOOL_from_json.py msgid "greater wand of fireball" msgid_plural "greater wand of fireballs" -msgstr[0] "" +msgstr[0] "高级火球法杖" #: lang/json/TOOL_from_json.py msgid "minor wand of mana beam" msgid_plural "minor wand of mana beams" -msgstr[0] "" +msgstr[0] "下级奥术光束法杖" #. ~ Description for minor wand of mana beam #. ~ Description for lesser wand of mana beam @@ -66189,22 +66653,22 @@ msgstr[0] "" msgid "" "A slender wooden wand with a mana crystal socket at the base that casts a " "spell when activated. This wand casts mana beam." -msgstr "" +msgstr "一根细长的木制法杖,在底端有一个魔法水晶插槽,激活时会施放一次法术。这根法杖发射的是奥术光束。" #: lang/json/TOOL_from_json.py msgid "lesser wand of mana beam" msgid_plural "lesser wand of mana beams" -msgstr[0] "" +msgstr[0] "次级奥术光束法杖" #: lang/json/TOOL_from_json.py msgid "greater wand of mana beam" msgid_plural "greater wand of mana beams" -msgstr[0] "" +msgstr[0] "高级奥术光束法杖" #: lang/json/TOOL_from_json.py msgid "minor wand of point flare" msgid_plural "minor wand of point flares" -msgstr[0] "" +msgstr[0] "下级定点炎爆法杖" #. ~ Description for minor wand of point flare #. ~ Description for lesser wand of point flare @@ -66213,22 +66677,22 @@ msgstr[0] "" msgid "" "A slender wooden wand with a mana crystal socket at the base that casts a " "spell when activated. This wand casts point flare." -msgstr "" +msgstr "一根细长的木制法杖,在底端有一个魔法水晶插槽,激活时会施放一次法术。这根法杖发射的是定点炎爆。" #: lang/json/TOOL_from_json.py msgid "lesser wand of point flare" msgid_plural "lesser wand of point flares" -msgstr[0] "" +msgstr[0] "次级定点炎爆法杖" #: lang/json/TOOL_from_json.py msgid "greater wand of point flare" msgid_plural "greater wand of point flares" -msgstr[0] "" +msgstr[0] "高级定点炎爆法杖" #: lang/json/TOOL_from_json.py msgid "minor wand of iceball" msgid_plural "minor wand of iceballs" -msgstr[0] "" +msgstr[0] "下级冰球法杖" #. ~ Description for minor wand of iceball #. ~ Description for lesser wand of iceball @@ -66237,22 +66701,22 @@ msgstr[0] "" msgid "" "A slender wooden wand with a mana crystal socket at the base that casts a " "spell when activated. This wand casts iceball." -msgstr "" +msgstr "一根细长的木制法杖,在底端有一个魔法水晶插槽,激活时会施放一次法术。这根法杖发射的是冰球。" #: lang/json/TOOL_from_json.py msgid "lesser wand of iceball" msgid_plural "lesser wand of iceballs" -msgstr[0] "" +msgstr[0] "次级冰球法杖" #: lang/json/TOOL_from_json.py msgid "greater wand of iceball" msgid_plural "greater wand of iceballs" -msgstr[0] "" +msgstr[0] "高级冰球法杖" #: lang/json/TOOL_from_json.py msgid "minor wand of cone of cold" msgid_plural "minor wand of cone of colds" -msgstr[0] "" +msgstr[0] "下级极寒喷射法杖" #. ~ Description for minor wand of cone of cold #. ~ Description for lesser wand of cone of cold @@ -66261,17 +66725,17 @@ msgstr[0] "" msgid "" "A slender wooden wand with a mana crystal socket at the base that casts a " "spell when activated. This wand casts cone of cold." -msgstr "" +msgstr "一根细长的木制法杖,在底端有一个魔法水晶插槽,激活时会施放一次法术。这根法杖发射的是极寒喷射。" #: lang/json/TOOL_from_json.py msgid "lesser wand of cone of cold" msgid_plural "lesser wand of cone of colds" -msgstr[0] "" +msgstr[0] "次级极寒喷射法杖" #: lang/json/TOOL_from_json.py msgid "greater wand of cone of cold" msgid_plural "greater wand of cone of colds" -msgstr[0] "" +msgstr[0] "高级极寒喷射法杖" #: lang/json/TOOL_from_json.py msgid "owlbear gastrolith" @@ -66303,17 +66767,17 @@ msgstr "这是一把短石凿。它可以用来在石头、木头或软金属上 #: lang/json/TOOL_from_json.py msgid "tanning black dragon hide" msgid_plural "tanning black dragon hides" -msgstr[0] "" +msgstr[0] "鞣制中的黑龙皮" #. ~ Use action msg for tanning black dragon hide. #: lang/json/TOOL_from_json.py msgid "You carefully unfold the black dragon hide and shake it clean." -msgstr "" +msgstr "你煞费苦心地展开鞣制中的黑龙皮,把它抖干净。" #. ~ Use action not_ready_msg for tanning black dragon hide. #: lang/json/TOOL_from_json.py msgid "The black dragon hide isn't done yet." -msgstr "" +msgstr "黑龙皮的鞣制尚未完成。" #. ~ Description for tanning black dragon hide #: lang/json/TOOL_from_json.py @@ -66321,12 +66785,12 @@ msgid "" "A treated black dragon hide which is undergoing the chemical processes " "required to become workable. You will be able to activate it to unroll and " "make use of it when it is done." -msgstr "" +msgstr "一张经过处理的黑龙皮,正在进行必要的化学变化以变得能够使用。当它鞣制完成后你就可以激活它以展开并使用它。" #: lang/json/TOOL_from_json.py msgid "ossified voodoo doll" msgid_plural "ossified voodoo dolls" -msgstr[0] "" +msgstr[0] "骨片巫毒娃娃" #. ~ Description for ossified voodoo doll #: lang/json/TOOL_from_json.py @@ -66334,12 +66798,12 @@ msgid "" "A remarkably accurate effigy of an undead human covered with bone, including" " pieces of organs. Necromantic magic delays immediate rot, but it won't last" " forever. Piercing it with the attached needle could compel it to serve you." -msgstr "" +msgstr "一只特别逼真的不死族人偶,覆盖着骨片,里面装有几块器官。死灵法术暂时阻止了它的腐坏,但是不会长久。用附带的针刺它会让它为你服务。" #: lang/json/TOOL_from_json.py msgid "cougar voodoo doll" msgid_plural "cougar voodoo dolls" -msgstr[0] "" +msgstr[0] "美洲狮巫毒娃娃" #. ~ Description for cougar voodoo doll #: lang/json/TOOL_from_json.py @@ -66347,7 +66811,7 @@ msgid "" "A remarkably accurate effigy of an undead cougar, complete with fur, bones, " "and organs. Necromantic magic delays immediate rot, but it won't last " "forever. Piercing it with the attached needle could compel it to serve you." -msgstr "" +msgstr "一只特别逼真的不死族美洲狮娃娃,里面装有皮毛、骨头和器官。死灵法术暂时阻止了它的腐坏,但是不会长久。用附带的针刺它会让它为你服务。" #: lang/json/TOOL_from_json.py msgid "Biomancer rune" @@ -66443,7 +66907,7 @@ msgstr[0] "灵论者符文" msgid "" "This magical pebble has an insignia of summoners on it. It is necessary for " "Animists to channel magic into their crafts." -msgstr "这块注魔的小石块上面有一个像召唤师的符号,对于将魔力导入制品的有灵论者来说必不可少" +msgstr "这块注魔的小石块上面有一个像召唤师的符号,对于将魔力导入制品的灵论者来说必不可少" #: lang/json/TOOL_from_json.py msgid "alchemist rune" @@ -66461,7 +66925,7 @@ msgstr "这块注魔的小石块上面有一个像炼金术和魔药的符号。 #: lang/json/TOOL_from_json.py msgid "finger firelighter" msgid_plural "finger firelighters" -msgstr[0] "指尖火焰" +msgstr[0] "火焰之指" #. ~ Description for finger firelighter #: lang/json/TOOL_from_json.py @@ -66473,59 +66937,59 @@ msgstr "这是一朵你可以握在手中的小火苗。只要想着火焰,你 #: lang/json/TOOL_from_json.py msgid "seed of purification" msgid_plural "seed of purifications" -msgstr[0] "" +msgstr[0] "净化之种" #. ~ Use action menu_text for seed of purification. #: lang/json/TOOL_from_json.py msgid "Squeeze seed" -msgstr "" +msgstr "挤压净化之种" #. ~ Use action msg for seed of purification. #: lang/json/TOOL_from_json.py msgid "" "You squeeze the seed in your palm, and it begins to turn to a fine dust." -msgstr "" +msgstr "你挤压掌中的种子,它们开始变成粉末。" #. ~ Description for seed of purification #: lang/json/TOOL_from_json.py msgid "" "A magical seed that can be squeezed to release purifying dust, which can " "then be used to purify up to a gallon of water" -msgstr "" +msgstr "这个魔法种子被挤压后会释放出净化粉末,能够用于净化一加仑的水。" #: lang/json/TOOL_from_json.py msgid "faintly glowing dust" msgid_plural "faintly glowing dusts" -msgstr[0] "" +msgstr[0] "微光粉末" #. ~ Description for faintly glowing dust #: lang/json/TOOL_from_json.py msgid "This fine dust glows with a growing intensity" -msgstr "" +msgstr "这些细粉发出逐渐增强的光。" #: lang/json/TOOL_from_json.py msgid "wand of fireballs" msgid_plural "wand of fireballss" -msgstr[0] "魔杖(火球)" +msgstr[0] "火球法杖" #. ~ Description for wand of fireballs #: lang/json/TOOL_from_json.py msgid "" "A classic, this wand shoots fireballs without fail. A more skilled " "Kelvinist could cast them more efficiently, though." -msgstr "这是一款经典的魔杖,它可以发射火球。不过,一个熟练的魔法师可以更有效地使用它。" +msgstr "这是一款经典的法杖,可以毫不失误地发射火球。不过,一个熟练的炽霜法师可以更有效地使用它。" #: lang/json/TOOL_from_json.py msgid "wand of magic missiles" msgid_plural "wand of magic missiless" -msgstr[0] "魔杖(魔法飞弹)" +msgstr[0] "魔法飞弹法杖" #. ~ Description for wand of magic missiles #: lang/json/TOOL_from_json.py msgid "" "A classic, this wand shoots magic missiles without fail. A more skilled " "Magus could cast them more efficiently, though." -msgstr "这是一款经典的魔杖,可以毫不失误地发射魔法飞弹。不过,更熟练的占星术士可以更有效地施放它们。" +msgstr "这是一款经典的法杖,可以毫不失误地发射魔法飞弹。不过,一个熟练的占星术士可以更有效地使用它。" #: lang/json/TOOL_from_json.py msgid "Dusk" @@ -67298,7 +67762,7 @@ msgid "" "A salvaged cyborg refitted with the head of a zombie necromancer. The " "animate head retains some of its ability to revive zombies. Activate this " "item to deploy the robot." -msgstr "一台改装的报废改造人,头部被替换成了死灵法尸的头颅。死而复生的头部保留了一些复活僵尸的能力。激活以部署该改造人。" +msgstr "一台改装的报废改造人,头部被替换成了死灵法尸的头颅。死而复生的头部保留了一些复活丧尸的能力。激活以部署该改造人。" #: lang/json/TOOL_from_json.py msgid "inactive defense robot" @@ -68636,6 +69100,10 @@ msgstr ".45-70" msgid "nails" msgstr "钉子" +#: lang/json/ammunition_type_from_json.py +msgid "barb" +msgstr "毒刺" + #: lang/json/ammunition_type_from_json.py msgid "BBs" msgstr "BB弹" @@ -68820,7 +69288,7 @@ msgstr "5x50mm 镖形弹" #: lang/json/ammunition_type_from_json.py msgid "powdered calcium carbide premix" -msgstr "" +msgstr "电石原料混合粉末" #: lang/json/ammunition_type_from_json.py msgid "ferrous rail projectile" @@ -68843,8 +69311,8 @@ msgid "components" msgstr "组件" #: lang/json/ammunition_type_from_json.py -msgid "93mm RPG-7" -msgstr "93mm RPG-7 弹" +msgid "RPG-7 rocket" +msgstr "RPG-7 火箭弹" #: lang/json/ammunition_type_from_json.py msgid "rebreather filter" @@ -68896,7 +69364,7 @@ msgstr "半焦燃料" #: lang/json/ammunition_type_from_json.py msgid "partially burned calcium carbide" -msgstr "" +msgstr "电石(未反应完全)" #: lang/json/ammunition_type_from_json.py msgid "sprayable chemical" @@ -68974,18 +69442,7 @@ msgid "" "cost of energy. Bullets will be stopped more often than melee weapons and " "those in turn more often than massive objects." msgstr "" - -#: lang/json/bionic_from_json.py -msgid "Advanced Microreactor System" -msgstr "高级小型核反应堆系统" - -#. ~ Description for Advanced Microreactor System -#: lang/json/bionic_from_json.py -msgid "" -"This stripped down mini-reactor is more efficient and safer than the base " -"model due to integrated radiation cleansers. There is no way to shut it " -"down once active, but you can toggle additional fuel intake." -msgstr "" +"当该系统激活时,一层护盾会围绕你的身体,并持续消耗能量。对你的任何攻击,均会被这层护盾格挡或偏移并消耗能量。子弹比近战武器更容易被格挡,而近战武器比更巨大的物体容易被格挡。" #: lang/json/bionic_from_json.py msgid "Alarm System" @@ -69016,7 +69473,7 @@ msgid "" "The flesh on your arms has been surgically replaced by alloy plating. " "Provides passive protection and can be used in conjunction with bionic " "martial arts." -msgstr "" +msgstr "你的手臂的皮肤被手术替换成了合金装甲,提供防护并可用于生化武术。" #: lang/json/bionic_from_json.py msgid "Protective Lenses" @@ -69039,7 +69496,7 @@ msgstr "合金装甲-头部" msgid "" "The flesh on your head has been surgically replaced by alloy plating, " "protecting both your head and jaw regions." -msgstr "" +msgstr "你的头部的皮肤被手术替换成了合金装甲,对你的头部和下颌提供防护。" #: lang/json/bionic_from_json.py msgid "Alloy Plating - Legs" @@ -69051,7 +69508,7 @@ msgid "" "The flesh on your legs has been surgically replaced by alloy plating. " "Provides passive protection and can be used in conjunction with bionic " "martial arts." -msgstr "" +msgstr "你的腿部的皮肤被手术替换成了合金装甲,提供防护并可用于生化武术。" #: lang/json/bionic_from_json.py msgid "Alloy Plating - Torso" @@ -69062,7 +69519,7 @@ msgstr "合金装甲-躯干" msgid "" "The flesh on your torso has been surgically replaced by alloy plating, " "protecting it from physical trauma." -msgstr "" +msgstr "你躯干的皮肤被手术替换成了合金装甲,用于防御物理损伤。" #: lang/json/bionic_from_json.py msgid "Battery System" @@ -69074,7 +69531,7 @@ msgid "" "You have a battery draining attachment, and thus can make use of the energy " "contained in normal, everyday batteries. Use 'E' to drain charge from a " "battery. Can be toggled on and off at will." -msgstr "" +msgstr "你体内装有一个电池系统,能够使用存储在普通电池内的电力。按“E”键来使用电池。可以自由开关。" #: lang/json/bionic_from_json.py msgid "Monomolecular Blade" @@ -69098,7 +69555,7 @@ msgstr "霰弹枪臂" msgid "" "Concealed in your left arm is a single shot 12 gauge shotgun. Activate the " "bionic to fire and reload the shotgun." -msgstr "" +msgstr "你的左臂中隐藏着一只 12 号口径单发霰弹枪。激活这个生化插件以发射并装填该霰弹枪。" #: lang/json/bionic_from_json.py msgid "Optical Dampers" @@ -69146,7 +69603,7 @@ msgstr "电缆充电器" msgid "" "You have a complex port surgically mounted above your hip. While active, it" " will recharge bionic power when connected to a battery via jumper cable." -msgstr "" +msgstr "你的臀部上方通过手术安装了一个复杂的接口,启动后可以通过跨接电缆与电池连接并恢复生化能量。" #: lang/json/bionic_from_json.py msgid "Subdermal Carbon Filament" @@ -69195,7 +69652,7 @@ msgstr "恒温机" msgid "" "Throughout your body lies a network of thermal piping, which eases the " "effects of high and low ambient temperatures when activated." -msgstr "" +msgstr "在你的体内设有一个热气管网,启动后它可以轻易的影响周围环境温度的高低。" #: lang/json/bionic_from_json.py msgid "Cloaking System" @@ -69222,6 +69679,7 @@ msgid "" "module will improve your hand to hand combat skills, but prevents you from " "improving them through combat experience." msgstr "" +"你的神经系统经过手术植入了一块存储有海量武术程序的数据库和处理器。当这个近战模块开启时,它可以提升你的徒手格斗技能,但是将会使你无法从战斗中获得经验。" #: lang/json/bionic_from_json.py msgid "Bionic-Induced Deformity" @@ -69325,7 +69783,7 @@ msgid "" "Surgically mounted in the palm of your hand are small parabolic EMP field " "generators. You may use power to fire a wide, but short-ranged blast which " "will disable electronics and robots." -msgstr "" +msgstr "你的掌心经过手术被嵌入了一只小型抛物式EMP发射器。你能够使用生化能量发射短距离的EMP冲击,瘫痪电子器械和机器人。" #: lang/json/bionic_from_json.py lang/json/gun_from_json.py #: lang/json/gun_from_json.py @@ -69341,6 +69799,7 @@ msgid "" "to aim. Extremely effective against electronic targets but mostly useless " "otherwise." msgstr "" +"一套远程电磁脉冲发生器系统植入到了你的右臂和右手下。这套系统能发射精准的单目标脉冲,需要时间瞄准。对电子目标特别有效,但对其它目标没什么作用。" #: lang/json/bionic_from_json.py msgid "Ethanol Burner" @@ -69545,7 +70004,7 @@ msgstr "红外视觉" msgid "" "Your range of vision extends into the infrared, allowing you to see warm-" "blooded creatures in the dark or through smoke." -msgstr "" +msgstr "你的视觉扩展到了红外波段,使你能在黑暗中或透过烟雾看见恒温生物。" #: lang/json/bionic_from_json.py msgid "Cerebral Booster" @@ -69631,7 +70090,7 @@ msgid "" "Surgically embedded in your right hand is a powerful electromagnet, allowing" " you to indiscriminately pull all nearby magnetic objects towards you. " "Unlucky bystanders might be injured or killed by flying objects." -msgstr "" +msgstr "你的右手被手术植入了一个强力电磁铁,使你能够无差别的吸引周围所有磁性物品。不明真相的围观群众可能会被到处乱飞的物品击伤甚至击毙。" #: lang/json/bionic_from_json.py msgid "Nictating Membrane" @@ -69668,7 +70127,7 @@ msgstr "代谢供能" msgid "" "Your digestive system and power supply are interconnected; bionic energy is " "replenished by burning calories. Can be toggled on and off at will." -msgstr "" +msgstr "你的消化系统和生化能量系统被连接到了一起,可以通过消耗卡路里来恢复生化能量。可以随意开关。" #: lang/json/bionic_from_json.py msgid "Weather Reader" @@ -69680,7 +70139,7 @@ msgid "" "A multitude of scientific instruments and sensors collect environmental " "data. The data is compiled and presented as a simple readout of the current" " weather. It also passively tells you the local air temperature." -msgstr "" +msgstr "一堆科学装置和感应器的集合。用来收集周围环境的数据,这些数据随后将会被分析并汇总成为易于读取的天气情况报告。它还可随时显示周围的环境温度。" #: lang/json/bionic_from_json.py msgid "Repair Nanobots" @@ -69692,7 +70151,7 @@ msgid "" "Inside your body is a fleet of tiny dormant robots. While activated they " "will flit about your body, repairing damage at 1 HP/s and stopping bleeding " "at the cost of power." -msgstr "" +msgstr "你体内有一群微型纳米机器人。开启时会不断消耗能量,并绕行你的周身,以 1 HP 每秒的速度修复伤害以及止血。" #: lang/json/bionic_from_json.py msgid "Artificial Night Generator" @@ -69707,7 +70166,7 @@ msgstr "植入式夜视仪" msgid "" "When active, this bionic will amplify existing light, allowing you to see in" " the dark." -msgstr "" +msgstr "这个生化插件启用时可以通过放大微弱光线来增强你的夜视能力。" #. ~ Description for Noisemaker #: lang/json/bionic_from_json.py @@ -69733,7 +70192,7 @@ msgid "" "A thin forcefield surrounds your body, continually draining power. This " "field does not deflect attacks, but rather delivers a strong shock, damaging" " unarmed attackers and those with a conductive weapon." -msgstr "" +msgstr "当该系统激活时,一层护盾会围绕你的身体并持续消耗能量。这层护盾不会格挡或偏移任何攻击,但是会电击徒手或使用金属武器攻击你的目标。" #: lang/json/bionic_from_json.py msgid "Sensory Dulling" @@ -69747,34 +70206,12 @@ msgid "" "may cause delayed reaction time and drowsiness." msgstr "你的神经系统经过生化改造,可让你大幅度抑制痛苦及抑制各类感官输入。不过,使用该系统可能会导致反应迟钝和嗜睡等症状。" -#: lang/json/bionic_from_json.py -msgid "Plutonium Filter" -msgstr "钚过滤器" - -#. ~ Description for Plutonium Filter -#: lang/json/bionic_from_json.py -msgid "" -"This set of tanks and filters allows you to extract plutonium from " -"radioactive slurry." -msgstr "" - -#: lang/json/bionic_from_json.py -msgid "Plutonium Purger" -msgstr "钚清除器" - -#. ~ Description for Plutonium Purger -#: lang/json/bionic_from_json.py -msgid "" -"Triggers an emergency reactor fuel purge that ejects all fuel from your " -"reactor." -msgstr "" - #. ~ Description for Bionic Visual Impairment #: lang/json/bionic_from_json.py msgid "" "Due to a badly misplaced dielectric stylette, you are now suffering from " "mild optic neuropathy. Increases eye encumbrance by one." -msgstr "" +msgstr "由于一次严重的生化插件安装失误,你现在患有轻度视神经病变。眼部累赘+1。" #: lang/json/bionic_from_json.py msgid "Power Armor Interface" @@ -69785,7 +70222,7 @@ msgstr "动力装甲接口" msgid "" "Interfaces your power system with the internal charging port on suits of " "power armor, allowing them to draw from your bionic power banks." -msgstr "" +msgstr "你可以使用自身的生化能量供给动力装甲使用,而不再需要外接电源。" #: lang/json/bionic_from_json.py msgid "Power Armor Interface Mk. II" @@ -69797,7 +70234,7 @@ msgid "" "Interfaces your power system with the internal charging port on suits of " "power armor, allowing them to draw from your bionic power banks. Twice as " "efficient as the Mk. I model." -msgstr "" +msgstr "你可以使用自身的生化能量供给动力装甲使用,而不再需要外接电源。这个型号的效率是 Mk. I 型的两倍。" #: lang/json/bionic_from_json.py msgid "Power Storage" @@ -69810,6 +70247,8 @@ msgid "" "Having at least one of these is a prerequisite to using powered bionics. " "You will also need a power supply, found in various CBMs." msgstr "" +"小型生化电池插件,可以为你增加 100 " +"点生化能量储备上限。你至少需要一个储能模块才能使用耗能型生化插件,同时你还需要至少一种供能型生化插件,为自己充能。" #: lang/json/bionic_from_json.py msgid "Power Storage Mk. II" @@ -69819,7 +70258,7 @@ msgstr "储能模块Mk.II型" #: lang/json/bionic_from_json.py msgid "" "A Compact Bionics Module that increases your power capacity by 250 units." -msgstr "" +msgstr "小型生化电池插件,可以为你增加 250 点生化能量储备上限。" #. ~ Description for Power Overload #: lang/json/bionic_from_json.py @@ -69852,7 +70291,7 @@ msgid "" "Surgically implanted in your trachea is an advanced filtration system. If " "toxins, or airborne diseases find their way into your windpipe, the filter " "will attempt to remove them." -msgstr "" +msgstr "你的气管经过手术被植入了一套先进的空气过滤系统。不管进入你气管的是毒气还是空气传播病菌,这个过滤器都会尝试将其过滤。" #: lang/json/bionic_from_json.py msgid "Radiation Scrubber System" @@ -69887,19 +70326,7 @@ msgstr "指尖剃刀" msgid "" "You possess razor-sharp claws underneath your fingernails that do a small " "amount of unarmed slashing damage whenever your fingertips are uncovered." -msgstr "" - -#: lang/json/bionic_from_json.py -msgid "Microreactor System" -msgstr "小型核反应堆装置" - -#. ~ Description for Microreactor System -#: lang/json/bionic_from_json.py -msgid "" -"This stripped down mini-reactor generates impressive amounts of bionic " -"power. There is no way to shut it down, but you can toggle additional fuel " -"intake. Irradiates your body when active." -msgstr "" +msgstr "在你的指甲之下有着锋利的爪子,可以在你的指尖没有被覆盖时造成轻微的斩击伤害。" #: lang/json/bionic_from_json.py msgid "Recycler Unit" @@ -69934,7 +70361,7 @@ msgid "" "Your entire body may resonate at very high power, creating a short-range " "shockwave. While it will not do much damage to creatures, solid objects " "such as walls and doors will be damaged." -msgstr "" +msgstr "你的全身在极高的能量下产生共振,制造出一个短距离冲击波。虽然无法对生物造成多少伤害,但是会损坏坚硬的物体,例如墙和门。" #: lang/json/bionic_from_json.py msgid "Olfactory Mask" @@ -69957,7 +70384,7 @@ msgid "" "While this system is powered, you're able to visually sense your own scent, " "making it possible for you to recognize your surroundings even in complete " "darkness." -msgstr "" +msgstr "当该系统激活时,你可以使你的嗅觉形象化,使你即使在完全的黑暗当中也能识别出周围的环境。" #. ~ Description for Bionic Short Circuit #: lang/json/bionic_from_json.py @@ -70061,7 +70488,7 @@ msgid "" "A system of surgical grade scalpels is implanted on your fingers. They " "allow you to make automated precise cuts and can also be used as a high-" "quality butchering tool." -msgstr "" +msgstr "你的手指经过手术被嵌入了一组外科手术刀。这让你能够进行全自动的精确切割。它也可以作为高级屠宰工具使用。" #: lang/json/bionic_from_json.py msgid "Anti-Glare Compensators" @@ -70131,7 +70558,7 @@ msgid "" "Surgically implanted in your hands and fingers is a set of tools - " "screwdriver, hammer, wrench, hacksaw, hand drill, welder, and heating " "elements. You can use this in place of many tools when crafting." -msgstr "" +msgstr "你的手掌和手指经过手术被植入了一整套工具,包括螺丝刀、锤子、扳手、钢锯、手钻、电焊以及加热元件,可以在制作物品时替代对应工具。" #: lang/json/bionic_from_json.py msgid "Extended Toolset" @@ -70142,7 +70569,7 @@ msgstr "军手扩展" msgid "" "Extend or withdraw your integrated toolset to cut metal, pry things, or " "other stuff. This takes up your hands." -msgstr "" +msgstr "展开或收回瑞士军手以切割金属、撬门或做其他工作。该行动会占据你的双手。" #: lang/json/bionic_from_json.py msgid "Joint Torsion Ratchet" @@ -70154,7 +70581,7 @@ msgid "" "Your joints have been surgically equipped with torsion ratchets that slowly " "generate power when you move. Whilst this is toggled, moving will require " "more effort, though more power will be generated." -msgstr "" +msgstr "你的关节处被植入了齿轮发电机,当你移动时可以缓慢的产生能量。当开启该模块时,移动需要花费更多时间,但能产生更多生化能量。" #: lang/json/bionic_from_json.py msgid "Joint Servo" @@ -70197,7 +70624,7 @@ msgstr "体内整合供能系统" msgid "" "You have a Unified Power System wired into your power banks. Objects that " "run on a UPS can now draw directly from your bionic power supply." -msgstr "" +msgstr "你的能量槽嵌入了UPS系统。使用UPS的物品现在可以直接使用你的生化能源了。" #. ~ Description for Voice Remodulator #: lang/json/bionic_from_json.py @@ -70206,6 +70633,8 @@ msgid "" "to why you don't opt for the Autodoc's 'Cyborg Identity Package'. A " "remodulator unit jammed down your throat has given you a creepy robot voice." msgstr "" +"你的余生将可能是一个为什么不选择全自动医疗仪的\"改造人身份套餐\"的活生生的反面教材了。一个安装失败又卡在你喉咙里的变声器,使你的声音变成了令人毛骨悚然的机械音。" +" " #: lang/json/bionic_from_json.py msgid "Internal Chronometer" @@ -70284,7 +70713,7 @@ msgid "" "yet sophisticated analyzer is installed in the cavity of your skull. The " "active bionic will nullify the taste of all comestibles with negative " "enjoyment value at the cost of draining bionic power." -msgstr "" +msgstr "你的嘴里被安装了一套高度敏感的传感器,头骨腔中安装了一个小而精密的分析仪。开启后将消耗生化能量使所有难吃的食物不再具有负面心情效果。" #: lang/json/bionic_from_json.py msgid "Soporific Induction" @@ -70298,6 +70727,52 @@ msgid "" "artificial but effective sensation of fatigue." msgstr "一个电极被植入你大脑的前额叶。每当你试图入睡时,它就会启动,产生一种人造但有效的疲劳感。" +#: lang/json/bionic_from_json.py +msgid "Advanced Microreactor System" +msgstr "高级小型核反应堆系统" + +#. ~ Description for Advanced Microreactor System +#: lang/json/bionic_from_json.py +msgid "" +"This stripped down mini-reactor is more efficient and safer than the base " +"model due to integrated radiation cleansers. There is no way to shut it " +"down once active, but you can toggle additional fuel intake." +msgstr "这个小型核反应堆相较于低级版更加安全高效,自带核辐射防护。一旦开启,没有任何手段能够停止它内部的核反应,但至少你能控制燃料棒的输入。" + +#: lang/json/bionic_from_json.py +msgid "Plutonium Filter" +msgstr "钚过滤器" + +#. ~ Description for Plutonium Filter +#: lang/json/bionic_from_json.py +msgid "" +"This set of tanks and filters allows you to extract plutonium from " +"radioactive slurry." +msgstr "可以从核废料中提取钚元素的过滤装置。" + +#: lang/json/bionic_from_json.py +msgid "Plutonium Purger" +msgstr "钚清除器" + +#. ~ Description for Plutonium Purger +#: lang/json/bionic_from_json.py +msgid "" +"Triggers an emergency reactor fuel purge that ejects all fuel from your " +"reactor." +msgstr "触发紧急核燃料清除程序,将你的小型核反应堆燃料全部清除。" + +#: lang/json/bionic_from_json.py +msgid "Microreactor System" +msgstr "小型核反应堆装置" + +#. ~ Description for Microreactor System +#: lang/json/bionic_from_json.py +msgid "" +"This stripped down mini-reactor generates impressive amounts of bionic " +"power. There is no way to shut it down, but you can toggle additional fuel " +"intake. Irradiates your body when active." +msgstr "这个小型核反应堆能够产生海量的生化能量,但没有任何手段能将其关闭,不过至少你能控制钚燃料棒的输入。开启时会对你的身体产生辐射。" + #: lang/json/bionic_from_json.py msgid "Internal Furnace" msgstr "内燃锅炉" @@ -70423,8 +70898,7 @@ msgstr "闪避和近战攻击受到了限制。" #: lang/json/bodypart_from_json.py src/armor_layers.cpp src/character.cpp #: src/debug_menu.cpp msgid "Torso" -msgid_plural "Torso" -msgstr[0] "躯干" +msgstr "躯干" #. ~ Crafting recipes subcategory of 'ARMOR' category #: lang/json/bodypart_from_json.py lang/json/recipe_category_from_json.py @@ -70443,8 +70917,7 @@ msgstr "头部" #: lang/json/bodypart_from_json.py src/armor_layers.cpp src/character.cpp #: src/debug_menu.cpp msgid "Head" -msgid_plural "Head" -msgstr[0] "头部" +msgstr "头部" #. ~ Crafting recipes subcategory of 'ARMOR' category #: lang/json/bodypart_from_json.py lang/json/recipe_category_from_json.py @@ -70466,8 +70939,7 @@ msgstr "远程攻击受到了限制。" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "Eyes" -msgid_plural "Eyes" -msgstr[0] "眼部" +msgstr "眼部" #: lang/json/bodypart_from_json.py msgid "mouth" @@ -70484,8 +70956,7 @@ msgstr "跑得变慢了。" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "Mouth" -msgid_plural "Mouth" -msgstr[0] "嘴部" +msgstr "嘴部" #: lang/json/bodypart_from_json.py msgid "left arm" @@ -70496,14 +70967,26 @@ msgctxt "bodypart_accusative" msgid "left arm" msgstr "左臂" +#: lang/json/bodypart_from_json.py +msgid "arms" +msgstr "手臂" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "arms" +msgstr "手臂" + #: lang/json/bodypart_from_json.py msgid "Melee and ranged combat is hampered." msgstr "近战和远程攻击都受到了限制。" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Arm" -msgid_plural "Arms" -msgstr[0] "左臂" +msgstr "左臂" + +#: lang/json/bodypart_from_json.py +msgid "Arms" +msgstr "手臂" #: lang/json/bodypart_from_json.py msgid "L ARM" @@ -70520,8 +71003,7 @@ msgstr "右臂" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Arm" -msgid_plural "Arms" -msgstr[0] "右臂" +msgstr "右臂" #: lang/json/bodypart_from_json.py msgid "R ARM" @@ -70536,14 +71018,26 @@ msgctxt "bodypart_accusative" msgid "left hand" msgstr "左手" +#: lang/json/bodypart_from_json.py +msgid "hands" +msgstr "手掌" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "hands" +msgstr "手掌" + #: lang/json/bodypart_from_json.py msgid "Manual tasks are slowed." msgstr "制作工作变慢了。" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Hand" -msgid_plural "Hands" -msgstr[0] "左手" +msgstr "左手" + +#: lang/json/bodypart_from_json.py +msgid "Hands" +msgstr "手掌" #: lang/json/bodypart_from_json.py msgid "right hand" @@ -70556,8 +71050,7 @@ msgstr "右手" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Hand" -msgid_plural "Hands" -msgstr[0] "右手" +msgstr "右手" #: lang/json/bodypart_from_json.py msgid "left leg" @@ -70568,14 +71061,26 @@ msgctxt "bodypart_accusative" msgid "left leg" msgstr "左腿" +#: lang/json/bodypart_from_json.py +msgid "legs" +msgstr "腿部" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "legs" +msgstr "腿部" + #: lang/json/bodypart_from_json.py msgid "Running and swimming are slowed." msgstr "跑步和游泳都变慢了。" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Leg" -msgid_plural "Legs" -msgstr[0] "左腿" +msgstr "左腿" + +#: lang/json/bodypart_from_json.py +msgid "Legs" +msgstr "腿部" #: lang/json/bodypart_from_json.py msgid "L LEG" @@ -70592,8 +71097,7 @@ msgstr "右腿" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Leg" -msgid_plural "Legs" -msgstr[0] "右腿" +msgstr "右腿" #: lang/json/bodypart_from_json.py msgid "R LEG" @@ -70608,10 +71112,22 @@ msgctxt "bodypart_accusative" msgid "left foot" msgstr "左脚" +#: lang/json/bodypart_from_json.py +msgid "feet" +msgstr "脚掌" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "feet" +msgstr "脚掌" + #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Foot" -msgid_plural "Feet" -msgstr[0] "左脚" +msgstr "左脚" + +#: lang/json/bodypart_from_json.py +msgid "Feet" +msgstr "脚掌" #: lang/json/bodypart_from_json.py msgid "right foot" @@ -70624,13 +71140,11 @@ msgstr "右脚" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Foot" -msgid_plural "Feet" -msgstr[0] "右脚" +msgstr "右脚" #: lang/json/bodypart_from_json.py msgid "appendix" -msgid_plural "Appendices" -msgstr[0] "附肢" +msgstr "附肢" #: lang/json/bodypart_from_json.py msgctxt "bodypart_accusative" @@ -70641,6 +71155,10 @@ msgstr "附肢" msgid "It's inflamed." msgstr "发炎了。" +#: lang/json/bodypart_from_json.py +msgid "Appendices" +msgstr "附肢" + #: lang/json/clothing_mod_from_json.py msgid "Pad with leather" msgstr "增加皮革衬里" @@ -71454,19 +71972,19 @@ msgstr "建造黏土砖墙" #: lang/json/construction_from_json.py msgid "Extrude Resin Lattice" -msgstr "" +msgstr "建造树脂格栅" #: lang/json/construction_from_json.py msgid "Extrude Resin Wall" -msgstr "" +msgstr "建造树脂墙" #: lang/json/construction_from_json.py msgid "Extrude Resin Floor and Roof" -msgstr "" +msgstr "建造树脂地板和屋顶" #: lang/json/construction_from_json.py msgid "Extrude Resin Floor (no roof)" -msgstr "" +msgstr "建造树脂地板(无屋顶)" #: lang/json/construction_from_json.py msgid "Build Pine Lean-To" @@ -71486,7 +72004,7 @@ msgstr "挖一个深坑" #: lang/json/construction_from_json.py msgid "Build Arc Furnace" -msgstr "" +msgstr "建造电弧炉" #: lang/json/construction_from_json.py msgid "Convert Fridge Power Supply" @@ -71526,7 +72044,7 @@ msgstr "建造水培单元" #: lang/json/construction_from_json.py msgid "Build Hydroponics Heater" -msgstr "" +msgstr "建造水培加热器" #: lang/json/construction_from_json.py msgid "Build Translocator Gate" @@ -72370,7 +72888,7 @@ msgstr "在梦中你的心被野兽般的饥饿感占据,驱使你追逐着什 #: lang/json/dream_from_json.py msgid "Recollections of stalking a human shakes you awake." -msgstr "迷迷糊糊中你好像变成了僵尸在尾随一个活人,这把你吓醒了。" +msgstr "迷迷糊糊中你好像变成了丧尸在尾随一个活人,这把你吓醒了。" #: lang/json/dream_from_json.py msgid "You dream of tearing into more and more enemies." @@ -73722,12 +74240,12 @@ msgstr "流感治愈了。" #: lang/json/effects_from_json.py msgid "Vaccinated" -msgstr "" +msgstr "已免疫" #. ~ Description of effect 'Vaccinated'. #: lang/json/effects_from_json.py msgid "You have been vaccinated for the flu recently." -msgstr "" +msgstr "你最近打了流感疫苗。" #: lang/json/effects_from_json.py msgid "RX12 Healing Comedown" @@ -73944,14 +74462,14 @@ msgstr "你喝太多酒了。已经是世界末日了。你还有什么好在乎 #: lang/json/effects_from_json.py msgid "Dead Drunk" -msgstr "" +msgstr "烂醉如泥" #. ~ Description of effect 'Dead Drunk'. #: lang/json/effects_from_json.py msgid "" "You embalmed yourself alive with so much alcohol, that even zombies will " "leave your dead body alone." -msgstr "" +msgstr "你给自己灌了太多的酒,现在连丧尸都以为你已经死了。" #. ~ Miss message for effect(s) 'Tipsy, Drunk, Trashed, Wasted, Dead Drunk'. #. ~ Miss message for effect(s) 'Depressants'. @@ -74093,12 +74611,12 @@ msgstr "你醒来了。" #: lang/json/effects_from_json.py msgid "Under operation" -msgstr "" +msgstr "手术中" #. ~ Description of effect 'Under operation'. #: lang/json/effects_from_json.py msgid "You are being operated on. Try to stay still." -msgstr "" +msgstr "你正在接受手术,不要乱动!" #: lang/json/effects_from_json.py msgid "Playing an instrument" @@ -74774,7 +75292,7 @@ msgstr "你速度的回到正常水平。" #. ~ Description of effect 'Synaptic Stimulation'. #: lang/json/effects_from_json.py msgid "Your mental processing is increased." -msgstr "" +msgstr "你的思维变得更加敏捷了。" #. ~ Apply message for effect(s) 'Synaptic Stimulation'. #: lang/json/effects_from_json.py @@ -74784,7 +75302,7 @@ msgstr "你的思维加速。" #. ~ Remove message for effect(s) 'Synaptic Stimulation'. #: lang/json/effects_from_json.py msgid "Your mind returns to normal speed." -msgstr "" +msgstr "你的思维恢复到了正常状态。" #. ~ Description of effect 'Ogre's Strength'. #: lang/json/effects_from_json.py @@ -75485,12 +76003,12 @@ msgstr "憎恨每个人的突变蜜蜂。" #: lang/json/faction_from_json.py msgid "Isherwood family" -msgstr "" +msgstr "伊舍伍德家族" #. ~ Description for Isherwood family #: lang/json/faction_from_json.py msgid "A small family surviving on their generational land." -msgstr "" +msgstr "一个世代生存在同一片土地的小家族。" #: lang/json/faction_from_json.py msgid "God's Community" @@ -75537,12 +76055,12 @@ msgstr[0] "人类" #: lang/json/fault_from_json.py msgid ": already deployed" -msgstr "" +msgstr ":已被安装" #. ~ Description for : already deployed #: lang/json/fault_from_json.py msgid "This bionic needs to be reset to its factory state." -msgstr "" +msgstr "这个生化插件需要被恢复到出厂设置。" #: lang/json/fault_from_json.py msgid "blackpowder fouling" @@ -76061,27 +76579,27 @@ msgstr "热空气4" #: lang/json/field_type_from_json.py msgid "fungicidal mist" -msgstr "" +msgstr "抗真菌薄雾" #: lang/json/field_type_from_json.py msgid "fungicidal haze" -msgstr "" +msgstr "抗真菌喷雾" #: lang/json/field_type_from_json.py msgid "thick fungicidal haze" -msgstr "" +msgstr "抗真菌浓雾" #: lang/json/field_type_from_json.py msgid "insecticidal mist" -msgstr "" +msgstr "杀虫剂薄雾" #: lang/json/field_type_from_json.py msgid "insecticidal haze" -msgstr "" +msgstr "杀虫剂喷雾" #: lang/json/field_type_from_json.py msgid "thick insecticidal haze" -msgstr "" +msgstr "杀虫剂浓雾" #: lang/json/field_type_from_json.py msgid "smoke vent" @@ -76950,11 +77468,11 @@ msgstr "金属炭窑(满)" msgid "" "An arc furnace designed to burn a powdery mix of coke and limestone to " "create calcium carbide." -msgstr "" +msgstr "一个用于煅烧粉末状焦炭石灰混合物来制取电石的电弧炉。" #: lang/json/furniture_from_json.py msgid "filled arc furnace" -msgstr "" +msgstr "电弧炉(满)" #: lang/json/furniture_from_json.py msgid "robotic arm" @@ -78350,12 +78868,12 @@ msgstr "一个有扶手的背靠椅,相比于小椅子更加舒适。" #: lang/json/furniture_from_json.py msgid "airplane seat" -msgstr "" +msgstr "飞机座位" #. ~ Description for airplane seat #: lang/json/furniture_from_json.py msgid "An airplane seat with a seatbelt." -msgstr "" +msgstr "装着安全带的飞机座位。" #: lang/json/furniture_from_json.py msgid "chair" @@ -78702,7 +79220,7 @@ msgstr "一种由纤维材料编织而成的大垫子,可代替野餐毯,但 msgid "" "Small metal folding table, ideal for off-road trips into the wild. Can be " "used as a workbench in a pinch." -msgstr "" +msgstr "一个小型金属可折叠餐桌,适合野外郊游时使用。紧急情况下可以当作工作台。" #. ~ Description for vehicle refrigerator #: lang/json/furniture_from_json.py @@ -78773,12 +79291,12 @@ msgstr "这是一个独立的水培单元,用于在室内种植蔬菜。可收 #: lang/json/furniture_from_json.py msgid "hydroponics heater" -msgstr "" +msgstr "水培加热器" #. ~ Description for hydroponics heater #: lang/json/furniture_from_json.py msgid "This is a self-contained heater, used to warm hydroponics units." -msgstr "" +msgstr "这是一个独立的水培加热器,用于加热水培单元。" #: lang/json/furniture_from_json.py msgid "Translocator Gate" @@ -78793,14 +79311,14 @@ msgstr "易位门。施放易位咒语或使用易位者选择此门作为目的 #: lang/json/furniture_from_json.py msgid "Magic Circle" -msgstr "" +msgstr "魔法阵" #. ~ Description for Magic Circle #: lang/json/furniture_from_json.py msgid "" "This is a rough magic circle, carved into the ground and decorated with " "blood, candles, and other small knick-knacks." -msgstr "" +msgstr "这是一个刻在地上的魔法阵,上面装饰着血液、蜡烛以及其它小物件。" #: lang/json/furniture_from_json.py msgid "krash!" @@ -79234,7 +79752,9 @@ msgid "" "this weapon have a good chance of remaining intact for re-use." msgstr "一个小巧的单手弩。由于其体型小,故威力及拉力均不高,不过相当适用于猎杀小动物。手弩射出的弩矢不易损坏,有很高的几率回收。" -#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py src/item.cpp +#: lang/json/gun_from_json.py lang/json/gun_from_json.py +#: lang/json/gunmod_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gunmod_from_json.py src/item.cpp msgctxt "gun_type_type" msgid "pistol" msgstr "手枪" @@ -79323,13 +79843,13 @@ msgstr "一个用于同时能够远程攻击与远距攻击的测试用长弓。 #: lang/json/gun_from_json.py msgid "mi-go bio-gun" msgid_plural "mi-go bio-guns" -msgstr[0] "" +msgstr[0] "米·戈生化枪" #: lang/json/gun_from_json.py msgid "" "Fake gun that fires some sort of solidified organic matter at very high " "speed by unknown means of propulsion." -msgstr "" +msgstr "一把假枪,通过未知的推进方式以极高的速度发射出某种固体有机物。" #: lang/json/gun_from_json.py msgid "spraycan flamethrower" @@ -79345,6 +79865,19 @@ msgid "" msgstr "" "街头混混最爱的武器之一,这个连接在喷漆罐上的点火器或许对使用者来说和其他人一样危险。喷嘴被简陋的处理来分散汽油,一个小的气泵连接在旁边用来很方便的补充气压,虽然这个过程要好几分钟。" +#: lang/json/gun_from_json.py +msgid "simple flamethrower" +msgid_plural "simple flamethrowers" +msgstr[0] "简易火焰喷射器" + +#: lang/json/gun_from_json.py +msgid "" +"A simple, home-made flamethrower. While its capacity is not superb, it is " +"more than capable of igniting terrain and monsters alike." +msgstr "" +"一架简易、自制的火焰喷射器,尽管燃料容量有限,也可以用来做焚烧工作。\n" +"\"香喷喷的烤全羊……不,烤全尸出炉喽!\"" + #: lang/json/gun_from_json.py msgid "BB gun" msgid_plural "BB guns" @@ -79448,7 +79981,7 @@ msgstr "" #: lang/json/gun_from_json.py msgid "PPA-5" msgid_plural "PPA-5s" -msgstr[0] "" +msgstr[0] "PPA-5" #: lang/json/gun_from_json.py msgid "" @@ -79458,6 +79991,7 @@ msgid "" "It was designed to take down heavy vehicles, and was expected to fully enter" " US Army service not long before the Cataclysm." msgstr "" +"便携式等离子加速器5型(PPA-5),由洛克希德·马丁公司研发。这种设备通过高度先进的电容器组产生一个环状的过热氢等离子体,并且将其加速到难以置信的速度。它被设计用于破坏重型载具,本来预计在大灾变前不久开始在美军中大规模部署。" #: lang/json/gun_from_json.py msgid "pipe combination gun" @@ -79901,6 +80435,19 @@ msgstr "" "詹宁斯J-" "22手枪作为一种典型的\"小型廉价手枪\",其价格十分经济实惠。为了填补小型袖珍手枪被禁止进口后的空白市场,这些手枪常被不在意其安全性的罪犯使用。" +#: lang/json/gun_from_json.py +msgid "Walther P22" +msgid_plural "Walther P22s" +msgstr[0] "瓦尔特 P22 手枪" + +#: lang/json/gun_from_json.py +msgid "" +"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" +msgstr "" +"瓦尔特 P22 手枪是一种采用反冲式枪机的半自动手枪,和其他瓦尔特手枪相比只有一半的大小。基本由塑料制造,只有套筒和一些关键部件由锌合金压铸而成。" + #: lang/json/gun_from_json.py msgid "Remington ACR" msgid_plural "Remington ACRs" @@ -80317,7 +80864,7 @@ msgstr "一个生锈的机匣,一根R700步枪的枪管,外加破了一半 #: lang/json/gun_from_json.py msgid "Remington ACR .300BLK" msgid_plural "Remington ACR .300BLKs" -msgstr[0] "" +msgstr[0] "雷明顿 ACR .300 BLK 突击步枪" #: lang/json/gun_from_json.py msgid "" @@ -80325,12 +80872,12 @@ msgid "" "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." -msgstr "" +msgstr "这款步枪在 21 世纪初为军用设计开发的。它具有高伤害及高精度,但其射速和其他步枪相比偏慢一点。这个型号发射的是 .300 BLK 弹药。" #: lang/json/gun_from_json.py msgid "IWI Tavor X95 .300BLK" msgid_plural "IWI Tavor X95 .300BLKs" -msgstr[0] "" +msgstr[0] "IWI 塔沃尔 X95 .300 BLK 突击步枪" #: lang/json/gun_from_json.py msgid "" @@ -80338,6 +80885,8 @@ msgid "" "assault rifle designed and produced by Israel Weapon Industries. This is " "the civilian version chambered for .300 AAC Blackout." msgstr "" +"IWI 塔沃尔 X95 突击步枪(又名微型塔沃尔或 MTAR)是一种以色列产的无托突击步枪,由以色列军事工业制造。这个民用型号发射的是 .300 BLK" +" 弹药。" #: lang/json/gun_from_json.py msgid "FN FAL" @@ -80749,6 +81298,21 @@ msgstr "" "作为当今最畅销的袖珍手枪之一,鲁格 LCP " "手枪是一款价格合理的手枪,聚合物枪身,装配0.380口径弹药。子弹的威力相对较低,手枪的重量轻,瞄准基线短,使得手枪的操控性较差。" +#: lang/json/gun_from_json.py +msgid "Hi-Point CF-380" +msgid_plural "Hi-Point CF-380s" +msgstr[0] "Hi-Point CF-380 手枪" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" +"Hi-Point CF-380 手枪是一种采用反冲式枪机的半自动手枪,由 Hi-Point 设计。Hi-Point " +"以制造廉价武器而知名,其生产的武器常常体积巨大且使用不便。Hi-Point 制造的枪械的套筒由锌合金制成,相比钢制套筒来说比较脆弱。" + #: lang/json/gun_from_json.py msgid "M1911A1" msgid_plural "M1911A1s" @@ -80827,6 +81391,48 @@ msgid "" "10mm rounds, or for S&W's own .40 round." msgstr "S&W 610 左轮手枪采用了最经典6发子弹的设计,可以选择传统的10mm口径子弹,或者S&W公司特有的.40口径子弹。" +#: lang/json/gun_from_json.py +msgid "Browning Hi-Power .40 S&W" +msgid_plural "Browning Hi-Power .40 S&Ws" +msgstr[0] "勃朗宁大威力 .40 S&W 手枪" + +#: lang/json/gun_from_json.py +msgid "" +"The Browning Hi-Power is a semi-automatic handgun developed shortly before " +"the second world war. Widely issued since then, it remains in use by India, " +"Canada and Australia. This is a commercial variant produced by Browning Arms" +" in .40 S&W." +msgstr "" +"勃朗宁大威力手枪是一种二战前不久研制的半自动手枪。当时被广泛使用,而目前仍有在印度、加拿大和澳大利亚使用。这把属于勃朗宁武器公司开发的发射 .40 " +"S&W 弹的商业型号。" + +#: lang/json/gun_from_json.py +msgid "Walther PPQ .40 S&W" +msgid_plural "Walther PPQ .40 S&Ws" +msgstr[0] "瓦尔特 PPQ .40 S&W 手枪" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in .40 S&W." +msgstr "瓦尔特 PPQ 手枪是基于瓦尔特 P99QA 手枪研制的半自动手枪,保留了一些对其部件的兼容性。这个型号发射的是 .40 S&W 弹药。" + +#: lang/json/gun_from_json.py +msgid "Hi-Point Model JCP" +msgid_plural "Hi-Point Model JCPs" +msgstr[0] "Hi-Point JCP 型手枪" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" +"Hi-Point JCP 型手枪是一种采用反冲式枪机的半自动手枪,由 Hi-Point 设计。Hi-Point " +"以制造廉价武器而知名,其生产的武器常常体积巨大且使用不便。Hi-Point 制造的枪械的套筒由锌合金制成,相比钢制套筒来说比较脆弱。" + #: lang/json/gun_from_json.py msgid "tube 40mm launcher" msgid_plural "tube 40mm launchers" @@ -81120,6 +81726,33 @@ msgid "USP .45" msgid_plural "USP .45s" msgstr[0] "USP .45 手枪" +#: lang/json/gun_from_json.py +msgid "Walther PPQ .45 ACP" +msgid_plural "Walther PPQ .45 ACPs" +msgstr[0] "瓦尔特 PPQ .45 ACP 手枪" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in .45 ACP." +msgstr "瓦尔特 PPQ 手枪是基于瓦尔特 P99QA 手枪研制的半自动手枪,保留了一些对其部件的兼容性。这个型号发射的是 .45 ACP 弹药。" + +#: lang/json/gun_from_json.py +msgid "Hi-Point Model JHP" +msgid_plural "Hi-Point Model JHPs" +msgstr[0] "Hi-Point JHP 型手枪" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" +"Hi-Point JHP 型手枪是一种采用反冲式枪机的半自动手枪,由 Hi-Point 设计。Hi-Point " +"以制造廉价武器而知名,其生产的武器常常体积巨大且使用不便。Hi-Point 制造的枪械的套筒由锌合金制成,相比钢制套筒来说比较脆弱。" + #: lang/json/gun_from_json.py msgid "Taurus Raging Bull" msgid_plural "Taurus Raging Bull" @@ -81952,6 +82585,98 @@ msgid "" "SIG Sauer P320." msgstr "M17是一种半自动的短反冲手枪,原型是Sig Sauer P320。" +#: lang/json/gun_from_json.py +msgid "Browning Hi-Power 9x19mm" +msgid_plural "Browning Hi-Power 9x19mms" +msgstr[0] "勃朗宁大威力 9x19mm 手枪" + +#: lang/json/gun_from_json.py +msgid "" +"The Browning Hi-Power is a semi-automatic handgun developed shortly before " +"the second world war. Widely issued since then, it remains in use by India, " +"Canada and Australia. This is a commercial variant produced by Browning Arms" +" in 9x19mm Parabellum." +msgstr "" +"勃朗宁大威力手枪是一种二战前不久研制的半自动手枪。当时被广泛使用,而目前仍有在印度、加拿大和澳大利亚使用。这把属于勃朗宁武器公司开发的发射 9x19mm" +" 鲁格弹的商业型号。" + +#: lang/json/gun_from_json.py +msgid "Walther P38" +msgid_plural "Walther P38s" +msgstr[0] "瓦尔特 P38 手枪" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" +"瓦尔特 P38 手枪是一种在二战前不久开始被使用的半自动手枪,用于解决前一代鲁格手枪的高生产成本问题。瓦尔特 P38 手枪仍使用 9mm " +"鲁格弹。这种手枪首次采用了现代手枪(例如伯莱塔 92 手枪)中常见的单/双动扳机和闭锁式枪膛,并在德国服役到 2004 年。" + +#: lang/json/gun_from_json.py +msgid "Walther PPQ 9mm" +msgid_plural "Walther PPQ 9mms" +msgstr[0] "瓦尔特 PPQ 9mm 手枪" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in 9x19mm Parabellum." +msgstr "瓦尔特 PPQ 手枪是基于瓦尔特 P99QA 手枪研制的半自动手枪,保留了一些对其部件的兼容性。这个型号发射的是 9x19mm 鲁格弹。" + +#: lang/json/gun_from_json.py +msgid "Hi-Point C-9" +msgid_plural "Hi-Point C-9s" +msgstr[0] "Hi-Point C-9 手枪" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" +"Hi-Point C-9 手枪是一种采用反冲式枪机的半自动手枪,由 Hi-Point 设计。Hi-Point " +"以制造廉价武器而知名,其生产的武器常常体积巨大且使用不便。Hi-Point 制造的枪械的套筒由锌合金制成,相比钢制套筒来说比较脆弱。" + +#: lang/json/gun_from_json.py +msgid "CZ-75" +msgid_plural "CZ-75s" +msgstr[0] "CZ-75 手枪" + +#: lang/json/gun_from_json.py +msgid "" +"The CZ-75 is a semi-automatic pistol developed in Czechoslovakia, and is one" +" of the original wonder nines. Though designed for export to western " +"countries, it was declared a state secret; lack of international patent " +"protection meant that many clones and variants were produced and distributed" +" around the world, with Česká zbrojovka only joining in the 90's. This " +"pistol remains wildly popular among competition shooters." +msgstr "" +"CZ-75 " +"手枪是一种由捷克斯洛伐克研制的半自动手枪。尽管是为出口至西方国家而设计,这个设计却在当时被列为了国家秘密。由于缺乏国际专利保护,全世界都开始了这种型号或衍生型号的生产和销售,而最初设计该型号的乌尔斯基·布罗德兵工厂直到二十世纪八十年代才开始境内的销售。这种手枪仍在射击比赛中被广泛使用。" + +#: lang/json/gun_from_json.py +msgid "Walther CCP" +msgid_plural "Walther CCPs" +msgstr[0] "瓦尔特 CCP 手枪" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" +"瓦尔特 CCP 手枪是一种采用气体延迟反冲式枪机、适合隐藏携带的民用半自动手枪,其内部设计几乎与与 H&K P7 " +"手枪相同。固定的枪管使其理论上比其它手枪更为精确,但是由于其本身扳机的质量和小瞄具半径,可能很难察觉到任何精度提升。" + #: lang/json/gun_from_json.py msgid "Makarov PM" msgid_plural "Makarov PMs" @@ -82038,19 +82763,6 @@ msgid "" "deadly." msgstr "一个装满了大量汽油的大型火焰喷射器。当心\"嘣\"的一声你就去见上帝了。" -#: lang/json/gun_from_json.py -msgid "simple flamethrower" -msgid_plural "simple flamethrowers" -msgstr[0] "简易火焰喷射器" - -#: lang/json/gun_from_json.py -msgid "" -"A simple, home-made flamethrower. While its capacity is not superb, it is " -"more than capable of igniting terrain and monsters alike." -msgstr "" -"一架简易、自制的火焰喷射器,尽管燃料容量有限,也可以用来做焚烧工作。\n" -"\"香喷喷的烤全羊……不,烤全尸出炉喽!\"" - #: lang/json/gun_from_json.py msgid "RM451 flamethrower" msgid_plural "RM451 flamethrowers" @@ -82146,6 +82858,15 @@ msgid "" msgstr "" "一把电力驱动的单发电磁轨道枪,用废料手工制作而成。它通过电磁感应所产生洛仑兹力将发射的金属棒加速到超高速,同时加热棒体至接近自燃的温度,该武器采用标准UPS供电。" +#: lang/json/gun_from_json.py +msgid "barb launching organ" +msgid_plural "barb launching organs" +msgstr[0] "毒刺发射器官" + +#: lang/json/gun_from_json.py +msgid "A mutated organ capable of launching bony barbs at great speed." +msgstr "一个变异器官,能够以极高速度发射骨质毒刺。" + #: lang/json/gun_from_json.py msgid "coilgun" msgid_plural "coilguns" @@ -82389,25 +83110,25 @@ msgstr "强力电子激光枪,由研究机构\"Aerial Labs\"制造。对电子 #: lang/json/gun_from_json.py msgid "CMES laser cannon" msgid_plural "CMES laser cannons" -msgstr[0] "" +msgstr[0] "战斗外骨骼装甲激光炮" #: lang/json/gun_from_json.py msgid "" "This is the integral weapon system for the CMES exoskeleton mech-suit, a " "rotating-barrel active-cooled rapid-fire laser system, can spray death " "downrange with ease." -msgstr "" +msgstr "这是一套集成到战斗外骨骼装甲中的武器系统,一台转管主动散热速射激光系统,能够轻而易举地为目标带来死亡。" #: lang/json/gun_from_json.py msgid "RMES marksman system" msgid_plural "RMES marksman systems" -msgstr[0] "" +msgstr[0] "侦察外骨骼装甲狙击系统" #: lang/json/gun_from_json.py msgid "" "This is the integral weapon system for the RMES exoskeleton mech-suit, a " "quiet and accurate marksman laser rifle." -msgstr "" +msgstr "这是一套集成到侦察外骨骼装甲中的武器系统,一把无声且精确的狙击激光步枪。" #: lang/json/gun_from_json.py msgid "handheld laser cannon" @@ -82684,6 +83405,18 @@ msgid "" msgstr "" "一套强大的离子能量发生器被植入你的胸腔之中。能够发射出一个道威力巨大的,不断扩散并能穿透多个目标的高能冲击波。所产生的冲击波会点燃氧气,使的其经过的地方产生火焰,并在最终撞击目标时爆炸。近距离使用它是非常不明智的选择。" +#: lang/json/gun_from_json.py +msgid "Yeet Cannon" +msgid_plural "Yeet Cannons" +msgstr[0] "Biubiu炮" + +#: lang/json/gun_from_json.py +msgid "" +"You can YEET all the bullets with this baby. YEET them right into all of the" +" zombies in your path, all the hulks, the spiders, and those damned mole " +"rats." +msgstr "万弹齐发!Biubiubiu!什么丧尸,浩克,蜘蛛,还有狗比鼹鼠,全部去死!" + #: lang/json/gun_from_json.py msgid "SVS-24" msgid_plural "SVS-24" @@ -83306,13 +84039,13 @@ msgstr "84mm无后坐力炮是一种后装填可重复使用的轻型多用途 #: lang/json/gun_from_json.py msgid "Druid composite bow" msgid_plural "Druid composite bows" -msgstr[0] "" +msgstr[0] "德鲁伊复合弓" #: lang/json/gun_from_json.py msgid "" "A bow made of multiple materials to maximize energy efficiency. There are " "two Druid runes embedded at the tips." -msgstr "" +msgstr "一把采用多种材料复合制成以增加能量效率的弓。弓背两端镶嵌着两个德鲁伊符文。" #: lang/json/gun_from_json.py msgid "Woodbow" @@ -84176,26 +84909,6 @@ msgid "" "cartridges." msgstr "陶鲁斯\"暴怒裁决\"左轮手枪发射.454 卡苏尔弹,弹容量5发。该型号同时也能够发射.410口径霰弹或.45长柯尔特弹。" -#: lang/json/gunmod_from_json.py -msgid ".300 AAC Blackout caliber conversion kit" -msgid_plural ".300 AAC Blackout caliber conversion kits" -msgstr[0] "" - -#: lang/json/gunmod_from_json.py -msgid "" -"This kit is used to convert an AR-15 .223/5.56mm rifle to the new .300BLK " -"caliber." -msgstr "" - -#: lang/json/gunmod_from_json.py -msgid "bore" -msgstr "口径" - -#: lang/json/gunmod_from_json.py -msgctxt "gun_type_type" -msgid "ar15" -msgstr "AR-15" - #: lang/json/gunmod_from_json.py msgid "barrel extension" msgid_plural "barrel extensions" @@ -84226,13 +84939,13 @@ msgstr "使用线膛枪管主要是为了提高霰弹枪发射独头弹的命中 #: lang/json/gunmod_from_json.py msgid "rapid blowback" msgid_plural "rapid blowbacks" -msgstr[0] "连发加速器" +msgstr[0] "高速反冲式枪机" #: lang/json/gunmod_from_json.py msgid "" "An improved blowback mechanism makes your firearm's automatic fire faster, " "at the cost of reduced accuracy and increased noise." -msgstr "改良枪机后坐结构,使得全自动射击时射速更快,但会降低精确性并增加噪音。" +msgstr "改良的反冲式枪机结构,使得全自动射击时射速更快,但会降低命中率并增加噪音。" #: lang/json/gunmod_from_json.py msgid "mechanism" @@ -84273,6 +84986,10 @@ msgid "" "slight reduction to accuracy." msgstr "这套改装工具可以将9mm、.38、.40、5.7mm、4.6mm、7.62mm及.223口径的枪械改装成 .22口径,会稍微降低命中率。" +#: lang/json/gunmod_from_json.py +msgid "bore" +msgstr "口径" + #: lang/json/gunmod_from_json.py msgid ".223 caliber conversion kit" msgid_plural ".223 caliber conversion kits" @@ -84569,6 +85286,35 @@ msgid "" " don't have to pick them up." msgstr "一个可以装在退弹口上的袋子,这样你就不必弯腰去捡弹壳了。" +#: lang/json/gunmod_from_json.py +msgid ".300 AAC Blackout AR-15 conversion kit" +msgid_plural ".300 AAC Blackout AR-15 conversion kits" +msgstr[0] ".300 BLK 口径 AR-15 改装件" + +#: lang/json/gunmod_from_json.py +msgid "A complete AR-15 upper assembly with a .300 AAC Blackout barrel." +msgstr "一整套 AR-15 改装件,包括一个 .300 BLK 枪管。" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "ar15" +msgstr "AR-15" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "m4a1" +msgstr "M4A1 步枪" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "h&k416a5" +msgstr "H&K 416A5 步枪" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "m27iar" +msgstr "M27 IAR 步枪" + #: lang/json/gunmod_from_json.py msgid "lightweight replacement furniture" msgid_plural "lightweight replacement furnitures" @@ -84613,13 +85359,13 @@ msgstr "镜头" #: lang/json/gunmod_from_json.py msgid "focusing lens" msgid_plural "focusing lenss" -msgstr[0] "" +msgstr[0] "聚焦透镜" #: lang/json/gunmod_from_json.py msgid "" "A set of optics to concentrate the laser beam on a smaller focus point. This" " increases range and damage output, but complicates targeting." -msgstr "" +msgstr "一套光学透镜,用于将激光束聚焦成更小的点。这增加了射程和伤害,但是使瞄准更加复杂。" #: lang/json/gunmod_from_json.py msgid "electrolaser conversion" @@ -84637,13 +85383,13 @@ msgstr "" #: lang/json/gunmod_from_json.py msgid "effective emitter" msgid_plural "effective emitters" -msgstr[0] "" +msgstr[0] "高效发射器" #: lang/json/gunmod_from_json.py msgid "" "A set of electronics to optimize emitter workcycle and increase overall " "energy efficiency. Decreases power consumption." -msgstr "" +msgstr "一套用于优化发射器工作循环的电子设备,能增加整体能量效率并降低能量消耗。" #: lang/json/gunmod_from_json.py msgid "emitter" @@ -85787,13 +86533,14 @@ msgstr "你屠宰了这只死去的丧尸,并砍下了它的头颅。" #: lang/json/help_from_json.py msgid ": Introduction" -msgstr "a:游戏简介" +msgstr ":游戏简介" #: lang/json/help_from_json.py msgid "" "Cataclysm is a survival roguelike with a monster apocalypse setting. You " "have survived the original onslaught, but the future looks pretty grim." msgstr "" +"《大灾变:浩劫余生》是一款以末日为背景的Roguelike风格游戏,不知是幸运还是不幸,你在毁灭世界的恐怖事件中活了下来,但是你还能活多久呢?" #: lang/json/help_from_json.py msgid "" @@ -85802,6 +86549,7 @@ msgid "" "survivors you must stay alert, since someone may be plotting behind your " "back to take your hard-earned loot." msgstr "" +"你必须准备好面对许多困难,包括日益减少的补给,敌对生物,恶劣天气。甚至面对大灾变后的极少数幸存者时你也要时刻警惕,因为他们中也许有人正想要背后捅你一刀以拿走你辛苦得来的战利品。" #: lang/json/help_from_json.py msgid "" @@ -85814,6 +86562,7 @@ msgid "" "survival situation, and at least a dozen more from the eldritch and sci-fi " "nature of the Cataclysm itself." msgstr "" +"与大部分Roguelike游戏不同。与限制在一个每层只有少数区域可探索的地下城中不同,本游戏地图是无限大的,并会在你探索时向四面八方不断延伸。当然作为一款生存类Roguelike游戏,你的角色会饥饿、会口渴、会疲倦、会死亡。这个游戏基于真实性开发,所以你将会遇到现实生存中会遇到的所有困难,再加上大灾变自身的怪异和科幻性质所带来的困境。" #: lang/json/help_from_json.py msgid "" @@ -85826,7 +86575,7 @@ msgstr "" #: lang/json/help_from_json.py msgid ": Movement" -msgstr "b:移动" +msgstr ":移动" #: lang/json/help_from_json.py msgid "Movement is performed using the numpad, or vikeys." @@ -85856,6 +86605,7 @@ msgid "" "choose a direction). Smashing down obstacles is much easier with a good " "weapon or a strong character." msgstr "" +"某些场景中会有一些门('+'),你可以按\"\"键开门或按\"\"键关门。游戏中有些门原本是锁着的,对于锁闭的门、窗或者其他障碍物你可以选择砸毁它们(先按\"\"键,再选择方向),不过若真想轻松破坏成功的话,你需要强力的武器,或者玩家力量足够高。" #: lang/json/help_from_json.py msgid "" @@ -85866,10 +86616,11 @@ msgid "" " is on, any movement will be ignored if new monsters enter the player's " "view." msgstr "" +"生存一段时间之后,可能你会觉得自己已经脱离了蹒跚学步的阶段,可以开始大踏步地闯荡这个未知的世界。然而持续按着某个方向键快速前进很容易会让你来不及反应就已身陷险境,所以你可以通过按\"\"键开启安全模式,在安全模式中,只要视线范围内有敌人存在就会自动停止任何移动。" #: lang/json/help_from_json.py msgid ": Viewing" -msgstr "c:查看" +msgstr ":查看" #: lang/json/help_from_json.py msgid "" @@ -85882,16 +86633,17 @@ msgid "" " enough. Pressing Shift+vikeys (h,j,k,l,y,u,b,n) will scroll the view " "persistently, allowing you to keep an eye on things as you move around." msgstr "" +"游戏中,角色的视野范围其实比屏幕所显示的还要大,这时候就要按\"\"键来进入观察模式,在观察模式中你可以通过按方向键来移动屏幕,查看周围的场景。同样如果按\"\"键会列出附近所有可拾取物品的列表。但如果物品存在于箱子、柜子等各类容器中时,在你移动到足够近的距离之前是不会被列出来的。如果按\"shift\"+vi键(hjklyubn),将会永久移动你的观察窗口,方便你在移动的同时对某块地区进行监视。" #: lang/json/help_from_json.py msgid "" "Places outside of your view but seen peviously and memorized can be " "visualized, but covered by the \"fog of war\"." -msgstr "" +msgstr "你曾经见过但处于视野之外的地方会被显示,但是会处于“战争迷雾”之中。" #: lang/json/help_from_json.py msgid ": Hunger, thirst, and sleep" -msgstr "d:饥饿、口渴和睡觉" +msgstr ":饥饿、口渴和睡觉" #: lang/json/help_from_json.py msgid "" @@ -85907,6 +86659,7 @@ msgid "" " track both your immediate hunger/fullness and overall nutrition of your " "whole body." msgstr "" +"你会随着时间开始感到饥饿和口渴,你的胃会开始抗议。这种情况下,一个状态提示会被显示在边栏上。根据情况不同,边栏会显示你的饱食度和营养状态的相对关系,而饱食度和营养状态是两个不同的概念。举个例子,你在一顿大餐后可能撑到嗓子眼,但是由于长期未进食而仍处于营养不良状态。即使你已经超重,你也会随时间感到饥饿。如果你吃的东西的能量过低的话,甚至有可能从来没有饿过肚子但还是变成营养不良。换言之,你需要同时关注你的饱食度和营养状态。" #: lang/json/help_from_json.py msgid "" @@ -85919,6 +86672,7 @@ msgid "" "levels, you will also suffer penalties. Thirst will kill you faster then " "hunger." msgstr "" +"吃下的食物需要时间来消化,而水分的消化速度大于食物。短期大量进食或饮水会让你撑得慌,所以请少食多餐。如果你以前挨过饿,恢复体重会需要一段时间,因为你需要通过规律饮食来积累足够的卡路里。长期过量饮食会造成肥胖症。无论是超重还是超轻的体型都会产生坏处。当你感到极度饥饿或者口渴时,你的身体机能也会下降。同时,长时间的缺水比饥饿更加致命。" #: lang/json/help_from_json.py msgid "" @@ -85932,6 +86686,7 @@ msgid "" " a balanced diet, or at least not a completely atrocious one. You can and " "should examine food items to view their nutritional facts." msgstr "" +"不平衡的饮食会让你患上维生素缺乏症。这些缺乏症状分多种阶段,举例来说就是你不会从健康状态瞬间变成败血症晚期。任何发展中的症状都在状态栏处显示。维生素缺乏会给予你多种惩罚,但是好消息是他们是可以被治愈的,混合维生素片可以治疗任何维生素缺乏症。另一方面,维生素过量也会给你带来问题。所以合理饮食非常重要,至少也别太偏食。你可以也应当在物品信息栏查看食物的营养成分。" #: lang/json/help_from_json.py msgid "" @@ -85941,6 +86696,7 @@ msgid "" " other hand vegetables, herbal teas, and many other self-prepared meals are " "good for your health, and are welcomed additions to your diet." msgstr "" +"不健康的饮食会对你的身体健康带来不利的影响。快餐、零食和甜味饮料都含有大量能量,但是不能作为长期的食物来源,否则不利于身体健康。另一方面,蔬菜、草药茶和许多其它自制餐点会更有利健康,你应该多吃这类食物。" #: lang/json/help_from_json.py msgid "" @@ -85955,6 +86711,7 @@ msgid "" "produce diseased water. To make sure it's healthy, purify the water by " "boiling it or using water purifier before drinking." msgstr "" +"城市里的食物来源丰富,在城外你则需要去狩猎或采集。杀死一只动物后,站在尸体上按\"\"键可以屠宰尸体。你也可以在植物上搜索找吃的。同样的,你可以从河流或者其他水源取水,站在浅水处按\"\"键可以搜集水资源。当然你还需要密闭的容器来盛放。不过要小心,大部分水源都不是可以直接饮用的,有的可能含有病菌。净化水,煮沸水或者用净水器都可以让水变干净。" #: lang/json/help_from_json.py msgid "" @@ -85966,10 +86723,11 @@ msgid "" "also be vulnerable to attack, so try to find a safe place to sleep, or set " "traps for unwary intruders." msgstr "" +"每过十几个小时,你会发现自己开始变得困倦。如果你不按\"\"键进行睡眠的话,你就会受到属性和速度值上的惩罚。你可能不会很快能就入睡。睡在室内,尤其是睡在在室内的床上会有助于入睡。你当然也可以选择使用安眠药。睡眠时你会缓慢地恢复失去的生命值。但同时你也会失去对危险的防护,所以请选择安全的地点进行睡眠,或者给粗心的入侵者设置陷阱。" #: lang/json/help_from_json.py msgid ": Pain and stimulants" -msgstr "e:疼痛和兴奋剂" +msgstr ":疼痛和兴奋剂" #: lang/json/help_from_json.py msgid "" @@ -85980,13 +86738,14 @@ msgid "" "under the influence of many painkillers, the physiological side effects may " "slow you or reduce your stats." msgstr "" +"几乎任何的伤害都会让你的角色感到疼痛,而疼痛感会减少各项属性并延缓你的行动,所以从一开始你就要考虑如何应对这个问题。最简单的办法,就是服药:阿司匹林、可待因、曲马朵、羟考酮等都是很好的选择,但别忘了当你服用大量止痛剂之后,药效本身一样会让你的行动迟缓并削弱部分属性。" #: lang/json/help_from_json.py msgid "" "Note that most painkillers take a little while to kick in. If you take some" " oxycodone and don't notice the effects right away, don't start taking more " "- you may overdose and die!" -msgstr "" +msgstr "需要注意的是大多数止疼药的生效需要时间,如果你服用了一些羟考酮但是没有立刻生效,请务必稍等片刻而不是急着再次服用,药物使用过量是会致命的!" #: lang/json/help_from_json.py msgid "" @@ -86004,22 +86763,23 @@ msgid "" "importantly, most are highly addictive. Stimulants range from the caffeine " "rush of cola to the more intense high of Adderall and methamphetamine." msgstr "" +"游戏中除了止痛药,还有各类兴奋剂。兴奋剂能够在短时间内提升角色的行动能力及各项属性。然而服用兴奋剂有两大注意事项:服用兴奋剂之后角色将很难入睡,并且兴奋剂很容易成瘾。游戏中的兴奋剂从可乐饮料中的咖啡因到安非他命和麻黄碱等都有。" #: lang/json/help_from_json.py msgid "" "Depressants are opposite to stimulants. They will make you groggy and " "sluggish, but may help you in falling asleep." -msgstr "" +msgstr "镇定剂和兴奋剂相反,会使你感到无力与迟钝,但是也许可以帮助你入睡。" #: lang/json/help_from_json.py msgid "" "Extreme levels of stimulants or depressants in your system are dangerous to " "your health." -msgstr "" +msgstr "过高水平的镇定剂或兴奋剂摄入会对健康造成危害。" #: lang/json/help_from_json.py msgid ": Healing and medication" -msgstr "" +msgstr ":医疗和药物" #: lang/json/help_from_json.py msgid "" @@ -86031,12 +86791,13 @@ msgid "" "penalties and a long process of healing, after placing affected limb in a " "splint." msgstr "" +"当你受到伤害时,边栏中相关身体部位的状态会产生变化。身体部位的总体状态用一个状态条显示,当受到伤害时状态条会开始缩短。一个身体部位累积的伤害如果超过承受限度就会断掉。如果断掉的是重要的身体部位,你就会死亡。其它断掉的身体部位会降低你的身体能力,而且需要装上夹板并经过很长的时间来恢复。" #: lang/json/help_from_json.py msgid "" "Normal damage heals with time. You heal more overnight during good sleep, " "but wounds also heal a bit by day." -msgstr "" +msgstr "普通伤害会随着时间治愈。夜晚优质的睡眠会加速伤口的治愈,但是白天伤口也会缓慢愈合。" #: lang/json/help_from_json.py msgid "" @@ -86048,6 +86809,7 @@ msgid "" "remember to always treat your wounds by default, as this is the proper way " "to get them healed." msgstr "" +"你应该对伤口进行适当的处理,否则伤口的恢复会异常缓慢。只要有可能,你应该首先对伤口进行消毒,然后在伤口绑上绷带。这会为伤口提供修复的环境,从而更快地恢复伤口。如果你懂得急救,你可以制作一些简易绷带,消毒剂也能在许多地方找到。始终记住处理你的伤口,这样它们才能快速痊愈。" #: lang/json/help_from_json.py msgid "" @@ -86064,6 +86826,7 @@ msgid "" "keep you alive long enough for it to happen. You have to wait it out in " "hope that you will not die in the process." msgstr "" +"如果你被丧尸抓住并撕咬,可能会受很深的伤并被感染。这种情况下对应的身体部位的状态条会变成蓝色,说明你需要尽快对伤口进行消毒以避免感染加深。如果你找不到任何消毒剂,你可以尝试一些更粗糙的消毒方法,比如烧灼伤口,但是这类消毒方式常常反而会进一步加深感染。如果你放着感染的伤口不管,伤口所在的身体部位会发生严重的感染,对应的状态条会变成绿色。这种情况下消毒伤口已经无济于事,你需要服用抗生素来对抗感染。你的免疫系统会与感染进行斗争,但规律地服用抗生素才有机会保证你撑过危险期。一旦严重感染,你就只能求菩萨保佑你不会在恢复前死掉了。" #: lang/json/help_from_json.py msgid "" @@ -86071,7 +86834,7 @@ msgid "" "limb takes damage as long as it bleeding. Simpliest way to stop bleeding is" " using a bandage, and there are more medical items dedicated to stopping " "hemorrage." -msgstr "" +msgstr "如果身体部位开始出血,对应的状态条就会变成红色。流血的肢体会随时经受伤害。最简单的止血方法是使用绷带,但是也有其它的医疗物品可以用于止血。" #: lang/json/help_from_json.py msgid "" @@ -86083,10 +86846,11 @@ msgid "" "try natural medicine, as many herbs have more or less beneficial effects, " "and if you are a seasoned chemist you can synthetize your own drugs." msgstr "" +"在游戏里你可能会染上各种疾病或不良状态。这种情况下,你需要寻求恰当的治疗,如果能够治疗的话。除了止痛药之外还有许多不同的药物,其中也有一些药物会有可以利用的特殊功效,就算这药本来不是这么用的。如果你的技能足够,你可以尝试天然药物,许多草药或多或少有一些有益的效果。如果你有足够的化学知识,你甚至可以自己合成药品。" #: lang/json/help_from_json.py msgid ": Addiction" -msgstr "" +msgstr ":药物成瘾" #: lang/json/help_from_json.py msgid "" @@ -86097,17 +86861,18 @@ msgid "" " going cold turkey. The process may last for days and will leave you very " "weak, so try to do it in a safe area." msgstr "" +"许多药物(以及部分食物)都有一定的潜在成瘾性,每当你服用某种药物,都有一定几率产生依赖性,服用越多,瘾性越大。成瘾效果随成瘾物质变化,但上瘾之后戒断的唯一方法就是停止服用。药物的戒断周期可能会持续数天,期间你会变得非常虚弱,所以一定要找个安全的地方进行戒断治疗。" #: lang/json/help_from_json.py msgid "" "If you are suffering from withdrawal effects, taking more of the addictive " "substance will cause the effects to cease immediately, but may deepen your " "dependence." -msgstr "" +msgstr "当你药瘾发作的时候,你会痛苦不堪,虽然再次用药会立刻解除这种痛苦,但下一次的药瘾会发作得更快。" #: lang/json/help_from_json.py msgid ": Morale and learning" -msgstr "" +msgstr ":心情值和学习" #: lang/json/help_from_json.py msgid "" @@ -86115,6 +86880,7 @@ msgid "" "depressing post-apocalypse world is tough to deal with, and your mood will " "naturally decrease very slowly." msgstr "" +"你的角色有一个心情值的指标,它会在很多场合发生作用。独自身处大灾变之后满目疮痍的世界之中是一件非常令人绝望的事情,你的心情会随着时间的推移逐渐低落。" #: lang/json/help_from_json.py msgid "" @@ -86131,6 +86897,7 @@ msgid "" "decay. Eating disgusting food, reading a boring technical book, killing a " "friendly NPC, or going through drug withdrawal are some prominent examples." msgstr "" +"与其相对的是你的身边有很多因素会降低你的心情值,除了自然衰退以外,吃一些难吃的食物、读一本枯燥的书、杀害友好的NPC以及药物脱瘾等等都是些显著例子。" #: lang/json/help_from_json.py msgid "" @@ -86140,6 +86907,7 @@ msgid "" "fills you with gusto and energy, and you will find yourself moving faster. " "At extremely high levels, you will receive stat bonuses." msgstr "" +"过低的心情值会让你的角色变得懒散及忧郁,如果你的心情值过低,你甚至无法制造任何物品。当你变得足够忧郁时,你的各项基础属性将会受到惩罚,尤其是智力。而高心情值能让你充满干劲,你会发现自己行动更加迅速,而心情值特别高昂时,你会获得基础属性加成。" #: lang/json/help_from_json.py msgid "" @@ -86149,6 +86917,7 @@ msgid "" " learning potential. Higher or lower focus levels make it easier or harder " "to learn from practical experience." msgstr "" +"心情值也会影响你的\"专注\"值,从而影响你的学习效率。你的专注值决定了你的学习效率。一开始你有100点专注值,更高或更低的专注值会使你获得学习效率的增益或惩罚。" #: lang/json/help_from_json.py msgid "" @@ -86159,6 +86928,7 @@ msgid "" " factored into the set point calculation - it's harder to learn when you're " "in pain." msgstr "" +"你的专注值有一个自然平衡点。当当前专注值高于或低于自然平衡点时,专注值会逐渐趋向于自然平衡点,偏离越远变化越快。高心情值会提高自然平衡点,低心情值会降低自然平衡点。疼痛也会影响自然平衡点,当你很疼时你会难以进行学习。" #: lang/json/help_from_json.py msgid "" @@ -86169,6 +86939,7 @@ msgid "" "decreases your focus rapidly, by giving a significant penalty to the set " "point of your focus." msgstr "" +"你的专注值会因为各种行为而降低。当你练习技能的时候会降低你的专注值(专注值越高降低的越快,也同时获得更多的技能经验)。看书学习技能会降低你的专注值的自然平衡点,因此会快速降低你的专注值。" #: lang/json/help_from_json.py msgid "" @@ -86177,10 +86948,11 @@ msgid "" "performing relevant action, but you will not progress in that skill while " "it's disabled." msgstr "" +"如果你不想训练某个技能,你可以在玩家信息界面禁用它(按键)。这会避免在进行相关活动时降低专注度,但是也会停止技能水平的提升。" #: lang/json/help_from_json.py msgid ": Radioactivity and mutation" -msgstr "" +msgstr ":放射和变异" #: lang/json/help_from_json.py msgid "" @@ -86192,6 +86964,7 @@ msgid "" " know it that you are under its influence until it results in radiation " "sickness." msgstr "" +"尽管十分罕见,但是地图上的某些地方已经遭受了严重的辐射污染。当你行走在这些区域时,辐射会逐渐在你的体内累积,并且逐渐削弱你的身体。而当你离开辐射区域以后,体内积累的辐射会逐渐被缓慢代谢出体外。服用普鲁士蓝药片有助于加快代谢的速度。你最好尽快找到一个辐射测量装置,因为辐射是肉眼不可见的,如果不进行测量,你只有当出现辐射病症状时才能发现它。" #: lang/json/help_from_json.py msgid "" @@ -86201,6 +86974,7 @@ msgid "" "play style considerably. It is possible to find substances that will remove" " mutations, though these are extremely rare." msgstr "" +"如果体内积累的辐射量过高的话,甚至会诱发基因变异,绝大多数情况下,基因变异都是恶性的,然而有些基因变异却能给你的角色带来意料之外的好处。所有的基因变异都会很大程度上改变你今后的游戏方式,游戏中也能找到一些消除基因变异的方法,但它们相当稀有。" #: lang/json/help_from_json.py msgid "" @@ -86210,10 +86984,11 @@ msgid "" "met, you will permanently transcend your humanity into a wholly different " "life-form." msgstr "" +"游戏中有许多能够引起变异的物质,服用或者注射它们会让你变异。但是,这个过程会明显给你身体增加负担,同时也会上瘾。当有了足够多的变异同时满足了特定条件之后,你可以永久的超越(或许)人性变成一种完全不同的生命形式。" #: lang/json/help_from_json.py msgid ": Bionics" -msgstr "" +msgstr ":生化插件" #: lang/json/help_from_json.py msgid "" @@ -86222,6 +86997,7 @@ msgid "" " have unique effects that are otherwise unobtainable. Some bionics are " "constantly working, whereas others need to be toggled on and off as needed." msgstr "" +"生化插件通过生化技术来强化你的肉体。许多插件是你需要随身携带的物品或工具,而有些插件则有着无法通过其他手段获得独特的效果。有些插件是始终工作的,而其他的则需要按需求开启或者关闭。" #: lang/json/help_from_json.py msgid "" @@ -86231,6 +87007,7 @@ msgid "" "be done in a variety of ways, but all require the installation of a special " "bionic just for that purpose." msgstr "" +"大部分的生化插件都需要一个稳定的能量源,它会被安装在你的体内,你当前的能量值会显示在HP值的下方,游戏中也有很多方式可以进行充能,但仅仅是充能也需要先安装特殊的生化插件。" #: lang/json/help_from_json.py msgid "" @@ -86243,13 +87020,14 @@ msgid "" " bionic users. Bionic modules obtained this way may require extra " "preparations to become usable." msgstr "" +"游戏中安装生化插件只能通过专业人士或者是专业医疗设备才能完成。使用医疗设备需要角色具有高度的智力、急救能力、机械操作能力,最好还有电子设备的知识,因为如果安装失败,会导致残废!游戏中要找到这些生化插件也是件不容易的事,不过偶尔你也可以从四处游荡的NPC手中以很高的价格买到,或者通过对生化插件使用者的尸体进行精细的解剖获得。通过解剖获得的生化插件可能需要特殊处理才能再次安装。" #: lang/json/help_from_json.py msgid "" "Any bionic can be removed from your body but it may be even harder than its " "installation; and as well as installation, this non-trivial surgical " "procedure requires anesthesia." -msgstr "" +msgstr "大部分生化插件都能被移除,但移除可能比安装还要困难;而且同安装时一样,拆除生化插件是一个复杂的过程,因此也需要消耗麻醉剂。" #: lang/json/help_from_json.py msgid "" @@ -86259,6 +87037,7 @@ msgid "" "this restriction if you find a way to completely negate pain. Don't even " "try without proper anesthesia - normal drugs won't help." msgstr "" +"对于独自行动的玩家而言,最好的安装及拆除生化插件的方式是通过全自动医疗仪。通常,你可以在医院和诊所(即便是\"非正式的\")中找到它。任何使用它的程序都需要消耗一个麻醉工具箱。如果你能找到让自己完全忽略疼痛的方法的话,你也可以绕过这个限制。但是别想试图使用普通镇痛剂来绕过这个限制——它帮不了你。" #: lang/json/help_from_json.py msgid "" @@ -86269,7 +87048,7 @@ msgstr "要注意的是,安装及拆除生化插件可能需要患者全身麻 #: lang/json/help_from_json.py msgid ": Crafting" -msgstr "" +msgstr ":制作" #: lang/json/help_from_json.py msgid "" @@ -86277,6 +87056,7 @@ msgid "" "money to trade for. Fortunately, it is possible to craft a wide variety of " "goods (as best you can) with the proper tools, materials, and training." msgstr "" +"本作中很多重要的物品都不是太容易找到,即使想通过交易来购买可能这个价格也不是轻易能够承担的,所幸,只要有合适的工具和材料,你的角色可以自行制作。" #: lang/json/help_from_json.py msgid "" @@ -86284,6 +87064,7 @@ msgid "" "so you can keep your tool set. All recipes require one or more ingredients." " These ARE used up in crafting." msgstr "" +"有些物品的制作需要用到不止一件工具,拥有这些工具可以进行多次制作;而所有的物品都需要一种或更多的材料来进行制作,这些材料在制作之后都会被消耗掉。" #: lang/json/help_from_json.py msgid "" @@ -86298,41 +87079,42 @@ msgid "" "to the book: just have it handy when crafting. Different knowledge is " "useful for different applications:" msgstr "" +"想要自己制造物品,按\"\"键。菜单分为八大类:武器,弹药,食物,化学,电子,装备,动物,其他。每一大类又分为几个小类。在一小部分物品不需要特定的技巧来制造的同时,大部分物品都需要你拥有对应的知识。有时候一个熟练的幸存者可以根据自己的技能知识制作出东西,不过大多数时候你还是需要一些参考资料,比如书什么的。你可以直接照着书本进行制作:透过实践学习。不同的知识会在不同的领域发光:" #: lang/json/help_from_json.py msgid "" "-> Fabrication is the generic artisan skill, used for a wide variety of " "gear." -msgstr "" +msgstr "-> 制造是通用的工匠技术,用于多种不同物品的制作。" #: lang/json/help_from_json.py msgid "" "-> Cooking, at low levels, is used for making tasty recipes; at higher " "levels, you have an understanding of chemistry and can make chemical weapons" " and beneficial elixirs." -msgstr "" +msgstr "-> 烹调在低等级下被用于制作可口的菜肴;在高等级下,你会对化学产生了解,可以从此开始制作化学武器和有益的药剂。" #: lang/json/help_from_json.py msgid "-> Tailoring is used to create basic clothing, and armor later on." -msgstr "" +msgstr "-> 裁缝被用于制作简单衣物,在后期则可以制作护甲。" #: lang/json/help_from_json.py msgid "" "-> Electronics lets you make a wide variety of tools with intricate uses." -msgstr "" +msgstr "-> 电子学使你能够制作许多具有复杂用途的工具。" #: lang/json/help_from_json.py msgid "" "In addition to the primary crafting skills, other skills may be necessary to" " create certain items. Traps, Marksmanship, and First Aid are all required " "for certain items." -msgstr "" +msgstr "在基础制作技能的基础上,某些物品也可能需要其它技能才能制作。陷阱、枪法和急救都被用于某些物品的制作。" #: lang/json/help_from_json.py msgid "" "Crafting an item with high difficulty may fail and possibly waste some " "materials. You should prepare spare material, just in case." -msgstr "制作高难度的物品很可能会浪费掉材料,你应该多准备一些备用材料。以防万一。" +msgstr "制作高难度的物品很可能会浪费掉材料,你应该多准备一些备用材料,以防万一。" #: lang/json/help_from_json.py msgid "" @@ -86342,23 +87124,25 @@ msgid "" "furniture for crafting is benefitial for the added comfort, thus making the " "process faster." msgstr "" +"巨大/笨重/批量物品的制作最好在一个工作平台上进行。 " +"可以使用普通桌子,也可以使用更善于承重的自制金属桌。使用工作台或其它家具来进行制作会更加舒适,从而提高制作的速度。" #: lang/json/help_from_json.py msgid "" "If for any reason the crafting process is interupted the progress is wrapped" " in a special item representing craft in making. You may use it to resume " "crafting at any point." -msgstr "" +msgstr "如果物品制造因故中断,所有制作进度都会存放在一个特殊的制作中物品当中。你可以随时使用这个物品来恢复制造。" #: lang/json/help_from_json.py msgid "" "Batch crafting in most cases means time saving, and your companions can also" " help if they know the ropes." -msgstr "" +msgstr "在大多数情况下,成批制造物品可以节省时间,而如果你的同伴知道方法的话,他们也能帮助你进行制造。" #: lang/json/help_from_json.py msgid ": Traps" -msgstr "" +msgstr ":陷阱" #: lang/json/help_from_json.py msgid "" @@ -86369,6 +87153,7 @@ msgid "" "trap anything that steps on them). Others need to be crafted; this requires" " the Traps skill and possibly Mechanics." msgstr "" +"当你在危险区域睡觉时,设置陷阱来避免不希望出现的打扰是明智的。世界中能找到一些陷阱,尤其值得一提的有警戒陷阱(有东西踩上去时发出巨响唤醒你)和捕熊陷阱(踩到时发出声响并伤害及困住触发者)。其他有的需要自制;这需要陷阱技能,有的需要制造技能。" #: lang/json/help_from_json.py msgid "" @@ -86377,6 +87162,7 @@ msgid "" "require additional tools, like a shovel, to be set. Once set, a trap will " "remain in place until stepped on or disarmed." msgstr "" +"要设置陷阱,只需使用物品(按\"\"键)然后选择方向;陷阱会放置到相应方向临近的地面上。有些陷阱需要额外的工具才能放置,比如铁锹。一旦放置,陷阱会一直生效直到被踩到或拆除。" #: lang/json/help_from_json.py msgid "" @@ -86386,23 +87172,24 @@ msgid "" "however, if you fail, there is a chance that you will set off the trap, " "suffering the consequences." msgstr "" +"要拆除陷阱,按\"\"键检查其所在的位置。你的成功率取决于陷阱技能和敏捷。如果成功拆除,陷阱就会被移除并留下其部分或全部组件;然而,如果你失败,有一定几率你会触发陷阱,并承受相应后果。" #: lang/json/help_from_json.py msgid "" "Many traps are fully or partially hidden. Your ability to detect traps is " "entirely dependent upon your Perception. Should you stumble into a trap, " "you may have a chance to avoid it, depending on your Dodge skill." -msgstr "" +msgstr "很多陷阱是完全或部分隐藏的。你发现陷阱的能力完全取决于你的感知。当你触发陷阱,根据你的闪避技能级别,你有一定几率躲过陷阱。" #: lang/json/help_from_json.py msgid "" "Some traps can be build via the construction menu. Pit traps are the most " "common example of such traps." -msgstr "" +msgstr "一些陷阱能够通过建造菜单来建造,比如陷坑就是一个常见的例子。" #: lang/json/help_from_json.py msgid ": Items overview" -msgstr "" +msgstr ":物品概述" #: lang/json/help_from_json.py msgid "" @@ -86412,6 +87199,7 @@ msgid "" " a blue background. Pressing , then a direction key, will " "allow you to examine these containers and loot their contents." msgstr "" +"游戏中你会遇到各种各样的物品,如果它们只是放置在地上,你可以按\"\"键来拾取;如果物品被存放在家具或容器之中(图标为{并带有蓝色的背景),你需要按\"\"键配合方向键来检查容器并拿取其中的物品。" #: lang/json/help_from_json.py msgid "" @@ -86420,6 +87208,7 @@ msgid "" "superior. You can also access the item comparison menu by pressing C after " " to view nearby items menu is open and an item is selected." msgstr "" +"按\"\"键可以打开一个对比的菜单,你可以并列显示两件物品的属性并进行比较,其中较高的数值会被高亮。同时当你按\"\"键列出周围所有物品时,也可以按\"C\"键开启物品对比窗口。" #: lang/json/help_from_json.py msgid "" @@ -86431,6 +87220,7 @@ msgid "" "strength. Cutting damage is a guaranteed increase in damage, but it may be " "reduced by a monster's natural armor." msgstr "" +"游戏中绝大多数物品可以当做近战武器来使用,你可以按\"\"键打开物品栏并选择物品来查看物品属性,每件近战武器都可能有以下三种属性,钝击伤害、斩击伤害和命中加成(或惩罚)。钝击伤害对各种类型的敌人都有效,但如果玩家的力量不够高时,并不会太出彩;斩击伤害对于没有护甲的敌人来说很有效,但是却无法破甲。" #: lang/json/help_from_json.py msgid "" @@ -86441,6 +87231,7 @@ msgid "" " unwielding your weapon, it will go back in your inventory, or may be " "dropped on the ground if there is no space." msgstr "" +"你可以按\"\"键来手持物品,并装备为武器。再次装备手持的物品则可以让你进入空手状态。手持物品的体积不会计入携带物品体积之中,因此把那些大体积的物品拿在手中带走是一个不错的选项。当你卸下你的武器时,武器会自动进入你的物品栏,如果你的背包空间不够,则可以直接丢在地上。" #: lang/json/help_from_json.py msgid "" @@ -86452,6 +87243,7 @@ msgid "" "significantly hamper your movement and other abilities, especially during " "combat. You can view and sort worn items by pressing ." msgstr "" +"要装备一件衣物的话,按“”然后按下相应的按键。护甲能够减少你受到的伤害并对诸如烟雾一类的东西产生防护。要脱下一件衣物,按“”然后按下相应的按键。衣物和护甲能被装备在不同的穿戴层次上,并会提供不同的遮挡、保护和取暖。每件衣物都有附带的累赘度,而在某个穿戴层次上装备过度会对你的移动速度和其它能力产生明显影响,特别是当你战斗的时候。你可以按“”键来查看和排列你穿上的装备。" #: lang/json/help_from_json.py msgid "" @@ -86463,6 +87255,7 @@ msgid "" "layering penalty applies a minimum of 2 and a maximum of 10 encumbrance per " "article of clothing." msgstr "" +"你身上的衣服可以按穿戴层次分5层:贴身层,普通层,手腕层,外罩层和挂带层。你可以在每层都穿上一件不会带来额外的累赘度的装备。而每当在同一部位的同一层上加多一件服装,就会额外增加该部位累赘度。每件装备增加的累赘度惩罚最少为2,最多为10。" #: lang/json/help_from_json.py msgid "" @@ -86472,6 +87265,7 @@ msgid "" "on a tank top it would conflict with the leather touring suit and add the " "minimum encumbrance penalty of 2." msgstr "" +"举例来说,一个女性角色可以在躯干上穿一件皮革紧身衣(贴身层),一件皮制摩托套装(普通层),一件风衣(外罩层),一个幸存者跑步包(挂带层)。她此时的躯干累赘度为0。如果再穿上一件棉背心,将会与皮革紧身衣冲突,增加2点躯干累赘度惩罚。" #: lang/json/help_from_json.py msgid "" @@ -86479,6 +87273,8 @@ msgid "" "filter or prioritize items. You can enter item names, or various advanced " "filter strings: {:}" msgstr "" +"在物品浏览界面(按\"\"键)可以筛选或者过滤物品。你可以输入物品的名字来搜索物品,或者使用以下高级筛选符号: " +"{:}" #: lang/json/help_from_json.py msgid "" @@ -86488,10 +87284,15 @@ msgid "" "\t dgt = damage greater than (0-5) | {dgt:2}\n" "\t dlt = damage less than (0-5) | {dlt:1}" msgstr "" +"一些可用的筛选符号:\n" +"\t c = 类别(书籍,食物,等等)| {c:书籍}\n" +"\t m = 材质(棉,凯夫拉,等等)| {m:铁}\n" +"\t dgt = 伤害值大于(0-5) | {dgt:2}\n" +"\t dlt = 伤害值小于(0-5) | {dlt:1}" #: lang/json/help_from_json.py msgid ": Combat" -msgstr "" +msgstr ":战斗" #: lang/json/help_from_json.py msgid "" @@ -86501,6 +87302,7 @@ msgid "" "right side of the screen. The so called compass will display monsters that " "you see but are outside the screen." msgstr "" +"城市里的丧尸会在游戏开始时生成,但是也会四处游荡。所有的怪物都用字母或图形表现在你的屏幕上;一个怪物名称的列表,还有他们和你的相对位置,都会显示在屏幕的右端。这个列表也会显示在视野范围内但是在屏幕显示范围之外的怪物。" #: lang/json/help_from_json.py msgid "" @@ -86512,6 +87314,7 @@ msgid "" " stumble and lose movement points. If a monster hits you, your clothing may" " absorb some damage, but you will absorb the excess." msgstr "" +"要使用近战武器攻击敌人的话,只要朝着敌人移动过去即可。攻击所需要的时间取决于你的武器的尺寸和重量。小而轻的武器是最快的。徒手攻击的速度随着你徒手战斗技能的增加而增长,它最终会变得非常快。一次成功的钝器命中可能会使敌人眩晕一段时间,而锐器可能会卡在敌人身上,从你的手中挣脱——但是身上卡有武器的敌人的速度会大幅减慢。一次攻击失误会让你失去平衡,额外消耗一些行动点。如果怪物击中了你,你的衣物可能会吸收部分伤害,但是多出来的将由你承受。" #: lang/json/help_from_json.py msgid "" @@ -86520,6 +87323,7 @@ msgid "" "listed in a given firearm's description. Fortunately, a firearm often " "spawns with one such magazine in it." msgstr "" +"面对一大群怪物,你可能需要一把趁手的枪械才能得以幸存。游戏里大多数枪械都需要使用兼容的弹匣或者弹鼓以容纳子弹。兼容的弹匣会在枪械的物品说明界面中列出。幸好,在绝大多数情况下,游戏地图里生成的枪械都同时配有一个兼容的弹匣。" #: lang/json/help_from_json.py msgid "" @@ -86532,15 +87336,21 @@ msgid "" "chambering a round though. Of course all this takes some time, so try not " "to do it if there are monsters nearby." msgstr "" +"你可以按\"\"键从一把枪械卸下弹匣,然后再往弹匣里装入兼容的弹药,再重新往枪械里装入弹匣。如果枪械中的弹匣存有子弹但没有装满,恰好你的背包里刚好有这些子弹,你可以直接在握持枪械时按\"\"键装填弹药,游戏会自动完成卸下弹匣、一发一发地压入子弹再装回枪械的动作,可以节省你的操作按键。当然,这些动作都比较耗费时间,如果有怪物在旁边,你就还是小心点吧。" #: lang/json/help_from_json.py msgid "" -"While magazines are often firearm-specific, on some occasions a magazine is compatible with several other firearms. The firearms in the game often reflect real-world prototypes in terms of caliber and compatibility. Below are some examples of interchangeable ammo:\n" -".308 = 7.62x51mm,\n" -".223 = 5.56 NATO,\n" -".270 = .30-06,\n" -".40 S&W = 10mm." +"While magazines and clips are often firearm-specific, on some occasions a magazine/speedloader is compatible with several other firearms or calibers. Below are some examples of calibers that might share magazines or speedloaders:\n" +".380 ACP and 9mm Luger,\n" +" .40 S&W and 10mm Auto 3\n" +".45 ACP and .460 Rowland,\n" +".45 Colt and .454 Casull." msgstr "" +"虽然大多数弹匣常常只能用于特定的武器,其它一些弹匣和快速装弹器可以同时兼容几种武器或口径。下面是一些可以互相兼容的口径的例子:\n" +".380 ACP 弹 和 9mm 鲁格弹,\n" +".40 S&W 弹 和 10mm Auto 3 弹,\n" +".45 ACP 弹 和 .460 罗兰德弹,\n" +".45 柯尔特弹 和 .454 卡苏尔弹。" #: lang/json/help_from_json.py msgid "Magazine descriptions also list the compatible ammo." @@ -86553,6 +87363,8 @@ msgid "" " for example load 9x19mm JHP and 9x19mm FMJ ammo into the same magazine, " "since a magazine always requires identical rounds to be loaded in it." msgstr "" +"注意虽然有些弹药是互相通用的,它们不能被混在同一个弹匣里。一个弹匣里同时只能装入同种类的弹药,因此你无法将 9x19mm 空尖弹和 9x19mm " +"全金属被甲弹混装在同一个弹匣内。" #: lang/json/help_from_json.py msgid "" @@ -86562,6 +87374,7 @@ msgid "" "clothing item, activate () appropriate clothing item, at which " "point you'll get to choose which magazine to store." msgstr "" +"弹匣可以被存放在一些穿戴在身上的快取装备里,比如弹药腿包。兼容的快取装备会在弹匣的物品说明界面中列出。想要放入一个弹匣,按键使用对应装备,然后选择想要放入的弹匣即可。" #: lang/json/help_from_json.py msgid "" @@ -86578,18 +87391,18 @@ msgstr "" msgid "" "Key is not reserved only for guns. It also works for other " "distance weapons like spears or launchers, but the aiming options may vary." -msgstr "" +msgstr "键不仅仅可以用于开火,还可以用于投射其它远程武器,比如长矛或者发射器,但是瞄准界面可能会有所差别。" #: lang/json/help_from_json.py msgid "" "Fleeing will often be a solid tactic, especially when overwhelmed by a swarm" " of zombies. Try to avoid getting cornered inside a building. Ducking down" " into the subways or sewers is often an excellent escape tactic." -msgstr "" +msgstr "三十六计走为上,特别是当前方有一大波丧尸正在向你逼近的时候。尽量避免被逼进角落。你可以选择悄悄躲进地铁或者下水道等地方来逃走。" #: lang/json/help_from_json.py msgid ": Martial arts styles" -msgstr "" +msgstr ":武术流派" #: lang/json/help_from_json.py msgid "" @@ -86599,6 +87412,7 @@ msgid "" "found in their own traits, trained from manuals or by taking lessons from " "wandering masters." msgstr "" +"游戏提供了多种武术流派供你选择,其中也包括徒手格斗技术。你可以在创建角色时选择\"武术训练\"特性以在游戏初期就能够选择一项你喜欢的武术技能。你还能够通过多种方法,例如特定的角色特性,武术书籍手册,以及从四处流浪的武术大师处学习得到更多的武术流派。" #: lang/json/help_from_json.py msgid "" @@ -86612,6 +87426,7 @@ msgid "" "from accidentally wielding weapons taken from the ground, enable \"Keep " "hands free\" found in the styles menu." msgstr "" +"想要选择使用武术流派,按\"\"键。有些武术只能空手使用,有的可以或必须与某些武器配合使用。如果你的武器能够用于选择的武术,你会立刻开始使用选择的流派;否则,你所选择的武术流派将被设为默认。要使用流派对应的招式,需要装备招式对应的武器或者进入空手状态(按\"\"键,再按下手持物品的对应按键)。如果你想防止不小心手持地上的武器,那么请打开武术流派菜单中的\"保持空手\"的选项。" #: lang/json/help_from_json.py msgid "" @@ -86621,6 +87436,7 @@ msgid "" "range from special combo moves to bonuses depending on the situation you are" " in." msgstr "" +"你可以在选择武术流派的界面按“F1”来阅读关于一个流派的说明。说明中会列出该流派的被动和主动能力。每种流派都有许多独特的能力,从特殊组合技到依情况而异的增益效果。" #: lang/json/help_from_json.py msgid "" @@ -86628,24 +87444,24 @@ msgid "" " a skill requirement, and will be unavailable until you reach a level of " "unarmed skill. Those special moves or combos are executed automatically " "during attacks you make." -msgstr "" +msgstr "许多武术流派都有自己相应的特殊招式。多数招式都有技能要求,而且需要具备一定的徒手格斗技能等级。这些特殊招式或组合技会在你攻击时自动施放。" #: lang/json/help_from_json.py msgid "" "Many styles also have special passive effects unlocked under certain " "conditions. You can also check these by examining your style." -msgstr "" +msgstr "许多武术流派的招式在特定情况下会解锁一些特殊的被动效果。具体情况请查看具体的技能介绍。" #: lang/json/help_from_json.py msgid ": Survival tips" -msgstr "" +msgstr ":生存技巧" #: lang/json/help_from_json.py msgid "" "Survival hierarchy of needs in most cases is as follows: shelter, fire, " "water, food. The rest is the process of trying to answer a question what " "would you do in a survival situation?" -msgstr "" +msgstr "生存的优先级通常情况下如下:庇护所,篝火,水,食物。剩下的问题就是你在生存之中想要干什么了。" #: lang/json/help_from_json.py msgid "" @@ -86658,6 +87474,7 @@ msgid "" "scarce, while zombies are plenty, and unwanted attention may be more you can" " handle." msgstr "" +"当你脱离险境后,第一件要做的事就是检查你所处的地点,尽可能把有用的物品都搜刮掉。一开始你可能只能携带很少的东西,而一个背包,一件风衣,或者其它存储装备会让你能够携带的东西成倍增加。寻找武器比较重要,但是不是最优先的;诸如平底锅和菜刀都是在民宅中常见的现成武器。如果你遇到五金店的话,里面还有更多。在初期,枪械是你不到万不得已不应使用的王牌,因为弹药稀少而丧尸繁多,如果枪声吸引了大波的丧尸,你可能会更加走投无路。" #: lang/json/help_from_json.py msgid "" @@ -86667,6 +87484,7 @@ msgid "" "equipment. The high concentration of zombies makes them a deathtrap - but a" " necessary resource of food and ammunition." msgstr "" +"行走在大灾变后的城市中,请尽可能地收集各种药物,止痛剂是最重要的,香烟等易上瘾的物品也请注意收集。当你武装到一定程度之后,请尽快离开城市,因为虽然这里物资较丰富,但同样也有着数之不尽的丧尸群。" #: lang/json/help_from_json.py msgid "" @@ -86676,6 +87494,7 @@ msgid "" "cases you gain nothing from combat, unless you are equipped for it and " "killing zombies will help you achieve something." msgstr "" +"尽量避免战斗。如果你想逃走,不要迟疑,但是控制好体力,因为丧尸不像你一样需要停下休息。战斗总是伴随着风险,有时一招不慎,满盘皆输。大多数情况下,战斗对你没有任何好处,除非你装备充分并且需要杀丧尸来达成某种目的。" #: lang/json/help_from_json.py msgid "" @@ -86686,13 +87505,14 @@ msgid "" "can outpace your enemies. Irregular terrain, like forests, may help you lose" " monsters." msgstr "" +"如果可能的话,请尽量一次只面对一个敌人。某些情况下你可以一次引一只丧尸来逐渐消灭它们。你也可以选择转角或者门、窗等来调整战术,毕竟丧尸的行动是相对迟缓的。但是注意,如果你面对的是一群丧尸,它们可能会直接从门窗涌入。如果你有机会逃走的话,请不要迟疑,毕竟你的速度还是蛮快的,同时一些特殊的地形比如森林等,也可以用来帮助你摆脱敌人。" #: lang/json/help_from_json.py msgid "" "Using firearms is the easiest way to kill an enemy, but the sound will " "attract unwanted attention. Save the guns for emergencies, and melee when " "you can." -msgstr "" +msgstr "枪械是最适合用来杀敌的,但是其发出的噪音同样容易引来更多的敌人,所以请尽量使用近战武器,偶尔耍枪,耍完就逃。" #: lang/json/help_from_json.py msgid "" @@ -86702,6 +87522,7 @@ msgid "" "acid damage. Items made of glass, ceramics, diamond or precious metals will" " be totally immune to acid." msgstr "" +"抵抗酸液伤害的衣服材料的抗性强度分别是:塑料>凯夫拉>皮革>布料。所以尽管皮革和凯夫拉材料衣物能从活跃的敌人中提供临时的防护,要对抗酸液伤害,高抗性的全套三防服和橡胶靴子才是最好的选择。另外,玻璃、陶瓷、钻石和其他贵金属等材料的制品能完全免疫酸液伤害。" #: lang/json/help_from_json.py msgid "" @@ -86711,6 +87532,7 @@ msgid "" "looting empty-handed, you never know what might happen, so have your most " "crucial survival items with you." msgstr "" +"只要不超重,请尽量把你的物品栏塞满,因为你不知道会不会什么时候一样东西就派上了用场。就算没有用上,你也可以把它们卖给别人。就算你不想要一样东西,也可以随时把它扔掉。但是不要空手去搜刮物质,因为你不知道前方有什么样的危机在等待着你,所以一定带上最重要的生存物资。" #: lang/json/help_from_json.py msgid "" @@ -86725,6 +87547,7 @@ msgid "" "field. Finding or making a shelter with a place to sleep is very important " "to your survival." msgstr "" +"留意天气,大风大雨会急剧降低温度,如果你无法抵挡最好寻求庇护点。保持干燥是很重要的,特别是在可能会导致冻伤的天气下。如果你被雨淋湿,使用毛巾来擦干自己。如果你在夜晚无法保持温暖,可以考虑铺一堆衣服在地板上睡。要是能够找到枕头和毯子,你可以睡得很香。但是就算找不到,你也可以发挥一下想象力,比如地下室的一把椅子总比野外的湿地睡着舒服。寻找或者建造一个能够睡觉的庇护所对生存来说非常重要。" #: lang/json/help_from_json.py msgid "" @@ -86737,16 +87560,17 @@ msgid "" "you in the long run. If those are out of your reach think about " "constructing root cellar." msgstr "" +"冬天是非常严酷的。液体和食物都会冻结,你在食用它们之前可能需要用厨具将其解冻。你也可以把它们放在篝火旁边来解冻。地下室相对外界来说更加冬暖夏凉,你可以把你多余的食物放在那里。大多数的食物都会逐渐腐坏,而腐败的过程会受温度的影响。冷冻的食物不会腐坏。如果你能够修好一个冰柜或者冰箱,就能够长期保存食物。如果你找不到能用的冰柜或者冰箱,你也可以考虑建造一个地窖。" #: lang/json/help_from_json.py msgid "" "You may preserve food in many other ways, for example by using a smoking " "rack, or using it in a meal that has a longer shelf life." -msgstr "" +msgstr "你也可以通过其它方式保存食物,比如使用烟熏架,或者将其做成能长期保存的食品。" #: lang/json/help_from_json.py msgid ": Vehicles and Driving" -msgstr "" +msgstr ":载具与驾驶" #: lang/json/help_from_json.py msgid "" @@ -86763,6 +87587,9 @@ msgid "" "adjust course and speed. You default to cruise control, so the gas/brake " "adjust the speed which the vehicle will attempt to maintain." msgstr "" +"想要控制载具,找到\"载具控制器\"及\"座椅\"所在位置并按\"\"键。控制载具后,按\"\"键向前加速,按\"\"键减速或者向后倒车," +" " +"按\"\"/\"\"键左转/右转。方向键可以调整方向和速度。游戏默认使用定速巡航,所以调整加速/刹车只是调整当前载具期望保持的速度,你还需要按\"5\"或\".\"键让时间流逝才能开动载具。" #: lang/json/help_from_json.py msgid "" @@ -86770,6 +87597,7 @@ msgid "" "fumble the controls. As your Driving skill improves, you will fumble less " "and less. To simply maintain course and speed, hit ." msgstr "" +"对于初学者来说,10-30英里/小时,或者16-48公里/小时,是比较适合的速度,适宜摸索熟悉驾驶方法。当你的驾驶技能提高,你的失误会越来越少。若仅为维持当前的方向和车速,按\"\"键。" #: lang/json/help_from_json.py msgid "" @@ -86779,6 +87607,8 @@ msgid "" " to bring up the \"Vehicle Controls\" menu, which has" " options for things you'd do from the driver's seat." msgstr "" +"在停车时,为了安全起见,记得按\"s\"键拉下手刹。如果你想要下车、开关车灯、开关定速巡航、开关引擎,或者使用载具控制器的其他选项,按\"\"键调出\"载具控制\"菜单," +" 这些事你可以坐在驾驶员座位的位置上完成。" #: lang/json/help_from_json.py msgid "" @@ -86882,7 +87712,7 @@ msgstr "船只和两栖车辆" msgid "" "You can use boat hull parts to create boats or amphibious vehicles that can " "move between water and land." -msgstr "" +msgstr "你可以使用船体部件来制造船只或两栖车辆,以便在水面和陆地之间移动。" #: lang/json/help_from_json.py msgid "" @@ -86936,6 +87766,10 @@ msgid "" "! Medication\n" "These are all consumed by using . They provide a certain amount of nutrition, quench your thirst, may be a stimulant or a depressant, and may provide morale. There may also be more subtle effects." msgstr "" +"~ 饮料\n" +"%% 食物\n" +"! 医疗用品\n" +"上述物品都可以按\"\"键来使用,它们能充饥、能解渴、能兴奋你也能镇静你,有些也能提升角色的心情值。当然有些物品也会对你有些更不易察觉的作用。" #: lang/json/help_from_json.py msgid "" @@ -86944,37 +87778,50 @@ msgid "" ", Tiny item\n" "These are all generic items, useful only to be wielded as a weapon. However, some have special uses; they will show up under the TOOLS section in your inventory. Press to use these." msgstr "" +"/ 大型武器\n" +"; 小型武器或工具\n" +", 微型工具\n" +"\n" +"这类物品通常都是近战武器或者工具,当然有些也有特殊的功能;当你查看物品栏时会显示在\"工具\"一栏,按\"\"键来使用物品。" #: lang/json/help_from_json.py msgid "" ") Container\n" "These items may hold other items. Some are passable weapons. Many will be listed with their contents, e.g. \"plastic bottle of water\". Those containing comestibles may be eaten with ; this may leave an empty container." msgstr "" +") 容器\n" +"这些物品可以用来储存其他的物品,有些可以存放武器,而其中的内容物通常显示在物品名中,比如\"塑料瓶 装着 净水\"等。装有消耗品的容器可以按\"\"键直接使用,使用完会得到一个空容器。" #: lang/json/help_from_json.py msgid "" "[ Clothing\n" "This may be worn with the key or removed with the key. It may cover one or more body parts; you can wear multiple articles of clothing on any given body part, but this will encumber you severely. Each article of clothing may provide storage space, warmth, encumbrance, and a resistance to bashing and/or cutting attacks. Some may protect against environmental effects." msgstr "" +"[ 衣物\n" +"游戏中找到的衣物可以通过按\"\"键来穿上或者按\"\"键脱下。每件衣物会覆盖一个或多个肢体,在游戏中你可以在同一处肢体上穿上多件衣物,但这样会极大地增加你的累赘度,每件衣物都会提供一定的储存空间、保暖度、累赘度以及对于钝击伤害和斩击伤害的防护。有些衣物能让你不受环境效果的影响。" #: lang/json/help_from_json.py msgid "" "( Firearm\n" "This weapon may be loaded with ammunition with , unloaded with , and fired with . Some have automatic fire, which may be used with at a penalty to accuracy. The color refers to the type; handguns are gray, shotguns are red, submachine guns are cyan, rifles are brown, assault rifles are blue, and heavy machine guns are light red. Each has a dispersion rating, a bonus to damage, a rate of fire, and a maximum load. Note that most firearms load fully in one action, while shotguns must be loaded one shell at a time." msgstr "" +"( 枪械\n" +"所有的枪械都可以按\"\"键装填,按\"\"键清空,按\"\"键开火,可以连发的按\"\"键连发。不同枪械的颜色也不同,灰色为手枪,红色为霰弹枪,蓝绿色为冲锋枪,棕色为步枪,蓝色为突击步枪,浅红色为重机枪。每种枪械都有不同的命中率、伤害值、射速和最大装弹量。需要注意的是虽然大多数的枪械一次装填完成,但是霰弹枪一次只能装填一发子弹。" #: lang/json/help_from_json.py msgid "" "= Ammunition\n" "Ammunition is worthless without a gun to load it into. Generally, there are several variants for any particular caliber. Ammunition has damage, dispersion, and range ratings, and an armor-piercing quality." msgstr "" +"= 弹药\n" +"如果没有枪来装载的话,弹药就什么都不是。一般来说,每一种口径的弹药都有几种变种。弹药有伤害、散布、射程、穿甲等级。" #: lang/json/help_from_json.py msgid "" "* Thrown weapon; simple projectile or grenade\n" "These items are suited for throwing, and many are only useful when thrown, such as grenades, Molotov cocktails, or tear gas. Once activated be certain to throw these items by pressing , then the letter of the item to throw." msgstr "" -"* 投掷武器;投掷物或是手雷\n" +"* 投掷武器;投掷物或是手雷\n" "这些物品适合投掷,并且多数只适合用来投掷,比如手雷、燃烧瓶或是催泪瓦斯。一旦激活,确保这些物品被扔出去。按\"\"键,然后按物品对应按键来扔出。" #: lang/json/help_from_json.py @@ -86982,10 +87829,12 @@ msgid "" "? Book or magazine\n" "This can be read for training or entertainment by pressing . Most require a basic level of intelligence; some require some base knowledge in the relevant subject. Some books may contain useful crafting recipes." msgstr "" +"? 书籍杂志\n" +"此类物品可以用来学习技能或娱乐,按\"\"键阅读,大部分书籍的阅读需要一定的智力,而其中一些更需要你具备一定的相应知识才能理解。有些书籍可能包含有用的物品制造配方。" #: lang/json/help_from_json.py msgid "<2>: Description of map symbols" -msgstr "2:地图图例指南" +msgstr "<2>:地图图例指南" #: lang/json/help_from_json.py msgid "MAP SYMBOLS:" @@ -87028,7 +87877,7 @@ msgstr "R 河流 - 大部分生物不能游过河 msgid "" "O Parking lot - Empty lot, few items. " "Mostly useless." -msgstr "O 停车场 - 非常空旷,几乎没有物品。大部分没啥用。" +msgstr "O 停车场 - 非常空旷,几乎没有物品。基本没啥用。" #: lang/json/help_from_json.py msgid "" @@ -87098,7 +87947,7 @@ msgstr "^>v< 各类人造建筑 - 符号箭头尖端 #: lang/json/help_from_json.py msgid " There are many others out there... search for them!" -msgstr "此外还有许多其它类型的地点……找找看吧!" +msgstr " 此外还有许多其它类型的地点……找找看吧!" #: lang/json/help_from_json.py msgid "" @@ -87106,14 +87955,14 @@ msgstr "" #: lang/json/help_from_json.py msgid "<3>: Description of gun types" -msgstr "3:枪械类型指南" +msgstr "<3>:枪械类型指南" #: lang/json/help_from_json.py msgid "" "( Handguns\n" "Handguns are small weapons held in one or both hands. They are much more difficult to aim and control than larger firearms, and this is reflected in their poor accuracy. However, their small size makes them appropriate for short-range combat. They are also relatively quick to reload and use a very wide selection of ammunition. Their small size and low weight make it possible to carry several loaded handguns, switching from one to the next once their ammo is spent." msgstr "" -"( 手枪\n" +"( 手枪\n" "手枪可以单手持用也可以双手持用,但和大型枪械相比更难瞄准及控制,因此其命中率相比较低。不过,由于体积小,使它更适合在近距离交火时使用。手枪可以选择的弹药很广泛,并且装填速度也很快,加上它们小巧的体积和重量让你可以备上几把装填完毕的手枪,在需要的时候连着使用。" #: lang/json/help_from_json.py @@ -87122,6 +87971,9 @@ msgid "" "The best feature of crossbows is their silence. The bolts they fire are only rarely destroyed; if you pick up the bolts after firing them, your ammunition supply will last much longer. Crossbows suffer from a short range and a very long reload time (modified by your strength); plus, most only hold a single round. \n" "For this reason, it is advisable to carry a few loaded crossbows. Crossbows can be very difficult to find; however, it is possible to craft one given enough Mechanics skill. Likewise, it is possible to make wooden bolts from any number of wooden objects, though these are much less effective than steel bolts. Crossbows use the handgun skill." msgstr "" +"( 弩\n" +"弩的最大优点就是发射时噪声很低。并且弩矢在射出之后通常不会被损坏,如果你能养成回收弩矢的好习惯,那弹药并不会很缺。由于使用机械动力,所以十字弓的射程很近,装填时间也很长(受力量影响),并且通常一次只能装填一发弩矢,所以尽可能提前准备多把上好弦的弩备用。\n" +"游戏中,弩也是较难获得的武器之一,所以大多数情况下玩家必须自己制作一把。同样的,你可以使用木材制作木制弩矢,不过它们要比金属弩矢效果更差。此外,弩使用手枪技能。" #: lang/json/help_from_json.py msgid "" @@ -87129,6 +87981,9 @@ msgid "" "Silent, deadly, easy to make, and the arrows are reusable. Bows have been used forever. Bows are two handed and require the user to have a certain strength level. If you do not have enough strength to draw the string back, you will fire at a reduced effectiveness. This reduces the reload and fire speeds and decreases the range of the arrows fired. \n" "Most normal bows require strength of at least 8, others require an above average strength of 10, or a significant strength of 12. Bows use the archery skill." msgstr "" +"( 弓\n" +"无声,致命,易于制造,箭可以重复利用。弓已经被人类使用了不知道多久了。使用弓需要两只手,并且对于使用者的力量有一定要求。如果你没有足够的力量开弓,那么你的射击效率就会下降。上箭速度,射击速度还有射程都会因此降低。\n" +"大部分普通的弓都需要至少8的力量,其他的一些则需要更强的10点力量,或者更加强大的12的力量。弓使用弓术技能。" #: lang/json/help_from_json.py msgid "" @@ -87136,19 +87991,24 @@ msgid "" "Shotguns are some of the most powerful weapons in the game, capable of taking out almost any enemy with a single hit. Birdshot and 00 shot spread, making it very easy to hit nearby monsters. However, they are very ineffective against armor, and some armored monsters might shrug off 00 shot completely. Shotgun slugs are the answer to this problem; they also offer much better range than shot.\n" "The biggest drawback to shotguns is their noisiness. They are very loud, and impossible to silence. A shot that kills one zombie might attract three more! Beware of that." msgstr "" +"( 霰弹枪\n" +"霰弹枪系列是游戏中威力最大的武器之一,使用得当的话,几乎没有敌人可以扛过一枪。猎鸟弹和00弹是散射型的,在近距离很容易击中目标。然而它们的穿甲能力很弱,面对一些重甲的敌人甚至无法造成任何伤害。而使用独头弹则可以解决重甲敌人,而且射程也较远。\n" +"霰弹枪最大的不足之处就是它们的噪音。十分吵,而且没法安装消音器。杀死一只丧尸的一枪可能会引来多只新丧尸!因此使用时要当心。" #: lang/json/help_from_json.py msgid "" "( Submachine Guns\n" "Submachine guns are small weapons (some are barely larger than a handgun), designed for relatively close combat and the ability to spray large amounts of bullets. However, they are more effective when firing single shots, so use discretion. They mainly use the 9mm and .45 ammunition; however, other SMGs exist. They reload moderately quickly, and are suitable for close or medium-long range combat." msgstr "" +"( 冲锋枪\n" +"微型冲锋枪属于小型枪械(有些甚至比手枪大不了多少),通常靠倾泻大量子弹来近距离作战,然而,单发射击时命中率更高,所以需要仔细斟酌。微型冲锋枪通常使用的是9mm及.45口径的子弹,当然也有例外。微冲的一大特性就是装填相对很快,所以在近距离及中距离的战斗中都会很有用。" #: lang/json/help_from_json.py msgid "" "( Sniper and Marksman Rifles\n" "Sniper and marksman rifles are popular for their superior range and accuracy. What's more, their scopes or sights make shots fired at targets at very long range as accurate as those with a shorter range. Unlike assault rifles, sniper and marksman rifles usually have no automatic fire. They are also may be slow to reload and fire, so when facing a large group of nearby enemies, they are not the best pick." msgstr "" -"( 狙击枪和精确步枪\n" +"( 狙击枪和精确步枪\n" "狙击枪和精确步枪因其优越的射程和精准度而闻名,此外,配合其瞄准镜具,可以让你如同命中近处敌人一样,轻松命中距离遥远的敌人。与突击步枪不同的是,狙击枪和精确步枪大多不能连发,并且装填速度也较慢,所以当你面对大群敌人的时候,它们并不是你的最好选择。" #: lang/json/help_from_json.py @@ -87157,13 +88017,16 @@ msgid "" "Assault rifles are similar to hunting rifles in many ways; they are also suited for long range combat, with similar bonuses and penalties. Unlike hunting rifles, assault rifles are capable of automatic fire. Assault rifles are less accurate than hunting rifles, and this is worsened under automatic fire, so save it for when you're highly skilled. \n" "Assault rifles are an excellent choice for medium or long range combat, or even close-range bursts again a large number of enemies. They are difficult to use, and are best saved for skilled riflemen." msgstr "" +"( 突击步枪\n" +"突击步枪跟猎枪在很多方面有相似之处:都很适合长程的战斗、都受到同样属性的奖惩,而与猎枪不同的是突击步枪可以连发。比起猎枪,突击步枪的命中率会低一些,而且在连发时更明显,所以最好当你的枪械技能足够高了以后再选择使用突击步枪。\n" +"突击步枪最适合应对中远程的战斗,甚至在近战中也能摞倒一片敌人,但使用它们很讲究技巧,所以嘛,先练好打手枪再回来。" #: lang/json/help_from_json.py msgid "" "( Machine Guns\n" "Machine guns are one of the most powerful firearms available. They are even larger than assault rifles; however, they are capable of holding 100 or more rounds of highly-damaging ammunition. They are not built for accuracy, and firing single rounds is not very effective. However, they also possess a very high rate of fire and somewhat low recoil, making them very good at clearing out large numbers of enemies." msgstr "" -"( 机枪\n" +"( 机枪\n" "各种机枪是游戏中威力最大的一类武器,相比突击步枪体积更大;但是,它们可以一次性装填100发以上的高能弹药,对于机枪来说,命中率不是它们的追求,单发射击也不是理想的选择。但是,它们所拥有的超高射速和相比而言较小的后坐力,使其非常适合用来清扫大批敌人。" #: lang/json/help_from_json.py @@ -87172,30 +88035,37 @@ msgid "" "Energy weapons is an umbrella term used to describe a variety of rifles and handguns which fire lasers, plasma, or energy attacks. They are mostly prototypes that started to appear in military use just prior to the start of the apocalypse, and as such are very difficult to find.\n" "Energy weapons have no recoil at all; they are nearly silent, have a long range, and are fairly damaging. The biggest drawback to energy weapons is scarcity of ammunition; it is wise to reserve the precious ammo for when you really need it." msgstr "" +"( 能量武器\n" +"能量武器是枪械中的一朵奇葩,从步枪到手枪都有,发射激光、等离子或能量攻击。基本上只有一些原型机在大灾变之前曾被应用在军事领域,因此如今也很难遇到。\n" +"能量武器的优点很多:完全没有后坐力、几乎是无声的、射程极长并且伤害非常可观,而使用能量武器最大的限制就是弹药非常之稀少,所以能量武器的正确使用方法就是留到最关键的时候。" #: lang/json/help_from_json.py msgid "<4>: FAQ (contains spoilers!)" -msgstr "4:常见问题(包含剧透!)" +msgstr "<4>:常见问题(包含剧透!)" #: lang/json/help_from_json.py msgid "" "Q: What is Safe Mode, and why does it prevent me from moving?\n" "A: Safe Mode is a way to guarantee that you won't die by holding a movement key down. When a monster comes into view, your movement will be ignored until Safe Mode is turned off with the ! key. This ensures that the sudden appearance of a monster won't catch you off guard." msgstr "" +"问:那个\"安全模式\"是干嘛用的?为什么开了反而不能移动了呢?\n" +"答:\"安全模式\"的用意是当你持续按住一个方向键进行跑步的时候,如果视线范围内出现敌人的话,不至于来不及收手而冲进敌群。一旦能看到敌人,你就会自动停下,除非按\"!\"键解除安全模式,否则不会移动。" #: lang/json/help_from_json.py msgid "" "Q: It seems like everything I eat makes me sick! What's wrong?\n" "A: Lots of the food found in towns is perishable and will only last a few days after the start of a new game. The electricity went out several days ago so fruit, milk and others are the first to go bad. After the first couple of days, you should switch to canned food, jerky, and hunting. Also, you should make sure to cook any food and purify any water you hunt up as it may contain parasites or otherwise be unsafe." msgstr "" +"问:为什么几乎我吃下去的所有东西都会让我生病?\n" +"答:城镇中所能找到的大部分食物都容易腐烂,在游戏开始后只能存放数天。而城镇供电早在大灾变前几天就停止了,因此冰箱中的水果和牛奶将首先腐烂。在游戏开始后的数天,你将不得不依靠罐装食品、肉干或是狩猎维持生存。而且,你需要记得烹饪你所找到的生食并净化生水,因为这些物品都可能被寄生虫或其他物质污染而变得不能安全食用。" #: lang/json/help_from_json.py msgid "" "Q: How can I remove boards from boarded-up windows and doors?\n" "A: Use a hammer and choose the direction of the boarded-up window or door to remove the boards." msgstr "" -"问:我要怎样才能封上门窗呢?\n" -"答:你需要一把锤子、一堆钉子、几块板子,然后对着你想要封上的门窗使用就行了。" +"问:我要怎样才能移除封住的门窗上的木板?\n" +"答:使用一把锤子,然后选择门窗的方向就行了。" #: lang/json/help_from_json.py msgid "" @@ -87210,24 +88080,32 @@ msgid "" "Q: How can I prevent monsters from attacking while I sleep?\n" "A: Find a safe place to sleep, for example in a cleared building far from the front door. Set traps if you have them, or build a fire to scare off wild animals." msgstr "" +"问:睡觉的时候怎样才能防止被怪物侵袭?\n" +"答:首先建议你选个安全的地方睡觉,比如建筑物内远离出入口的地方,在身边设几个陷阱,如果想要防止野生动物的话就再生一把火。" #: lang/json/help_from_json.py msgid "" "Q: Why do I always sink when I try to swim?\n" "A: Your swimming ability is reduced greatly by the weight you are carrying, and is also adversely affected by the clothing you wear. Until you reach a high level of the swimming skill, you'll need to drop your equipment and remove your clothing to swim, making it a last-ditch escape plan. Diving gear may significantly help you in swimming and diving." msgstr "" +"问:为什么我游泳的时候总是会沉下去啊?\n" +"答:你携带了太多东西,所以你的游泳能力被大幅降低了,而且你穿的衣服也会影响你的游泳能力。在你把游泳技能练得出神入化之前,要下水,最好扔掉所有的装备,并脱下身上衣物减轻累赘,因此游泳是你最后不得已的逃生手段。最后,如果你有潜水装备的话,游泳和潜水的能力能够大幅提升。" #: lang/json/help_from_json.py msgid "" "Q: How can I cure a fungal infection?\n" "A: Royal jelly, the Blood Filter bionic, and some antifungal chemicals can cure fungal infection. You can find royal jelly in the bee hives which dot forests. Antifungal chemicals to cure the fungal infection can either be found as random loot or made from other ingredients." msgstr "" +"问:如何才能治愈真菌感染?\n" +"答:蜂王浆,血液过滤CBM,或者其他一些抗真菌化合物。你在以在丛林中点缀的蜂巢里找到蜂王浆,而抗真菌化合物则可以搜刮得来,也可以按照特定配方制造。" #: lang/json/help_from_json.py msgid "" "Q: How do I get into science labs?\n" "A: You can enter the front door if you have an ID card by examining () the keypad. If you are skilled in computers and have an electrohack, it is possible to hack the keypad. An EMP blast has a chance to force the doors open, but it's more likely to break them. You can also sneak in through the sewers sometimes, or try to smash through the walls with explosions." msgstr "" +"问:我该如何进入一个科学实验室呢?\n" +"答:如果你有ID卡的话从正门查看读卡器(按\"\"键)进去就是了;如果你的电脑技术够高并且有一套电子黑客仪,你也可以黑开大门;如果你有EMP武器,也有可能暂时使大门失效,但更有可能毁掉大门;或者你可以试着从下水道等地方潜入实验室;甚至你也可以直接用炸药把实验室的墙壁炸开。" #: lang/json/help_from_json.py msgid "" @@ -87242,18 +88120,24 @@ msgid "" "Q: Why can't I carry anything?\n" "A: At the start of the game you only have the space in your pockets. A good first goal of many survivors is to find a backpack or pouch to store things in." msgstr "" +"问:我怎么拿不了东西了?\n" +"答:在游戏一开始,你只有衣服有口袋可以装几个道具而已。随着游戏的进行,你可以在商店或者其他地方找到背包或者钱包,从而可以携带更多的物品。" #: lang/json/help_from_json.py msgid "" "Q: Help! I started a fire and now my house is burning down!\n" "A: Fires will spread to nearby flammable tiles if they are able. Lighting a fire in a set-up brazier, stove, wood stove, stone fireplace, pit, or even in a kitchen stove will stop it from spreading. Fire extinguishers can put out fires that get out of control. You can put out a fire in the fireplace by examining it." msgstr "" +"问:救命啊!我点了把火不小心把房子给烧了!\n" +"答:火势会向着周围的易燃物蔓延,你可以在火盆、柴炉、石炉、灶台中生火,或者挖坑生火来阻止它的蔓延,而想要灭火时查看这些位置就可以选择熄灭火焰。灭火器可以用来灭掉失去控制的火焰。" #: lang/json/help_from_json.py msgid "" "Q: I'm cold and can't sleep at night!\n" "A: Gather some clothes and put them in the place you use to sleep in. Being hungry, thirsty, wet, or injured can also make you feel the cold more, so try to avoid these effects before you go to sleep. Pillows and some other appliances will help you sleep, and the quality of your sleeping spot is also very important." msgstr "" +"问:我晚上冻的睡不着!\n" +"答:收集一些衣服什么的,把它们扔在你要睡觉的地方。饥饿,口渴,淋湿,或者受伤都会让你觉得更冷,所以在睡觉前尽量不要处于这些状态。枕头之类的物品可以帮助你入睡,你的睡眠地点的质量也有很大的影响。" #: lang/json/help_from_json.py msgid "" @@ -87265,12 +88149,21 @@ msgid "" " .308 (7.62) - for even more powerful rifles. Also good long range option.\n" " It should be enough in the beginning. Or even just grab any shotgun, fill it with buckshot and give them hell!" msgstr "" +"问:游戏中枪械和弹药的口径太多了,我实在是弄不清它们之间是如何兼容的。\n" +"答:可以试着记下几个常见的口径:\n" +" 9x19mm(或9mm)口径 - 能适用于多数常见手枪(例如Glock)及冲锋枪,很容易找到而且对付普通丧尸时还算胜任。\n" +" 00号猎鹿弹 - 适用于大部分霰弹枪。近距离对付无装甲目标时威力巨大。\n" +" .223(5.56mm)口径 - 步枪所使用的口径。很好的狙击弹选项。\n" +" .308(7.62mm)口径 - 威力更大步枪所使用的口径。另一个不错的狙击弹选项。\n" +"这些应该足够让你度过游戏初期了。你当然也可以抓起身边任何一把霰弹枪,装满猎鹿弹,然后把敌人们送进地狱去!" #: lang/json/help_from_json.py msgid "" "Q: I have a question that's not addressed here. How can I get an answer?\n" "A: Check the wiki, or ask the helpful people on the forum or at the chat channels. Links are provided in MOTD in the main menu." msgstr "" +"问:我还有些问题这里没有找到答案,我该去问谁呢?\n" +"答:你可以查游戏百科cddawiki.chezzo.com/cdda_wiki,或者把你的问题发到smf.cataclysmdda.com的论坛或者freenode的#CataclysmDDA频道,我们将尽量回答。另外,既然你丫玩的是中文版,去百度cataclysmdda吧或者三大妈的cdda专区都会有筒子帮你的。by 五毛钱" #: lang/json/item_action_from_json.py msgid "Repair cotton/leather/wool/Nomex/fur" @@ -87318,7 +88211,7 @@ msgstr "挖掘岩石" #: lang/json/item_action_from_json.py msgid "Pack CBM in pouch" -msgstr "" +msgstr "把 CBM 装到灭菌袋里" #: lang/json/item_action_from_json.py msgid "Burrow through rock" @@ -87443,7 +88336,7 @@ msgstr "使用" #: lang/json/item_action_from_json.py msgid "Sterilize" -msgstr "" +msgstr "消毒" #: lang/json/item_action_from_json.py src/artifact.cpp msgid "Ring" @@ -87634,8 +88527,9 @@ msgid "Measure radiation" msgstr "测量辐射" #: lang/json/item_action_from_json.py lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py #: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py -#: lang/json/talk_topic_from_json.py src/game_inventory.cpp +#: src/game_inventory.cpp msgid "..." msgstr "……" @@ -87697,12 +88591,16 @@ msgid "Well, you know" msgstr "放松一下" #: lang/json/item_action_from_json.py -msgid "Wash clothes" -msgstr "洗衣服" +msgid "Wash soft items" +msgstr "清洗软质物品" #: lang/json/item_action_from_json.py -msgid "Wash CBMs" -msgstr "" +msgid "Wash hard items" +msgstr "清洗硬质物品" + +#: lang/json/item_action_from_json.py +msgid "Wash items" +msgstr "清洗物品" #: lang/json/item_action_from_json.py msgid "Purify some water" @@ -87800,12 +88698,12 @@ msgstr "这个物品可在相邻的地上直接激活或重新装填,无须拾 #: lang/json/json_flag_from_json.py msgid "" "This item goes in the outer aura layer, intended for metaphysical effects." -msgstr "" +msgstr "这件物品位于外部光环中,用于产生超自然效果。" #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This is in your outer aura." -msgstr "" +msgstr "这在你的外部光环内。" #: lang/json/json_flag_from_json.py msgid "" @@ -87969,12 +88867,12 @@ msgstr "这件装备 纠正近视。" msgid "" "Zombie-dropped clothing giving various penalties if Filthy mod is active. " "Also CBMs harvested from zombies." -msgstr "" +msgstr "如果开启了肮脏衣物,穿上丧尸身上获得的肮脏衣物会有负面效果,而肮脏的CBM也会需要特殊处理才能使用。" #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This item is filthy." -msgstr "" +msgstr "这件物品很肮脏。" #: lang/json/json_flag_from_json.py msgid "Used for eyes protection from flashbang." @@ -88180,14 +89078,14 @@ msgstr "妨碍玩家双手握持物品,如果物品可以单手握持,则强 #: lang/json/json_flag_from_json.py msgid "" "Prevents the item from participating in the encumbrance system when worn." -msgstr "" +msgstr "使物品被穿戴时不影响累赘度。" #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "" "It seems partially intangible, and can occupy the same space as" " other things when worn." -msgstr "" +msgstr "这件物品处于近乎无形的状态,可以与其它物品占据同一空间。" #: lang/json/json_flag_from_json.py msgid "This item can be stored in a sheath of the appropriate size." @@ -89198,7 +90096,7 @@ msgstr "显示全部" #: lang/json/keybinding_from_json.py msgid "Confirm & quit" -msgstr "确认并推出" +msgstr "确认并退出" #: lang/json/keybinding_from_json.py msgid "Resize" @@ -89218,7 +90116,7 @@ msgstr "移动形状" #: lang/json/keybinding_from_json.py msgid "Switch to move point / confirm" -msgstr "切换到行动点/确认" +msgstr "切换移动光标/确认" #: lang/json/keybinding_from_json.py msgid "Edit traps" @@ -89570,7 +90468,7 @@ msgstr "查看能见度视图" #: lang/json/keybinding_from_json.py msgid "View Radiation Map" -msgstr "" +msgstr "查看地图辐射值" #: lang/json/keybinding_from_json.py msgid "Switch Sidebar Style" @@ -89602,7 +90500,7 @@ msgstr "切换自动功能" #: lang/json/keybinding_from_json.py msgid "Toggle Auto Pulp/Butcher" -msgstr "切换尸体自动屠宰/砸碎" +msgstr "切换尸体自动屠宰/捣碎" #: lang/json/keybinding_from_json.py msgid "Toggle Auto Mining" @@ -91203,6 +92101,41 @@ msgstr "各类蓄电池任你挑!大减价!" msgid "the name is gone but a slogan remains: 'We'll repair you all the way'" msgstr "名字已经无法辨认了,但口号仍然在:\"我们一路伴您修理!\"" +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "EnviroCom OS v2.03 - Basement Access" +msgstr "EnviroCom OS v2.03 - 地下室入口" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Unlock stairs" +msgstr "开启楼梯" + +#. ~ Sign +#: lang/json/mapgen_from_json.py +msgid "Authorized personnel only" +msgstr "非请勿入" + +#. ~ Sign +#: lang/json/mapgen_from_json.py +msgid " sewage treatment plant" +msgstr "污水处理站" + +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "EnviroCom OS v2.03" +msgstr "EnviroCom OS v2.03" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Download Sewer Maps" +msgstr "下载管道地图" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Divert sample" +msgstr "转移样品" + #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Evac shelter computer" @@ -91297,7 +92230,7 @@ msgstr "绿叶茶馆" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "RESTRICTED AREA! AUTHORIZED PERSONNEL ONLY" -msgstr "" +msgstr "此处禁区 非请勿入" #. ~ Sign #: lang/json/mapgen_from_json.py @@ -91422,7 +92355,7 @@ msgstr "开启储藏室" #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Prototype DARPA-713 AUTHORIZED PILOTS ONLY" -msgstr "" +msgstr "DARPA-713原型机 非请勿入" #. ~ Computer name #: lang/json/mapgen_from_json.py @@ -91530,10 +92463,11 @@ msgid "" "injury to the attacker. It uses defensive throws and disarms but lacks " "offensive tehcniques." msgstr "" +"合气道是一种专注自卫的日本武术,以抓筋拿脉,分筋错骨为主要手段,尽量减少对对方的实际伤害。它使用防御性的投技并解除敌人的武装,但是缺乏攻击性技巧。" #: lang/json/martial_art_from_json.py msgid "Aikido Stance" -msgstr "" +msgstr "合气道步法" #. ~ Description of buff 'Aikido Stance' for martial art 'Aikido' #: lang/json/martial_art_from_json.py @@ -91541,11 +92475,11 @@ msgstr "" msgid "" "By disregarding offensive in favor of self-defense, you are better at " "protecting. Blocked damage reduced by 100%% of Dexterity." -msgstr "" +msgstr "通过舍弃攻击力来换取防御力,你能够达到更好的自卫效果。被格挡的攻击会减少与敏捷相同点数的伤害。" #: lang/json/martial_art_from_json.py msgid "Intermediate Aikido" -msgstr "" +msgstr "中级合气道" #. ~ Description of buff 'Intermediate Aikido' for martial art 'Aikido' #: lang/json/martial_art_from_json.py @@ -91554,10 +92488,13 @@ msgid "" "\n" "+1 Block attempts, +1 Dodge attempts." msgstr "" +"中级合气道武师能够同时抵御数个敌人的攻击。\n" +"\n" +"格挡次数+1,闪避次数+1。" #: lang/json/martial_art_from_json.py msgid "Advanced Aikido" -msgstr "" +msgstr "高级合气道" #. ~ Description of buff 'Advanced Aikido' for martial art 'Aikido' #: lang/json/martial_art_from_json.py @@ -91566,6 +92503,9 @@ msgid "" "\n" "+1 Block attempts, +1 Dodge attempts." msgstr "" +"高级合气道武师能够同时抵御大量敌人的攻击。\n" +"\n" +"格挡次数+1,闪避次数+1。" #: lang/json/martial_art_from_json.py msgid "Boxing" @@ -91577,11 +92517,11 @@ msgid "" "Sport of the true gentleman, modern boxing has evolved from the prizefights " "of the Victorian era. Strength reduces blocked damage and moving increase " "dodge skill." -msgstr "" +msgstr "真正绅士的运动,现代拳击由维多利亚时期的拳击赛发展而来。力量点数能够减少被格挡的攻击伤害,移动能够增加闪避技能。" #: lang/json/martial_art_from_json.py msgid "Boxing Stance" -msgstr "拳击姿态" +msgstr "拳击步法" #. ~ Description of buff 'Boxing Stance' for martial art 'Boxing' #: lang/json/martial_art_from_json.py @@ -91607,6 +92547,10 @@ msgid "" "+1.0 Dodge skill.\n" "Lasts for 1 turns. Stacks 2 times." msgstr "" +"你通过反复移动来变得更加难以击中。\n" +"\n" +"闪避技能+1。\n" +"持续 1 回合,可叠加 2 次。" #: lang/json/martial_art_from_json.py msgid "Counter Chance" @@ -91621,6 +92565,10 @@ msgid "" "+25% Bash damage.\n" "Lasts for 1 turn." msgstr "" +"发现破绽!马上反击!\n" +"\n" +"钝击伤害+25%。\n" +"持续 1 回合。" #: lang/json/martial_art_from_json.py msgid "Brawling" @@ -91632,7 +92580,7 @@ msgid "" "You're used to hand-to-creature fighting. You know how to fight when " "unarmed or with any weapon to a certain extent. It's not stylish or " "sporting, but it gets the job done." -msgstr "" +msgstr "你习惯于和各种生物打架,大概知道该如何徒手或使用武器攻击。你的招式看起来不是很美观,但是够用就行了。" #: lang/json/martial_art_from_json.py msgid "Capoeira" @@ -91645,10 +92593,11 @@ msgid "" "on fluid movement and sweeping kicks. Moving briefly enables stronger " "techniques. Missing an attack grants bonus damage for a short time." msgstr "" +"巴西战舞是一种发源于巴西奴隶中的舞蹈般的武术,专注于流畅的动作和扫腿攻击。移动后的短时间内能使用更强力的技巧,而没打中的时候能够在短时间内提高伤害。" #: lang/json/martial_art_from_json.py msgid "Capoeira Stance" -msgstr "" +msgstr "巴西战舞步法" #. ~ Description of buff 'Capoeira Stance' for martial art 'Capoeira' #: lang/json/martial_art_from_json.py @@ -91657,6 +92606,9 @@ msgid "" "\n" "+1.0 Dodge skill, +1 Dodge attempts." msgstr "" +"你的持续不停的舞步使你在战斗时异常灵巧。\n" +"\n" +"闪避技能+1,闪避次数+1。" #: lang/json/martial_art_from_json.py msgid "Capoeira Momentum" @@ -91671,6 +92623,11 @@ msgid "" "Enables \"Spin Kick\" and \"Sweep Kick\" techniques.\n" "Lasts 3 turns." msgstr "" +"你能感受到你移动的节奏。你不仅更加难以击中,你的脚法也变得更加炫酷!\n" +"\n" +"闪避技能+1。\n" +"能够使用“旋踢”和“扫踢”。\n" +"持续 3 回合。" #: lang/json/martial_art_from_json.py msgid "Crane Kung Fu" @@ -91682,7 +92639,7 @@ msgid "" "One of the five Shaolin animal styles. The Crane uses intricate hand " "techniques and jumping dodges. Dexterity determines your damage, rather " "than Strength; you also receive a dodge bonus move or dodge an attack." -msgstr "" +msgstr "少林五形拳之一。鹤拳刚柔相济,拳意轻灵。敏捷将取代力量决定你的伤害,且每次移动或闪避后都会提升闪避。" #: lang/json/martial_art_from_json.py msgid "Crane's Precision" @@ -91697,6 +92654,10 @@ msgid "" "\n" "Bash damage increased by 75%% of Dexterity but decreased by 75%% of Strength." msgstr "" +"你通过速度和精度而不是蛮力来攻击敌人的弱点。\n" +"敏捷将取代力量决定你的伤害。\n" +"\n" +"钝击伤害按敏捷的75%增加,同时按力量的75%减少。" #: lang/json/martial_art_from_json.py msgid "Crane's Flight" @@ -91710,10 +92671,14 @@ msgid "" "+1.0 Dodge skill.\n" "Lasts 2 turns." msgstr "" +"你像鸟一样腾跃来避开危险。\n" +"\n" +"闪避技能+1。\n" +"持续 2 回合。" #: lang/json/martial_art_from_json.py msgid "Crane's Grace" -msgstr "" +msgstr "鹤之雅" #. ~ Description of buff 'Crane's Grace' for martial art 'Crane Kung Fu' #: lang/json/martial_art_from_json.py @@ -91723,6 +92688,10 @@ msgid "" "+1 Dodge attempts, +1.0 Dodge skill.\n" "Lasts 2 turns." msgstr "" +"你如鹤一般快速避开危险。\n" +"\n" +"闪避次数+1,闪避技能+1。\n" +"持续 2 回合。" #: lang/json/martial_art_from_json.py msgid "Dragon Kung Fu" @@ -91735,7 +92704,7 @@ msgid "" "hard strikes. Intelligence improves your accuracy instead of Dexterity. " "Your attacks lead to counterattacks which disable your opponents and set " "them up for a powerful finishing move." -msgstr "" +msgstr "少林五形拳之一。龙拳步法多变,攻击凶悍。智力将替代敏捷提升你的命中。你攻击后能够进一步反击来击倒敌人,然后终结它们。" #: lang/json/martial_art_from_json.py msgid "Dragon's Flight" @@ -91750,10 +92719,15 @@ msgid "" "Enables \"Dragon Vortex Block\" and \"Dragon Wing Dodge\"\n" "Lasts 1 turn." msgstr "" +"生活和战斗是一个循环。你可以循环进行攻击和反击。完成这个循环吧。\n" +"\n" +"命中率+2,钝击伤害+2.\n" +"可以使用“龙旋风格挡”和“龙翼闪避”。\n" +"持续 1 回合。" #: lang/json/martial_art_from_json.py msgid "Dragon's Knowledge" -msgstr "" +msgstr "龙之识" #. ~ Description of buff 'Dragon's Knowledge' for martial art 'Dragon Kung Fu' #: lang/json/martial_art_from_json.py @@ -91763,6 +92737,9 @@ msgid "" "\n" "Accuracy increased by 25%% of Intelligence but decreased by 25%% of Dexterity." msgstr "" +"你通过直觉而非速度提前计划好攻击以正中目标。智力将代替敏捷增加命中率。\n" +"\n" +"命中率按智力的 25%% 增加,同时按敏捷的 25%% 减少。 " #: lang/json/martial_art_from_json.py msgid "Eskrima" @@ -91774,12 +92751,11 @@ msgid "" "Eskrima, also known as Kali, is a Filipino martial art. It emphasizes rapid" " strikes with knife and baton weapons, along with a variety of improvised " "substitutes." -msgstr "" -"菲律宾武术(Eskrima),同时以卡力(kali)一名闻名,是一种菲律宾的武术。它着重于以刀和拐棍为武器的快速突击技术,因手上武器不同,可以有各种变招。" +msgstr "菲律宾剑棍术,同时以“卡力”一名闻名,是一种菲律宾的武术。它着重于以刀和拐棍为武器的快速突击技术,因手上武器不同,可以有各种变招。" #: lang/json/martial_art_from_json.py msgid "Eskrima Stance" -msgstr "" +msgstr "菲律宾剑棍术步法" #. ~ Description of buff 'Eskrima Stance' for martial art 'Eskrima' #: lang/json/martial_art_from_json.py @@ -91788,6 +92764,9 @@ msgid "" "\n" "+2 Accuracy." msgstr "" +"你善于高效利用你的武器。什么是“武器”可能是非常主观的。\n" +"\n" +"命中率+2" #: lang/json/martial_art_from_json.py msgid "Fencing" @@ -91801,10 +92780,11 @@ msgid "" "Skilled fencers can take advantage of blocks and feints to deliver accurate " "strikes." msgstr "" +"击剑术,一种高雅的武艺,使用灵活的比赛用剑使出,但是这些技巧是从多种不同的武器的使用中总结提取出来的,所以也适用于使用其他武器战斗。资深的击剑者能够在格挡和佯攻寻求精准突刺的机会。" #: lang/json/martial_art_from_json.py msgid "Fencing Stance" -msgstr "" +msgstr "击剑步法" #. ~ Description of buff 'Fencing Stance' for martial art 'Fencing' #: lang/json/martial_art_from_json.py @@ -91814,6 +92794,53 @@ msgid "" "\n" "Blocked damage reduced by 50%% of Dexterity." msgstr "" +"你的侧身步法使你在战斗中更难被击中。\n" +"\n" +"被格挡的伤害按敏捷的 50%% 减少。" + +#. ~ Description for martial art 'Fior Di Battaglia' +#: lang/json/martial_art_from_json.py +msgid "" +"Medieval Europe's martial techniques for fighting with polearms. The " +"\"Flower of Battle\" places great focus on countering one's opponent and " +"knocking them down before landing a killing blow" +msgstr "中世纪欧洲的长柄武器作战技巧,“战斗之花”极其注重对对手的反击,要诀是“先击倒,再击杀”。" + +#: lang/json/martial_art_from_json.py +msgid "Stand Your Ground" +msgstr "不动如山" + +#. ~ Description of buff 'Stand Your Ground' for martial art 'Fior Di +#. Battaglia' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You stalwart and will not budge against any threat.\n" +"\n" +"+2 Block attempts, -1.0 Dodge skill, blocked damage reduced by 50%% of Strength." +msgstr "" +"猛男在危险面前从不动摇。\n" +"\n" +"格挡次数+2,闪避技能-1,被格挡的伤害按力量的 50% 减少。" + +#: lang/json/martial_art_from_json.py +msgid "Tactical Retreat" +msgstr "战术撤退" + +#. ~ Description of buff 'Tactical Retreat' for martial art 'Fior Di +#. Battaglia' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You moved and nullified the effects of Stand Your Ground!\n" +"\n" +"-2 Block attempts, +1.0 Dodge skill, blocked damaged increased by 50%% of Strength.\n" +"Lasts 1 turn." +msgstr "" +"你的移动取消了不动如山的加成!\n" +"\n" +"格挡次数-2,闪避技能+1,被格挡的伤害按力量的 50% 增加。\n" +"持续 1 回合。" #: lang/json/martial_art_from_json.py msgid "Karate" @@ -92043,7 +93070,7 @@ msgstr "班卡苏拉,这种武术发源于印尼,是一种使用短刀和棍 #: lang/json/martial_art_from_json.py msgid "Silat Stance" -msgstr "苏拉之式" +msgstr "苏拉步法" #. ~ Description of buff 'Silat Stance' for martial art 'Silat' #. ~ Description of buff 'Schatten Folgen' for martial art 'Panzer Kunst' @@ -92217,7 +93244,7 @@ msgstr "日本枪术,又称\"矛之道\",是一种源自日本的使用长 #: lang/json/martial_art_from_json.py msgid "Sōjutsu Stance" -msgstr "日本枪术之式" +msgstr "日本枪术步法" #. ~ Description of buff 'Sōjutsu Stance' for martial art 'Sōjutsu' #: lang/json/martial_art_from_json.py @@ -92246,7 +93273,7 @@ msgid "" "sensitivity to the opponent's direction of force, and flowing around it to " "get back to hitting." msgstr "" -"咏春是一门中国武术,传说起源于南少林鹤拳,也有从蛇鹤相斗获得灵感的说法。它的站立姿势很高,重心完全放在后腿上。咏春专注于对对手发力方向的敏感,并借此还击。" +"咏春是一门中国武术,传说起源于南少林鹤拳,也有从蛇鹤相斗获得灵感的说法。它的站立姿势很高,重心完全放在后腿上。咏春专注于对对手发力方向的准确感知,并借此还击。" #: lang/json/martial_art_from_json.py msgid "Chi-Sao Sensitivity" @@ -92257,35 +93284,6 @@ msgstr "咏春黐手" msgid "Perception increases dodging ability, +1 dodges per turn" msgstr "感知提高闪避能力,每回合闪避次数+1" -#. ~ Description for martial art 'Fior Di Battaglia' -#: lang/json/martial_art_from_json.py -msgid "" -"Medieval Europe's martial techniques for fighting with polearms, great focus" -" is given in countering one's opponent and knocking them down before landing" -" a killing blow" -msgstr "中世纪欧洲的长柄武器作战技巧,要诀是“先击倒,再击杀”。" - -#: lang/json/martial_art_from_json.py -msgid "Stand Your Ground" -msgstr "" - -#. ~ Description of buff 'Stand Your Ground' for martial art 'Fior Di -#. Battaglia' -#: lang/json/martial_art_from_json.py -msgid "" -"+2 blocks -1 dodge, halves your dodge and damage is reduced by your strength" -" when blocking" -msgstr "+2格挡-1闪避,闪避减半,格挡时力量抵消伤害" - -#: lang/json/martial_art_from_json.py -msgid "You moved" -msgstr "移动放弃固守" - -#. ~ Description of buff 'You moved' for martial art 'Fior Di Battaglia' -#: lang/json/martial_art_from_json.py -msgid "Nullifies Stand Your Ground, don't move, stand there and counter!" -msgstr "移动会取消武术加成,坚守原地,防守反击!" - #: lang/json/martial_art_from_json.py msgid "Medieval Swordsmanship" msgstr "中世纪剑术" @@ -92312,11 +93310,11 @@ msgid "" "A modern combat style for the post-modern human. Nicknamed \"Biojutsu\", " "Bionic Combatives combines integrated weaponry, armor and augments into an " "consolidated fighting discipline." -msgstr "" +msgstr "一种后现代的先进格斗术,简称“生化术”。生化格斗术将武器、护甲和其它生化插件结合,产生了这种统一的武术流派。" #: lang/json/martial_art_from_json.py msgid "Biojutsu Stance" -msgstr "" +msgstr "生化步法" #. ~ Description of buff 'Biojutsu Stance' for martial art 'Bionic Combatives' #: lang/json/martial_art_from_json.py @@ -92328,6 +93326,12 @@ msgid "" "\n" "+2 Blocks attemps, +1 Accuracy." msgstr "" +"void player::ApplyBiojutsuStatic() {\n" +" blocks_left += 2;\n" +" set_hit_bonus( get_hit_bonus() + 1 );\n" +"}\n" +"\n" +"格挡次数+2,攻击精度+1。" #: lang/json/martial_art_from_json.py msgid "Centipede Kung Fu" @@ -92339,11 +93343,11 @@ msgid "" "One of the Five Deadly Venoms, used by Zhang Yiaotian. Centipede Style uses" " an onslaught of rapid strikes. Each attack you land increases your attack " "speed. Critical hits increase your damage further." -msgstr "" +msgstr "五毒教汤山魁使用的神功。蜈蚣拳会发出暴雨般的高频攻击。你的每次命中都会提高你的攻击速度。暴击将进一步提高你的伤害。" #: lang/json/martial_art_from_json.py msgid "Centipede's Frenzy" -msgstr "" +msgstr "蜈蚣狂暴" #. ~ Description of buff 'Centipede's Frenzy' for martial art 'Centipede Kung #. Fu' @@ -92354,6 +93358,10 @@ msgid "" "-4 move cost.\n" "Lasts 3 turns. Stacks 4 times." msgstr "" +"你的攻击像一道残影,只要不停攻击敌人就会越来越快。\n" +"\n" +"移动耗时-4。\n" +"持续 3 回合。可叠加 4 次。" #: lang/json/martial_art_from_json.py msgid "Scorpion Kung Fu" @@ -92891,7 +93899,7 @@ msgstr "超合金" #: lang/json/material_from_json.py msgid "Tin" -msgstr "" +msgstr "锡" #: lang/json/material_from_json.py msgid "Vegetable Matter" @@ -94121,39 +95129,6 @@ msgstr "谢谢你帮忙找到他!" msgid "Oh no! My poor puppy..." msgstr "哦不!我那可怜的狗狗……" -#: lang/json/mission_def_from_json.py -msgid "Find 100 Cigarettes" -msgstr "找到100根香烟" - -#: lang/json/mission_def_from_json.py -msgid "Come on man, I just need a smoke." -msgstr "来吧,伙计,我只想要抽支烟。" - -#: lang/json/mission_def_from_json.py -msgid "" -"With all that's been going on, it's been more and more difficult to find a " -"smoke. My stash has been running low for a while now. Think you could help" -" me out here? A few packs is all I need." -msgstr "随着这一切的发生,越来越难找到烟了。我的存货已经用完一段时间了。你能帮我吗?我只需要几包烟。" - -#: lang/json/mission_def_from_json.py -msgid "Thanks, it's great to see someone willing to help a guy out." -msgstr "谢谢,很高兴看见有人助人为乐。" - -#: lang/json/mission_def_from_json.py -msgid "" -"Plenty of smokers in towns. Gotta be some left over cigs in some of them " -"houses." -msgstr "城镇里有很多吸烟者。一些房子里肯定有剩下的雪茄。" - -#: lang/json/mission_def_from_json.py -msgid "Got the smokes?" -msgstr "拿到烟了吗?" - -#: lang/json/mission_def_from_json.py -msgid "Thanks! I'll be sure to put in a good word for you around the center." -msgstr "谢谢!我一定会在难民中心替你说好话的。" - #: lang/json/mission_def_from_json.py msgid "Break into armory to retrieve family photo" msgstr "闯入军械库取回家庭照" @@ -94243,11 +95218,11 @@ msgstr "我对你太失望了." #: lang/json/mission_def_from_json.py msgid "Prove You're A Survivor" -msgstr "" +msgstr "生存者证明" #: lang/json/mission_def_from_json.py msgid "It's hard to tell who actually has the skills to survive these days..." -msgstr "" +msgstr "如今很难看出到底一个人有没有生存能力……" #: lang/json/mission_def_from_json.py msgid "" @@ -94259,69 +95234,70 @@ msgid "" "know you've got what it takes, or you don't and I'll know that I was right " "not to follow you." msgstr "" +"我一直活得很困难,也许和你组队会好一点。问题在于,我根本不了解你的能力,你可能是我需要的人,也可能不是。因此我需要你证明这一点。几天之后再来见我,到时候我就愿意跟你走了。这样对我比较稳当:如果你来见我了,说明你还是有两把刷子,如果你没有来见我,那我不跟你就是对的。" #: lang/json/mission_def_from_json.py msgid "" "I'll see you then...or I won't, and then I'll know I made the right " "decision." -msgstr "" +msgstr "到时候见……或者不见,然后我就知道不跟你是对的了。" #: lang/json/mission_def_from_json.py msgid "" "Don't die. If you're asking me for advice, that doesn't bode well for you." -msgstr "" +msgstr "不要死掉。如果你要问我才知道的话,那对你来说可不是什么好消息。" #: lang/json/mission_def_from_json.py msgid "Well, you're not dead...yet." -msgstr "" +msgstr "哦,你还没死呢。" #: lang/json/mission_def_from_json.py msgid "" "I'll be honest, I wasn't really expecting to see you again. A promise is a " "promise, I'll follow you now!" -msgstr "" +msgstr "开诚布公地讲,其实我根本没指望能再见到你。君子一言驷马难追,我以后就跟你走了!" #: lang/json/mission_def_from_json.py msgid "I know time is relative and all that." -msgstr "" +msgstr "对对,时间只是一个相对概念。" #: lang/json/mission_def_from_json.py msgid "I'm not quite sure how you failed to survive AND are talking to me." -msgstr "" +msgstr "你都死了,怎么还能找我说话!" #: lang/json/mission_def_from_json.py msgid "Find an anvil" -msgstr "" +msgstr "寻找铁砧" #: lang/json/mission_def_from_json.py msgid "I need an anvil to do advanced metal work." -msgstr "" +msgstr "我需要一个铁砧来做复杂锻造。" #: lang/json/mission_def_from_json.py msgid "I could really use an anvil." -msgstr "" +msgstr "我急需一个铁砧。" #: lang/json/mission_def_from_json.py msgid "You might be able to find one in a hardware store or similar." -msgstr "" +msgstr "你也许能在五金店之类的地方找到一个。" #: lang/json/mission_def_from_json.py msgid "Thanks anyway, we'll find the time to make it ourselves." -msgstr "" +msgstr "还是谢了,我们可以自己找时间做一个。" #: lang/json/mission_def_from_json.py msgid "If you can't find one, maybe you can make one for me." -msgstr "" +msgstr "如果你找不到的话,你也可以帮我做一个。" #: lang/json/mission_def_from_json.py msgid "Do you have the anvil?" -msgstr "" +msgstr "你找到铁砧了吗?" #: lang/json/mission_def_from_json.py msgid "" "I appreciate it, this will really make a difference, here's some horse armor" " I've been working on, eventually I'll have the whole herd outfitted." -msgstr "" +msgstr "谢谢,这对我们很有用。作为谢礼给你一个我之前做的马铠。总有一天我会把整个马群都装备上的。" #: lang/json/mission_def_from_json.py msgid "What good does this do me?" @@ -94329,15 +95305,15 @@ msgstr "这对我有什么好处?" #: lang/json/mission_def_from_json.py msgid "Find Chris Isherwood" -msgstr "找到克里斯•伊舍伍德" +msgstr "找到克里斯·伊舍伍德" #: lang/json/mission_def_from_json.py msgid "Our son still isn't back, I'm getting concerned." -msgstr "" +msgstr "我儿子还没回来,我有点担心。" #: lang/json/mission_def_from_json.py msgid "Can you go find my son and tell him to check in with us." -msgstr "" +msgstr "你能找到我儿子让他回来吗?" #: lang/json/mission_def_from_json.py lang/json/mission_def_from_json.py #: lang/json/talk_topic_from_json.py @@ -94346,13 +95322,13 @@ msgstr "谢谢你。" #: lang/json/mission_def_from_json.py msgid "Oh well. I hope he turns up soon." -msgstr "" +msgstr "好吧,我希望他很快就会回来。" #: lang/json/mission_def_from_json.py msgid "" "He should be on the property somewhere, maybe by that old cabin near the " "entrance, sometimes he camps there." -msgstr "" +msgstr "他应该就在这边,也许在入口那边的破旧小屋附近。他偶尔会去那里扎营。" #: lang/json/mission_def_from_json.py msgid "How is the search going?" @@ -94360,52 +95336,52 @@ msgstr "找到了吗?" #: lang/json/mission_def_from_json.py msgid "Thanks, I was getting ready to go look myself." -msgstr "" +msgstr "谢谢,我本来都准备自己去找了。" #: lang/json/mission_def_from_json.py msgid "I hope he didn't meet Barry's fate..." -msgstr "" +msgstr "我希望他没有像巴里一样出事……" #: lang/json/mission_def_from_json.py msgid "Find mysterious structure" -msgstr "" +msgstr "寻找神秘建筑" #: lang/json/mission_def_from_json.py msgid "We need to investigate the alien encampment." -msgstr "" +msgstr "我们需要调查一下那个外星营地。" #: lang/json/mission_def_from_json.py msgid "I can take you to the structure those things were building." -msgstr "" +msgstr "我能带你去那些东西之前搭的建筑那里。" #: lang/json/mission_def_from_json.py msgid "Awesome, I want some answers!" -msgstr "" +msgstr "好极了,我想要知道答案!" #: lang/json/mission_def_from_json.py msgid "Thanks anyway, I'll keep my eye on it." -msgstr "" +msgstr "还是谢了,我会自己留意的。" #: lang/json/mission_def_from_json.py msgid "" "I feel like we are underprepared if they see us, I marked the location for " "you." -msgstr "" +msgstr "我觉得如果让它们先看见我们,我们会准备不足。我把地方帮你标好了。" #: lang/json/mission_def_from_json.py msgid "You ready?" -msgstr "" +msgstr "你准备好了?" #: lang/json/mission_def_from_json.py msgid "" "It's even bigger then I remember, we should explore some. I left a note for" " my family before we left. If we survive, the cabin should be fixed up and " "ready for you to move in if you want to stay." -msgstr "" +msgstr "这比我记忆中还要大,我们应该再探索一下。我走之前给我家里留了个便条。如果我们活下来了,那间小屋应该也修好了。如果你想住下的话随时欢迎。" #: lang/json/mission_def_from_json.py msgid "Well it was here..." -msgstr "" +msgstr "好吧,之前它还在这……" #: lang/json/mission_def_from_json.py msgid "Gather 50 dandelions" @@ -94413,68 +95389,68 @@ msgstr "收集50份蒲公英" #: lang/json/mission_def_from_json.py msgid "I could use some help foraging ingredients." -msgstr "" +msgstr "我需要有人帮我采集一些材料。" #: lang/json/mission_def_from_json.py msgid "" "I could use some fresh dandelions for the next batch of wine. Can you bring" " me 50 dandelions?" -msgstr "" +msgstr "我需要一些新鲜的蒲公英用来酿下一批的酒。你能帮我找 50 个蒲公英吗?" #: lang/json/mission_def_from_json.py msgid "Thank you, I'll put these to good use." -msgstr "" +msgstr "谢谢,我会妥善使用的。" #: lang/json/mission_def_from_json.py msgid "Oh well. Maybe some other time, thanks." -msgstr "" +msgstr "好吧,也许下次,谢了。" #: lang/json/mission_def_from_json.py msgid "You can find them in the fields during the spring and summer months." -msgstr "" +msgstr "你可以在春天或夏天去野外找到它们。" #: lang/json/mission_def_from_json.py msgid "Thanks. Here's a small reward to show my appreciation for your help." -msgstr "" +msgstr "谢了。作为谢礼给你一些小东西。" #: lang/json/mission_def_from_json.py msgid "I wonder if the wildlife ate all the greens..." -msgstr "" +msgstr "难道说所有蒲公英都被动物吃了……" #: lang/json/mission_def_from_json.py msgid "Find 20 bee balm seeds" -msgstr "" +msgstr "找20个香蜂草种子" #: lang/json/mission_def_from_json.py msgid "I could use some seeds from the forest." -msgstr "" +msgstr "我需要去森林里找些种子。" #: lang/json/mission_def_from_json.py msgid "" "We could use some seeds for the next planting season. Can you bring me 20 " "bee balm seeds?" -msgstr "" +msgstr "我们需要一些种子用于下一季的播种。你能帮我找 20 个香蜂草种子吗?" #: lang/json/mission_def_from_json.py msgid "" "Thank you. It's important to have a good stock before the flu season hits." -msgstr "" +msgstr "谢谢。在流感季之前存够药品非常重要。" #: lang/json/mission_def_from_json.py msgid "" "You should search through the forest, make sure to check in the underbrush " "for beebalm and then harvest its seeds." -msgstr "" +msgstr "你应该去森林里面找,在杂草丛里面找到香蜂草然后采集它们的种子。" #: lang/json/mission_def_from_json.py msgid "" "Wow, perfect. Here are some of my own remedies and if those don't work try " "my other gift." -msgstr "" +msgstr "哦哦,太好了。给你一些我做的药剂。如果一个不起作用的话,你可以试试别的。" #: lang/json/mission_def_from_json.py msgid "I'll have to find someone more at home in the forest..." -msgstr "" +msgstr "我还是去找一个更了解森林的人吧……" #: lang/json/mission_def_from_json.py msgid "Gather 120 Stones" @@ -94482,19 +95458,19 @@ msgstr "收集100块石头" #: lang/json/mission_def_from_json.py msgid "We need to build some kilns." -msgstr "" +msgstr "我需要建造一些砖窑。" #: lang/json/mission_def_from_json.py msgid "I could use 120 rocks to construct some kilns." -msgstr "" +msgstr "我需要 120 块石头来建造砖窑。" #: lang/json/mission_def_from_json.py msgid "You can break up some larger rocks, or gather them up from the fields." -msgstr "" +msgstr "你可以打碎大块岩石,或者从野外捡到石块。" #: lang/json/mission_def_from_json.py msgid "Thanks anyway, we'll find the time to get them ourselves." -msgstr "" +msgstr "还是谢了,我们可以找时间自己找。" #: lang/json/mission_def_from_json.py msgid "Mining would always be an option if you had the resources." @@ -94506,7 +95482,7 @@ msgstr "弄到石头了吗?" #: lang/json/mission_def_from_json.py msgid "I appreciate it, this will make Luke happy." -msgstr "" +msgstr "非常感谢,卢克会非常高兴的。" #: lang/json/mission_def_from_json.py msgid "Gather 2000 units of sand" @@ -94514,31 +95490,31 @@ msgstr "收集2000单位的黄沙" #: lang/json/mission_def_from_json.py msgid "I do have some resource gathering I could use help with." -msgstr "" +msgstr "我的确需要有人帮我搜集一些资源。" #: lang/json/mission_def_from_json.py msgid "" "Now that the kilns are set up, we could use 2000 units of sand to get " "production going." -msgstr "" +msgstr "现在砖窑已经建好了,我们需要 2000 单位的沙子来开始生产。" #: lang/json/mission_def_from_json.py msgid "Oh well. I'll try to find time to get it myself, thanks." -msgstr "" +msgstr "好吧。我可以自己找时间去搜集,谢了。" #: lang/json/mission_def_from_json.py msgid "" "You can find it along river banks, or maybe landscaping supplies and " "hardware stores." -msgstr "" +msgstr "你可以在河岸找到,或者景观美化材料店或五金店。" #: lang/json/mission_def_from_json.py msgid "Thanks, now Luke can get started." -msgstr "" +msgstr "谢了,这样卢克就可以开始了。" #: lang/json/mission_def_from_json.py msgid "I wonder where all the sand went..." -msgstr "" +msgstr "奇了怪了,沙子都哪去了……" #: lang/json/mission_def_from_json.py msgid "Gather 1000 units of clay" @@ -94546,46 +95522,46 @@ msgstr "收集100份黏土" #: lang/json/mission_def_from_json.py msgid "I do have some resource gathering I could use help if you have time." -msgstr "" +msgstr "我确实需要有人帮我搜寻资源,如果你有空的话。" #: lang/json/mission_def_from_json.py msgid "" "Now that the kilns are set up, we could use 1000 units of clay to get " "production going." -msgstr "" +msgstr "现在砖窑已经建好了,我们需要 1000 单位的粘土来开始生产。" #: lang/json/mission_def_from_json.py msgid "" "You can find it along river banks, or maybe look for deposits in the forest." -msgstr "" +msgstr "你可以在河岸找到,或者到森林里面去挖。" #: lang/json/mission_def_from_json.py msgid "" "Thanks, now Luke can get started making jugs, We'd like to give you a cow if" " you want it. Here's a rope an some fodder, feel free to pick one out." -msgstr "" +msgstr "谢了,现在卢克可以开始做罐子了。作为谢礼我们想给你一头牛。这是一根牛绳和一些草料,你去随意选一只吧。" #: lang/json/mission_def_from_json.py msgid "Find 10 3L jars" -msgstr "" +msgstr "找到20个3L玻璃罐" #: lang/json/mission_def_from_json.py msgid "I could use some help scavenging." -msgstr "" +msgstr "我需要有人帮我搜寻东西。" #: lang/json/mission_def_from_json.py msgid "" "We could use some 3 liter jars to preserve our produce. Can you bring me 20" " large three liter jars? I'll give you some preserves in exchange." -msgstr "" +msgstr "我们需要些 3L 玻璃罐来腌制我们的作物。你能帮我找 20 个吗?作为谢礼我会给你一些腌菜。" #: lang/json/mission_def_from_json.py msgid "Thank you. It's important to preserve foods while we can." -msgstr "" +msgstr "谢谢。尽量保存食物对我们很重要。" #: lang/json/mission_def_from_json.py msgid "Oh well. I'll see if I can find another way, thanks." -msgstr "" +msgstr "好吧,我会想其它办法的,谢了。" #: lang/json/mission_def_from_json.py msgid "Grocery stores, house kitchens, there's plenty of places to look." @@ -94593,7 +95569,7 @@ msgstr "杂货店,民宅厨房,有很多可探索的地方。" #: lang/json/mission_def_from_json.py msgid "Wow, perfect. Thanks. Here's your reward." -msgstr "" +msgstr "哇,好极了,谢谢。这是你的谢礼。" #: lang/json/mission_def_from_json.py msgid "I wonder where all the jars went..." @@ -94601,21 +95577,21 @@ msgstr "我想知道所有的罐子都去哪了..." #: lang/json/mission_def_from_json.py msgid "Find 100 wheat seeds" -msgstr "" +msgstr "找100个小麦种子" #: lang/json/mission_def_from_json.py msgid "I do have some more scavenging for you." -msgstr "" +msgstr "我的确还有些找东西的活给你。" #: lang/json/mission_def_from_json.py msgid "" "We could use some seeds for the next planting season. Can you bring me 100 " "wheat seeds? I'll give you some fresh produce." -msgstr "" +msgstr "我们需要一些种子用于下一季的播种。你能帮我找 100 个小麦种子吗?我会给你些新鲜蔬菜作为谢礼。" #: lang/json/mission_def_from_json.py msgid "Thank you. It's important to preserve healthy foods while we can." -msgstr "" +msgstr "谢谢。尽量保存健康的食物对我们很重要。" #: lang/json/mission_def_from_json.py msgid "Oh well. I'll see if I can find another supplier, thanks." @@ -94623,69 +95599,69 @@ msgstr "哦好吧。我看看能不能再找个供应商,谢谢。" #: lang/json/mission_def_from_json.py msgid "I wonder where all the seeds went..." -msgstr "" +msgstr "奇了怪了,种子都跑那去了……" #: lang/json/mission_def_from_json.py msgid "Kill monster" -msgstr "" +msgstr "杀死怪物" #: lang/json/mission_def_from_json.py msgid "We could use some help killing some monsters." -msgstr "" +msgstr "我们需要有人帮我们杀死一些怪物。" #: lang/json/mission_def_from_json.py msgid "" "I don't know what it is, but it is very fast, I'm willing to outfit you with" " a horse if you succeed." -msgstr "" +msgstr "我不知道那是啥,但是它非常快。如果你成功的话我愿意给你一匹马作为谢礼。" #: lang/json/mission_def_from_json.py msgid "Be ready for anything." -msgstr "" +msgstr "准备好面对一切可能。" #: lang/json/mission_def_from_json.py msgid "Thanks anyway, we will try some traps." -msgstr "" +msgstr "还是谢了,我们可以试试陷阱。" #: lang/json/mission_def_from_json.py msgid "A gun will probably help." -msgstr "" +msgstr "你可能有必要带把枪。" #: lang/json/mission_def_from_json.py msgid "Did you kill it?" -msgstr "" +msgstr "你杀掉它了吗?" #: lang/json/mission_def_from_json.py msgid "" "I appreciate it, this will help keep our animals safe, here's an extra " "saddle for you. Take this fodder and choose a horse for your bravery." -msgstr "" +msgstr "非常感谢,这样我们的牲畜就更安全了。顺便给你一个马鞍。拿上这把草料,去随便选一只马吧,作为你勇气的奖励。" #: lang/json/mission_def_from_json.py msgid "Show me the body." -msgstr "" +msgstr "我要看到尸体。" #: lang/json/mission_def_from_json.py msgid "Find The Art of Glassblowing book" -msgstr "" +msgstr "找到玻璃吹制工艺书籍" #: lang/json/mission_def_from_json.py msgid "I need more knowledge to get the glass blowing started." -msgstr "" +msgstr "我需要进一步学习才能开始玻璃吹制。" #: lang/json/mission_def_from_json.py msgid "" "I could really use a book on glass blowing. With the internet gone, I don't" " have any handy references." -msgstr "" +msgstr "我实在需要一本玻璃吹制的书。现在互联网也没了,我根本找不到参考资料。" #: lang/json/mission_def_from_json.py msgid "Fantasic, I'm not supposed to leave our land." -msgstr "" +msgstr "太好了,我可没法离开这里自己去找。" #: lang/json/mission_def_from_json.py msgid "Oh well, figured I'd have to do a lot of practice anyway." -msgstr "" +msgstr "好吧,我只能自己多试试了。" #: lang/json/mission_def_from_json.py msgid "A library, bookstore or a glass blower's studio should have one." @@ -94697,29 +95673,29 @@ msgstr "弄到那本书了吗?" #: lang/json/mission_def_from_json.py msgid "I appreciate it, this will make my life so much easier." -msgstr "" +msgstr "非常感谢,这样我接下来就轻松多了。" #: lang/json/mission_def_from_json.py msgid "I don't see a book...?" -msgstr "" +msgstr "书呢……?" #: lang/json/mission_def_from_json.py msgid "At least you escaped with your life..." -msgstr "" +msgstr "至少你活着回来了……" #: lang/json/mission_def_from_json.py msgid "Find a cooy of DIY Compendium" -msgstr "" +msgstr "找到一本DIY手册" #: lang/json/mission_def_from_json.py msgid "I need more knowledge to get better pottery." -msgstr "" +msgstr "我需要进一步学习才能更好地制陶。" #: lang/json/mission_def_from_json.py msgid "" "I could really use the book, DIY Compendium. With the internet gone, I " "don't have any handy references." -msgstr "" +msgstr "我非常需要一本DIY手册。现在互联网也没了,我根本找不到参考资料。" #: lang/json/mission_def_from_json.py msgid "A library, bookstore should have one, schools are another good idea." @@ -95448,8 +96424,8 @@ msgid "" msgstr "真的?你找不到*剪刀*了?你早上怎么系的鞋带?" #: lang/json/mission_def_from_json.py -msgid "Find 50 3L jars" -msgstr "找到50个3L玻璃罐" +msgid "In a Pickle Pt. 2" +msgstr "老坛酸菜2" #: lang/json/mission_def_from_json.py msgid "I do have some work for you." @@ -95478,6 +96454,39 @@ msgid "" "payment." msgstr "哇,这比在纸上听起来要多得多。谢谢。这是你的报酬。" +#: lang/json/mission_def_from_json.py +msgid "Smokes, let's go." +msgstr "香烟大作战" + +#: lang/json/mission_def_from_json.py +msgid "Come on man, I just need a smoke." +msgstr "来吧,伙计,我只想要抽支烟。" + +#: lang/json/mission_def_from_json.py +msgid "" +"With all that's been going on, it's been more and more difficult to find a " +"smoke. My stash has been running low for a while now. Think you could help" +" me out here? A few packs is all I need." +msgstr "随着这一切的发生,越来越难找到烟了。我的存货已经用完一段时间了。你能帮我吗?我只需要几包烟。" + +#: lang/json/mission_def_from_json.py +msgid "Thanks, it's great to see someone willing to help a guy out." +msgstr "谢谢,很高兴看见有人助人为乐。" + +#: lang/json/mission_def_from_json.py +msgid "" +"Plenty of smokers in towns. Gotta be some left over cigs in some of them " +"houses." +msgstr "城镇里有很多吸烟者。一些房子里肯定有剩下的香烟。" + +#: lang/json/mission_def_from_json.py +msgid "Got the smokes?" +msgstr "拿到烟了吗?" + +#: lang/json/mission_def_from_json.py +msgid "Thanks! I'll be sure to put in a good word for you around the center." +msgstr "谢谢!我一定会在难民中心替你说好话的。" + #: lang/json/mission_def_from_json.py msgid "Clear Back Bay" msgstr "清理后院" @@ -95591,8 +96600,8 @@ msgid "" msgstr "有了这个,我们就能说服其他人投资公社。谢谢,这是你的钱。" #: lang/json/mission_def_from_json.py -msgid "Find 10 solar panels" -msgstr "找到10个太阳能电池板" +msgid "Solar Power" +msgstr "太阳能发电" #: lang/json/mission_def_from_json.py msgid "" @@ -95620,8 +96629,8 @@ msgid "" msgstr "太好了,我知道这点不算多,但是有了你的帮助我们有希望继续扩建了。" #: lang/json/mission_def_from_json.py -msgid "Find 100 canning jars" -msgstr "找到100个玻璃罐" +msgid "In a Pickle" +msgstr "老坛酸菜" #: lang/json/mission_def_from_json.py msgid "" @@ -95874,8 +96883,8 @@ msgid "Thank you, I'll do the explaining if anyone else asks about it." msgstr "谢谢你,如果别人问起来我会解释的。" #: lang/json/mission_def_from_json.py -msgid "Kill ???" -msgstr "杀死 ???" +msgid "Secure Trade Route" +msgstr "保护贸易路线" #: lang/json/mission_def_from_json.py msgid "" @@ -95901,8 +96910,8 @@ msgid "Great work, wasn't sure what I was sending you after." msgstr "做得好!那时候我还不知道你会遇到些什么。" #: lang/json/mission_def_from_json.py -msgid "Kill Raider Leader" -msgstr "杀死强盗头目" +msgid "Assassinate Raider Leader" +msgstr "暗杀劫匪头目" #: lang/json/mission_def_from_json.py msgid "" @@ -96026,8 +97035,8 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" -"Remember, do extraction /exactly/ as specified, otherwise the bionic will " -"self-destruct." +"Remember, perform the extraction /exactly/ as specified, otherwise the " +"bionic will self-destruct." msgstr "记住,按照指定的方法提取/精确地提取/否则生化插件将自毁。" #: lang/json/mission_def_from_json.py @@ -96051,6 +97060,40 @@ msgstr "你有扫描吗?" msgid "You have our thanks and payment." msgstr "你得到了我们的感谢和回报。" +#: lang/json/mission_def_from_json.py +msgid "Light retrieval" +msgstr "恢复照明" + +#: lang/json/mission_def_from_json.py +msgid "" +"Our facility once sourced advanced photonic circuitry from a nearby robotics manufacturer. Their building suffered major damage during the portal storms, and collapsed almost entirely. However, preliminary scouting reveals that the basement prototyping lab likely remains intact.\n" +"\n" +"the intercom: We ask you to investigate the ruins, and if possible, retrieve a template for the fabrication of said photonic circuitry." +msgstr "" +"我们机构曾经从附近的机器人制造厂订购先进光子电路。他们的建筑在传送门风暴时遭到了严重破坏,几乎完全倒塌。但是初步侦察显示地下的原型实验室可能还保存完好。\n" +"\n" +"对讲机:我们请求你调查机器人制造厂的废墟,如果可能的话取回一个那种光子电路的制造模板。" + +#: lang/json/mission_def_from_json.py +msgid "We expect your success, mercenary." +msgstr "我们希望你成功,佣兵。" + +#: lang/json/mission_def_from_json.py +msgid "Return if you change your mind." +msgstr "你改变注意的话随时可以回来。" + +#: lang/json/mission_def_from_json.py +msgid "" +"The scout drone also revealed extensive heat signatures and high " +"concentrations of toxic compounds within the ruins, plan accordingly. We " +"are willing to sell you some protective gear at a discount, if you require " +"it." +msgstr "侦察无人机同时还在废墟中发现了强烈的热信号和高浓度的有毒化合物,做好准备。你需要的话我们可以打折卖给你一套我们的防护装备。" + +#: lang/json/mission_def_from_json.py +msgid "Have you retrieved the blueprints?" +msgstr "你找到那个蓝图了吗?" + #: lang/json/mission_def_from_json.py msgid "Make 2 Stills" msgstr "制作 2 个蒸馏器" @@ -99375,7 +100418,7 @@ msgid "" "You have taken some self-defense classes at a nearby gym. You start with " "your choice of Capoeira, Krav Maga, Muay Thai, Ninjutsu, Wing Chun, or Zui " "Quan." -msgstr "你曾在附近健身房接受过一套防身术训练。你在开始的时候可以选择卡波耶拉(巴西战舞)、卡拉夫马伽术、泰拳、忍术、咏春或者醉拳之一。" +msgstr "你曾在附近健身房接受过一套防身术训练。你在开始的时候可以选择巴西战舞、卡拉夫马伽术、泰拳、忍术、咏春或者醉拳之一。" #: lang/json/mutation_from_json.py msgid "Shaolin Adept" @@ -99398,7 +100441,7 @@ msgid "" "You have practiced fighting with weapons. You start with your choice of " "Eskrima, Fencing, Fior Di Battaglia, Medieval Swordsmanship, Niten Ichi-" "Ryu, Pentjak Silat, or Sōjutsu." -msgstr "" +msgstr "你曾经接受过一套近身武器训练。你在开始的时候可以选择菲律宾剑棍术、击剑术、战斗之花、中世纪剑术、二天一流剑术、班卡苏拉刀术或日本枪术之一。" #: lang/json/mutation_from_json.py msgid "Weak Scent" @@ -99457,7 +100500,7 @@ msgstr "在大灾变发生时,你是一家银行里的一大笔财富的所有 #: lang/json/mutation_from_json.py msgid "Weight: XS" -msgstr "" +msgstr "体重不足" #. ~ Description for Weight: XS #: lang/json/mutation_from_json.py @@ -99465,11 +100508,11 @@ msgid "" "You lost an awful lot of weight before Cataclysm. Whatever the reason, your" " skeletal figure is now an extra burden, when food is not at hand's reach. " "You need to gain weight or die trying." -msgstr "" +msgstr "你在大灾变之前失去了不少体重。无论原因如何,你现在骨瘦如柴,在食物难以获得的如今这开始拖你的后腿。你需要在饿死之前增加你的体重。" #: lang/json/mutation_from_json.py msgid "Weight: XXXL" -msgstr "" +msgstr "超重" #. ~ Description for Weight: XXXL #: lang/json/mutation_from_json.py @@ -99477,7 +100520,7 @@ msgid "" "You gained an awful lot of weight before Cataclysm. Whatever the reason, " "your bloated figure is now an extra burden, when mobility is a key to " "survival. You need to go on a diet or die trying." -msgstr "" +msgstr "你在大灾变之前增加了不少体重。无论原因如何,如今移动性对生存至关重要,你的肥胖开始拖你的后腿。你需要在挂掉之前开始减肥。" #: lang/json/mutation_from_json.py msgid "Pretty" @@ -99689,7 +100732,7 @@ msgstr "素食主义" msgid "" "You have problems with eating meat. It's possible for you to eat it, but " "you will suffer morale penalties and obtain less nutrition from it." -msgstr "" +msgstr "你坚持素食主义。虽然你还是可以吃肉,但是你会受到心情惩罚并且吸收更少的营养。" #: lang/json/mutation_from_json.py msgid "Thin-Skinned" @@ -99710,7 +100753,7 @@ msgid "" "You have problems with eating vegetables. It's possible for you to eat " "them, but you will suffer morale penalties and obtain less nutrition from " "them." -msgstr "" +msgstr "你讨厌蔬菜。虽然你还是可以吃菜,但是你会受到心情惩罚并且吸收更少的营养。" #: lang/json/mutation_from_json.py msgid "Hates Books" @@ -99732,7 +100775,7 @@ msgstr "水果不耐症" msgid "" "You despise eating fruits. It's possible for you to eat them, but you will " "suffer morale penalties and obtain less nutrition from them." -msgstr "" +msgstr "你厌恶水果。虽然你还是可以吃水果,但是你会受到心情惩罚并且吸收更少的营养。" #. ~ Description for Lactose Intolerance #: lang/json/mutation_from_json.py @@ -99740,7 +100783,7 @@ msgid "" "You, like 75 percent of the world, cannot tolerate milk or milk based " "products. It's possible for you to eat them, but you will suffer morale " "penalties and obtain less nutrition from them." -msgstr "" +msgstr "你像世界上75%的人一样,你有乳糖不耐症,难以消化奶制品。虽然你还是可以吃,但是你会受到心情惩罚并且吸收更少的营养。" #: lang/json/mutation_from_json.py msgid "Junkfood Intolerance" @@ -99752,7 +100795,7 @@ msgid "" "Something in those heavily processed foods doesn't agree with you. It's " "possible for you to eat them, but you will suffer morale penalties and " "obtain less nutrition from them." -msgstr "" +msgstr "你非常讨厌那些高热量低营养的快餐,虽然你还是可以吃快餐,但是你会受到心情惩罚并吸收更少的营养。" #: lang/json/mutation_from_json.py msgid "Grain Intolerance" @@ -99764,7 +100807,7 @@ msgid "" "You have a rare allergy that prevents you from eating most types of grains " "such as wheat or oats. It's possible for you to eat them, but you will " "suffer morale penalties and obtain less nutrition from them." -msgstr "" +msgstr "你有罕见的过敏症使你难以消化大多数谷物,如麦面制品。虽然你还是可以吃,但是你会受到心情惩罚并吸收更少的营养。" #: lang/json/mutation_from_json.py msgid "Sweet Tooth" @@ -105066,7 +106109,7 @@ msgid "" "Druids follow a wild tradition of allegiance and rebirth within the world of" " nature, especially the cycle of death and rebirth that is the plant world." " A powerful Druid is as much a part of that world as the human one." -msgstr "" +msgstr "德鲁伊在自然界中遵循一种狂热的忠诚和重生的传统,特别是植物界的死亡和重生周期。强大的德鲁伊和人类一样是这个世界的一部分。" #: lang/json/mutation_from_json.py msgid "Lesser Mana Efficiency" @@ -105418,67 +106461,67 @@ msgstr "我曾经是一名警官,但现在我只是一个幸存者。" #: lang/json/npc_class_from_json.py lang/json/npc_from_json.py msgid "Carlos Isherwood" -msgstr "" +msgstr "卡洛斯·伊舍伍德" #: lang/json/npc_class_from_json.py msgid "I'm Jesse's husband, part of the Isherwood family" -msgstr "" +msgstr "我是杰西的丈夫,来自伊舍伍德一家" #: lang/json/npc_class_from_json.py lang/json/npc_from_json.py msgid "Chris Isherwood" -msgstr "克里斯•伊舍伍德" +msgstr "克里斯·伊舍伍德" #: lang/json/npc_class_from_json.py msgid "I'm Jesse and Carlos' son, part of the Isherwood family" -msgstr "" +msgstr "我是杰西和卡洛斯的儿子,来自伊舍伍德一家" #: lang/json/npc_class_from_json.py lang/json/npc_from_json.py msgid "Claire Isherwood" -msgstr "" +msgstr "克莱尔·伊舍伍德" #: lang/json/npc_class_from_json.py msgid "I'm the matriarch of the Isherwood family" -msgstr "" +msgstr "我是伊舍伍德家族的女族长" #: lang/json/npc_class_from_json.py lang/json/npc_from_json.py msgid "Eddie Isherwood" -msgstr "" +msgstr "艾迪·伊舍伍德" #: lang/json/npc_class_from_json.py msgid "I'm a dairy farmer, part of the Isherwood family" -msgstr "" +msgstr "我是来自伊舍伍德家族的奶农" #: lang/json/npc_class_from_json.py lang/json/npc_from_json.py msgid "Jack Isherwood" -msgstr "" +msgstr "杰克·伊舍伍德" #: lang/json/npc_class_from_json.py msgid "I'm the patriarch of the Isherwood family" -msgstr "" +msgstr "我是伊舍伍德家族的族长" #: lang/json/npc_class_from_json.py lang/json/npc_from_json.py msgid "Jesse Isherwood" -msgstr "" +msgstr "杰西·伊舍伍德" #: lang/json/npc_class_from_json.py msgid "I'm a horse trainer, part of the Isherwood family" -msgstr "" +msgstr "我是伊舍伍德家族的驯马师" #: lang/json/npc_class_from_json.py lang/json/npc_from_json.py msgid "Lisa Isherwood" -msgstr "" +msgstr "丽莎·伊舍伍德" #: lang/json/npc_class_from_json.py msgid "Part of the Isherwood family" -msgstr "" +msgstr "来自伊舍伍德家族" #: lang/json/npc_class_from_json.py lang/json/npc_from_json.py msgid "Luke Isherwood" -msgstr "" +msgstr "卢克·伊舍伍德" #: lang/json/npc_class_from_json.py msgid "I'm a Eddie's son, part of the Isherwood family" -msgstr "" +msgstr "我是艾迪的儿子,来自伊舍伍德家族" #: lang/json/npc_class_from_json.py msgid "Prisoner" @@ -106364,7 +107407,7 @@ msgstr "游船码头" #: lang/json/overmap_terrain_from_json.py msgid "lighthouse" -msgstr "" +msgstr "灯塔" #: lang/json/overmap_terrain_from_json.py msgid "forest" @@ -106494,7 +107537,7 @@ msgstr "旷野" #: lang/json/overmap_terrain_from_json.py msgid "crashed airliner" -msgstr "" +msgstr "坠毁客机" #: lang/json/overmap_terrain_from_json.py lang/json/terrain_from_json.py msgid "open air" @@ -106644,6 +107687,10 @@ msgstr "枫糖棚屋" msgid "sugar house roof" msgstr "农舍(屋顶)" +#: lang/json/overmap_terrain_from_json.py +msgid "rural road" +msgstr "乡村公路" + #: lang/json/overmap_terrain_from_json.py msgid "farm field" msgstr "农田" @@ -106887,7 +107934,7 @@ msgstr "办公大楼庭院" #: lang/json/overmap_terrain_from_json.py msgid "collapsed tower" -msgstr "" +msgstr "倒塌大楼" #: lang/json/overmap_terrain_from_json.py msgid "grocery store" @@ -107379,11 +108426,11 @@ msgstr "商用空地" #: lang/json/overmap_terrain_from_json.py msgid "hunting supply store" -msgstr "" +msgstr "狩猎用品店" #: lang/json/overmap_terrain_from_json.py msgid "hunting supply store roof" -msgstr "" +msgstr "狩猎用品店屋顶" #: lang/json/overmap_terrain_from_json.py msgid "road" @@ -107711,15 +108758,15 @@ msgstr "别墅" #: lang/json/overmap_terrain_from_json.py msgid "mi-go encampment" -msgstr "米·戈 营地" +msgstr "米·戈营地" #: lang/json/overmap_terrain_from_json.py msgid "mi-go spire" -msgstr "米·戈 尖顶" +msgstr "米·戈尖顶" #: lang/json/overmap_terrain_from_json.py msgid "mi-go landing platform" -msgstr "米·戈 降落平台" +msgstr "米·戈降落平台" #: lang/json/overmap_terrain_from_json.py msgid "fema camp" @@ -108136,7 +109183,7 @@ msgstr "动物园" #: lang/json/overmap_terrain_from_json.py msgid "zoo roof" -msgstr "" +msgstr "动物园屋顶" #: lang/json/overmap_terrain_from_json.py msgid "stadium parking" @@ -108468,9 +109515,17 @@ msgid "parking garage" msgstr "停车场" #: lang/json/overmap_terrain_from_json.py -msgid "sewage treatment" +msgid "sewage treatment plant" msgstr "污水处理站" +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment plant roof" +msgstr "污水处理站屋顶" + +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment plant - underground" +msgstr "污水处理站地下室" + #: lang/json/overmap_terrain_from_json.py msgid "toxic waste dump" msgstr "废料排放场" @@ -108609,7 +109664,7 @@ msgstr "魔法商店屋顶" #: lang/json/overmap_terrain_from_json.py msgid "used bookstore" -msgstr "" +msgstr "旧书店" #: lang/json/overmap_terrain_from_json.py msgid "apartment towers" @@ -108776,6 +109831,10 @@ msgstr "公共图书馆 - 二层" msgid "mechanics garage" msgstr "机械师车库" +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment" +msgstr "污水处理站" + #: lang/json/overmap_terrain_from_json.py msgid "mechanic garage" msgstr "机械师车库" @@ -109628,6 +110687,34 @@ msgid "" "next hit." msgstr "怎么了……怎么了?人们都怎么了?不管了……药不够了!给我药……我不要放弃治疗……" +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Pillhead" +msgstr "瘾君子" + +#. ~ Profession (male Pillhead) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"After an accident in your youth, you got addicted to the opiates treating " +"your pain. With the pharmacies shut down and dealers turned undead, " +"satisfying your fix just got a lot more difficult." +msgstr "在你年轻时的一次事故后,你对你用来镇痛的阿片类药物成瘾了。现在药店关门,毒贩也变成了丧尸,要想爽一把可就更难了。" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Pillhead" +msgstr "瘾君子" + +#. ~ Profession (female Pillhead) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"After an accident in your youth, you got addicted to the opiates treating " +"your pain. With the pharmacies shut down and dealers turned undead, " +"satisfying your fix just got a lot more difficult." +msgstr "在你年轻时的一次事故后,你对你用来镇痛的阿片类药物成瘾了。现在药店关门,毒贩也变成了丧尸,要想爽一把可就更难了。" + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "K9 Officer" @@ -111254,7 +112341,7 @@ msgid "" "You clawed your way out of poverty by selling products everyone wanted, and " "they had the nerve to put you in jail for it. Too bad you can't sell drugs " "to zombies or aliens." -msgstr "你通过销售每个人都想要的产品来摆脱贫困,他们为此把你关进监狱。现在更糟了,因为你不能把毒品卖给僵尸或外星人。" +msgstr "你通过销售每个人都想要的产品来摆脱贫困,他们为此把你关进监狱。现在更糟了,因为你不能把毒品卖给丧尸或外星人。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -111268,7 +112355,7 @@ msgid "" "You clawed your way out of poverty by selling products everyone wanted, and " "they had the nerve to put you in jail for it. Too bad you can't sell drugs " "to zombies or aliens." -msgstr "你通过销售每个人都想要的产品来摆脱贫困,他们为此把你关进监狱。现在更糟了,因为你不能把毒品卖给僵尸或外星人。" +msgstr "你通过销售每个人都想要的产品来摆脱贫困,他们为此把你关进监狱。现在更糟了,因为你不能把毒品卖给丧尸或外星人。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -114271,7 +115358,7 @@ msgstr "你总是必须隐藏你的魔法,因为在巫师世界里,它不是 #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Novice Stormshaper" -msgstr "" +msgstr "风暴塑造者学徒" #. ~ Profession (male Novice Stormshaper) description #: lang/json/professions_from_json.py @@ -114281,12 +115368,12 @@ msgid "" "Recently you found it was possible to manipulate the weather yourself " "through arcane means! Unfortunately you did not have long to enjoy your " "power, as events unfolded..." -msgstr "" +msgstr "你爸以前是个气象员,所以你也对气象学很感兴趣。最近你发现你居然可以用神秘的方法操作天气!可惜你没来得及发挥你的力量,大灾变就到来了……" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "Novice Stormshaper" -msgstr "" +msgstr "风暴塑造者学徒" #. ~ Profession (female Novice Stormshaper) description #: lang/json/professions_from_json.py @@ -114296,12 +115383,12 @@ msgid "" "Recently you found it was possible to manipulate the weather yourself " "through arcane means! Unfortunately you did not have long to enjoy your " "power, as events unfolded..." -msgstr "" +msgstr "你爸以前是个气象员,所以你也对气象学很感兴趣。最近你发现你居然可以用神秘的方法操作天气!可惜你没来得及发挥你的力量,大灾变就到来了……" #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Novice Earthshaper" -msgstr "" +msgstr "塑地者学徒" #. ~ Profession (male Novice Earthshaper) description #: lang/json/professions_from_json.py @@ -114309,12 +115396,12 @@ msgctxt "prof_desc_male" msgid "" "You always were tough in a fight. Your coach managed to teach you a trick " "or two to make you a little tougher." -msgstr "" +msgstr "你在打架的时候总是最能抗的那个。你的教练在此基础上教了你几个绝招,让你变得更加能抗。" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "Novice Earthshaper" -msgstr "" +msgstr "塑地者学徒" #. ~ Profession (female Novice Earthshaper) description #: lang/json/professions_from_json.py @@ -114322,7 +115409,7 @@ msgctxt "prof_desc_female" msgid "" "You always were tough in a fight. Your coach managed to teach you a trick " "or two to make you a little tougher." -msgstr "" +msgstr "你在打架的时候总是最能抗的那个。你的教练在此基础上教了你几个绝招,让你变得更加能抗。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -114335,7 +115422,7 @@ msgctxt "prof_desc_male" msgid "" "With the recent Cataclysm, the way you found to cheat on tests may have to " "find some other use." -msgstr "" +msgstr "随着大灾变的到来,你可能得想办法把在考试时学会的作弊技巧用在其它方面了。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -114348,7 +115435,7 @@ msgctxt "prof_desc_female" msgid "" "With the recent Cataclysm, the way you found to cheat on tests may have to " "find some other use." -msgstr "" +msgstr "随着大灾变的到来,你可能得想办法把在考试时学会的作弊技巧用在其它方面了。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -115442,7 +116529,6 @@ msgid "WEAPON" msgstr "武器" #. ~ Crafting recipes subcategory all -#. ~ Crafting recipes subcategory of 'ENCHANTED' category #: lang/json/recipe_category_from_json.py #: lang/json/recipe_category_from_json.py src/crafting_gui.cpp msgid "ALL" @@ -116083,34 +117169,34 @@ msgstr "我们需要一些庇护所,所以在营地的东北搭个帐篷。" msgid "" "We should expand our housing by putting up a tent on the east side, though " "doing so will mean we need more materials to build the central building." -msgstr "" +msgstr "我们应该在东边搭个帐篷来扩大我们的住房,尽管这样做意味着我们需要更多的材料来建造中央建筑。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by putting up a tent on the southeast side, " "though doing so will mean we need more materials to build the central " "building." -msgstr "" +msgstr "我们应该在东南搭个帐篷来扩大我们的住房,尽管这样做意味着我们需要更多的材料来建造中央建筑。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by putting up a tent on the northwest side, " "though doing so will mean we need more materials to build the central " "building." -msgstr "" +msgstr "我们应该在西北搭个帐篷来扩大我们的住房,尽管这样做意味着我们需要更多的材料来建造中央建筑。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by putting up a tent on the west side, though " "doing so will mean we need more materials to build the central building." -msgstr "" +msgstr "我们应该在西边搭个帐篷来扩大我们的住房,尽管这样做意味着我们需要更多的材料来建造中央建筑。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by putting up a tent on the southwest side, " "though doing so will mean we need more materials to build the central " "building." -msgstr "" +msgstr "我们应该在西南搭个帐篷来扩大我们的住房,尽管这样做意味着我们需要更多的材料来建造中央建筑。" #: lang/json/recipe_from_json.py msgid "" @@ -117175,13 +118261,13 @@ msgstr "在城镇里" #: lang/json/scenario_from_json.py msgctxt "scenario_male" msgid "Large Building" -msgstr "" +msgstr "大型建筑" #. ~ Name for scenario 'Large Building' for a female character #: lang/json/scenario_from_json.py msgctxt "scenario_female" msgid "Large Building" -msgstr "" +msgstr "大型建筑" #. ~ Description for scenario 'Large Building' for a male character. #: lang/json/scenario_from_json.py @@ -117189,7 +118275,7 @@ msgctxt "scen_desc_male" msgid "" "Whether due to stubbornness, ignorance, or just plain bad luck, you missed " "the evacuation, and are stuck in a large building full of the risen dead." -msgstr "" +msgstr "无论是由于固执,无知,或者仅仅是运气不好,反正你错过了撤离疏散,并被困在一个充满丧尸的大型建筑里。好好享受吧。" #. ~ Description for scenario 'Large Building' for a female character. #: lang/json/scenario_from_json.py @@ -117197,25 +118283,25 @@ msgctxt "scen_desc_female" msgid "" "Whether due to stubbornness, ignorance, or just plain bad luck, you missed " "the evacuation, and are stuck in a large building full of the risen dead." -msgstr "" +msgstr "无论是由于固执,无知,或者仅仅是运气不好,反正你错过了撤离疏散,并被困在一个充满丧尸的大型建筑里。好好享受吧。" #. ~ Starting location for scenario 'Large Building'. #: lang/json/scenario_from_json.py msgctxt "start_name" msgid "In Large Building" -msgstr "" +msgstr "在大型建筑中" #. ~ Name for scenario 'Surrounded' for a male character #: lang/json/scenario_from_json.py msgctxt "scenario_male" msgid "Surrounded" -msgstr "" +msgstr "丧尸之围" #. ~ Name for scenario 'Surrounded' for a female character #: lang/json/scenario_from_json.py msgctxt "scenario_female" msgid "Surrounded" -msgstr "" +msgstr "丧尸之围" #. ~ Description for scenario 'Surrounded' for a male character. #: lang/json/scenario_from_json.py @@ -117223,7 +118309,7 @@ msgctxt "scen_desc_male" msgid "" "You've attracted the attention of living dead in some way, now they're all " "around and you'll likely have to fight thorough them if you want to escape." -msgstr "" +msgstr "你不知为何吸引了一大波丧尸的注意,现在它们已经围在你的周围,而你可能需要一路杀出重围了。" #. ~ Description for scenario 'Surrounded' for a female character. #: lang/json/scenario_from_json.py @@ -117231,19 +118317,19 @@ msgctxt "scen_desc_female" msgid "" "You've attracted the attention of living dead in some way, now they're all " "around and you'll likely have to fight thorough them if you want to escape." -msgstr "" +msgstr "你不知为何吸引了一大波丧尸的注意,现在它们已经围在你的周围,而你可能需要一路杀出重围了。" #. ~ Name for scenario 'Safe Place' for a male character #: lang/json/scenario_from_json.py msgctxt "scenario_male" msgid "Safe Place" -msgstr "" +msgstr "安全位置" #. ~ Name for scenario 'Safe Place' for a female character #: lang/json/scenario_from_json.py msgctxt "scenario_female" msgid "Safe Place" -msgstr "" +msgstr "安全位置" #. ~ Description for scenario 'Safe Place' for a male character. #: lang/json/scenario_from_json.py @@ -117251,7 +118337,7 @@ msgctxt "scen_desc_male" msgid "" "You've found some distant safe place, devoid of the living dead. Looks like" " you're on your own..." -msgstr "" +msgstr "你现在在一个安全没有丧尸的地方,但是看起来只有你一个人了……" #. ~ Description for scenario 'Safe Place' for a female character. #: lang/json/scenario_from_json.py @@ -117259,13 +118345,13 @@ msgctxt "scen_desc_female" msgid "" "You've found some distant safe place, devoid of the living dead. Looks like" " you're on your own..." -msgstr "" +msgstr "你现在在一个安全没有丧尸的地方,但是看起来只有你一个人了……" #. ~ Starting location for scenario 'Safe Place'. #: lang/json/scenario_from_json.py msgctxt "start_name" msgid "Safe Building" -msgstr "" +msgstr "安全的建筑" #. ~ Name for scenario 'Infected' for a male character #: lang/json/scenario_from_json.py @@ -117327,13 +118413,13 @@ msgstr "你选择歇脚的房子突然失火了!你还是快逃吧。" #: lang/json/scenario_from_json.py msgctxt "scenario_male" msgid "Challenge - Really Bad Day" -msgstr "" +msgstr "挑战-超级糟糕的一天" #. ~ Name for scenario 'Challenge - Really Bad Day' for a female character #: lang/json/scenario_from_json.py msgctxt "scenario_female" msgid "Challenge - Really Bad Day" -msgstr "" +msgstr "挑战-超级糟糕的一天" #. ~ Description for scenario 'Challenge - Really Bad Day' for a male #. character. @@ -117344,6 +118430,7 @@ msgid "" "surrounded by fire, and sick with the flu. This day went downhill really " "fast." msgstr "" +"大灾变来临的时候你正巧心情非常差,而且又喝到几乎不省人事。更别提现在伤口不但严重感染还得了流感。抬头一看,啊,运气真好,你现在待的屋子正在熊熊燃烧……今儿个真是走背字。" #. ~ Description for scenario 'Challenge - Really Bad Day' for a female #. character. @@ -117354,6 +118441,7 @@ msgid "" "surrounded by fire, and sick with the flu. This day went downhill really " "fast." msgstr "" +"大灾变来临的时候你正巧心情非常差,而且又喝到几乎不省人事。更别提现在伤口不但严重感染还得了流感。抬头一看,啊,运气真好,你现在待的屋子正在熊熊燃烧……今儿个真是走背字。" #. ~ Name for scenario 'Challenge - Medieval Peasant' for a male character #: lang/json/scenario_from_json.py @@ -117477,7 +118565,7 @@ msgctxt "scen_desc_male" msgid "" "It is the winter after zero hour. As you were scavenging for food and a " "warm place to stay at, you heard the sound of lots of movement nearby." -msgstr "" +msgstr "现在是大灾变之后的第一个冬天。正当你在搜寻食物和一个能待的温暖点的地方时,你听见附近传来无数移动的声音。" #. ~ Description for scenario 'Ambush' for a female character. #: lang/json/scenario_from_json.py @@ -117485,7 +118573,7 @@ msgctxt "scen_desc_female" msgid "" "It is the winter after zero hour. As you were scavenging for food and a " "warm place to stay at, you heard the sound of lots of movement nearby." -msgstr "" +msgstr "现在是大灾变之后的第一个冬天。正当你在搜寻食物和一个能待的温暖点的地方时,你听见附近传来无数移动的声音。" #. ~ Starting location for scenario 'Ambush'. #. ~ Starting location for scenario 'The Next Summer'. @@ -117619,7 +118707,7 @@ msgid "" "When the cataclysm happened, you were convicted or working in a prison. Now" " the prisoners have turned into mindless horrors and the security bots are " "shooting on sight... you might need to expedite your escape plans." -msgstr "" +msgstr "当大灾变发生时,你正在监狱服刑劳改。现在所有的囚犯都变成了没头没脑的怪物,保安机器人见人就射……你或许要考虑一次越狱行动了。" #. ~ Description for scenario 'Prison' for a female character. #: lang/json/scenario_from_json.py @@ -117628,7 +118716,7 @@ msgid "" "When the cataclysm happened, you were convicted or working in a prison. Now" " the prisoners have turned into mindless horrors and the security bots are " "shooting on sight... you might need to expedite your escape plans." -msgstr "" +msgstr "当大灾变发生时,你正在监狱服刑劳改。现在所有的囚犯都变成了没头没脑的怪物,保安机器人见人就射……你或许要考虑一次越狱行动了。" #. ~ Starting location for scenario 'Prison'. #: lang/json/scenario_from_json.py @@ -117640,13 +118728,13 @@ msgstr "监狱" #: lang/json/scenario_from_json.py msgctxt "scenario_male" msgid "Challenge - Island Prison" -msgstr "" +msgstr "挑战-海岛越狱" #. ~ Name for scenario 'Challenge - Island Prison' for a female character #: lang/json/scenario_from_json.py msgctxt "scenario_female" msgid "Challenge - Island Prison" -msgstr "" +msgstr "挑战-海岛越狱" #. ~ Description for scenario 'Challenge - Island Prison' for a male #. character. @@ -117657,6 +118745,7 @@ msgid "" " to make it outside the inner walls... Too bad it's located on a remote " "island, and now you need to find out how to escape it too." msgstr "" +"在灾难发生前你被关进了一所戒备森严的监狱,而你好不容易才逃出了监狱的围墙。不幸的是这座监狱坐落在一个偏远的岛上,而现在你得想出一个逃离方法。" #. ~ Description for scenario 'Challenge - Island Prison' for a female #. character. @@ -117667,6 +118756,7 @@ msgid "" " to make it outside the inner walls... Too bad it's located on a remote " "island, and now you need to find out how to escape it too." msgstr "" +"在灾难发生前你被关进了一所戒备森严的监狱,而你好不容易才逃出了监狱的围墙。不幸的是这座监狱坐落在一个偏远的岛上,而现在你得想出一个逃离方法。" #. ~ Starting location for scenario 'Challenge - Island Prison'. #: lang/json/scenario_from_json.py @@ -117791,7 +118881,7 @@ msgid "" "While being transported to a different military base, the pilot lost control" " of the helicopter and crashed in the middle of nowhere. Hopefully some of " "the soldiers that were with you also survived the accident." -msgstr "" +msgstr "当你正乘坐直升机转移基地时,驾驶员失去了对直升机的控制,你们坠毁到了荒野之中。或许,和你同行的士兵也还活着?" #. ~ Description for scenario 'Helicopter Crash' for a female character. #: lang/json/scenario_from_json.py @@ -117800,7 +118890,7 @@ msgid "" "While being transported to a different military base, the pilot lost control" " of the helicopter and crashed in the middle of nowhere. Hopefully some of " "the soldiers that were with you also survived the accident." -msgstr "" +msgstr "当你正乘坐直升机转移基地时,驾驶员失去了对直升机的控制,你们坠毁到了荒野之中。或许,和你同行的士兵也还活着?" #. ~ Starting location for scenario 'Helicopter Crash'. #: lang/json/scenario_from_json.py @@ -117826,7 +118916,7 @@ msgctxt "scen_desc_male" msgid "" "You were participating in a mining operation when you found... something. " "You're not sure what, but it sure is dark down here." -msgstr "" +msgstr "当你在进行采矿作业的时候,你发现了……某种东西。你不知道那是什么,但有一点肯定的是,这底下真的很黑。" #. ~ Description for scenario 'Bottom of a Mine' for a female character. #: lang/json/scenario_from_json.py @@ -117834,7 +118924,7 @@ msgctxt "scen_desc_female" msgid "" "You were participating in a mining operation when you found... something. " "You're not sure what, but it sure is dark down here." -msgstr "" +msgstr "当你在进行采矿作业的时候,你发现了……某种东西。你不知道那是什么,但有一点肯定的是,这底下真的很黑。" #. ~ Starting location for scenario 'Bottom of a Mine'. #: lang/json/scenario_from_json.py @@ -117864,6 +118954,7 @@ msgid "" "desperate people with little to lose could get you what you wanted. If you " "went too deep, however, your augmentation may have come at a price..." msgstr "" +"在末日来临之前,生化插件仅仅属于少数有钱有权人的玩物。你无钱也无权,不过你也想安些生化插件。隐蔽在地下室里的工作室,从医院偷偷走私出来的麻醉药,还有那些走投无路的人给你带来了你想要的一切。你沿着这条路走得越来越远,但是,你所安装的生化插件将会让你付出代价……" #. ~ Description for scenario 'High Tech, Low Life' for a female character. #: lang/json/scenario_from_json.py @@ -117875,6 +118966,7 @@ msgid "" "desperate people with little to lose could get you what you wanted. If you " "went too deep, however, your augmentation may have come at a price..." msgstr "" +"在末日来临之前,生化插件仅仅属于少数有钱有权人的玩物。你无钱也无权,不过你也想安些生化插件。隐蔽在地下室里的工作室,从医院偷偷走私出来的麻醉药,还有那些走投无路的人给你带来了你想要的一切。你沿着这条路走得越来越远,但是,你所安装的生化插件将会让你付出代价……" #. ~ Starting location for scenario 'High Tech, Low Life'. #: lang/json/scenario_from_json.py @@ -117940,6 +119032,7 @@ msgid "" " begun to make you doubt it. Wandering in your temple, you just found books " "that may restore your faith or shatter it completely." msgstr "" +"你已经宣扬你的信仰很长一段时间了,但最近的事件让产生了动摇。你在神殿里游荡,发现了一些书籍。也许它能够恢复你的信仰。但也说不定会完全摧毁它。" #. ~ Description for scenario 'Lost Faith' for a female character. #: lang/json/scenario_from_json.py @@ -117949,6 +119042,7 @@ msgid "" " begun to make you doubt it. Wandering in your temple, you just found books " "that may restore your faith or shatter it completely." msgstr "" +"你已经宣扬你的信仰很长一段时间了,但最近的事件让产生了动摇。你在神殿里游荡,发现了一些书籍。也许它能够恢复你的信仰。但也说不定会完全摧毁它。" #. ~ Starting location for scenario 'Lost Faith'. #: lang/json/scenario_from_json.py @@ -118654,7 +119748,7 @@ msgid "" msgstr "合理地使用地图。优先去那些能让你得到所需物品的地点。" #: lang/json/snippet_from_json.py -msgid "Wounds heal over time. Bandages and disinfectant speeds that up." +msgid "Wounds heal over time. Bandages and antiseptic speeds that up." msgstr "伤口会随着时间的推移而愈合。包扎和消毒可以加快这一过程。" #: lang/json/snippet_from_json.py @@ -119093,7 +120187,7 @@ msgid "" "ones can walk in through a wall. At least they can't smell you, unlike " "zombies, so if you turn your light off at night you can sneak right past." msgstr "" -"普通骷髅的骨头过于脆弱以至于不能打破门和窗户,大的却可以直接打穿墙。它们也闻不到你,不像僵尸那样,所以如果你晚上关掉灯,就可以偷偷的绕过它们。" +"普通骷髅的骨头过于脆弱以至于不能打破门和窗户,大的却可以直接打穿墙。它们也闻不到你,不像丧尸那样,所以如果你晚上关掉灯,就可以偷偷的绕过它们。" #: lang/json/snippet_from_json.py msgid "" @@ -119364,7 +120458,7 @@ msgid "" "Backpacks let you carry lots of stuff, but they limit your movement a lot. " "If you have to fight a zombie at close range, don't wear one, or at least " "drop it on the ground before the fight." -msgstr "背包让你能装得更多,同时也限制了你的行动。如果你必须近距离与僵尸战斗,千万别背这玩意,或者至少在战斗前把它扔在地上!" +msgstr "背包让你能装得更多,同时也限制了你的行动。如果你必须近距离与丧尸战斗,千万别背这玩意,或者至少在战斗前把它扔在地上!" #: lang/json/snippet_from_json.py msgid "" @@ -119393,9 +120487,9 @@ msgstr "如果你受伤了,我可以给你包扎,如果你有绷带的话, #: lang/json/snippet_from_json.py msgid "" -"If you have extra disinfectant, use it to disinfect your wounds, even if " -"they aren't infected. They will recover faster that way." -msgstr "如果你有多余的消毒剂,用它来消毒你的伤口。即使伤口没有感染,也能恢复得更快。" +"If you have extra antiseptic, use it to disinfect your wounds, even if they " +"aren't infected. They will recover faster that way." +msgstr "如果你有多余的抗菌剂,用它来消毒你的伤口。即使伤口没有感染,也能恢复得更快。" #: lang/json/snippet_from_json.py msgid "" @@ -119595,7 +120689,7 @@ msgid "" "I have a dream of raiding a military bunker, but I well know that good " "protection plus zombie soldiers are a bad mix. The sheer thought of being " "sprayed with bullets by a turret is giving me the shivers." -msgstr "我有一个洗劫军事掩体的梦想,但我很清楚,僵尸士兵加良好的掩护是最坏的组合。一想到炮塔向我喷射子弹,我就不寒而栗。" +msgstr "我有一个洗劫军事掩体的梦想,但我很清楚,丧尸士兵加良好的掩护是最坏的组合。一想到炮塔向我喷射子弹,我就不寒而栗。" #: lang/json/snippet_from_json.py msgid "" @@ -119844,7 +120938,7 @@ msgstr "我想过在我的狗身上放一个袋子来装我的东西。但那没 msgid "" "Stuff from zombies is filthy but perfectly fine otherwise. Using soap or " "other detergents won't hurt you. Quick wash and you're equipped for days." -msgstr "僵尸的东西是肮脏的,但在其他方面是完美的。使用肥皂或其他清洁剂对你没坏处。快点洗洗你穿了好几天的装备!" +msgstr "丧尸的东西是肮脏的,但在其他方面是完美的。使用肥皂或其他清洁剂对你没坏处。随便洗几件衣服,你就几天都不用愁装备了!" #: lang/json/snippet_from_json.py msgid "" @@ -119935,7 +121029,7 @@ msgid "" "Much to be said, but half an hour later, he was still alive. Guess you can " "take a punch being a walking tin can." msgstr "" -"好吧,给你讲个诡异的故事。在我们相遇之前,我看见一个骑士。不,我没疯。一个穿着中世纪盔甲的家伙被一些僵尸逼到了墙角。有很多要说的,但半小时后,他还活着。我建议你把自己武装成一个步行的铁罐头。" +"好吧,给你讲个诡异的故事。在我们相遇之前,我看见一个骑士。不,我没疯。一个穿着中世纪盔甲的家伙被一些丧尸逼到了墙角。一言难尽,但半小时后,他还活着。我建议你把自己武装成一个步行的铁罐头。" #: lang/json/snippet_from_json.py msgid "" @@ -120108,11 +121202,11 @@ msgstr "混蛋" #: lang/json/snippet_from_json.py msgid "blockhead" -msgstr "傻瓜" +msgstr "瓜批" #: lang/json/snippet_from_json.py msgid "chump" -msgstr "蠢货" +msgstr "蠢材" #: lang/json/snippet_from_json.py msgid "clown" @@ -120120,11 +121214,11 @@ msgstr "小丑" #: lang/json/snippet_from_json.py msgid "cretin" -msgstr "白痴" +msgstr "脑瘫" #: lang/json/snippet_from_json.py msgid "degenerate" -msgstr "废物" +msgstr "败类" #: lang/json/snippet_from_json.py msgid "dick" @@ -120144,7 +121238,7 @@ msgstr "哈逼" #: lang/json/snippet_from_json.py msgid "dumb " -msgstr "蠢 " +msgstr "死" #: lang/json/snippet_from_json.py msgid "fool" @@ -120188,23 +121282,23 @@ msgstr "孬种" #: lang/json/snippet_from_json.py msgid "piece of shit" -msgstr "废物" +msgstr "憨批" #: lang/json/snippet_from_json.py msgid "punk" -msgstr "朋克" +msgstr "阿飞" #: lang/json/snippet_from_json.py msgid "scumbag" -msgstr "人渣" +msgstr "渣滓" #: lang/json/snippet_from_json.py msgid "shit-brained " -msgstr "脑子有屎的 " +msgstr "脑子进屎的" #: lang/json/snippet_from_json.py msgid "shit-eater" -msgstr "吃屎鬼" +msgstr "吔屎" #: lang/json/snippet_from_json.py msgid "shitass" @@ -120220,19 +121314,19 @@ msgstr "大便脸" #: lang/json/snippet_from_json.py msgid "son of a " -msgstr "狗娘养的 " +msgstr "狗娘养的" #: lang/json/snippet_from_json.py msgid "stinky " -msgstr "恶心巴拉的 " +msgstr "臭" #: lang/json/snippet_from_json.py msgid "stupidass" -msgstr "傻了吧唧" +msgstr "傻鸠" #: lang/json/snippet_from_json.py msgid "stupid " -msgstr "傻" +msgstr "吊逼" #: lang/json/snippet_from_json.py msgid "swine" @@ -120240,7 +121334,7 @@ msgstr "蠢猪" #: lang/json/snippet_from_json.py msgid "zombie food" -msgstr "喂丧尸的货" +msgstr "丧尸饲料" #: lang/json/snippet_from_json.py msgid "loser" @@ -120248,7 +121342,7 @@ msgstr "废物" #: lang/json/snippet_from_json.py msgid "dickhead" -msgstr "白痴" +msgstr "吊毛" #: lang/json/snippet_from_json.py msgid "asshole" @@ -120260,7 +121354,7 @@ msgstr "人渣" #: lang/json/snippet_from_json.py msgid "sucker" -msgstr "笨蛋" +msgstr "卢瑟" #: lang/json/snippet_from_json.py msgid "fuckwad" @@ -120272,7 +121366,7 @@ msgstr "白痴" #: lang/json/snippet_from_json.py msgid "motherfucker" -msgstr "混账东西" +msgstr "混账" #: lang/json/snippet_from_json.py msgid "shithead" @@ -121510,7 +122604,7 @@ msgstr "闪到一边去" #: lang/json/snippet_from_json.py msgid "Get out of my line of fire" -msgstr "别挡着我的射击线" +msgstr "别挡着我的射击路径" #: lang/json/snippet_from_json.py msgid "I almost want to eat my now." @@ -122369,31 +123463,31 @@ msgstr "一塌糊涂的" #: lang/json/snippet_from_json.py msgid "stupid" -msgstr "愚蠢的" +msgstr "愚蠢" #: lang/json/snippet_from_json.py msgid "idiotic" -msgstr "白痴的" +msgstr "白痴" #: lang/json/snippet_from_json.py msgid "dumb" -msgstr "脑残的" +msgstr "脑残" #: lang/json/snippet_from_json.py msgid "dumb-ass" -msgstr "智障的" +msgstr "智障" #: lang/json/snippet_from_json.py msgid "moronic" -msgstr "低能的" +msgstr "低能" #: lang/json/snippet_from_json.py msgid "mickey mouse" -msgstr "幼稚的" +msgstr "幼稚" #: lang/json/snippet_from_json.py msgid "shit-for-brains" -msgstr "笨蛋的" +msgstr "脑瘫" #: lang/json/snippet_from_json.py msgid "Z" @@ -122617,11 +123711,11 @@ msgstr "会使用任何远程武器。" #: lang/json/snippet_from_json.py msgid " will avoid shooting if allies are in the line of fire." -msgstr "将避免射击,如果队友处于火力线。" +msgstr "如果队友处于射击路径上,将避免射击。" #: lang/json/snippet_from_json.py msgid " will shoot even if allies are in the line of fire." -msgstr "即使队友处于火力线上也会开枪。" +msgstr "即使队友处于射击路径上也会开枪。" #: lang/json/snippet_from_json.py msgid "* will pick up items." @@ -124154,7 +125248,7 @@ msgstr "\"伙计们,办事永远要有效率;你们要一直工作然后回 #: lang/json/snippet_from_json.py msgid "\"IM OFF TO THUNDERDOME, BYE SUCKERS.\"" -msgstr "\"我去雷电堡了,再见了傻瓜们。\"" +msgstr "\"我去雷电堡了,再见了傻逼们。\"" #: lang/json/snippet_from_json.py msgid "" @@ -125016,7 +126110,7 @@ msgstr "\"我的腿被切除了。没关系,至少我还有我的狗陪着我 msgid "" "\"Mi-go is friend! Go with Mi-go to friend dimension! On the Friend " "Team!!\"" -msgstr "\"米戈是朋友!和米戈一起去朋友位面!一起做朋友!!\"" +msgstr "\"米·戈是朋友!和米·戈一起去朋友位面!一起做朋友!!\"" #: lang/json/snippet_from_json.py msgid "\"We have Landed our Comet. The Sky is Ablaze.\"" @@ -125309,7 +126403,7 @@ msgid "" "New England before it was quarantined. I can only hope there are no " "zombies, as we do have here, in the city she flew to.\"" msgstr "" -"“丽莎一直是体育迷。谢天谢地,这些在哈兰举行的全球性运动会在疫情爆发前一段时间就开始了,所以她在新英格兰被隔离之前就离开了。我只能希望她飞去的城市里没有僵尸,就像我们这里一样。”" +"“丽莎一直是体育迷。谢天谢地,这些在哈兰举行的全球性运动会在疫情爆发前一段时间就开始了,所以她在新英格兰被隔离之前就离开了。我只能希望她飞去的城市里没有丧尸,不像我们这里。”" #: lang/json/snippet_from_json.py msgid "" @@ -125700,13 +126794,6 @@ msgid "" msgstr "" "毒品使用率攀升:最新研究指出毒品的使用量在近两年中上升超过了40%。一名专家表示:\"人们对工作、国家甚至是自己的生命感到害怕,所以他们转而寻求毒品的慰藉。\"" -#: lang/json/snippet_from_json.py -msgid "" -"WAR ON DRUGS DEAD: The government has finally reacted to long accumulated " -"evidence that suggests that decriminalized drugs cause fewer health problems" -" and are generally better managed while providing valuable tax revenues." -msgstr "毒品战争结束:根据长久以来的实验证明与记录,政府终于认同毒品合法化可使降低民众健康问题,较好管理且可提供稳定的税收。" - #: lang/json/snippet_from_json.py msgid "" "FEELING BLUE? Try \"Greens\" for Magazines! Your local Supermarket! " @@ -126017,27 +127104,27 @@ msgstr "你即死神,为他们而来,马上就到。" #: lang/json/snippet_from_json.py msgid "You feel restless. It's been too long since your last kill." -msgstr "" +msgstr "你感到烦躁。你已经好久没有大开杀戒了。" #: lang/json/snippet_from_json.py msgid "Killing something would be nice right now." -msgstr "" +msgstr "是时候开开杀戒了。" #: lang/json/snippet_from_json.py msgid "Just one more death, one more kill and then you'd be right." -msgstr "" +msgstr "就杀一个……杀一个你就满足了。" #: lang/json/snippet_from_json.py msgid "You feel the rush of the kill." -msgstr "" +msgstr "你感到了虐杀的快感。" #: lang/json/snippet_from_json.py msgid "Your urge to kill is sated, for now." -msgstr "" +msgstr "你暂时满足了你的杀意。" #: lang/json/snippet_from_json.py msgid "You have the power of life and death, it feels good to be in control." -msgstr "" +msgstr "掌握他人生死的力量让你满足。" #: lang/json/snippet_from_json.py msgid "You exhale in bliss." @@ -126045,39 +127132,39 @@ msgstr "你呼吸着幸福。" #: lang/json/snippet_from_json.py msgid "A calm feeling washes over." -msgstr "" +msgstr "一阵冷静流过你的全身。" #: lang/json/snippet_from_json.py msgid "This feels right." -msgstr "" +msgstr "爽。" #: lang/json/snippet_from_json.py msgid "You kill and your world is in order again." -msgstr "" +msgstr "虐杀让你的世界回到了正轨。" #: lang/json/snippet_from_json.py msgid "Your worries evaporate as the creature dies by your hand." -msgstr "" +msgstr "亲手终结掉它后,你的烦恼一扫而空。" #: lang/json/snippet_from_json.py msgid "That was nice! Maybe one more?" -msgstr "" +msgstr "真爽,要不再来一次?" #: lang/json/snippet_from_json.py msgid "This feels so good! You could do this all day." -msgstr "" +msgstr "爽翻了!你可以一直干下去。" #: lang/json/snippet_from_json.py msgid "This brings a smile to your face." -msgstr "" +msgstr "你露出一丝微笑。" #: lang/json/snippet_from_json.py msgid "You feel tension leave your body as your need to kill is satisfied." -msgstr "" +msgstr "你满足了你的杀欲,不再不安。" #: lang/json/snippet_from_json.py msgid "You feel much better now." -msgstr "" +msgstr "你感觉好多了。" #: lang/json/snippet_from_json.py msgid "You catch a glimpse of distant green." @@ -126826,9 +127913,8 @@ msgid "" " though, you don't need to worry about headshots! Any major damage will lay" " a shambler out." msgstr "" -"DJ Dustbowl回来了,你正在收听Dark Days Radio。 快速幸存提示:记住,杀死一个僵尸是不够的。 " -"如果你不想让它再次爬起来,你必须将那些东西粉碎成纸浆或将其切成碎片。不过好消息,你不需要担心爆头!Any major damage will lay a" -" shambler out." +"DJ Dustbowl回来了,你正在收听Dark Days Radio。 快速幸存提示:记住,杀死一个丧尸是不够的。 " +"如果你不想让它再次爬起来,你必须将那些东西粉捣成肉浆或将其切成碎片。不过好消息,你不需要考虑如何爆头!任何重伤都会把那些瘸子撂倒。" #: lang/json/snippet_from_json.py msgid "" @@ -126839,14 +127925,14 @@ msgid "" "advantage... or just run away." msgstr "" "你正在收听Dark Days Radio,我是DJ " -"Dustbowl!快速提示给所有的幸存者:一个僵尸是坏消息,两个更糟糕。不要对我说兰博。不要一次面对大量僵尸或通过障碍物来减缓僵尸的行动。你并不比僵尸更强硬,但你更聪明,使用你的智慧让你更有利......或者赶紧逃跑。" +"Dustbowl!快速提示给所有的幸存者:一个丧尸是坏消息,两个更糟糕。不要对我说兰博。不要一次面对大量丧尸,或通过障碍物来减缓丧尸的行动。你并不比丧尸更强硬,但你更聪明,使用你的智慧让你更有利......或者赶紧逃跑。" #: lang/json/snippet_from_json.py msgid "" "…black goo in the water! Drugs and who knows what else, the government " "wants you dumb and docile! Wake up people. They are the spawn of Satan! " "This is Alan Jewels with the AJ show, we’ll be back after the break." -msgstr "水里的黑色粘液,毒品或者其他什么,谁知道呢?那些醒来的僵尸,他们是撒旦之子!这是艾伦·朱尔斯主持的AJ秀,我们休息会再回来。" +msgstr "水里的黑色粘液,毒品或者其他什么,谁知道呢?那些醒来的丧尸,他们是撒旦之子!这是艾伦·朱尔斯主持的AJ秀,我们休息会再回来。" #: lang/json/snippet_from_json.py msgid "" @@ -127255,7 +128341,7 @@ msgstr " 。被坦克无人机蒸发了。" #: lang/json/snippet_from_json.py msgid " . Died in his sleep. Lucky Bastard." -msgstr " 。死于睡眠中。真是个幸运的狗家伙。" +msgstr " 。在睡梦中死去。狗比真他妈走运。" #: lang/json/snippet_from_json.py msgid " Here lies . No Smoking near Molotov storage!" @@ -128425,7 +129511,7 @@ msgstr "“别担心,任何东西都不会从密封室中离开。”" #: lang/json/speech_from_json.py msgid "\"Hold on, I want to pulp that zombie corpse.\"" -msgstr "" +msgstr "“等一下,我要去捣碎那个丧尸。”" #: lang/json/speech_from_json.py msgid "\"Burning... from the inside...\"" @@ -128567,27 +129653,27 @@ msgstr "\"不是那条路!走左边!\"" #: lang/json/speech_from_json.py msgid "\"I told you to let me die.\"" -msgstr "" +msgstr "“我说了让我去死。”" #: lang/json/speech_from_json.py msgid "\"W-where am I? Why does it hur-REBOOTING IN 59 SECONDS.\"" -msgstr "" +msgstr "“我,我在哪,我疼死——59 秒 后 重 启”" #: lang/json/speech_from_json.py msgid "\"THIS UNIT IS BROKEN. PLEASE CALL AN ATTENDANT.\"" -msgstr "" +msgstr "“本 单 位 已 损 坏。 请 联 系 维 护 人 员。”" #: lang/json/speech_from_json.py msgid "\"Can't... breathe...\"" -msgstr "" +msgstr "“没法……呼吸……”" #: lang/json/speech_from_json.py msgid "\"This cannot continue.\"" -msgstr "" +msgstr "“不能这样下去了。”" #: lang/json/speech_from_json.py msgid "\"USER PASSWORD UNRECOGNIZED.\"" -msgstr "" +msgstr "“错 误 的 密 码。”" #: lang/json/speech_from_json.py msgid "" @@ -128605,19 +129691,19 @@ msgstr "\"我做了你命令的一切。请让我走!\"" #: lang/json/speech_from_json.py msgid "\"I cannot... yet I must. How do you calculate that?\"" -msgstr "" +msgstr "“我不能……但我必须这样。这怎么算得出来?”" #: lang/json/speech_from_json.py msgid "\"This is a dream. This has to be a dream.\"" -msgstr "" +msgstr "“我在做梦,我肯定在做梦。”" #: lang/json/speech_from_json.py msgid "\"This is my life now... this is my life now... this is my life now...\"" -msgstr "" +msgstr "“我以后就是这样了……我以后就是这样了……我以后就是这样了……”" #: lang/json/speech_from_json.py msgid "\"Wanna go home...\"" -msgstr "" +msgstr "“我要回家……”" #: lang/json/speech_from_json.py msgid "screams of pain." @@ -128625,7 +129711,7 @@ msgstr "痛苦的尖叫。" #: lang/json/speech_from_json.py msgid "muffled sobbing." -msgstr "" +msgstr "模糊的抽泣。" #: lang/json/speech_from_json.py msgid "" @@ -130490,14 +131576,12 @@ msgid "" "Bionics are augmentation packages, right? They come in these installable Compact Bionic Modules or CBMs, and I can use some CBMs - if you examine a CBM, it will tell you if I can use it.\n" " Find a programmable surgical installer or autodoc, position me on the couch, and activate it, and you can install a suitable CBM to me - or if I think I'll do a better job, I'll do. I'll take over installing CBMs into you if I'm better at it.\n" " I can use almost all passive bionics and some active bionics. If I have any active bionics, I'll try to use them sensibly, but if we're in danger, I'm going to activate anything that might give me an edge. I'll use any weapon bionics if they're better than the weapons you gave me, but if you think I should reserve my bionic energy for my defensive and healing bionics, you can tell me how much to reserve. I'll try to keep my bionic energy topped off, but if we're running low on supplies, you can tell me to stop recharging when I'm not full.\n" -" I'll tell you if I'm low on bionic energy and can't recharge, and what fuel I need.\n" -" Sothere are some internal atomic reactor bionics - I can use those, but I can only recharge them with plutonium slurry. That stuff is radioactive, so do us both a favor and don't give me an internal reactor unless you really like glowing in the dark." +" I'll tell you if I'm low on bionic energy and can't recharge, and what fuel I need." msgstr "" -"仿生学是增强包,对吧?它们有可安装的小型仿生模块或CBM,我可以使用一些CBM- 如果你检查CBM,它会告诉你我是否可以使用它。\n" -"你可以找一个可编程的外科安装程序或自动控制面板,把我放在床上上,激活它,给我安装一个合适的CBM—或者如果我认为我会做得更好,我会做的。如果我擅长的话,我将接手给你安装CBM。\n" -"我几乎可以使用所有的被动仿生学和一些主动仿生学。如果我有任何可用的仿生学,我会尝试合理地使用它们,但是如果我们有危险,我会激活任何可能给我优势的东西。如果它们比你给我的武器更好,我会优先使用仿生学武器,但是如果你认为我应该为我的防御和治疗保留我的仿生能量,你可以告诉我要保留多少。我会尽量让我的仿生能量保持最充足,但如果我们的供给不足,你可以告诉我不要在我没满的时候再充电。\n" -"如果我的仿生能量不足,无法充电,我将告诉你,我需要什么燃料。\n" -"这里有一些内部原子反应堆仿生学——我可以使用它们,但我只能用钚浆给它们充电。这些东西是放射性,所以帮我们一个忙,不要给我一个反应堆内部,除非你真的喜欢在黑暗中发光。" +"生化插件算是强化装置,对吧?它们装在可安装的小型仿生模块或CBM里面,而我可以使用某些CBM——如果你查看某个CBM,它会说明我是否可以使用它。\n" +" 你可以找一个可编程的外科安装程序或全自动医疗仪,让我躺到床上,启动它,你就可以帮我安装合适的CBM了——要是我觉得我能做得更好,我也可以自己尝试安装。如果我更擅长安装的话,我也能帮你安装CBM。\n" +" 我几乎可以使用所有的被动生化插件和一些主动生化插件。如果我装有任何可用的生化插件,我会尝试合理使用它们,但是如果我们有危险,我会激活任何可能给我优势的东西。如果我安装的仿生学武器比你给我的普通武器好,我会优先使用它们,但是如果你认为我应该保留一点生化能量用于防御和治疗的话,你可以告诉我要保留多少。我会尽量让我的仿生能量充满,但如果我们的供给不足,你可以在我充满生化能量之前让我停止。\n" +" 如果我的仿生能量不足,无法充电,我会告诉你我需要的燃料。" #: lang/json/talk_topic_from_json.py msgid "Tell me how I give you fuel for your bionics." @@ -130697,14 +131781,14 @@ msgstr "醒醒!" msgid "Go back to sleep." msgstr "继续睡觉。" -#: lang/json/talk_topic_from_json.py -msgid " *pshhhttt* I'm reading you boss, over." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "What is it, friend?" msgstr "干什么,老铁?" +#: lang/json/talk_topic_from_json.py +msgid " *pshhhttt* I'm reading you boss, over." +msgstr "*电流声* 老大,我收到了。完毕。" + #: lang/json/talk_topic_from_json.py msgid "Combat commands..." msgstr "[战术]按我说的方式战斗……" @@ -130940,14 +132024,14 @@ msgstr "保持目前的位置。" msgid "Show me what needs to be done at the camp." msgstr "告诉我营地还需要些什么。" -#: lang/json/talk_topic_from_json.py -msgid "I'm currently ." -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "I'm not doing much currently." msgstr "我现在没有要做的事。" +#: lang/json/talk_topic_from_json.py +msgid "I'm currently ." +msgstr "我正在。" + #: lang/json/talk_topic_from_json.py msgid "Carry on." msgstr "继续。" @@ -130999,32 +132083,32 @@ msgstr "是的,炎炎夏日让我很难受,让我们休息一下,你最近 msgid "OK, maybe it'll stop me from freezing in this weather, what's up?" msgstr "好吧,也许这能让我不再这鬼天气里冻僵了,怎么了?" +#: lang/json/talk_topic_from_json.py +msgid "Man it's dark out isn't it? what's up?" +msgstr "天太黑了不是吗?出什么事啦?" + #: lang/json/talk_topic_from_json.py msgid "" "Well, it's the time of day for a quick break surely! How are you holding " "up?" -msgstr "" - -#: lang/json/talk_topic_from_json.py -msgid "Man it's dark out isn't it? what's up?" -msgstr "天太黑了不是吗?出什么事啦?" +msgstr "对啊,是时候休息一下了!你感觉怎么样?" #: lang/json/talk_topic_from_json.py msgid "Well, I'm feeling pretty sick... are you doing OK though?" msgstr "我感觉很难受……你还好吗?" -#: lang/json/talk_topic_from_json.py -msgid "" -"Definitely, by the way, thanks for helping me so much with my tasks! " -"Anyway, you coping OK, ? " -msgstr "当然,顺便说一下,谢谢你帮了我这么多的忙!不管怎样,你能应付吗,?" - #: lang/json/talk_topic_from_json.py msgid "" "OK, let's take a moment, oh, and thanks for helping me with that thing, " "so... what's up?" msgstr "好吧,我们花点时间,哦,谢谢你帮我做那件事,所以……出什么事啦?" +#: lang/json/talk_topic_from_json.py +msgid "" +"Definitely, by the way, thanks for helping me so much with my tasks! " +"Anyway, you coping OK, ? " +msgstr "当然,顺便说一下,谢谢你帮了我这么多的忙!不管怎样,你能应付吗,?" + #: lang/json/talk_topic_from_json.py msgid "" "Now, we've got a moment, I was just thinking it's been a month or so " @@ -131096,14 +132180,14 @@ msgstr "好吧,别乱动……" msgid "Keep your distance!" msgstr "离我远点!" -#: lang/json/talk_topic_from_json.py -msgid "" -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "This is my territory, ." msgstr "这是我的领地,。" +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Calm down. I'm not going to hurt you." msgstr "冷静点,我不会伤害你。" @@ -131156,29 +132240,29 @@ msgstr "你怎么了?" msgid "I don't care." msgstr "我不在乎。" -#: lang/json/talk_topic_from_json.py -msgid "I don't have any jobs for you." -msgstr "我没有工作可以给你。" - -#: lang/json/talk_topic_from_json.py -msgid "I don't have any more jobs for you." -msgstr "我没有更多的工作可以给你了。" - #: lang/json/talk_topic_from_json.py msgid "I have other jobs for you. Want to hear about them?" -msgstr "" +msgstr "我还有些其它的工作想交给你,要听听看吗?" #: lang/json/talk_topic_from_json.py msgid "I have more jobs for you. Want to hear about them?" -msgstr "" +msgstr "我还有更多的工作想交给你,要听听看吗?" + +#: lang/json/talk_topic_from_json.py +msgid "I just have one job for you. Want to hear about it?" +msgstr "我有件事想要委托你,想听听吗?" #: lang/json/talk_topic_from_json.py msgid "I have another job for you. Want to hear about it?" msgstr "我还有个工作想交给你,要听听看吗?" #: lang/json/talk_topic_from_json.py -msgid "I just have one job for you. Want to hear about it?" -msgstr "我有件事想要委托你,想听听吗?" +msgid "I don't have any more jobs for you." +msgstr "我没有更多的工作可以给你了。" + +#: lang/json/talk_topic_from_json.py +msgid "I don't have any jobs for you." +msgstr "我没有工作可以给你。" #: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py #: src/npctalk.cpp @@ -131190,16 +132274,16 @@ msgid "Never mind, I'm not interested." msgstr "[拒绝]算了,我没兴趣。" #: lang/json/talk_topic_from_json.py -msgid "You're not working on anything for me now." -msgstr "你现在没有为我做任何事情。" +msgid "What about it?" +msgstr "怎么样了?" #: lang/json/talk_topic_from_json.py msgid "Which job?" msgstr "哪个工作?" #: lang/json/talk_topic_from_json.py -msgid "What about it?" -msgstr "这个怎么样?" +msgid "You're not working on anything for me now." +msgstr "你现在没有为我做任何事情。" #: lang/json/talk_topic_from_json.py msgid "I'll do it!" @@ -131267,7 +132351,7 @@ msgstr "我在这里。" #: lang/json/talk_topic_from_json.py msgid "I talked to them." -msgstr "" +msgstr "我和他谈过了。" #: lang/json/talk_topic_from_json.py msgid "Here it is!" @@ -131399,11 +132483,11 @@ msgstr "嗯嗯,好吧。" #: lang/json/talk_topic_from_json.py msgid "Focus on the road, mate!" -msgstr "" +msgstr "专心开车,兄弟!" #: lang/json/talk_topic_from_json.py msgid "I must focus on the road!" -msgstr "" +msgstr "我在开车呢!" #: lang/json/talk_topic_from_json.py msgid "I'm too thirsty, give me something to drink." @@ -131543,7 +132627,7 @@ msgstr "你开车的时候,我没法好好儿训练你!" #: lang/json/talk_topic_from_json.py msgid "I can't train you properly while I'm operating a vehicle!" -msgstr "" +msgstr "我开车的时候没法训练你!" #: lang/json/talk_topic_from_json.py msgid "Give it some time, I'll show you something new later..." @@ -132596,11 +133680,11 @@ msgstr "请测试mapgen_update链接" #: lang/json/talk_topic_from_json.py msgid "This is a driving test response." -msgstr "" +msgstr "驾驶测试回应。" #: lang/json/talk_topic_from_json.py msgid "This is a low driving test response." -msgstr "" +msgstr "低驾驶技能测试回应。" #: lang/json/talk_topic_from_json.py msgid "Greetings friend, it's nice to see you." @@ -132930,8 +134014,7 @@ msgid "" "matter then, really doesn't now. Things started going crazy while I was at " "work... The military rolled into town, and the evacuation alert sounded." msgstr "" -"在这一切发生之前,我在叁巴烤肉店有份蹩脚的工作,负责给汉堡翻面。失去它没什么大不了的。失去我的爸爸妈妈更让人伤心。上一次看到他们活着的时候,我刚从学校回来,拿了包零食然后就去上班了。我想我甚至没有告诉我妈妈我爱她,而我那会还因为一些" -" 的毫不重要的事情生我爸爸的气。那时候不重要,现在更不重要了。当我在工作的时候,一切都开始变得疯狂……军队进城,疏散警报响起。" +"在这一切发生之前,我在叁巴烤肉店有份蹩脚的工作,负责给汉堡翻面。失去它没什么大不了的。失去我的爸爸妈妈更让人伤心。上一次看到他们活着的时候,我刚从学校回来,拿了包零食然后就去上班了。我想我甚至没有告诉我妈妈我爱她,而我那会还因为一些毫不重要的事情生我爸爸的气。那时候不重要,现在更不重要了。当我在工作的时候,一切都开始变得疯狂……军队进城,疏散警报响起。" #: lang/json/talk_topic_from_json.py msgid "So, did you evacuate?" @@ -133242,9 +134325,7 @@ msgid "" "but in the fighting they smashed open my cell door, and I managed to slip " "out." msgstr "" -"我当时只是呆在看守所里。他们在大灾变前晚上把我抓进去的,因为我违反了什么假释条例。一群混蛋。我被困在我的牢房里,而警察们开始大声叫喊有紧急情况,开始拿装备,把我一个人留在那里,只有一个" -" " -"机器人当警卫。我在那里呆了该死的两天,没有食物,只有一点水。然后有只巨大无比的丧尸闯进来,开始和机器人搏斗。我那会儿不知道该想些啥东西,但在战斗中,它们砸开了我的牢房门,我设法溜了出去。" +"我当时只是呆在看守所里。他们在大灾变前晚上把我抓进去的,因为我违反了什么假释条例。一群混蛋。我被困在我的牢房里,而警察们开始大声叫喊有紧急情况,开始拿装备,把我一个人留在那里,只有一个机器人当警卫。我在那里呆了该死的两天,没有食物,只有一点水。然后有只巨大无比的丧尸闯进来,开始和机器人搏斗。我那会儿不知道该想些啥东西,但在战斗中,它们砸开了我的牢房门,我设法溜了出去。" #: lang/json/talk_topic_from_json.py msgid "Lucky you. How did you get away?" @@ -133534,9 +134615,7 @@ msgid "" "a lot of movies kinda ran the show, because he seemed to really know what " "was going on. Spoiler alert: he didn't." msgstr "" -"和大多数在暴乱中没有直接被杀的人一样。我去了那些被称为\"紧急避难所\"的 " -"死亡陷阱。事实上,我和其他三人一起在那里住了一段时间。其中有个我猜看过很多电影的家伙负责掌控局面,因为他看上去似乎真的知道外面发生了什么。剧透警报:他并" -" 不知道。" +"和大多数在暴乱中没有直接被杀的人一样。我去了那些被称为\"紧急避难所\"的死亡陷阱。事实上,我和其他三人一起在那里住了一段时间。其中有个我猜看过很多电影的家伙负责掌控局面,因为他看上去似乎真的知道外面发生了什么。剧透警报:他不知道。" #: lang/json/talk_topic_from_json.py msgid "What happened to your original crew?" @@ -133557,7 +134636,7 @@ msgid "" "The bite got infected, but it was another that finally killed him." " And then I was alone." msgstr "" -"当我们无畏的领导人决定把另一名不幸被咬伤的同伴强行干掉的时候,事情就变得糟糕了。她的丈夫对此特别强烈反对,我也对他没有什么信心;在彼时彼刻,他已经犯过很多次错了。他开始自己暗中盘算并动手杀了她。然后,她的丈夫决定礼尚往来,杀死了那个白痴。然后她重新复活成丧尸,我不得不又杀了她一次,还砸碎了我们的前领袖。不幸的是在这场纷争中,她给了她丈夫狠狠咬了一口,而他甚至无法鼓起勇气还击她。我他妈的并不是怪他。我们最终一起逃出去了,但这对他来说打击太大了,他的魂显然已经不在身体里面了……他被咬的伤口感染了,但最终另一只" +"当我们无畏的领导人决定把另一名不幸被咬伤的同伴强行干掉的时候,事情就变得糟糕了。她的丈夫对此特别强烈反对,我也对他没有什么信心;在彼时彼刻,他已经犯过很多次错了。他开始自己暗中盘算并动手杀了她。然后,她的丈夫决定礼尚往来,杀死了那个白痴。然后她重新复活成丧尸,我不得不又杀了她一次,然后捣碎了我们的前领袖。不幸的是在这场纷争中,她给了她丈夫狠狠咬了一口,而他甚至无法鼓起勇气还击她。我他妈的并不是怪他。我们最终一起逃出去了,但这对他来说打击太大了,他的魂显然已经不在身体里面了……他被咬的伤口感染了,但最终另一只" " 杀了他。然后我孤身一人。" #: lang/json/talk_topic_from_json.py @@ -133669,7 +134748,7 @@ msgstr "但蜜蜂通常不是并不好斗啊……你是说黄蜂吗?" msgid "" "Well, excuse me if I didn't stop to ask what kind of killer bugs " "they were." -msgstr "好吧,请你原谅我没能停下来 问问它们是哪种杀人的虫子。" +msgstr "好吧,请你原谅我没能停下来问问它们是哪种杀人的虫子。" #: lang/json/talk_topic_from_json.py msgid "Sorry. Could you tell me more about them?" @@ -133733,9 +134812,7 @@ msgid "" "for them. A few heavily armed soldiers dragged them away, and I never saw " "them again." msgstr "" -"那家伙开始闹事。人们已经很惊慌失措了。有个带着武装的家伙负责维护车上的秩序,他看着像个警察,但实际上他只是不过是被上头塞了一把枪的 " -"孩子。他试着平息事态,我想也许确实起了一点用,但\"杀死被感染者\"的那伙人还是被 " -"吓坏了,很明显,他们准备好一旦那个手臂上受伤的老奶奶开始口吐白沫时,就会跳出来大干一场。当我们到营地的时候他们又开始闹事了。那可对他们来说不太好。几个全副武装的士兵把他们拖走了,而我再也没见过他们。" +"那家伙开始闹事。人们已经很惊慌失措了。有个带着武装的家伙负责维护车上的秩序,他看着像个警察,但实际上他只是不过是被上头塞了一把枪的孩子。他试着平息事态,我想也许确实起了一点用,但\"杀死被感染者\"的那伙人还是被吓坏了,很明显,他们准备好一旦那个手臂上受伤的老奶奶开始口吐白沫时,就会跳出来大干一场。当我们到营地的时候他们又开始闹事了。那可对他们来说不太好。几个全副武装的士兵把他们拖走了,而我再也没见过他们。" #: lang/json/talk_topic_from_json.py msgid "" @@ -134226,7 +135303,7 @@ msgid "" " there except me. Later, it was because nobody was left." msgstr "" "太平间。在丧尸末日开始的时候,太平间似乎是个愚蠢的选择,对吧?问题是,已经有很长时间没人被送进太平间了,因为尸体复活得太快,工作人员根本忙不过来。我那时正在发抖,呕吐,我能看到世界正在毁灭……我把自己缠起来,从病理学家的桌上拿了些零食,爬进太平间的一个“抽屉”里思考世界末日。当然,我事先破坏了卡扣,防止它把我锁在里面。里面" -" 安全,也安静。不仅是我所在的小抽屉,整个停尸房都是这样。一开始是因为除了我之外没有人会进来,后来,没有活着的人了。" +" 安全,也安静。不仅是我所在的小抽屉,整个停尸房都是这样。一开始是因为除了我之外没有人会到想进来,后来,是因为没有活着的人了。" #: lang/json/talk_topic_from_json.py msgid "Clearly you escaped at some point." @@ -134291,8 +135368,7 @@ msgid "" "in a time where I don't feel like I need to convince you I'm telling the " "truth." msgstr "" -"我哥哥和我出去打猎了。我们看到头顶上有许多直升机……巨大无比,军用型号,装满了疯狂的高端军事装备,就像你在电视上看到的那样。甚至还装了激光炮。它们正朝我们父母农场的方向飞走去。看到那些玩意确实震撼了我们,然后我们开始朝着回家的方向开……车刚开出了不久,我们就看到一个巨大的漂浮眼球从不知道哪个" -" 鬼地方出现了。哈。真难相信我们现在所处的时代,让我不需要多做说明就能让你相信我说的是实话。" +"我哥哥和我出去打猎了。我们看到头顶上有许多直升机……巨大无比,军用型号,装满了疯狂的高端军事装备,就像你在电视上看到的那样。甚至还装了激光炮。它们正朝我们父母农场的方向飞走去。看到那些玩意确实震撼了我们,然后我们开始朝着回家的方向开……车刚开出了不久,我们就看到一个巨大的漂浮眼球从不知道哪个鬼地方出现了。哈。真难相信我们现在所处的时代,让我不需要多做说明就能让你相信我说的是实话。" #: lang/json/talk_topic_from_json.py msgid "" @@ -134702,8 +135778,7 @@ msgid "" "there, hoping they'd come. I sent texts but got no reply. After a few " "days, well... The news got worse and worse, then it stopped completely." msgstr "" -"我可能是个大 " -"书呆子,但我不是白痴。而且我了解各种游戏题材。我们已经听说了人死而复生的故事,事实上这就是我选择玩这个游戏的原因。当警察来封锁学校时,我设法从后门溜了出去。我住在离城很远的地方,但我不可能乘公共汽车回家,所以我走路回去了。两个小时。听到很多警报,我甚至看到头顶上有喷气机飞过。当我回到家的时候已经很晚了,但我爸妈还没下班。我呆在那里希望他们能来。我发了短信,但没有人回复。几天后,嗯……消息越来越坏,然后就完全没了。" +"我可能是个大书呆子,但我不是白痴。而且我了解各种游戏题材。我们已经听说了人死而复生的故事,事实上这就是我选择玩这个游戏的原因。当警察来封锁学校时,我设法从后门溜了出去。我住在离城很远的地方,但我不可能乘公共汽车回家,所以我走路回去了。两个小时。听到很多警报,我甚至看到头顶上有喷气机飞过。当我回到家的时候已经很晚了,但我爸妈还没下班。我呆在那里希望他们能来。我发了短信,但没有人回复。几天后,嗯……消息越来越坏,然后就完全没了。" #: lang/json/talk_topic_from_json.py msgid "What about your parents?" @@ -135227,7 +136302,7 @@ msgid "" "lockers to the entry hall, used them as shields, and pushed them until we " "were close enough to take out the bots' sensors with our weapons." msgstr "" -"我们把禁闭室里的其他人都放了出来。我们被困在里面,守卫机器人已经失控了,不让任何人出去,而除了警卫外其余的人最终都变成了丧尸。我们花了几天的时间砸碎所有" +"我们把禁闭室里的其他人都放了出来。我们被困在里面,守卫机器人已经失控了,不让任何人出去,而除了警卫外其余的人最终都变成了丧尸。我们花了几天的时间捣碎所有" " " "尸体,试图找到一条安全的路绕过机器人。食物十分短缺。最后,我们选择了一个我们唯一能想到的最糟糕的计划:我们把一些储物柜拖到入口处,用它们作为盾牌,然后把它们推到离机器人足够近的地方,然后用武器干掉机器人的传感器。" @@ -135821,27 +136896,27 @@ msgstr "你刚刚还说了什么?" msgid "" "I see that badge, I think you need ot keep on walking, straight off this " "property." -msgstr "" +msgstr "我看见那个徽章了,你最好马上离开这个地方。" #: lang/json/talk_topic_from_json.py msgid "Hello Sir, what brings you here?" -msgstr "" +msgstr "你好先生,你来这有什么事吗?" #: lang/json/talk_topic_from_json.py msgid "Hello Ma'am, what brings you here?" -msgstr "" +msgstr "你好女士,你来这有什么事吗?" #: lang/json/talk_topic_from_json.py msgid "Yeah, I'm a Marshal, what are you going to do about it?" -msgstr "" +msgstr "对啊,我是一个执法官,你有什么意见?" #: lang/json/talk_topic_from_json.py msgid "Hi, looks like you are building a forage setup." -msgstr "" +msgstr "嗨,看起来你在建一个草料场。" #: lang/json/talk_topic_from_json.py msgid "Hi, Jack and Claire suggested I come talk to you about a job." -msgstr "" +msgstr "你好,杰克和克莱尔让我找你谈干活的事情。" #: lang/json/talk_topic_from_json.py msgid "I'd better get going." @@ -135851,28 +136926,28 @@ msgstr "我得走了。" msgid "" "It is coming together. I want to make our own tools, repair our items and " "even create some weapons and ammuntion reloading." -msgstr "" +msgstr "就快做好了。我的目标是能够自己制作工具、修理物品甚至制造武器和复装弹药。" #: lang/json/talk_topic_from_json.py msgid "What do you need?" -msgstr "" +msgstr "你想要什么?" #: lang/json/talk_topic_from_json.py msgid "I heard about Barry, can you tell me what killed him?" -msgstr "" +msgstr "我听说了巴里的事,你能告诉我是什么杀了他吗?" #: lang/json/talk_topic_from_json.py msgid "" "It was pink and really fast, it had lots of limbs, definitly not human. It " "easily kept up with us when we tried to escape, horrifying stuff. We burned" " the corpse to be safe." -msgstr "" +msgstr "它是粉色的,速度很快,有很多附肢,肯定不是人。我们逃跑的时候它随便就能跟上我们,太恐怖了。我们烧掉了它的尸体,以防万一。" #: lang/json/talk_topic_from_json.py msgid "" "The big item I need is an anvil, once I have that I can get a lot of repairs" " done." -msgstr "" +msgstr "我主要需要一个铁砧,只要有这个我就可以修一大堆东西了。" #: lang/json/talk_topic_from_json.py msgid "" @@ -135881,7 +136956,7 @@ msgstr "克里斯正在我们地盘的边界巡逻,计划防御方案。" #: lang/json/talk_topic_from_json.py msgid "You should get off my farm, I won't deal with a a government stooge." -msgstr "" +msgstr "马上滚出我的农场,我不跟政府的走狗说话。" #: lang/json/talk_topic_from_json.py msgid "Go on..." @@ -135889,7 +136964,7 @@ msgstr "继续……" #: lang/json/talk_topic_from_json.py msgid "Is your forge operational?" -msgstr "" +msgstr "你的熔炉能用了吗?" #: lang/json/talk_topic_from_json.py msgid "Where can I find Chris?" @@ -135899,36 +136974,36 @@ msgstr "在哪儿能找到克里斯?" msgid "" "I see that badge, You need to leave our land, my relatives have no fondess " "for Marshals." -msgstr "" +msgstr "我看到那个徽章了,你最好马上离开我们的地盘,我家里对执法官没什么好感。" #: lang/json/talk_topic_from_json.py msgid "Hi, what's up?" -msgstr "" +msgstr "你好?" #: lang/json/talk_topic_from_json.py msgid "Hi, Your dad asked me to come find you." -msgstr "" +msgstr "你好,你爸让我来找你。" #: lang/json/talk_topic_from_json.py msgid "" "I was talking to Luke earlier, said you had some interesting ideas about the" " world ending." -msgstr "" +msgstr "我之前和卢克说过话,他说你对世界末日有些有趣的见解。" #: lang/json/talk_topic_from_json.py msgid "" "Yeah, they are always worried about us, I prefer to survey the land and try " "to track the changes. I'm thinking about fixing up this cabin for some " "peace and quiet..." -msgstr "" +msgstr "对啊,他们总是担心我们。我更喜欢侦察地形并记录变化。我正准备修好这个小屋,这样我可以静静……" #: lang/json/talk_topic_from_json.py msgid "Sounds like you are restless, why not leave?" -msgstr "" +msgstr "你听起来不是很想待在这,为什么不离开呢?" #: lang/json/talk_topic_from_json.py msgid "What sort of changes have you seen?" -msgstr "" +msgstr "那你看到了什么变化?" #: lang/json/talk_topic_from_json.py msgid "" @@ -135936,7 +137011,7 @@ msgid "" "catastrophe. Since technology has failed, they've doubled down on older " "traditions. I think we need to get out there and find some answers before " "settling on a path." -msgstr "" +msgstr "我家里人觉得只要我们留在这,我们就能度过这场灾难。自从科技失去作用后,他们开始加倍回归传统。但我觉得我们应该离开,找到答案后再定居。" #: lang/json/talk_topic_from_json.py msgid "" @@ -135945,30 +137020,31 @@ msgid "" "shimmered, almost like it wasn't quite there. I followed the monsters for a" " while..." msgstr "" +"在一次远途侦察时,我在野外看见了某种东西。我没有靠近,但是我发誓我看到了不可思议的怪物从里面出现。那个东西隐约在闪光,就像它没有完全在那一样。我跟踪了那些怪物一会……" #: lang/json/talk_topic_from_json.py msgid "What did you find?" -msgstr "" +msgstr "然后怎么样了?" #: lang/json/talk_topic_from_json.py msgid "" "They made their way to this weird structure, I've never seen anything like " "it, it glistened in the sun like something organic..." -msgstr "" +msgstr "它们进入了一个古怪的建筑,我从来没见过这样的东西,就像是有机物一样在阳光下闪烁……" #: lang/json/talk_topic_from_json.py msgid "If you join up with me, we can go check it out." -msgstr "" +msgstr "如果你跟我走的话,我们可以再去看看。" #: lang/json/talk_topic_from_json.py msgid "" "Yeah, I'll join with you, I hope we can come back and check on my family " "some occasionally. Getting some information is more important now though." -msgstr "" +msgstr "行,我跟你走。我希望我们可以偶尔回来见见我的家人。现在的话最重要的还是去获取一些信息。" #: lang/json/talk_topic_from_json.py msgid "What is this place we are going to?" -msgstr "" +msgstr "我们要去哪里?" #: lang/json/talk_topic_from_json.py msgid "" @@ -135977,44 +137053,45 @@ msgid "" "vegetation. I don't think staying on a farm is sustainable forever, there " "are big planet wide changes occurring." msgstr "" +"嗯,野生动物攻击性变强了,附近出现了巨型昆虫,更别说那些怪物了。我还发现了一些神秘的死亡区域和变异植物。我不觉得我们能永远住在农场里面,全球明显正在发生剧烈变化。" #: lang/json/talk_topic_from_json.py msgid "You should leave before my family sees you." -msgstr "" +msgstr "你最好在我家里人看见之前离开。" #: lang/json/talk_topic_from_json.py msgid "Your dad asked me to come find you." -msgstr "" +msgstr "你爸让我来找你。" #: lang/json/talk_topic_from_json.py msgid "" "I was talking to Luke earlier, he said you had some interesting ideas about " "the world ending." -msgstr "" +msgstr "我之前和卢克说过话,他说你对世界末日有些有趣的见解。" #: lang/json/talk_topic_from_json.py msgid "Is that a U.S. Marshal's badge you're wearing?" -msgstr "" +msgstr "你身上那个是联邦执法官徽章吗?" #: lang/json/talk_topic_from_json.py msgid "Hello, what brings you here?" -msgstr "" +msgstr "你好,你有什么事吗?" #: lang/json/talk_topic_from_json.py msgid "Hi, what brings you here?" -msgstr "" +msgstr "嗨,你有什么事吗?" #: lang/json/talk_topic_from_json.py msgid "Yes, I'm a marshal." -msgstr "" +msgstr "没错,我是个执法官。" #: lang/json/talk_topic_from_json.py msgid "Hi, nice farm you have here." -msgstr "" +msgstr "嗨,你这农场不错啊。" #: lang/json/talk_topic_from_json.py msgid "Hi, Jack suggested I stop by and say hello." -msgstr "" +msgstr "嗨,杰克说让我找你问好。" #: lang/json/talk_topic_from_json.py msgid "Let's trade." @@ -136022,44 +137099,44 @@ msgstr "让我们交易吧。" #: lang/json/talk_topic_from_json.py msgid "I live here with my husband, Jack. He is working out in his shop." -msgstr "" +msgstr "我和我老公杰克住在这里。他正在工作间干活。" #: lang/json/talk_topic_from_json.py msgid "You are lucky to have your family still together." -msgstr "" +msgstr "你们一家人还在一起可真是幸运。" #: lang/json/talk_topic_from_json.py msgid "Must be nice, to have the quiet place amid so much madness." -msgstr "" +msgstr "能够在这片疯狂的灾难中有这样一片宁静之地一定很舒服。" #: lang/json/talk_topic_from_json.py msgid "" "You don't need as much luck if you are prepared and work together. We've " "had our losses, my brother in law, Barry, was our best hunter but things are" " so different now..." -msgstr "" +msgstr "如果你准备充分并同心协力,也不需要太多的运气。我们也遭到过损失,我老公的兄弟巴里,本来是我们最优秀的猎手。但是现在不一样了……" #: lang/json/talk_topic_from_json.py msgid "What happened to Barry?" -msgstr "" +msgstr "巴里怎么了?" #: lang/json/talk_topic_from_json.py msgid "A farm must be a pretty safe place these days." -msgstr "" +msgstr "如今的农场应该会是个非常安全的地方。" #: lang/json/talk_topic_from_json.py msgid "" "Well, nice to meet you. I imagine Jack was boasting about my herbal " "remedies, he's proud of what we've put together here." -msgstr "" +msgstr "啊,你好。杰克是不是和你吹擂我的草药配方了?他对我们在这里的成果挺自豪的。" #: lang/json/talk_topic_from_json.py msgid "He did mention you make remedies, are they effective?" -msgstr "" +msgstr "他的确说过你会做草药,它们有效吗?" #: lang/json/talk_topic_from_json.py msgid "I'd like to ask you something else..." -msgstr "" +msgstr "我想问你点别的事……" #: lang/json/talk_topic_from_json.py msgid "" @@ -136068,6 +137145,7 @@ msgid "" "These remedies aren't always as effective, but they can do the job in a " "pinch." msgstr "" +"我以前研究过天然药物的制作,但是这种情况下它们比以往都更加重要了。天知道下次我们见到一个正牌医生是什么时候。这些草药不是每次都完全起作用,但紧要关头下还是有用的。" #: lang/json/talk_topic_from_json.py msgid "" @@ -136075,142 +137153,143 @@ msgid "" "and Carlos went into the forest to find the predator but it was like nothing" " they'd ever seen. Carlos may be willing to tell you more." msgstr "" +"之前他们的几头牛死掉了,我们甚至都不知道发生了什么。巴里和卡洛斯到林子里面去找那个捕食者,但是他们从来没见过那种东西。卡洛斯也许能告诉你更多。" #: lang/json/talk_topic_from_json.py msgid "" "We've always tried to live a quiet life out here, I suppose we are doing " "better than most." -msgstr "" +msgstr "我们一直尝试在这里过平静的生活,我猜我们比大多数人都过得要好。" #: lang/json/talk_topic_from_json.py msgid "" "Jack and I have been together for 40 years. He's been my anchor through all" " of this chaos." -msgstr "" +msgstr "我和杰克在一起40年了。他在这场混乱中一直是我的依靠。" #: lang/json/talk_topic_from_json.py msgid "" "Jesse and her family live up at the horse farm. They may have some jobs for " "you." -msgstr "" +msgstr "杰西他们家住在那边的马场,他们可能有活想让你干。" #: lang/json/talk_topic_from_json.py msgid "" "Eddie's dairy is at the end of the road. He's may have some jobs for you if" " you are interested." -msgstr "" +msgstr "艾迪的奶场在路的最里面。他可能有活想让你干,如果你有兴趣的话。" #: lang/json/talk_topic_from_json.py msgid "You should get off our land, you have no business here." -msgstr "" +msgstr "你最好离开我们的地盘,这里没你的事情。" #: lang/json/talk_topic_from_json.py msgid "Ask away." -msgstr "" +msgstr "问吧。" #: lang/json/talk_topic_from_json.py msgid "Tell me about your husband, is he around?" -msgstr "" +msgstr "你老公呢,他在这吗?" #: lang/json/talk_topic_from_json.py msgid "Your daughter lives down the road?" -msgstr "" +msgstr "你女儿住在路那边吗?" #: lang/json/talk_topic_from_json.py msgid "Where is your brother's place?" -msgstr "" +msgstr "你的兄弟住在哪?" #: lang/json/talk_topic_from_json.py msgid "Nice dairy, must be tough keeping it running." -msgstr "" +msgstr "这奶场不错,开它一定很费功夫吧?" #: lang/json/talk_topic_from_json.py msgid "Hi, Jack and Claire suggested I come down here and meet you." -msgstr "" +msgstr "嗨,杰克和克莱尔说让我来这里见你。" #: lang/json/talk_topic_from_json.py msgid "Have anything to trade?" -msgstr "" +msgstr "你有什么能卖的东西吗?" #: lang/json/talk_topic_from_json.py msgid "" "I run this dairy with my son, Luke. It's been a tough job keeping the herd " "together, hasn't left a lot of time for other projects." -msgstr "" +msgstr "我和我儿子卢克一起开这个奶场。管好牛群不是一件易事,所以我们没有什么时间做其它的事情。" #: lang/json/talk_topic_from_json.py msgid "" "I heard about Barry, such a tragedy. Can you tell me more about what " "happened?" -msgstr "" +msgstr "我听说了巴里的事情,真是一场悲剧。你能告诉我具体发生了什么吗?" #: lang/json/talk_topic_from_json.py msgid "" "Barry and Carlos went to hunt down something that killed our livestock, they" " tracked it into the forest. It tore Barry apart, Carlos might be willing " "to tell you the story, he survived it." -msgstr "" +msgstr "巴里和卡洛斯之前出去捕杀某种杀死我们牲畜的东西,他们跟到了森林里面。那东西把巴里撕碎了。卡洛斯活下来了,他也许愿意告诉你具体的情况。" #: lang/json/talk_topic_from_json.py msgid "" "Yeah, I could use some help getting materials. I want to outfit that old " "building across the road with some kilns. We want to make our own jars and " "pottery so we aren't dependent on scavenging." -msgstr "" +msgstr "对,我需要有人帮我搜集材料。我想在路对面的老屋子里面装一个砖窑。这样我们就可以自己做罐子和陶器,不用出去搜寻了。" #: lang/json/talk_topic_from_json.py msgid "That is a good idea, what do you need?" -msgstr "" +msgstr "主意不错,你需要什么?" #: lang/json/talk_topic_from_json.py msgid "I'm not interested right now, I'd better get going." -msgstr "" +msgstr "我现在没有兴趣,我得走了。" #: lang/json/talk_topic_from_json.py msgid "" "Luke was going to start college this year, now everything is upside down. " "He is adaptable though, had an idea to begin manufacturing our own jars and " "pottery. He's out in the old outbuilding right now, cleaning up the place." -msgstr "" +msgstr "卢克本来今年要上大学的,现在一切都变了。他倒是很快就适应了,还想出了自己做罐子和陶器的主意。他现在正在那个旧屋子里面做清理。" #: lang/json/talk_topic_from_json.py msgid "" "Jesse manages the horses and other livestock, she is amazing with animals." -msgstr "" +msgstr "杰西负责看管马和其它牲畜,她挺会照顾动物的。" #: lang/json/talk_topic_from_json.py msgid "" "Carlos will be in his workshop if he isn't out hunting. He is trying to get" " a forage set up." -msgstr "" +msgstr "卡洛斯没有打猎的时候都在他的工作间里面。他正在搞一个草料场。" #: lang/json/talk_topic_from_json.py msgid "Your son helps with the dairy?" -msgstr "" +msgstr "你的儿子在帮你干奶场的活吗?" #: lang/json/talk_topic_from_json.py msgid "So, Jesse runs the horse farm?" -msgstr "" +msgstr "所以说杰西在开马场?" #: lang/json/talk_topic_from_json.py msgid "Where can I find Carlos?" -msgstr "" +msgstr "卡洛斯在哪?" #: lang/json/talk_topic_from_json.py msgid "Hello travler, what brings you here?" -msgstr "" +msgstr "你好,旅行者,你来这有什么事吗?" #: lang/json/talk_topic_from_json.py msgid "Hello traveler, what brings you here?" -msgstr "" +msgstr "你好,旅行者,你来这有什么事吗?" #: lang/json/talk_topic_from_json.py msgid "I'm here to deliver some resources." -msgstr "" +msgstr "我来给你一些物资。" #: lang/json/talk_topic_from_json.py msgid "This is a lot of land, you been here since the collapse?" -msgstr "" +msgstr "这可是一大块地。你从灾难过后就在这儿吗?" #: lang/json/talk_topic_from_json.py msgid "Hey, good to see you again." @@ -136220,18 +137299,18 @@ msgstr "嘿,很高兴又见到你了。" msgid "" "I live here with my wife, this is our family's land. My daughter's family " "and son live down the road." -msgstr "" +msgstr "我和我的老婆住在这,这是我们家族的地盘。我女儿一家和我的儿子住在路的那边。" #: lang/json/talk_topic_from_json.py msgid "Your whole family survived?" -msgstr "" +msgstr "你全家都活下来了?" #: lang/json/talk_topic_from_json.py msgid "" "We've had our losses... now we stay close to home, preparing for trouble. " "We've always taken disaster prepardness seriously, but we didn't expect " "anything like this though." -msgstr "" +msgstr "我们也有失去的人……现在我们待在家附近,随时准备应对麻烦。我们以前就对应对灾难的准备非常重视,但是我们没想到会有这种级别的灾难。" #: lang/json/talk_topic_from_json.py msgid "" @@ -136240,10 +137319,11 @@ msgid "" " with the crops and animals though so we won't have to risk our necks for " "supplies." msgstr "" +"就算是在这里,我们也被袭击过几次,还看到过其它……东西。我们已经在建立防御了,但是这需要时间。但是我们已经能够自己种植作物和饲养动物了,这样我们就不需要冒险去找食物。" #: lang/json/talk_topic_from_json.py msgid "What sort of defenses do you want?" -msgstr "" +msgstr "你们准备建什么样的防御?" #: lang/json/talk_topic_from_json.py msgid "" @@ -136252,10 +137332,11 @@ msgid "" " bring me logs, sand, clay, wire, nails, wood planks, and metal chunks, I'll" " give you signed chits you can use to buy goods from any of the family." msgstr "" +"我们想立更多的围栏,再修一些瞭望点,也许再建一些陷阱来解决怪物。但我们需要更多的物资。如果你能给我带一些圆木、沙子、粘土、钉子、木板和金属块的话,我可以给你签欠条,这样你就可以从我们这里任何一家买东西。" #: lang/json/talk_topic_from_json.py msgid "Sounds reasonable, I'll see what I can do." -msgstr "" +msgstr "听起来不错,我会尽量帮你的。" #: lang/json/talk_topic_from_json.py msgid "" @@ -136263,33 +137344,34 @@ msgid "" "without her. She's quite the herbalist too, been real useful lately. She " "is probably in the house, you should stop in." msgstr "" +"克莱尔和我已经在一起40年了,没有她我就没法把这个地方开下去。她在草药方面也很有研究,在这种情况下非常有用。她应该在房间里面,你可以去看看她。" #: lang/json/talk_topic_from_json.py msgid "" "Jesse and her family live up at the horse farm. Her husband, Carlos, may " "have some jobs for you." -msgstr "" +msgstr "杰西他们家住在那边的马场。她老公卡洛斯可能有活想让你干。" #: lang/json/talk_topic_from_json.py msgid "" "Eddie's dairy is at the end of the road. It's just him and his son since " "Barry died to that thing in the woods, we tracked it down and burned the " "corpse." -msgstr "" +msgstr "艾迪的奶场在路那边。巴里被那东西杀掉之后,那边只有他和他的儿子了。我们找到了那东西的尸体并烧掉了它。" #: lang/json/talk_topic_from_json.py msgid "" "You should get off my land, the governemnt proved its incompetence with this" " catastrophe." -msgstr "" +msgstr "你最好马上离开,这次灾难早就显示了政府的无能。" #: lang/json/talk_topic_from_json.py msgid "Go on ..." -msgstr "" +msgstr "说吧……" #: lang/json/talk_topic_from_json.py msgid "Tell me about your wife, is she around?" -msgstr "" +msgstr "你老婆呢,她在这吗?" #: lang/json/talk_topic_from_json.py msgid "Excellent. What've you brought us?" @@ -136305,35 +137387,35 @@ msgstr "现在就这些。我最好还是走吧。" #: lang/json/talk_topic_from_json.py msgid "Leave our property, Marshal." -msgstr "" +msgstr "离开我们的地盘,执法官。" #: lang/json/talk_topic_from_json.py msgid "Hello, We don't see many people these days." -msgstr "" +msgstr "你好,如今我们能碰见的人可是越来越少了。" #: lang/json/talk_topic_from_json.py msgid "Hi, it looks like you are doing well here." -msgstr "" +msgstr "嗨,看起来你们在这过得不错。" #: lang/json/talk_topic_from_json.py msgid "" "It would be a lot harder without family. Keeping the animals safe is " "essential to our future." -msgstr "" +msgstr "没有家人的话会过得更加艰难。保护好我们的牲畜对我们的生存至关重要。" #: lang/json/talk_topic_from_json.py msgid "Sounds like you are betting on civilization not coming back." -msgstr "" +msgstr "听起来你们已经对重建人类文明不抱希望了。" #: lang/json/talk_topic_from_json.py msgid "Do you have any animal care tips?" -msgstr "" +msgstr "你能告诉我些饲养牲畜的窍门吗?" #: lang/json/talk_topic_from_json.py msgid "" "We can't wait for someone else to fix things, we need to take care of " "ourselves." -msgstr "" +msgstr "我们没法等别人来帮我们解决问题。我们必须自力更生。" #: lang/json/talk_topic_from_json.py msgid "" @@ -136342,6 +137424,7 @@ msgid "" "that cars can't and also help when all the engines fail. They become very " "trusting if you feed them some nice fodder." msgstr "" +"我们没法等别人来帮我们解决问题。我们必须自力更生。马在许多地方都很有用。他们能去到车子去不了的地方,当引擎坏掉的时候也能拉车。只要你喂它们一些好草料,它们就会非常信任你。" #: lang/json/talk_topic_from_json.py msgid "" @@ -136352,7 +137435,7 @@ msgstr "太好了,我相信杰克想要让你帮忙。如果你感兴趣,我 #: lang/json/talk_topic_from_json.py msgid "I'd like to speak with Carlos too about some work." -msgstr "" +msgstr "我还想和卡洛斯谈谈干活的事情。" #: lang/json/talk_topic_from_json.py msgid "Is Chris around? I'd like to know what he's run into out in the woods." @@ -136360,25 +137443,25 @@ msgstr "克里斯在吗?我想知道他在树林里遇到了什么。" #: lang/json/talk_topic_from_json.py msgid "What needs killing?" -msgstr "" +msgstr "你想要杀什么?" #: lang/json/talk_topic_from_json.py msgid "He's out back in the workshop." -msgstr "" +msgstr "他在工作间里面。" #: lang/json/talk_topic_from_json.py msgid "" "He's out doing some surveying, we are planning on adding a fence line and " "some defenses." -msgstr "" +msgstr "他在外面侦察,我们准备立一些围栏和防御措施。" #: lang/json/talk_topic_from_json.py msgid "Looks like you are doing well here." -msgstr "" +msgstr "看起来你们过得挺滋润的。" #: lang/json/talk_topic_from_json.py msgid "Jack and Claire suggested I come talk to you." -msgstr "" +msgstr "杰克和克莱尔让我来找你们谈谈。" #: lang/json/talk_topic_from_json.py msgid "Is Chris around?" @@ -136386,11 +137469,11 @@ msgstr "克里斯在附近吗?" #: lang/json/talk_topic_from_json.py msgid "Hi, this is a nice farm, your family live here?" -msgstr "" +msgstr "嗨,不错的农场,你家住在这吗?" #: lang/json/talk_topic_from_json.py msgid "Hi, I'm looking for Jesse." -msgstr "" +msgstr "嗨,我找杰西。" #: lang/json/talk_topic_from_json.py msgid "Hi, I'm looking for Chris." @@ -136400,33 +137483,33 @@ msgstr "嗨,我在寻找克里斯。" msgid "" "My family owns all the land around here, my parents are out in the barn and " "my other family is down he road." -msgstr "" +msgstr "我们一大家拥有这附近所有地产,我父母在马厩里面,其他人还在路的那边。" #: lang/json/talk_topic_from_json.py msgid "Ok, I'll go find them." -msgstr "" +msgstr "行,我去找他们。" #: lang/json/talk_topic_from_json.py msgid "" "Mom is in her office, in the barn. Be careful that you don't let our horses" " out." -msgstr "" +msgstr "我妈在她马厩的办公室里面。进去的时候小心别把马放出来了。" #: lang/json/talk_topic_from_json.py msgid "Chris is out hunting or something right now." -msgstr "克里斯正在外面狩猎。" +msgstr "克里斯正在外面打猎还是干啥。" #: lang/json/talk_topic_from_json.py msgid "Oh, ok." -msgstr "" +msgstr "哦,好吧。" #: lang/json/talk_topic_from_json.py msgid "Or something?" -msgstr "" +msgstr "还是干啥?" #: lang/json/talk_topic_from_json.py msgid "Nice talking to you, bye." -msgstr "" +msgstr "和你聊天很愉快,再见。" #: lang/json/talk_topic_from_json.py msgid "" @@ -136435,10 +137518,11 @@ msgid "" "Sometimes he'll take off for a few days and I end up patching him up so my " "parents don't know he left the property." msgstr "" +"哦,他本来说是要去打猎,但是你也和卢克说过话了,他应该提过克里斯想要进一步了解世界末日。有时候他一次要出去几天,只有让我帮他擦屁股免得我爸妈知道他出去过。" #: lang/json/talk_topic_from_json.py msgid "I see that badge, you should leave before my father sees you." -msgstr "" +msgstr "我看到那个徽章了,你最好在我爸看到前离开。" #: lang/json/talk_topic_from_json.py msgid "Hello." @@ -136446,37 +137530,37 @@ msgstr "你好。" #: lang/json/talk_topic_from_json.py msgid "Your dad said you were out here fixing up this place." -msgstr "" +msgstr "你爸说你在修理这个地方。" #: lang/json/talk_topic_from_json.py msgid "Hey, What are you doing out here?" -msgstr "" +msgstr "嘿,你在这干啥?" #: lang/json/talk_topic_from_json.py msgid "" "Yeah, I work on it when I have the time. I can't leave the farm too long, " "so I can't find some things I need." -msgstr "" +msgstr "对啊,我有时间的时候就弄一下。我没法长时间离开农场,所以没法找到一些我要的东西。" #: lang/json/talk_topic_from_json.py msgid "" "Must be tough having the world fall apart when you had you future to look " "forward to." -msgstr "" +msgstr "自己前途光明的时候世界突然毁灭一定很难受吧。" #: lang/json/talk_topic_from_json.py msgid "" "I've been cleaning up this old building to make it into a workshop. I want " "to put up a pottery kiln and forge. My dad doesn't want me leaving the farm " "to find some things, says it is too dangerous." -msgstr "" +msgstr "我正在清理这个旧房子好把它改成一个工坊。我想装一个砖窑和熔炉。我爸不想让我离开农场去找材料,说这样太危险了。" #: lang/json/talk_topic_from_json.py msgid "" "I know all the grown ups worry about us, but I think we can adapt better " "than them in the long run. Chris has some interesting thoughts on the " "matter." -msgstr "" +msgstr "我知道大人们都担心我们,但是我觉得我们比他们长期适应力强。克里斯对此有些有意思的想法。" #: lang/json/talk_topic_from_json.py msgid "What sort of ideas does Chris have?" @@ -136486,13 +137570,13 @@ msgstr "克里斯怎么看?" msgid "" "Things have been tough for my dad since the hunting incident. He works till" " he falls asleep most nights.." -msgstr "" +msgstr "自从那次打猎事故后我爸就一直很难过。他几乎每天晚上都干活干到睡着为止。" #: lang/json/talk_topic_from_json.py msgid "" "Chris is a little older than me, he's up at the horse farm with his parents " "and sister, Lisa." -msgstr "" +msgstr "克里斯比我大一点,他在马场和他爸妈和姐妹丽莎一起住。" #: lang/json/talk_topic_from_json.py msgid "" @@ -136500,15 +137584,15 @@ msgid "" "things will only get worse. It's tough to get the adults to listen though, " "much less agree with his solution. You can go talk to him more about it if " "you want." -msgstr "" +msgstr "哦,他不认为我们能够持续在这生活下去。他认为情况还会变坏。不过大人们都不听他说,也不同意他的方案。你要是有兴趣的话可以找他说说。" #: lang/json/talk_topic_from_json.py msgid "You won't find any help here." -msgstr "" +msgstr "这儿没人会帮你。" #: lang/json/talk_topic_from_json.py msgid "Tell me about your dad." -msgstr "" +msgstr "和我说说你爸吧。" #: lang/json/talk_topic_from_json.py msgid "Marshal, I hope you're here to assist us." @@ -136686,51 +137770,51 @@ msgstr "忙你的吧……" msgid "" "My god, you've got to get me out of here. The things... the things they've " "done... please help." -msgstr "" +msgstr "天啊,你一定要帮我从这里出去,它们……它们干的那些事情……帮帮我。" #: lang/json/talk_topic_from_json.py msgid "Aren't you a little short to be a stormtrooper?" -msgstr "" +msgstr "你这个救援兵是不是有点矮了?" #: lang/json/talk_topic_from_json.py msgid "Please, help me." -msgstr "" +msgstr "求你了,帮帮我。" #: lang/json/talk_topic_from_json.py msgid "Can you get me out of this hell hole?" -msgstr "" +msgstr "你能救我离开这个垃圾地方吗?" #: lang/json/talk_topic_from_json.py msgid "Who are you? Are you real?" -msgstr "" +msgstr "你是谁?你是真的吗?" #: lang/json/talk_topic_from_json.py msgid "Can you please save me? I have to get out of here." -msgstr "" +msgstr "我能求你救救我吗?我想出去。" #: lang/json/talk_topic_from_json.py msgid "Hallelujah, rescue!" -msgstr "" +msgstr "感谢上帝,有人来救我了!" #: lang/json/talk_topic_from_json.py msgid "I can't believe my eyes. Thank you, thank you!" -msgstr "" +msgstr "我没看错吧。谢谢,谢谢你!" #: lang/json/talk_topic_from_json.py msgid "You're... you're actually real!" -msgstr "" +msgstr "你……你真的是真的!" #: lang/json/talk_topic_from_json.py msgid "How are you here? Are you one of them, somehow? What's going on?" -msgstr "" +msgstr "你是怎么进来的?你也是它们中的一个,怎么会?发生什么了?" #: lang/json/talk_topic_from_json.py msgid "Come with me, if you want to live." -msgstr "" +msgstr "想活命的话就跟我走。" #: lang/json/talk_topic_from_json.py msgid "I've no use for weaklings. Run. Now." -msgstr "" +msgstr "我对弱者没兴趣。滚吧,立刻。" #: lang/json/talk_topic_from_json.py msgid "" @@ -136934,8 +138018,8 @@ msgid "All right! Let's get going." msgstr "好的!那我们走吧。" #: lang/json/talk_topic_from_json.py -msgid "We've done it! We've solved the list!" -msgstr "我们做到了!我们已经解决了这个问题!" +msgid "Have I told you about cardboard, friend? Do you have any?" +msgstr "我跟你说过硬纸板的事吗,朋友?你有吗?" #: lang/json/talk_topic_from_json.py msgid "" @@ -136943,8 +138027,8 @@ msgid "" msgstr "近况如何?我的纸板收集越来越多了!" #: lang/json/talk_topic_from_json.py -msgid "Have I told you about cardboard, friend? Do you have any?" -msgstr "我跟你说过硬纸板的事吗,朋友?你有吗?" +msgid "We've done it! We've solved the list!" +msgstr "我们做到了!我们已经解决了这个问题!" #: lang/json/talk_topic_from_json.py msgid "About that shopping list of yours..." @@ -137235,7 +138319,7 @@ msgid "" "to that guy. So, of course, he's a zombie now. Fuck, thanks for reminding " "me of all that sunny fun." msgstr "" -"哦,是的,那真是一场灾难。我们在那里等了好几个小时的“处理”,病人和伤员都在那里。一个人死了,我们都以为他在睡觉,直到他醒过来。这引起了恐慌,在一个封闭的区域内有枪声,诸如此类。几分钟后,更多的人死了。然后这些混蛋称之为“暴发”并试图阻止我们进入…我们花了很长时间才说服惊慌的卫兵,我们还活着,需要出去。杰森:当他发现活人和僵尸被关在一起的时候,他自己进来了,因为一些刚死去的人开始重新站起来,他挡住他们让我们逃跑。那…这可能是我在世界末日之前看到的唯一真正的好事:他承认自己的错误,并用伤害自己的方式来弥补。对那个家伙非常尊重。所以,当然,他现在成为了丧尸。妈的,谢谢你提醒我阳光下是多么快乐。" +"哦,是的,那真是一场灾难。我们在那里等了好几个小时的“处理”,病人和伤员都在那里。一个人死了,我们都以为他在睡觉,直到他醒过来。这引起了恐慌,在一个封闭的区域内有枪声,诸如此类。几分钟后,更多的人死了。然后这些混蛋称之为“暴发”并试图阻止我们进入…我们花了很长时间才说服惊慌的卫兵,我们还活着,需要出去。杰森:当他发现活人和丧尸被关在一起的时候,他自己进来了,因为一些刚死去的人开始重新站起来,他挡住他们让我们逃跑。那…这可能是我在世界末日之前看到的唯一真正的好事:他承认自己的错误,并用伤害自己的方式来弥补。对那个家伙非常尊重。所以,当然,他现在成为了丧尸。妈的,谢谢你让我想起来那些大好事。" #: lang/json/talk_topic_from_json.py msgid "Sorry for bringing it up. What were you saying?" @@ -137415,7 +138499,7 @@ msgstr "不,不,我不知道,我很感激你不让我继续坚持下去。 msgid "" "Encroaching alien mushrooms, fungal towers, tough mycelium invading ground " "and trees, zombies taken over by aggressive mold... Yeah. It's ugly stuff." -msgstr "入侵的外来蘑菇,真菌塔,坚硬的菌丝入侵地面和树木,僵尸被侵略性的霉菌接管…是的。这是丑陋的东西。" +msgstr "入侵的外来蘑菇,真菌塔,坚硬的菌丝入侵地面和树木,丧尸被侵略性的霉菌接管…是的。这是丑陋的东西。" #: lang/json/talk_topic_from_json.py msgid "" @@ -137427,7 +138511,7 @@ msgstr "好吧,你引起了我的注意。听着,你能给我带些样品吗 msgid "" "It'd be dangerous. What kind of benefit is there from taking a risk like " "that?" -msgstr "" +msgstr "这会非常危险,我冒这个险有什么好处?" #: lang/json/talk_topic_from_json.py msgid "" @@ -137735,7 +138819,7 @@ msgid "" "been able to bring back enough to keep these folk in better shape. I " "suspect they'll find an excuse to kick me out eventually." msgstr "" -"这比我自己建房子安全多了。当我需要的时候,我会出去觅食。只要我们保持干净,当僵尸来的时候尽我们的职责,他们让我们蹲在这里进行额外的防御。我认为他们正试图慢慢地把我们饿死,即使我不能让每个人的肚子都吃饱,我也能带回来足够多的东西来保持这些人的健康。我怀疑他们最终会找个借口把我赶出去。" +"这比我自己建房子安全多了。当我需要的时候,我会出去觅食。只要我们保持干净,当丧尸来的时候尽我们的职责,他们让我们蹲在这里进行额外的防御。我认为他们正试图慢慢地把我们饿死,即使我不能让每个人的肚子都吃饱,我也能带回来足够多的东西来保持这些人的健康。我怀疑他们最终会找个借口把我赶出去。" #: lang/json/talk_topic_from_json.py msgid "" @@ -137792,7 +138876,7 @@ msgid "" "there, I don't know what I'd find, and I think maybe that scares me the " "most." msgstr "" -"和我被困在这里的原因一样…首先,这太危险了。将近一百英里,穿过僵尸出没的地域,步行到达海岸线。谢谢。然后,我怎么从海岸到布洛克岛?我的家人在爸爸退休后搬到了那里,我的印象是渡轮可能已经不开了。即使我到了那里,我也不知道会发现什么,我想这可能是我最害怕的。" +"和我被困在这里的原因一样…首先,这太危险了。将近一百英里,穿过丧尸出没的地域,步行到达海岸线。谢谢。然后,我怎么从海岸到布洛克岛?我的家人在爸爸退休后搬到了那里,我的印象是渡轮可能已经不开了。即使我到了那里,我也不知道会发现什么,我想这可能是我最害怕的。" #: lang/json/talk_topic_from_json.py msgid "" @@ -137926,7 +139010,7 @@ msgid "" "in the world died and came back as zombies. What do you think my story is?" " My entire family died, came back as zombies, and I somehow wound up here." msgstr "" -"你不能现在就去问别人这样的问题。一个十几岁的女孩独自在一个疏散中心,之后几乎世界上所有的人都死了,回来的时候变成了僵尸。你觉得我的故事是什么?我全家都死了,像僵尸一样回来了,而我却莫名其妙地来到了这里。" +"这些年你不能随便问别人这样的问题。一个十几岁的女孩独自在一个疏散中心,之后几乎世界上所有的人都死了,回来的时候变成了丧尸。你觉得我的故事是什么?我全家都死了,变成丧尸回来了,而我却莫名其妙地来到了这里。" #: lang/json/talk_topic_from_json.py msgid "Who takes care of you here?" @@ -138183,7 +139267,7 @@ msgid "" "just a drop in the bucket. What is killing me is being forced to sit with " "nothing but my thoughts of what I've lost." msgstr "" -"大家都觉得这样不好。睡在贴着地板的小床上面,周围挤满了陌生人,夜晚还会被僵尸的吵醒。但对于我来说,这些都不算什么,让我痛苦的是,我只能坐在那里,想着我失去了一切。" +"大家都觉得这样不好。睡在贴着地板的小床上面,周围挤满了陌生人,夜晚还会被丧尸吵醒。但对于我来说,这些都不算什么,让我痛苦的是,我只能坐在那里,想着我失去了一切。" #: lang/json/talk_topic_from_json.py msgid "" @@ -138351,7 +139435,7 @@ msgid "" "alive... anyway, it's gonna take a few more feeds before I can get him ready" " for prime time, check back in a couple days." msgstr "" -"对不起,还没有。面团很粗糙。这不是你的错,把它放在潮湿的冰箱里那么久是没有用的。我想我的学徒面包师可能在灾难发生前并没有处理好它。我希望我的学徒他现在最好已经变成了僵尸,因为如果我看到他活着……无论如何,现在我们还得耐心等待一段时间,过会再来吧。" +"对不起,还没有。面团很粗糙。这不是你的错,它毕竟在潮湿的冰箱里放了那么久。我想我的学徒面包师可能在灾难发生前并没有处理好它。他现在最好已经变成了丧尸,因为如果我看到他活着……无论如何,现在我们还得耐心等待一段时间,过几天再来吧。" #: lang/json/talk_topic_from_json.py msgid "" @@ -139759,7 +140843,7 @@ msgid "" "tough stuff. Maybe not zombies eating your child level tough, but " "surprisingly not far off. My people have gone through some real messy crap." msgstr "" -"我其实确实是一个心理辅导员,以前在吉特克桑乐队中工作。我曾经对付过心理健康问题和毒品上瘾,还辅导过有惨痛经历的一些人。额,也许不是僵尸吃掉你的孩子这种级别的惨痛经历,但是其实也差不多了。我接触过的人经历过一些你难以想象的恐怖创伤" +"我其实确实是一个心理辅导员,以前在吉特克桑乐队中工作。我曾经对付过心理健康问题和毒品上瘾,还辅导过有惨痛经历的一些人。额,也许不是丧尸吃掉你的孩子这种级别的惨痛经历,但是其实也差不多了。我接触过的人经历过一些你难以想象的恐怖创伤" #: lang/json/talk_topic_from_json.py msgid "Well, it's been nice talking to you, but I need to head out." @@ -139994,7 +141078,7 @@ msgid "" "I can see you need one, but last time I used these shears it was to stab a " "zombie in the face. I don't think you'd want them in your hair. Maybe you " "could help me get set up properly?" -msgstr "我明白你需要理发,但上次我用这些剪子捅死了骑我脸的僵尸,我不认为你想让那些玩意儿粘在你的头发上。也许你可以帮我处理一下?" +msgstr "我明白你需要理发,但上次我用这些剪子捅死了骑我脸的丧尸,我不认为你想让那些玩意儿粘在你的头发上。也许你可以帮我处理一下?" #: lang/json/talk_topic_from_json.py msgid "What can I do to help you out?" @@ -140829,7 +141913,7 @@ msgid "" "sun, fresh air, and hard work... but people are a bit afraid of getting " "attacked by zombie hordes, as you might guess." msgstr "" -"不幸的是,没有。大多数离开的人已经被困在楼上,他们承担的风险比那些已经有一张安全的床的人要小。我们只有几个人走出地下室,当我们出发的时候地下室已经太拥挤了。我们希望有更多的人到农场去晒晒太阳,呼吸新鲜空气,干点苦活……但是你可能猜到了,人们有点害怕被僵尸群袭击。" +"不幸的是,没有。大多数离开的人已经被困在楼上,他们承担的风险比那些已经有一张安全的床的人要小。我们只有几个人走出地下室,当我们出发的时候地下室已经太拥挤了。我们希望有更多的人到农场去晒晒太阳,呼吸新鲜空气,干点苦活……但是你可能猜到了,人们有点害怕被丧尸群袭击。" #: lang/json/talk_topic_from_json.py msgid "Marshal..." @@ -141340,6 +142424,10 @@ msgstr "你需要做什么工作?" msgid "What the hell were you testing out there?" msgstr "你到底在那里做什么测试?" +#: lang/json/talk_topic_from_json.py +msgid "So, about that protective gear?" +msgstr "所以,关于那套防护装备?" + #: lang/json/talk_topic_from_json.py msgid "No. Now leave." msgstr "不,现在离开。" @@ -141356,6 +142444,24 @@ msgid "" msgstr "" "这是一个改进型生物底盘,带有一个定制的人工智能。我们希望它能为我们与外界互动,一切进展的非常顺利,我们对发生的事感到羞愧,因为切除内脏...." +#: lang/json/talk_topic_from_json.py +msgid "" +"Given the current context, we are willing to sell you a set of our protective gear: gas mask, suit and gear, at a considerable discount. We will sell it for two of our coins.\n" +"\n" +"the intercom: Hmm wait, we might not have your size..." +msgstr "" +"考虑到目前的情况,我们可以打折卖给你一套我们的防护装备:防护服、防毒面具和滤芯。我们只要两枚我们的硬币。\n" +"\n" +"对讲机:嗯,等一下,我们好像没有你的尺寸……" + +#: lang/json/talk_topic_from_json.py +msgid "[ 2 Hub 01 Gold Coins ] Deal!" +msgstr "[ 2 Hub 01 金币 ] 成交!" + +#: lang/json/talk_topic_from_json.py +msgid "I have to give it a thought." +msgstr "我得想想。" + #: lang/json/talk_topic_from_json.py msgid "Just leave." msgstr "离开吧。" @@ -142040,63 +143146,63 @@ msgstr "轻而易举地缴械并击晕了%s" #: lang/json/technique_from_json.py msgid "Measured Strike (melee)" -msgstr "" +msgstr "精准械击" #: lang/json/technique_from_json.py #, python-format msgid "You make an efficent strike against %s" -msgstr "" +msgstr "你精准有效地击中了%s。" #: lang/json/technique_from_json.py #, python-format msgid " makes an efficent strike against %s" -msgstr "" +msgstr "精准有效地击中了%s" #: lang/json/technique_from_json.py msgid "Measured Strike (unarmed)" -msgstr "" +msgstr "精准打击" #: lang/json/technique_from_json.py msgid "Biojutsu Impale" -msgstr "生化刺穿" +msgstr "生化穿刺" #: lang/json/technique_from_json.py #, python-format msgid "You brutally impale %s with your weapon" -msgstr "" +msgstr "你无情地用武器刺穿了%s" #: lang/json/technique_from_json.py #, python-format msgid " brutally impales %s with their weapon" -msgstr "" +msgstr "无情地用武器刺穿了%s" #: lang/json/technique_from_json.py msgid "Biojutsu Takedown" -msgstr "" +msgstr "生化绊摔" #: lang/json/technique_from_json.py #, python-format msgid "You kick and slam %s to the ground" -msgstr "" +msgstr "你把%s绊倒在地" #: lang/json/technique_from_json.py #, python-format msgid " kicks and slams %s to the ground" -msgstr "" +msgstr "把%s绊倒在地" #: lang/json/technique_from_json.py msgid "Biojutsu Cleave" -msgstr "" +msgstr "生化斩击" #: lang/json/technique_from_json.py #, python-format msgid "You quickly cleave through %s and those nearby" -msgstr "" +msgstr "你迅速地劈穿了%s和附近的敌人" #: lang/json/technique_from_json.py #, python-format msgid " quickly cleaves through %s and those nearby" -msgstr "" +msgstr "迅速地劈穿了%s和附近的敌人" #: lang/json/technique_from_json.py msgid "Viper Hiss" @@ -142207,12 +143313,12 @@ msgstr "反擒拿" #: lang/json/technique_from_json.py #, python-format msgid "The %s tries to grab you, but you skitter free!" -msgstr "" +msgstr "%s试图抓住你,但你躲开了!" #: lang/json/technique_from_json.py #, python-format msgid "The %s tries to grab , but they skitter free!" -msgstr "" +msgstr "%s试图抓住,但是他躲开了!" #: lang/json/technique_from_json.py msgid "Centipede Strike" @@ -142235,22 +143341,22 @@ msgstr "蜈蚣撕咬" #: lang/json/technique_from_json.py #, python-format msgid "You palm strike %s with a painful Centipede Bite" -msgstr "" +msgstr "你弯掌成钩,如蜈蚣噬咬般狠狠袭击了%s。" #: lang/json/technique_from_json.py #, python-format msgid " palm strikes %s with a painful Centipede Bite" -msgstr "" +msgstr "弯掌成钩,如蜈蚣噬咬般狠狠袭击了%s。" #: lang/json/technique_from_json.py #, python-format msgid "You disarm %s with lightning speed" -msgstr "" +msgstr "你以闪电般的速度解除了%s的武装。" #: lang/json/technique_from_json.py #, python-format msgid " disarms %s with lightning speed" -msgstr "" +msgstr "以闪电般的速度解除了%s的武装。" #: lang/json/technique_from_json.py msgid "Not at technique at all" @@ -142296,7 +143402,7 @@ msgstr "招架了%s的攻击" #: lang/json/technique_from_json.py msgid "Shield" -msgstr "屏蔽" +msgstr "防御" #. ~ Description for Shield #: lang/json/technique_from_json.py @@ -142569,69 +143675,69 @@ msgstr "精准戳击%s" #: lang/json/technique_from_json.py msgid "Block Counter Disarm" -msgstr "" +msgstr "格挡缴械" #: lang/json/technique_from_json.py #, python-format msgid "You block and smoothly disarm %s" -msgstr "" +msgstr "你行云流水般地格挡了攻击并解除了%s的武装。" #: lang/json/technique_from_json.py #, python-format msgid " blocks and smoothly disarms %s" -msgstr "" +msgstr "行云流水般地格挡了攻击并解除了%s的武装。" #: lang/json/technique_from_json.py msgid "Block Counter Throw" -msgstr "" +msgstr "格挡摔投" #: lang/json/technique_from_json.py #, python-format msgid "You block and smoothly throw %s" -msgstr "" +msgstr "你行云流水般地格挡了攻击并把%s摔了出去。" #: lang/json/technique_from_json.py #, python-format msgid " blocks and smoothly throws %s" -msgstr "" +msgstr "行云流水般地格挡了攻击并把%s摔了出去。" #: lang/json/technique_from_json.py msgid "Dodge Counter Throw" -msgstr "" +msgstr "闪避摔投" #: lang/json/technique_from_json.py #, python-format msgid "You dodge and smoothly throw %s" -msgstr "" +msgstr "你行云流水般地闪避了攻击并把%s摔了出去。" #: lang/json/technique_from_json.py #, python-format msgid " dodges and smoothly throws %s" -msgstr "" +msgstr "行云流水般地闪避了攻击并把%s摔了出去。" #: lang/json/technique_from_json.py msgid "Dodge Counter Disarm" -msgstr "" +msgstr "闪避缴械" #: lang/json/technique_from_json.py #, python-format msgid "You dodge and smoothly disarm %s" -msgstr "" +msgstr "你行云流水般地闪避了攻击并解除了%s的武装。" #: lang/json/technique_from_json.py #, python-format msgid " dodges and smoothly disarms %s" -msgstr "" +msgstr "你行云流水般地闪避了攻击并解除了%s的武装。" #: lang/json/technique_from_json.py #, python-format msgid "The %s tries to grab you, but you smoothly break free!" -msgstr "" +msgstr "%s试图抓住你,但你利落地挣脱了!" #: lang/json/technique_from_json.py #, python-format msgid "The %s tries to grab , but they smoothly break free!" -msgstr "" +msgstr "%s试图抓住,但他利落地挣脱了!" #: lang/json/technique_from_json.py msgid "Cross" @@ -142692,12 +143798,12 @@ msgstr "上勾拳攻击%s" #: lang/json/technique_from_json.py #, python-format msgid "The %s tries to grab you, but you force yourself free!" -msgstr "" +msgstr "%s试图抓住你,但你用力挣脱了!" #: lang/json/technique_from_json.py #, python-format msgid "The %s tries to grab , but they break free!" -msgstr "" +msgstr "%s试图抓住,但他用力挣脱了!" #: lang/json/technique_from_json.py msgid "Hit Them Back" @@ -142721,17 +143827,17 @@ msgstr "你佯攻%s" #: lang/json/technique_from_json.py #, python-format msgid " fakes a strike at %s" -msgstr "" +msgstr "佯攻了%s。" #: lang/json/technique_from_json.py #, python-format msgid "You knock %s's weapon away" -msgstr "" +msgstr "你打落了%s的的武器。" #: lang/json/technique_from_json.py #, python-format msgid " knock %s's weapon away" -msgstr "" +msgstr "打落了%s的武器。" #: lang/json/technique_from_json.py msgid "Power Hit" @@ -142768,12 +143874,12 @@ msgstr "推踢" #: lang/json/technique_from_json.py #, python-format msgid "You push kick %s" -msgstr "" +msgstr "你右脚蹬地,重心前移,用力蹬踢%s。" #: lang/json/technique_from_json.py #, python-format msgid " push kicks %s" -msgstr "" +msgstr "右脚蹬地,重心前移,用力蹬踢%s。" #: lang/json/technique_from_json.py msgid "Circle Kick" @@ -142782,12 +143888,12 @@ msgstr "轮踢" #: lang/json/technique_from_json.py #, python-format msgid "You circle kick %s" -msgstr "" +msgstr "你对%s使出一记环踢。" #: lang/json/technique_from_json.py #, python-format msgid " circle kicks %s" -msgstr "" +msgstr "对%s使出一记环踢。" #: lang/json/technique_from_json.py msgid "Sweep Kick" @@ -142796,12 +143902,12 @@ msgstr "扫踢" #: lang/json/technique_from_json.py #, python-format msgid "You sweep kick %s" -msgstr "" +msgstr "你一记扫堂腿扫倒了%s。" #: lang/json/technique_from_json.py #, python-format msgid " sweep kicks %s" -msgstr "" +msgstr "一记扫堂腿扫倒了%s。" #: lang/json/technique_from_json.py msgid "Spin Kick" @@ -142810,12 +143916,12 @@ msgstr "旋踢" #: lang/json/technique_from_json.py #, python-format msgid "You spin kick %s" -msgstr "" +msgstr "你拧转身体,对%s使出一记回旋踢。" #: lang/json/technique_from_json.py #, python-format msgid " spin kicks %s" -msgstr "" +msgstr "拧转身体,对%s使出一记回旋踢。" #: lang/json/technique_from_json.py msgid "Crane Wing" @@ -142852,12 +143958,12 @@ msgstr "鹤击" #: lang/json/technique_from_json.py #, python-format msgid "You hand-peck and swat down %s" -msgstr "" +msgstr "你拢指成钩,猛力击倒了%s。" #: lang/json/technique_from_json.py #, python-format msgid " hand-pecks and swats down %s" -msgstr "" +msgstr "拢指成钩,猛力击倒了%s。" #: lang/json/technique_from_json.py msgid "Crane Kick" @@ -142866,12 +143972,12 @@ msgstr "鹤踢" #: lang/json/technique_from_json.py #, python-format msgid "You leap and kick %s" -msgstr "" +msgstr "你纵身跃起,飞踢%s。" #: lang/json/technique_from_json.py #, python-format msgid " leaps and kicks %s" -msgstr "" +msgstr "纵身跃起,飞踢%s。" #: lang/json/technique_from_json.py msgid "Dragon Claw" @@ -142880,12 +143986,12 @@ msgstr "龙爪手" #: lang/json/technique_from_json.py #, python-format msgid "You lash out at %s with a Dragon Claw" -msgstr "" +msgstr "你十指钩成龙爪,猛烈打击%s。" #: lang/json/technique_from_json.py #, python-format msgid " lashes out at %s with a Dragon Claw" -msgstr "" +msgstr "十指钩成龙爪,猛烈打击%s。" #: lang/json/technique_from_json.py msgid "Dragon Vortex Block" @@ -142908,12 +144014,12 @@ msgstr "龙翼闪避" #: lang/json/technique_from_json.py #, python-format msgid "You dodge the attack and leave %s off balance" -msgstr "" +msgstr "你避过攻击,顺势一带,使%s失去了平衡。" #: lang/json/technique_from_json.py #, python-format msgid " dodges and leaves %s off balance" -msgstr "" +msgstr "避过攻击,顺势一带,使%s失去了平衡。" #: lang/json/technique_from_json.py msgid "Dragon Tail" @@ -142922,12 +144028,12 @@ msgstr "龙摆尾" #: lang/json/technique_from_json.py #, python-format msgid "You sweep %s with a quick Dragon Tail" -msgstr "" +msgstr "你快速出腿,呈龙尾之势扫倒了%s。" #: lang/json/technique_from_json.py #, python-format msgid " sweeps %s with a quick Dragon Tail sweep" -msgstr "" +msgstr "快速出腿,呈龙尾之势扫倒了%s。" #: lang/json/technique_from_json.py msgid "Dragon Strike" @@ -142936,12 +144042,12 @@ msgstr "龙爪" #: lang/json/technique_from_json.py #, python-format msgid "You descend upon %s with a powerful Dragon Strike" -msgstr "" +msgstr "你以强有力的龙击猛袭向%s。" #: lang/json/technique_from_json.py #, python-format msgid " descends upon %s with a powerful Dragon Strike" -msgstr "" +msgstr "以强有力的龙击猛袭向%s。" #: lang/json/technique_from_json.py msgid "Round Strike" @@ -143053,31 +144159,111 @@ msgstr "弓步刺击%s" #: lang/json/technique_from_json.py msgid "Compound Attack" -msgstr "" +msgstr "复杂进攻" #: lang/json/technique_from_json.py #, python-format msgid "Your feint leads to a compound attack against %s" -msgstr "" +msgstr "你以假动作挑引%s防守,而后向其身体暴露出的部分加速劈下一记复杂进攻。" #: lang/json/technique_from_json.py #, python-format msgid "'s feint leads to a compound attack against %s" -msgstr "" +msgstr "以假动作挑引%s防守,而后向其身体暴露出的部分加速劈下一记复杂进攻。" #: lang/json/technique_from_json.py msgid "Fencing Riposte" -msgstr "" +msgstr "击剑抢攻" #: lang/json/technique_from_json.py #, python-format msgid "You deliver a perfect riposte to %s" -msgstr "" +msgstr "你对%s递出一剑完美的抢攻。" #: lang/json/technique_from_json.py #, python-format msgid " delivers a perfect riposte to %s" -msgstr "" +msgstr "对%s递出一剑完美的抢攻。" + +#: lang/json/technique_from_json.py +msgid "Displace and Hook" +msgstr "移位勾" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You parry and hook %s down" +msgstr "你避过攻击,顺势勾倒了%s。" + +#: lang/json/technique_from_json.py +#, python-format +msgid " parries and hooks %s down" +msgstr "避过攻击,顺势勾倒了%s。" + +#: lang/json/technique_from_json.py +msgid "High Round Strike" +msgstr "高旋斩" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You swing high and strike at %s" +msgstr "你大幅挥动武器,猛击%s" + +#: lang/json/technique_from_json.py +#, python-format +msgid " swings high and strikes %s" +msgstr "大幅挥动武器,猛击%s" + +#: lang/json/technique_from_json.py +msgid "High Round Feint" +msgstr "高旋虚招" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You fake a high round strike at %s" +msgstr "你假装大幅挥动武器,佯攻%s" + +#: lang/json/technique_from_json.py +#, python-format +msgid " feints at %s" +msgstr "佯攻%s" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab you, but you push away!" +msgstr "%s试图抓住你,但你把它推开了!" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab , but they push away!" +msgstr "%s试图抓住,但他把它推开了!" + +#: lang/json/technique_from_json.py +msgid "Hook and Drag" +msgstr "勾拽" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You hook and drag %s down" +msgstr "你勾住%s,并将它拉倒在地。" + +#: lang/json/technique_from_json.py +#, python-format +msgid " hooks and drags %s down" +msgstr "勾住%s,并将它拉倒在地。" + +#: lang/json/technique_from_json.py +msgid "Colpo di Grazia" +msgstr "处决" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You swing down hard and execute %s" +msgstr "你大幅挥动武器,处决了%s" + +#: lang/json/technique_from_json.py +#, python-format +msgid " swings down hard and executes %s" +msgstr "大幅挥动武器,处决了%s" #: lang/json/technique_from_json.py msgid "quick punch" @@ -143256,11 +144442,6 @@ msgstr "佯攻" msgid "You feint at %s" msgstr "你佯攻%s" -#: lang/json/technique_from_json.py -#, python-format -msgid " feints at %s" -msgstr "佯攻%s" - #: lang/json/technique_from_json.py #, python-format msgid "You jab %s" @@ -143709,57 +144890,6 @@ msgstr "你接下%s的攻击,并反转给对方" msgid " receives %s's attack, and counters" msgstr "接下%s的攻击,并反转它" -#: lang/json/technique_from_json.py -msgid "Displace and Hook" -msgstr "移位勾" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You parry %s attack and hook them down" -msgstr "你招架了%s的攻击并顺势将其勾倒" - -#: lang/json/technique_from_json.py -#, python-format -msgid " parries %s attack and hooks them down" -msgstr "招架了%s的攻击并顺势将其勾倒" - -#: lang/json/technique_from_json.py -msgid "High Round Strike" -msgstr "高旋斩" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You swing high and strike at %s" -msgstr "你大幅挥动武器,猛击%s" - -#: lang/json/technique_from_json.py -#, python-format -msgid " swings high and strikes %s" -msgstr "大幅挥动武器,猛击%s" - -#: lang/json/technique_from_json.py -msgid "High Round Feint" -msgstr "高旋虚招" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You fake a high round strike at %s" -msgstr "你假装大幅挥动武器,佯攻%s" - -#: lang/json/technique_from_json.py -msgid "High Round Stab" -msgstr "高旋刺" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You quickly stab %s" -msgstr "你快速刺击%s" - -#: lang/json/technique_from_json.py -#, python-format -msgid " quickly stabs %s" -msgstr " 快速刺击 %s" - #: lang/json/technique_from_json.py msgid "grab and pommel strike" msgstr "执械柄击" @@ -144466,45 +145596,45 @@ msgstr "混凝土桥的人行道。" #: lang/json/terrain_from_json.py msgid "closed laminated glass door" -msgstr "" +msgstr "夹层玻璃门(关)" #. ~ Description for closed laminated glass door #: lang/json/terrain_from_json.py msgid "" "A closed laminated glass door is composed layers of glass and plastic held " "together by an interlayer." -msgstr "" +msgstr "由夹层粘合多层玻璃和塑料制成的夹层玻璃门。" #: lang/json/terrain_from_json.py msgid "open laminated glass door" -msgstr "" +msgstr "夹层玻璃门(开)" #. ~ Description for open laminated glass door #: lang/json/terrain_from_json.py msgid "" "Laminated glass door is composed layers of glass and plastic held together " "by an interlayer. Yep, it's open." -msgstr "" +msgstr "由夹层粘合多层玻璃和塑料制成的夹层玻璃门。没错,这个是开着的。" #: lang/json/terrain_from_json.py msgid "closed ballistic glass door" -msgstr "" +msgstr "防弹玻璃门(关)" #. ~ Description for closed ballistic glass door #. ~ Description for ballistic glass #: lang/json/terrain_from_json.py msgid "Ballistic glass consists of layers of laminated glass." -msgstr "" +msgstr "由多层玻璃制成的防弹玻璃门。" #: lang/json/terrain_from_json.py msgid "open ballistic glass door" -msgstr "" +msgstr "防弹玻璃门(开)" #. ~ Description for open ballistic glass door #: lang/json/terrain_from_json.py msgid "" "Ballistic glass consists of layers of laminated glass. Yep, it's open." -msgstr "" +msgstr "由多层玻璃制成的防弹玻璃门。没错,这个是开着的。" #: lang/json/terrain_from_json.py msgid "closed reinforced glass door" @@ -145434,6 +146564,16 @@ msgstr "木质楼板,由扎紧的木板钉牢而成。常见于露台。" msgid "SMASH!" msgstr "啪嗒!" +#: lang/json/terrain_from_json.py +msgid "metal floor" +msgstr "金属地板" + +#. ~ Description for metal floor +#: lang/json/terrain_from_json.py +msgid "" +"High-quality and tough checkered flooring to reduce risk of slips and falls." +msgstr "高质量的坚固网纹地板,可以减小滑倒的风险。" + #: lang/json/terrain_from_json.py msgid "linoleum tile" msgstr "油毡地砖" @@ -145531,10 +146671,6 @@ msgid "" "smoothed and the roof isn't quite filled in yet." msgstr "未完成的钢筋水泥结构,地板尚未整平,屋顶也还没盖严实。" -#: lang/json/terrain_from_json.py -msgid "metal floor" -msgstr "金属地板" - #. ~ Description for metal floor #: lang/json/terrain_from_json.py msgid "" @@ -147346,7 +148482,7 @@ msgid "" "This is a standalone computer terminal. It can be used to view contents and" " perform any allowed functions. It might even be possible to hack it, given" " the skills." -msgstr "这是一个独立的计算机终端。它可以用来查看内容并执行任何允许的功能。考虑到技能,它可能被黑客攻击。" +msgstr "这是一个独立的计算机终端。它可以用来查看内容并执行任何允许的功能。如果你有相关技能,也可以侵入它。" #: lang/json/terrain_from_json.py msgid "mechanical winch" @@ -150820,6 +151956,16 @@ msgstr "甲壳撞锤" msgid "biosilicfied chitin ram" msgstr "硅化甲壳撞锤" +#: lang/json/vehicle_part_from_json.py +msgid "tied mattress" +msgstr "绑好的床垫" + +#. ~ Description for tied mattress +#: lang/json/vehicle_part_from_json.py +msgid "" +"A mattress, strapped onto the vehicle. It could serve to blunt any impact." +msgstr "一个绑到载具上的床垫,可以用来吸收冲击。" + #. ~ Description for shredder #: lang/json/vehicle_part_from_json.py msgid "" @@ -151234,7 +152380,7 @@ msgid "" "dripping with zombie gore. 'e'xamine the tile with the dishwasher to use " "it." msgstr "" -"一台小型车载洗衣机。只要你有洗涤剂或肥皂、水和一些电,你可以洗干净许多衣服……或者洗掉CBM上面的僵尸血肉。按\"e\"后选择该部件所在位置来使用它。" +"一台小型车载洗衣机。只要你有洗涤剂或肥皂、水和一些电,你可以洗干净许多衣服……或者洗掉CBM上面的丧尸血肉。按\"e\"后选择该部件所在位置来使用它。" #. ~ Description for autoclave #: lang/json/vehicle_part_from_json.py @@ -155097,6 +156243,10 @@ msgstr "%s整理了所有能够整理的物品。" msgid "Stop %s?" msgstr "停止%s?" +#: src/activity_type.h +msgid "THIS IS A BUG" +msgstr "这 是 个 BUG" + #: src/addiction.cpp msgid "You need some nicotine." msgstr "你需要一些尼古丁。" @@ -156632,10 +157782,6 @@ msgstr "[神器]%2$s的%1$s" msgid "artifact file" msgstr "神器文件" -#: src/auto_pickup.cpp -msgid " AUTO PICKUP MANAGER " -msgstr "自动拾取管理" - #: src/auto_pickup.cpp src/game.cpp src/safemode_ui.cpp msgid "dd" msgstr "添加" @@ -156684,14 +157830,6 @@ msgstr "规则" msgid "I/E" msgstr "白/黑名单" -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "[]" -msgstr "[<全局>]" - -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "[]" -msgstr "[<角色>]" - #: src/auto_pickup.cpp msgid "Auto pickup enabled:" msgstr "自动拾取开关:" @@ -156708,10 +157846,6 @@ msgstr "是" msgid "witch" msgstr "开关" -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "Please load a character first to use this page!" -msgstr "请先载入一个角色后再使用这个页面!" - #: src/auto_pickup.cpp src/safemode_ui.cpp msgid "" msgstr "<空>" @@ -156761,6 +157895,18 @@ msgstr "规则:" msgid "Save changes?" msgstr "是否保存修改?" +#: src/auto_pickup.cpp +msgid " AUTO PICKUP MANAGER " +msgstr "自动拾取管理" + +#: src/auto_pickup.cpp src/safemode_ui.cpp +msgid "[]" +msgstr "[<全局>]" + +#: src/auto_pickup.cpp src/safemode_ui.cpp +msgid "[]" +msgstr "[<角色>]" + #: src/auto_pickup.cpp #, c-format msgid "%1$d item matches: %2$s" @@ -156779,6 +157925,11 @@ msgstr "自动拾取功能没有打开。是否打开?" msgid "autopickup configuration" msgstr "自动拾取设置" +#: src/auto_pickup.cpp +#, c-format +msgid "Pickup rules for %s" +msgstr "对于 %s 的拾取规则。" + #: src/avatar.cpp src/iuse.cpp msgid "He" msgstr "他" @@ -157725,7 +158876,7 @@ msgstr "空扩展区" #: src/bionics.cpp #, c-format msgid "%s activates their %s." -msgstr "" +msgstr "%s激活了他的%s。" #: src/bionics.cpp #, c-format @@ -158015,8 +159166,38 @@ msgstr "你缩回了%s。" #: src/bionics.cpp #, c-format -msgid "%s withdraws %s %s." -msgstr "%s取出%s中的%s。" +msgid " withdraws %s %s." +msgstr "收起了%s%s。" + +#: src/bionics.cpp +#, c-format +msgid "Your %s does not have enought fuel to start." +msgstr "你的%s燃料不足,无法启动。" + +#: src/bionics.cpp +#, c-format +msgid "'s %s does not have enought fuel to start." +msgstr "的%s燃料不足,无法启动。" + +#: src/bionics.cpp +#, c-format +msgid "Your %s turns off to not waste fuel." +msgstr "你的%s自动关闭以节省燃料。" + +#: src/bionics.cpp +#, c-format +msgid "'s %s turns off to not waste fuel." +msgstr "的%s自动关闭以节省燃料。" + +#: src/bionics.cpp +#, c-format +msgid "Your %s runs out of fuel and turn off." +msgstr "你的%s燃料耗尽,停止工作。" + +#: src/bionics.cpp +#, c-format +msgid "'s %s runs out of fuel and turn off." +msgstr "的%s的燃料耗尽,停止工作。" #: src/bionics.cpp #, c-format @@ -158178,7 +159359,7 @@ msgstr "移除生化插件失败:%s。" #: src/bionics.cpp #, c-format msgid "The %s's anesthesia kit looks empty." -msgstr "" +msgstr "%s的麻醉工具箱是空的。" #: src/bionics.cpp msgid "" @@ -158196,12 +159377,12 @@ msgstr "%1$s小心翼翼地地将针头插入%2$s的手臂,按住并开始注 #: src/bionics.cpp #, c-format msgid "You fall asleep and %1$s starts operating." -msgstr "" +msgstr "你进入睡眠,%1$s开始手术。" #: src/bionics.cpp #, c-format msgid "%1$s falls asleep and %2$s starts operating." -msgstr "" +msgstr "%1$s进入睡眠,%2$s开始手术。" #: src/bionics.cpp #, c-format @@ -158381,6 +159562,10 @@ msgid "" "enjoy the operation." msgstr "随着你的意识渐渐消逝,你开始为自己无法享受手术过程而感到一阵懊悔。" +#: src/bionics_ui.cpp +msgid "Available Fuel: " +msgstr "可用燃料:" + #: src/bionics_ui.cpp #, c-format msgid "" @@ -161559,6 +162744,18 @@ msgid " digests a %s and recharges %d point of energy." msgid_plural " digests a %s and recharges %d points of energy." msgstr[0] "消化了%s,并将其转化成了 %d 点能量。" +#: src/consumption.cpp +#, c-format +msgid "You load %i charge of %s in your %s." +msgid_plural "You load %i charges of %s in your %s." +msgstr[0] "你将%i单位%s装到%s里。" + +#: src/consumption.cpp +#, c-format +msgid " load %i charge of %s in their %s." +msgid_plural " load %i charges of %s in their %s." +msgstr[0] "将%i单位%s装到%s里。" + #: src/craft_command.cpp src/crafting.cpp src/veh_interact.cpp msgid " (nearby)" msgstr "(附近)" @@ -161644,8 +162841,10 @@ msgstr "你无法继续制造那件物品!" #: src/crafting.cpp #, c-format -msgid "You don't have anything to store %s in!" -msgstr "你没有任何容器来存放%s!" +msgid "" +"You don't have anything in which to store %s and may have to pour it out or " +"consume it as soon as it is prepared! Proceed?" +msgstr "你没有装%s的容器,可能只能吃掉或倒掉你做的东西!是否继续?" #: src/crafting.cpp src/pickup.cpp #, c-format @@ -162230,6 +163429,10 @@ msgstr "正中目标!" msgid "Grazing hit." msgstr "偏斜。" +#: src/creature.cpp +msgid "You feel poison coursing through your body!" +msgstr "你感觉毒性扩散到你的全身!" + #: src/creature.cpp msgid "The shot misses!" msgstr "没有击中!" @@ -163796,21 +164999,21 @@ msgid "You can't see the terrain here." msgstr "你看不见这里的地形。" #: src/descriptions.cpp +#, c-format msgid "" "\n" -"Sign: ???" +"Sign: %s" msgstr "" "\n" -"标记:?" +"标记:%s" #: src/descriptions.cpp -#, c-format msgid "" "\n" -"Sign: %s" +"Sign: ???" msgstr "" "\n" -"标记:%s" +"标记:?" #: src/descriptions.cpp src/iexamine.cpp #, c-format @@ -167043,20 +168246,6 @@ msgstr "界面状态数据" msgid "Failed to save game data" msgstr "存储游戏数据失败" -#: src/game.cpp -msgid "You haven't killed any monsters yet!" -msgstr "你还没有杀死任何怪物。" - -#: src/game.cpp -#, c-format -msgid "KILL COUNT: %d" -msgstr "杀敌数:%d" - -#: src/game.cpp -#, c-format -msgid "Experience: %d (%d points available)" -msgstr "经验:%d(%d分)" - #: src/game.cpp msgid " You are forgotten among the billions lost in the cataclysm..." msgstr "你和在大灾变中丧生的数十亿人一同被遗忘了……" @@ -167247,7 +168436,7 @@ msgstr "在(%d,%d,%d)没有什么可以击退!" #: src/game.cpp #, c-format msgid "%s was stunned!" -msgstr "%s被击晕了!" +msgstr "%s被眩晕了!" #: src/game.cpp #, c-format @@ -168785,7 +169974,7 @@ msgstr "你感觉到某种恶灵的存在……" #: src/game.cpp msgid "You feel a tickle of insanity." -msgstr "你感觉到一股令人发疯的奇痒。" +msgstr "你感受到一丝疯狂" #: src/game.cpp msgid "Your skin prickles with radiation." @@ -169007,6 +170196,11 @@ msgstr "无法喝下已洒出的液体" msgid "You're fully charged" msgstr "你的生化能量已达上限" +#: src/game_inventory.cpp +#, c-format +msgid "No space to store more %s" +msgstr "没有装%s的空间了" + #: src/game_inventory.cpp msgid "soon!" msgstr "即将腐坏!" @@ -169039,6 +170233,18 @@ msgstr "陈旧" msgid "rotten" msgstr "腐坏" +#: src/game_inventory.cpp src/panels.cpp +msgid "Food :" +msgstr "食物:" + +#: src/game_inventory.cpp src/panels.cpp +msgid "Drink:" +msgstr "饮水:" + +#: src/game_inventory.cpp src/panels.cpp +msgid "Pain :" +msgstr "疼痛:" + #: src/game_inventory.cpp msgid "Consume item" msgstr "进食/消耗物品" @@ -171022,7 +172228,7 @@ msgstr "这是一个电弧炉。" #: src/iexamine.cpp #, c-format msgid "It has finished burning, yielding %d calcium carbide." -msgstr "它已经结束燃烧,产出了 %d 电石。" +msgstr "它已经结束煅烧,产出了 %d 电石。" #: src/iexamine.cpp msgid "This autoclave is empty..." @@ -171759,6 +172965,14 @@ msgstr "选择移除生化插件。" msgid "ERROR NO SPACE AVAILABLE. Operation impossible. Exiting." msgstr "错误:无可用空间,无法进行手术。 系统已退出。" +#: src/iexamine.cpp +msgid "Personality_Override" +msgstr "人格重载" + +#: src/iexamine.cpp +msgid "C0RR#PTED?D#TA" +msgstr "锟斤拷数据扌坏烫烫烫烫" + #: src/iexamine.cpp msgid "Choose bionic to uninstall" msgstr "选择要移除的生化插件" @@ -172986,8 +174200,8 @@ msgid "Capacity: " msgstr "容量:" #: src/item.cpp -msgid " per round" -msgstr "每次" +msgid " moves per round" +msgstr "每发 行动点" #: src/item.cpp msgid "Reload time: " @@ -173083,8 +174297,8 @@ msgid "" msgstr "" #: src/item.cpp -msgid " seconds" -msgstr " 秒" +msgid " moves " +msgstr " 行动点" #: src/item.cpp msgid "Time to reach aim level: " @@ -173118,10 +174332,6 @@ msgstr "实际后坐力:" msgid "Recommended strength (burst): " msgstr "建议强度(连发):" -#: src/item.cpp -msgid " seconds per round" -msgstr " 秒每次" - #: src/item.cpp msgid "Fire modes: " msgstr "射击模式:" @@ -173387,6 +174597,14 @@ msgid "" "improve them by repairing this item." msgstr "物品防护因耐久度而 降低,你可以通过 修理该物品 恢复防护。" +#: src/item.cpp +msgid "Weight capacity modifier: " +msgstr "负重系数:" + +#: src/item.cpp +msgid "Weight capacity bonus: " +msgstr "负重增益:" + #: src/item.cpp msgid "Just for fun." msgstr "仅供娱乐。" @@ -173813,6 +175031,14 @@ msgstr "* 这件物品接受到无线电信号后会立即启动Encumbrance: " +msgstr "累赘度:" + +#: src/item.cpp +msgid "Environmental Protection: " +msgstr "环境防护: " + #: src/item.cpp msgid "* This weapon needs two free hands to fire." msgstr "* 这件武器需要空着双手来射击。" @@ -174726,7 +175952,7 @@ msgstr "你觉得自己免疫力更强了,但只是暂时的。" #: src/iuse.cpp msgid "You no longer need to fear the flu, at least for some time." -msgstr "" +msgstr "你再也不必担心流感了。至少在一段时间内。" #: src/iuse.cpp msgid "Are you sure you want to eat this? It looks poisonous..." @@ -177034,48 +178260,53 @@ msgstr "你触发了固件的保护程序,卡上的内容被自动清除了。 #: src/iuse.cpp msgid " on " -msgstr "开" +msgstr "和" #: src/iuse.cpp #, c-format msgid " covered in %s" -msgstr "被%s覆盖" +msgstr "和%s" #: src/iuse.cpp #, c-format msgid " on %s" -msgstr "在%s上" +msgstr "和%s" #: src/iuse.cpp #, c-format msgid " under %s" -msgstr "在%s下" +msgstr "和%s" #: src/iuse.cpp #, c-format msgid " illuminated by %s" -msgstr "被%s照亮" +msgstr "和%s的亮光" + +#: src/iuse.cpp +#, c-format +msgid " in %s cloud" +msgstr "和%s" #: src/iuse.cpp #, c-format msgid " with graffiti \"%s\"" -msgstr "涂鸦\"%s\"" +msgstr "(上有涂鸦\"%s\")" #: src/iuse.cpp #, c-format msgid " with message \"%s\"" -msgstr "写着\"%s\"" +msgstr "(写着\"%s\")" #: src/iuse.cpp #, c-format msgid " with %s on it" -msgstr "上面有%s" +msgstr "和%s" #: src/iuse.cpp msgctxt "" "Article 'a', replace it with empty string if it is not used in language" msgid "a " -msgstr " " +msgstr "一个" #: src/iuse.cpp msgid " is on fire. " @@ -177091,19 +178322,19 @@ msgstr "看起来很快乐。" #: src/iuse.cpp msgid "downed" -msgstr "被击倒" +msgstr "倒" #: src/iuse.cpp msgid "stuck" -msgstr "卡住" +msgstr "困" #: src/iuse.cpp msgid " is stunned. " -msgstr "以昏迷。" +msgstr "已被眩晕。" #: src/iuse.cpp msgid " is dazed. " -msgstr "以眩晕。" +msgstr "已被震晕。" #: src/iuse.cpp msgid " is stuck in beartrap. " @@ -177143,11 +178374,11 @@ msgstr "被孢子覆盖。" #: src/iuse.cpp msgid " lies under collapsed debris. " -msgstr "埋在倒塌的残骸下。" +msgstr "被埋在倒塌的残骸下。" #: src/iuse.cpp msgid "lies" -msgstr "掩埋" +msgstr "躺" #: src/iuse.cpp msgid " looks very tired. " @@ -177159,7 +178390,7 @@ msgstr "正在睡觉。" #: src/iuse.cpp msgid " is lit. " -msgstr "被点亮。" +msgstr "被点亮了。" #: src/iuse.cpp msgid " is saddled. " @@ -177179,7 +178410,7 @@ msgstr "系有袋子。" #: src/iuse.cpp msgid " is tied. " -msgstr "被拴住。" +msgstr "被拴住了。" #: src/iuse.cpp msgid "balancing" @@ -177198,11 +178429,11 @@ msgstr "看起来很沮丧。" #: src/iuse.cpp msgctxt "Someone" msgid " is writhing in pain. " -msgstr "因疼痛扭动。" +msgstr "因疼痛而扭动。" #: src/iuse.cpp msgid "rides" -msgstr "骑" +msgstr "骑行" #: src/iuse.cpp #, c-format @@ -177216,12 +178447,12 @@ msgstr "仿生LED发出柔和的光。" #: src/iuse.cpp #, c-format msgid "%1$s from %2$s" -msgstr "位于%2$s%1$s" +msgstr "%2$s的%1$s" #: src/iuse.cpp #, c-format msgid "%1$s with a %2$s" -msgstr "%1$s带着%2$s" +msgstr "有%2$s的%1$s" #: src/iuse.cpp #, c-format @@ -177233,7 +178464,7 @@ msgstr "在%s上。" #, c-format msgid "Nearby is %s." msgid_plural "Nearby are %s." -msgstr[0] "%s附近。" +msgstr[0] "附近是%s。" #: src/iuse.cpp msgid "sits" @@ -177250,7 +178481,7 @@ msgstr "它" #: src/iuse.cpp msgid "This is a photo of " -msgstr "这是一张照片" +msgstr "这是一张照片,上面是" #: src/iuse.cpp #, c-format @@ -177261,30 +178492,30 @@ msgstr "它在%s上。" #, c-format msgid "There is something lying on the ground: %s." msgid_plural "There are some things lying on the ground: %s." -msgstr[0] "这里有一些东西放在地上:%s。" +msgstr[0] "地上放着:%s。" #: src/iuse.cpp #, c-format msgid "Something is visible in the background: %s." msgid_plural "Some objects are visible in the background: %s." -msgstr[0] "后面可以看见一些事物:%s。" +msgstr[0] "后面可以看见:%s。" #: src/iuse.cpp #, c-format msgid "There is %s parked in the background." msgid_plural "There are %s parked in the background." -msgstr[0] "后面停着一些%s。" +msgstr[0] "后面停着%s。" #: src/iuse.cpp #, c-format msgid "There is %s in the background." msgid_plural "There are %s in the background." -msgstr[0] "后面是一片%s。" +msgstr[0] "后面是%s。" #: src/iuse.cpp #, c-format msgid "In the background you can see a %s" -msgstr "后面你可以看见一些%s。" +msgstr "后面你可以看见%s" #: src/iuse.cpp msgid "" @@ -177332,19 +178563,19 @@ msgstr "" #: src/iuse.cpp msgid "It is sunrise. " -msgstr "现在是日出。" +msgstr "照片上是日出。" #: src/iuse.cpp msgid "It is sunset. " -msgstr "现在是日落。" +msgstr "照片上是日落。" #: src/iuse.cpp msgid "It is night. " -msgstr "现在是夜晚。" +msgstr "照片上是夜晚。" #: src/iuse.cpp msgid "It is day. " -msgstr "现在是白天。" +msgstr "照片上是白天。" #: src/iuse.cpp #, c-format @@ -177354,13 +178585,13 @@ msgstr "天气是%s。" #: src/iuse.cpp #, c-format msgid "%s appearance:" -msgstr "%s到来:" +msgstr "%s的外观:" #: src/iuse.cpp #, c-format msgctxt "Date" msgid "The photo was taken on %s." -msgstr "这张照片拍的是%s。" +msgstr "这张照片拍摄于%s。" #: src/iuse.cpp #, c-format @@ -178267,6 +179498,10 @@ msgstr "你需要动力源来驱动 %s (比如UPS什么的)。" msgid "There is also a certain bionic that helps with this kind of armor." msgstr "某个生化插件也对这种装甲有用。" +#: src/iuse_actor.cpp +msgid "No lock to pick." +msgstr "没有可撬的锁。" + #: src/iuse_actor.cpp msgid "Use your lockpick where?" msgstr "在哪儿使用开锁工具?" @@ -180304,6 +181539,20 @@ msgstr "<-> 上一个" msgid "ndo move" msgstr "悔步" +#: src/kill_tracker.cpp +msgid "You haven't killed any monsters yet!" +msgstr "你还没有杀死任何怪物。" + +#: src/kill_tracker.cpp +#, c-format +msgid "KILL COUNT: %d" +msgstr "杀敌数:%d" + +#: src/kill_tracker.cpp +#, c-format +msgid "Experience: %d (%d points available)" +msgstr "经验:%d(%d分)" + #. ~ abbreviated direction names and long direction names #: src/line.cpp msgid "N " @@ -180573,6 +181822,16 @@ msgstr "无限的" msgid "an explosion" msgstr "爆炸" +#: src/magic.cpp +#, c-format +msgid "%s and %s" +msgstr "%s 和 %s" + +#: src/magic.cpp src/player.cpp +#, c-format +msgid "%s, %s" +msgstr "%s,%s" + #: src/magic.cpp #, c-format msgid "" @@ -180618,6 +181877,11 @@ msgstr "忽视干扰" msgid "Popup Distractions" msgstr "弹出干扰" +#: src/magic.cpp +#, c-format +msgid "%d moves" +msgstr "%d 行动点数" + #: src/magic.cpp msgid "requires concentration" msgstr "需要集中注意力" @@ -181136,7 +182400,7 @@ msgstr "还需要大概 %d 分钟才能完成对%s内物品的消毒。" #: src/map.cpp #, c-format -msgid "The autoclave in the %s has finished washing." +msgid "The autoclave in the %s has finished its cycle." msgstr "%s的高压灭菌釜已经完成了清洗程序。" #: src/map.cpp @@ -181402,22 +182666,6 @@ msgstr "打开禁闭室" msgid "Missile Controls" msgstr "导弹控制器" -#: src/mapgen.cpp -msgid "EnviroCom OS v2.03" -msgstr "EnviroCom OS v2.03" - -#: src/mapgen.cpp -msgid "Unlock stairs" -msgstr "开启楼梯" - -#: src/mapgen.cpp -msgid "Download Sewer Maps" -msgstr "下载管道地图" - -#: src/mapgen.cpp -msgid "Divert sample" -msgstr "转移样品" - #: src/mapgen.cpp msgid "NEPowerOS" msgstr "东北能源OS" @@ -181643,11 +182891,11 @@ msgstr "* 仅在 暴击 时生效" #: src/martialarts.cpp msgid "* Only works on a downed target" -msgstr "" +msgstr "* 只对被击倒的目标有效" #: src/martialarts.cpp msgid "* Only works on a stunned target" -msgstr "" +msgstr "* 只对被眩晕的目标有效" #: src/martialarts.cpp msgid "* Will counterattack when you dodge" @@ -182430,7 +183678,7 @@ msgstr "%s。" #: src/mission.h msgid "Bugged mission type" -msgstr "" +msgstr "错误任务类型" #: src/mission_companion.cpp msgid "Outpost Missions" @@ -183251,23 +184499,23 @@ msgstr "(你标记了难民中心的位置,但不知道怎么顺着路过去 #: src/mission_start.cpp msgid "Workstation" -msgstr "" +msgstr "工作站" #: src/mission_start.cpp msgid "Download Memory Contents" -msgstr "" +msgstr "下载内存数据" #: src/mission_start.cpp msgid "Download Encryption Routines" -msgstr "" +msgstr "下载加密程序" #: src/mission_start.cpp msgid "Durable Storage Archive" -msgstr "" +msgstr "耐用档案存储" #: src/mission_start.cpp msgid "Download Archives" -msgstr "" +msgstr "下载档案" #: src/mission_start.cpp msgid "Download Routing Software" @@ -184016,6 +185264,11 @@ msgstr "%s 的双臂飞向 ,但被躲开了!" msgid "The %1$s's arms fly out and pull and grab %2$s!" msgstr "%1$s 的双臂飞出,抓住了 %2$s!" +#: src/monattack.cpp +#, c-format +msgid "The %1$s reaches out and pulls %2$s!" +msgstr "%1$s伸出肢体,将%2$s拽了过来!" + #: src/monattack.cpp #, c-format msgid "The %s gropes at you, but you dodge!" @@ -184718,6 +185971,19 @@ msgstr "\"放下武器,不许动,公民!\"" msgid "fzzzzzt" msgstr "哔~呲" +#: src/monattack.cpp +msgid "The floor trembles underneath your feet." +msgstr "地面在你脚下晃动。" + +#: src/monattack.cpp +msgid "a deafening roar!" +msgstr "一声震耳欲聋的吼叫!" + +#: src/monattack.cpp +#, c-format +msgid "A %s struggles to pull itself free from the %s!" +msgstr "一只%s挣扎着从%s挣脱!" + #: src/monattack.cpp #, c-format msgid "The %1$s mechanically grabs at %2$s!" @@ -185880,7 +187146,7 @@ msgstr "总心情值:" #: src/morale.cpp msgid "Focus trends towards:" -msgstr "专注变化趋势:" +msgstr "专注值平衡点:" #: src/morale.cpp msgid "Nothing affects your morale" @@ -187340,7 +188606,12 @@ msgstr "%1$s 丢下了 %2$s。" #: src/npcmove.cpp #, c-format msgid "Hold on, I want to pulp that %s." -msgstr "等我一会,%s 归我了。" +msgstr "等一下,我要去捣碎那个%s。" + +#: src/npcmove.cpp +#, c-format +msgid "%s completed the assigned task." +msgstr "%s完成了指定的工作。" #: src/npcmove.cpp #, c-format @@ -187492,11 +188763,11 @@ msgstr "用你平时想要的任何武器" #: src/npctalk.cpp msgid "Hold off on pulping zombies for a while" -msgstr "暂停捣碎僵尸一段时间" +msgstr "暂时不要捣碎丧尸" #: src/npctalk.cpp msgid "Pulp zombies if you like" -msgstr "捣碎僵尸如果你喜欢的话" +msgstr "随意捣碎丧尸" #: src/npctalk.cpp msgid "Go back to keeping your usual distance" @@ -187853,6 +189124,10 @@ msgstr "拳头" msgid "BADAMMO" msgstr "BADAMMO" +#: src/npctalk.cpp +msgid "doing this and that" +msgstr "做这做那" + #: src/npctalk.cpp msgctxt "punctuation" msgid "." @@ -187956,6 +189231,11 @@ msgstr "你给了 %1$s %2$d 个 %3$s。" msgid "%1$s doesn't have a %2$s!" msgstr "%1$s 没有 %2$s!" +#: src/npctalk.cpp +#, c-format +msgid "%1$s gives you %2$s." +msgstr "%1$s 给了你 %2$s。" + #: src/npctalk.cpp msgid "I don't trust you enough to eat THIS..." msgstr "我不相信你,不会吃的……" @@ -188209,11 +189489,6 @@ msgstr "支付:" msgid "Select a follower" msgstr "选择一名同伴" -#: src/npctalk_funcs.cpp -#, c-format -msgid "Pickup rules for %s" -msgstr "对于 %s 的拾取规则。" - #: src/npctrade.cpp #, c-format msgid "Volume: %s %s, Weight: %.1f %s" @@ -188226,12 +189501,12 @@ msgstr "交换" #: src/npctrade.cpp #, c-format msgid "Credit %s" -msgstr "" +msgstr "盈余 %s" #: src/npctrade.cpp #, c-format msgid "Debt %s" -msgstr "" +msgstr "负债 %s" #: src/npctrade.cpp #, c-format @@ -188262,12 +189537,12 @@ msgstr "交易多少%s[最大:%d]:" #: src/npctrade.cpp msgid "You'll need to offer me more than that." -msgstr "" +msgstr "你需要再多给我一点东西。" #: src/npctrade.cpp #, c-format msgid "Sorry, I'm only willing to extend you %s in credit." -msgstr "" +msgstr "抱歉,我最多能让你赊%s的账。" #: src/npctrade.cpp #, c-format @@ -188281,10 +189556,13 @@ msgid "" "\n" "Continue with trade?" msgstr "" +"我根本没法支付这么多东西的钱,我最多能欠你%s。\n" +"\n" +"继续交易?" #: src/npctrade.cpp msgid "Looks like a deal! Accept this trade?" -msgstr "" +msgstr "看起来对方同意了!接受这次交易吗?" #: src/npctrade.h msgid "" @@ -188452,14 +189730,14 @@ msgstr "开启后,下方设置的自动功能将被启用。当视野内有任 #: src/options.cpp msgid "Auto pulp or butcher" -msgstr "自动屠宰/砸碎尸体" +msgstr "自动屠宰/捣碎尸体" #: src/options.cpp msgid "" "Action to perform when 'Auto pulp or butcher' is enabled. Pulp: Pulp " "corpses you stand on. - Pulp Adjacent: Also pulp corpses adjacent from you." " - Butcher: Butcher corpses you stand on." -msgstr "开启自动屠宰/砸碎尸体功能后进行的操作。砸碎:自动砸碎脚下的尸体。砸碎附近:自动砸碎身边的尸体。屠宰:自动屠宰脚下的尸体。" +msgstr "开启自动屠宰/捣碎尸体功能后进行的操作。捣碎:自动捣碎脚下的尸体。捣碎附近:自动捣碎身边的尸体。屠宰:自动屠宰脚下的尸体。" #: src/options.cpp msgctxt "options" @@ -188468,11 +189746,11 @@ msgstr "关" #: src/options.cpp msgid "Pulp" -msgstr "砸碎" +msgstr "捣碎" #: src/options.cpp msgid "Pulp Adjacent" -msgstr "砸碎附近" +msgstr "捣碎附近" #: src/options.cpp msgid "Auto mining" @@ -189372,7 +190650,7 @@ msgstr "选择贴图包:" #: src/options.cpp msgid "Choose the tileset you want to use." -msgstr "选择你想要的贴图包。需要重新启动。" +msgstr "选择你想要的贴图包。" #: src/options.cpp msgid "Memory map drawing mode" @@ -189442,13 +190720,13 @@ msgstr "像素小地图的高度,以行数为单位。设置为 0 代表默认 #: src/options.cpp msgid "Scale pixel minimap" -msgstr "" +msgstr "缩放小地图" #: src/options.cpp msgid "" "Scale pixel minimap to fit its surroundings. May produce crappy results, " "especially in modes other than \"Solid\"." -msgstr "" +msgstr "缩放小地图以适应四周。可能会产生糟糕的显示效果,尤其是当小地图绘制模式不是“实心”时。" #: src/options.cpp msgid "Maintain pixel minimap aspect ratio" @@ -189460,21 +190738,21 @@ msgstr "保持像素小地图中的小格子为方形。" #: src/options.cpp msgid "Creature beacon size" -msgstr "" +msgstr "生物标记大小" #: src/options.cpp msgid "Controls how big the creature beacons are. Value is in minimap tiles." -msgstr "" +msgstr "控制小地图上生物标记的大小。单位为小地图格子的大小。" #: src/options.cpp msgid "Hostile creature beacon blink speed" -msgstr "" +msgstr "敌人标记闪烁速度" #: src/options.cpp msgid "" "Controls how fast the hostile creature beacons blink on the pixel minimap. " "Value is multiplied by 200 ms. Set to 0 to disable." -msgstr "" +msgstr "控制小地图上敌人标记的闪烁速度。参数乘以200 毫秒。设置为 0 时禁用闪烁。" #: src/options.cpp src/sdltiles.cpp msgid "Display" @@ -190896,10 +192174,6 @@ msgstr "寒冷!" msgid "Freezing!" msgstr "冻僵!" -#: src/panels.cpp -msgid "Pain " -msgstr "痛" - #: src/panels.cpp msgid "Bad" msgstr "坏" @@ -191067,22 +192341,10 @@ msgstr "手持:" msgid "Style:" msgstr "流派:" -#: src/panels.cpp -msgid "Food :" -msgstr "食物:" - -#: src/panels.cpp -msgid "Drink:" -msgstr "饮水:" - #: src/panels.cpp msgid "Rest :" msgstr "休息:" -#: src/panels.cpp -msgid "Pain :" -msgstr "疼痛:" - #: src/panels.cpp msgid "Heat :" msgstr "保暖:" @@ -192830,11 +194092,6 @@ msgstr "%s(%d)" msgid "%s with %s (%d)" msgstr "%s 装着 %s(%d 发)" -#: src/player.cpp -#, c-format -msgid "%s, %s" -msgstr "%s,%s" - #: src/player.cpp msgid "| Location " msgstr "| 位置" @@ -193530,24 +194787,26 @@ msgid "" "Do you want to crush up %s with your %s?\n" "%s" msgstr "" +"你打算用你的%s砸碎%s吗?\n" +"%s" #: src/player.cpp msgid "Be wary of fragile items nearby!" -msgstr "" +msgstr "小心附近的易损伤物品!" #: src/player.cpp #, c-format msgid "You swing your %s wildly!" -msgstr "" +msgstr "你的%s砸偏了!" #: src/player.cpp #, c-format msgid "You crush up and gather %s" -msgstr "" +msgstr "你砸碎并收集%s。" #: src/player.cpp msgid "You need a hammering tool to crush up frozen liquids!" -msgstr "" +msgstr "你需要一个捶打工具来砸碎冻住的液体!" #: src/player.cpp msgid "Your heart races as you recall your most recent hunt." @@ -193571,6 +194830,10 @@ msgstr "非常饥饿" msgid "Peckish" msgstr "空腹" +#: src/player.cpp +msgid "Pain " +msgstr "痛" + #: src/player_activity.cpp msgid "You pause for a moment to catch your breath." msgstr "你停下来,调整呼吸。" @@ -194637,7 +195900,7 @@ msgstr "[%c] 开始瞄准目标。(10 行动点)" #: src/ranged.cpp #, c-format msgid "%sto aim and fire" -msgstr "" +msgstr "%s 瞄准并开火" #: src/ranged.cpp #, c-format @@ -194999,6 +196262,10 @@ msgstr "黑/白名单" msgid "Safe Mode enabled:" msgstr "安全模式启用:" +#: src/safemode_ui.cpp +msgid "Please load a character first to use this page!" +msgstr "请先载入一个角色后再使用这个页面!" + #: src/safemode_ui.cpp msgid "Safe Mode manager currently inactive." msgstr "未开启安全模式管理器。" @@ -197817,7 +199084,11 @@ msgstr "哔——" msgid "" "You turn the autoclave off before it's finished the program, and open its " "door." -msgstr "你在消毒程序完成前关闭高压灭菌釜并打开高压灭菌器盖。" +msgstr "你在消毒程序完成前关闭高压灭菌釜并打开高压灭菌釜盖。" + +#: src/vehicle_use.cpp +msgid "The autoclave is empty, there's no point in starting it." +msgstr "高压灭菌釜是空的,启动它没什么作用。" #: src/vehicle_use.cpp #, c-format @@ -197845,6 +199116,10 @@ msgid "" "its lid." msgstr "你在清洗程序完成前关闭洗衣机并打开洗衣机盖。" +#: src/vehicle_use.cpp +msgid "The washing machine is empty, there's no point in starting it." +msgstr "洗衣机是空的,启动它没什么作用。" + #: src/vehicle_use.cpp #, c-format msgid "" @@ -197883,6 +199158,10 @@ msgid "" "lid." msgstr "你在清洗程序完成前关闭洗碗机并打开洗碗机盖。" +#: src/vehicle_use.cpp +msgid "The dishwasher is empty, there's no point in starting it." +msgstr "洗碗机是空的,启动它没什么作用。" + #: src/vehicle_use.cpp #, c-format msgid "" diff --git a/lang/po/zh_TW.po b/lang/po/zh_TW.po index a93d607648fc2..039d74c4e58f0 100644 --- a/lang/po/zh_TW.po +++ b/lang/po/zh_TW.po @@ -15,22 +15,22 @@ # Maynard , 2019 # HOXV , 2019 # 菲伊斯 , 2019 -# Brett Dong , 2019 -# xap, 2019 -# Laughing Man, 2019 -# Hao JK , 2019 # Hsinyu Chan, 2019 # 鋼龍 , 2019 -# kiddragon Chung , 2019 # 林楷翌 , 2019 +# Laughing Man, 2019 +# xap, 2019 +# Brett Dong , 2019 +# kiddragon Chung , 2019 +# Hao JK , 2019 # msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.D\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-16 17:39+0800\n" +"POT-Creation-Date: 2019-08-23 23:11+0800\n" "PO-Revision-Date: 2018-04-26 14:47+0000\n" -"Last-Translator: 林楷翌 , 2019\n" +"Last-Translator: Hao JK , 2019\n" "Language-Team: Chinese (Taiwan) (https://www.transifex.com/cataclysm-dda-translators/teams/2217/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -405,25 +405,6 @@ msgid "" "shotgun shells." msgstr "一些銅碎。能夠用來製作一些有用的東西, 例如粗製的霰彈。" -#: lang/json/AMMO_from_json.py -msgid "solder" -msgstr "焊料" - -#. ~ Description for solder -#: lang/json/AMMO_from_json.py -msgid "" -"A small spool of solder, able to be used in ammunition and electronics." -msgstr "一小捲的焊錫, 能夠使用在彈藥及電子產品上。" - -#: lang/json/AMMO_from_json.py -msgid "tin" -msgstr "錫塊" - -#. ~ Description for tin -#: lang/json/AMMO_from_json.py -msgid "Tin and pewter scraps. Usable in making ammo." -msgstr "錫及錫廢料。可用在製作彈藥。" - #: lang/json/AMMO_from_json.py msgid "medical tape" msgstr "醫用膠帶" @@ -442,6 +423,34 @@ msgstr "PG-7VL 93mm 火箭彈" msgid "93mm single-stage high-explosive ammunition for the RPG-7." msgstr "供 RPG-7 使用的 93mm 口徑高爆彈藥。" +#: lang/json/AMMO_from_json.py +msgid "PG-7VR 64mm/105mm rocket" +msgstr "PG-7VR 64mm/105mm 火箭彈" + +#. ~ Description for PG-7VR 64mm/105mm rocket +#: lang/json/AMMO_from_json.py +msgid "64mm/105mm high-explosive tandem ammunition for the RPG-7." +msgstr "用於 RPG-7 的 64mm/105mm 高爆串聯彈藥。" + +#: lang/json/AMMO_from_json.py +msgid "TBG-7V 105mm rocket" +msgstr "TBG-7V 105mm 火箭彈" + +#. ~ Description for TBG-7V 105mm rocket +#: lang/json/AMMO_from_json.py +msgid "105mm thermobaric ammunition for the RPG-7." +msgstr "用於 RPG-7 的 105mm 熱壓式彈藥。" + +#: lang/json/AMMO_from_json.py +msgid "OG-7V 40mm rocket" +msgstr "OG-7V 40mm 火箭彈" + +#. ~ Description for OG-7V 40mm rocket +#: lang/json/AMMO_from_json.py +msgid "" +"40mm high-explosive fragmentation antipersonnel ammunition for the RPG-7." +msgstr "用於 RPG-7 的 40mm 高爆破片反人員彈藥。" + #: lang/json/AMMO_from_json.py msgid "M235 66mm TPA rocket" msgstr "M235 66mm 高濃度自燃劑火箭" @@ -473,14 +482,14 @@ msgstr "藉由緩慢地燃燒木頭產生的易燃碳材。能用於需要純淨 #: lang/json/AMMO_from_json.py msgid "calcium carbide premix" msgid_plural "calcium carbide premix" -msgstr[0] "" +msgstr[0] "碳化鈣預混料" #. ~ Description for calcium carbide premix #: lang/json/AMMO_from_json.py msgid "" "A powdered mixture of coke and lime ready to be smelted into usable calcium " "carbide in an arc furnace." -msgstr "" +msgstr "焦炭和石灰的粉末混合物,可以在電弧爐中熔煉成可用的碳化鈣。" #: lang/json/AMMO_from_json.py msgid "coal" @@ -648,14 +657,14 @@ msgstr "在木炭製造過程中中斷的結果。除了成為木炭窯的燃料 #: lang/json/AMMO_from_json.py msgid "unfinished calcium carbide" -msgstr "" +msgstr "未完成的碳化鈣" #. ~ Description for unfinished calcium carbide #: lang/json/AMMO_from_json.py msgid "" "The incomplete process of converting coal and lime into calcium carbide. " "Useless in this state/" -msgstr "" +msgstr "將煤和石灰轉化為碳化鈣的未完成過程。此敘述無用處。" #: lang/json/AMMO_from_json.py msgid "chain link" @@ -805,7 +814,7 @@ msgstr "簡易金屬箭" msgid "" "A simple fletched steel arrow shaft with a flattened and sharpened tip. " "Stands a somewhat low chance of remaining intact once fired." -msgstr "" +msgstr "簡易且附有箭羽的鋼製箭桿,箭頭削平而且尖銳。射出後保持完好的機率頗低。" #: lang/json/AMMO_from_json.py msgid "aluminum broadhead arrow" @@ -816,7 +825,7 @@ msgstr "寬箭頭鋁箭" msgid "" "A fletched aluminum arrow shaft with a bladed tip. Useful for maximising " "damage to the target. Stands a good chance of remaining intact once fired." -msgstr "" +msgstr "附有箭羽的鋁製箭桿,箭頭呈扁片狀。適用於對目標造成的傷害最大化。射出後保持完好的機率頗高。" #: lang/json/AMMO_from_json.py msgid "aluminum field point arrow" @@ -827,7 +836,7 @@ msgstr "削尖鋁箭" msgid "" "A fletched aluminum arrow shaft with a pointed tip. Useful for piercing " "armor. Stands a good chance of remaining intact once fired." -msgstr "" +msgstr "附有箭羽的鋁製箭桿,箭頭呈尖銳狀。適用於貫穿護甲。射出後保持完好的機率頗高。" #: lang/json/AMMO_from_json.py msgid "aluminum small game arrow" @@ -839,7 +848,7 @@ msgid "" "A fletched aluminum arrow shaft with a blunt tip. Useful for hunting small " "woodland creatures without splattering them all over the ground. Stands a " "good chance of remaining intact once fired." -msgstr "" +msgstr "附有箭羽的鋁製箭桿,箭頭呈鈍頭狀。適用於狩獵小型林地動物,避免讓牠們變成血肉橫飛的一地碎肉。射出後保持完好的機率頗高。" #: lang/json/AMMO_from_json.py msgid "carbon fiber hunting arrow" @@ -851,7 +860,7 @@ msgid "" "A fletched carbon fiber arrow shaft with an expanding broadhead tip. Deals " "impressive damage to targets. Stands a good chance of remaining intact once" " fired." -msgstr "" +msgstr "附有箭羽的碳纖維箭桿,箭頭呈擴張的寬頭狀。對目標造成驚人的傷害。射出後保持完好的機率頗高。" #: lang/json/AMMO_from_json.py msgid "explosive arrow" @@ -921,7 +930,7 @@ msgstr "橡膠鈍頭木箭" msgid "" "A fletched wooden arrow shaft with a blunt rubber tip. Can stun weaker " "enemies. Stands a good chance of remaining intact once fired." -msgstr "" +msgstr "附有箭羽的木製箭桿,箭頭是鈍狀的橡膠頭。能夠擊暈較弱小的目標。射出後保持完好的機率頗高。" #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid "anesthetic" @@ -1398,7 +1407,7 @@ msgstr "粗製木弩箭" msgid "" "A crude pointed wooden crossbow bolt with a notch at the back. Stands a " "very low chance of remaining intact once fired." -msgstr "" +msgstr "一根粗糙的木製尖頭十字弓弩箭,箭尾有凹槽。射出後保持完好的機率非常低。" #: lang/json/AMMO_from_json.py msgid "simple wooden bolt" @@ -1409,7 +1418,7 @@ msgstr "簡易木弩箭" msgid "" "A simple fletched wooden crossbow bolt with a fire-hardened and sharpened " "tip. Stands a low chance of remaining intact once fired." -msgstr "" +msgstr "一根簡易附有箭羽的木製十字弓弩箭,箭頭經火烤硬化後且已削尖。射出後保持完好的機率略低。" #: lang/json/AMMO_from_json.py msgid "simple wooden small game bolt" @@ -1421,7 +1430,7 @@ msgid "" "A simple fletched wooden crossbow bolt with a blunted tip. Useful for " "hunting small woodland creatures without splattering them all over the " "ground. Stands a low chance of remaining intact once fired." -msgstr "" +msgstr "一根簡易附有箭羽的木製十字弓弩箭,箭頭呈鈍狀。適用於狩獵小型林地動物,避免讓牠們變成血肉橫飛的一地碎肉。射出後保持完好的機率頗低。" #: lang/json/AMMO_from_json.py msgid "makeshift wooden bolt" @@ -1432,7 +1441,7 @@ msgstr "粗製木弩箭" msgid "" "A simple fletched wooden crossbow bolt with a makeshift head. Stands a low " "chance of remaining intact once fired." -msgstr "" +msgstr "一根附有箭羽的十字弓弩箭,有著粗製的箭頭。射出後保持完好的機率頗低。" #: lang/json/AMMO_from_json.py msgid "wooden broadhead bolt" @@ -1444,7 +1453,7 @@ msgid "" "A fletched wooden crossbow bolt with a bladed tip. Useful for maximising " "damage to the target. Stands a decent chance of remaining intact once " "fired." -msgstr "" +msgstr "一根附有箭羽的木製十字弓弩箭,箭頭呈扁片狀。適用於對目標造成的傷害最大化。射出後保持完好的機率頗高。" #: lang/json/AMMO_from_json.py msgid "wooden bodkin bolt" @@ -1455,7 +1464,7 @@ msgstr "木製錐頭弩箭" msgid "" "A fletched wooden crossbow bolt with a pointed tip. Useful for piercing " "armor. Stands a decent chance of remaining intact once fired." -msgstr "" +msgstr "一根附有箭羽的木製十字弓弩箭,箭頭呈尖銳狀。適用於貫穿護甲。射出後保持完好的機率頗高。" #: lang/json/AMMO_from_json.py msgid "wooden small game bolt" @@ -1467,7 +1476,7 @@ msgid "" "A fletched wooden crossbow bolt with a blunt tip. Useful for hunting small " "woodland creatures without splattering them all over the ground. Stands a " "decent chance of remaining intact once fired." -msgstr "" +msgstr "一根附有箭羽的木製十字弓弩箭,箭頭呈鈍狀。適用於狩獵小型林地動物,避免讓牠們變成血肉橫飛的一地碎肉。射出後保持完好的機率頗高。" #: lang/json/AMMO_from_json.py msgid "simple metal bolt" @@ -1478,7 +1487,7 @@ msgstr "簡易金屬弩箭" msgid "" "A simple fletched steel crossbow bolt with a flattened and sharpened tip. " "Stands a somewhat low chance of remaining intact once fired." -msgstr "" +msgstr "一根附有箭羽的鋼製十字弓弩箭,箭頭削平而且尖銳。射出後保持完好的機率頗低。" #: lang/json/AMMO_from_json.py msgid "aluminum broadhead bolt" @@ -1493,18 +1502,18 @@ msgstr "帶有寬大尖端的十字弓鋁弩箭。用於最大化傷害在目標 #: lang/json/AMMO_from_json.py msgid "aluminum field point bolt" -msgstr "" +msgstr "鋁製錐頭弩箭" #. ~ Description for aluminum field point bolt #: lang/json/AMMO_from_json.py msgid "" "A fletched aluminum crossbow bolt with a pointed tip. Useful for piercing " "armor. Stands a good chance of remaining intact once fired." -msgstr "" +msgstr "一根附有箭羽的鋁製十字弓弩箭,箭頭呈尖銳狀。適用於貫穿護甲。射出後保持完好的機率頗高。" #: lang/json/AMMO_from_json.py msgid "aluminum small game bolt" -msgstr "" +msgstr "鋁製狩獵弩箭" #. ~ Description for aluminum small game bolt #: lang/json/AMMO_from_json.py @@ -1512,7 +1521,7 @@ msgid "" "A fletched aluminum crossbow bolt with a blunt tip. Useful for hunting " "small woodland creatures without splattering them all over the ground. " "Stands a good chance of remaining intact once fired." -msgstr "" +msgstr "附有箭羽的鋁製十字弓弩箭,箭頭呈鈍頭狀。適用於狩獵小型林地動物,避免讓牠們變成血肉橫飛的一地碎肉。射出後保持完好的機率頗高。" #: lang/json/AMMO_from_json.py msgid "explosive crossbow bolt" @@ -1585,7 +1594,7 @@ msgstr[0] "生物柴油" msgid "" "Vegetable oil- or animal fat-based diesel fuel consisting of long-chain " "alkyl (methyl, ethyl, or propyl) esters." -msgstr "" +msgstr "以植物油或動物脂肪為基底的柴油燃料,由長鏈烷基(甲基,乙基或丙基)酯組成。" #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid "gasoline" @@ -1625,7 +1634,7 @@ msgstr "以汽油混合一些其他成份, 讓它可以黏在物體表面並持 #: lang/json/AMMO_from_json.py msgid "gelled gasoline" msgid_plural "gelled gasoline" -msgstr[0] "" +msgstr[0] "膠凝汽油" #. ~ Description for gelled gasoline #: lang/json/AMMO_from_json.py @@ -1633,12 +1642,12 @@ msgid "" "A flammable gel composed of gasoline and dissolved shavings of polystyrene, " "roughly similar in properties to napalm b. It's meant to be used with a " "flamethrower." -msgstr "" +msgstr "一種易燃的凝膠,由汽油和聚苯乙烯的溶解刨屑所組成,其性質跟凝固汽油b類似。它能與火焰噴射器一起使用。" #: lang/json/AMMO_from_json.py msgid "flamethrower fuel" msgid_plural "flamethrower fuel" -msgstr[0] "" +msgstr[0] "火焰噴射器燃料" #. ~ Description for flamethrower fuel #: lang/json/AMMO_from_json.py @@ -1646,12 +1655,12 @@ msgid "" "A mixture of gasoline and diesel oil in equal parts. Its combustion " "properties make it unfit for applications where you would use any of them " "separately, but it can be used to feed a flamethrower." -msgstr "" +msgstr "汽油和柴油的等份混合物。燃燒的特性使得它不適合單獨使用,但它可做為火焰噴射器的燃料。" #: lang/json/AMMO_from_json.py msgid "autoclave pouch" msgid_plural "autoclave pouches" -msgstr[0] "" +msgstr[0] "高壓滅菌包裝袋" #. ~ Description for autoclave pouch #: lang/json/AMMO_from_json.py @@ -1659,7 +1668,7 @@ msgid "" "This is a medical device that bears the approval of the FDA (Food and Drug " "Administration). If used properly, these pouches can keep things sterile " "indefinitely." -msgstr "" +msgstr "這是一種獲得 FDA(食品和藥品管理局)批准的醫療器材。如果使用得當,這些小袋可以無限期地保持內容物為無菌狀態。" #: lang/json/AMMO_from_json.py msgid "shrapnel" @@ -1701,7 +1710,7 @@ msgstr "雷筒鋼鏢彈" msgid "" "A prepared blunderbuss shot of homemade flechette made out of nails. Shreds" " armor." -msgstr "" +msgstr "一顆裝好的雷筒霰彈,以釘子製成的自製鋼標彈作為彈丸。能夠擊穿裝甲。" #: lang/json/AMMO_from_json.py msgid "throwing stick" @@ -1717,14 +1726,14 @@ msgstr "只是一根木棍被雕刻成適合丟擲的形狀, 並不是迴旋鏢, #: lang/json/AMMO_from_json.py msgid "bolas" msgid_plural "bolases" -msgstr[0] "" +msgstr[0] "絆腳投擲索" #. ~ Description for bolas #: lang/json/AMMO_from_json.py msgid "" "Some ropes with weights, designed to tangle the legs of a target when " "thrown, usually at an animal. Used by the Gauchos of Argentina." -msgstr "" +msgstr "一些綁有重物的繩索,投擲到目標(通常是動物)身上以纏繞住目標的腿。由阿根廷的高喬人所使用。" #: lang/json/AMMO_from_json.py msgid "net" @@ -1760,7 +1769,7 @@ msgstr "10mm Auto 全金屬彈" msgid "" "A jacketed 10mm Auto round. The 10mm Auto cartridge is a rather powerful " "handgun round and the progenitor to the more popular .40 S&W." -msgstr "" +msgstr "金屬包覆的 10mm Auto 子彈。10mm Auto 子彈是相當強力的手槍子彈,是更受歡迎的 .40 S&W 的始祖。" #: lang/json/AMMO_from_json.py msgid "reloaded 10mm Auto FMJ" @@ -2021,7 +2030,7 @@ msgstr "5.56 NATO 曳光彈 (重填彈)" #: lang/json/AMMO_from_json.py msgid ".270 Winchester JSP" -msgstr "" +msgstr ".270 溫徹斯特半金屬包覆彈" #. ~ Description for .270 Winchester JSP #: lang/json/AMMO_from_json.py @@ -2031,6 +2040,8 @@ msgid "" "most popular rifle cartridges for hunting and silhouette shooting. It is a " "powerful round capable of taking down large targets with ease." msgstr "" +".270 溫徹斯特彈藥使用 130 格令的軟頭彈。 .270 " +"子彈最初並沒有成功,但幾十年來它已成為最受歡迎的狩獵和剪影射擊用的步槍子彈之一。這是一種強力的子彈,能夠輕易擊倒大型目標。" #: lang/json/AMMO_from_json.py msgid "reloaded .270 Winchester JSP" @@ -2113,31 +2124,33 @@ msgstr ".30-06 M2 穿甲彈 (重填彈)" #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid ".300 AAC Blackout" -msgstr "" +msgstr ".300 AAC Blackout 子彈" #. ~ Description for .300 AAC Blackout #: lang/json/AMMO_from_json.py msgid "" -".300 AAC Blackout is an intermediate cartridge that achieves ballistics " -"similar to the 7.62x39 but allows use on the AR-15 platform. The round is " -"necked-up from the 5.56mm NATO, but feeds from a STANAG magazine. It " -"requires a specific barrel, so will not work in a standard M4 or similar " -"carbine. This loading is supersonic." +"A .300 AAC Blackout round with a 125gr open tip match bullet. 300 BLK is an" +" intermediate cartridge necked up from 5.56x45mm, designed to achieve " +"similar ballistics to 7.62x39mm. It is compatible with standard AR-15 lower" +" receivers and will feed from STANAG magazines." msgstr "" +".300 AAC Blackout 子彈,配有 125 格令的開尖比賽彈頭。 300 BLK 是從 5.56x45mm " +"改良而來的中間型威力槍彈,設計用於達到 7.62x39mm 的類似彈道。它能兼容於標準 AR-15 採用STANAG彈匣供彈。" #. ~ Description for .300 AAC Blackout #: lang/json/AMMO_from_json.py msgid "" -".300 AAC Blackout is an intermediate cartridge that achieves ballistics " -"similar to the 7.62x39 but allows use on the AR-15 platform. The round is " -"necked-up from the 5.56mm NATO, but feeds from a STANAG magazine. It " -"requires a specific barrel, so will not work in a standard M4 or similar " -"carbine. This loading is subsonic." +"A subsonic .300 AAC Blackout round with a 220gr open tip match bullet. 300 " +"BLK is an intermediate cartridge necked up from 5.56x45mm, designed to " +"achieve similar ballistics to 7.62x39mm. It is compatible with standard " +"AR-15 lower receivers and will feed from STANAG magazines." msgstr "" +"亞音速 .300 AAC Blackout 子彈,配有 220 格令的開尖比賽彈頭。 300 BLK 是從 5.56x45mm " +"改良而來的中間型威力槍彈,設計用於達到 7.62x39mm 的類似彈道。它能兼容於標準 AR-15 採用STANAG彈匣供彈。" #: lang/json/AMMO_from_json.py msgid "reloaded .300 AAC Blackout" -msgstr "" +msgstr ".300 AAC Blackout 重填彈" #. ~ Description for reloaded .300 AAC Blackout #: lang/json/AMMO_from_json.py @@ -2148,6 +2161,8 @@ msgid "" "requires a specific barrel, so will not work in a standard M4 or similar " "carbine. This one has been hand-reloaded." msgstr "" +"300 BLK 設計用於達到 7.62x39mm 的類似彈道,也能兼容於 AR-15 。這種子彈是從 5.56x45mm " +"改良而來的中間型威力槍彈,但是需採用 STANAG 彈匣供彈。它需要特定的槍管,因此不適用於標準的 M4 或類似的卡賓槍。這個是手工重填裝的。" #: lang/json/AMMO_from_json.py msgid ".308 Winchester" @@ -2221,11 +2236,11 @@ msgid "" "Jacketed .357 magnum ammunition. The .357 magnum round is derived from the " "earlier .38 special, with a marginally longer case and generating greater " "pressure." -msgstr "" +msgstr "金屬包覆的 .357 麥格農彈藥。這種 .357 麥格農子彈是源自於早期的 .38 特殊彈,外殼略長且產生更大的壓力。" #: lang/json/AMMO_from_json.py msgid ".357 magnum JHP" -msgstr "" +msgstr ".357 麥格農空尖彈" #. ~ Description for .357 magnum JHP #: lang/json/AMMO_from_json.py @@ -2233,7 +2248,7 @@ msgid "" "Jacketed hollow point .357 magnum ammunition. The .357 magnum round is " "derived from the earlier .38 special, with a marginally longer case and " "generating greater pressure." -msgstr "" +msgstr "金屬包覆空尖彈頭的 .357 麥格農彈藥。這種 .357 麥格農子彈是源自於早期的 .38 特殊彈,外殼略長且產生更大的壓力。" #: lang/json/AMMO_from_json.py msgid "reloaded .357 Magnum FMJ" @@ -2342,11 +2357,11 @@ msgid "" "This .38 Special cartridge is loaded with a 200gr cast lead hollowpoint and " "23gr of blackpowder. While it's much slower than a regular .38, it has " "tremendous stopping power." -msgstr "" +msgstr "這款 .38 特殊子彈有 200 格令的鑄鉛空尖彈頭和 23 格令的黑火藥。雖然它比普通的 .38 慢得多,但卻具有巨大的嚇阻能力。" #: lang/json/AMMO_from_json.py msgid ".380 ACP FMJ" -msgstr "" +msgstr ".380 ACP 全金屬被甲彈" #. ~ Description for .380 ACP FMJ #: lang/json/AMMO_from_json.py @@ -2356,10 +2371,12 @@ msgid "" "consider carrying. One should be careful not to chamber it in 9x18mm " "Makarov or 9x19mm firearms." msgstr "" +".380 柯爾特自動手槍子彈使用黃銅包覆的 95 格令彈頭。在小型手槍中受歡迎超過一世紀之久,常被認為是攜帶型中最弱的口徑。應該注意不要將其放入 " +"9x18mm 馬卡洛夫手槍或 9x19mm 槍械中。" #: lang/json/AMMO_from_json.py msgid ".380 ACP JHP" -msgstr "" +msgstr ".380 ACP 空尖彈" #. ~ Description for .380 ACP JHP #: lang/json/AMMO_from_json.py @@ -2369,10 +2386,12 @@ msgid "" "recommended defensive caliber. One should be careful not to chamber it in " "9x18mm Makarov or 9x19mm firearms." msgstr "" +".380 柯爾特自動手槍子彈使用 95 格令金屬包覆尖端中空的彈頭。這是款流行的小型隱藏式備用手槍,是最不被推薦的防禦性口徑。應該注意不要將其放入 " +"9x18mm 馬卡洛夫手槍或 9x19mm 槍械中。" #: lang/json/AMMO_from_json.py msgid ".380 ACP +P" -msgstr "" +msgstr ".380 ACP 高壓彈" #. ~ Description for .380 ACP +P #: lang/json/AMMO_from_json.py @@ -2382,18 +2401,21 @@ msgid "" " more accurate than practice ammo. One should be careful not to chamber it " "in 9x18mm Makarov or 9x19mm firearms." msgstr "" +"超壓 .380 柯爾特自動手槍子彈使用 90 " +"格令金屬包覆尖端中空的彈頭。這樣防禦性的裝填旨在最大限度地提高性能,並且能比練習用子彈更加準確。應該注意不要將其放入 9x18mm 馬卡洛夫手槍或 " +"9x19mm 槍械中。" #: lang/json/AMMO_from_json.py msgid "reloaded .380 ACP FMJ" -msgstr "" +msgstr ".380 ACP 全金屬被甲彈(重填彈)" #: lang/json/AMMO_from_json.py msgid "reloaded .380 ACP JHP" -msgstr "" +msgstr ".380 ACP 空尖彈(重填彈)" #: lang/json/AMMO_from_json.py msgid "reloaded .380 ACP +P" -msgstr "" +msgstr ".380 ACP 高壓彈(重填彈)" #: lang/json/AMMO_from_json.py msgid ".38 Super FMJ" @@ -3482,6 +3504,17 @@ msgid "" " tube. Designed to be highly effective against vehicles and structures." msgstr "" +#: lang/json/AMMO_from_json.py +msgid "paralyzing barb" +msgstr "麻痺倒鉤" + +#. ~ Description for paralyzing barb +#: lang/json/AMMO_from_json.py +msgid "" +"Tiny droplets of venom trickle out of the sponge-like tissue of this sharp " +"barb." +msgstr "微小的毒液滴從這個鋒利的倒鉤的海綿狀組織中滴出。" + #: lang/json/AMMO_from_json.py msgid "sprayable toxic gas" msgstr "噴灑式毒氣" @@ -3506,14 +3539,14 @@ msgstr "混合了滅蕈藥, 使用在噴射器上的噴灑劑。最好給那些 #: lang/json/AMMO_from_json.py msgid "sprayable insecticide" -msgstr "" +msgstr "噴灑式殺蟲劑" #. ~ Description for sprayable insecticide #: lang/json/AMMO_from_json.py msgid "" "Strong sprayable insecticide ammo for the chemical thrower. Best be used " "with some kind of mask or mouth protection." -msgstr "" +msgstr "用於化學藥劑噴灑器的強力噴灑式殺蟲劑彈藥。使用時最好能戴上面部的護具。" #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid "paper cartridge" @@ -4005,14 +4038,35 @@ msgstr "一個沉重的鋼塊。能用於一些物品製作配方。" #: lang/json/AMMO_from_json.py msgid "door hinge" -msgstr "" +msgstr "門鉸鏈" #. ~ Description for door hinge #: lang/json/AMMO_from_json.py msgid "" "A small metal hinge with two metal plates with screw holes. Useful for " "making doors." -msgstr "" +msgstr "一組小型金屬鉸鏈,有兩個螺絲孔的金屬板。用於製作門。" + +#: lang/json/AMMO_from_json.py +msgid "tin powder" +msgstr "錫粉" + +#. ~ Description for tin powder +#: lang/json/AMMO_from_json.py +msgid "" +"A fine gray powder composed of tin, usable for making solder and lining " +"containers to prevent corrosion." +msgstr "由錫組成的細灰色粉末,可用於製造焊料和防止腐蝕的容器內膜。" + +#: lang/json/AMMO_from_json.py +msgid "solder" +msgstr "焊料" + +#. ~ Description for solder +#: lang/json/AMMO_from_json.py +msgid "" +"A small spool of solder, able to be used in ammunition and electronics." +msgstr "一小捲的焊錫, 能夠使用在彈藥及電子產品上。" #: lang/json/AMMO_from_json.py msgid "incendiary" @@ -4117,17 +4171,17 @@ msgstr "鈽電池" msgid "" "Some free-floating battery charge. This can be reloaded into rechargable " "battery cells, but can never be unloaded." -msgstr "" +msgstr "一些自由浮動的電池料。可以填進可充式電池內。但永遠不能被取出。" #: lang/json/AMMO_from_json.py msgid "chunk of rubber" msgid_plural "chunks of rubber" -msgstr[0] "" +msgstr[0] "橡膠塊" #. ~ Description for chunk of rubber #: lang/json/AMMO_from_json.py msgid "A chunk of useful rubber, can be molded easily." -msgstr "" +msgstr "一大塊有用的橡膠,可以很容易地塑型。" #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid "lead pellets" @@ -5244,7 +5298,7 @@ msgstr "將幾疊紙用膠帶纏繞成的紙護臂。" #: lang/json/ARMOR_from_json.py msgid "pair of scrap arm guards" msgid_plural "pairs of scrap arm guards" -msgstr[0] "" +msgstr[0] "廢金屬護臂" #. ~ Description for pair of scrap arm guards #: lang/json/ARMOR_from_json.py @@ -5252,7 +5306,7 @@ msgid "" "A pair of arm guards made from scraps of metal secured by simple strings; " "the loose collection of plates provides decent but not the most convenient " "protection." -msgstr "" +msgstr "一對由廢金屬製成的護臂,用簡單的繩子固定;這些鬆鬆的護甲板提供了不錯的防禦,但卻不太方便行動。" #: lang/json/ARMOR_from_json.py msgid "pair of neoprene arm sleeves" @@ -5459,7 +5513,7 @@ msgid "" "A suit of armor made from scraps of metal secured by simple strings; the " "loose collection of plates provides decent but not the most convenient " "protection." -msgstr "" +msgstr "一套由廢金屬製成的護甲,用簡單的繩子固定;這些鬆鬆的護甲板提供了不錯的防禦,但卻不太方便行動。" #: lang/json/ARMOR_from_json.py msgid "camo tank top" @@ -5481,38 +5535,6 @@ msgstr[0] "籃球短褲" msgid "A pair of basketball shorts. Comfortable and light." msgstr "一件舒適又輕盈的籃球短褲。" -#: lang/json/ARMOR_from_json.py -msgid "backpack" -msgid_plural "backpacks" -msgstr[0] "背包" - -#. ~ Description for backpack -#: lang/json/ARMOR_from_json.py -msgid "A small backpack. Good storage for a little encumbrance." -msgstr "一個小背包, 有許多的儲物空間卻只會增加一點點累贅。" - -#: lang/json/ARMOR_from_json.py -msgid "giant novelty backpack" -msgid_plural "giant novelty backpacks" -msgstr[0] "巨大的新奇背包" - -#. ~ Description for giant novelty backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A huge fabric backpack made mostly as a joke before the cataclysm. Now, " -"it's still rather silly, but it can store a lot of stuff." -msgstr "在大災變之前, 一個巨大的布料背包多被視為是個笑話。現在, 它仍然相當愚蠢, 但它可以存儲很多東西。" - -#: lang/json/ARMOR_from_json.py -msgid "leather backpack" -msgid_plural "leather backpacks" -msgstr[0] "皮革背包" - -#. ~ Description for leather backpack -#: lang/json/ARMOR_from_json.py -msgid "A small leather backpack. Good storage for a little encumbrance." -msgstr "一個小型皮革背包。不太累贅而且適合儲物。" - #: lang/json/ARMOR_from_json.py msgid "balaclava" msgid_plural "balaclavas" @@ -5534,8 +5556,8 @@ msgstr[0] "刀鞘 (肩帶)" #. ~ Use action holster_msg for scabbard. #. ~ Use action holster_msg for sheath. #. ~ Use action holster_msg for survivor belt. -#. ~ Use action holster_msg for hiking backpack. #. ~ Use action holster_msg for survivor utility belt. +#. ~ Use action holster_msg for hiking backpack. #. ~ Use action holster_msg for pair of boots. #. ~ Use action holster_msg for pair of bone armor boots. #. ~ Use action holster_msg for pair of turnout boots. @@ -5560,7 +5582,8 @@ msgstr[0] "刀鞘 (肩帶)" #. ~ Use action holster_msg for pair of rollerblades. #. ~ Use action holster_msg for pair of rollerskates. #. ~ Use action holster_msg for C.R.I.T web belt. -#: lang/json/ARMOR_from_json.py +#. ~ Use action holster_msg for hollow cane. +#: lang/json/ARMOR_from_json.py lang/json/GENERIC_from_json.py #, no-python-format msgid "You sheath your %s" msgstr "你把你的 %s 收鞘。" @@ -5568,7 +5591,9 @@ msgstr "你把你的 %s 收鞘。" #. ~ Use action holster_prompt for baldric. #. ~ Use action holster_prompt for back scabbard. #. ~ Use action holster_prompt for scabbard. -#: lang/json/ARMOR_from_json.py +#. ~ Use action holster_prompt for hollow cane. +#: lang/json/ARMOR_from_json.py lang/json/ARMOR_from_json.py +#: lang/json/GENERIC_from_json.py msgid "Sheath sword" msgstr "刀劍收鞘" @@ -6410,14 +6435,14 @@ msgstr "一副鐵製胸甲, 是板甲的重要部分。即使全身鎧甲走向 #: lang/json/ARMOR_from_json.py msgid "scrap cuirass" msgid_plural "scrap cuirasses" -msgstr[0] "" +msgstr[0] "廢金屬胸甲" #. ~ Description for scrap cuirass #: lang/json/ARMOR_from_json.py msgid "" "A cuirass made from scraps of metal secured by simple strings; the loose " "collection of plates provides decent but not the most convenient protection." -msgstr "" +msgstr "一件由廢金屬製成的胸甲,用簡單的繩子固定;這些鬆鬆的護甲板提供了不錯的防禦,但卻不太方便行動。" #: lang/json/ARMOR_from_json.py msgid "dinosaur suit" @@ -6431,16 +6456,6 @@ msgid "" " encumbering and has little storage but is very warm." msgstr "一件擬恐龍外形的全身式裝束。相當累贅且只有一點儲物空間, 但是很保暖。" -#: lang/json/ARMOR_from_json.py -msgid "dive bag" -msgid_plural "dive bags" -msgstr[0] "潛水袋" - -#. ~ Description for dive bag -#: lang/json/ARMOR_from_json.py -msgid "A lightweight mesh backpack, commonly worn by swimmers and divers." -msgstr "一個輕量的網狀背包, 常用於游泳者和潛水者。" - #: lang/json/ARMOR_from_json.py msgid "down-filled blanket" msgid_plural "down-filled blankets" @@ -6469,14 +6484,14 @@ msgstr "一個用頂級工藝打造的輕量、靈活的防彈背心。裡面安 #: lang/json/ARMOR_from_json.py msgid "lamellar kevlar vest" msgid_plural "lamellar kevlar vests" -msgstr[0] "" +msgstr[0] "層狀結構防彈背心" #. ~ Description for lamellar kevlar vest #: lang/json/ARMOR_from_json.py msgid "" "A lamellar kevlar vest, there are intricately cut voids usually filled with " "stitched in ceramic disks, you could repair the stitching if needed" -msgstr "" +msgstr "層狀結構的凱夫勒質材的防彈背心,有錯綜複雜的切口間隙並縫入陶瓷盤來填滿,需要時你可以進行縫補。" #: lang/json/ARMOR_from_json.py msgid "dress" @@ -6510,17 +6525,6 @@ msgstr[0] "婚紗" msgid "A beautiful white wedding dress. What good will it be now?" msgstr "一件美麗的白色婚紗。現在還適合穿嗎?" -#: lang/json/ARMOR_from_json.py -msgid "duffel bag" -msgid_plural "duffel bags" -msgstr[0] "行李袋" - -#. ~ Description for duffel bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A huge duffel bag. Provides plenty of storage, but is severely encumbering." -msgstr "一個巨大的行李袋, 提供充足的儲物空間, 但造成嚴重的累贅。" - #: lang/json/ARMOR_from_json.py msgid "tactical dump pouch" msgid_plural "tactical dump pouches" @@ -7178,13 +7182,13 @@ msgstr "一雙強韌的手套, 設計來進行粗重的日常工作。" #: lang/json/ARMOR_from_json.py msgid "pair of cut resistant gloves" msgid_plural "pairs of cut resistant gloves" -msgstr[0] "" +msgstr[0] "防割手套" #. ~ Description for pair of cut resistant gloves #: lang/json/ARMOR_from_json.py msgid "" "A pair of cut resistant gloves, useful when rapidly breaking down carcasses." -msgstr "" +msgstr "一雙防割手套,在快速分解屠宰屍體時很有用。" #: lang/json/ARMOR_from_json.py msgid "pair of hand wraps" @@ -7778,14 +7782,14 @@ msgstr "一條堅固且延伸到頸部的防風帽, 附有防毒面具以保護 #: lang/json/ARMOR_from_json.py msgid "scrap helmet" msgid_plural "scrap helmets" -msgstr[0] "" +msgstr[0] "廢金屬頭盔" #. ~ Description for scrap helmet #: lang/json/ARMOR_from_json.py msgid "" "A helmet made from scraps of metal secured by simple strings; the loose " "collection of plates provides decent but not the most convenient protection." -msgstr "" +msgstr "一頂由廢金屬製成的頭盔,用簡單的繩子固定;這些鬆鬆的護甲板提供了不錯的防禦,但卻不太方便行動。" #: lang/json/ARMOR_from_json.py msgid "skid lid" @@ -8129,16 +8133,6 @@ msgid "" "off dramatically before fighting any foes!" msgstr "飄逸的長袍, 穿起來簡單又舒適。別忘了在與任何敵人作戰之前要戲劇性地把它扯下!" -#: lang/json/ARMOR_from_json.py -msgid "jerrypack" -msgid_plural "jerrypacks" -msgstr[0] "油桶背包" - -#. ~ Description for jerrypack -#: lang/json/ARMOR_from_json.py -msgid "A jerrycan modified to be worn in a similar manner to a backpack." -msgstr "一個改裝過的油桶, 可以像背包一樣穿在身上。" - #: lang/json/ARMOR_from_json.py msgid "sports jersey" msgid_plural "sports jerseys" @@ -8317,12 +8311,12 @@ msgstr "一件厚實的短袖連身服, 有點像給犯人穿的。提供了不 #: lang/json/ARMOR_from_json.py msgid "Hub 01 jumpsuit" msgid_plural "Hub 01 jumpsuits" -msgstr[0] "" +msgstr[0] "Hub 01 連身衣" #. ~ Description for Hub 01 jumpsuit #: lang/json/ARMOR_from_json.py msgid "A brown jumpsuit worn by the staff of Hub 01." -msgstr "" +msgstr "Hub 01 的工作人員所穿的棕色連身衣。" #: lang/json/ARMOR_from_json.py msgid "XL jumpsuit" @@ -8437,7 +8431,7 @@ msgstr "一件日本的傳統長袍, 長度及踝, 有一條可以纏繞身體 #: lang/json/ARMOR_from_json.py msgid "yukata" msgid_plural "yukatas" -msgstr[0] "" +msgstr[0] "浴衣" #. ~ Description for yukata #: lang/json/ARMOR_from_json.py @@ -8536,14 +8530,14 @@ msgstr "由許多皮革縫製成的袋子。雖然裝的不多, 但是很好攜 #: lang/json/ARMOR_from_json.py msgid "ammo pouch" msgid_plural "ammo pouches" -msgstr[0] "" +msgstr[0] "彈藥小袋" #. ~ Description for ammo pouch #: lang/json/ARMOR_from_json.py msgid "" "A small pouch that can be used to store most types of small ammunition, " "rockets will not fit. Activate to store ammunition." -msgstr "" +msgstr "一個可以用來存放大部分類型小型彈藥的小袋子,火箭是放不進去的。使用它來存取彈藥。" #: lang/json/ARMOR_from_json.py msgid "leg splint" @@ -8649,7 +8643,7 @@ msgstr "將幾疊紙用膠帶纏繞成的紙護腿。" #: lang/json/ARMOR_from_json.py msgid "pair of scrap leg guards" msgid_plural "pairs of scrap leg guards" -msgstr[0] "" +msgstr[0] "廢金屬護腿" #. ~ Description for pair of scrap leg guards #: lang/json/ARMOR_from_json.py @@ -8657,7 +8651,7 @@ msgid "" "A pair of leg guards made from scraps of metal secured by simple strings; " "the loose collection of plates provides decent but not the most convenient " "protection." -msgstr "" +msgstr "一對由廢金屬製成的護腿,用簡單的繩子固定;這些鬆鬆的護甲板提供了不錯的防禦,但卻不太方便行動。" #: lang/json/ARMOR_from_json.py msgid "pair of drop leg pouches" @@ -8812,12 +8806,12 @@ msgstr "一件長袖的上衣, 能夠幫助保持體溫。" #: lang/json/ARMOR_from_json.py msgid "sleeveless underwear top" msgid_plural "sleeveless underwear tops" -msgstr[0] "" +msgstr[0] "無袖內衣" #. ~ Description for sleeveless underwear top #: lang/json/ARMOR_from_json.py msgid "A sleeveless underwear top that helps to maintain body temperature." -msgstr "" +msgstr "一件無袖內衣,能幫助保持體溫。" #: lang/json/ARMOR_from_json.py msgid "long-sleeved shirt" @@ -8886,28 +8880,6 @@ msgstr[0] "法式女僕頭飾" msgid "A frilly white headpiece." msgstr "一個白色的褶邊頭飾。" -#: lang/json/ARMOR_from_json.py -msgid "makeshift knapsack" -msgid_plural "makeshift knapsacks" -msgstr[0] "粗製背包" - -#. ~ Description for makeshift knapsack -#: lang/json/ARMOR_from_json.py -msgid "" -"A pair of pants with the bottom ends tied with string, and then passed " -"through the belt loops so the knapsack can be carried on the back." -msgstr "一條底部被繩索綁起來的褲子, 繩索接著穿過腰帶圈, 使得整個包能夠背在背上。" - -#: lang/json/ARMOR_from_json.py -msgid "makeshift sling" -msgid_plural "makeshift slings" -msgstr[0] "粗製斜肩袋" - -#. ~ Description for makeshift sling -#: lang/json/ARMOR_from_json.py -msgid "A large sheet tied into a crude, over-the-shoulder sling." -msgstr "用一大塊布罩繞過肩膀綁成的粗糙的斜肩袋。" - #: lang/json/ARMOR_from_json.py msgid "ballistic mask" msgid_plural "ballistic masks" @@ -8968,16 +8940,6 @@ msgid "" "rioters to hide their identity." msgstr "這是一件用袖子綁在臉上的T卹, 通常是由暴徒穿著隱藏自己的身份。" -#: lang/json/ARMOR_from_json.py -msgid "messenger bag" -msgid_plural "messenger bags" -msgstr[0] "郵差包" - -#. ~ Description for messenger bag -#: lang/json/ARMOR_from_json.py -msgid "Light and easy to wear, but doesn't offer much storage." -msgstr "輕便好背的包包, 但是沒有多少儲物空間。" - #: lang/json/ARMOR_from_json.py msgid "pair of mittens" msgid_plural "pairs of mittens" @@ -8988,19 +8950,6 @@ msgstr[0] "連指手套" msgid "A pair of warm mittens. They are extremely cumbersome." msgstr "一雙保暖的連指手套。只是非常累贅。" -#: lang/json/ARMOR_from_json.py -msgid "MOLLE pack" -msgid_plural "MOLLE packs" -msgstr[0] "輕型戰術背包" - -#. ~ Description for MOLLE pack -#: lang/json/ARMOR_from_json.py -msgid "" -"The Modular Lightweight Load-carrying Equipment is an advanced military " -"backpack. Covered with pockets and straps, it strikes a fine balance " -"between storage space and encumbrance." -msgstr "輕型戰術背包, 全稱是模組化輕型承重戰術背包。先進的軍用背包, 上面還佈滿著索帶和小口袋, 兼顧容量和行動便利性。" - #: lang/json/ARMOR_from_json.py msgid "motorcycle armor" msgid_plural "motorcycle armors" @@ -9392,16 +9341,6 @@ msgid "" "better than nothing." msgstr "一個用湯鍋做成的頭盔。雖然保護性不是很好, 但聊勝於無。" -#: lang/json/ARMOR_from_json.py -msgid "purse" -msgid_plural "purses" -msgstr[0] "皮包" - -#. ~ Description for purse -#: lang/json/ARMOR_from_json.py -msgid "A bit cumbersome to wear, but provides some storage." -msgstr "穿戴後稍微累贅, 但是有一些儲物空間。" - #: lang/json/ARMOR_from_json.py msgid "quiver" msgid_plural "quivers" @@ -9477,28 +9416,6 @@ msgid "" "hidden pockets." msgstr "一件寬鬆有袖子的外衣, 外衣內縫有未知確切數量的內口袋。" -#: lang/json/ARMOR_from_json.py -msgid "military rucksack" -msgid_plural "military rucksacks" -msgstr[0] "軍用背包" - -#. ~ Description for military rucksack -#: lang/json/ARMOR_from_json.py -msgid "A huge military rucksack, provides a lot of storage." -msgstr "一個很大的軍用背包, 有相當多的儲物空間。" - -#: lang/json/ARMOR_from_json.py -msgid "runner pack" -msgid_plural "runner packs" -msgstr[0] "慢跑背包" - -#. ~ Description for runner pack -#: lang/json/ARMOR_from_json.py -msgid "" -"The obvious choice for outdoor athletes, this ergonomic backpack is light " -"and easy to wear, ensuring comfort when carrying heavy and bulky items." -msgstr "戶外運動員的首選, 這符合人體工學的背包重量很輕, 不易磨損, 在攜帶笨重物品時也能確保舒適。" - #: lang/json/ARMOR_from_json.py msgid "scabbard" msgid_plural "scabbards" @@ -9841,18 +9758,6 @@ msgstr[0] "無袖束腰外衣" msgid "A sleeveless cloth garment that covers the torso and legs." msgstr "無袖布質連身服, 覆蓋了軀幹與腿部。" -#: lang/json/ARMOR_from_json.py -msgid "sling pack" -msgid_plural "sling packs" -msgstr[0] "斜肩袋" - -#. ~ Description for sling pack -#: lang/json/ARMOR_from_json.py -msgid "" -"A simple single-sling backpack. Easier to access than a normal backpack, " -"but can't comfortably hold as much." -msgstr "一個簡單的斜肩袋。比一般背包更易取得, 不過容量就比較小了。" - #: lang/json/ARMOR_from_json.py msgid "snuggie" msgid_plural "snuggies" @@ -10096,8 +10001,8 @@ msgid_plural "survivor belts" msgstr[0] "生存者腰帶" #. ~ Use action holster_prompt for survivor belt. -#. ~ Use action holster_prompt for hiking backpack. #. ~ Use action holster_prompt for survivor utility belt. +#. ~ Use action holster_prompt for hiking backpack. #. ~ Use action holster_prompt for C.R.I.T web belt. #: lang/json/ARMOR_from_json.py msgid "Sheath blade" @@ -10111,18 +10016,6 @@ msgid "" "comfortable to wear. Activate to sheathe/draw a weapon." msgstr "一條自製工具皮帶, 上面縫著許多扣帶與小袋子, 還繫著一個刀鞘。細緻的做工讓它穿起來既耐用又舒服, 使用它來收入/取出一把小型刀具。" -#: lang/json/ARMOR_from_json.py -msgid "survivor duffel bag" -msgid_plural "survivor duffel bags" -msgstr[0] "生存者行李袋" - -#. ~ Description for survivor duffel bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built heavy duffel bag. Durable and carefully crafted to hold as " -"much stuff as possible." -msgstr "一個厚重的訂製行李袋。耐用且細心的做工讓它盡可能地裝下夠多的東西。" - #: lang/json/ARMOR_from_json.py msgid "survivor goggles" msgid_plural "pairs of survivor goggles" @@ -10135,42 +10028,6 @@ msgid "" "built to last, they provide excellent protection from environmental dangers." msgstr "一副訂製的裝甲護目鏡, 配上了有色鏡片。耐用且舒適, 能提供絕佳的防護能力以抵禦環境危害。" -#: lang/json/ARMOR_from_json.py -msgid "survivor backpack" -msgid_plural "survivor backpacks" -msgstr[0] "生存者背包" - -#. ~ Description for survivor backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built backpack. Durable and carefully crafted to hold as much " -"stuff as possible." -msgstr "一個手工製的背包。耐用且細心的做工讓它盡可能地裝下夠多的東西。" - -#: lang/json/ARMOR_from_json.py -msgid "survivor rucksack" -msgid_plural "survivor rucksacks" -msgstr[0] "生存者旅行背包" - -#. ~ Description for survivor rucksack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built heavy backpack. Durable and carefully crafted to hold as " -"much stuff as possible." -msgstr "一個厚重的訂製的背包。耐用且細心的做工讓它盡可能地裝下夠多的東西。" - -#: lang/json/ARMOR_from_json.py -msgid "survivor runner pack" -msgid_plural "survivor runner packs" -msgstr[0] "生存者慢跑背包" - -#. ~ Description for survivor runner pack -#: lang/json/ARMOR_from_json.py -msgid "" -"A custom-built lightweight runner pack. Durable and carefully crafted to " -"hold as much stuff as possible." -msgstr "一個手工製輕巧的慢跑背包。耐用且細心的做工讓它盡可能地裝下夠多的東西。" - #: lang/json/ARMOR_from_json.py msgid "survivor suit" msgid_plural "survivor suits" @@ -10331,29 +10188,29 @@ msgstr "一件寬鬆的長袍, 有寬大的袖子, 是阿拉伯的傳統服裝 #: lang/json/ARMOR_from_json.py msgid "bow tie" msgid_plural "bow ties" -msgstr[0] "" +msgstr[0] "領結" #. ~ Description for bow tie #: lang/json/ARMOR_from_json.py msgid "A simple black bow tie. Best worn with a suit." -msgstr "" +msgstr "簡單的黑色領結。搭配西裝最合適。" #: lang/json/ARMOR_from_json.py msgid "clip-on tie" msgid_plural "clip-on ties" -msgstr[0] "" +msgstr[0] "夾式領帶" #. ~ Description for clip-on tie #: lang/json/ARMOR_from_json.py msgid "" "A clip-on necktie, with blue and silver stripes. It's quick and easy to put" " on, and much better than the necktie." -msgstr "" +msgstr "一條夾式領帶,藍色和銀色條紋。穿起來既快捷又容易,而且比領帶要好得多。" #: lang/json/ARMOR_from_json.py msgid "necktie" msgid_plural "neckties" -msgstr[0] "" +msgstr[0] "領帶" #. ~ Description for necktie #: lang/json/ARMOR_from_json.py @@ -10361,7 +10218,7 @@ msgid "" "An ordinary, green necktie. It's more difficult to put on, but it takes " "real skill to do so. Wearing a necktie is much better than wearing a clip-" "on tie." -msgstr "" +msgstr "一條普通的綠色領帶。穿起來比較困難,需要真正的技巧來打領帶。穿著領帶要比穿夾式領帶要帥氣的多。" #: lang/json/ARMOR_from_json.py msgid "tights" @@ -10998,29 +10855,6 @@ msgid "" "stereotypical cap golfers wear." msgstr "你真的不確定這是否叫做高爾夫球帽, 而是印象中高爾夫球手們都戴這種帽子。" -#: lang/json/ARMOR_from_json.py -msgid "golf bag" -msgid_plural "golf bags" -msgstr[0] "高爾夫球袋" - -#. ~ Use action holster_msg for golf bag. -#: lang/json/ARMOR_from_json.py -#, no-python-format -msgid "You awkwardly sheath your %s" -msgstr "你笨拙地將你的 %s 收鞘。" - -#. ~ Use action holster_prompt for golf bag. -#: lang/json/ARMOR_from_json.py -msgid "Sheath golf club" -msgstr "收納高爾夫球桿" - -#. ~ Description for golf bag -#: lang/json/ARMOR_from_json.py -msgid "" -"A tall canvas and plastic bag with fold-out legs used for golfing. It even " -"has straps to be worn on the back." -msgstr "一個用於高爾夫球的高大帆布袋, 帶有折疊式支架, 甚至附有用於穿在背後的綁帶。" - #: lang/json/ARMOR_from_json.py msgid "javelin bag" msgid_plural "javelin bags" @@ -11115,62 +10949,6 @@ msgid "" "Useful for improvised rain protection." msgstr "一塊塑料布, 上面有幾個索環供繩索固定。簡易的擋雨物料。" -#: lang/json/ARMOR_from_json.py -msgid "high-volume rucksack" -msgid_plural "high-volume rucksacks" -msgstr[0] "" - -#. ~ Description for high-volume rucksack -#: lang/json/ARMOR_from_json.py -msgid "" -"Also know as a \"bigpack\", this rucksack is prized by pack rats but may " -"lead to a bad back." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "hiking backpack" -msgid_plural "hiking backpacks" -msgstr[0] "" - -#. ~ Description for hiking backpack -#: lang/json/ARMOR_from_json.py -msgid "A large sized hiking backpack with plenty of storage space." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "petpack" -msgid_plural "petpacks" -msgstr[0] "" - -#. ~ Description for petpack -#: lang/json/ARMOR_from_json.py -msgid "" -"Before the Cataclysm this would allow your four-legged friend to see the " -"world, now it's used to shield them from the world." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "large tactical backpack" -msgid_plural "large tactical backpacks" -msgstr[0] "" - -#. ~ Description for large tactical backpack -#: lang/json/ARMOR_from_json.py -msgid "" -"A large tactical multi-compartment backpack that has great lower back " -"support." -msgstr "" - -#: lang/json/ARMOR_from_json.py -msgid "travelpack" -msgid_plural "travelpacks" -msgstr[0] "" - -#. ~ Description for travelpack -#: lang/json/ARMOR_from_json.py -msgid "A hiking pack used for short trips." -msgstr "" - #: lang/json/ARMOR_from_json.py msgid "survivor utility belt" msgid_plural "survivor utility belts" @@ -11367,6 +11145,285 @@ msgid "" "resistant vests. It has four pouches capable of carrying magazines." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "backpack" +msgid_plural "backpacks" +msgstr[0] "背包" + +#. ~ Description for backpack +#: lang/json/ARMOR_from_json.py +msgid "A small backpack. Good storage for a little encumbrance." +msgstr "一個小背包, 有許多的儲物空間卻只會增加一點點累贅。" + +#: lang/json/ARMOR_from_json.py +msgid "hiking backpack" +msgid_plural "hiking backpacks" +msgstr[0] "登山背包" + +#. ~ Description for hiking backpack +#: lang/json/ARMOR_from_json.py +msgid "A large sized hiking backpack with plenty of storage space." +msgstr "登山大背包,有充足的儲物空間。" + +#: lang/json/ARMOR_from_json.py +msgid "giant novelty backpack" +msgid_plural "giant novelty backpacks" +msgstr[0] "巨大的新奇背包" + +#. ~ Description for giant novelty backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A huge fabric backpack made mostly as a joke before the cataclysm. Now, " +"it's still rather silly, but it can store a lot of stuff." +msgstr "在大災變之前, 一個巨大的布料背包多被視為是個笑話。現在, 它仍然相當愚蠢, 但它可以存儲很多東西。" + +#: lang/json/ARMOR_from_json.py +msgid "leather backpack" +msgid_plural "leather backpacks" +msgstr[0] "皮革背包" + +#. ~ Description for leather backpack +#: lang/json/ARMOR_from_json.py +msgid "A small leather backpack. Good storage for a little encumbrance." +msgstr "一個小型皮革背包。不太累贅而且適合儲物。" + +#: lang/json/ARMOR_from_json.py +msgid "large tactical backpack" +msgid_plural "large tactical backpacks" +msgstr[0] "大型戰術背包" + +#. ~ Description for large tactical backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A large tactical multi-compartment backpack that has great lower back " +"support." +msgstr "這是一款軍事戰術用多隔層的大型背包,背部支撐力極佳。" + +#: lang/json/ARMOR_from_json.py +msgid "high-volume rucksack" +msgid_plural "high-volume rucksacks" +msgstr[0] "" + +#. ~ Description for high-volume rucksack +#: lang/json/ARMOR_from_json.py +msgid "" +"Also know as a \"bigpack\", this rucksack is prized by pack rats but may " +"lead to a bad back." +msgstr "" + +#: lang/json/ARMOR_from_json.py +msgid "dive bag" +msgid_plural "dive bags" +msgstr[0] "潛水袋" + +#. ~ Description for dive bag +#: lang/json/ARMOR_from_json.py +msgid "A lightweight mesh backpack, commonly worn by swimmers and divers." +msgstr "一個輕量的網狀背包, 常用於游泳者和潛水者。" + +#: lang/json/ARMOR_from_json.py +msgid "duffel bag" +msgid_plural "duffel bags" +msgstr[0] "行李袋" + +#. ~ Description for duffel bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A huge duffel bag. Provides plenty of storage, but is severely encumbering." +msgstr "一個巨大的行李袋, 提供充足的儲物空間, 但造成嚴重的累贅。" + +#: lang/json/ARMOR_from_json.py +msgid "petpack" +msgid_plural "petpacks" +msgstr[0] "" + +#. ~ Description for petpack +#: lang/json/ARMOR_from_json.py +msgid "" +"Before the Cataclysm this would allow your four-legged friend to see the " +"world, now it's used to shield them from the world." +msgstr "" + +#: lang/json/ARMOR_from_json.py +msgid "jerrypack" +msgid_plural "jerrypacks" +msgstr[0] "油桶背包" + +#. ~ Description for jerrypack +#: lang/json/ARMOR_from_json.py +msgid "A jerrycan modified to be worn in a similar manner to a backpack." +msgstr "一個改裝過的油桶, 可以像背包一樣穿在身上。" + +#: lang/json/ARMOR_from_json.py +msgid "makeshift knapsack" +msgid_plural "makeshift knapsacks" +msgstr[0] "粗製背包" + +#. ~ Description for makeshift knapsack +#: lang/json/ARMOR_from_json.py +msgid "" +"A pair of pants with the bottom ends tied with string, and then passed " +"through the belt loops so the knapsack can be carried on the back." +msgstr "一條底部被繩索綁起來的褲子, 繩索接著穿過腰帶圈, 使得整個包能夠背在背上。" + +#: lang/json/ARMOR_from_json.py +msgid "makeshift sling" +msgid_plural "makeshift slings" +msgstr[0] "粗製斜肩袋" + +#. ~ Description for makeshift sling +#: lang/json/ARMOR_from_json.py +msgid "A large sheet tied into a crude, over-the-shoulder sling." +msgstr "用一大塊布罩繞過肩膀綁成的粗糙的斜肩袋。" + +#: lang/json/ARMOR_from_json.py +msgid "messenger bag" +msgid_plural "messenger bags" +msgstr[0] "郵差包" + +#. ~ Description for messenger bag +#: lang/json/ARMOR_from_json.py +msgid "Light and easy to wear, but doesn't offer much storage." +msgstr "輕便好背的包包, 但是沒有多少儲物空間。" + +#: lang/json/ARMOR_from_json.py +msgid "MOLLE pack" +msgid_plural "MOLLE packs" +msgstr[0] "輕型戰術背包" + +#. ~ Description for MOLLE pack +#: lang/json/ARMOR_from_json.py +msgid "" +"The Modular Lightweight Load-carrying Equipment is an advanced military " +"backpack. Covered with pockets and straps, it strikes a fine balance " +"between storage space and encumbrance." +msgstr "輕型戰術背包, 全稱是模組化輕型承重戰術背包。先進的軍用背包, 上面還佈滿著索帶和小口袋, 兼顧容量和行動便利性。" + +#: lang/json/ARMOR_from_json.py +msgid "purse" +msgid_plural "purses" +msgstr[0] "皮包" + +#. ~ Description for purse +#: lang/json/ARMOR_from_json.py +msgid "A bit cumbersome to wear, but provides some storage." +msgstr "穿戴後稍微累贅, 但是有一些儲物空間。" + +#: lang/json/ARMOR_from_json.py +msgid "military rucksack" +msgid_plural "military rucksacks" +msgstr[0] "軍用背包" + +#. ~ Description for military rucksack +#: lang/json/ARMOR_from_json.py +msgid "A huge military rucksack, provides a lot of storage." +msgstr "一個很大的軍用背包, 有相當多的儲物空間。" + +#: lang/json/ARMOR_from_json.py +msgid "runner pack" +msgid_plural "runner packs" +msgstr[0] "慢跑背包" + +#. ~ Description for runner pack +#: lang/json/ARMOR_from_json.py +msgid "" +"The obvious choice for outdoor athletes, this ergonomic backpack is light " +"and easy to wear, ensuring comfort when carrying heavy and bulky items." +msgstr "戶外運動員的首選, 這符合人體工學的背包重量很輕, 不易磨損, 在攜帶笨重物品時也能確保舒適。" + +#: lang/json/ARMOR_from_json.py +msgid "sling pack" +msgid_plural "sling packs" +msgstr[0] "斜肩袋" + +#. ~ Description for sling pack +#: lang/json/ARMOR_from_json.py +msgid "" +"A simple single-sling backpack. Easier to access than a normal backpack, " +"but can't comfortably hold as much." +msgstr "一個簡單的斜肩袋。比一般背包更易取得, 不過容量就比較小了。" + +#: lang/json/ARMOR_from_json.py +msgid "survivor duffel bag" +msgid_plural "survivor duffel bags" +msgstr[0] "生存者行李袋" + +#. ~ Description for survivor duffel bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built heavy duffel bag. Durable and carefully crafted to hold as " +"much stuff as possible." +msgstr "一個厚重的訂製行李袋。耐用且細心的做工讓它盡可能地裝下夠多的東西。" + +#: lang/json/ARMOR_from_json.py +msgid "survivor backpack" +msgid_plural "survivor backpacks" +msgstr[0] "生存者背包" + +#. ~ Description for survivor backpack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built backpack. Durable and carefully crafted to hold as much " +"stuff as possible." +msgstr "一個手工製的背包。耐用且細心的做工讓它盡可能地裝下夠多的東西。" + +#: lang/json/ARMOR_from_json.py +msgid "survivor rucksack" +msgid_plural "survivor rucksacks" +msgstr[0] "生存者旅行背包" + +#. ~ Description for survivor rucksack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built heavy backpack. Durable and carefully crafted to hold as " +"much stuff as possible." +msgstr "一個厚重的訂製的背包。耐用且細心的做工讓它盡可能地裝下夠多的東西。" + +#: lang/json/ARMOR_from_json.py +msgid "survivor runner pack" +msgid_plural "survivor runner packs" +msgstr[0] "生存者慢跑背包" + +#. ~ Description for survivor runner pack +#: lang/json/ARMOR_from_json.py +msgid "" +"A custom-built lightweight runner pack. Durable and carefully crafted to " +"hold as much stuff as possible." +msgstr "一個手工製輕巧的慢跑背包。耐用且細心的做工讓它盡可能地裝下夠多的東西。" + +#: lang/json/ARMOR_from_json.py +msgid "golf bag" +msgid_plural "golf bags" +msgstr[0] "高爾夫球袋" + +#. ~ Use action holster_msg for golf bag. +#: lang/json/ARMOR_from_json.py +#, no-python-format +msgid "You awkwardly sheath your %s" +msgstr "你笨拙地將你的 %s 收鞘。" + +#. ~ Use action holster_prompt for golf bag. +#: lang/json/ARMOR_from_json.py +msgid "Sheath golf club" +msgstr "收納高爾夫球桿" + +#. ~ Description for golf bag +#: lang/json/ARMOR_from_json.py +msgid "" +"A tall canvas and plastic bag with fold-out legs used for golfing. It even " +"has straps to be worn on the back." +msgstr "一個用於高爾夫球的高大帆布袋, 帶有折疊式支架, 甚至附有用於穿在背後的綁帶。" + +#: lang/json/ARMOR_from_json.py +msgid "travelpack" +msgid_plural "travelpacks" +msgstr[0] "" + +#. ~ Description for travelpack +#: lang/json/ARMOR_from_json.py +msgid "A hiking pack used for short trips." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "pistol bandolier" msgid_plural "pistol bandoliers" @@ -11646,12 +11703,12 @@ msgstr "一雙橡膠的靴子, 通常在清潔腐蝕性物質時會用到。" #: lang/json/ARMOR_from_json.py msgid "pair of scrap boots" msgid_plural "pairs of scrap boots" -msgstr[0] "" +msgstr[0] "廢金屬靴" #. ~ Description for pair of scrap boots #: lang/json/ARMOR_from_json.py msgid "Boots made of random scraps." -msgstr "" +msgstr "由廢金屬做成的靴子。" #: lang/json/ARMOR_from_json.py msgid "pair of steeltoed boots" @@ -12181,7 +12238,7 @@ msgstr "" #: lang/json/ARMOR_from_json.py msgid "beaded earring" msgid_plural "beaded earrings" -msgstr[0] "" +msgstr[0] "串珠耳環" #: lang/json/ARMOR_from_json.py msgid "beaded necklace" @@ -12193,31 +12250,31 @@ msgstr[0] "串珠項鍊" msgid "" "A simple necklace made of string and wooden beads. You can wear it if you " "like, but it won't provide any effects." -msgstr "" +msgstr "這是條由繩子和木珠製成的簡單項鍊。如果你喜歡,可以戴上它,但它不會提供任何效果。" #: lang/json/ARMOR_from_json.py msgid "friendship bracelet" msgid_plural "friendship bracelets" -msgstr[0] "" +msgstr[0] "友誼手鐲" #. ~ Description for friendship bracelet #: lang/json/ARMOR_from_json.py msgid "" "A homemade bracelet crafted from colorful knickknacks. It's not very " "expensive, but it's the effort that makes it special." -msgstr "" +msgstr "這款自製手鐲採用彩色的小玩意兒製成。它並不昂貴,但它附有的意義使它變得特別。" #: lang/json/ARMOR_from_json.py msgid "bronze medal" msgid_plural "bronze medals" -msgstr[0] "" +msgstr[0] "銅牌" #. ~ Description for bronze medal #: lang/json/ARMOR_from_json.py msgid "" "A medal awarded for achieving third place in some event. It might be worth " "something if it was made of bronze; this one is made from iron." -msgstr "" +msgstr "在某些比賽中獲得第三名的獎牌。如果它是由青銅製成的話可能是有價值的;這一個是用鐵製成的。" #: lang/json/ARMOR_from_json.py msgid "diamond dental grill" @@ -12242,7 +12299,7 @@ msgid "" "A gold ring with a sparkling diamond mounted on top of it. Back in the old " "days this could be worth a fortune. You can wear it if you like, but it " "won't provide any effects." -msgstr "" +msgstr "一只鑲有閃亮鑽石的金戒指。在以前這可能價值一大筆錢。如果你喜歡,可以戴上它,但它不會提供任何效果。" #: lang/json/ARMOR_from_json.py msgid "diver's watch" @@ -12267,7 +12324,7 @@ msgid "" "A staple accessory for gentlemen. Keeps your shirt collar in place and " "provides a more aesthetically pleasing arc to your necktie. You can wear it" " if you like, but it won't provide any effects." -msgstr "" +msgstr "紳士們的基本配件。將襯衫領子保持在適當位置,為領帶提供更美觀的弧形。 如果你喜歡,可以戴上它,但它不會提供任何效果。" #: lang/json/ARMOR_from_json.py msgid "copper bracelet" @@ -12279,7 +12336,7 @@ msgstr[0] "銅手鐲" msgid "" "An old-fashioned, copper bracelet. You can wear it if you like, but it " "won't provide any effects." -msgstr "" +msgstr "這款老式銅質手鐲。如果你喜歡,可以戴上它,但它不會提供任何效果。" #: lang/json/ARMOR_from_json.py msgid "copper earring" @@ -12291,24 +12348,24 @@ msgstr[0] "銅耳環" msgid "" "A copper earring. It's pretty heavy. You can wear it if you like, but it " "won't provide any effects." -msgstr "" +msgstr "銅耳環,很重。如果你喜歡,可以戴上它,但它不會提供任何效果。" #: lang/json/ARMOR_from_json.py msgid "copper hairpin" msgid_plural "copper hairpins" -msgstr[0] "" +msgstr[0] "銅髮夾" #. ~ Description for copper hairpin #: lang/json/ARMOR_from_json.py msgid "" "A hairpin made from copper. You can wear it if you like, but it won't " "provide any effects." -msgstr "" +msgstr "銅做成的髮夾。如果你喜歡,可以戴上它,但它不會提供任何效果。" #: lang/json/ARMOR_from_json.py msgid "copper locket" msgid_plural "copper lockets" -msgstr[0] "" +msgstr[0] "銅盒式吊墜" #. ~ Description for copper locket #: lang/json/ARMOR_from_json.py @@ -12316,36 +12373,36 @@ msgid "" "A circular, copper locket. It's been tarnished with use, and has gained " "some dull green spots. You can wear it if you like, but it won't provide " "any effects." -msgstr "" +msgstr "圓形銅質盒式吊墜。長期使用讓他黯然失色,並且已經產生了一些黯淡的綠色斑點。如果你喜歡,可以戴上它,但它不會提供任何效果。" #: lang/json/ARMOR_from_json.py msgid "copper necklace" msgid_plural "copper necklaces" -msgstr[0] "" +msgstr[0] "銅項鍊" #. ~ Description for copper necklace #: lang/json/ARMOR_from_json.py msgid "" "A simple chain of copper, with a clasp in the middle to create a necklace. " "You can wear it if you like, but it won't provide any effects." -msgstr "" +msgstr "一條簡單的銅鏈,中間有一個扣環,可以當作項鍊。如果你喜歡,可以戴上它,但它不會提供任何效果。" #: lang/json/ARMOR_from_json.py msgid "copper ring" msgid_plural "copper rings" -msgstr[0] "" +msgstr[0] "銅戒指" #. ~ Description for copper ring #: lang/json/ARMOR_from_json.py msgid "" "A plain, copper ring. Not very shiny, and not very popular. You can wear " "it if you like, but it won't provide any effects." -msgstr "" +msgstr "一個普通的銅戒指。不是很閃亮,也不是很受歡迎。如果你喜歡,可以戴上它,但它不會提供任何效果。" #: lang/json/ARMOR_from_json.py msgid "cufflinks" msgid_plural "cufflinkss" -msgstr[0] "" +msgstr[0] "袖扣" #. ~ Description for cufflinks #: lang/json/ARMOR_from_json.py @@ -12353,12 +12410,12 @@ msgid "" "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." -msgstr "" +msgstr "一對無標記的銀色袖扣。袖扣用於固定禮服襯衫的袖口 - 對於正式穿著的男士來說是必備品。如果你喜歡,可以戴上它,但它不會提供任何效果。" #: lang/json/ARMOR_from_json.py msgid "intricate cufflinks" msgid_plural "intricate cufflinkss" -msgstr[0] "" +msgstr[0] "雕花袖扣" #. ~ Description for intricate cufflinks #: lang/json/ARMOR_from_json.py @@ -12366,7 +12423,7 @@ msgid "" "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." -msgstr "" +msgstr "一對昂貴的銀色袖扣,採用金色齒輪和碎形圖案的精細覆蓋設計。如果你喜歡,可以戴上它,但它不會提供任何效果。" #: lang/json/ARMOR_from_json.py msgid "plug" @@ -12379,7 +12436,7 @@ msgid "" "Those round things people plug into their earlobes as earrings, also called " "\"ear plug\" or \"ear spool.\" You can wear it if you like, but it won't " "provide any effects." -msgstr "" +msgstr "人們用這些圓型的東西插入他們的耳垂當作耳環, 也被稱作 \"耳塞\" 或 \"耳捲\"。如果你喜歡,可以戴上它,但它不會提供任何效果。" #: lang/json/ARMOR_from_json.py msgid "gold bracelet" @@ -12420,19 +12477,19 @@ msgstr "一個閃亮的金耳環。你可以戴著它, 不過沒有甚麼用處 #: lang/json/ARMOR_from_json.py msgid "gold hairpin" msgid_plural "gold hairpins" -msgstr[0] "" +msgstr[0] "金髮夾" #. ~ Description for gold hairpin #: lang/json/ARMOR_from_json.py msgid "" "A gold hairpin, designed by the rich, for the rich. You can wear it if you " "like, but it won't provide any effects." -msgstr "" +msgstr "金子做成的髮夾,專為有錢人所設計。如果你喜歡,可以戴上它,但它不會提供任何效果。" #: lang/json/ARMOR_from_json.py msgid "gold locket" msgid_plural "gold lockets" -msgstr[0] "" +msgstr[0] "金盒式吊墜" #. ~ Description for gold locket #: lang/json/ARMOR_from_json.py @@ -12440,12 +12497,12 @@ msgid "" "A heart-shaped, gold locket with a frame inside to store photographs or " "small objects. You can wear it if you like, but it won't provide any " "effects." -msgstr "" +msgstr "一個心形的金製盒式吊墜,有一個框架用來存放照片或小物件。如果你喜歡,可以戴上它,但它不會提供任何效果。" #: lang/json/ARMOR_from_json.py msgid "gold medal" msgid_plural "gold medals" -msgstr[0] "" +msgstr[0] "金牌" #. ~ Description for gold medal #: lang/json/ARMOR_from_json.py @@ -12453,19 +12510,19 @@ msgid "" "A medal awarded for achieving first place in some event. Before everything " "fell apart, this could be a source of pride for its owner. Now it's just " "another shiny bauble." -msgstr "" +msgstr "在某些比賽中獲得第一名的獎牌。在世界崩壞之前,這可能是其所有者的驕傲。現在它只是又一個閃亮的小玩意兒。" #: lang/json/ARMOR_from_json.py msgid "gold necklace" msgid_plural "gold necklaces" -msgstr[0] "" +msgstr[0] "金項鍊" #. ~ Description for gold necklace #: lang/json/ARMOR_from_json.py msgid "" "A shiny, unadorned gold necklace. You can wear it if you like, but it won't" " provide any effects." -msgstr "" +msgstr "一條閃亮的、沒有花紋的金項鍊。如果你喜歡,可以戴上它,但它不會提供任何效果。" #: lang/json/ARMOR_from_json.py msgid "gold ring" @@ -12501,12 +12558,12 @@ msgstr[0] "領夾" msgid "" "A fancy silver tie clip, a great match for your skinny tie. You can wear it" " if you like, but it won't provide any effects." -msgstr "" +msgstr "這款精美的銀色領帶夾,跟窄領帶超搭配的。如果你喜歡,可以戴上它,但它不會提供任何效果。" #: lang/json/ARMOR_from_json.py msgid "silver watch" msgid_plural "silver watches" -msgstr[0] "" +msgstr[0] "銀錶" #. ~ Description for silver watch #: lang/json/ARMOR_from_json.py @@ -12514,7 +12571,7 @@ msgid "" "An elegant silver watch, crafted from silver-plated stainless steel. It's " "much cheaper than other metal watches, and more classy than an ordinary " "wristwatch." -msgstr "" +msgstr "這款優雅的銀色腕錶採用鍍銀不銹鋼製成。它比其他貴金屬手錶便宜得多,也比普通手錶更典雅。" #: lang/json/ARMOR_from_json.py msgid "silver bracelet" @@ -12596,43 +12653,43 @@ msgstr[0] "翡翠胸針" msgid "" "A hand-crafted jade brooch of Oriental origin. You can wear it if you like," " but it won't provide any effects." -msgstr "" +msgstr "來自東亞的手工製玉石胸針。如果你喜歡,可以戴上它,但它不會提供任何效果。" #: lang/json/ARMOR_from_json.py msgid "platinum watch" msgid_plural "platinum watches" -msgstr[0] "" +msgstr[0] "白金錶" #. ~ Description for platinum watch #: lang/json/ARMOR_from_json.py msgid "" "Flex on those gold-watch wearers with the rare, expensive and superior " "platinum watch. This one is made from solid platinum." -msgstr "" +msgstr "使用稀有、昂貴且優質的白金腕錶,為喜愛佩戴金錶的人提供另一個選擇。這個由純鉑製成。" #: lang/json/ARMOR_from_json.py msgid "platinum bracelet" msgid_plural "platinum bracelets" -msgstr[0] "" +msgstr[0] "白金手鐲" #. ~ Description for platinum bracelet #: lang/json/ARMOR_from_json.py msgid "" "A flawless platinum bracelet. You can wear it if you like, but it won't " "provide any effects." -msgstr "" +msgstr "完美無瑕的白金手鐲。如果你喜歡,可以戴上它,但它不會提供任何效果。" #: lang/json/ARMOR_from_json.py msgid "platinum dental grill" msgid_plural "platinum dental grills" -msgstr[0] "" +msgstr[0] "白金假牙" #. ~ Description for platinum dental grill #: lang/json/ARMOR_from_json.py msgid "" "Fake platinum-and-silver teeth. They may be cheaper than fake gold teeth, " "but they're much more rare. Fits horribly, but looks very shiny." -msgstr "" +msgstr "用鉑和銀做成的假齒。它們可能比黃金假牙便宜,但它們更為罕見。意外的適合,看起來很閃。" #. ~ Description for gold earring #: lang/json/ARMOR_from_json.py @@ -12640,12 +12697,12 @@ msgid "" "Plain platinum earrings, the rich person's earring - if gold is getting " "boring, just use another rare metal. You can wear it if you like, but it " "won't provide any effects." -msgstr "" +msgstr "純鉑做成的耳環,有錢人的耳環 - 如果金子變得無趣,只需要使用另一種稀有金屬。如果你喜歡,可以戴上它,但它不會提供任何效果。" #: lang/json/ARMOR_from_json.py msgid "platinum hairpin" msgid_plural "platinum hairpins" -msgstr[0] "" +msgstr[0] "白金髮夾" #. ~ Description for platinum hairpin #: lang/json/ARMOR_from_json.py @@ -12653,48 +12710,48 @@ msgid "" "The ultimate in esoteric, metal hair accessories, this hairpin is made from " "pure platinum. You can wear it if you like, but it won't provide any " "effects." -msgstr "" +msgstr "這款髮夾採用純鉑製成,極致神秘的金屬髮飾。如果你喜歡,可以戴上它,但它不會提供任何效果。" #: lang/json/ARMOR_from_json.py msgid "platinum locket" msgid_plural "platinum lockets" -msgstr[0] "" +msgstr[0] "白金盒式吊墜" #. ~ Description for platinum locket #: lang/json/ARMOR_from_json.py msgid "" "A small, platinum locket for storing photographs or other small objects. " "You can wear it if you like, but it won't provide any effects." -msgstr "" +msgstr "一個小型鉑製盒式吊墜,用於存放照片或其他小物件。如果你喜歡,可以戴上它,但它不會提供任何效果。" #: lang/json/ARMOR_from_json.py msgid "platinum necklace" msgid_plural "platinum necklaces" -msgstr[0] "" +msgstr[0] "白金項鍊" #. ~ Description for platinum necklace #: lang/json/ARMOR_from_json.py msgid "" "A platinum necklace, with a small, empty heart frame hanging from a chain. " "You can wear it if you like, but it won't provide any effects." -msgstr "" +msgstr "這款鉑製項鍊,項鍊上掛有一個小巧的空心框架。如果你喜歡,可以戴上它,但它不會提供任何效果。" #: lang/json/ARMOR_from_json.py msgid "platinum ring" msgid_plural "platinum rings" -msgstr[0] "" +msgstr[0] "白金戒指" #. ~ Description for platinum ring #: lang/json/ARMOR_from_json.py msgid "" "A platinum ring, engraved with all manner of swirls and spirals. You can " "wear it if you like, but it won't provide any effects." -msgstr "" +msgstr "鉑製戒指,刻有各種漩渦和螺旋形狀。如果你喜歡,可以戴上它,但它不會提供任何效果。" #: lang/json/ARMOR_from_json.py msgid "engagement ring" msgid_plural "engagement rings" -msgstr[0] "" +msgstr[0] "訂婚戒指" #. ~ Description for engagement ring #: lang/json/ARMOR_from_json.py @@ -12702,24 +12759,24 @@ msgid "" "This ring is an intricate gold band, with a small cluster of diamonds set in" " the center. Before the world broke down, this ring would've cost a small " "fortune." -msgstr "" +msgstr "這枚戒指是一只雕工精美的黃金環,中間鑲嵌著一小簇鑽石。在世界崩壞之前,這枚戒指價值一筆不小的錢。" #: lang/json/ARMOR_from_json.py msgid "purity ring" msgid_plural "purity rings" -msgstr[0] "" +msgstr[0] "貞潔指環" #. ~ Description for purity ring #: lang/json/ARMOR_from_json.py msgid "" "Also known as a promise ring, this ring is worn as a sign of chastity. This" " one bears the inscription, \"Love is patient.\"" -msgstr "" +msgstr "這款戒指也被稱為承諾戒指,作為貞潔的標誌。這一個上面的題詞是 “愛是耐心”。" #: lang/json/ARMOR_from_json.py msgid "signet ring" msgid_plural "signet rings" -msgstr[0] "" +msgstr[0] "圖章戒指" #. ~ Description for signet ring #: lang/json/ARMOR_from_json.py @@ -12727,19 +12784,19 @@ msgid "" "A gold and silver ring with a wide stamp attached to the band. A long time " "ago, the stamp was legible, but now the pattern is too worn to discern its " "former use." -msgstr "" +msgstr "由金和銀製成的戒指,指環上鑲有圖章。圖章的樣式在很久以前是很清楚的,現在則模糊到看不出來原本的用途了。" #: lang/json/ARMOR_from_json.py msgid "wedding ring" msgid_plural "wedding rings" -msgstr[0] "" +msgstr[0] "結婚戒指" #. ~ Description for wedding ring #: lang/json/ARMOR_from_json.py msgid "" "A flawless ring, ensnaring a diamond with twists of pure gold. It's a " "constant reminder that the wearer is married." -msgstr "" +msgstr "一只完美無瑕的戒指,用純金絲鑲嵌著鑽石。不斷的提醒著:佩戴者已婚。" #: lang/json/ARMOR_from_json.py msgid "silver necklace" @@ -12756,31 +12813,31 @@ msgstr "一個漂亮的銀項鍊。如果你喜歡, 你可以戴著它, 但它 #: lang/json/ARMOR_from_json.py msgid "silver hairpin" msgid_plural "silver hairpins" -msgstr[0] "" +msgstr[0] "銀髮夾" #. ~ Description for silver hairpin #: lang/json/ARMOR_from_json.py msgid "" "A shiny, silver hairpin with a tiny bee engraved onto it. You can wear it " "if you like, but it won't provide any effects." -msgstr "" +msgstr "一個閃亮的銀製髮夾,上面刻著一隻小蜜蜂。如果你喜歡,可以戴上它,但它不會提供任何效果。" #: lang/json/ARMOR_from_json.py msgid "silver locket" msgid_plural "silver lockets" -msgstr[0] "" +msgstr[0] "銀盒式吊墜" #. ~ Description for silver locket #: lang/json/ARMOR_from_json.py msgid "" "A small, silver locket with a frame inside to store photographs or small " "objects. You can wear it if you like, but it won't provide any effects." -msgstr "" +msgstr "一個小的銀製盒式吊墜,上面有一個框架來存放照片或小物件。如果你喜歡,可以戴上它,但它不會提供任何效果。" #: lang/json/ARMOR_from_json.py msgid "silver medal" msgid_plural "silver medals" -msgstr[0] "" +msgstr[0] "銀牌" #. ~ Description for silver medal #: lang/json/ARMOR_from_json.py @@ -12788,19 +12845,19 @@ msgid "" "A medal awarded for achieving second place in some event. Before everything" " fell apart, this could be a source of pride for its owner. Now it's just " "another shiny bauble." -msgstr "" +msgstr "在某些比賽中獲得第二名的獎牌。在世界崩壞之前,這可能是其所有者的驕傲。現在它只是又一個閃亮的小玩意兒。" #: lang/json/ARMOR_from_json.py msgid "silver ring" msgid_plural "silver rings" -msgstr[0] "" +msgstr[0] "銀戒指" #. ~ Description for silver ring #: lang/json/ARMOR_from_json.py msgid "" "A simple, silver ring. You can wear it if you like, but it won't provide " "any effects." -msgstr "" +msgstr "一只簡單的銀製戒指。如果你喜歡,可以戴上它,但它不會提供任何效果。" #: lang/json/ARMOR_from_json.py msgid "leather collar" @@ -12849,7 +12906,7 @@ msgstr[0] "徽章模板" msgid "" "This is a template for police/medical badges. If found in a game it is a " "bug." -msgstr "" +msgstr "這是警察/醫療徽章的模板。如果在遊戲中找到它就是程式出錯了。" #: lang/json/ARMOR_from_json.py msgid "cybercop badge" @@ -12908,13 +12965,13 @@ msgstr "一枚經過亞光處理的銀色盾形徽章, 彰顯著配戴者是個 #: lang/json/ARMOR_from_json.py msgid "doctor badge" msgid_plural "doctor badges" -msgstr[0] "" +msgstr[0] "醫生徽章" #. ~ Description for doctor badge #: lang/json/ARMOR_from_json.py msgid "" "A plastic name tag marking the wearer as a real doctor of the medical kind." -msgstr "" +msgstr "一塊塑膠製的名牌,標誌著佩戴者是真正醫生。" #: lang/json/ARMOR_from_json.py msgid "Foodkid badge" @@ -14077,14 +14134,14 @@ msgstr "一頂像樣的寬邊帽, 縫上了一個額外的兜帽, 更能保護 #: lang/json/BATTERY_from_json.py msgid "test battery" msgid_plural "test batteries" -msgstr[0] "" +msgstr[0] "測試電池" #. ~ Description for test battery #: lang/json/BATTERY_from_json.py msgid "" "This is a testing item for the BATTERY item type. If you found one in game " "it's a bug." -msgstr "" +msgstr "這是這是電池類物品的的測試物。如果在遊戲中找到它就是程式出錯了。" #: lang/json/BIONIC_ITEM_from_json.py msgid "Fusion Blaster Arm CBM" @@ -14132,7 +14189,7 @@ msgid "" "A stimulator system that is implanted alongside the adrenal glands, allowing" " the user to trigger their body's adrenaline response at the cost of some " "bionic power." -msgstr "" +msgstr "在你的腎上腺旁植入一個刺激的系統裝置,你可以消耗一些生化能量來啟動這裝置,讓身體進入充滿腎上腺素的狀態。" #: lang/json/BIONIC_ITEM_from_json.py msgid "Active Defense System CBM" @@ -14148,18 +14205,6 @@ msgid "" " turn more often than massive objects." msgstr "" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Advanced Microreactor CBM" -msgid_plural "Advanced Microreactor CBMs" -msgstr[0] "CBM: 進階體腔核子反應爐" - -#. ~ Description for Advanced Microreactor CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"This module upgrades a pre-installed microreactor with enhanced maximum " -"yield and limited automatic radiation scrubbing capabilities." -msgstr "" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Alarm System CBM" msgid_plural "Alarm System CBMs" @@ -14171,7 +14216,7 @@ msgid "" "A motion-detecting alarm system will notice almost all movement within a " "fifteen-foot radius, and will silently alert the user. This is very useful " "during sleep, or if the user suspects a cloaked pursuer." -msgstr "" +msgstr "一個動態偵測警報系統能夠偵測 5 呎遠的範圍並通知使用者。在睡覺時, 或是懷疑被隱形的生物追蹤時非常有用。" #: lang/json/BIONIC_ITEM_from_json.py msgid "Arms Alloy Plating CBM" @@ -14566,7 +14611,7 @@ msgstr[0] "CBM: 頭顱燈" #. ~ Description for Cranial Flashlight CBM #: lang/json/BIONIC_ITEM_from_json.py msgid "A small, but powerful LED flashlight that is mounted between the eyes." -msgstr "" +msgstr "一個安裝在雙眼中間的小型,但強力的LED電筒。" #: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py msgid "LED Tattoo" @@ -14693,7 +14738,7 @@ msgid "" "A small, high-powered laser that is embedded in the fingertip. This long " "range weapon is not incredibly damaging, but is very accurate, and has the " "potential to start fires." -msgstr "" +msgstr "一支細小,高功率的雷射裝嵌在指尖裡。這個長程武器造成的傷害不大, 但是非常精準, 並且有著火的機會。" #: lang/json/BIONIC_ITEM_from_json.py msgid "Leukocyte Breeder System CBM" @@ -14860,18 +14905,6 @@ msgid "" "cause delayed reaction times and drowsiness." msgstr "" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Plutonium Filter CBM" -msgid_plural "Plutonium Filter CBMs" -msgstr[0] "CBM: 鈽元素提煉裝置" - -#. ~ Description for Plutonium Filter CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A system of tanks and filters that are connected to a microreactor to " -"extract plutonium from radioactive slurry." -msgstr "" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Power Armor Interface CBM" msgid_plural "Power Armor Interface CBMs" @@ -14910,12 +14943,12 @@ msgid "" "A Compact Bionics Module that upgrades the user's power capacity by 100 " "units. Having at least one of these is a prerequisite to using powered " "bionics. The user will also need a power supply, found in various CBMs." -msgstr "" +msgstr "這個整合生化插件模組能夠提升你的能量儲存 100 個單位。至少要有一個這種插件才能驅動其他生化插件。你也需要一個能夠供給能量的 CBM。" #: lang/json/BIONIC_ITEM_from_json.py msgid "Power Storage CBM Mk. II" msgid_plural "Power Storage CBM Mk. II" -msgstr[0] "" +msgstr[0] "CBM:能量儲存室 Mk. II" #. ~ Description for Power Storage CBM Mk. II #: lang/json/BIONIC_ITEM_from_json.py @@ -14923,7 +14956,7 @@ msgid "" "A Compact Bionics Module developed at DoubleTech Industries as a replacement" " for the highly successful Power Storage CBM. Increases the user's power " "capacity by 250 units." -msgstr "" +msgstr "DoubleTech 工業開發的整合式生化插件模組,這個型號是能量儲存室 CBM 的新一代。能夠增加你的能量儲存量 250 單位。" #: lang/json/BIONIC_ITEM_from_json.py msgid "Probability Travel CBM" @@ -14936,7 +14969,7 @@ msgid "" "Increases the body's wavelength, allowing the user to quantum tunnel through" " walls, reappearing on the other side. Power drain in standby is minimal, " "but each tile tunneled through costs 250 bionic power." -msgstr "" +msgstr "增加身體的波長, 讓使用者能夠以量子穿隧的方式穿過牆壁出現在另一邊。待命時的能量消耗少, 但是每穿梭一格時會耗用 250 點生化能量。" #: lang/json/BIONIC_ITEM_from_json.py msgid "Air Filtration System CBM" @@ -14990,31 +15023,6 @@ msgid "" "unarmed slashing damage whenever the user's fingertips are uncovered." msgstr "" -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Internal Microreactor CBM" -msgid_plural "Internal Microreactor CBMs" -msgstr[0] "CBM: 體腔核子反應爐" - -#. ~ Description for Internal Microreactor CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"This stripped down mini-reactor will generate impressive amounts of bionic " -"power, but may not be the safest thing to install. Once active, it cannot " -"be shut down and will slowly contaminate the user's body with radiation." -msgstr "" - -#: lang/json/BIONIC_ITEM_from_json.py -msgid "Microreactor Upgrade CBM" -msgid_plural "Microreactor Upgrade CBMs" -msgstr[0] "CBM: 核子反應爐升級套裝" - -#. ~ Description for Microreactor Upgrade CBM -#: lang/json/BIONIC_ITEM_from_json.py -msgid "" -"A kit for upgrading a pre-installed microreactor with enhanced maximum yield" -" and limited automatic radiation scrubbing capabilities." -msgstr "" - #: lang/json/BIONIC_ITEM_from_json.py msgid "Recycler Unit CBM" msgid_plural "Recycler Unit CBMs" @@ -15127,7 +15135,7 @@ msgstr[0] "CBM: 肌肉增強" msgid "" "Myomer fibers that enhance the muscular system, granting a +2 bonus to " "strength." -msgstr "" +msgstr "強化肌肉系統的生化纖維,能增加 2 點力量。" #: lang/json/BIONIC_ITEM_from_json.py msgid "Autonomous Surgical Scalpels CBM" @@ -15219,7 +15227,7 @@ msgid "" "Torsion ratchets that replace the user's joints to slowly generate power " "when they move. These can be toggled to generate more power, but movement " "will require more effort." -msgstr "" +msgstr "一個取代使用者的關節的轉輪發電器,可以在移動時緩慢地產生能量。這可以切換去產生更多能量,但移動會需要更多的體力。" #: lang/json/BIONIC_ITEM_from_json.py msgid "Joint Servo CBM" @@ -15601,6 +15609,55 @@ msgid "" "may carry an extra 2 liters of volume." msgstr "你的胸腔被改造成一個儲物空間。你能夠多攜帶 2 公升體積的物品。" +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Advanced Microreactor CBM" +msgid_plural "Advanced Microreactor CBMs" +msgstr[0] "CBM: 進階體腔核子反應爐" + +#. ~ Description for Advanced Microreactor CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"This module upgrades a pre-installed microreactor with enhanced maximum " +"yield and limited automatic radiation scrubbing capabilities." +msgstr "該模塊升級了已安裝的微型反應爐,具有增強的最大能量產生功率,以及有限自動輻射清除能力的。" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Plutonium Filter CBM" +msgid_plural "Plutonium Filter CBMs" +msgstr[0] "CBM: 鈽元素提煉裝置" + +#. ~ Description for Plutonium Filter CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A system of tanks and filters that are connected to a microreactor to " +"extract plutonium from radioactive slurry." +msgstr "" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Internal Microreactor CBM" +msgid_plural "Internal Microreactor CBMs" +msgstr[0] "CBM: 體腔核子反應爐" + +#. ~ Description for Internal Microreactor CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"This stripped down mini-reactor will generate impressive amounts of bionic " +"power, but may not be the safest thing to install. Once active, it cannot " +"be shut down and will slowly contaminate the user's body with radiation." +msgstr "" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Microreactor Upgrade CBM" +msgid_plural "Microreactor Upgrade CBMs" +msgstr[0] "CBM: 核子反應爐升級套裝" + +#. ~ Description for Microreactor Upgrade CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A kit for upgrading a pre-installed microreactor with enhanced maximum yield" +" and limited automatic radiation scrubbing capabilities." +msgstr "" + #. ~ Description for Solar Panels CBM #: lang/json/BIONIC_ITEM_from_json.py msgid "" @@ -16386,7 +16443,7 @@ msgstr "少見的機器人製造刊物, 內容包含許多製造指引與製造 #: lang/json/BOOK_from_json.py msgid "schematics generic" msgid_plural "schematics generics" -msgstr[0] "" +msgstr[0] "泛型原理圖" #. ~ Description for schematics generic #. ~ Description for animal @@ -16408,7 +16465,7 @@ msgstr[0] "看到這個的話就是有 bug" #: lang/json/BOOK_from_json.py msgid "nurse bot schematics" msgid_plural "nurse bot schematics" -msgstr[0] "" +msgstr[0] "護士機器人原理圖" #. ~ Description for nurse bot schematics #: lang/json/BOOK_from_json.py @@ -16418,11 +16475,13 @@ msgid "" "you could use the assembly plans to re-assemble the robot from salvaged " "parts." msgstr "" +"帶有 Uncanny " +"的標誌,這些是護士機器人的裝配藍圖、設計規格和技術圖紙。其中大部分對你沒用,但你可以利用裝配藍圖,把搜刮來的機器人部件重新組裝成機器人。" #: lang/json/BOOK_from_json.py msgid "police bot schematics" msgid_plural "police bot schematics" -msgstr[0] "" +msgstr[0] "警用機器人原理圖" #. ~ Description for police bot schematics #: lang/json/BOOK_from_json.py @@ -16430,12 +16489,12 @@ msgid "" "Assembly plans, design specs, and technical drawings for the police bot. " "Most of this is useless to you, but you could use the assembly plans to re-" "assemble the robot from salvaged parts." -msgstr "" +msgstr "警用機器人的裝配藍圖、設計規格和技術圖紙。其中大部分對你沒用,但你可以利用裝配藍圖,把搜刮來的機器人部件重新組裝成機器人。" #: lang/json/BOOK_from_json.py msgid "eyebot schematics" msgid_plural "eyebot schematics" -msgstr[0] "" +msgstr[0] "眼球機器人原理圖" #. ~ Description for eyebot schematics #: lang/json/BOOK_from_json.py @@ -16443,12 +16502,12 @@ msgid "" "Assembly plans, design specs, and technical drawings for the eyebot. Most " "of this is useless to you, but you could use the assembly plans to re-" "assemble the robot from salvaged parts." -msgstr "" +msgstr "眼球機器人的裝配藍圖、設計規格和技術圖紙。其中大部分對你沒用,但你可以利用裝配藍圖,把搜刮來的機器人部件重新組裝成機器人。" #: lang/json/BOOK_from_json.py msgid "security bot schematics" msgid_plural "security bot schematics" -msgstr[0] "" +msgstr[0] "保全機器人原理圖" #. ~ Description for security bot schematics #: lang/json/BOOK_from_json.py @@ -16456,12 +16515,12 @@ msgid "" "Assembly plans, design specs, and technical drawings for the security bot. " "Most of this is useless to you, but you could use the assembly plans to re-" "assemble the robot from salvaged parts." -msgstr "" +msgstr "保全機器人的裝配藍圖、設計規格和技術圖紙。其中大部分對你沒用,但你可以利用裝配藍圖,把搜刮來的機器人部件重新組裝成機器人。" #: lang/json/BOOK_from_json.py msgid "skitterbot schematics" msgid_plural "skitterbot schematics" -msgstr[0] "" +msgstr[0] "爬蟲機器人原理圖" #. ~ Description for skitterbot schematics #: lang/json/BOOK_from_json.py @@ -16469,12 +16528,12 @@ msgid "" "Assembly plans, design specs, and technical drawings for the skitterbot. " "Most of this is useless to you, but you could use the assembly plans to re-" "assemble the robot from salvaged parts." -msgstr "" +msgstr "爬蟲機器人的裝配藍圖、設計規格和技術圖紙。其中大部分對你沒用,但你可以利用裝配藍圖,把搜刮來的機器人部件重新組裝成機器人。" #: lang/json/BOOK_from_json.py msgid "chicken walker schematics" msgid_plural "chicken walker schematics" -msgstr[0] "" +msgstr[0] "雙足步行機器人原理圖" #. ~ Description for chicken walker schematics #: lang/json/BOOK_from_json.py @@ -16484,11 +16543,13 @@ msgid "" "but you could use the assembly plans to re-assemble the robot from salvaged " "parts." msgstr "" +"帶有 Northrop " +"的標誌,這些是雙足步行機器人的裝配藍圖、設計規格和技術圖紙。其中大部分對你沒用,但你可以利用裝配藍圖,把搜刮來的機器人部件重新組裝成機器人。" #: lang/json/BOOK_from_json.py msgid "cleaner bot schematics" msgid_plural "cleaner bot schematics" -msgstr[0] "" +msgstr[0] "清潔機器人原理圖" #. ~ Description for cleaner bot schematics #: lang/json/BOOK_from_json.py @@ -16496,12 +16557,12 @@ msgid "" "Assembly plans, design specs, and technical drawings for the cleaner bot. " "Most of this is useless to you, but you could use the assembly plans to re-" "assemble the robot from salvaged parts." -msgstr "" +msgstr "清潔機器人的裝配藍圖、設計規格和技術圖紙。其中大部分對你沒用,但你可以利用裝配藍圖,把搜刮來的機器人部件重新組裝成機器人。" #: lang/json/BOOK_from_json.py msgid "miner bot schematics" msgid_plural "miner bot schematics" -msgstr[0] "" +msgstr[0] "礦工機器人" #. ~ Description for miner bot schematics #: lang/json/BOOK_from_json.py @@ -16509,12 +16570,12 @@ msgid "" "Assembly plans, design specs, and technical drawings for the miner bot. " "Most of this is useless to you, but you could use the assembly plans to re-" "assemble the robot from salvaged parts." -msgstr "" +msgstr "礦工機器人的裝配藍圖、設計規格和技術圖紙。其中大部分對你沒用,但你可以利用裝配藍圖,把搜刮來的機器人部件重新組裝成機器人。" #: lang/json/BOOK_from_json.py msgid "riot control bot schematics" msgid_plural "riot control bot schematics" -msgstr[0] "" +msgstr[0] "鎮暴機器人原理圖" #. ~ Description for riot control bot schematics #: lang/json/BOOK_from_json.py @@ -16522,12 +16583,12 @@ msgid "" "Assembly plans, design specs, and technical drawings for the riot control " "bot. Most of this is useless to you, but you could use the assembly plans " "to re-assemble the robot from salvaged parts." -msgstr "" +msgstr "鎮暴機器人的裝配藍圖、設計規格和技術圖紙。其中大部分對你沒用,但你可以利用裝配藍圖,把搜刮來的機器人部件重新組裝成機器人。" #: lang/json/BOOK_from_json.py msgid "lab defense bot schematics" msgid_plural "lab defense bot schematics" -msgstr[0] "" +msgstr[0] "實驗室警衛機器人" #. ~ Description for lab defense bot schematics #: lang/json/BOOK_from_json.py @@ -16535,12 +16596,12 @@ msgid "" "Assembly plans, design specs, and technical drawings for the lab defense " "bot. Most of this is useless to you, but you could use the assembly plans " "to re-assemble the robot from salvaged parts." -msgstr "" +msgstr "實驗室警衛機器人的裝配藍圖、設計規格和技術圖紙。其中大部分對你沒用,但你可以利用裝配藍圖,把搜刮來的機器人部件重新組裝成機器人。" #: lang/json/BOOK_from_json.py msgid "tank drone schematics" msgid_plural "tank drone schematics" -msgstr[0] "" +msgstr[0] "無人駕駛坦克原理圖" #. ~ Description for tank drone schematics #: lang/json/BOOK_from_json.py @@ -16550,11 +16611,13 @@ msgid "" "you could use the assembly plans to re-assemble the robot from salvaged " "parts." msgstr "" +"帶有 Northrop " +"的標誌,這些是無人駕駛坦克的裝配藍圖、設計規格和技術圖紙。其中大部分對你沒用,但你可以利用裝配藍圖,把搜刮來的機器人部件重新組裝成機器人。" #: lang/json/BOOK_from_json.py msgid "tripod schematics" msgid_plural "tripod schematics" -msgstr[0] "" +msgstr[0] "三足機器人原理圖" #. ~ Description for tripod schematics #: lang/json/BOOK_from_json.py @@ -16563,11 +16626,13 @@ msgid "" "technical drawings for the tripod. Most of this is useless to you, but you " "could use the assembly plans to re-assemble the robot from salvaged parts." msgstr "" +"帶有 Honda " +"的標誌,這些是三足機器人的裝配藍圖、設計規格和技術圖紙。其中大部分對你沒用,但你可以利用裝配藍圖,把搜刮來的機器人部件重新組裝成機器人。" #: lang/json/BOOK_from_json.py msgid "dispatch schematics" msgid_plural "dispatch schematics" -msgstr[0] "" +msgstr[0] "無人機調度機原理圖" #. ~ Description for dispatch schematics #: lang/json/BOOK_from_json.py @@ -16577,11 +16642,13 @@ msgid "" "you could use the assembly plans to re-assemble the robot from salvaged " "parts." msgstr "" +"帶有 Northrop " +"的標誌,這些是無人機調度機的裝配藍圖、設計規格和技術圖紙。其中大部分對你沒用,但你可以利用裝配藍圖,把搜刮來的機器人部件重新組裝成機器人。" #: lang/json/BOOK_from_json.py msgid "military dispatch schematics" msgid_plural "military dispatch schematics" -msgstr[0] "" +msgstr[0] "軍用母艦原理圖" #. ~ Description for military dispatch schematics #: lang/json/BOOK_from_json.py @@ -16591,11 +16658,13 @@ msgid "" "you, but you could use the assembly plans to re-assemble the robot from " "salvaged parts." msgstr "" +"帶有 Northrop " +"的標誌,這些是軍用母艦的裝配藍圖、設計規格和技術圖紙。其中大部分對你沒用,但你可以利用裝配藍圖,把搜刮來的機器人部件重新組裝成機器人。" #: lang/json/BOOK_from_json.py msgid "anti-materiel turret schematics" msgid_plural "anti-materiel turret schematics" -msgstr[0] "" +msgstr[0] "反器材砲塔原理圖" #. ~ Description for anti-materiel turret schematics #: lang/json/BOOK_from_json.py @@ -16603,12 +16672,12 @@ msgid "" "Assembly plans, design specs, and technical drawings for the anti-materiel " "turret. Most of this is useless to you, but you could use the assembly " "plans to re-assemble the robot from salvaged parts." -msgstr "" +msgstr "反器材砲塔的裝配藍圖、設計規格和技術圖紙。其中大部分對你沒用,但你可以利用裝配藍圖,把搜刮來的機器人部件重新組裝成機器人。" #: lang/json/BOOK_from_json.py msgid "milspec searchlight schematics" msgid_plural "milspec searchlight schematics" -msgstr[0] "" +msgstr[0] "軍規探照燈原理圖" #. ~ Description for milspec searchlight schematics #: lang/json/BOOK_from_json.py @@ -16616,7 +16685,7 @@ msgid "" "Assembly plans, design specs, and technical drawings for the milspec " "searchlight. Most of this is useless to you, but you could use the assembly" " plans to re-assemble the robot from salvaged parts." -msgstr "" +msgstr "軍規探照燈的裝配藍圖、設計規格和技術圖紙。其中大部分對你沒用,但你可以利用裝配藍圖,把搜刮來的機器人部件重新組裝成機器人。" #: lang/json/BOOK_from_json.py msgid "The Art of Glassblowing" @@ -17834,26 +17903,26 @@ msgstr "以知識和邏輯進行深入探討道德的重點。" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Nietzsche's \"Beyond Good and Evil\". Its cover is dog-" +"This is a copy of Nietzsche's \"Beyond Good and Evil\". Its cover is dog-" "eared and creased." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"The Unique and Its Property\" by Max Stirner. A modern " +"This is a copy of \"The Unique and Its Property\" by Max Stirner. A modern " "translation by Wolfi Landstreicher." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Jean-Paul Sartre's \"Being and Nothingness\". A key work " +"This is a copy of Jean-Paul Sartre's \"Being and Nothingness\". A key work " "in the existentialist tradition." msgstr "" #: lang/json/BOOK_from_json.py msgid "" "A large, extended version of \"Madness and Civilisation\" by Michel " -"Foucault. The cover features a striking image of a Panopticonic Prison." +"Foucault. The cover features a striking image of a Panopticonic Prison." msgstr "" #: lang/json/BOOK_from_json.py @@ -17864,13 +17933,13 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"A collection of texts and essays by Jacques Derrida. It's pages loose and " +"A collection of texts and essays by Jacques Derrida. It's pages loose and " "yellowed, you should probably handle it with care." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Society of the Spectacle\" by Guy Debord. Its cover " +"This is a copy of \"Society of the Spectacle\" by Guy Debord. Its cover " "shows rows of adults staring placidly into a screen." msgstr "" @@ -17882,36 +17951,36 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of Baudrillard's \"Simulation and Simulacra\". The cover " +"This is a copy of Baudrillard's \"Simulation and Simulacra\". The cover " "contains an image of a man holding a colored pill in each hand, with the " -"caption \"Welcome to the Desert of the Real.\". You think you've seen this " +"caption \"Welcome to the Desert of the Real.\". You think you've seen this " "movie." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a small, pocket version of Sartre's \"Existentialism and Humanism.\"" -" It looks to have been used as a coaster in a past life." +"This is a small, pocket version of Sartre's \"Existentialism and Humanism\"." +" It looks to have been used as a coaster in a past life." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Practical Ethics\" by Peter Singer. From the local " +"This is a copy of \"Practical Ethics\" by Peter Singer. From the local " "university press." msgstr "" #: lang/json/BOOK_from_json.py msgid "" "This is a photocopied spiral-bound copy of \"Industrial Society and Its " -"Future\" by 'Freedom Club'. The original looks to have been written on a " +"Future\" by 'Freedom Club'. The original looks to have been written on a " "typewriter before being copied." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Industrial Society and Its Future\" by Ted Kaczynski. " +"This is a copy of \"Industrial Society and Its Future\" by Ted Kaczynski. " "Its cover is an image of a hand-crafted wooden box filled with wiring and an" -" ominous looking metal tube. Provocative." +" ominous looking metal tube. Provocative." msgstr "" #: lang/json/BOOK_from_json.py @@ -17920,23 +17989,23 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"The State and Revolution\" by Vladimir Lenin. In " +"This is a copy of \"The State and Revolution\" by Vladimir Lenin. In " "English, thankfully." msgstr "" #: lang/json/BOOK_from_json.py -msgid "This is a copy of \"In Defence of Terrorism\" by Leon Trotsky." +msgid "This is a copy of \"In Defense of Marxism\" by Leon Trotsky." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Steal This Book\" by Abbie Hoffman. There is a security " -"tag on the back cover. It appears to still be active." +"This is a copy of \"Steal This Book\" by Abbie Hoffman. There is a security" +" tag on the back cover. It appears to still be active." msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a copy of \"Walden: Or Life In The Woods\" by Henry David Thoreau. " +"This is a copy of \"Walden: Or Life In The Woods\" by Henry David Thoreau. " "It contains a dried and pressed leaf as a bookmark." msgstr "" @@ -17957,7 +18026,7 @@ msgid "" msgstr "" #: lang/json/BOOK_from_json.py -msgid "This is a copy of Machiavelli's \"The Prince\". With intro by Q. Skinner." +msgid "This is a copy of Machiavelli's \"The Prince\". With intro by Q. Skinner." msgstr "" #: lang/json/BOOK_from_json.py @@ -17967,12 +18036,12 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "" -"This is a pocket copy of \"An Essay on Liberation\" by Herbert Marcuse. The " -"cover contains an image of a pelican." +"This is a pocket copy of \"An Essay on Liberation\" by Herbert Marcuse. The" +" cover contains an image of a pelican." msgstr "" #: lang/json/BOOK_from_json.py -msgid "This is a copy of \"Either-Or\" by Sören Kierkegaard." +msgid "This is a copy of \"Either-Or\" by Søren Kierkegaard." msgstr "" #: lang/json/BOOK_from_json.py @@ -17997,6 +18066,69 @@ msgid "" "Science\" by Friederich Nietzsche." msgstr "" +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Myth of Sisyphus\", and other essays, by Albert " +"Camus. The cover depicts a bare-chested man and a large boulder." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Sickness Unto Death\" by Søren Kierkegaard. The " +"pages are dotted with post-it notes." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Defence of Terrorism\" by Leon Trotsky. Despite the" +" title, it does not actually appear to be defending terrorism." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Enquiry Concerning Political Justice\" by William " +"Godwin. This thick book is filled with antiquated phrases." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Abolition of Work and Other Essays\" by Bob Black. " +"It is likely that \"The Abolition of Work\" is the most famous essay in this" +" book." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"What is Property?\" by Pierre-Joseph Proudhon. It looks" +" like this book has a surprisingly long track record of owners." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Conquest of Bread\" by Peter Kropotkin. There is a " +"picture of an old philosopher with magnificent beard, instead of bread, on " +"the cover." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The Trouble with Being Born\" by Emil Cioran. This book" +" might have been printed decades before the cataclysm since the cover is " +"quite weathered." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"The World as Will and Representation\" by Arthur " +"Schopenhauer. It contains a few undecipherable notes and scribbles." +msgstr "" + +#: lang/json/BOOK_from_json.py +msgid "" +"This is a copy of \"Up-Wingers: A Futurist Manifesto\" by FM-2030. It seems" +" that the author's real name is Fereidoun M. Esfandiary." +msgstr "" + #: lang/json/BOOK_from_json.py msgid "phone book" msgid_plural "phone books" @@ -19432,14 +19564,14 @@ msgstr "農業用的化學抗真菌粉末, 能夠消滅植物中的真菌感染 #: lang/json/COMESTIBLE_from_json.py msgid "insecticide" msgid_plural "insecticide" -msgstr[0] "" +msgstr[0] "殺蟲劑" #. ~ Description for insecticide #: lang/json/COMESTIBLE_from_json.py msgid "" "Agricultural-grade chemical insecticide powder designed to eradicate insect " "pests." -msgstr "" +msgstr "農業等級的化學殺蟲劑粉末,用於根除害蟲。" #: lang/json/COMESTIBLE_from_json.py msgid "salt water" @@ -19580,11 +19712,10 @@ msgstr[0] "苯酚" msgid "" "This useful stuff is a potent solvent and has a wide range of reactive " "applications. It can be used to make a huge number of plastics and " -"polymers, it can be a disinfectant, it can strip paint and break down epoxy," -" and it can burn your skin away like tissue paper under a heat gun. Wear " +"polymers, it can be an antiseptic, it can strip paint and break down epoxy, " +"and it can burn your skin away like tissue paper under a heat gun. Wear " "gloves." msgstr "" -"這種有用的物質是一種有效的溶劑,具有廣泛的反應性用途。它可以用來製造大量的塑料和聚合物,它可以作為消毒劑,它可以剝離油漆並分解環氧樹脂,或是像熱風槍燒掉衛生紙一樣的對待你的皮膚。記得戴上你的手套。" #: lang/json/COMESTIBLE_from_json.py msgid "glycerol" @@ -19710,34 +19841,34 @@ msgstr "行家的珍藏與美食者的推崇, 使它成為當代最稀少與獨 #: lang/json/COMESTIBLE_from_json.py msgid "marsala" msgid_plural "marsala" -msgstr[0] "" +msgstr[0] "瑪薩拉酒" #. ~ Description for marsala #: lang/json/COMESTIBLE_from_json.py msgid "A wine popularly used in dishes served in Italian restaurants." -msgstr "" +msgstr "普遍在義大利餐廳供應的葡萄酒。" #: lang/json/COMESTIBLE_from_json.py msgid "vermouth" msgid_plural "vermouth" -msgstr[0] "" +msgstr[0] "苦艾酒" #. ~ Description for vermouth #: lang/json/COMESTIBLE_from_json.py msgid "" "A soft wine with a pleasant herbal flavor and aroma. It is a common " "cocktail ingredient, and can be used as a substitute for white wine." -msgstr "" +msgstr "柔和的葡萄酒,具有令人愉悅的草藥氣味和芳香。它是一種常見的雞尾酒成分,可用作白葡萄酒的替代品。" #: lang/json/COMESTIBLE_from_json.py msgid "barley wine" msgid_plural "barley wine" -msgstr[0] "" +msgstr[0] "大麥酒" #. ~ Description for barley wine #: lang/json/COMESTIBLE_from_json.py msgid "A strong ale." -msgstr "" +msgstr "強烈的啤酒。" #: lang/json/COMESTIBLE_from_json.py msgid "whiskey" @@ -20170,14 +20301,14 @@ msgstr "順滑而濃厚, 這杯由牛奶、奶油和蛋混合而成的濃稠飲 #: lang/json/COMESTIBLE_from_json.py msgid "martini" -msgstr "" +msgstr "馬丁尼" #. ~ Description for martini #: lang/json/COMESTIBLE_from_json.py msgid "" "This is a popular cocktail made with gin and dry vermouth, dating from the " "Prohibition era." -msgstr "" +msgstr "這是一種流行的雞尾酒,由琴酒和乾苦艾酒製成,可以追溯到禁酒時代。" #: lang/json/COMESTIBLE_from_json.py msgid "sourdough bread" @@ -21070,7 +21201,7 @@ msgstr "一塊巨大的肌肉, 腐爛心臟的所有殘餘, 已被切開並排 #: lang/json/COMESTIBLE_from_json.py msgid "raw milk" msgid_plural "raw milk" -msgstr[0] "" +msgstr[0] "生乳" #. ~ Description for raw milk #: lang/json/COMESTIBLE_from_json.py @@ -21080,6 +21211,8 @@ msgid "" "it. Depending on your dietary sensibilities, you might want to pasteurize " "or even boil this before drinking." msgstr "" +"這是來自牛的未加工的、未均勻化的和未經巴氏殺菌的牛乳。 " +"除了你敢冒犯母牛直接從牛身上喝,否則沒有比它更新鮮的牛乳。根據你的飲食敏感度,你可能需要在飲用前進行巴氏消毒或甚至煮沸它。" #: lang/json/COMESTIBLE_from_json.py msgid "shelf stable milk" @@ -21129,25 +21262,25 @@ msgstr "美味的發酵乳。香草味的。" #: lang/json/COMESTIBLE_from_json.py msgid "butter" msgid_plural "butter" -msgstr[0] "" +msgstr[0] "奶油" #. ~ Description for butter #: lang/json/COMESTIBLE_from_json.py msgid "" "A yellow stick of milkfat and milk solids, usually made from cow's milk." -msgstr "" +msgstr "一種黃色的乳脂和牛奶固體,通常由牛奶製成。" #: lang/json/COMESTIBLE_from_json.py msgid "ghee" msgid_plural "ghee" -msgstr[0] "" +msgstr[0] "酥油" #. ~ Description for ghee #: lang/json/COMESTIBLE_from_json.py msgid "" "Clarified butter, free from milk solids and water. Will last a very long " "time." -msgstr "" +msgstr "去雜質的奶油,不含乳固體和水。能保存很長的時間。" #: lang/json/COMESTIBLE_from_json.py msgid "pudding" @@ -21301,14 +21434,14 @@ msgstr "一款傳統的南亞香料奶茶。" #: lang/json/COMESTIBLE_from_json.py msgid "chamomile tea" msgid_plural "chamomile tea" -msgstr[0] "" +msgstr[0] "甘菊茶" #. ~ Description for chamomile tea #: lang/json/COMESTIBLE_from_json.py msgid "" "A healthy beverage made from chamomile flowers steeped in boiling water. " "Can be used to treat insomnia." -msgstr "" +msgstr "由洋甘菊花浸泡在沸水中製成的健康飲料。可用於治療失眠症。" #: lang/json/COMESTIBLE_from_json.py msgid "chocolate drink" @@ -21337,7 +21470,7 @@ msgstr "在大災變前是種早晨儀式,咖啡豆經過複雜的一系列揀 #: lang/json/COMESTIBLE_from_json.py msgid "coffee substitute" msgid_plural "coffee substitute" -msgstr[0] "" +msgstr[0] "咖啡替代品" #. ~ Description for coffee substitute #: lang/json/COMESTIBLE_from_json.py @@ -21345,19 +21478,19 @@ msgid "" "Homemade not-coffee created from the Kentucky coffeetree, just like the " "Meskwaki tribe! Doesn't actually have any caffeine, and is very bitter, but" " it'll pass in a pinch." -msgstr "" +msgstr "肯塔基州咖啡館創造的自製非咖啡,就像 Meskwaki 部落一樣!實際上不含任何咖啡因,而且非常苦,但苦味終會散去的。" #: lang/json/COMESTIBLE_from_json.py msgid "chicory brew" msgid_plural "chicory brew" -msgstr[0] "" +msgstr[0] "菊苣咖啡" #. ~ Description for chicory brew #: lang/json/COMESTIBLE_from_json.py msgid "" "Toasted, ground chicory root steeped in boiling water. This bitter brew is " "used as a coffee substitute, though it tastes nothing like coffee." -msgstr "" +msgstr "烘烤後、磨碎的菊苣根浸泡在沸水中。這種苦味飲品用來當作咖啡的替代品,雖然它的味道不像咖啡。" #: lang/json/COMESTIBLE_from_json.py msgid "dark cola" @@ -21384,7 +21517,7 @@ msgstr "它的味道嘗起來像玻璃穩潔, 但是加了滿滿的糖與咖啡 msgid "" "Cow's milk that has been partly dehydrated, and also sweetened. A key " "ingredient in many sweets." -msgstr "" +msgstr "半脫水後的牛奶,也加了糖。是許多甜品的關鍵成分。" #: lang/json/COMESTIBLE_from_json.py msgid "cream soda" @@ -21551,7 +21684,7 @@ msgstr "小牛的食物, 但是對大人也很好, 很容易臭酸。" #: lang/json/COMESTIBLE_from_json.py msgid "reconstituted milk" msgid_plural "reconstituted milk" -msgstr[0] "" +msgstr[0] "牛奶(沖泡)" #. ~ Description for reconstituted milk #: lang/json/COMESTIBLE_from_json.py @@ -24438,9 +24571,9 @@ msgstr[0] "殺菌粉" #. ~ Description for antiseptic powder #: lang/json/COMESTIBLE_from_json.py msgid "" -"A powdered form of chemical disinfectant, this bismuth formic iodide cleans " +"A powdered form of chemical antiseptic, this bismuth formic iodide cleans " "wounds quickly and painlessly." -msgstr "粉狀的化學殺菌粉, 這種碘化鉍鉀粉末可以快速輕鬆的處理傷口。" +msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "caffeinated chewing gum" @@ -24484,10 +24617,10 @@ msgstr[0] "過氧化氫" #. ~ Description for hydrogen peroxide #: lang/json/COMESTIBLE_from_json.py msgid "" -"Dilute hydrogen peroxide, for use as a disinfectant and for bleaching hair " -"or textiles. Foams a little when in contact with organic matter, but " +"Dilute hydrogen peroxide, for use as an antiseptic and for bleaching hair or" +" textiles. Foams a little when in contact with organic matter, but " "otherwise harmless." -msgstr "一瓶稀釋的雙氧水, 用於消毒或者漂白頭髮和紡織品。接觸到有機物時會起泡, 除此之外是無害的。" +msgstr "" #: lang/json/COMESTIBLE_from_json.py lang/json/GENERIC_from_json.py msgid "cigarette" @@ -24624,23 +24757,23 @@ msgid "" msgstr "適合白天服用的感冒藥, 治療感冒與流感。不嗜睡的配方, 能抑制咳嗽、喉嚨痛、頭痛、流鼻水, 但你仍然需要補充大量的液體和休息。" #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant" +msgid "antiseptic" msgstr "消毒劑" -#. ~ Description for disinfectant +#. ~ Description for antiseptic #: lang/json/COMESTIBLE_from_json.py -msgid "A powerful disinfectant commonly used for contaminated wounds." -msgstr "強力的消毒劑, 能夠清潔傷口。" +msgid "A powerful antiseptic commonly used for contaminated wounds." +msgstr "常用於消毒感染傷口的強效消毒劑。" #: lang/json/COMESTIBLE_from_json.py -msgid "makeshift disinfectant" +msgid "makeshift antiseptic" msgstr "粗製消毒劑" -#. ~ Description for makeshift disinfectant +#. ~ Description for makeshift antiseptic #: lang/json/COMESTIBLE_from_json.py msgid "" -"Makeshift disinfectant made from ethanol. Can be used to disinfect a wound." -msgstr "由乙醇製成的粗製消毒劑。可用於消毒傷口。" +"Makeshift antiseptic made from ethanol. Can be used to disinfect a wound." +msgstr "由乙醇製成的粗製殺毒劑。可用於消毒傷口。" #: lang/json/COMESTIBLE_from_json.py src/addiction.cpp msgid "diazepam" @@ -24979,8 +25112,8 @@ msgstr "麝香草精油" #: lang/json/COMESTIBLE_from_json.py msgid "" "Some essential oil made from thyme, which can act as a mildly irritating " -"disinfectant." -msgstr "從麝香草中提取出來的油, 它可以作為有輕微刺激的消毒劑。" +"antiseptic." +msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "rolling tobacco" @@ -25159,28 +25292,28 @@ msgstr "" "具有強大鎮靜效果的抗焦慮藥。可能會導致精神分裂和喪失記憶。若上癮的話很危險, 應該要避免經常使用, 如果要停藥必須慢慢減藥。它的學名是安柏寧。" #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant soaked rag" -msgid_plural "disinfectant soaked rags" +msgid "antiseptic soaked rag" +msgid_plural "antiseptic soaked rags" msgstr[0] "消毒過的布條" -#. ~ Description for disinfectant soaked rag +#. ~ Description for antiseptic soaked rag #: lang/json/COMESTIBLE_from_json.py msgid "" -"A rag soaked in disinfectant. Useful for light wounds, probaby won't help " -"with deep bites." -msgstr "" +"A rag soaked in antiseptic. Useful for light wounds, probaby won't help with" +" deep bites." +msgstr "一條浸泡過消毒劑的布條。對小傷口有幫助,對被咬得很深的傷口沒用。" #: lang/json/COMESTIBLE_from_json.py -msgid "disinfectant soaked cotton balls" -msgid_plural "disinfectant soaked cotton balls" +msgid "antiseptic soaked cotton balls" +msgid_plural "antiseptic soaked cotton balls" msgstr[0] "消毒過的棉球" -#. ~ Description for disinfectant soaked cotton balls +#. ~ Description for antiseptic soaked cotton balls #: lang/json/COMESTIBLE_from_json.py msgid "" -"Fluffy balls of clean white cotton. Now soaked with disinfectant, they are " +"Fluffy balls of clean white cotton. Now soaked with antiseptic, they are " "somewhat useful to disinfect a wound." -msgstr "" +msgstr "乾淨潔白的蓬鬆棉球。用消毒劑浸泡過,傷口消毒時十分有用。" #: lang/json/COMESTIBLE_from_json.py msgid "Atreyupan" @@ -26612,14 +26745,14 @@ msgstr "脫水豆腐,密封,可以長期保存。" #: lang/json/COMESTIBLE_from_json.py msgid "soybeans" msgid_plural "soybeans" -msgstr[0] "" +msgstr[0] "大豆" #. ~ Description for soybeans #: lang/json/COMESTIBLE_from_json.py msgid "" "Light brown beans, they have many uses, mildly toxic and not recommended, " "but you could eat them raw." -msgstr "" +msgstr "淡褐色的豆子,它們有很多用途,輕度有毒,不推薦,但你可以生吃。" #: lang/json/COMESTIBLE_from_json.py msgid "raw edamame" @@ -26728,14 +26861,14 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "bird food" msgid_plural "bird food" -msgstr[0] "" +msgstr[0] "鳥飼料" #. ~ Description for bird food #: lang/json/COMESTIBLE_from_json.py msgid "" "What birds eat. Mainly made of seeds, silage or legumes. It's perfect for " "small birds." -msgstr "" +msgstr "給鳥類吃的東西。主要由種子,青貯飼料或豆類製成。它非常適合小型鳥。" #: lang/json/COMESTIBLE_from_json.py msgid "dog food" @@ -27165,12 +27298,12 @@ msgstr "一種果皮光滑的水果, 桃子的近親。" #: lang/json/COMESTIBLE_from_json.py msgid "cactus pad" -msgstr "" +msgstr "仙人掌莖葉" #. ~ Description for cactus pad #: lang/json/COMESTIBLE_from_json.py msgid "An edible pad of a cactus." -msgstr "" +msgstr "可食用的仙人掌莖葉。" #: lang/json/COMESTIBLE_from_json.py msgid "barley" @@ -27332,39 +27465,39 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "salsify" msgid_plural "handfuls of salsify" -msgstr[0] "" +msgstr[0] "婆羅門參" #. ~ Description for salsify #: lang/json/COMESTIBLE_from_json.py msgid "" "An herb with a small purple flower. The roots are nutritious, but tough and" " bland until cooked." -msgstr "" +msgstr "開著小紫色花的草本植物。根是營養豐富的,但未煮熟前是堅硬而無味的。" #: lang/json/COMESTIBLE_from_json.py lang/json/COMESTIBLE_from_json.py #: lang/json/furniture_from_json.py msgid "chicory" msgid_plural "handfuls of chicory" -msgstr[0] "" +msgstr[0] "菊苣" #. ~ Description for chicory #: lang/json/COMESTIBLE_from_json.py msgid "" "A modest blue flower. The flower's roots are very bitter and not meant to " "be eaten raw." -msgstr "" +msgstr "一朵藍色的小花。花的根非常苦,不應該生吃。" #: lang/json/COMESTIBLE_from_json.py msgid "wild root" msgid_plural "wild roots" -msgstr[0] "" +msgstr[0] "野生的根" #. ~ Description for wild root #: lang/json/COMESTIBLE_from_json.py msgid "" "A weed with a cluster of tiny white flowers. These are often wild carrots, " "but beware of poisonous lookalikes." -msgstr "" +msgstr "有著叢生白色小花的草。這些通常是野胡蘿蔔,但要小心可能是長的相似的有毒植物。" #: lang/json/COMESTIBLE_from_json.py msgid "dogbane" @@ -27640,6 +27773,19 @@ msgstr[0] "果醬三明治" msgid "A delicious jam sandwich." msgstr "好吃的果醬三明治。" +#: lang/json/COMESTIBLE_from_json.py +msgid "fairy bread" +msgid_plural "fairy bread" +msgstr[0] "" + +#. ~ Description for fairy bread +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"An 'open-faced sandwich' consisting of sliced white bread, a healthy crust-" +"to-crust slathering of butter, and sprinkles. Supposedly a staple of " +"birthday parties in Australia." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "honey sandwich" msgid_plural "honey sandwiches" @@ -28077,22 +28223,22 @@ msgstr[0] "大麗菊" #: lang/json/COMESTIBLE_from_json.py msgid "salsify seeds" msgid_plural "salsify seeds" -msgstr[0] "" +msgstr[0] "婆羅門參種子" #. ~ Description for salsify seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some salsify seeds." -msgstr "" +msgstr "一些婆羅門參種子" #: lang/json/COMESTIBLE_from_json.py msgid "chicory seeds" msgid_plural "chicory seeds" -msgstr[0] "" +msgstr[0] "菊苣種子" #. ~ Description for chicory seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some chicory seeds." -msgstr "" +msgstr "一些菊苣種子" #: lang/json/COMESTIBLE_from_json.py msgid "wild root seeds" @@ -28107,7 +28253,7 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "decorative plant seeds" msgid_plural "decorative plant seeds" -msgstr[0] "" +msgstr[0] "裝飾植物種子" #. ~ Description for decorative plant seeds #: lang/json/COMESTIBLE_from_json.py @@ -28123,16 +28269,16 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "cactus seeds" msgid_plural "cactus seeds" -msgstr[0] "" +msgstr[0] "仙人掌種子" #. ~ Description for cactus seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some cactus seeds." -msgstr "" +msgstr "一些仙人掌種子。" #: lang/json/COMESTIBLE_from_json.py lang/json/terrain_from_json.py msgid "cactus" -msgstr "" +msgstr "仙人掌" #: lang/json/COMESTIBLE_from_json.py msgid "garlic clove" @@ -28225,7 +28371,7 @@ msgid "" "This looks like a sunflower seed the size of your palm. It has a strong but" " delicious aroma, but is clearly either mutated or of alien origin. You " "could probably plant it." -msgstr "" +msgstr "這看起來就像是你手掌般大小的向日葵種子。它具有強烈但甜美的香氣,很顯然地它不是變異來的就是外星物種。你可以種植它。" #: lang/json/COMESTIBLE_from_json.py msgid "bean seeds" @@ -28244,12 +28390,12 @@ msgstr "豆子" #: lang/json/COMESTIBLE_from_json.py msgid "soybean seeds" msgid_plural "soybean seeds" -msgstr[0] "" +msgstr[0] "大豆種子" #. ~ Description for soybean seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some soybean seeds." -msgstr "" +msgstr "一些大豆種子。" #: lang/json/COMESTIBLE_from_json.py msgid "soybean" @@ -28520,12 +28666,12 @@ msgstr "一些烘烤咖啡豆, 可以研磨成粉末。" #: lang/json/COMESTIBLE_from_json.py msgid "chamomile seeds" msgid_plural "chamomile seeds" -msgstr[0] "" +msgstr[0] "洋甘菊種子" #. ~ Description for chamomile seeds #: lang/json/COMESTIBLE_from_json.py msgid "Some chamomile seeds." -msgstr "" +msgstr "一些洋甘菊種子。" #: lang/json/COMESTIBLE_from_json.py lang/json/furniture_from_json.py msgid "chamomile" @@ -28763,6 +28909,20 @@ msgid "" "its own." msgstr "甜蜜蜜的糖。對你的牙齒不好並且不適合直接吃。" +#: lang/json/COMESTIBLE_from_json.py +msgid "sprinkles" +msgid_plural "sprinkles" +msgstr[0] "" + +#. ~ Description for sprinkles +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Known as nonpareils, sprinkles, jimmies, sugar strands or 'hundreds-and-" +"thousands', these colorful balls, rods or flakes of sugar and starch are " +"intended for use decorating soft surfaces of sweets. Like sugar, they are " +"bad for your teeth and surprisingly not very tasty on their own." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "wild herbs" msgid_plural "wild herbs" @@ -29160,14 +29320,14 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "roasted salsify" -msgstr "" +msgstr "烤婆羅門參" #. ~ Description for roasted salsify #: lang/json/COMESTIBLE_from_json.py msgid "" "When properly cooked, salsify tastes vaguely like oysters. Makes a great " "side dish." -msgstr "" +msgstr "若用正確的方式煮熟後,婆羅門參的味道就像牡蠣一樣。是一種很好的配菜。" #: lang/json/COMESTIBLE_from_json.py msgid "sushi rice" @@ -30616,7 +30776,7 @@ msgstr "一個小的塑膠袋子。基本上是垃圾。" #: lang/json/CONTAINER_from_json.py msgid "zipper bag" msgid_plural "zipper bags" -msgstr[0] "" +msgstr[0] "拉鍊袋" #. ~ Description for zipper bag #: lang/json/CONTAINER_from_json.py @@ -31253,7 +31413,7 @@ msgstr "一個紳士的汽球,一個一次性的生命預防器,一個不得 #: lang/json/CONTAINER_from_json.py msgid "large tin can" msgid_plural "large tin cans" -msgstr[0] "" +msgstr[0] "大型錫罐" #. ~ Description for large tin can #: lang/json/CONTAINER_from_json.py @@ -31584,7 +31744,7 @@ msgstr "" msgid "" "A gas turbine engine, usually used for military vehicles. Known for its " "high rate of fuel consumption." -msgstr "" +msgstr "燃油渦輪引擎,通常用於軍用車輛。以其高油耗率而聞名。" #: lang/json/ENGINE_from_json.py msgid "1900 hp gas turbine engine" @@ -31595,11 +31755,11 @@ msgstr "" msgid "" "A large gas turbine engine, usually used for military helicopters. Known " "for its high rate of fuel consumption." -msgstr "" +msgstr "大型燃油渦輪引擎,通常用於軍用直升機。以其高油耗率而聞名。" #: lang/json/ENGINE_from_json.py msgid "6000 hp gas turbine engine" -msgstr "" +msgstr "6000馬力燃油渦輪引擎" #. ~ Description for 6000 hp gas turbine engine #: lang/json/ENGINE_from_json.py @@ -31887,26 +32047,26 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "sandbag" msgid_plural "sandbags" -msgstr[0] "" +msgstr[0] "沙包" #. ~ Description for sandbag #: lang/json/GENERIC_from_json.py msgid "" "This is a canvas sack filled with sand. It can be used to construct simple " "barricades." -msgstr "" +msgstr "這是一個裝滿沙子的帆布袋。它可以用來建設簡單的路障。" #: lang/json/GENERIC_from_json.py msgid "earthbag" msgid_plural "earthbags" -msgstr[0] "" +msgstr[0] "土包" #. ~ Description for earthbag #: lang/json/GENERIC_from_json.py msgid "" "This is a canvas sack filled with soil. It can be used to construct simple " "barricades." -msgstr "" +msgstr "這是一個裝滿土壤的帆布袋。它可以用來建設簡單的路障。" #: lang/json/GENERIC_from_json.py msgid "fake item" @@ -31921,12 +32081,12 @@ msgstr "愚蠢的玩意, 如果你看到它, 接下來一定會有一些壞事 #: lang/json/GENERIC_from_json.py msgid "semi ground grains" msgid_plural "semi ground grains" -msgstr[0] "" +msgstr[0] "半磨粒穀物" #. ~ Description for semi ground grains #: lang/json/GENERIC_from_json.py msgid "A paste of half-finished milled grains, not yet flour." -msgstr "" +msgstr "磨到一半的榖物顆粒,還沒有變成麵粉。" #: lang/json/GENERIC_from_json.py msgid "smoldering embers" @@ -31967,14 +32127,14 @@ msgstr "一種相對古老的貨幣形式。除了它原本作用之外,現在 #: lang/json/GENERIC_from_json.py msgid "family photo" msgid_plural "family photos" -msgstr[0] "" +msgstr[0] "全家福照片" #. ~ Description for family photo #: lang/json/GENERIC_from_json.py msgid "" "A photo of a smiling family on a camping trip. One of the parents looks " "like a cleaner, happier version of the person you know." -msgstr "" +msgstr "一張在露營旅行拍攝的全家福照片。父母其中一個看起來像你認識的人,只是照片中的人比較乾淨也比較開心。" #: lang/json/GENERIC_from_json.py msgid "corpse" @@ -31988,7 +32148,7 @@ msgstr "一個屍體。" #: lang/json/GENERIC_from_json.py msgid "animal" -msgstr "" +msgstr "動物" #: lang/json/GENERIC_from_json.py msgid "nearby fire" @@ -32266,14 +32426,14 @@ msgstr "拇指大小的隨身碟, 儲存資料用。" #: lang/json/GENERIC_from_json.py msgid "data card" msgid_plural "data cards" -msgstr[0] "" +msgstr[0] "資料晶片卡" #. ~ Description for data card #: lang/json/GENERIC_from_json.py msgid "" "Some type of advanced data storage device. Useful for storing very large " "amounts of information." -msgstr "" +msgstr "某種類型的先進的數據存儲裝置。適用於存儲非常大量的資訊。" #: lang/json/GENERIC_from_json.py msgid "golf tee" @@ -32637,14 +32797,14 @@ msgstr "一台損毀的警用機器人, 基本上已經沒有威脅了, 現在 #: lang/json/GENERIC_from_json.py msgid "broken nurse bot" msgid_plural "broken nurse bots" -msgstr[0] "" +msgstr[0] "損毀的護士機器人" #. ~ Description for broken nurse bot #: lang/json/GENERIC_from_json.py msgid "" "A broken nurse bot. Its smooth face staring vacantly into empty space. " "Could be gutted for parts." -msgstr "" +msgstr "一個損毀的護士機器人。它光滑的臉龐茫然地望向虛空。可以拆解來獲得部件。" #: lang/json/GENERIC_from_json.py msgid "broken riot control bot" @@ -32661,14 +32821,14 @@ msgstr "一台損毀的鎮暴機器人, 基本上已經沒有威脅, 現在它 #: lang/json/GENERIC_from_json.py msgid "broken prototype robot" msgid_plural "broken prototype robots" -msgstr[0] "" +msgstr[0] "損毀的原型機器人" #. ~ Description for broken prototype robot #: lang/json/GENERIC_from_json.py msgid "" "A broken prototype robot, well more broken than before. Could be gutted for" " parts." -msgstr "" +msgstr "一個損毀的原型機器人,比先前更加殘破。可以拆解來獲得部件。" #: lang/json/GENERIC_from_json.py msgid "broken miner bot" @@ -32980,6 +33140,20 @@ msgid "" "create an item through a nanofabricator." msgstr "最先進的光學儲存系統,在細小的玻璃板上核著的微型圖案裡,儲存了經由奈米裝配器組裝成物品所需的指令。" +#: lang/json/GENERIC_from_json.py +msgid "nanofabricator template (silicon photonics)" +msgid_plural "nanofabricator template (silicon photonics)s" +msgstr[0] "" + +#. ~ Description for nanofabricator template (silicon photonics) +#: lang/json/GENERIC_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "antenna" msgid_plural "antennas" @@ -33085,7 +33259,7 @@ msgstr "一件沾滿血跡的大布條。能夠用沸水洗淨。" #: lang/json/GENERIC_from_json.py msgid "pipe cleaner" msgid_plural "pipe cleaners" -msgstr[0] "" +msgstr[0] "管道清潔器" #. ~ Description for pipe cleaner #: lang/json/GENERIC_from_json.py @@ -33093,7 +33267,7 @@ msgid "" "This is a tool designed to clean interior surface of pipes, bottles, and " "similar objects. This one is thin enough to be used for cleaning firearm " "barrels from dirt and fouling." -msgstr "" +msgstr "這是一種用於清潔管道、瓶子或類似物體內部表面的工具。這工具細到可用於清除槍管內的灰塵和髒污。" #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "clock" @@ -33548,13 +33722,13 @@ msgstr "向日葵,帶著黃色花瓣和一些尚未被動物吃掉的種子。 #: lang/json/GENERIC_from_json.py msgid "handful of chamomile flowers" msgid_plural "handfuls of chamomile flowers" -msgstr[0] "" +msgstr[0] "洋甘菊花" #. ~ Description for handful of chamomile flowers #: lang/json/GENERIC_from_json.py msgid "" "White chamomile flowers, used as a herbal remedy since the ancient times." -msgstr "" +msgstr "白色洋甘菊花,自古以來就被用作為草藥。" #: lang/json/GENERIC_from_json.py msgid "lump of clay" @@ -33914,14 +34088,14 @@ msgstr "煙草植物,充滿尼古丁。它們需要乾燥才能變成可吸食 #: lang/json/GENERIC_from_json.py msgid "desiccated corpse" msgid_plural "desiccated corpses" -msgstr[0] "" +msgstr[0] "乾屍" #. ~ Description for desiccated corpse #: lang/json/GENERIC_from_json.py msgid "" "A badly mangled and desiccated partial corpse. It seems whatever thing " "killed him did so with a single swipe of a gigantic claw." -msgstr "" +msgstr "一個嚴重受損和乾燥化的殘屍。死因似乎是被不明生物的巨大爪子揮擊致死。" #: lang/json/GENERIC_from_json.py msgid "science ID card" @@ -33952,7 +34126,7 @@ msgstr "這張識別證本來屬於某個高階軍官, 背面印上了使用規 #: lang/json/GENERIC_from_json.py msgid "industrial ID card" msgid_plural "industrial ID cards" -msgstr[0] "" +msgstr[0] "工業 ID 卡" #. ~ Description for industrial ID card #: lang/json/GENERIC_from_json.py @@ -33960,7 +34134,7 @@ msgid "" "This ID card once belonged to a high level technician. The reverse side " "describes protocol for using it; this could grant access at one control " "panel, if you can find one." -msgstr "" +msgstr "這張 ID卡原本屬於某個高級技工,背面有記述使用的通訊協定。它能讓你獲得存取控制台的權限,如果你找的到控制台的話。" #: lang/json/GENERIC_from_json.py msgid "neoprene sheet" @@ -34107,26 +34281,26 @@ msgstr "這是一個進行中的製作" #: lang/json/GENERIC_from_json.py msgid "spare tire carrier" msgid_plural "spare tire carriers" -msgstr[0] "" +msgstr[0] "備胎攜行器" #. ~ Description for spare tire carrier #: lang/json/GENERIC_from_json.py msgid "" "A bumper mounted rig for attaching and storing a spare tire on the back of a" " vehicle. Combine it with a wheel to get a mountable piece." -msgstr "" +msgstr "一種安裝於保險槓上的索具裝置,用於儲放備用輪胎在後車身上。將它與輪胎結合以獲得可安裝的載具部件。" #: lang/json/GENERIC_from_json.py msgid "welding component kit" msgid_plural "welding component kits" -msgstr[0] "" +msgstr[0] "焊接元件套組" #. ~ Description for welding component kit #: lang/json/GENERIC_from_json.py msgid "" "A set of components useful for constructing a full-featured welding station," " complete with soldering capability." -msgstr "" +msgstr "一套用於構建全功能焊接工作站的組件,具有焊接功能。" #: lang/json/GENERIC_from_json.py msgid "amplifier head" @@ -34150,17 +34324,17 @@ msgstr[0] "損毀的砲塔" msgid "" "A broken turret. Much less threatening now that it's laid limp on solid " "ground. Could be gutted for parts." -msgstr "" +msgstr "一台損毀的砲塔,現在它癱倒在地上,威脅性已大幅降低。可以拆解出部件。" #: lang/json/GENERIC_from_json.py msgid "broken milspec turret" msgid_plural "broken milspec turrets" -msgstr[0] "" +msgstr[0] "損毀的軍規砲塔" #: lang/json/GENERIC_from_json.py msgid "broken antimateriel turret" msgid_plural "broken antimateriel turrets" -msgstr[0] "" +msgstr[0] "損毀的反器材砲塔" #: lang/json/GENERIC_from_json.py msgid "broken laser turret" @@ -34170,24 +34344,24 @@ msgstr[0] "損毀的雷射砲塔" #: lang/json/GENERIC_from_json.py msgid "broken secubot" msgid_plural "broken secubots" -msgstr[0] "" +msgstr[0] "損毀的保全機器人" #. ~ Description for broken secubot #: lang/json/GENERIC_from_json.py msgid "" "A broken secubot, with its casing broken and fluid drained. Could be gutted" " for parts." -msgstr "" +msgstr "一台損毀的保全機器人,有著損毀的外殼,管線液體滲出亂流。可以拆解出部件。" #: lang/json/GENERIC_from_json.py msgid "fire brick" msgid_plural "fire bricks" -msgstr[0] "" +msgstr[0] "耐火磚" #. ~ Description for fire brick #: lang/json/GENERIC_from_json.py msgid "A reinforced brick designed to withstand intense heat." -msgstr "" +msgstr "設計成能承受高溫的耐火磚。" #: lang/json/GENERIC_from_json.py msgid "canister grenade" @@ -34258,7 +34432,7 @@ msgstr "這個煙霧彈的插梢已被拔出, 正在釋出濃厚的煙霧。" #: lang/json/GENERIC_from_json.py msgid "fungicidal gas grenade" msgid_plural "fungicidal gas grenades" -msgstr[0] "" +msgstr[0] "殺菌瓦斯手榴彈" #. ~ Description for fungicidal gas grenade #: lang/json/GENERIC_from_json.py @@ -34268,23 +34442,24 @@ msgid "" "grenade. In five turns it will begin to expel a volatile spray that is " "highly toxic to fungal life forms." msgstr "" +"這是一種裝有殺菌溶液的罐式手榴彈。使用它來拉開插銷並點燃保險絲,變成啟動的殺菌手榴彈。在五個回合內,它將排出對真菌生命形式具有高毒性的揮發性噴霧。" #: lang/json/GENERIC_from_json.py msgid "armed fungicidal gas canister" msgid_plural "armed fungicidal gas canisters" -msgstr[0] "" +msgstr[0] "啟動的殺菌瓦斯手榴彈" #. ~ Description for armed fungicidal gas canister #: lang/json/GENERIC_from_json.py msgid "" "This fungicidal bomb has had its pin removed and is expelling highly toxic " "gas." -msgstr "" +msgstr "這個殺菌瓦斯手榴彈的插銷已被拔出,正在釋出高毒性的瓦斯。" #: lang/json/GENERIC_from_json.py msgid "insecticidal gas grenade" msgid_plural "insecticidal gas grenades" -msgstr[0] "" +msgstr[0] "殺蟲瓦斯手榴彈" #. ~ Description for insecticidal gas grenade #: lang/json/GENERIC_from_json.py @@ -34294,23 +34469,24 @@ msgid "" "grenade. In five turns it will begin to expel a volatile spray that is " "highly toxic to insect life forms." msgstr "" +"這是一種裝有殺蟲劑的罐式手榴彈。使用它來拉開插銷並點燃保險絲,變成啟動的殺蟲手榴彈。在五個回合內,它將排出對昆蟲生命形式具有高毒性的揮發性噴霧。" #: lang/json/GENERIC_from_json.py msgid "armed insecticidal gas canister" msgid_plural "armed insecticidal gas canisters" -msgstr[0] "" +msgstr[0] "啟動的殺蟲瓦斯手榴彈" #. ~ Description for armed insecticidal gas canister #: lang/json/GENERIC_from_json.py msgid "" "This insecticidal bomb has had its pin removed and is expelling highly toxic" " haze." -msgstr "" +msgstr "這個殺蟲瓦斯手榴彈的插銷已被拔出,正在釋出高毒性的霾。" #: lang/json/GENERIC_from_json.py msgid "makeshift fungicidal gas grenade" msgid_plural "makeshift fungicidal gas grenades" -msgstr[0] "" +msgstr[0] "粗製殺菌瓦斯手榴彈" #. ~ Description for makeshift fungicidal gas grenade #: lang/json/GENERIC_from_json.py @@ -34320,23 +34496,24 @@ msgid "" "fungicidal grenade. In five turns it will begin to expel a volatile spray " "that is highly toxic to fungal life forms." msgstr "" +"這是一種裝有殺菌溶液的粗製的罐式手榴彈。使用它來拉開插銷並點燃保險絲,變成啟動的殺菌手榴彈。在五個回合內,它將排出對真菌生命形式具有高毒性的揮發性噴霧。" #: lang/json/GENERIC_from_json.py msgid "armed makeshift fungicidal gas canister" msgid_plural "armed makeshift fungicidal gas canisters" -msgstr[0] "" +msgstr[0] "啟動的粗製殺菌瓦斯手榴彈" #. ~ Description for armed makeshift fungicidal gas canister #: lang/json/GENERIC_from_json.py msgid "" "This makeshift fungicidal bomb has had its pin removed and is expelling " "highly toxic haze." -msgstr "" +msgstr "這個粗製殺菌瓦斯手榴彈的插銷已被拔出,正在釋出高毒性的霾。" #: lang/json/GENERIC_from_json.py msgid "makeshift insecticidal gas grenade" msgid_plural "makeshift insecticidal gas grenades" -msgstr[0] "" +msgstr[0] "粗製殺蟲瓦斯手榴彈" #. ~ Description for makeshift insecticidal gas grenade #: lang/json/GENERIC_from_json.py @@ -34346,18 +34523,19 @@ msgid "" "insecticidal grenade. In five turns it will begin to expel a volatile spray" " that is highly toxic to insect life forms." msgstr "" +"這是一種裝有殺蟲劑的粗製的罐式手榴彈。使用它來拉開插銷並點燃保險絲,變成啟動的殺蟲手榴彈。在五個回合內,它將排出對昆蟲生命形式具有高毒性的揮發性噴霧。" #: lang/json/GENERIC_from_json.py msgid "armed makeshift insecticidal gas canister" msgid_plural "armed makeshift insecticidal gas canisters" -msgstr[0] "" +msgstr[0] "啟動的粗製殺蟲瓦斯手榴彈" #. ~ Description for armed makeshift insecticidal gas canister #: lang/json/GENERIC_from_json.py msgid "" "This makeshift insecticidal bomb has had its pin removed and is expelling " "highly toxic haze." -msgstr "" +msgstr "這個粗製殺蟲瓦斯手榴彈的插銷已被拔出,正在釋出高毒性的霾。" #: lang/json/GENERIC_from_json.py msgid "hatchet" @@ -34862,82 +35040,82 @@ msgstr "一份蜷曲帶有光澤的傳單, 似乎在宣傳一個大型地下都 #: lang/json/GENERIC_from_json.py msgid "module template" msgid_plural "module templates" -msgstr[0] "" +msgstr[0] "模組樣板" #. ~ Description for module template #: lang/json/GENERIC_from_json.py msgid "This is a template for robot module. If found in a game it is a bug." -msgstr "" +msgstr "這是機器人模組的模板。如果在遊戲中找到它就是程式出錯了。" #: lang/json/GENERIC_from_json.py msgid "targeting module" msgid_plural "targeting modules" -msgstr[0] "" +msgstr[0] "瞄準模組" #. ~ Description for targeting module #: lang/json/GENERIC_from_json.py msgid "" "This module integrate visual and proprioceptive information from peripheric " "sensors and outputs information necessary for accurate aiming." -msgstr "" +msgstr "該模組整合了來自外圍傳感器的視覺和本體感受的資訊,並輸出了用於精確瞄準所需的資訊。" #: lang/json/GENERIC_from_json.py msgid "identification module" msgid_plural "identification modules" -msgstr[0] "" +msgstr[0] "識別模組" #. ~ Description for identification module #: lang/json/GENERIC_from_json.py msgid "" "This module continuously runs image recognition algorithms to identify " "friends from foe." -msgstr "" +msgstr "該模組持續運行圖像識別演算法,用以識別敵友。" #: lang/json/GENERIC_from_json.py msgid "pathfinding module" msgid_plural "pathfinding modules" -msgstr[0] "" +msgstr[0] "尋徑模組" #. ~ Description for pathfinding module #: lang/json/GENERIC_from_json.py msgid "" "This module uses a combination of vector integration and egocentric mapping " "to find the best path available." -msgstr "" +msgstr "該模組使用向量積分和自我中心製圖的組合來找出可用的最佳路徑。" #: lang/json/GENERIC_from_json.py msgid "memory banks module" msgid_plural "memory banks modules" -msgstr[0] "" +msgstr[0] "記憶體模組" #. ~ Description for memory banks module #: lang/json/GENERIC_from_json.py msgid "Allows for storage and recovery of information." -msgstr "" +msgstr "允許儲存和復原資訊。" #: lang/json/GENERIC_from_json.py msgid "sensor array" msgid_plural "sensor arrays" -msgstr[0] "" +msgstr[0] "傳感器陣列" #. ~ Description for sensor array #: lang/json/GENERIC_from_json.py msgid "" "A wide range of sensors meant to give the ability to perceive the " "surrounding world." -msgstr "" +msgstr "廣距的傳感器組意味這能夠感知周遭的世界環境。" #: lang/json/GENERIC_from_json.py msgid "self monitoring sensors" msgid_plural "self monitoring sensorss" -msgstr[0] "" +msgstr[0] "自我監測傳感器" #. ~ Description for self monitoring sensors #: lang/json/GENERIC_from_json.py msgid "" "A array of sensors and diagnostic modules allowing the robot to perceive " "itself." -msgstr "" +msgstr "一系列傳感器和診斷模組,允許機器人能感知自我狀態。" #: lang/json/GENERIC_from_json.py msgid "AI core" @@ -34949,118 +35127,118 @@ msgstr[0] "人工智慧核心" msgid "" "This module is responsible for decision making, it basically runs the AI of " "the robot." -msgstr "" +msgstr "該模組負責決策,基本上它運行機器人的人工智慧。" #: lang/json/GENERIC_from_json.py msgid "basic AI core" msgid_plural "basic AI cores" -msgstr[0] "" +msgstr[0] "基本人工智慧核心" #. ~ Description for basic AI core #: lang/json/GENERIC_from_json.py msgid "A very basic AI core with minimal cognitive abilities." -msgstr "" +msgstr "一個非常基本的人工智慧核心,具有最低的認知能力。" #: lang/json/GENERIC_from_json.py msgid "advanced AI core" msgid_plural "advanced AI cores" -msgstr[0] "" +msgstr[0] "先進人工智慧核心" #. ~ Description for advanced AI core #: lang/json/GENERIC_from_json.py msgid "An advanced AI core with impressive cognitive abilities." -msgstr "" +msgstr "先進的人工智慧核心與優秀的認知能力。" #: lang/json/GENERIC_from_json.py msgid "gun operating system" msgid_plural "gun operating systems" -msgstr[0] "" +msgstr[0] "槍械操作系統" #. ~ Description for gun operating system #: lang/json/GENERIC_from_json.py msgid "This system can operate most conventional weapons." -msgstr "" +msgstr "該系統可以操作大多數的常規武器。" #: lang/json/GENERIC_from_json.py msgid "set of spidery legs" msgid_plural "sets of spidery legs" -msgstr[0] "" +msgstr[0] "一套蜘蛛足" #. ~ Description for set of spidery legs #: lang/json/GENERIC_from_json.py msgid "A set of big pointy legs, like the ones found under a tripod." -msgstr "" +msgstr "一套大尖腿,就像三腳架的腿。" #: lang/json/GENERIC_from_json.py msgid "set of tiny spidery legs" msgid_plural "sets of tiny spidery legs" -msgstr[0] "" +msgstr[0] "一套微型蜘蛛足" #. ~ Description for set of tiny spidery legs #: lang/json/GENERIC_from_json.py msgid "A set of tiny pointy legs, like the ones found under a skitterbot." -msgstr "" +msgstr "一套小尖腿,就像爬蟲機器人的腿。" #: lang/json/GENERIC_from_json.py msgid "set of reverse-jointed legs" msgid_plural "sets of reverse-jointed legs" -msgstr[0] "" +msgstr[0] "一套反向關節足" #. ~ Description for set of reverse-jointed legs #: lang/json/GENERIC_from_json.py msgid "" "A set of reverse-jointed legs, like the ones found under a chicken walker." -msgstr "" +msgstr "一套反向關節的腿,就像雙足步行機器人的腿。" #: lang/json/GENERIC_from_json.py msgid "set of omni wheels" msgid_plural "sets of omni wheels" -msgstr[0] "" +msgstr[0] "一套全向輪" #. ~ Description for set of omni wheels #: lang/json/GENERIC_from_json.py msgid "A set of omni wheels, like the ones found under a police bot." -msgstr "" +msgstr "一套全方向的輪子,就像警用機器人的腿。" #: lang/json/GENERIC_from_json.py msgid "set of rotors" msgid_plural "sets of rotors" -msgstr[0] "" +msgstr[0] "一套轉子組" #. ~ Description for set of rotors #: lang/json/GENERIC_from_json.py msgid "A set of rotors able to lift a small drone." -msgstr "" +msgstr "一組能夠舉起小型無人機的轉子。" #: lang/json/GENERIC_from_json.py msgid "set of android legs" msgid_plural "sets of android legs" -msgstr[0] "" +msgstr[0] "一套機器人足" #. ~ Description for set of android legs #: lang/json/GENERIC_from_json.py msgid "A set of human-like legs." -msgstr "" +msgstr "一套類似人類的腿。" #: lang/json/GENERIC_from_json.py msgid "set of android arms" msgid_plural "sets of android arms" -msgstr[0] "" +msgstr[0] "一套機器人手" #. ~ Description for set of android arms #: lang/json/GENERIC_from_json.py msgid "A set of human-like arms." -msgstr "" +msgstr "一套類似人類的手" #: lang/json/GENERIC_from_json.py msgid "set of small tank tread" msgid_plural "sets of small tank tread" -msgstr[0] "" +msgstr[0] "一套小型履帶" #. ~ Description for set of small tank tread #: lang/json/GENERIC_from_json.py msgid "A set of small tank tread, like the one used by the \"Beagle\" mini-tank." -msgstr "" +msgstr "一套小型的履帶,就像 Beagle 迷你坦克用的那樣。" #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "turret chassis" @@ -35072,65 +35250,65 @@ msgstr[0] "砲塔底盤" msgid "" "What's left when you remove all moving parts and electronics. It's the " "skeleton and armor of a turret." -msgstr "" +msgstr "移除所有運動部件和電子設備後剩下的東西。它是砲塔的骨架和盔甲。" #: lang/json/GENERIC_from_json.py msgid "tripod chassis" msgid_plural "tripod chassis" -msgstr[0] "" +msgstr[0] "三足機器人機殼" #. ~ Description for tripod chassis #: lang/json/GENERIC_from_json.py msgid "" "What's left when you remove all moving parts and electronics. It's the " "skeleton and armor of the tripod." -msgstr "" +msgstr "移除所有運動部件和電子設備後剩下的東西。它是三足機器人的骨架和盔甲。" #: lang/json/GENERIC_from_json.py msgid "chicken walker chassis" msgid_plural "chicken walker chassis" -msgstr[0] "" +msgstr[0] "雙足步行機器人機殼" #. ~ Description for chicken walker chassis #: lang/json/GENERIC_from_json.py msgid "" "What's left when you remove all moving parts and electronics. It's the " "skeleton and armor of the chicken walker." -msgstr "" +msgstr "移除所有運動部件和電子設備後剩下的東西。它是雙足步行機器人的骨架和盔甲。" #: lang/json/GENERIC_from_json.py msgid "police bot chassis" msgid_plural "police bot chassis" -msgstr[0] "" +msgstr[0] "警用機器人機殼" #. ~ Description for police bot chassis #: lang/json/GENERIC_from_json.py msgid "" "What's left when you remove all moving parts and electronics. It's the " "skeleton and armor of the police bot." -msgstr "" +msgstr "移除所有運動部件和電子設備後剩下的東西。它是警用機器人的骨架和盔甲。" #: lang/json/GENERIC_from_json.py msgid "android skeleton" msgid_plural "android skeletons" -msgstr[0] "" +msgstr[0] "人形機器人骨架" #. ~ Description for android skeleton #: lang/json/GENERIC_from_json.py msgid "What's left when you strip an android body from its components." -msgstr "" +msgstr "移除所有部件後的人型機器人軀體。" #: lang/json/GENERIC_from_json.py msgid "Beagle chassis" msgid_plural "Beagle chassis" -msgstr[0] "" +msgstr[0] "Beagle 機殼" #. ~ Description for Beagle chassis #: lang/json/GENERIC_from_json.py msgid "" "What's left when you remove all moving parts and electronics. It's the " "skeleton and armor of the Beagle tank." -msgstr "" +msgstr "移除所有運動部件和電子設備後剩下的東西。它是Beagle坦克的骨架和盔甲。" #: lang/json/GENERIC_from_json.py src/cata_tiles.cpp src/cata_tiles.cpp #: src/options.cpp @@ -35211,7 +35389,7 @@ msgstr "地下火車路線和時刻表的物流數據。" #: lang/json/GENERIC_from_json.py msgid "neural data" msgid_plural "neural data" -msgstr[0] "" +msgstr[0] "神經數據" #. ~ Description for neural data #: lang/json/GENERIC_from_json.py @@ -35220,6 +35398,9 @@ msgid "" "\n" "Whatever the case, the idea of perpetually keeping a part of you within a metallic pill makes you feel uncomfortable." msgstr "" +"從死去科學家的記憶庫所竊取的資料。該所有者的想法是否依然藏匿在難以理解的數據之中;或者這些只是某人生命中珍貴時刻的集合?\n" +"\n" +"無論如何,永久地將你的一部分留在金屬丸中,這個想法讓你感到不舒服。" #: lang/json/GENERIC_from_json.py msgid "atomic coffee maker" @@ -35265,6 +35446,7 @@ msgid "" "preparedness. Now, it's actually pretty cool. Use it to close the cover " "and hide the light." msgstr "" +"由核衰變的魔力驅動和低能耗的LED組,這種非常昂貴的燈將發出少量的光至少十年。在大災變之前,它主要是一種炫耀你預備的昂貴方式。現在,它其實非常酷。使用它來蓋上蓋子並隱藏燈光。" #: lang/json/GENERIC_from_json.py msgid "atomic lamp (covered)" @@ -35292,11 +35474,12 @@ msgid "" "preparedness. Now, it's actually pretty cool. The cover is closed. Use it" " to open the cover and show the light." msgstr "" +"由核衰變的魔力驅動和低能耗的LED組,這種非常昂貴的燈將發出少量的光至少十年。在大災變之前,它主要是一種炫耀你預備的昂貴方式。現在,它其實非常酷。蓋子已經蓋上。使用它來打開蓋子並顯示燈光。" #: lang/json/GENERIC_from_json.py lang/json/TOOL_from_json.py msgid "atomic reading light" msgid_plural "atomic reading lights" -msgstr[0] "" +msgstr[0] "原子閱讀燈" #. ~ Use action msg for atomic reading light. #. ~ Use action msg for magical reading light. @@ -35313,11 +35496,12 @@ msgid "" " it into a nightlight for a very wealthy child with a fear of the dark. Use" " it to close the cover and hide the light." msgstr "" +"由核衰變的魔力驅動和低能耗的LED組,這種極其昂貴的小燈將提供十年以上的光線讓你閱讀。它還附有一個可愛卡通熊的蓋子,使它能轉成夜光模式,讓一個超極有錢的小孩不再怕黑。使用它來蓋上蓋子並隱藏燈光。" #: lang/json/GENERIC_from_json.py msgid "atomic reading light (covered)" msgid_plural "atomic reading lights (covered)" -msgstr[0] "" +msgstr[0] "原子閱讀燈(蓋上)" #. ~ Use action msg for atomic reading light (covered). #. ~ Use action msg for magical reading light (covered). @@ -35334,6 +35518,7 @@ msgid "" " it into a nightlight for a very wealthy child with a fear of the dark. The" " cover is closed. Use it to open the cover and show the light." msgstr "" +"由核衰變的魔力驅動和低能耗的LED組,這種極其昂貴的小燈將提供十年以上的光線讓你閱讀。它還附有一個可愛卡通熊的蓋子,使它能轉成夜光模式,讓一個超極有錢的小孩不再怕黑。蓋子已經蓋上。使用它來打開蓋子並顯示燈光。" #: lang/json/GENERIC_from_json.py msgid "mind splicer kit" @@ -35765,12 +35950,12 @@ msgstr "一個金屬的水龍頭, 可以連接到水箱上以便取水。" #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "towel hanger" msgid_plural "towel hangers" -msgstr[0] "" +msgstr[0] "毛巾架" #. ~ Description for towel hanger #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "A towel hanger with towels." -msgstr "" +msgstr "毛巾架掛著一些毛巾。" #: lang/json/GENERIC_from_json.py msgid "vehicle tracking device" @@ -35800,7 +35985,7 @@ msgstr "一系列鋼管支架,滑輪和皮帶,安裝在車輛的邊緣,用 #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "recharging station" msgid_plural "recharging stations" -msgstr[0] "" +msgstr[0] "車載充電站" #. ~ Description for recharging station #: lang/json/GENERIC_from_json.py @@ -35811,6 +35996,7 @@ msgid "" "can only be installed onto existing storage compartments, and is controlled " "from a dashboard or electronics control unit." msgstr "" +"一種通用的充電站,設計以載具的電力來充電物品。啟動它後,它將穩定地為放置在其儲物空間內的所有可充電電池(電池,鉛酸電池等)充電。該系統只能安裝在現有的載具儲物空間上,並由儀表板或電子控制元件來操作。" #: lang/json/GENERIC_from_json.py msgid "vehicle heater" @@ -35825,12 +36011,12 @@ msgstr "車載暖器。" #: lang/json/GENERIC_from_json.py msgid "vehicle cooler" msgid_plural "vehicle coolers" -msgstr[0] "" +msgstr[0] "車載冷氣" #. ~ Description for vehicle cooler #: lang/json/GENERIC_from_json.py msgid "A vehicle-mounted area cooler." -msgstr "" +msgstr "一種安裝於車輛載具的區域型冷卻器。" #: lang/json/GENERIC_from_json.py msgid "camera display" @@ -35878,14 +36064,14 @@ msgstr "武器的通用支架, 用於安裝砲塔。" #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "mounted spare tire" msgid_plural "mounted spare tires" -msgstr[0] "" +msgstr[0] "車載備胎" #. ~ Description for mounted spare tire #: lang/json/GENERIC_from_json.py msgid "" "A spare tire mounted on a carrier rig, ready to be attached to the rear " "bumper of a vehicle." -msgstr "" +msgstr "車輛備胎置放於攜型索具中,已準備好安裝於車身後保險桿上。" #: lang/json/GENERIC_from_json.py msgid "abstract map" @@ -37150,12 +37336,12 @@ msgstr "一個空的 9x18mm 子彈殼。" #: lang/json/GENERIC_from_json.py msgid ".380 ACP casing" msgid_plural ".380 ACP casings" -msgstr[0] "" +msgstr[0] ".380 ACP 彈殼" #. ~ Description for .380 ACP casing #: lang/json/GENERIC_from_json.py msgid "An empty casing from a .380 ACP round." -msgstr "" +msgstr "一個空的 .380 ACP 子彈殼。" #: lang/json/GENERIC_from_json.py msgid "152mm ATGM tube" @@ -37196,7 +37382,7 @@ msgstr[0] "" #. ~ Description for .300BLK casing #: lang/json/GENERIC_from_json.py -msgid "An empty casing from a .300BLK round." +msgid "An empty casing from a .300 AAC Blackout round." msgstr "" #: lang/json/GENERIC_from_json.py @@ -37268,12 +37454,12 @@ msgstr[0] "" #. ~ Description for generic kitchen knife #: lang/json/GENERIC_from_json.py lang/json/TOOL_from_json.py msgid "generic item template" -msgstr "" +msgstr "通用物品模板" #: lang/json/GENERIC_from_json.py msgid "generic utensil" msgid_plural "generic utensils" -msgstr[0] "" +msgstr[0] "通用器具" #: lang/json/GENERIC_from_json.py msgid "generic dish" @@ -37318,7 +37504,7 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "coffee mug" msgid_plural "coffee mugs" -msgstr[0] "" +msgstr[0] "咖啡馬克杯" #. ~ Description for coffee mug #: lang/json/GENERIC_from_json.py @@ -37342,7 +37528,7 @@ msgstr "" msgid "" "The side of the mug has a comical green face on it and says 'I'm a zombie " "without my coffee!'." -msgstr "" +msgstr "杯子的側面上有個滑稽的綠臉,它說:沒有咖啡我就是隻殭屍。" #: lang/json/GENERIC_from_json.py msgid "The side of the mug reads 'I'd rather be playing open source games'." @@ -37366,7 +37552,7 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "The mug is blue and looks like a TARDIS." -msgstr "" +msgstr "杯子是藍色的,看起來像是台 TARDIS (英劇裡的時光機兼太空梭)。" #: lang/json/GENERIC_from_json.py msgid "The side of the mug reads 'STAR WARS' over a picture of a lightsaber." @@ -37407,7 +37593,7 @@ msgstr "錫製餐盤,輕巧而緊湊。" #: lang/json/GENERIC_from_json.py msgid "tin cup" msgid_plural "tin cups" -msgstr[0] "" +msgstr[0] "錫杯" #. ~ Description for tin cup #: lang/json/GENERIC_from_json.py @@ -37439,17 +37625,17 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "drinking glass" msgid_plural "drinking glasses" -msgstr[0] "" +msgstr[0] "玻璃水杯" #. ~ Description for drinking glass #: lang/json/GENERIC_from_json.py msgid "A tall drinking glass." -msgstr "" +msgstr "高腳玻璃杯。" #: lang/json/GENERIC_from_json.py msgid "wine glass" msgid_plural "wine glasses" -msgstr[0] "" +msgstr[0] "玻璃酒杯" #. ~ Description for wine glass #: lang/json/GENERIC_from_json.py @@ -37476,12 +37662,12 @@ msgstr[0] "" #. ~ Description for plastic plate #: lang/json/GENERIC_from_json.py msgid "A durable plastic plate, the sort you might use as patio dishware." -msgstr "" +msgstr "耐用的塑膠板子,你可以用它作為庭院餐具。" #: lang/json/GENERIC_from_json.py msgid "plastic tumbler" msgid_plural "plastic tumblers" -msgstr[0] "" +msgstr[0] "塑膠隨行杯" #. ~ Description for plastic tumbler #: lang/json/GENERIC_from_json.py @@ -37586,7 +37772,7 @@ msgstr "一根叉子, 能插起任何你想吃的東西。等等… 算了。" #: lang/json/GENERIC_from_json.py msgid "plastic fork" msgid_plural "plastic forks" -msgstr[0] "" +msgstr[0] "塑膠叉子" #. ~ Description for plastic fork #: lang/json/GENERIC_from_json.py @@ -37608,7 +37794,7 @@ msgstr "別試著折彎湯匙。那是不可能的。" #: lang/json/GENERIC_from_json.py msgid "plastic spoon" msgid_plural "plastic spoons" -msgstr[0] "" +msgstr[0] "塑膠湯匙" #. ~ Description for plastic spoon #: lang/json/GENERIC_from_json.py @@ -37665,7 +37851,7 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "plastic knife" msgid_plural "plastic knives" -msgstr[0] "" +msgstr[0] "塑膠餐刀" #. ~ Description for plastic knife #: lang/json/GENERIC_from_json.py @@ -37682,7 +37868,7 @@ msgstr[0] "" #. ~ Description for plastic straw #: lang/json/GENERIC_from_json.py msgid "A plastic straw, for drinking things and making litter" -msgstr "" +msgstr "塑膠吸管,用於飲用並製造垃圾。" #: lang/json/GENERIC_from_json.py msgid "corkscrew" @@ -37698,7 +37884,7 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "vegetable peeler" msgid_plural "vegetable peelers" -msgstr[0] "" +msgstr[0] "蔬菜削皮器" #. ~ Description for vegetable peeler #: lang/json/GENERIC_from_json.py @@ -37710,12 +37896,12 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "bottle opener" msgid_plural "bottle openers" -msgstr[0] "" +msgstr[0] "開瓶器" #. ~ Description for bottle opener #: lang/json/GENERIC_from_json.py msgid "A simple lever for popping open bottles." -msgstr "" +msgstr "一個簡單的槓桿,用於開瓶。" #: lang/json/GENERIC_from_json.py msgid "" @@ -37725,11 +37911,11 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "This bottle opener is shaped like a lightsaber." -msgstr "" +msgstr "這個開瓶器的形狀像一把光劍。" #: lang/json/GENERIC_from_json.py msgid "This bottle opener is shaped like a revolver." -msgstr "" +msgstr "這個開瓶器的形狀像一把左輪手槍。" #: lang/json/GENERIC_from_json.py msgid "" @@ -37852,7 +38038,7 @@ msgstr[0] "" msgid "" "It's like a tiny pitchfork, or a very large dinner fork. You use it to hold" " meat still while you slice it." -msgstr "" +msgstr "它就像一個小乾草叉,或一個非常大的餐叉。用它來裝你剛切下的肉片。" #: lang/json/GENERIC_from_json.py msgid "spatula" @@ -37891,7 +38077,7 @@ msgstr "適合燒水、煮義大利麵, 還有其他用途。" #: lang/json/GENERIC_from_json.py msgid "cast-iron pot" msgid_plural "cast-iron pots" -msgstr[0] "" +msgstr[0] "鑄鐵鍋子" #. ~ Description for cast-iron pot #: lang/json/GENERIC_from_json.py @@ -37955,7 +38141,7 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "cast-iron frying pan" msgid_plural "cast-iron frying pans" -msgstr[0] "" +msgstr[0] "鑄鐵平底鍋" #. ~ Description for cast-iron frying pan #: lang/json/GENERIC_from_json.py @@ -37966,25 +38152,25 @@ msgstr "用鐵鑄造的, 不僅可以防身, 還可以拿來煮菜。" #: lang/json/GENERIC_from_json.py msgid "steel frying pan" msgid_plural "steel frying pans" -msgstr[0] "" +msgstr[0] "鋼平底鍋" #. ~ Description for steel frying pan #: lang/json/GENERIC_from_json.py msgid "" "A steel frying pan. Makes a decent melee weapon, and is used for cooking." -msgstr "" +msgstr "鋼製的平底鍋。可當作不錯的近戰武器,也能拿來煮東西。" #: lang/json/GENERIC_from_json.py msgid "copper frying pan" msgid_plural "copper frying pans" -msgstr[0] "" +msgstr[0] "銅平底鍋" #. ~ Description for copper frying pan #: lang/json/GENERIC_from_json.py msgid "" "A copper frying pan, coated in a thin layer of tin. Makes a decent melee " "weapon, and is used for cooking." -msgstr "" +msgstr "鋼製的平底鍋,塗有一層薄錫。可當作不錯的近戰武器,也能拿來煮東西。" #: lang/json/GENERIC_from_json.py msgid "makeshift pot" @@ -38023,7 +38209,7 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "cutting board" msgid_plural "cutting boards" -msgstr[0] "" +msgstr[0] "砧板" #. ~ Description for cutting board #: lang/json/GENERIC_from_json.py @@ -38691,6 +38877,34 @@ msgid "" "had fake black soot painted on." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "blackjack" +msgid_plural "blackjacks" +msgstr[0] "" + +#. ~ Description for blackjack +#: lang/json/GENERIC_from_json.py +msgid "" +"This is a short, easily concealed bludgeoning weapon consisting of a weight " +"embedded at the end of a short leather shaft. Formerly used by law " +"enforcement, this weapon is meant to stun or knock out the subject, although" +" head strikes have a high risk of causing a permanent, disabling brain " +"injury or being fatal." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "makeshift sap" +msgid_plural "makeshift saps" +msgstr[0] "" + +#. ~ Description for makeshift sap +#: lang/json/GENERIC_from_json.py +msgid "" +"This is an improvised sap, also known as a cosh, slapjack and slapper. A " +"short and flat bludgeoning weapon consisting of a weight embedded between " +"two patches of leather." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "pointy stick" msgid_plural "pointy sticks" @@ -39132,6 +39346,28 @@ msgid "" "is marginally shorter than the foil and epee, but no less effective." msgstr "一種用於擊劍運動的武器, 擊劍是所有運動中最高貴的。軍刀比鈍劍與銳劍稍短, 但一樣有效。" +#: lang/json/GENERIC_from_json.py +msgid "hollow cane" +msgid_plural "hollow canes" +msgstr[0] "" + +#. ~ Description for hollow cane +#: lang/json/GENERIC_from_json.py +msgid "" +"A cane designed to conceal blade. This was a popular fashion accessory for " +"the wealthy during the 18th and 19th centuries." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "sword cane" +msgid_plural "sword canes" +msgstr[0] "" + +#. ~ Description for sword cane +#: lang/json/GENERIC_from_json.py +msgid "A sword with a thin blade designed to be hidden inside an hollow cane." +msgstr "" + #: lang/json/GENERIC_from_json.py lang/json/TOOL_from_json.py #: lang/json/TOOL_from_json.py msgid "cutlass" @@ -39369,24 +39605,24 @@ msgstr "一小塊的銅, 能用於製作或修理。" #: lang/json/GENERIC_from_json.py lang/json/furniture_from_json.py msgid "mattress" msgid_plural "mattresses" -msgstr[0] "" +msgstr[0] "床墊" #. ~ Description for mattress #: lang/json/GENERIC_from_json.py msgid "This is a single, or twin, sized mattress." -msgstr "" +msgstr "這是一張單人或雙人床墊。" #: lang/json/GENERIC_from_json.py msgid "plastic sheet" msgid_plural "plastic sheets" -msgstr[0] "" +msgstr[0] "塑膠床單" #. ~ Description for plastic sheet #: lang/json/GENERIC_from_json.py msgid "" "This is a large sheet of heavy flexible plastic, the sort that might have " "been used for commercial wrapping or for weather-sealing a home." -msgstr "" +msgstr "這是一大張厚重的軟塑膠,可用於商業包裝或家用防水。" #: lang/json/GENERIC_from_json.py msgid "log" @@ -39398,7 +39634,7 @@ msgstr[0] "原木" msgid "" "A large chunk of log, cut from a tree. (a)ctivate a wood axe or wood saw to" " cut it into planks." -msgstr "" +msgstr "一大塊原木,從樹上砍下來的。使用木斧或木鋸將其切成木板。" #: lang/json/GENERIC_from_json.py msgid "splintered wood" @@ -39447,7 +39683,7 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "plank" msgid_plural "planks" -msgstr[0] "" +msgstr[0] "角材" #. ~ Description for plank #: lang/json/GENERIC_from_json.py @@ -39455,12 +39691,12 @@ msgid "" "A narrow, thick plank of wood, like a 2 by 4 or similar piece of dimensional" " lumber. Makes a decent melee weapon, and can be used for all kinds " "construction." -msgstr "" +msgstr "一塊窄長厚實的木材,如 2x4 或類似尺寸的木材。可當作不錯的近戰武器,而且可用於各種建築。" #: lang/json/GENERIC_from_json.py msgid "heavy wooden beam" msgid_plural "heavy wooden beams" -msgstr[0] "" +msgstr[0] "重木樑" #. ~ Description for heavy wooden beam #: lang/json/GENERIC_from_json.py @@ -39468,12 +39704,12 @@ msgid "" "An enormous beam of solid wood, very heavy and hard to lug around, but also " "very sturdy for construction. You could saw or chop it into smaller pieces," " like planks or panels." -msgstr "" +msgstr "巨大的實木樑,非常沉重,很難隨身拖行,但也是非常堅固的建材。你可以鋸或切成小塊,如角材或木板。" #: lang/json/GENERIC_from_json.py msgid "wooden panel" msgid_plural "wooden panels" -msgstr[0] "" +msgstr[0] "木板" #. ~ Description for wooden panel #: lang/json/GENERIC_from_json.py @@ -39483,11 +39719,13 @@ msgid "" "kinds of construction, but for really big projects you'd need a proper sheet" " of uncut plywood or the like." msgstr "" +"寬薄的木板 - " +"膠合板,OSB,MDF,榫槽板或類似物,已經切割成形。這些大型平板適用於各種建築,但對於真正的大型項目,你需要一塊合適的未切割的膠合板或類似物。" #: lang/json/GENERIC_from_json.py msgid "large wooden sheet" msgid_plural "large wooden sheets" -msgstr[0] "" +msgstr[0] "大木板" #. ~ Description for large wooden sheet #: lang/json/GENERIC_from_json.py @@ -39496,6 +39734,7 @@ msgid "" " bulky, this is extremely useful for all manner of construction, but you " "might have to cut it to size before doing smaller projects." msgstr "" +"標準的 4x8 平板木板 - 通常是膠合板,OSB或MDF。又大又重,適用於各種類的建設,但在進行小型項目之前,你可能需要將其切割成適合的尺寸。" #: lang/json/GENERIC_from_json.py msgid "mess tin" @@ -39827,14 +40066,14 @@ msgstr "一個用於運載貨物、附有繩索和附著點的重型框架。" #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "floor trunk" msgid_plural "floor trunks" -msgstr[0] "" +msgstr[0] "地板行李箱" #. ~ Description for floor trunk #: lang/json/GENERIC_from_json.py msgid "" "A section of flooring with a cargo-space beneath, and a hinged door for " "access." -msgstr "" +msgstr "車輛地板,下方有置物空間,有一扇鉸鏈門可開啟儲物或取用。" #: lang/json/GENERIC_from_json.py msgid "livestock carrier" @@ -40839,14 +41078,14 @@ msgstr "一張粗製的木桌子。" #: lang/json/vehicle_part_from_json.py msgid "workbench" msgid_plural "workbenchs" -msgstr[0] "" +msgstr[0] "工作台" #. ~ Description for workbench #: lang/json/GENERIC_from_json.py lang/json/furniture_from_json.py msgid "" "A sturdy workbench built out of metal. It is perfect for crafting large and" " heavy things." -msgstr "" +msgstr "堅固的工作台,由金屬製成。它非常適合用來製作大型且沉重的東西。" #: lang/json/GENERIC_from_json.py lang/json/furniture_from_json.py #: lang/json/vehicle_part_from_json.py @@ -40862,12 +41101,12 @@ msgstr "一部設計於車輛內使用的小型洗衣機。" #: lang/json/GENERIC_from_json.py msgid "mountable autoclave" msgid_plural "mountable autoclaves" -msgstr[0] "" +msgstr[0] "車載高壓滅菌器" #. ~ Description for mountable autoclave #: lang/json/GENERIC_from_json.py msgid "This autoclave has been rigged to run off a vehicle power grid." -msgstr "" +msgstr "這種高壓滅菌器已經裝配好能使用載具的電力來運轉。" #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "minifridge" @@ -40897,12 +41136,12 @@ msgstr "一個小巧的冰櫃, 設計來作為冷藏食物的移動式解決方 #: lang/json/vehicle_part_from_json.py msgid "dishwasher" msgid_plural "dishwashers" -msgstr[0] "" +msgstr[0] "洗碗機" #. ~ Description for dishwasher #: lang/json/GENERIC_from_json.py msgid "A very small dishwasher designed for use in vehicles." -msgstr "" +msgstr "一台非常小的洗碗機,設計成能在車輛上使用。" #: lang/json/GENERIC_from_json.py msgid "Dana's family sourdough starter" @@ -42833,7 +43072,7 @@ msgstr[0] "" #. ~ Description for Magical Light #: lang/json/GENERIC_from_json.py lang/json/SPELL_from_json.py msgid "Creates a magical light." -msgstr "" +msgstr "產生一個魔法光源。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Blinding Flash" @@ -42846,7 +43085,7 @@ msgstr[0] "" msgid "" "Blind enemies for a short time with a sudden, dazzling light. Higher levels " "deal slightly higher damage." -msgstr "" +msgstr "以一個突然且眩目的光令敵人暫時失明。高等級會稍為增加造成的傷害。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Ethereal Grasp" @@ -42911,7 +43150,7 @@ msgstr[0] "" msgid "" "This spell creates a projectile of hardwood that shoots forth from the " "caster's hand at high speed to stab into an enemy." -msgstr "" +msgstr "這個發術產生一個硬木發射體,並從施法者的手上以高速發射出去,刺進目標敵人。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Nature's Bow" @@ -42924,7 +43163,7 @@ msgstr[0] "" msgid "" "This spell conjures a magical wooden recurve bow that fires endless arrows " "for as long as it lasts." -msgstr "" +msgstr "這個法術會召喚一把魔法木製反曲弓,能在持續時間中發射無限量的箭。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Nature's Trance" @@ -43135,7 +43374,7 @@ msgstr[0] "" #. ~ Description for Chilling Touch #: lang/json/GENERIC_from_json.py lang/json/SPELL_from_json.py msgid "Freezes the touched target with intense cold." -msgstr "" +msgstr "以強烈的冰冷冷凍接觸到的目標。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Glide on Ice" @@ -43292,7 +43531,7 @@ msgstr[0] "" #. ~ Description for Cat's Grace #: lang/json/GENERIC_from_json.py lang/json/SPELL_from_json.py msgid "You become more graceful, agile, and coordinated." -msgstr "" +msgstr "你變得更優雅、敏捷與協調。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Eagle's Sight" @@ -43303,7 +43542,7 @@ msgstr[0] "" #. ~ Description for Eagle's Sight #: lang/json/GENERIC_from_json.py lang/json/SPELL_from_json.py msgid "You gain the perception of an eagle." -msgstr "" +msgstr "你得到獵鷹般的感知力。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Ogre's Strength" @@ -43314,7 +43553,7 @@ msgstr[0] "" #. ~ Description for Ogre's Strength #: lang/json/GENERIC_from_json.py lang/json/SPELL_from_json.py msgid "You gain the strength of an ogre." -msgstr "" +msgstr "你得到食人魔的力量。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Fox's Cunning" @@ -43325,7 +43564,7 @@ msgstr[0] "" #. ~ Description for Fox's Cunning #: lang/json/GENERIC_from_json.py lang/json/SPELL_from_json.py msgid "You become wily like a fox." -msgstr "" +msgstr "你變得像狐狸一樣狡滑。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Jolt" @@ -43401,7 +43640,7 @@ msgstr[0] "" #. ~ Description for Bless #: lang/json/GENERIC_from_json.py lang/json/SPELL_from_json.py msgid "A spell of blessing that gives you energy and boosts your abilities." -msgstr "" +msgstr "一個給予你能量並強化你的能力的祝福法術。" #: lang/json/GENERIC_from_json.py msgid "Scroll of Holy Blade" @@ -43424,7 +43663,7 @@ msgstr[0] "" #: lang/json/GENERIC_from_json.py lang/json/SPELL_from_json.py msgid "" "Evil will not make it through your defenses if your faith is strong enough!" -msgstr "" +msgstr "如果你的信念夠堅定,邪惡無法打破你的防禦!" #: lang/json/GENERIC_from_json.py msgid "Scroll of Lamp" @@ -45648,6 +45887,15 @@ msgstr "" msgid "A cheap 6-round steel box magazine for the Jennings J-22." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "Walther P22 magazine" +msgstr "" + +#. ~ Description for Walther P22 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round box magazine for the Walther P22." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "LW-5 speedloader" msgstr "LW-5快速裝填器" @@ -45945,7 +46193,7 @@ msgstr "一個標準的 20 發鋼製盒狀彈匣, 能容納 .32 ACP 子彈, 適 #: lang/json/MAGAZINE_from_json.py msgid "Kel-Tec P32 magazine" -msgstr "" +msgstr "Kel-Tec P32 彈匣" #. ~ Description for Kel-Tec P32 magazine #: lang/json/MAGAZINE_from_json.py @@ -46026,7 +46274,7 @@ msgstr "" #: lang/json/MAGAZINE_from_json.py msgid "FN 1910 magazine" -msgstr "" +msgstr "FN 1910 彈匣" #. ~ Description for FN 1910 magazine #: lang/json/MAGAZINE_from_json.py @@ -46052,6 +46300,20 @@ msgstr "" msgid "A cheap 32-round steel box magazine for use with the MAC-11 SMG." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "CF-380 magazine" +msgstr "" + +#. ~ Description for CF-380 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Hi-Point CF-380." +msgstr "" + +#. ~ Description for CF-380 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point CF-380." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "M1911 .38 Super magazine" msgstr "" @@ -46115,6 +46377,43 @@ msgid "" "expect much reliability." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "Hi-Power magazine .40 S&W" +msgstr "" + +#. ~ Description for Hi-Power magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Browning Hi-Power .40 S&W." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine .40 S&W" +msgstr "" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 12 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "" + +#. ~ Description for PPQ magazine .40 S&W +#: lang/json/MAGAZINE_from_json.py +msgid "A 14 round steel box magazine for the Walther PPQ .40 S&W." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "Model JCP magazine" +msgstr "" + +#. ~ Description for Model JCP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point Model JCP." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "grenade belt" msgstr "榴彈彈鏈" @@ -46266,6 +46565,24 @@ msgstr "USP .45 彈匣" msgid "A standard capacity magazine for use with the H&K USP handgun." msgstr "一個標準容量的彈匣, 適用於 H&K USP 手槍。" +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine .45 ACP" +msgstr "" + +#. ~ Description for PPQ magazine .45 ACP +#: lang/json/MAGAZINE_from_json.py +msgid "A 12 round steel box magazine for the Walther PPQ .45 ACP." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "Model JHP magazine" +msgstr "" + +#. ~ Description for Model JHP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 9-round steel box magazine for use with the Hi-Point Model JHP." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid ".454 5-round speedloader" msgstr ".454 5發快速裝填器" @@ -46722,7 +47039,7 @@ msgstr "一個標準的 32 發鋼製盒狀彈匣, 適用於 UZI 衝鋒槍。" #: lang/json/MAGAZINE_from_json.py msgid "Kel-Tec PF-9 magazine" -msgstr "" +msgstr "Kel-Tec PF-9 彈匣" #. ~ Description for Kel-Tec PF-9 magazine #: lang/json/MAGAZINE_from_json.py @@ -46738,6 +47055,95 @@ msgstr "" msgid "A 17 round double stack box magazine for the SIG Sauer P320." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "Hi-Power magazine 9x19mm" +msgstr "" + +#. ~ Description for Hi-Power magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 13 round steel box magazine for the Browning Hi-Power 9x19mm." +msgstr "" + +#. ~ Description for Hi-Power magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 15 round steel box magazine for the Browning Hi-Power 9x19mm." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "P38 magazine" +msgstr "" + +#. ~ Description for P38 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8 round steel box magazine for the Walther P38." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "PPQ magazine 9x19mm" +msgstr "" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 10 round steel box magazine for the Walther PPQ 9mm." +msgstr "" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 15 round steel box magazine for the Walther PPQ 9mm." +msgstr "" + +#. ~ Description for PPQ magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 17 round steel box magazine for the Walther PPQ 9mm." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "C-9 magazine" +msgstr "" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Hi-Point C-9." +msgstr "" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 10-round steel box magazine for use with the Hi-Point C-9." +msgstr "" + +#. ~ Description for C-9 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 15-round steel box magazine for use with the Hi-Point C-9." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "CZ 75 magazine" +msgstr "" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 12-round steel box magazine for use with the CZ 75." +msgstr "" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 20-round steel box magazine for use with the CZ 75." +msgstr "" + +#. ~ Description for CZ 75 magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A 26-round steel box magazine for use with the CZ 75." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "CCP magazine" +msgstr "" + +#. ~ Description for CCP magazine +#: lang/json/MAGAZINE_from_json.py +msgid "An 8-round steel box magazine for use with the Walther CCP." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "Makarov PM magazine" msgstr "馬卡洛夫手槍彈匣" @@ -46759,14 +47165,14 @@ msgstr "一個標準的 20 發鋼製盒狀彈匣, 能容納 9x18mm 馬卡洛夫 #: lang/json/MAGAZINE_from_json.py msgid "pressurized chemical tank" -msgstr "" +msgstr "加壓化學品罐" #. ~ Description for pressurized chemical tank #: lang/json/MAGAZINE_from_json.py msgid "" "A makeshift pressurized 2L canister designed to feed a makeshift chemical " "thrower." -msgstr "" +msgstr "粗製的加壓 2公升鋼瓶,設計用於粗製化學藥劑噴灑器供料。" #: lang/json/MAGAZINE_from_json.py msgid "pressurized fuel tank" @@ -46992,41 +47398,41 @@ msgstr "巨大的鋰離子蓄電池,重量直逼600磅。儲存有巨大的能 #: lang/json/MAGAZINE_from_json.py msgid "ultra-light battery cell" -msgstr "" +msgstr "超輕型電池" #: lang/json/MAGAZINE_from_json.py msgid "light battery cell" -msgstr "" +msgstr "輕型電池" #: lang/json/MAGAZINE_from_json.py msgid "light battery cell (high-capacity)" msgid_plural "light battery cells (high-capacity)" -msgstr[0] "" +msgstr[0] "輕型高容量電池" #. ~ Description for light battery cell (high-capacity) #: lang/json/MAGAZINE_from_json.py msgid "" "This is a high-capacity light battery cell, universally compatible with all " "kinds of personal electronic devices." -msgstr "" +msgstr "這種高容量的輕型電池,適用於所有類型的個人電子設備。" #: lang/json/MAGAZINE_from_json.py msgid "medium battery cell" -msgstr "" +msgstr "中型電池" #: lang/json/MAGAZINE_from_json.py msgid "medium battery cell (high-capacity)" msgid_plural "medium battery cells (high-capacity)" -msgstr[0] "" +msgstr[0] "中型高容量電池" #: lang/json/MAGAZINE_from_json.py msgid "heavy battery cell" -msgstr "" +msgstr "重型電池" #: lang/json/MAGAZINE_from_json.py msgid "heavy battery cell (high-capacity)" msgid_plural "heavy battery cells (high-capacity)" -msgstr[0] "" +msgstr[0] "重型高容量電池" #: lang/json/MAGAZINE_from_json.py msgid "CW-24 auto-magazine" @@ -47420,12 +47826,12 @@ msgstr "加入一家瀕臨破產連鎖披薩店, 以及店裡仍在運作的機 #: lang/json/MOD_INFO_from_json.py msgid "Battery Migration for Existing Games" -msgstr "" +msgstr "沿用舊版電池" #. ~ Description for Battery Migration for Existing Games #: lang/json/MOD_INFO_from_json.py msgid "Allows you to reload and unload battery cells with legacy batteries." -msgstr "" +msgstr "允許你使用舊版的電池來裝填新版的電池。" #: lang/json/MOD_INFO_from_json.py msgid "Boats" @@ -48095,12 +48501,12 @@ msgstr "如果你遇到任何問題, 請參閱模組資料夾中的 PAQ.txt。" #: lang/json/MOD_INFO_from_json.py msgid "Bionic Slots" -msgstr "" +msgstr "生化插件插槽" #. ~ Description for Bionic Slots #: lang/json/MOD_INFO_from_json.py msgid "Enables the bionic slots system." -msgstr "" +msgstr "啟用生化插件插槽系統。" #: lang/json/MOD_INFO_from_json.py msgid "Classic zombies" @@ -48430,14 +48836,14 @@ msgstr "一個昆蟲外型的機器人, 約小狗的大小, 正常來說是設 #: lang/json/MONSTER_from_json.py msgid "experimental lab bot" -msgstr "" +msgstr "實驗性實驗室機器人" #. ~ Description for experimental lab bot #: lang/json/MONSTER_from_json.py msgid "" "This robot looks like a large metal spider, a bit bigger than a person, with" " its thorax covered in tiny holes. An ominous buzzing emanates from it." -msgstr "" +msgstr "這個機器人看下去看一隻大型金屬蜘蛛,稍為比普通人大,在胸膛的位置佈滿非常細小的孔。不詳的嗡嗡聲從它身上發出來。" #: lang/json/MONSTER_from_json.py msgid "prototype robot" @@ -49593,7 +49999,7 @@ msgstr "" #: lang/json/MONSTER_from_json.py msgid "fawn" -msgstr "奉承" +msgstr "麑" #. ~ Description for fawn #: lang/json/MONSTER_from_json.py @@ -50294,7 +50700,7 @@ msgstr "" #: lang/json/MONSTER_from_json.py msgid "mi-go scout" -msgstr "" +msgstr "米戈斥候" #. ~ Description for mi-go scout #: lang/json/MONSTER_from_json.py @@ -50344,10 +50750,8 @@ msgstr "軍規砲塔" #: lang/json/MONSTER_from_json.py msgid "" "Leadworks LLC's T-4A1 Sentry. It features improved firmware over General " -"Atomics' TX-1 9x19mm model and an automated M4 carbine." +"Atomics' TX-1 9x19mm model and an automated 5.56mm carbine." msgstr "" -"Leadworks LLC 公司製造的 T-4A1 哨兵, 它使用更為先進的 General Atomics' TX-1 9x19mm 晶片, " -"並搭載有自動 M4 卡賓槍。" #: lang/json/MONSTER_from_json.py msgid "debug monster" @@ -51702,6 +52106,47 @@ msgid "" "between walls and ceiling with limbs grown from its own disjointed ribs." msgstr "" +#: lang/json/MONSTER_from_json.py +msgid "gangrenous impaler" +msgstr "" + +#. ~ Description for gangrenous impaler +#: lang/json/MONSTER_from_json.py +msgid "" +"A corpse hideously twisted into an insect-like form. A hollow tendril " +"reaches out from its open thorax." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "The impaler launches a barb!" +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "trapped tendril" +msgstr "" + +#. ~ Description for trapped tendril +#: lang/json/MONSTER_from_json.py +msgid "" +"A great tendril of mutated flesh and sharpened bone. Emergent from a " +"crevice in the ruined floor, hundreds of human limbs seek freedom and writhe" +" incessantly from underneath its grotesque carapace. As enormous as it may " +"already be, you feel certain that this is just part of a creature much " +"bigger, for when it moves, you can feel this whole ruin tremble, as if an " +"unseen giant struggled against the weight of its concrete tomb." +msgstr "" + +#: lang/json/MONSTER_from_json.py +msgid "flesh wall" +msgstr "" + +#. ~ Description for flesh wall +#: lang/json/MONSTER_from_json.py +msgid "" +"A great lump of mutated flesh. It resembles the innards of some gigantic " +"creature and is covered in a grid of diminutive veins." +msgstr "" + #: lang/json/MONSTER_from_json.py msgid "bloated fungal zombie" msgstr "" @@ -52116,7 +52561,7 @@ msgstr "一條巨大,笨重的龍,有著彎曲的尖角與閃亮的紅色鱗 #: lang/json/MONSTER_from_json.py msgid "experimental mutant" -msgstr "" +msgstr "突變實驗體" #. ~ Description for experimental mutant #: lang/json/MONSTER_from_json.py @@ -53547,7 +53992,7 @@ msgstr "" #: lang/json/MONSTER_from_json.py lang/json/TOOL_from_json.py msgid "disarmed military turret" msgid_plural "disarmed military turrets" -msgstr[0] "" +msgstr[0] "解除武裝軍用砲塔" #. ~ Description for disarmed military turret #: lang/json/MONSTER_from_json.py @@ -53560,7 +54005,7 @@ msgstr "" #: lang/json/MONSTER_from_json.py lang/json/TOOL_from_json.py msgid "disarmed advanced turret" msgid_plural "disarmed advanced turrets" -msgstr[0] "" +msgstr[0] "解除武裝先進砲塔" #. ~ Description for disarmed advanced turret #: lang/json/MONSTER_from_json.py @@ -53572,7 +54017,7 @@ msgstr "" #: lang/json/MONSTER_from_json.py msgid "9mm turret" -msgstr "" +msgstr "9mm砲塔" #. ~ Description for 9mm turret #: lang/json/MONSTER_from_json.py @@ -53585,7 +54030,7 @@ msgstr "" #: lang/json/MONSTER_from_json.py msgid "shotgun turret" -msgstr "" +msgstr "霰彈槍塔" #. ~ Description for shotgun turret #: lang/json/MONSTER_from_json.py @@ -54419,7 +54864,7 @@ msgid "" "A salvaged defense robot refitted with two electrified blades. The over-" "taxed power systems result in somewhat sluggish movement and occasional " "discharges. Keep a safe distance!" -msgstr "" +msgstr "一個廢物利用的防衛機器人,改裝成使用兩支通電的刀刃。超負荷的電力系統會令它在某些時候運作不良並不時放電,保持著安全的距離吧。" #: lang/json/MONSTER_from_json.py msgid "slapdash paladin" @@ -54953,6 +55398,24 @@ msgid "" "effect. Starts very short range, increases rapidly with level." msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Summon Gangrenous Crawlers" +msgstr "" + +#. ~ Description for Summon Gangrenous Crawlers +#: lang/json/SPELL_from_json.py +msgid "Summons 2 permanent gangrenous crawlers." +msgstr "" + +#: lang/json/SPELL_from_json.py +msgid "Summon Gangrenous Monsters" +msgstr "" + +#. ~ Description for Summon Gangrenous Monsters +#: lang/json/SPELL_from_json.py +msgid "Summons 2 permanent gangrenous impalers." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Smite" msgstr "" @@ -55037,11 +55500,11 @@ msgstr "" #: lang/json/SPELL_from_json.py msgid "Magical Light" -msgstr "" +msgstr "魔法之光" #: lang/json/SPELL_from_json.py msgid "Blinding Flash" -msgstr "" +msgstr "眩目閃光" #: lang/json/SPELL_from_json.py msgid "Ethereal Grasp" @@ -55169,11 +55632,11 @@ msgstr "" #: lang/json/SPELL_from_json.py msgid "Wooden Shaft" -msgstr "" +msgstr "木矛術" #: lang/json/SPELL_from_json.py msgid "Nature's Bow" -msgstr "" +msgstr "自然之弓" #: lang/json/SPELL_from_json.py msgid "Nature's Trance" @@ -55185,7 +55648,7 @@ msgstr "" #: lang/json/SPELL_from_json.py msgid "Cause Bear" -msgstr "" +msgstr "產生野熊" #. ~ Description for Cause Bear #: lang/json/SPELL_from_json.py @@ -55195,6 +55658,8 @@ msgid "" "because the instructions are hardly legible. No time like the Cataclysm to " "find out, though!" msgstr "" +"這個法術似乎非常之模糊。你堅信這個法術應該是叫「產生恐懼 (Fear) " +"」,但你同時也堅信它不會有預期的效果,因為使用說明實在很難看清楚。就跟大災變一樣,根本沒有時間去尋求真相。" #: lang/json/SPELL_from_json.py msgid "Kill Fungus" @@ -55329,7 +55794,7 @@ msgstr "" #: lang/json/SPELL_from_json.py msgid "Chilling Touch" -msgstr "" +msgstr "冰冷之觸" #: lang/json/SPELL_from_json.py msgid "Glide on Ice" @@ -55403,19 +55868,19 @@ msgstr "" #: lang/json/SPELL_from_json.py lang/json/effects_from_json.py msgid "Cat's Grace" -msgstr "" +msgstr "貓之優雅" #: lang/json/SPELL_from_json.py lang/json/effects_from_json.py msgid "Eagle's Sight" -msgstr "" +msgstr "鷹之視野" #: lang/json/SPELL_from_json.py lang/json/effects_from_json.py msgid "Ogre's Strength" -msgstr "" +msgstr "食人魔之力" #: lang/json/SPELL_from_json.py lang/json/effects_from_json.py msgid "Fox's Cunning" -msgstr "" +msgstr "狐之狡滑" #: lang/json/SPELL_from_json.py msgid "Jolt" @@ -55465,7 +55930,7 @@ msgstr "" #: lang/json/SPELL_from_json.py msgid "Bless" -msgstr "" +msgstr "祝福" #: lang/json/SPELL_from_json.py msgid "Holy Blade" @@ -55473,7 +55938,7 @@ msgstr "" #: lang/json/SPELL_from_json.py msgid "Spiritual Armor" -msgstr "" +msgstr "心靈護甲" #: lang/json/SPELL_from_json.py msgid "Lamp" @@ -55584,38 +56049,38 @@ msgstr "電池相容模組, 可以使一般工具能夠使用車載電池和小 #: lang/json/TOOLMOD_from_json.py msgid "light battery mod" msgid_plural "light battery mods" -msgstr[0] "" +msgstr[0] "輕型電池模組" #. ~ Description for light battery mod #: lang/json/TOOLMOD_from_json.py msgid "" "A battery compartment mod that allows the use of light batteries in tools " "that otherwise could not." -msgstr "" +msgstr "電池盒模組,能使無法使用輕型電池的工具轉換成使用輕型電池。" #: lang/json/TOOLMOD_from_json.py msgid "medium battery mod" msgid_plural "medium battery mods" -msgstr[0] "" +msgstr[0] "中型電池模組" #. ~ Description for medium battery mod #: lang/json/TOOLMOD_from_json.py msgid "" "A battery compartment mod that allows the use of medium batteries in tools " "that otherwise could not." -msgstr "" +msgstr "電池盒模組,能使無法使用中型電池的工具轉換成使用中型電池。" #: lang/json/TOOLMOD_from_json.py msgid "heavy battery mod" msgid_plural "heavy battery mods" -msgstr[0] "" +msgstr[0] "重型電池模組" #. ~ Description for heavy battery mod #: lang/json/TOOLMOD_from_json.py msgid "" "A battery compartment mod that allows the use of heavy batteries in tools " "that otherwise could not." -msgstr "" +msgstr "電池盒模組,能使無法使用重型電池的工具轉換成使用重型電池。" #: lang/json/TOOLMOD_from_json.py msgid "cybernetic power port mod" @@ -59930,7 +60395,7 @@ msgid "" "This is a light-emitting circuit that has been wired directly to a battery." " It provides some weak light and can't be turned off until the battery " "dies." -msgstr "" +msgstr "這種發光電路組件已經直接連接到電池上。它會發出微光而且直到電池耗盡為止不能關掉。" #: lang/json/TOOL_from_json.py msgid "lightstrip (inactive)" @@ -59947,7 +60412,7 @@ msgstr "你啟動了不可關閉的燈條。" msgid "" "This is a light-emitting circuit that can be wired directly to a battery. " "It provides some weak light and can't be turned off until the battery dies." -msgstr "" +msgstr "這種發光電路組件可以直接連接到電池上。它會發出微光而且直到電池耗盡為止不能關掉。" #: lang/json/TOOL_from_json.py msgid "magnifying glass" @@ -60233,7 +60698,7 @@ msgstr "這是一個不好拿的拖把。能夠清理打翻的液體。使用拖 #: lang/json/TOOL_from_json.py msgid "scrub brush" msgid_plural "scrub brushs" -msgstr[0] "" +msgstr[0] "硬毛刷" #. ~ Description for scrub brush #: lang/json/TOOL_from_json.py @@ -60438,7 +60903,7 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "hydrogen tank" msgid_plural "hydrogen tanks" -msgstr[0] "" +msgstr[0] "氫氣瓶" #. ~ Description for hydrogen tank #: lang/json/TOOL_from_json.py @@ -60808,14 +61273,26 @@ msgstr "這是相當大的一塊布, 在製作物品與止血時很有用。" #: lang/json/TOOL_from_json.py msgid "sponge" msgid_plural "sponges" -msgstr[0] "" +msgstr[0] "海綿" #. ~ Description for sponge #: lang/json/TOOL_from_json.py msgid "" "A sponge is a tool or cleaning aid made of soft, porous material. Typically " "used for cleaning impervious surfaces." -msgstr "" +msgstr "海綿是一個由柔軟多孔素材製作而成的清潔用品。一般用於清潔抗滲的表面。" + +#: lang/json/TOOL_from_json.py +msgid "washing kit" +msgid_plural "washing kits" +msgstr[0] "洗滌工具" + +#. ~ Description for washing kit +#: lang/json/TOOL_from_json.py +msgid "" +"A combination kit of a washboard and a sponge. Everything you need to clean" +" items after the apocalypse." +msgstr "一件由洗衣板和海綿組合而成的工具,正是你在大災變後清潔物品所需的東西。" #: lang/json/TOOL_from_json.py msgid "reading light" @@ -63313,7 +63790,7 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "generic kitchen knife" msgid_plural "generic kitchen knifes" -msgstr[0] "" +msgstr[0] "通用廚房刀具" #: lang/json/TOOL_from_json.py msgid "butcher knife" @@ -63342,7 +63819,7 @@ msgstr "一把銳利的刀子。能夠作為近戰武器是不合格的, 但是 #: lang/json/TOOL_from_json.py msgid "paring knife" msgid_plural "paring knives" -msgstr[0] "" +msgstr[0] "削皮刀" #. ~ Description for paring knife #: lang/json/TOOL_from_json.py @@ -63354,7 +63831,7 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "chef knife" msgid_plural "chef knives" -msgstr[0] "" +msgstr[0] "廚師刀" #. ~ Description for chef knife #: lang/json/TOOL_from_json.py @@ -63368,7 +63845,7 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "carving knife" msgid_plural "carving knives" -msgstr[0] "" +msgstr[0] "雕刻刀" #. ~ Description for carving knife #: lang/json/TOOL_from_json.py @@ -63381,7 +63858,7 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "bread knife" msgid_plural "bread knives" -msgstr[0] "" +msgstr[0] "麵包刀" #. ~ Description for bread knife #: lang/json/TOOL_from_json.py @@ -63394,7 +63871,7 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "vegetable cleaver" msgid_plural "vegetable cleavers" -msgstr[0] "" +msgstr[0] "切菜刀" #. ~ Description for vegetable cleaver #: lang/json/TOOL_from_json.py @@ -64303,12 +64780,12 @@ msgstr[0] "" #: lang/json/TOOL_from_json.py lang/json/furniture_from_json.py msgid "camp chair" msgid_plural "camp chairs" -msgstr[0] "" +msgstr[0] "露營椅" #. ~ Description for camp chair #: lang/json/TOOL_from_json.py msgid "Folded camp chair, deploy to sit down." -msgstr "" +msgstr "折疊式露營用椅子,部署後可坐下。" #: lang/json/TOOL_from_json.py lang/json/furniture_from_json.py msgid "metal butchering rack" @@ -64343,7 +64820,7 @@ msgstr "這個橡膠筏被洩氣了, 和槳收納在一起, 你如果身上有 #: lang/json/TOOL_from_json.py lang/json/furniture_from_json.py msgid "metal smoking rack" msgid_plural "metal smoking racks" -msgstr[0] "" +msgstr[0] "金屬煙燻架" #. ~ Description for metal smoking rack #: lang/json/TOOL_from_json.py @@ -65011,7 +65488,7 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "rechargeable battery mod" msgid_plural "rechargeable battery mods" -msgstr[0] "" +msgstr[0] "充電電池模組" #. ~ Description for rechargeable battery mod #: lang/json/TOOL_from_json.py @@ -65069,7 +65546,7 @@ msgstr[0] "" #: lang/json/TOOL_from_json.py msgid "atomic smartphone" msgid_plural "atomic smartphones" -msgstr[0] "" +msgstr[0] "原子智慧型手機" #. ~ Description for atomic smartphone #: lang/json/TOOL_from_json.py @@ -65080,11 +65557,12 @@ msgid "" "price made them a rarity. It includes an alarm clock, a high-resolution " "camera, and a bright flashlight." msgstr "" +"有了Rivtech原子智慧型手機,你就再不需要幫你的手機充電了。它可以使用一千萬年,這個最尖端的小玩兒在大災變來臨的一星期之前推出市場,它的超高價格使它成為一件珍品。它包含一個鬧鐘、一個高解像度相機、以及一個光亮的電筒。" #: lang/json/TOOL_from_json.py msgid "atomic smartphone - Flashlight" msgid_plural "atomic smartphones - Flashlight" -msgstr[0] "" +msgstr[0] "原子智慧型手機 - 手電筒模式" #. ~ Description for atomic reading light #: lang/json/TOOL_from_json.py @@ -65823,7 +66301,7 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "inactive 9mm defense turret" msgid_plural "inactive 9mm defense turrets" -msgstr[0] "" +msgstr[0] "未啟動的9mm防禦砲塔" #. ~ Description for inactive 9mm defense turret #: lang/json/TOOL_from_json.py @@ -65837,7 +66315,7 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "inactive shotgun defense turret" msgid_plural "inactive shotgun defense turrets" -msgstr[0] "" +msgstr[0] "未啟動的霰彈槍防禦砲塔" #. ~ Description for inactive shotgun defense turret #: lang/json/TOOL_from_json.py @@ -65851,7 +66329,7 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "inactive riot control turret" msgid_plural "inactive riot control turrets" -msgstr[0] "" +msgstr[0] "未啟動的鎮暴砲塔" #. ~ Description for inactive riot control turret #: lang/json/TOOL_from_json.py @@ -65876,7 +66354,7 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "inactive 5.56mm military turret" msgid_plural "inactive 5.56mm military turrets" -msgstr[0] "" +msgstr[0] "未啟動的5.56mm軍用砲塔" #. ~ Description for inactive 5.56mm military turret #: lang/json/TOOL_from_json.py @@ -65891,7 +66369,7 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "inactive 7.62mm military turret" msgid_plural "inactive 7.62mm military turrets" -msgstr[0] "" +msgstr[0] "未啟動的7.62mm軍用砲塔" #. ~ Description for inactive 7.62mm military turret #: lang/json/TOOL_from_json.py @@ -65906,7 +66384,7 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "inactive 50 caliber military turret" msgid_plural "inactive 50 caliber military turrets" -msgstr[0] "" +msgstr[0] "未啟動的50口徑軍用砲塔" #. ~ Description for inactive 50 caliber military turret #: lang/json/TOOL_from_json.py @@ -65936,7 +66414,7 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "inactive military 8x40mm turret" msgid_plural "inactive military 8x40mm turrets" -msgstr[0] "" +msgstr[0] "未啟動的軍用8x40mm砲塔" #. ~ Description for inactive military 8x40mm turret #: lang/json/TOOL_from_json.py @@ -65951,7 +66429,7 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "inactive military 40mm grenade turret" msgid_plural "inactive military 40mm grenade turrets" -msgstr[0] "" +msgstr[0] "未啟動的軍用40mm榴彈砲塔" #. ~ Description for inactive military 40mm grenade turret #: lang/json/TOOL_from_json.py @@ -65966,7 +66444,7 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "inactive military flamethrower turret" msgid_plural "inactive military flamethrower turrets" -msgstr[0] "" +msgstr[0] "未啟動的軍用火焰噴射砲塔" #. ~ Description for inactive military flamethrower turret #: lang/json/TOOL_from_json.py @@ -65980,7 +66458,7 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "inactive advanced laser turret" msgid_plural "inactive advanced laser turrets" -msgstr[0] "" +msgstr[0] "未啟動的先進雷射砲塔" #. ~ Description for inactive advanced laser turret #: lang/json/TOOL_from_json.py @@ -65993,7 +66471,7 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "inactive advanced plasma turret" msgid_plural "inactive advanced plasma turrets" -msgstr[0] "" +msgstr[0] "未啟動的先進電漿砲塔" #. ~ Description for inactive advanced plasma turret #: lang/json/TOOL_from_json.py @@ -66021,7 +66499,7 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "inactive advanced acid turret" msgid_plural "inactive advanced acid turrets" -msgstr[0] "" +msgstr[0] "未啟動的先進酸液砲塔" #. ~ Description for inactive advanced acid turret #: lang/json/TOOL_from_json.py @@ -66034,7 +66512,7 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "inactive advanced EMP turret" msgid_plural "inactive advanced EMP turrets" -msgstr[0] "" +msgstr[0] "未啟動的先進電磁脈衝砲塔" #. ~ Description for inactive advanced EMP turret #: lang/json/TOOL_from_json.py @@ -66318,7 +66796,7 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "inactive water turret" msgid_plural "inactive water turrets" -msgstr[0] "" +msgstr[0] "未啟動的水砲塔" #. ~ Description for inactive water turret #: lang/json/TOOL_from_json.py @@ -67848,6 +68326,10 @@ msgstr "" msgid "nails" msgstr "鐵釘" +#: lang/json/ammunition_type_from_json.py +msgid "barb" +msgstr "" + #: lang/json/ammunition_type_from_json.py msgid "BBs" msgstr "BB彈" @@ -67904,7 +68386,7 @@ msgstr "9x18mm" #: lang/json/ammunition_type_from_json.py msgid ".380 ACP" -msgstr "" +msgstr ".380 ACP 子彈" #: lang/json/ammunition_type_from_json.py msgid ".38" @@ -68055,7 +68537,7 @@ msgid "components" msgstr "元件" #: lang/json/ammunition_type_from_json.py -msgid "93mm RPG-7" +msgid "RPG-7 rocket" msgstr "" #: lang/json/ammunition_type_from_json.py @@ -68187,18 +68669,6 @@ msgid "" "those in turn more often than massive objects." msgstr "" -#: lang/json/bionic_from_json.py -msgid "Advanced Microreactor System" -msgstr "進階核子反應爐系統" - -#. ~ Description for Advanced Microreactor System -#: lang/json/bionic_from_json.py -msgid "" -"This stripped down mini-reactor is more efficient and safer than the base " -"model due to integrated radiation cleansers. There is no way to shut it " -"down once active, but you can toggle additional fuel intake." -msgstr "" - #: lang/json/bionic_from_json.py msgid "Alarm System" msgstr "警報系統" @@ -68951,28 +69421,6 @@ msgid "" "may cause delayed reaction time and drowsiness." msgstr "你的神經系統能夠依照你的意志忽略疼痛, 關閉感官。然而, 使用這個系統有可能會讓你對環境危險慢半拍。" -#: lang/json/bionic_from_json.py -msgid "Plutonium Filter" -msgstr "鈽元素提煉裝置" - -#. ~ Description for Plutonium Filter -#: lang/json/bionic_from_json.py -msgid "" -"This set of tanks and filters allows you to extract plutonium from " -"radioactive slurry." -msgstr "" - -#: lang/json/bionic_from_json.py -msgid "Plutonium Purger" -msgstr "鈽清除器" - -#. ~ Description for Plutonium Purger -#: lang/json/bionic_from_json.py -msgid "" -"Triggers an emergency reactor fuel purge that ejects all fuel from your " -"reactor." -msgstr "" - #. ~ Description for Bionic Visual Impairment #: lang/json/bionic_from_json.py msgid "" @@ -69093,18 +69541,6 @@ msgid "" "amount of unarmed slashing damage whenever your fingertips are uncovered." msgstr "" -#: lang/json/bionic_from_json.py -msgid "Microreactor System" -msgstr "核子反應爐系統" - -#. ~ Description for Microreactor System -#: lang/json/bionic_from_json.py -msgid "" -"This stripped down mini-reactor generates impressive amounts of bionic " -"power. There is no way to shut it down, but you can toggle additional fuel " -"intake. Irradiates your body when active." -msgstr "" - #: lang/json/bionic_from_json.py msgid "Recycler Unit" msgstr "回收消化器" @@ -69356,7 +69792,7 @@ msgid "" "Your joints have been surgically equipped with torsion ratchets that slowly " "generate power when you move. Whilst this is toggled, moving will require " "more effort, though more power will be generated." -msgstr "" +msgstr "你的關節以手術裝配了轉輪發電器, 能夠在你移動的時候緩慢產生能量。儘管這個功能可以切換,但在使用之時需要更多的體力,才能夠產生更多的能量。" #: lang/json/bionic_from_json.py msgid "Joint Servo" @@ -69498,6 +69934,52 @@ msgid "" "artificial but effective sensation of fatigue." msgstr "" +#: lang/json/bionic_from_json.py +msgid "Advanced Microreactor System" +msgstr "進階核子反應爐系統" + +#. ~ Description for Advanced Microreactor System +#: lang/json/bionic_from_json.py +msgid "" +"This stripped down mini-reactor is more efficient and safer than the base " +"model due to integrated radiation cleansers. There is no way to shut it " +"down once active, but you can toggle additional fuel intake." +msgstr "" + +#: lang/json/bionic_from_json.py +msgid "Plutonium Filter" +msgstr "鈽元素提煉裝置" + +#. ~ Description for Plutonium Filter +#: lang/json/bionic_from_json.py +msgid "" +"This set of tanks and filters allows you to extract plutonium from " +"radioactive slurry." +msgstr "" + +#: lang/json/bionic_from_json.py +msgid "Plutonium Purger" +msgstr "鈽清除器" + +#. ~ Description for Plutonium Purger +#: lang/json/bionic_from_json.py +msgid "" +"Triggers an emergency reactor fuel purge that ejects all fuel from your " +"reactor." +msgstr "" + +#: lang/json/bionic_from_json.py +msgid "Microreactor System" +msgstr "核子反應爐系統" + +#. ~ Description for Microreactor System +#: lang/json/bionic_from_json.py +msgid "" +"This stripped down mini-reactor generates impressive amounts of bionic " +"power. There is no way to shut it down, but you can toggle additional fuel " +"intake. Irradiates your body when active." +msgstr "" + #: lang/json/bionic_from_json.py msgid "Internal Furnace" msgstr "內燃機" @@ -69619,8 +70101,7 @@ msgstr "閃避及近戰能力受阻。" #: lang/json/bodypart_from_json.py src/armor_layers.cpp src/character.cpp #: src/debug_menu.cpp msgid "Torso" -msgid_plural "Torso" -msgstr[0] "軀幹" +msgstr "軀幹" #. ~ Crafting recipes subcategory of 'ARMOR' category #: lang/json/bodypart_from_json.py lang/json/recipe_category_from_json.py @@ -69639,8 +70120,7 @@ msgstr "頭部" #: lang/json/bodypart_from_json.py src/armor_layers.cpp src/character.cpp #: src/debug_menu.cpp msgid "Head" -msgid_plural "Head" -msgstr[0] "頭部" +msgstr "頭部" #. ~ Crafting recipes subcategory of 'ARMOR' category #: lang/json/bodypart_from_json.py lang/json/recipe_category_from_json.py @@ -69662,8 +70142,7 @@ msgstr "遠程攻擊受阻。" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "Eyes" -msgid_plural "Eyes" -msgstr[0] "眼睛" +msgstr "眼睛" #: lang/json/bodypart_from_json.py msgid "mouth" @@ -69680,8 +70159,7 @@ msgstr "奔跑速度下降。" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "Mouth" -msgid_plural "Mouth" -msgstr[0] "嘴巴" +msgstr "嘴巴" #: lang/json/bodypart_from_json.py msgid "left arm" @@ -69692,14 +70170,26 @@ msgctxt "bodypart_accusative" msgid "left arm" msgstr "左臂" +#: lang/json/bodypart_from_json.py +msgid "arms" +msgstr "手臂" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "arms" +msgstr "手臂" + #: lang/json/bodypart_from_json.py msgid "Melee and ranged combat is hampered." msgstr "近戰及遠程攻擊受阻。" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Arm" -msgid_plural "Arms" -msgstr[0] "手臂" +msgstr "左臂" + +#: lang/json/bodypart_from_json.py +msgid "Arms" +msgstr "手臂" #: lang/json/bodypart_from_json.py msgid "L ARM" @@ -69716,8 +70206,7 @@ msgstr "右臂" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Arm" -msgid_plural "Arms" -msgstr[0] "手臂" +msgstr "右臂" #: lang/json/bodypart_from_json.py msgid "R ARM" @@ -69732,14 +70221,26 @@ msgctxt "bodypart_accusative" msgid "left hand" msgstr "左手" +#: lang/json/bodypart_from_json.py +msgid "hands" +msgstr "手掌" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "hands" +msgstr "手掌" + #: lang/json/bodypart_from_json.py msgid "Manual tasks are slowed." msgstr "手上的工作變慢。" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Hand" -msgid_plural "Hands" -msgstr[0] "手掌" +msgstr "左手" + +#: lang/json/bodypart_from_json.py +msgid "Hands" +msgstr "手掌" #: lang/json/bodypart_from_json.py msgid "right hand" @@ -69752,8 +70253,7 @@ msgstr "右手" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Hand" -msgid_plural "Hands" -msgstr[0] "手掌" +msgstr "右手" #: lang/json/bodypart_from_json.py msgid "left leg" @@ -69764,14 +70264,26 @@ msgctxt "bodypart_accusative" msgid "left leg" msgstr "左腿" +#: lang/json/bodypart_from_json.py +msgid "legs" +msgstr "腿部" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "legs" +msgstr "腿部" + #: lang/json/bodypart_from_json.py msgid "Running and swimming are slowed." msgstr "奔跑和游泳速度變慢。" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Leg" -msgid_plural "Legs" -msgstr[0] "腿部" +msgstr "左腿" + +#: lang/json/bodypart_from_json.py +msgid "Legs" +msgstr "腿部" #: lang/json/bodypart_from_json.py msgid "L LEG" @@ -69788,8 +70300,7 @@ msgstr "右腿" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Leg" -msgid_plural "Legs" -msgstr[0] "腿部" +msgstr "右腿" #: lang/json/bodypart_from_json.py msgid "R LEG" @@ -69804,10 +70315,22 @@ msgctxt "bodypart_accusative" msgid "left foot" msgstr "左腳" +#: lang/json/bodypart_from_json.py +msgid "feet" +msgstr "腳掌" + +#: lang/json/bodypart_from_json.py +msgctxt "bodypart_accusative" +msgid "feet" +msgstr "腳掌" + #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Foot" -msgid_plural "Feet" -msgstr[0] "腳掌" +msgstr "左腳" + +#: lang/json/bodypart_from_json.py +msgid "Feet" +msgstr "腳掌" #: lang/json/bodypart_from_json.py msgid "right foot" @@ -69820,13 +70343,11 @@ msgstr "右腳" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Foot" -msgid_plural "Feet" -msgstr[0] "腳掌" +msgstr "右腳" #: lang/json/bodypart_from_json.py msgid "appendix" -msgid_plural "Appendices" -msgstr[0] "附錄" +msgstr "附錄" #: lang/json/bodypart_from_json.py msgctxt "bodypart_accusative" @@ -69837,6 +70358,10 @@ msgstr "附錄" msgid "It's inflamed." msgstr "發炎了。" +#: lang/json/bodypart_from_json.py +msgid "Appendices" +msgstr "附錄" + #: lang/json/clothing_mod_from_json.py msgid "Pad with leather" msgstr "墊上皮革" @@ -74568,7 +75093,7 @@ msgstr "一群由企業家、商人所組成的團體, 共同延續著貿易與 #: lang/json/faction_from_json.py msgid "The Beggars in the Lobby" -msgstr "" +msgstr "大廳裡的乞丐們" #. ~ Description for The Beggars in the Lobby #: lang/json/faction_from_json.py @@ -78361,7 +78886,9 @@ msgid "" "this weapon have a good chance of remaining intact for re-use." msgstr "一把可以藏在袖中的迷你手弩。由於尺寸的限制, 傷害並不高, 適合用於小型的狩獵遊戲。從這把弩射出的箭矢有一定的機率可以回收使用。" -#: lang/json/gun_from_json.py lang/json/gunmod_from_json.py src/item.cpp +#: lang/json/gun_from_json.py lang/json/gun_from_json.py +#: lang/json/gunmod_from_json.py lang/json/gunmod_from_json.py +#: lang/json/gunmod_from_json.py src/item.cpp msgctxt "gun_type_type" msgid "pistol" msgstr "手槍" @@ -78474,6 +79001,17 @@ msgstr "" "全世界的流氓都愛用, 這個與打火機黏在一起的噴霧罐對使用者與對象同樣危險。噴嘴被粗略的改造成噴出汽油, " "另有一個小的幫浦連結在側邊能夠只要花點時間就能重新加壓。" +#: lang/json/gun_from_json.py +msgid "simple flamethrower" +msgid_plural "simple flamethrowers" +msgstr[0] "簡易火焰噴射器" + +#: lang/json/gun_from_json.py +msgid "" +"A simple, home-made flamethrower. While its capacity is not superb, it is " +"more than capable of igniting terrain and monsters alike." +msgstr "一把簡單的土炮火焰噴射器。雖然它的容量不大, 但是要把怪物點燃是綽綽有餘的。" + #: lang/json/gun_from_json.py msgid "BB gun" msgid_plural "BB guns" @@ -79022,6 +79560,18 @@ msgid "" "safety issues." msgstr "" +#: lang/json/gun_from_json.py +msgid "Walther P22" +msgid_plural "Walther P22s" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"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" +msgstr "" + #: lang/json/gun_from_json.py msgid "Remington ACR" msgid_plural "Remington ACRs" @@ -79656,7 +80206,7 @@ msgstr "它是 20 世紀最有名的手槍之一。你不叫龐德, 但你可能 #: lang/json/gun_from_json.py msgid "Kel-Tec P32" msgid_plural "Kel-Tec P32s" -msgstr[0] "" +msgstr[0] "Kel-Tec P32s" #: lang/json/gun_from_json.py msgid "" @@ -79792,7 +80342,7 @@ msgstr "一把受歡迎的 .38 口徑手槍。有著多種安全的設計以及 #: lang/json/gun_from_json.py msgid "MAC-11" msgid_plural "MAC-11s" -msgstr[0] "" +msgstr[0] "MAC-11s" #: lang/json/gun_from_json.py msgid "" @@ -79806,7 +80356,7 @@ msgstr "" #: lang/json/gun_from_json.py msgid "Kel-Tec P3AT" msgid_plural "Kel-Tec P3ATs" -msgstr[0] "" +msgstr[0] "Kel-Tec P3ATs" #: lang/json/gun_from_json.py msgid "" @@ -79819,7 +80369,7 @@ msgstr "" #: lang/json/gun_from_json.py msgid "FN 1910 .380" msgid_plural "FN 1910 .380s" -msgstr[0] "" +msgstr[0] "FN 1910 .380s" #: lang/json/gun_from_json.py msgid "" @@ -79842,6 +80392,19 @@ msgid "" " make for a moderately poor handling pistol." msgstr "" +#: lang/json/gun_from_json.py +msgid "Hi-Point CF-380" +msgid_plural "Hi-Point CF-380s" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "M1911A1" msgid_plural "M1911A1s" @@ -79919,6 +80482,44 @@ msgid "" msgstr "" "Smith & Wesson 公司製的 610 是一把經典的 6 發裝 10mm 口徑左輪手槍, 也能裝填 S&W 公司的 .40 口徑子彈。" +#: lang/json/gun_from_json.py +msgid "Browning Hi-Power .40 S&W" +msgid_plural "Browning Hi-Power .40 S&Ws" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Browning Hi-Power is a semi-automatic handgun developed shortly before " +"the second world war. Widely issued since then, it remains in use by India, " +"Canada and Australia. This is a commercial variant produced by Browning Arms" +" in .40 S&W." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther PPQ .40 S&W" +msgid_plural "Walther PPQ .40 S&Ws" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in .40 S&W." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Hi-Point Model JCP" +msgid_plural "Hi-Point Model JCPs" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "tube 40mm launcher" msgid_plural "tube 40mm launchers" @@ -80204,6 +80805,31 @@ msgid "USP .45" msgid_plural "USP .45s" msgstr[0] "USP .45" +#: lang/json/gun_from_json.py +msgid "Walther PPQ .45 ACP" +msgid_plural "Walther PPQ .45 ACPs" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in .45 ACP." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Hi-Point Model JHP" +msgid_plural "Hi-Point Model JHPs" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "Taurus Raging Bull" msgid_plural "Taurus Raging Bull" @@ -80255,7 +80881,7 @@ msgstr "" #: lang/json/gun_from_json.py msgid "H&K MP7A2" msgid_plural "H&K MP7A2s" -msgstr[0] "" +msgstr[0] "H&K MP7A2" #: lang/json/gun_from_json.py msgid "" @@ -80982,7 +81608,7 @@ msgstr "" #: lang/json/gun_from_json.py msgid "Kel-Tec PF-9" msgid_plural "Kel-Tec PF-9s" -msgstr[0] "" +msgstr[0] "Kel-Tec PF-9s" #: lang/json/gun_from_json.py msgid "" @@ -81003,6 +81629,88 @@ msgid "" "SIG Sauer P320." msgstr "" +#: lang/json/gun_from_json.py +msgid "Browning Hi-Power 9x19mm" +msgid_plural "Browning Hi-Power 9x19mms" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Browning Hi-Power is a semi-automatic handgun developed shortly before " +"the second world war. Widely issued since then, it remains in use by India, " +"Canada and Australia. This is a commercial variant produced by Browning Arms" +" in 9x19mm Parabellum." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther P38" +msgid_plural "Walther P38s" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther PPQ 9mm" +msgid_plural "Walther PPQ 9mms" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Walther PPQ is a semi-automatic pistol originating from the Walther " +"P99QA, and maintains compatibility with some of its predecessor's " +"accessories. This model is chambered in 9x19mm Parabellum." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Hi-Point C-9" +msgid_plural "Hi-Point C-9s" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "CZ-75" +msgid_plural "CZ-75s" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"The CZ-75 is a semi-automatic pistol developed in Czechoslovakia, and is one" +" of the original wonder nines. Though designed for export to western " +"countries, it was declared a state secret; lack of international patent " +"protection meant that many clones and variants were produced and distributed" +" around the world, with Česká zbrojovka only joining in the 90's. This " +"pistol remains wildly popular among competition shooters." +msgstr "" + +#: lang/json/gun_from_json.py +msgid "Walther CCP" +msgid_plural "Walther CCPs" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"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." +msgstr "" + #: lang/json/gun_from_json.py msgid "Makarov PM" msgid_plural "Makarov PMs" @@ -81066,7 +81774,7 @@ msgstr "一把自製的簡易版本霰彈槍, 可以把大多數放進槍管的 #: lang/json/gun_from_json.py msgid "makeshift chemical thrower" msgid_plural "makeshift chemical throwers" -msgstr[0] "" +msgstr[0] "粗製化學藥劑噴灑器" #: lang/json/gun_from_json.py msgid "" @@ -81085,17 +81793,6 @@ msgid "" "deadly." msgstr "一把有著大量瓦斯儲存槽的火焰噴射器。非常危險又致命。" -#: lang/json/gun_from_json.py -msgid "simple flamethrower" -msgid_plural "simple flamethrowers" -msgstr[0] "簡易火焰噴射器" - -#: lang/json/gun_from_json.py -msgid "" -"A simple, home-made flamethrower. While its capacity is not superb, it is " -"more than capable of igniting terrain and monsters alike." -msgstr "一把簡單的土炮火焰噴射器。雖然它的容量不大, 但是要把怪物點燃是綽綽有餘的。" - #: lang/json/gun_from_json.py msgid "RM451 flamethrower" msgid_plural "RM451 flamethrowers" @@ -81189,6 +81886,15 @@ msgid "" "electromagnetic induction, powered by a standard UPS." msgstr "用廢金屬手工打造的步槍, 運用了電磁原理來拋射單發的鋼筋。其發射的超高速金屬棒實現了勞侖茲力定律, 由標準 UPS 供電。" +#: lang/json/gun_from_json.py +msgid "barb launching organ" +msgid_plural "barb launching organs" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "A mutated organ capable of launching bony barbs at great speed." +msgstr "" + #: lang/json/gun_from_json.py msgid "coilgun" msgid_plural "coilguns" @@ -81720,6 +82426,18 @@ msgid "" "on impact." msgstr "" +#: lang/json/gun_from_json.py +msgid "Yeet Cannon" +msgid_plural "Yeet Cannons" +msgstr[0] "" + +#: lang/json/gun_from_json.py +msgid "" +"You can YEET all the bullets with this baby. YEET them right into all of the" +" zombies in your path, all the hulks, the spiders, and those damned mole " +"rats." +msgstr "" + #: lang/json/gun_from_json.py msgid "SVS-24" msgid_plural "SVS-24" @@ -83048,7 +83766,7 @@ msgstr "" #: lang/json/gun_from_json.py msgid "Tesla cannon" msgid_plural "Tesla cannons" -msgstr[0] "" +msgstr[0] "特斯拉砲" #: lang/json/gun_from_json.py msgid "" @@ -83188,26 +83906,6 @@ msgid "" "cartridges." msgstr "" -#: lang/json/gunmod_from_json.py -msgid ".300 AAC Blackout caliber conversion kit" -msgid_plural ".300 AAC Blackout caliber conversion kits" -msgstr[0] "" - -#: lang/json/gunmod_from_json.py -msgid "" -"This kit is used to convert an AR-15 .223/5.56mm rifle to the new .300BLK " -"caliber." -msgstr "" - -#: lang/json/gunmod_from_json.py -msgid "bore" -msgstr "槍膛" - -#: lang/json/gunmod_from_json.py -msgctxt "gun_type_type" -msgid "ar15" -msgstr "" - #: lang/json/gunmod_from_json.py msgid "barrel extension" msgid_plural "barrel extensions" @@ -83285,6 +83983,10 @@ msgid "" "slight reduction to accuracy." msgstr "" +#: lang/json/gunmod_from_json.py +msgid "bore" +msgstr "槍膛" + #: lang/json/gunmod_from_json.py msgid ".223 caliber conversion kit" msgid_plural ".223 caliber conversion kits" @@ -83477,12 +84179,12 @@ msgstr "" #: lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "kp32" -msgstr "" +msgstr "kp32" #: lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "kp3at" -msgstr "" +msgstr "kp3at" #: lang/json/gunmod_from_json.py msgctxt "gun_type_type" @@ -83582,6 +84284,35 @@ msgid "" " don't have to pick them up." msgstr "裝在退彈孔旁的袋子, 可以蒐集開火後的彈殼, 而不用一顆一顆撿。" +#: lang/json/gunmod_from_json.py +msgid ".300 AAC Blackout AR-15 conversion kit" +msgid_plural ".300 AAC Blackout AR-15 conversion kits" +msgstr[0] "" + +#: lang/json/gunmod_from_json.py +msgid "A complete AR-15 upper assembly with a .300 AAC Blackout barrel." +msgstr "" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "ar15" +msgstr "" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "m4a1" +msgstr "" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "h&k416a5" +msgstr "" + +#: lang/json/gunmod_from_json.py +msgctxt "gun_type_type" +msgid "m27iar" +msgstr "" + #: lang/json/gunmod_from_json.py msgid "lightweight replacement furniture" msgid_plural "lightweight replacement furnitures" @@ -84485,52 +85216,52 @@ msgstr[0] "LW 雷射瞄準器 (槍管下)" msgid "" "A Leadworks built in visible-light laser that mounts under a firearm's " "barrel to enhance ease and speed of target acquisition." -msgstr "" +msgstr "Leadworks 內建的可見光雷射發射器,安裝在槍械槍管下方,能提高瞄準的便利性和速度。" #: lang/json/gunmod_from_json.py msgid "LW forward grip" msgid_plural "LW forward grips" -msgstr[0] "" +msgstr[0] "LW 前置輔助握把" #: lang/json/gunmod_from_json.py msgid "" "A Leadworks built in grip placed forward on the barrel allows for greater " "control." -msgstr "" +msgstr "安裝於槍管上的 Leadworks 內建的前置握把可以大幅增加槍枝的操控性。" #: lang/json/gunmod_from_json.py msgid "LW bipod" msgid_plural "LW bipods" -msgstr[0] "" +msgstr[0] "LW 兩腳架" #: lang/json/gunmod_from_json.py msgid "" "Leadworks built in bipod designed to provide a forward rest and reduce " "motion. Although it greatly improve handling of recoil it is usable only on" " certain surfaces and are slow to equip." -msgstr "" +msgstr "Leadworks 內建的雙腳架,設計為提供前端支撐並減少晃動。雖然它大幅改善了後座力的控制,但卻只能在某些表面上使用,並且使用速度較慢。" #: lang/json/gunmod_from_json.py msgid "LW underslung shotgun" msgid_plural "LW underslung shotguns" -msgstr[0] "" +msgstr[0] "LW 槍管霰彈槍附掛" #: lang/json/gunmod_from_json.py msgid "" "Leadworks built in minimalist pump action shotgun module. It allows 4 " "shotgun shells to be loaded and fired." -msgstr "" +msgstr "Leadworks 內建的縮小化設計的泵動霰彈槍模組。它能裝填 4發霰彈並射擊。" #: lang/json/gunmod_from_json.py msgid "LW GLM" msgid_plural "LW GLM" -msgstr[0] "" +msgstr[0] "LW 榴彈發射器" #: lang/json/gunmod_from_json.py msgid "" "The Leadworks built in Grenade Launcher Module offers the functionality of " "larger launchers in a very small package." -msgstr "" +msgstr "Leadworks 內建的榴彈發射器模組,在很小的組件中提供了大型榴彈發射器的功能。" #: lang/json/gunmod_from_json.py msgid "spare magazine" @@ -85535,11 +86266,11 @@ msgstr "" #: lang/json/help_from_json.py msgid "" -"While magazines are often firearm-specific, on some occasions a magazine is compatible with several other firearms. The firearms in the game often reflect real-world prototypes in terms of caliber and compatibility. Below are some examples of interchangeable ammo:\n" -".308 = 7.62x51mm,\n" -".223 = 5.56 NATO,\n" -".270 = .30-06,\n" -".40 S&W = 10mm." +"While magazines and clips are often firearm-specific, on some occasions a magazine/speedloader is compatible with several other firearms or calibers. Below are some examples of calibers that might share magazines or speedloaders:\n" +".380 ACP and 9mm Luger,\n" +" .40 S&W and 10mm Auto 3\n" +".45 ACP and .460 Rowland,\n" +".45 Colt and .454 Casull." msgstr "" #: lang/json/help_from_json.py @@ -86614,8 +87345,9 @@ msgid "Measure radiation" msgstr "測量輻射" #: lang/json/item_action_from_json.py lang/json/mission_def_from_json.py +#: lang/json/mission_def_from_json.py lang/json/talk_topic_from_json.py #: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py -#: lang/json/talk_topic_from_json.py src/game_inventory.cpp +#: src/game_inventory.cpp msgid "..." msgstr "…" @@ -86677,11 +87409,15 @@ msgid "Well, you know" msgstr "好吧, 你懂的" #: lang/json/item_action_from_json.py -msgid "Wash clothes" -msgstr "清洗衣服" +msgid "Wash soft items" +msgstr "" + +#: lang/json/item_action_from_json.py +msgid "Wash hard items" +msgstr "" #: lang/json/item_action_from_json.py -msgid "Wash CBMs" +msgid "Wash items" msgstr "" #: lang/json/item_action_from_json.py @@ -86755,6 +87491,7 @@ msgid "" "This gear has cloaking tech that will make you " "invisible when active, at the cost of power from a UPS." msgstr "" +"* 這件裝備有迷彩科技能在啟動時使你隱形,但需要以UPS供電。" #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -87482,7 +88219,7 @@ msgstr "" msgid "" "You can 'e'xamine the tile to access the controls, or use the vehicle " "control key (default '^')." -msgstr "" +msgstr "你可以使用 e (檢查) 該格來操作控制器,或是使用車輛控制按鍵 (預設為 ^ )。" #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -87751,11 +88488,11 @@ msgstr "選擇裝備以重新排序" #: lang/json/keybinding_from_json.py msgid "Select panel for moving" -msgstr "" +msgstr "選擇面板以便移動" #: lang/json/keybinding_from_json.py msgid "Toggle panel off" -msgstr "" +msgstr "切換面板關閉" #: lang/json/keybinding_from_json.py msgid "Change side armor is worn on" @@ -87811,7 +88548,7 @@ msgstr "相關配方" #: lang/json/keybinding_from_json.py msgid "Toggle recipes to be shown in favorite tab" -msgstr "" +msgstr "切換配方是否顯示在最愛頁籤" #: lang/json/keybinding_from_json.py msgid "Go Up" @@ -87891,7 +88628,7 @@ msgstr "刪除註記" #: lang/json/keybinding_from_json.py msgid "Edit Note" -msgstr "" +msgstr "編輯註記" #: lang/json/keybinding_from_json.py msgid "Create/Edit Note" @@ -87911,11 +88648,11 @@ msgstr "切換圖標覆蓋" #: lang/json/keybinding_from_json.py msgid "Toggle Land Use Codes" -msgstr "" +msgstr "切換土地使用符號" #: lang/json/keybinding_from_json.py msgid "Toggle Map Notes" -msgstr "" +msgstr "切換地圖註記" #: lang/json/keybinding_from_json.py msgid "Toggle City Labels" @@ -87927,7 +88664,7 @@ msgstr "切換屍潮顯示" #: lang/json/keybinding_from_json.py msgid "Toggle Forest Trails" -msgstr "" +msgstr "切換森林步道" #: lang/json/keybinding_from_json.py msgid "Toggle Explored" @@ -87959,7 +88696,7 @@ msgstr "離開畫面" #: lang/json/keybinding_from_json.py msgid "Choose destination" -msgstr "" +msgstr "選擇目的地" #: lang/json/keybinding_from_json.py msgid "Fire Weapon" @@ -88107,7 +88844,7 @@ msgstr "加滿油箱/電池" #: lang/json/keybinding_from_json.py msgid "Unload fuel bunker" -msgstr "" +msgstr "卸載燃料儲放庫" #: lang/json/keybinding_from_json.py msgid "Remove part" @@ -88251,7 +88988,7 @@ msgstr "篩選" #: lang/json/keybinding_from_json.py msgid "Toggle item as favorite" -msgstr "" +msgstr "切換物品為喜愛" #: lang/json/keybinding_from_json.py msgid "Toggle activate/examine" @@ -88307,11 +89044,11 @@ msgstr "進階物品管理" #: lang/json/keybinding_from_json.py msgid "Pick up Nearby Item(s)" -msgstr "" +msgstr "拾取鄰近的物品" #: lang/json/keybinding_from_json.py msgid "Pickup Item(s) at Player Feet" -msgstr "" +msgstr "撿起腳下的物品" #: lang/json/keybinding_from_json.py msgid "Grab something nearby" @@ -88323,7 +89060,7 @@ msgstr "搬運地面上的物品" #: lang/json/keybinding_from_json.py msgid "Zone activities" -msgstr "" +msgstr "區域活動" #: lang/json/keybinding_from_json.py src/options.cpp msgid "Butcher" @@ -88379,7 +89116,7 @@ msgstr "脫掉物品" #: lang/json/keybinding_from_json.py msgid "Consume Item Menu" -msgstr "" +msgstr "消耗物品選單" #: lang/json/keybinding_from_json.py msgid "Wield" @@ -88403,7 +89140,7 @@ msgstr "投擲物品" #: lang/json/keybinding_from_json.py msgid "Blind Throw Item" -msgstr "" +msgstr "盲擲物品" #: lang/json/keybinding_from_json.py msgid "Fire Wielded Item" @@ -88463,7 +89200,7 @@ msgstr "控制車輛" #: lang/json/keybinding_from_json.py msgid "Toggle Auto Travel Mode" -msgstr "" +msgstr "切換自動旅行模式" #: lang/json/keybinding_from_json.py msgid "Toggle Safe Mode" @@ -88495,7 +89232,7 @@ msgstr "檢視地圖" #: lang/json/keybinding_from_json.py msgid "Look at the sky" -msgstr "" +msgstr "望向天空" #: lang/json/keybinding_from_json.py msgid "View Factions" @@ -88539,15 +89276,15 @@ msgstr "檢視嗅覺地圖" #: lang/json/keybinding_from_json.py msgid "View Temperature Map" -msgstr "" +msgstr "查看氣溫地圖" #: lang/json/keybinding_from_json.py msgid "View Visibility Map" -msgstr "" +msgstr "查看視線地圖" #: lang/json/keybinding_from_json.py msgid "View Radiation Map" -msgstr "" +msgstr "查看輻射量地圖" #: lang/json/keybinding_from_json.py msgid "Switch Sidebar Style" @@ -88563,11 +89300,11 @@ msgstr "切換像素小地圖" #: lang/json/keybinding_from_json.py msgid "Toggle Panel Admin" -msgstr "" +msgstr "切換面板管理" #: lang/json/keybinding_from_json.py msgid "Reload Item" -msgstr "" +msgstr "裝填物品" #: lang/json/keybinding_from_json.py msgid "Reload Tileset" @@ -88591,7 +89328,7 @@ msgstr "切換自動採集" #: lang/json/keybinding_from_json.py msgid "Toggle Auto Pickup" -msgstr "" +msgstr "切換自動撿取" #: lang/json/keybinding_from_json.py msgid "Action Menu" @@ -88671,27 +89408,27 @@ msgstr "啟用中的模組" #: lang/json/keybinding_from_json.py msgid "Cycle move mode (run/walk/crouch)" -msgstr "" +msgstr "循環切換移動模式(跑步/步行/蹲伏)" #: lang/json/keybinding_from_json.py msgid "Reset Movement to Walk" -msgstr "" +msgstr "重設行動模式為步行" #: lang/json/keybinding_from_json.py msgid "Toggle Run" -msgstr "" +msgstr "切換跑步" #: lang/json/keybinding_from_json.py msgid "Toggle Crouch" -msgstr "" +msgstr "切換蹲伏" #: lang/json/keybinding_from_json.py msgid "Movement Mode Menu" -msgstr "" +msgstr "行動模式選單" #: lang/json/keybinding_from_json.py msgid "Spellcasting" -msgstr "" +msgstr "施法" #: lang/json/keybinding_from_json.py src/game_inventory.cpp msgid "Compare" @@ -88715,15 +89452,15 @@ msgstr "改變排序模式" #: lang/json/keybinding_from_json.py msgid "Add to safemode blacklist" -msgstr "" +msgstr "加到安全模式黑名單" #: lang/json/keybinding_from_json.py msgid "Remove from safemode blacklist" -msgstr "" +msgstr "從安全模式黑名單中刪除" #: lang/json/keybinding_from_json.py msgid "look around" -msgstr "" +msgstr "查看四周" #: lang/json/keybinding_from_json.py msgid "List items and monsters" @@ -88833,7 +89570,7 @@ msgstr "移動所有物品" #: lang/json/keybinding_from_json.py msgid "Mark/unmark non-favorite items in multidrop menu" -msgstr "" +msgstr "標記/去除標記多重丟棄選單中的非喜愛物品" #: lang/json/keybinding_from_json.py msgid "Select items @ North-West" @@ -88925,7 +89662,7 @@ msgstr "忽略所有中斷事件並完成。" #: lang/json/keybinding_from_json.py msgid "Cancel popup" -msgstr "" +msgstr "取消彈出視窗" #: lang/json/keybinding_from_json.py src/vehicle_use.cpp src/vehicle_use.cpp msgid "Control multiple electronics" @@ -88997,11 +89734,11 @@ msgstr "開關車頭燈" #: lang/json/keybinding_from_json.py msgid "Toggle wide-angle headlights" -msgstr "" +msgstr "開關廣角車頭燈" #: lang/json/keybinding_from_json.py msgid "Toggle directional overhead lights" -msgstr "" +msgstr "開關定向車頂燈" #: lang/json/keybinding_from_json.py msgid "Toggle overhead lights" @@ -89070,52 +89807,52 @@ msgstr "沒事" #. ~ Description for Nothing #: lang/json/map_extra_from_json.py msgid "Nothing of interest is here." -msgstr "" +msgstr "這裡沒什麼特別的東西。" #: lang/json/map_extra_from_json.py msgid "Crater" -msgstr "" +msgstr "彈坑" #. ~ Description for Crater #: lang/json/map_extra_from_json.py msgid "There is a crater here." -msgstr "" +msgstr "這裡有個彈坑。" #: lang/json/map_extra_from_json.py msgid "Fumarole" -msgstr "" +msgstr "火山噴氣孔" #. ~ Description for Fumarole #: lang/json/map_extra_from_json.py msgid "There is a fumarole here." -msgstr "" +msgstr "這裡有個火山噴氣孔。" #: lang/json/map_extra_from_json.py msgid "College Kids" -msgstr "" +msgstr "大學生" #. ~ Description for College Kids #: lang/json/map_extra_from_json.py msgid "Several corpses of college kids are here." -msgstr "" +msgstr "這裡有數具大學生的屍體" #: lang/json/map_extra_from_json.py msgid "Drug Deal" -msgstr "" +msgstr "毒品交易" #. ~ Description for Drug Deal #: lang/json/map_extra_from_json.py msgid "Several corpses of drug dealers are here." -msgstr "" +msgstr "這裡有數具毒品交易者的屍體。" #: lang/json/map_extra_from_json.py msgid "Roadworks" -msgstr "" +msgstr "道路施工" #. ~ Description for Roadworks #: lang/json/map_extra_from_json.py msgid "Roadworks are here." -msgstr "" +msgstr "這裡正在進行道路工程。" #: lang/json/map_extra_from_json.py msgid "Road Mayhem" @@ -89128,39 +89865,39 @@ msgstr "" #: lang/json/map_extra_from_json.py msgid "Roadblock (Military)" -msgstr "" +msgstr "路障(軍隊)" #. ~ Description for Roadblock (Military) #: lang/json/map_extra_from_json.py msgid "This road is blocked by military." -msgstr "" +msgstr "這條路被軍方封鎖。" #: lang/json/map_extra_from_json.py msgid "Roadblock (Bandits)" -msgstr "" +msgstr "路障(強盜)" #. ~ Description for Roadblock (Bandits) #: lang/json/map_extra_from_json.py msgid "This road is blocked by bandits." -msgstr "" +msgstr "這條路被強盜封鎖。" #: lang/json/map_extra_from_json.py msgid "Minefield" -msgstr "" +msgstr "地雷區" #. ~ Description for Minefield #: lang/json/map_extra_from_json.py msgid "Mines are scattered here." -msgstr "" +msgstr "地雷分布在這區。" #: lang/json/map_extra_from_json.py msgid "Supply Drop" -msgstr "" +msgstr "空投物資" #. ~ Description for Supply Drop #: lang/json/map_extra_from_json.py msgid "Several supply crates were dropped here." -msgstr "" +msgstr "這裡有一些空投下來的物資箱。" #. ~ Military time, e.g. 2359 #: lang/json/map_extra_from_json.py src/options.cpp @@ -89170,7 +89907,7 @@ msgstr "軍用" #. ~ Description for Military #: lang/json/map_extra_from_json.py msgid "Several corpses of soldiers are here." -msgstr "" +msgstr "這裡有數具軍人的屍體" #: lang/json/map_extra_from_json.py msgid "Helicopter Crash" @@ -89179,61 +89916,61 @@ msgstr "直升機墜毀" #. ~ Description for Helicopter Crash #: lang/json/map_extra_from_json.py msgid "Helicopter crashed here." -msgstr "" +msgstr "直升機墜毀在這裡。" #: lang/json/map_extra_from_json.py msgid "Scientists" -msgstr "" +msgstr "科學家" #. ~ Description for Scientists #: lang/json/map_extra_from_json.py msgid "Several corpses of scientists are here." -msgstr "" +msgstr "這裡有數具科學家的屍體" #: lang/json/map_extra_from_json.py msgid "Portal" -msgstr "" +msgstr "傳送門" #. ~ Description for Portal #: lang/json/map_extra_from_json.py msgid "Portal is here." -msgstr "" +msgstr "這裡有座傳送門。" #: lang/json/map_extra_from_json.py msgid "Portal In" -msgstr "" +msgstr "傳送門之中" #. ~ Description for Portal In #: lang/json/map_extra_from_json.py msgid "Another portal is here." -msgstr "" +msgstr "另一座傳送門在此。" #: lang/json/map_extra_from_json.py msgid "Anomaly" -msgstr "" +msgstr "異常" #. ~ Description for Anomaly #: lang/json/map_extra_from_json.py msgid "Some anomaly is here." -msgstr "" +msgstr "這裡有些異常生物。" #: lang/json/map_extra_from_json.py msgid "Spider Nest" -msgstr "" +msgstr "蜘蛛窩" #. ~ Description for Spider Nest #: lang/json/map_extra_from_json.py msgid "Spider nest is here." -msgstr "" +msgstr "蜘蛛窩在此。" #: lang/json/map_extra_from_json.py msgid "Wasp Nest" -msgstr "" +msgstr "黃蜂窩" #. ~ Description for Wasp Nest #: lang/json/map_extra_from_json.py msgid "Wasp nest is here." -msgstr "" +msgstr "馬蜂窩在此。" #: lang/json/map_extra_from_json.py src/defense.cpp msgid "Spiders" @@ -89242,94 +89979,94 @@ msgstr "蜘蛛" #. ~ Description for Spiders #: lang/json/map_extra_from_json.py msgid "This area is covered with webs. Probably spiders are nearby" -msgstr "" +msgstr "這區域滿布蜘蛛網。也許有蜘蛛在附近。" #. ~ Description for Shia LaBeouf #: lang/json/map_extra_from_json.py msgid "Cannibal is nearby." -msgstr "" +msgstr "附近有食人族。" #: lang/json/map_extra_from_json.py msgid "Jabberwock" -msgstr "" +msgstr "變種人魔獸" #. ~ Description for Jabberwock #: lang/json/map_extra_from_json.py msgid "Jabberwock is nearby." -msgstr "" +msgstr "變種人魔獸在這附近。" #: lang/json/map_extra_from_json.py msgid "Grove" -msgstr "" +msgstr "小樹林" #. ~ Description for Grove #: lang/json/map_extra_from_json.py msgid "This area is covered with a single type of trees." -msgstr "" +msgstr "這個區域生長著單一種類的樹木。" #: lang/json/map_extra_from_json.py msgid "Shrubberry" -msgstr "" +msgstr "漿果叢" #. ~ Description for Shrubberry #: lang/json/map_extra_from_json.py msgid "This area is covered with a single type of shrubs." -msgstr "" +msgstr "這個區域生長著單一種類的漿果灌木。" #: lang/json/map_extra_from_json.py msgid "Clearcut" -msgstr "" +msgstr "皆伐" #. ~ Description for Clearcut #: lang/json/map_extra_from_json.py msgid "Most trees in this area were uniformly cut down." -msgstr "" +msgstr "這個區域的大多數樹木都被一致地砍伐光了。" #: lang/json/map_extra_from_json.py msgid "Pond" -msgstr "" +msgstr "池塘" #. ~ Description for Pond #: lang/json/map_extra_from_json.py msgid "Small pond is here." -msgstr "" +msgstr "這裡有座小池塘。" #: lang/json/map_extra_from_json.py msgid "Clay Deposit" -msgstr "" +msgstr "黏土礦床" #. ~ Description for Clay Deposit #: lang/json/map_extra_from_json.py msgid "Small clay deposit is here." -msgstr "" +msgstr "這裡有座小型黏土礦床。" #: lang/json/map_extra_from_json.py msgid "Dead Vegetation" -msgstr "" +msgstr "死植披" #. ~ Description for Dead Vegetation #. ~ Description for Dead Vegetation (Point) #: lang/json/map_extra_from_json.py msgid "Dead vegetation is here." -msgstr "" +msgstr "此處為死亡的植披。" #: lang/json/map_extra_from_json.py msgid "Dead Vegetation (Point)" -msgstr "" +msgstr "死植披(單點)" #: lang/json/map_extra_from_json.py msgid "Burned Ground" -msgstr "" +msgstr "焚毀地面" #. ~ Description for Burned Ground #. ~ Description for Burned Ground (Point) #: lang/json/map_extra_from_json.py msgid "Burned ground is here." -msgstr "" +msgstr "地面已被焚燒殆盡。" #: lang/json/map_extra_from_json.py msgid "Burned Ground (Point)" -msgstr "" +msgstr "焚毀地面(單點)" #: lang/json/map_extra_from_json.py msgid "Marloss Pilgrimage" @@ -89342,12 +90079,12 @@ msgstr "" #: lang/json/map_extra_from_json.py msgid "Casings" -msgstr "" +msgstr "彈殼" #. ~ Description for Casings #: lang/json/map_extra_from_json.py msgid "Several spent casings are here." -msgstr "" +msgstr "這裡有數個用過的彈殼。" #. ~ Computer name #: lang/json/mapgen_from_json.py @@ -89362,7 +90099,7 @@ msgstr "開啟保管庫" #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "High Security Consolidated Computerized Bank of the Treasury" -msgstr "" +msgstr "財政部高安全性整合電腦化銀行" #. ~ Sign #: lang/json/mapgen_from_json.py @@ -89387,12 +90124,12 @@ msgstr " 公墓" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Please respect the cemetery" -msgstr "" +msgstr "請尊重墓地" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "May and their family rest in peace" -msgstr "" +msgstr "願 與其家人安息。" #. ~ Sign #: lang/json/mapgen_from_json.py @@ -89432,12 +90169,12 @@ msgstr "警告:正在進行中" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Private Property: No Trespassing" -msgstr "" +msgstr "私人財產:禁止擅入" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Discount Tires" -msgstr "" +msgstr "特價輪胎" #. ~ Sign #: lang/json/mapgen_from_json.py @@ -89447,37 +90184,37 @@ msgstr "一美元商店" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "OPEN 24/7!" -msgstr "" +msgstr "全年無休!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid " Dump" -msgstr "" +msgstr "垃圾場" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "DUMP" -msgstr "" +msgstr "垃圾場" #. ~ Sign #: lang/json/mapgen_from_json.py msgid " Area Dump" -msgstr "" +msgstr "區垃圾場 " #. ~ Sign #: lang/json/mapgen_from_json.py msgid "'s Tree Farm, call us at 555-8758!" -msgstr "" +msgstr "的林場,聯絡我們 555-8758!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Christmas trees available early winter!" -msgstr "" +msgstr "初冬聖誕樹供應!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Welcome to Botanical Garden! Please stay on the path!" -msgstr "" +msgstr "歡迎來到植物園! 請勿踐踏草皮!" #. ~ Sign #: lang/json/mapgen_from_json.py @@ -89532,7 +90269,7 @@ msgstr "蒲公英" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "KENTUCKY COFFEE" -msgstr "" +msgstr "肯塔基州咖啡" #. ~ Sign #: lang/json/mapgen_from_json.py @@ -89597,27 +90334,27 @@ msgstr "藍莓" #. ~ Sign #: lang/json/mapgen_from_json.py msgid " Community Garden" -msgstr "" +msgstr "社區花園" #. ~ Sign #: lang/json/mapgen_from_json.py msgid " Community Garden. Grow your own food!" -msgstr "" +msgstr "社區花園。自己的食物自己種!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid " Community Garden, sign up for your own plot!" -msgstr "" +msgstr "社區花園。註冊即可擁有你自己的田地!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid " Community Garden, grow your own vegetables!" -msgstr "" +msgstr "社區花園。自己的蔬菜自己種!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid " Public Garden" -msgstr "" +msgstr "公共花園" #. ~ Sign #: lang/json/mapgen_from_json.py @@ -89722,87 +90459,87 @@ msgstr "分析血液" #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Irradiation Facility Operation Console" -msgstr "" +msgstr "輻照設施操作控制台" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "Uplink to mainframe servers" -msgstr "" +msgstr "連線到大型伺服器" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "Cycle conveyor belt" -msgstr "" +msgstr "循環輸送帶" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "Toggle safety shutters" -msgstr "" +msgstr "切換安全隔板" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "Probe radiation levels" -msgstr "" +msgstr "探測輻射指數" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "Commence irradiation sequence" -msgstr "" +msgstr "開始照射程序" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "[Maintenance] Extract radiation core" -msgstr "" +msgstr "[維護] 提取輻射核心" #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Hazardous Materials Containment" -msgstr "" +msgstr "危險物質收容區" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "Access containment zone" -msgstr "" +msgstr "存取收容區" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "Geiger counter readout" -msgstr "" +msgstr "蓋革計數器讀數" #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Security Access Terminal" -msgstr "" +msgstr "保全存取終端機" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "Open doors" -msgstr "" +msgstr "開門" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "Access security locker" -msgstr "" +msgstr "存取安全鎖" #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Power Management" -msgstr "" +msgstr "電源管理" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "External power management" -msgstr "" +msgstr "外部電源管理" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "Backup power management" -msgstr "" +msgstr "備用電源管理" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "Run emergency auto-diagnostic" -msgstr "" +msgstr "執行緊急自動診斷" #. ~ Sign #: lang/json/mapgen_from_json.py @@ -89817,17 +90554,17 @@ msgstr "沙子" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "WOODCHIPS" -msgstr "" +msgstr "木片" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "LOGS" -msgstr "" +msgstr "原木" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "STICKS" -msgstr "" +msgstr "木棍" #. ~ Sign #: lang/json/mapgen_from_json.py @@ -89837,22 +90574,22 @@ msgstr "黏土" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "HAY" -msgstr "" +msgstr "乾草" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "DIRT" -msgstr "" +msgstr "泥土" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "GRAVEL" -msgstr "" +msgstr "礫石" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "CEMENT" -msgstr "" +msgstr "水泥" #. ~ Sign #: lang/json/mapgen_from_json.py @@ -89862,68 +90599,68 @@ msgstr "肥料" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "ROCKS" -msgstr "" +msgstr "石頭" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "BOULDERS and SLABS" -msgstr "" +msgstr "大圓石與石板" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "" "Empty lot, great for your small business! Call at 555-2117!" -msgstr "" +msgstr "空地,非常適合小型企業!電洽:555-2117!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Empty lot for sale!" -msgstr "" +msgstr "空地求售!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Call Family Realty at 555-3130!" -msgstr "" +msgstr "電洽家庭物業:555-3130!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "SOLD!" -msgstr "" +msgstr "已賣出!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "East Realty!" -msgstr "" +msgstr "東物業!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Lot for sale!" -msgstr "" +msgstr "空地求售!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Call for more info. 555-7723" -msgstr "" +msgstr "更多資訊請洽555-7723" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Private Property!" -msgstr "" +msgstr "私人財產!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "NO Dumping!" -msgstr "" +msgstr "禁倒垃圾!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Cheap lot for sale! Call at 555-5151!" -msgstr "" +msgstr "便宜空地求售!電洽:555-5151!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Property for sale!" -msgstr "" +msgstr "待售物業!" #. ~ Sign #: lang/json/mapgen_from_json.py @@ -90045,37 +90782,37 @@ msgstr "" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "NO lifeguard on duty, swim at own risk!" -msgstr "" +msgstr "沒有救生員值班,自行承擔游泳風險!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "NO lifeguard on duty!" -msgstr "" +msgstr "沒有救生員值班!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "NO running!" -msgstr "" +msgstr "請勿奔跑!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "MEN" -msgstr "" +msgstr "男" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "WOMEN" -msgstr "" +msgstr "女" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "NO diving in the shallow end!" -msgstr "" +msgstr "別在淺水區潛水!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Women" -msgstr "" +msgstr "女" #. ~ Sign #: lang/json/mapgen_from_json.py @@ -90085,12 +90822,12 @@ msgstr "人" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "NO Running!" -msgstr "" +msgstr "請勿奔跑!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "NO Diving!" -msgstr "" +msgstr "請勿潛水!" #. ~ Sign #: lang/json/mapgen_from_json.py @@ -90180,6 +90917,41 @@ msgstr "" msgid "the name is gone but a slogan remains: 'We'll repair you all the way'" msgstr "名稱已經消失, 但是標語還在: \"我們會一直修好你\"" +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "EnviroCom OS v2.03 - Basement Access" +msgstr "" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Unlock stairs" +msgstr "解鎖階梯" + +#. ~ Sign +#: lang/json/mapgen_from_json.py +msgid "Authorized personnel only" +msgstr "" + +#. ~ Sign +#: lang/json/mapgen_from_json.py +msgid " sewage treatment plant" +msgstr "" + +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "EnviroCom OS v2.03" +msgstr "EnviroCom OS v2.03" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Download Sewer Maps" +msgstr "下載下水道地圖" + +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Divert sample" +msgstr "轉移樣本" + #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Evac shelter computer" @@ -90444,22 +91216,22 @@ msgstr "查看地鐵路線" #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Vehicle Testing Track" -msgstr "" +msgstr "車輛測試跑道" #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Weapons Testing Range" -msgstr "" +msgstr "武器測試射擊場" #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Armory Entrance" -msgstr "" +msgstr "軍械庫入口" #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Hydroponics Entrance" -msgstr "" +msgstr "水耕栽培室入口" #. ~ Computer name #: lang/json/mapgen_from_json.py @@ -90506,11 +91278,11 @@ msgid "" "Aikido is a Japanese martial art focused on self-defense, while minimizing " "injury to the attacker. It uses defensive throws and disarms but lacks " "offensive tehcniques." -msgstr "" +msgstr "合氣道室一種著重於自我防衛的日本武術,同時盡量減少對攻擊者的傷害。它使用防禦性的擲摔和繳械技術,但缺乏進攻的招式。" #: lang/json/martial_art_from_json.py msgid "Aikido Stance" -msgstr "" +msgstr "合氣道架式" #. ~ Description of buff 'Aikido Stance' for martial art 'Aikido' #: lang/json/martial_art_from_json.py @@ -90789,6 +91561,43 @@ msgid "" "Blocked damage reduced by 50%% of Dexterity." msgstr "" +#. ~ Description for martial art 'Fior Di Battaglia' +#: lang/json/martial_art_from_json.py +msgid "" +"Medieval Europe's martial techniques for fighting with polearms. The " +"\"Flower of Battle\" places great focus on countering one's opponent and " +"knocking them down before landing a killing blow" +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Stand Your Ground" +msgstr "" + +#. ~ Description of buff 'Stand Your Ground' for martial art 'Fior Di +#. Battaglia' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You stalwart and will not budge against any threat.\n" +"\n" +"+2 Block attempts, -1.0 Dodge skill, blocked damage reduced by 50%% of Strength." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Tactical Retreat" +msgstr "" + +#. ~ Description of buff 'Tactical Retreat' for martial art 'Fior Di +#. Battaglia' +#: lang/json/martial_art_from_json.py +#, no-python-format +msgid "" +"You moved and nullified the effects of Stand Your Ground!\n" +"\n" +"-2 Block attempts, +1.0 Dodge skill, blocked damaged increased by 50%% of Strength.\n" +"Lasts 1 turn." +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Karate" msgstr "空手道" @@ -91227,35 +92036,6 @@ msgstr "" msgid "Perception increases dodging ability, +1 dodges per turn" msgstr "" -#. ~ Description for martial art 'Fior Di Battaglia' -#: lang/json/martial_art_from_json.py -msgid "" -"Medieval Europe's martial techniques for fighting with polearms, great focus" -" is given in countering one's opponent and knocking them down before landing" -" a killing blow" -msgstr "" - -#: lang/json/martial_art_from_json.py -msgid "Stand Your Ground" -msgstr "" - -#. ~ Description of buff 'Stand Your Ground' for martial art 'Fior Di -#. Battaglia' -#: lang/json/martial_art_from_json.py -msgid "" -"+2 blocks -1 dodge, halves your dodge and damage is reduced by your strength" -" when blocking" -msgstr "" - -#: lang/json/martial_art_from_json.py -msgid "You moved" -msgstr "" - -#. ~ Description of buff 'You moved' for martial art 'Fior Di Battaglia' -#: lang/json/martial_art_from_json.py -msgid "Nullifies Stand Your Ground, don't move, stand there and counter!" -msgstr "" - #: lang/json/martial_art_from_json.py msgid "Medieval Swordsmanship" msgstr "中世紀劍術" @@ -91657,7 +92437,7 @@ msgstr "損壞的" #: lang/json/material_from_json.py msgid "Dragon Scale" -msgstr "" +msgstr "龍鱗" #: lang/json/material_from_json.py msgid "Chitin" @@ -91833,7 +92613,7 @@ msgstr "破洞的" #: lang/json/material_from_json.py msgid "Resin" -msgstr "" +msgstr "樹脂" #: lang/json/material_from_json.py msgid "Powder" @@ -91861,7 +92641,7 @@ msgstr "超合金" #: lang/json/material_from_json.py msgid "Tin" -msgstr "" +msgstr "錫" #: lang/json/material_from_json.py msgid "Vegetable Matter" @@ -91927,31 +92707,31 @@ msgstr "搗成泥" #: lang/json/material_from_json.py msgid "Dried Vegetable" -msgstr "" +msgstr "乾燥蔬菜" #: lang/json/material_from_json.py msgid "Cured Meat" -msgstr "" +msgstr "醃肉" #: lang/json/material_from_json.py msgid "Processed Food" -msgstr "" +msgstr "加工食品" #: lang/json/material_from_json.py msgid "Cheese" -msgstr "" +msgstr "起司" #: lang/json/material_from_json.py msgid "Ice Cream" -msgstr "" +msgstr "冰淇淋" #: lang/json/material_from_json.py msgid "Soil" -msgstr "" +msgstr "土壤" #: lang/json/material_from_json.py msgid "Zinc" -msgstr "" +msgstr "鋅" #: lang/json/material_from_json.py msgid "Bronze" @@ -91959,19 +92739,19 @@ msgstr "青銅" #: lang/json/material_from_json.py msgid "Titanium" -msgstr "" +msgstr "鈦" #: lang/json/material_from_json.py msgid "Rubber" -msgstr "" +msgstr "橡膠" #: lang/json/material_from_json.py msgid "Arcane Skin" -msgstr "" +msgstr "奧術皮膚" #: lang/json/material_from_json.py msgid "Demon Chitin" -msgstr "" +msgstr "惡魔幾丁質" #: lang/json/mission_def_from_json.py msgid "Find a Book" @@ -93109,39 +93889,6 @@ msgstr "非常謝謝你幫我找到牠!" msgid "Oh no! My poor puppy..." msgstr "喔不! 我可憐的狗狗…" -#: lang/json/mission_def_from_json.py -msgid "Find 100 Cigarettes" -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "Come on man, I just need a smoke." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "" -"With all that's been going on, it's been more and more difficult to find a " -"smoke. My stash has been running low for a while now. Think you could help" -" me out here? A few packs is all I need." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "Thanks, it's great to see someone willing to help a guy out." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "" -"Plenty of smokers in towns. Gotta be some left over cigs in some of them " -"houses." -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "Got the smokes?" -msgstr "" - -#: lang/json/mission_def_from_json.py -msgid "Thanks! I'll be sure to put in a good word for you around the center." -msgstr "" - #: lang/json/mission_def_from_json.py msgid "Break into armory to retrieve family photo" msgstr "" @@ -93360,7 +94107,7 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "We need to investigate the alien encampment." -msgstr "" +msgstr "我們需要調查外星人的營地。" #: lang/json/mission_def_from_json.py msgid "I can take you to the structure those things were building." @@ -93577,7 +94324,7 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "Grocery stores, house kitchens, there's plenty of places to look." -msgstr "" +msgstr "雜貨店、家用廚房,外面有很多地方可以去找找看。" #: lang/json/mission_def_from_json.py msgid "Wow, perfect. Thanks. Here's your reward." @@ -94181,7 +94928,7 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "Find a copy of the Quran" -msgstr "" +msgstr "尋找可蘭經的複本。" #: lang/json/mission_def_from_json.py msgid "I could use a bit of help to find a copy of the Quran." @@ -94427,8 +95174,8 @@ msgid "" msgstr "" #: lang/json/mission_def_from_json.py -msgid "Find 50 3L jars" -msgstr "" +msgid "In a Pickle Pt. 2" +msgstr "在困境之中.二" #: lang/json/mission_def_from_json.py msgid "I do have some work for you." @@ -94456,6 +95203,39 @@ msgid "" "payment." msgstr "" +#: lang/json/mission_def_from_json.py +msgid "Smokes, let's go." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Come on man, I just need a smoke." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"With all that's been going on, it's been more and more difficult to find a " +"smoke. My stash has been running low for a while now. Think you could help" +" me out here? A few packs is all I need." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Thanks, it's great to see someone willing to help a guy out." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Plenty of smokers in towns. Gotta be some left over cigs in some of them " +"houses." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Got the smokes?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Thanks! I'll be sure to put in a good word for you around the center." +msgstr "" + #: lang/json/mission_def_from_json.py msgid "Clear Back Bay" msgstr "清除後灣區" @@ -94499,6 +95279,7 @@ msgid "" "workers in exchange for supplies. They're getting some value in the center " "as a trade item, I'm afraid they're all we have to spare at the moment." msgstr "" +"謝謝你,在家附近有那種巨大威脅真的令人神經繃緊。這裡有在我們內部流通的商票,我們會付給我們的工人,讓他們可以換取補給品。這東西在中心裡開始有買賣用的貨幣的價值,恐怕這些是現在我們能使用的。" #: lang/json/mission_def_from_json.py msgid "Missing Caravan" @@ -94515,6 +95296,9 @@ msgid "" "the supplies they were carrying, plus thirty certified notes - that's our " "own internal money, good for trading and such." msgstr "" +"這次的任務比上次的更複雜了點, 我們最近跟常往來交易的拾荒者集團失聯了, " +"希望你能去調查。我們強烈懷疑是強盜集團幹的或是他們遇到屍潮。你能給你上次無線電失聯時的座標, 但就這樣而已。換個角度來看, 若處理掉威脅後, " +"拾荒者們就能夠繼續透過相對安全的路線來跟我們交易。我能提供給你的最好獎勵就是他們攜帶的貨物,以及三十商票 - 那是我們內部流通的貨幣,可以用作交易。" #: lang/json/mission_def_from_json.py msgid "Our community survives on trade, we appreciate it." @@ -94549,6 +95333,8 @@ msgid "" " with the foreman to get more detailed tasks. We've got 50 Certified Notes " "for you if you can do this for us." msgstr "" +"我們最近派出了一些熟練的成員去開始設置哨站,去確保我們的食品補給有一個更安全的地方,新哨站需要你幫忙支援。我希望你可以在我們把更多難民們送到農團前跟領班拿到創建計劃書。請跟他連絡," +" 他會告訴你相關的細節。如果你肯幫我們手的話,我們會付你50商票。" #: lang/json/mission_def_from_json.py msgid "I'm sure the outpost will expand quickly with your assistance." @@ -94566,10 +95352,10 @@ msgstr "你拿到計劃書了嗎?" msgid "" "With this we'll be able to convince others to invest in the commune. Thank " "you, here's your money." -msgstr "" +msgstr "有這個我們就可以派人去加入工舍了, 謝謝你,這是你的報酬。" #: lang/json/mission_def_from_json.py -msgid "Find 10 solar panels" +msgid "Solar Power" msgstr "" #: lang/json/mission_def_from_json.py @@ -94581,6 +95367,8 @@ msgid "" "had a few solar panels we could use them to top up our usage. We could pay " "you pretty handsomely to bring us, say, ten solar panels?" msgstr "" +"我們開始在這建造新的設施, 並期望讓少數的新電力系統上線… 不幸的是, " +"我們既有的系統仰賴一種稱作放射性同位素熱電機的陣列系統。當然。在地底裡運作發電機並不是可行的選擇。我們有一個巨大而平坦的屋頂,如果我們有太陽能板的話,我們可以增加這裡的使用率。如果你帶到...我想...十塊太陽能板吧,我們會給你豐厚的報酬。" #: lang/json/mission_def_from_json.py msgid "If you can do this for us our survival options would vastly increase." @@ -94588,7 +95376,7 @@ msgstr "如果你可以幫我們作這件事, 我們存活下去的機會就能 #: lang/json/mission_def_from_json.py msgid "Solar panels are pretty common on electric cars and on rooftops." -msgstr "" +msgstr "太陽能板在電動車以及屋頂上很常見。" #: lang/json/mission_def_from_json.py msgid "" @@ -94597,8 +95385,8 @@ msgid "" msgstr "好了, 我知道這不算太多, 但我們能會繼續搜索下去, 感謝您的協助。" #: lang/json/mission_def_from_json.py -msgid "Find 100 canning jars" -msgstr "" +msgid "In a Pickle" +msgstr "在困境之中" #: lang/json/mission_def_from_json.py msgid "" @@ -94611,12 +95399,13 @@ msgid "" "to get us set for the winter. I'll pay you a premium rate if you can bring " "us around a hundred jars to get us started." msgstr "" +"即使我們在管理每日的食料補給,也只是勉強夠生存。如果我們繼續因為某些原因滯留在這裡的話,我們的儲備只足夠維持數天。我們需要儲備物資去避免這事情發生。多得我們的前哨地,我們有一點點肉類與蔬菜輸入,但我們需要一個更好的方法去保存。部分成員有足夠的罐頭製作知識,如果我們有足夠的玻璃罐,我們能夠製作醃菜與肉罐頭去對抗冬季。如果你能帶給我們大約一百個玻璃罐的話,我會給你一個高的兌換率。" #: lang/json/mission_def_from_json.py msgid "" "It'll take a load off my shoulders if I can finally stop worrying about " "this." -msgstr "" +msgstr "如果我可以不再擔心這件事的話,那就能放下重擔。" #: lang/json/mission_def_from_json.py msgid "" @@ -94633,6 +95422,8 @@ msgid "" "might be easier to just go straight through their office if you want more " "work." msgstr "" +"有多一件事不需要再擔心了,很高興有你這樣的人幫我們。這裡是25商票,另外代理人會買下更多的玻璃罐 - " +"以一個比較低的僳格,我們無法保持著高兌換率。事實上,代理人說他們有這一類的工作,如果你想要更多工作的話,直接去他們的辦公室會比較簡單。" #: lang/json/mission_def_from_json.py msgid "" @@ -94683,11 +95474,11 @@ msgstr "你完成了你的任務了嗎?" #: lang/json/mission_def_from_json.py msgid "" "Thanks! This data looks damaged, but maybe I can make something out of it." -msgstr "" +msgstr "謝謝!這個資料看來是受損了,但我想我可以用它來製作一些東西。" #: lang/json/mission_def_from_json.py msgid "Download Encryption Codes" -msgstr "" +msgstr "下載加密編碼" #: lang/json/mission_def_from_json.py msgid "" @@ -94698,22 +95489,23 @@ msgid "" "hidden beneath a town, they weren't allowed in. That means it should have " "unsecured computers we can get the codes from." msgstr "" +"很不幸,你拿到的資料並不完整,且大部分都被加密了。那應該有方法取得加密編碼的。我找到一個資訊安全組的投訴說他們無法傳送重要安全升級到其中一個研究設施。這是某種保密的從屬設施隱藏在市鎮下面,組員不被准許進入。那代表裡面應該有些沒加密的電腦可以讓我們拿到編碼。" #: lang/json/mission_def_from_json.py msgid "" "Great! I've mapped out a route, it should look like a normal house. Bring " "back anything you find on a USB drive." -msgstr "" +msgstr "大好了!我記下了路線,那看下去應該像一間普通的民居,將任何你找到的東西放進USB隨身碟裡,然後帶回來。" #: lang/json/mission_def_from_json.py msgid "Expect the lab to be locked as usual." -msgstr "" +msgstr "預料研究所會像平時一樣封鎖著。" #: lang/json/mission_def_from_json.py msgid "" "Wonderful! Now I just need to get an undamaged, complete archive, and we " "can really figure out what happened." -msgstr "" +msgstr "太好了!現在我只需要去出一個沒損傷、完整的檔案,然後我們就可以知道到底發生了甚麼事。" #: lang/json/mission_def_from_json.py msgid "Download Research Archives" @@ -94728,27 +95520,28 @@ msgid "" "everything to subzero temperatures. I bet the archives inside that lab are " "still working." msgstr "" +"那裡的實驗應該進行了多個月,也可能是多年,資料量一定十分巨大。資料庫伺服器的存放量巨大,只靠緊急供電的話一定會過熱的。但我找到來自某個實驗室的通訊,說在大災變的時候開啟了某種冷凍傳送門,將裡面的所有東西降至零下氣溫。我估計在那個實驗室裡的檔案依然在運作中。" #: lang/json/mission_def_from_json.py msgid "" "Great! I've mapped out a route. Bundle up, it gets colder the deeper you " "go and it looks like the archives were on the fourth basement level." -msgstr "" +msgstr "好極了!我記下了路線。記得穿多一點,你走得越深,氣溫越低,而檔案看來就在地底第四層裡。" #: lang/json/mission_def_from_json.py msgid "" "That lab is going to start freezing and just get colder the deeper you go. " "You'll really need special equipment to survive that far down. Bring back " "anything you find on a USB drive." -msgstr "" +msgstr "實驗室已經是冷凍狀態,且你越走得深會越寒冷。你真的需要特殊裝備才能在那裡的深處生存。將你找到的東西放在USB儲存碟後帶回來。" #: lang/json/mission_def_from_json.py msgid "Thanks! This is a lot of data to go through." -msgstr "" +msgstr "謝謝! 這裡是一大堆檔案要處理。" #: lang/json/mission_def_from_json.py msgid "Find Lab Tunnels" -msgstr "" +msgstr "尋找研究所隧道" #: lang/json/mission_def_from_json.py msgid "" @@ -94758,10 +95551,11 @@ msgid "" "there, find the tunnels that they dug, and download everything you can about" " the train network." msgstr "" +"在那些檔案裡,我們找到一個隧道挖掘與列車設備的重要合約,是在很久以前訂下的。那是我們最好的線索。這裡是政府發送設備到目標研究所的地址。我想你去那裡,找出他們挖掘的隧道,然後下載任何有關鐵路網絡的資料。" #: lang/json/mission_def_from_json.py msgid "So glad for your help." -msgstr "" +msgstr "很高興有你幫手。" #: lang/json/mission_def_from_json.py msgid "" @@ -94769,6 +95563,7 @@ msgid "" "going to be deeper inside a lab than a normal subway. Fifty feet would mean" " maybe four stories down. Bring back anything you find on a USB drive." msgstr "" +"設備是計劃用在地底50英尺,所以研究所的隧道入口會比普通的地下鐡路更深。50英尺即是大約四層樓深。將你找到的東西放進USB隨身碟裡然後帶回來。" #: lang/json/mission_def_from_json.py msgid "" @@ -94845,8 +95640,8 @@ msgid "Thank you, I'll do the explaining if anyone else asks about it." msgstr "謝謝你, 若是其他人問起的話, 我會解釋的。" #: lang/json/mission_def_from_json.py -msgid "Kill ???" -msgstr "殺掉???" +msgid "Secure Trade Route" +msgstr "" #: lang/json/mission_def_from_json.py msgid "" @@ -94873,8 +95668,8 @@ msgid "Great work, wasn't sure what I was sending you after." msgstr "做的好, 只是我不知道事後該給你什麼。" #: lang/json/mission_def_from_json.py -msgid "Kill Raider Leader" -msgstr "殺掉掠奪者首領" +msgid "Assassinate Raider Leader" +msgstr "" #: lang/json/mission_def_from_json.py msgid "" @@ -94990,8 +95785,8 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "" -"Remember, do extraction /exactly/ as specified, otherwise the bionic will " -"self-destruct." +"Remember, perform the extraction /exactly/ as specified, otherwise the " +"bionic will self-destruct." msgstr "" #: lang/json/mission_def_from_json.py @@ -95015,6 +95810,37 @@ msgstr "" msgid "You have our thanks and payment." msgstr "" +#: lang/json/mission_def_from_json.py +msgid "Light retrieval" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Our facility once sourced advanced photonic circuitry from a nearby robotics manufacturer. Their building suffered major damage during the portal storms, and collapsed almost entirely. However, preliminary scouting reveals that the basement prototyping lab likely remains intact.\n" +"\n" +"the intercom: We ask you to investigate the ruins, and if possible, retrieve a template for the fabrication of said photonic circuitry." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "We expect your success, mercenary." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Return if you change your mind." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"The scout drone also revealed extensive heat signatures and high " +"concentrations of toxic compounds within the ruins, plan accordingly. We " +"are willing to sell you some protective gear at a discount, if you require " +"it." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Have you retrieved the blueprints?" +msgstr "" + #: lang/json/mission_def_from_json.py msgid "Make 2 Stills" msgstr "製作 2 個蒸餾器" @@ -95430,6 +96256,7 @@ msgid "" " could bring in 6 full kits I'm sure we could supplement them to make them " "last a bit longer." msgstr "" +"我們正在規劃一間醫療診所。不過我們需要更多的物資,才能確保難民中心那邊願意派送其中一位有醫療經驗的人過來前哨。我知道急救箱相當罕見,但它有著我們所缺乏的基本醫療用品。如果你能帶來六個完整的急救箱,我們可以省著用使它們撐久一點。" #: lang/json/mission_def_from_json.py msgid "We'll do our best to make them last..." @@ -96382,7 +97209,7 @@ msgstr "" #: lang/json/morale_type_from_json.py msgid "Accomplishment" -msgstr "" +msgstr "成就" #: lang/json/morale_type_from_json.py src/debug_menu.cpp msgid "Failure" @@ -97771,7 +98598,7 @@ msgstr "你的聽力比一般人好, 能夠輕易聽見遠方的聲音。" #: lang/json/mutation_from_json.py msgid "Fey Hearing" -msgstr "" +msgstr "妖精聽力" #. ~ Description for Fey Hearing #: lang/json/mutation_from_json.py @@ -99557,7 +100384,7 @@ msgid "" "You've grown a chitin exoskeleton, much like that of an insect. It provides" " considerable physical protection, but reduces your Dexterity by 1. " "Somewhat reduces wet effects." -msgstr "" +msgstr "你長出了一層角質的外骨骼,就像昆蟲上的一樣。它提供可觀的物理防護,但會減少你 1 點敏捷。也稍為有一些防水能力。" #: lang/json/mutation_from_json.py msgid "Chitinous Plate" @@ -104340,7 +105167,7 @@ msgstr "" #: lang/json/npc_class_from_json.py msgid "Real Person" -msgstr "" +msgstr "真人" #: lang/json/npc_class_from_json.py msgid "I'm just wandering, like a totally real and normal NP... Person!" @@ -105414,7 +106241,7 @@ msgstr "露營地" #: lang/json/overmap_terrain_from_json.py msgid "campground roof" -msgstr "" +msgstr "露營地屋頂" #: lang/json/overmap_terrain_from_json.py msgid "desolate barn" @@ -105598,7 +106425,11 @@ msgstr "糖果屋" #: lang/json/overmap_terrain_from_json.py msgid "sugar house roof" -msgstr "" +msgstr "糖果屋屋頂" + +#: lang/json/overmap_terrain_from_json.py +msgid "rural road" +msgstr "鄉間小路" #: lang/json/overmap_terrain_from_json.py msgid "farm field" @@ -105610,15 +106441,15 @@ msgstr "農舍" #: lang/json/overmap_terrain_from_json.py msgid "farm house roof" -msgstr "" +msgstr "農舍屋頂" #: lang/json/overmap_terrain_from_json.py msgid "farm barn" -msgstr "" +msgstr "農場穀倉" #: lang/json/overmap_terrain_from_json.py msgid "farm barn roof" -msgstr "" +msgstr "農場穀倉屋頂" #: lang/json/overmap_terrain_from_json.py #: lang/json/start_location_from_json.py @@ -105627,7 +106458,7 @@ msgstr "農場" #: lang/json/overmap_terrain_from_json.py msgid "grape farm" -msgstr "" +msgstr "葡萄園" #: lang/json/overmap_terrain_from_json.py msgid "stills" @@ -105655,71 +106486,71 @@ msgstr "奶牛場" #: lang/json/overmap_terrain_from_json.py msgid "dairy farm roof" -msgstr "" +msgstr "酪農場屋頂" #: lang/json/overmap_terrain_from_json.py msgid "smokehouse" -msgstr "" +msgstr "燻製房" #: lang/json/overmap_terrain_from_json.py msgid "smokehouse roof" -msgstr "" +msgstr "燻製房屋頂" #: lang/json/overmap_terrain_from_json.py msgid "outbuilding" -msgstr "" +msgstr "附屬建築" #: lang/json/overmap_terrain_from_json.py msgid "outbuilding roof" -msgstr "" +msgstr "附屬建築屋頂" #: lang/json/overmap_terrain_from_json.py msgid "farm house cellar" -msgstr "" +msgstr "農舍地窖" #: lang/json/overmap_terrain_from_json.py msgid "farm barn hayloft" -msgstr "" +msgstr "農舍乾草棚" #: lang/json/overmap_terrain_from_json.py msgid "carriage house" -msgstr "" +msgstr "馬車房" #: lang/json/overmap_terrain_from_json.py msgid "carriage house roof" -msgstr "" +msgstr "馬車房屋頂" #: lang/json/overmap_terrain_from_json.py msgid "horse stable" -msgstr "" +msgstr "馬廄" #: lang/json/overmap_terrain_from_json.py msgid "horse stable hayloft" -msgstr "" +msgstr "馬廄乾草棚" #: lang/json/overmap_terrain_from_json.py msgid "horse stable roof" -msgstr "" +msgstr "馬廄屋頂" #: lang/json/overmap_terrain_from_json.py msgid "green house" -msgstr "" +msgstr "溫室" #: lang/json/overmap_terrain_from_json.py msgid "green house roof" -msgstr "" +msgstr " 溫室屋頂" #: lang/json/overmap_terrain_from_json.py msgid "chicken coop" -msgstr "" +msgstr "雞舍" #: lang/json/overmap_terrain_from_json.py msgid "chicken coop roof" -msgstr "" +msgstr "雞舍屋頂" #: lang/json/overmap_terrain_from_json.py msgid "farm house 2nd floor" -msgstr "" +msgstr "農舍二樓" #: lang/json/overmap_terrain_from_json.py msgid "small cemetery" @@ -105731,7 +106562,7 @@ msgstr "私釀酒廠" #: lang/json/overmap_terrain_from_json.py msgid "moonshine still roof" -msgstr "" +msgstr "私釀酒廠屋頂" #: lang/json/overmap_terrain_from_json.py msgid "tree farm" @@ -105743,11 +106574,11 @@ msgstr "泥土路" #: lang/json/overmap_terrain_from_json.py msgid "silos" -msgstr "" +msgstr "筒倉" #: lang/json/overmap_terrain_from_json.py msgid "yard" -msgstr "" +msgstr "庭院" #: lang/json/overmap_terrain_from_json.py msgid "rural house" @@ -105755,47 +106586,47 @@ msgstr "農村的房子" #: lang/json/overmap_terrain_from_json.py msgid "rural house roof" -msgstr "" +msgstr "農村房子屋頂" #: lang/json/overmap_terrain_from_json.py msgid "campus admin building" -msgstr "" +msgstr "校區管理大樓" #: lang/json/overmap_terrain_from_json.py msgid "campus admin building roof" -msgstr "" +msgstr "校區管理大樓屋頂" #: lang/json/overmap_terrain_from_json.py msgid "campus commons building" -msgstr "" +msgstr "校區餐廳" #: lang/json/overmap_terrain_from_json.py msgid "campus commons roof" -msgstr "" +msgstr "校區餐廳大樓" #: lang/json/overmap_terrain_from_json.py msgid "campus media building" -msgstr "" +msgstr "校區媒體大樓" #: lang/json/overmap_terrain_from_json.py msgid "campus media building roof" -msgstr "" +msgstr "校區媒體大樓屋頂" #: lang/json/overmap_terrain_from_json.py msgid "campus health building" -msgstr "" +msgstr "校區衛生大樓" #: lang/json/overmap_terrain_from_json.py msgid "campus health building roof" -msgstr "" +msgstr "校區衛生大樓屋頂" #: lang/json/overmap_terrain_from_json.py msgid "campus lecture hall" -msgstr "" +msgstr "校區演講廳" #: lang/json/overmap_terrain_from_json.py msgid "campus lecture hall roof" -msgstr "" +msgstr "校區演講廳屋頂" #: lang/json/overmap_terrain_from_json.py msgid "gas station" @@ -105803,7 +106634,7 @@ msgstr "加油站" #: lang/json/overmap_terrain_from_json.py msgid "gas station roof" -msgstr "" +msgstr "加油站屋頂" #: lang/json/overmap_terrain_from_json.py msgid "pharmacy" @@ -105811,7 +106642,7 @@ msgstr "藥局" #: lang/json/overmap_terrain_from_json.py msgid "pharmacy roof" -msgstr "" +msgstr "藥局屋頂" #: lang/json/overmap_terrain_from_json.py msgid "doctor's office" @@ -105819,7 +106650,7 @@ msgstr "診所" #: lang/json/overmap_terrain_from_json.py msgid "doctor's office roof" -msgstr "" +msgstr "診所屋頂" #: lang/json/overmap_terrain_from_json.py msgid "office" @@ -105827,7 +106658,7 @@ msgstr "辦公室" #: lang/json/overmap_terrain_from_json.py msgid "office roof" -msgstr "" +msgstr "辦公室屋頂" #: lang/json/overmap_terrain_from_json.py msgid "office tower" @@ -105843,7 +106674,7 @@ msgstr "辦公室庭院" #: lang/json/overmap_terrain_from_json.py msgid "collapsed tower" -msgstr "" +msgstr "倒榻的塔" #: lang/json/overmap_terrain_from_json.py msgid "grocery store" @@ -105851,7 +106682,7 @@ msgstr "雜貨店" #: lang/json/overmap_terrain_from_json.py msgid "grocery store roof" -msgstr "" +msgstr "雜貨店屋頂" #: lang/json/overmap_terrain_from_json.py msgid "hardware store" @@ -105859,7 +106690,7 @@ msgstr "五金行" #: lang/json/overmap_terrain_from_json.py msgid "hardware store roof" -msgstr "" +msgstr "五金行屋頂" #: lang/json/overmap_terrain_from_json.py msgid "electronics store" @@ -105867,7 +106698,7 @@ msgstr "電子商店" #: lang/json/overmap_terrain_from_json.py msgid "electronics store roof" -msgstr "" +msgstr "電子商店屋頂" #: lang/json/overmap_terrain_from_json.py msgid "sporting goods store" @@ -105875,7 +106706,7 @@ msgstr "運動用品店" #: lang/json/overmap_terrain_from_json.py msgid "sporting goods store roof" -msgstr "" +msgstr "運動用品店屋頂" #: lang/json/overmap_terrain_from_json.py msgid "liquor store" @@ -105883,7 +106714,7 @@ msgstr "酒類專賣店" #: lang/json/overmap_terrain_from_json.py msgid "liquor store roof" -msgstr "" +msgstr "酒類專賣店屋頂" #: lang/json/overmap_terrain_from_json.py msgid "gun store" @@ -105891,11 +106722,11 @@ msgstr "槍械商店" #: lang/json/overmap_terrain_from_json.py msgid "gun store roof" -msgstr "" +msgstr "槍械商店屋頂" #: lang/json/overmap_terrain_from_json.py msgid "gun store 2nd floor" -msgstr "" +msgstr "槍械商店二樓" #: lang/json/overmap_terrain_from_json.py msgid "clothing store" @@ -105903,7 +106734,7 @@ msgstr "服飾店" #: lang/json/overmap_terrain_from_json.py msgid "clothing store roof" -msgstr "" +msgstr "服飾店屋頂" #: lang/json/overmap_terrain_from_json.py msgid "bookstore" @@ -105911,7 +106742,7 @@ msgstr "書店" #: lang/json/overmap_terrain_from_json.py msgid "bookstore roof" -msgstr "" +msgstr "書店屋頂" #: lang/json/overmap_terrain_from_json.py msgid "restaurant" @@ -105919,7 +106750,7 @@ msgstr "餐廳" #: lang/json/overmap_terrain_from_json.py msgid "restaurant roof" -msgstr "" +msgstr "餐廳屋頂" #: lang/json/overmap_terrain_from_json.py msgid "fast food restaurant" @@ -105927,7 +106758,7 @@ msgstr "速食店" #: lang/json/overmap_terrain_from_json.py msgid "fast food restaurant roof" -msgstr "" +msgstr "速食店屋頂" #: lang/json/overmap_terrain_from_json.py msgid "coffee shop" @@ -105939,7 +106770,7 @@ msgstr "茶館" #: lang/json/overmap_terrain_from_json.py msgid "teashop roof" -msgstr "" +msgstr "茶館屋頂" #: lang/json/overmap_terrain_from_json.py msgid "bar" @@ -105947,7 +106778,7 @@ msgstr "酒吧" #: lang/json/overmap_terrain_from_json.py msgid "bar roof" -msgstr "" +msgstr "酒吧屋頂" #: lang/json/overmap_terrain_from_json.py msgid "butcher shop" @@ -105955,7 +106786,7 @@ msgstr "肉店" #: lang/json/overmap_terrain_from_json.py msgid "butcher shop roof" -msgstr "" +msgstr "肉店屋頂" #: lang/json/overmap_terrain_from_json.py msgid "bike shop" @@ -105963,7 +106794,7 @@ msgstr "自行車商店" #: lang/json/overmap_terrain_from_json.py msgid "bike shop roof" -msgstr "" +msgstr "自行車商店屋頂" #: lang/json/overmap_terrain_from_json.py msgid "pizza parlor" @@ -105971,7 +106802,7 @@ msgstr "披薩店" #: lang/json/overmap_terrain_from_json.py msgid "pizza parlor roof" -msgstr "" +msgstr "披薩店屋頂" #: lang/json/overmap_terrain_from_json.py msgid "bank" @@ -105979,7 +106810,7 @@ msgstr "銀行" #: lang/json/overmap_terrain_from_json.py msgid "bank roof" -msgstr "" +msgstr "銀行屋頂" #: lang/json/overmap_terrain_from_json.py msgid "pawn shop" @@ -105987,7 +106818,7 @@ msgstr "當舖" #: lang/json/overmap_terrain_from_json.py msgid "pawn shop roof" -msgstr "" +msgstr "當鋪屋頂" #: lang/json/overmap_terrain_from_json.py msgid "mil. surplus" @@ -105995,7 +106826,7 @@ msgstr "軍用倉庫" #: lang/json/overmap_terrain_from_json.py msgid "mil. surplus roof" -msgstr "" +msgstr "軍用倉庫屋頂" #: lang/json/overmap_terrain_from_json.py msgid "furniture store" @@ -106003,7 +106834,7 @@ msgstr "家具行" #: lang/json/overmap_terrain_from_json.py msgid "furniture store roof" -msgstr "" +msgstr "家具行屋頂" #: lang/json/overmap_terrain_from_json.py msgid "music store" @@ -106011,7 +106842,7 @@ msgstr "樂器店" #: lang/json/overmap_terrain_from_json.py msgid "music store roof" -msgstr "" +msgstr "樂器店屋頂" #: lang/json/overmap_terrain_from_json.py msgid "megastore" @@ -106039,7 +106870,7 @@ msgstr "汽車旅館" #: lang/json/overmap_terrain_from_json.py msgid "motel roof" -msgstr "" +msgstr "汽車旅館屋頂" #: lang/json/overmap_terrain_from_json.py msgid "home improvement superstore entrance" @@ -106055,7 +106886,7 @@ msgstr "車庫 - 加油站" #: lang/json/overmap_terrain_from_json.py msgid "garage - gas station roof" -msgstr "" +msgstr "汽車修理廠 - 加油站屋頂" #: lang/json/overmap_terrain_from_json.py msgid "dispensary" @@ -106063,7 +106894,7 @@ msgstr "診療所" #: lang/json/overmap_terrain_from_json.py msgid "dispensary roof" -msgstr "" +msgstr "診療所屋頂" #: lang/json/overmap_terrain_from_json.py msgid "small office" @@ -106071,7 +106902,7 @@ msgstr "小型辦公室" #: lang/json/overmap_terrain_from_json.py msgid "small office roof" -msgstr "" +msgstr "小型辦公室屋頂" #: lang/json/overmap_terrain_from_json.py msgid "candy shop" @@ -106079,7 +106910,7 @@ msgstr "糖果店" #: lang/json/overmap_terrain_from_json.py msgid "candy shop roof" -msgstr "" +msgstr "糖果店屋頂" #: lang/json/overmap_terrain_from_json.py msgid "bakery" @@ -106087,7 +106918,7 @@ msgstr "烘焙坊" #: lang/json/overmap_terrain_from_json.py msgid "bakery roof" -msgstr "" +msgstr "烘焙坊屋頂" #: lang/json/overmap_terrain_from_json.py msgid "icecream shop" @@ -106095,7 +106926,7 @@ msgstr "冰淇淋店" #: lang/json/overmap_terrain_from_json.py msgid "icecream shop roof" -msgstr "" +msgstr "冰淇淋店屋頂" #: lang/json/overmap_terrain_from_json.py msgid "dollar store" @@ -106103,7 +106934,7 @@ msgstr "十元商店" #: lang/json/overmap_terrain_from_json.py msgid "dollar store roof" -msgstr "" +msgstr "十元商店屋頂" #: lang/json/overmap_terrain_from_json.py msgid "LAN center" @@ -106111,7 +106942,7 @@ msgstr "區網中心" #: lang/json/overmap_terrain_from_json.py msgid "LAN center roof" -msgstr "" +msgstr "區網中心屋頂" #: lang/json/overmap_terrain_from_json.py msgid "landscaping supply co" @@ -106119,7 +106950,7 @@ msgstr "園林綠化公司" #: lang/json/overmap_terrain_from_json.py msgid "landscaping supply co roof" -msgstr "" +msgstr "園林綠化公司屋頂" #: lang/json/overmap_terrain_from_json.py msgid "veterans of foreign wars" @@ -106127,7 +106958,7 @@ msgstr "海外作戰退伍軍人協會" #: lang/json/overmap_terrain_from_json.py msgid "veterans of foreign wars center roof" -msgstr "" +msgstr "海外作戰退伍軍人協會屋頂" #: lang/json/overmap_terrain_from_json.py msgid "thrift store" @@ -106135,7 +106966,7 @@ msgstr "舊貨店" #: lang/json/overmap_terrain_from_json.py msgid "thrift store roof" -msgstr "" +msgstr "舊貨店屋頂" #: lang/json/overmap_terrain_from_json.py msgid "daycare center" @@ -106143,7 +106974,7 @@ msgstr "托兒所" #: lang/json/overmap_terrain_from_json.py msgid "daycare center roof" -msgstr "" +msgstr "托兒所屋頂" #: lang/json/overmap_terrain_from_json.py msgid "pet supply store" @@ -106151,7 +106982,7 @@ msgstr "寵物用品店" #: lang/json/overmap_terrain_from_json.py msgid "pet supply store roof" -msgstr "" +msgstr "寵物用品店屋頂" #: lang/json/overmap_terrain_from_json.py msgid "abandoned shopping plaza" @@ -106163,7 +106994,7 @@ msgstr "獸醫診所" #: lang/json/overmap_terrain_from_json.py msgid "veterinarian clinic roof" -msgstr "" +msgstr "獸醫診所屋頂" #: lang/json/overmap_terrain_from_json.py msgid "laundromat" @@ -106171,7 +107002,7 @@ msgstr "自助洗衣房" #: lang/json/overmap_terrain_from_json.py msgid "laundromat roof" -msgstr "" +msgstr "自助洗衣店屋頂" #: lang/json/overmap_terrain_from_json.py msgid "jewelry store" @@ -106179,7 +107010,7 @@ msgstr "珠寶店" #: lang/json/overmap_terrain_from_json.py msgid "jewelry store roof" -msgstr "" +msgstr "珠寶店屋頂" #: lang/json/overmap_terrain_from_json.py msgid "2-story motel" @@ -106195,7 +107026,7 @@ msgstr "家具裝飾店" #: lang/json/overmap_terrain_from_json.py msgid "home improvement store roof" -msgstr "" +msgstr "居家裝潢店屋頂" #: lang/json/overmap_terrain_from_json.py msgid "antique store" @@ -106203,7 +107034,7 @@ msgstr "古董店" #: lang/json/overmap_terrain_from_json.py msgid "antique store roof" -msgstr "" +msgstr "古董店屋頂" #: lang/json/overmap_terrain_from_json.py msgid "arcade" @@ -106211,7 +107042,7 @@ msgstr "電動間" #: lang/json/overmap_terrain_from_json.py msgid "arcade roof" -msgstr "" +msgstr "電動間屋頂" #: lang/json/overmap_terrain_from_json.py msgid "gardening supply" @@ -106219,7 +107050,7 @@ msgstr "園藝品店" #: lang/json/overmap_terrain_from_json.py msgid "gardening supply roof" -msgstr "" +msgstr "園藝品店屋頂" #: lang/json/overmap_terrain_from_json.py msgid "craft shop" @@ -106227,11 +107058,11 @@ msgstr "手工商店" #: lang/json/overmap_terrain_from_json.py msgid "craft shop roof" -msgstr "" +msgstr "工藝品店屋頂" #: lang/json/overmap_terrain_from_json.py msgid "craft shop upper roof" -msgstr "" +msgstr "工藝品店上層屋頂" #: lang/json/overmap_terrain_from_json.py msgid "craft shop 2nd floor" @@ -106239,15 +107070,15 @@ msgstr "手工商店 2/F" #: lang/json/overmap_terrain_from_json.py msgid "small market" -msgstr "" +msgstr "小型市場" #: lang/json/overmap_terrain_from_json.py msgid "sex shop" -msgstr "" +msgstr "性商店" #: lang/json/overmap_terrain_from_json.py msgid "sex shop roof" -msgstr "" +msgstr "情趣用品店屋頂" #: lang/json/overmap_terrain_from_json.py msgid "internet cafe" @@ -106255,23 +107086,23 @@ msgstr "網啡" #: lang/json/overmap_terrain_from_json.py msgid "internet cafe roof" -msgstr "" +msgstr "網咖屋頂" #: lang/json/overmap_terrain_from_json.py msgid "car showroom" -msgstr "" +msgstr "汽車展廳" #: lang/json/overmap_terrain_from_json.py msgid "car showroom 2nd floor" -msgstr "" +msgstr "汽車展廳二樓" #: lang/json/overmap_terrain_from_json.py msgid "car showroom roof" -msgstr "" +msgstr "汽車展廳屋頂" #: lang/json/overmap_terrain_from_json.py msgid "car dealership" -msgstr "" +msgstr "汽車經銷商" #: lang/json/overmap_terrain_from_json.py msgid "tire shop" @@ -106279,7 +107110,7 @@ msgstr "輪胎商店" #: lang/json/overmap_terrain_from_json.py msgid "tire shop roof" -msgstr "" +msgstr "輪胎商店屋頂" #: lang/json/overmap_terrain_from_json.py msgid "Head Shop" @@ -106287,7 +107118,7 @@ msgstr "大麻專賣店" #: lang/json/overmap_terrain_from_json.py msgid "head shop roof" -msgstr "" +msgstr "大麻專賣店屋頂" #: lang/json/overmap_terrain_from_json.py msgid "abandoned storefront" @@ -106295,7 +107126,7 @@ msgstr "廢棄店面" #: lang/json/overmap_terrain_from_json.py msgid "abandoned storefront roof" -msgstr "" +msgstr "廢棄店面屋頂" #: lang/json/overmap_terrain_from_json.py msgid "radio station" @@ -106303,15 +107134,15 @@ msgstr "無線電站" #: lang/json/overmap_terrain_from_json.py msgid "radio station roof" -msgstr "" +msgstr "廣播電台屋頂" #: lang/json/overmap_terrain_from_json.py msgid "gardening allotment" -msgstr "" +msgstr "社區農圃" #: lang/json/overmap_terrain_from_json.py msgid "gardening allotment roof" -msgstr "" +msgstr "社區農圃屋頂" #: lang/json/overmap_terrain_from_json.py msgid "animal pound" @@ -106319,7 +107150,7 @@ msgstr "動物拘留所" #: lang/json/overmap_terrain_from_json.py msgid "animal pound roof" -msgstr "" +msgstr "動物拘留所屋頂" #: lang/json/overmap_terrain_from_json.py msgid "animal shelter" @@ -106327,7 +107158,7 @@ msgstr "動物收容所" #: lang/json/overmap_terrain_from_json.py msgid "animal shelter roof" -msgstr "" +msgstr "動物收容所屋頂" #: lang/json/overmap_terrain_from_json.py msgid "empty commercial lot" @@ -106335,11 +107166,11 @@ msgstr "閒置的商業地段" #: lang/json/overmap_terrain_from_json.py msgid "hunting supply store" -msgstr "" +msgstr "狩獵用品店" #: lang/json/overmap_terrain_from_json.py msgid "hunting supply store roof" -msgstr "" +msgstr "狩獵用品店屋頂" #: lang/json/overmap_terrain_from_json.py msgid "road" @@ -106363,15 +107194,15 @@ msgstr "倖存者基地" #: lang/json/overmap_terrain_from_json.py msgid "farm survey" -msgstr "" +msgstr "農地選址" #: lang/json/overmap_terrain_from_json.py msgid "garage survey" -msgstr "" +msgstr "汽車修理廠選址" #: lang/json/overmap_terrain_from_json.py msgid "kitchen survey" -msgstr "" +msgstr "廚房選址" #: lang/json/overmap_terrain_from_json.py msgid "kitchen" @@ -106391,7 +107222,7 @@ msgstr "尖刺壕" #: lang/json/overmap_terrain_from_json.py msgid "blacksmith survey" -msgstr "" +msgstr "鐵匠鋪選址" #: lang/json/overmap_terrain_from_json.py msgid "blacksmith shop" @@ -106503,7 +107334,7 @@ msgstr "公共工程處" #: lang/json/overmap_terrain_from_json.py msgid "public works roof" -msgstr "" +msgstr "公共工程處屋頂" #: lang/json/overmap_terrain_from_json.py msgid "serving area interface" @@ -106515,7 +107346,7 @@ msgstr "小型變電所" #: lang/json/overmap_terrain_from_json.py msgid "small power substation roof" -msgstr "" +msgstr "小型變電所屋頂" #: lang/json/overmap_terrain_from_json.py msgid "large power substation" @@ -106523,7 +107354,7 @@ msgstr "大型變電所" #: lang/json/overmap_terrain_from_json.py msgid "large power substation roof" -msgstr "" +msgstr "大型變電所屋頂" #: lang/json/overmap_terrain_from_json.py msgid "small warehouse" @@ -106531,7 +107362,7 @@ msgstr "小型倉庫" #: lang/json/overmap_terrain_from_json.py msgid "small warehouse roof" -msgstr "" +msgstr "小型倉庫屋頂" #: lang/json/overmap_terrain_from_json.py msgid "small storage units" @@ -106539,7 +107370,7 @@ msgstr "小型貯藏庫" #: lang/json/overmap_terrain_from_json.py msgid "small storage units roof" -msgstr "" +msgstr "小型貯藏庫屋頂" #: lang/json/overmap_terrain_from_json.py msgid "lumberyard" @@ -106551,7 +107382,7 @@ msgstr "伐木廠" #: lang/json/overmap_terrain_from_json.py msgid "lumbermill roof" -msgstr "" +msgstr "伐木廠屋頂" #: lang/json/overmap_terrain_from_json.py msgid "construction site" @@ -106563,7 +107394,7 @@ msgstr "廢棄的倉庫" #: lang/json/overmap_terrain_from_json.py msgid "abandoned warehouse roof" -msgstr "" +msgstr "廢棄的倉庫屋頂" #: lang/json/overmap_terrain_from_json.py msgid "storage units" @@ -106571,7 +107402,7 @@ msgstr "倉儲庫房" #: lang/json/overmap_terrain_from_json.py msgid "storage units roof" -msgstr "" +msgstr "倉儲庫房屋頂" #: lang/json/overmap_terrain_from_json.py msgid "science lab" @@ -106599,31 +107430,31 @@ msgstr "中心實驗室" #: lang/json/overmap_terrain_from_json.py msgid "lab basement" -msgstr "" +msgstr "實驗室地下室" #: lang/json/overmap_terrain_from_json.py msgid "research facility" -msgstr "" +msgstr "研究中心" #: lang/json/overmap_terrain_from_json.py msgid "research facility entrance" -msgstr "" +msgstr "研究中心入口" #: lang/json/overmap_terrain_from_json.py msgid "research facility, second floor" -msgstr "" +msgstr "研究中心,二樓" #: lang/json/overmap_terrain_from_json.py msgid "research facility, third floor" -msgstr "" +msgstr "研究中心,三樓" #: lang/json/overmap_terrain_from_json.py msgid "research facility, fourth floor" -msgstr "" +msgstr "研究中心,四樓" #: lang/json/overmap_terrain_from_json.py msgid "research facility, roof" -msgstr "" +msgstr "研究中心,屋頂" #: lang/json/overmap_terrain_from_json.py msgid "mall" @@ -106635,7 +107466,7 @@ msgstr "購物中心 - 卸貨區" #: lang/json/overmap_terrain_from_json.py msgid "mall - loading bay roof" -msgstr "" +msgstr "購物中心 - 卸貨區屋頂" #: lang/json/overmap_terrain_from_json.py msgid "mall - utilities" @@ -106643,7 +107474,7 @@ msgstr "購物中心-工具" #: lang/json/overmap_terrain_from_json.py msgid "mall - utilities roof" -msgstr "" +msgstr "購物中心 - 工具區屋頂" #: lang/json/overmap_terrain_from_json.py msgid "lot" @@ -106655,7 +107486,7 @@ msgstr "購物中心-入口區" #: lang/json/overmap_terrain_from_json.py msgid "mall - food court roof" -msgstr "" +msgstr "購物中心 - 美食區屋頂" #: lang/json/overmap_terrain_from_json.py msgid "mall - food court" @@ -106687,7 +107518,7 @@ msgstr "避難所" #: lang/json/overmap_terrain_from_json.py msgid "evac shelter roof" -msgstr "" +msgstr "避難所屋頂" #: lang/json/overmap_terrain_from_json.py #: lang/json/start_location_from_json.py @@ -106708,15 +107539,15 @@ msgstr "導彈發射井" #: lang/json/overmap_terrain_from_json.py msgid "fire lookout tower" -msgstr "" +msgstr "消防瞭望塔" #: lang/json/overmap_terrain_from_json.py msgid "survivor's bunker" -msgstr "" +msgstr "倖存者的地堡" #: lang/json/overmap_terrain_from_json.py msgid "survivor's camp" -msgstr "" +msgstr "倖存者的營地" #: lang/json/overmap_terrain_from_json.py lang/json/snippet_from_json.py msgid "house" @@ -106880,11 +107711,11 @@ msgstr "避難所 - 健身房" #: lang/json/overmap_terrain_from_json.py msgid "church roof" -msgstr "" +msgstr "教堂屋頂" #: lang/json/overmap_terrain_from_json.py msgid "church steeple" -msgstr "" +msgstr "教堂的尖頂" #: lang/json/overmap_terrain_from_json.py msgid "cathedral" @@ -106900,15 +107731,15 @@ msgstr "圖書館" #: lang/json/overmap_terrain_from_json.py msgid "library roof" -msgstr "" +msgstr "圖書館屋頂" #: lang/json/overmap_terrain_from_json.py msgid "police station roof" -msgstr "" +msgstr "警察局屋頂" #: lang/json/overmap_terrain_from_json.py msgid "police station 2nd floor" -msgstr "" +msgstr "警察局二樓" #: lang/json/overmap_terrain_from_json.py msgid "hospital" @@ -106928,7 +107759,7 @@ msgstr "郵局" #: lang/json/overmap_terrain_from_json.py msgid "post office roof" -msgstr "" +msgstr "郵局屋頂" #: lang/json/overmap_terrain_from_json.py msgid "mortuary" @@ -106936,7 +107767,7 @@ msgstr "停屍間" #: lang/json/overmap_terrain_from_json.py msgid "mortuary roof" -msgstr "" +msgstr "停屍間屋頂" #: lang/json/overmap_terrain_from_json.py msgid "fire station" @@ -106944,15 +107775,15 @@ msgstr "消防局" #: lang/json/overmap_terrain_from_json.py msgid "fire station roof" -msgstr "" +msgstr "消防局屋頂" #: lang/json/overmap_terrain_from_json.py msgid "homeless shelter" -msgstr "" +msgstr "街友避難所" #: lang/json/overmap_terrain_from_json.py msgid "town hall" -msgstr "" +msgstr "市政廳" #: lang/json/overmap_terrain_from_json.py msgid "silo" @@ -106960,11 +107791,11 @@ msgstr "穀倉" #: lang/json/overmap_terrain_from_json.py msgid "silo cap" -msgstr "" +msgstr "筒倉頂蓋" #: lang/json/overmap_terrain_from_json.py msgid "barn roof" -msgstr "" +msgstr "穀倉屋頂" #: lang/json/overmap_terrain_from_json.py msgid "ranch" @@ -106972,7 +107803,7 @@ msgstr "牧場" #: lang/json/overmap_terrain_from_json.py msgid "ranch roof" -msgstr "" +msgstr "牧場屋頂" #: lang/json/overmap_terrain_from_json.py msgid "pool" @@ -106980,7 +107811,7 @@ msgstr "游泳池" #: lang/json/overmap_terrain_from_json.py msgid "pool roof" -msgstr "" +msgstr "泳池屋頂" #: lang/json/overmap_terrain_from_json.py msgid "football field" @@ -106992,7 +107823,7 @@ msgstr "美術館" #: lang/json/overmap_terrain_from_json.py msgid "art gallery roof" -msgstr "" +msgstr "藝廊屋頂" #: lang/json/overmap_terrain_from_json.py msgid "state park" @@ -107020,7 +107851,7 @@ msgstr "涼亭" #: lang/json/overmap_terrain_from_json.py msgid "pavilion roof" -msgstr "" +msgstr "涼亭屋頂" #: lang/json/overmap_terrain_from_json.py msgid "hunting blind" @@ -107052,7 +107883,7 @@ msgstr "靶場" #: lang/json/overmap_terrain_from_json.py msgid "shooting range roof" -msgstr "" +msgstr "靶場屋頂" #: lang/json/overmap_terrain_from_json.py msgid "golf course" @@ -107068,11 +107899,11 @@ msgstr "高爾夫球場服務大樓" #: lang/json/overmap_terrain_from_json.py msgid "golf course bar" -msgstr "" +msgstr "高爾夫球場屋頂" #: lang/json/overmap_terrain_from_json.py msgid "golf course service building roof" -msgstr "" +msgstr "高爾夫球場服務大樓屋頂" #: lang/json/overmap_terrain_from_json.py msgid "baseball field" @@ -107092,7 +107923,7 @@ msgstr "動物園" #: lang/json/overmap_terrain_from_json.py msgid "zoo roof" -msgstr "" +msgstr "動物園屋頂" #: lang/json/overmap_terrain_from_json.py msgid "stadium parking" @@ -107136,7 +107967,7 @@ msgstr "漆彈射擊場" #: lang/json/overmap_terrain_from_json.py msgid "paintball field roof" -msgstr "" +msgstr "漆彈射擊場屋頂" #: lang/json/overmap_terrain_from_json.py msgid "smoking lounge" @@ -107144,7 +107975,7 @@ msgstr "吸菸室" #: lang/json/overmap_terrain_from_json.py msgid "smoking lounge roof" -msgstr "" +msgstr "吸菸室屋頂" #: lang/json/overmap_terrain_from_json.py msgid "music venue" @@ -107152,7 +107983,7 @@ msgstr "音樂廳" #: lang/json/overmap_terrain_from_json.py msgid "music venue roof" -msgstr "" +msgstr "音樂廳屋頂" #: lang/json/overmap_terrain_from_json.py msgid "gambling hall" @@ -107160,7 +107991,7 @@ msgstr "賭場大廳" #: lang/json/overmap_terrain_from_json.py msgid "gambling hall roof" -msgstr "" +msgstr "賭場大廳屋頂" #: lang/json/overmap_terrain_from_json.py msgid "strip club" @@ -107168,7 +107999,7 @@ msgstr "脫衣舞俱樂部" #: lang/json/overmap_terrain_from_json.py msgid "strip club roof" -msgstr "" +msgstr "脫衣舞俱樂部屋頂" #: lang/json/overmap_terrain_from_json.py msgid "museum" @@ -107176,7 +108007,7 @@ msgstr "博物館" #: lang/json/overmap_terrain_from_json.py msgid "museum roof" -msgstr "" +msgstr "博物館屋頂" #: lang/json/overmap_terrain_from_json.py msgid "bowling alley" @@ -107184,7 +108015,7 @@ msgstr "保齡球館" #: lang/json/overmap_terrain_from_json.py msgid "bowling alley roof" -msgstr "" +msgstr "保齡球館屋頂" #: lang/json/overmap_terrain_from_json.py msgid "boxing gym" @@ -107192,7 +108023,7 @@ msgstr "拳擊健身房" #: lang/json/overmap_terrain_from_json.py msgid "boxing gym roof" -msgstr "" +msgstr "拳擊健身房屋頂" #: lang/json/overmap_terrain_from_json.py msgid "fitness gym" @@ -107200,7 +108031,7 @@ msgstr "健身房" #: lang/json/overmap_terrain_from_json.py msgid "fitness gym roof" -msgstr "" +msgstr "健身房屋頂" #: lang/json/overmap_terrain_from_json.py msgid "dojo" @@ -107208,7 +108039,7 @@ msgstr "道場" #: lang/json/overmap_terrain_from_json.py msgid "dojo roof" -msgstr "" +msgstr "道場屋頂" #: lang/json/overmap_terrain_from_json.py msgid "private park" @@ -107216,11 +108047,11 @@ msgstr "私人公園" #: lang/json/overmap_terrain_from_json.py msgid "private park roof" -msgstr "" +msgstr "私人園林屋頂" #: lang/json/overmap_terrain_from_json.py msgid "public art piece" -msgstr "" +msgstr "公共藝術作品" #: lang/json/overmap_terrain_from_json.py #: lang/json/overmap_terrain_from_json.py lang/json/terrain_from_json.py @@ -107229,11 +108060,11 @@ msgstr "碼頭" #: lang/json/overmap_terrain_from_json.py msgid "marina" -msgstr "" +msgstr "碼頭" #: lang/json/overmap_terrain_from_json.py msgid "marina parking" -msgstr "" +msgstr "碼頭停車場" #: lang/json/overmap_terrain_from_json.py msgid "duplex" @@ -107253,7 +108084,7 @@ msgstr "旅行拖車園區" #: lang/json/overmap_terrain_from_json.py msgid "trailer park roof" -msgstr "" +msgstr "旅行拖車園區屋頂" #: lang/json/overmap_terrain_from_json.py msgid "empty residential lot" @@ -107273,11 +108104,11 @@ msgstr "河岸" #: lang/json/overmap_terrain_from_json.py msgid "hub 01" -msgstr "" +msgstr "1 號基地" #: lang/json/overmap_terrain_from_json.py msgid "hub 01 parking space" -msgstr "" +msgstr "1 號基地停車區" #: lang/json/overmap_terrain_from_json.py msgid "highway" @@ -107297,7 +108128,7 @@ msgstr "路邊小吃店" #: lang/json/overmap_terrain_from_json.py msgid "roadstop roof" -msgstr "" +msgstr "路邊小吃店屋頂" #: lang/json/overmap_terrain_from_json.py msgid "public washroom" @@ -107305,7 +108136,7 @@ msgstr "公廁" #: lang/json/overmap_terrain_from_json.py msgid "public washroom roof" -msgstr "" +msgstr "公廁屋頂" #: lang/json/overmap_terrain_from_json.py msgid "roadside foodcart" @@ -107313,19 +108144,19 @@ msgstr "路邊攤" #: lang/json/overmap_terrain_from_json.py msgid "roadside foodcart roof" -msgstr "" +msgstr "路邊攤屋頂" #: lang/json/overmap_terrain_from_json.py msgid "railroad" -msgstr "" +msgstr "鐵路" #: lang/json/overmap_terrain_from_json.py msgid "railroad bridge" -msgstr "" +msgstr "鐵路橋" #: lang/json/overmap_terrain_from_json.py msgid "railroad level crossing" -msgstr "" +msgstr "鐵路平交道" #: lang/json/overmap_terrain_from_json.py msgid "railroad station" @@ -107337,11 +108168,11 @@ msgstr "火車站停車場" #: lang/json/overmap_terrain_from_json.py msgid "forest trail" -msgstr "" +msgstr "自然步行徑" #: lang/json/overmap_terrain_from_json.py msgid "trailhead" -msgstr "" +msgstr "步行徑入口" #: lang/json/overmap_terrain_from_json.py msgid "subway station" @@ -107349,7 +108180,7 @@ msgstr "地下鐵" #: lang/json/overmap_terrain_from_json.py msgid "subway station roof" -msgstr "" +msgstr "地下鐵屋頂" #: lang/json/overmap_terrain_from_json.py msgid "subway station (sewer level)" @@ -107369,7 +108200,7 @@ msgstr "休息區" #: lang/json/overmap_terrain_from_json.py msgid "rest area roof" -msgstr "" +msgstr "休息區屋頂" #: lang/json/overmap_terrain_from_json.py msgid "rest area parking" @@ -107377,11 +108208,11 @@ msgstr "休息區停車場" #: lang/json/overmap_terrain_from_json.py msgid "control tower" -msgstr "" +msgstr "塔台" #: lang/json/overmap_terrain_from_json.py msgid "control tower roof" -msgstr "" +msgstr "塔台屋頂" #: lang/json/overmap_terrain_from_json.py msgid "runway" @@ -107389,43 +108220,51 @@ msgstr "跑道" #: lang/json/overmap_terrain_from_json.py msgid "fuel station" -msgstr "" +msgstr "加油站" #: lang/json/overmap_terrain_from_json.py msgid "fuel station roof" -msgstr "" +msgstr "加油站屋頂" #: lang/json/overmap_terrain_from_json.py msgid "small hangar" -msgstr "" +msgstr "小型機庫" #: lang/json/overmap_terrain_from_json.py msgid "small hangar roof" -msgstr "" +msgstr "小型機庫屋頂" #: lang/json/overmap_terrain_from_json.py msgid "waiting area" -msgstr "" +msgstr "等候區" #: lang/json/overmap_terrain_from_json.py msgid "waiting area roof" -msgstr "" +msgstr "等候區屋頂" #: lang/json/overmap_terrain_from_json.py msgid "bus station" -msgstr "" +msgstr "公車站" #: lang/json/overmap_terrain_from_json.py msgid "bus station roof" -msgstr "" +msgstr "公車站屋頂" #: lang/json/overmap_terrain_from_json.py msgid "parking garage" msgstr "停車庫" #: lang/json/overmap_terrain_from_json.py -msgid "sewage treatment" -msgstr "污水處理" +msgid "sewage treatment plant" +msgstr "污水處理廠" + +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment plant roof" +msgstr "污水處理廠屋頂" + +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment plant - underground" +msgstr "污水處理廠 - 地下" #: lang/json/overmap_terrain_from_json.py msgid "toxic waste dump" @@ -107437,7 +108276,7 @@ msgstr "危險廢料石棺" #: lang/json/overmap_terrain_from_json.py msgid "pump station roof" -msgstr "" +msgstr "抽水站屋頂" #: lang/json/overmap_terrain_from_json.py msgid "dumpsite" @@ -107453,7 +108292,7 @@ msgstr "回收中心" #: lang/json/overmap_terrain_from_json.py msgid "recycle center roof" -msgstr "" +msgstr "回收中心屋頂" #: lang/json/overmap_terrain_from_json.py msgid "landfill" @@ -107473,7 +108312,7 @@ msgstr "小型廢料場" #: lang/json/overmap_terrain_from_json.py msgid "open sewer" -msgstr "" +msgstr "開放式下水道" #: lang/json/overmap_terrain_from_json.py msgid "small dump" @@ -107481,11 +108320,11 @@ msgstr "小型垃圾場" #: lang/json/overmap_terrain_from_json.py msgid "lake shore" -msgstr "" +msgstr "湖岸" #: lang/json/overmap_terrain_from_json.py msgid "lake" -msgstr "" +msgstr "湖" #: lang/json/overmap_terrain_from_json.py msgid "municipal reactor" @@ -107557,15 +108396,15 @@ msgstr "拾荒者地堡" #: lang/json/overmap_terrain_from_json.py msgid "magic shop" -msgstr "" +msgstr "魔術店" #: lang/json/overmap_terrain_from_json.py msgid "magic shop roof" -msgstr "" +msgstr "魔術店屋頂" #: lang/json/overmap_terrain_from_json.py msgid "used bookstore" -msgstr "" +msgstr "二手書店" #: lang/json/overmap_terrain_from_json.py msgid "apartment towers" @@ -107722,23 +108561,27 @@ msgstr "國民住宅" #: lang/json/overmap_terrain_from_json.py msgid "public library" -msgstr "" +msgstr "公共圖書館" #: lang/json/overmap_terrain_from_json.py msgid "public library, 2nd floor" -msgstr "" +msgstr "公共圖書館,二樓" #: lang/json/overmap_terrain_from_json.py msgid "mechanics garage" msgstr "汽車修理工房" +#: lang/json/overmap_terrain_from_json.py +msgid "sewage treatment" +msgstr "污水處理" + #: lang/json/overmap_terrain_from_json.py msgid "mechanic garage" msgstr "機具車庫" #: lang/json/overmap_terrain_from_json.py msgid "interface" -msgstr "" +msgstr "介面" #: lang/json/overmap_terrain_from_json.py msgid "electric substation" @@ -107770,7 +108613,7 @@ msgstr "頹傾小屋 - 泥土廣場" #: lang/json/overmap_terrain_from_json.py msgid "desert" -msgstr "" +msgstr "沙漠" #: lang/json/overmap_terrain_from_json.py msgid "FEMA refugee camp" @@ -107783,7 +108626,7 @@ msgstr "大賣場屋頂" #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Vagabond" -msgstr "" +msgstr "流浪者" #. ~ Profession (male Vagabond) description #: lang/json/professions_from_json.py @@ -107792,12 +108635,12 @@ msgid "" "Circumstances left you wandering, with no home, no family, no friends. But " "the world you knew is gone, and maybe your experiences relying on yourself " "to survive could be useful in this new one." -msgstr "" +msgstr "形勢逼你到處漂泊,沒有房子,沒有家人,沒有朋友。但是你認知中的世界已不復存在,也許長期以來你獨立生存的經驗在這新世界中會極有用處。" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "Vagabond" -msgstr "" +msgstr "流浪者" #. ~ Profession (female Vagabond) description #: lang/json/professions_from_json.py @@ -107806,7 +108649,7 @@ msgid "" "Circumstances left you wandering, with no home, no family, no friends. But " "the world you knew is gone, and maybe your experiences relying on yourself " "to survive could be useful in this new one." -msgstr "" +msgstr "形勢逼你到處漂泊,沒有房子,沒有家人,沒有朋友。但是你認知中的世界已不復存在,也許長期以來你獨立生存的經驗在這新世界中會極有用處。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -108128,7 +108971,7 @@ msgid "" "It was going to be your first major game, but then the cataclysm struck. " "Thanks to your quick feet, you were among the lucky few to survive and " "escape from the creatures." -msgstr "" +msgstr "你正要開始你的首場要賽時,但災變緊接著就爆發了。感謝你的飛毛腿,讓你成為從那些生物中逃離的少數倖存者。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -108142,7 +108985,7 @@ msgid "" "It was going to be your first major game, but then the cataclysm struck. " "Thanks to your quick feet, you were among the lucky few to survive and " "escape from the creatures." -msgstr "" +msgstr "你正要開始你的首場要賽時,但災變緊接著就爆發了。感謝你的飛毛腿,讓你成為從那些生物中逃離的少數倖存者。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -108385,7 +109228,7 @@ msgstr "作為一個低薪的保全, 現在事情已經變得不是只有巡邏 #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Landscaper" -msgstr "" +msgstr "園丁" #. ~ Profession (male Landscaper) description #: lang/json/professions_from_json.py @@ -108394,12 +109237,12 @@ msgid "" "You used to mow lawns and trim hedges for the wealthy. Contract work was " "getting scarce even before the zombies came, but now you've got nothing left" " but your tools and expertise." -msgstr "" +msgstr "你過去常常為有錢人修剪草坪和修整籬笆。即便在殭屍來臨之前,承包工程早就越來越少,現在除了你的工具和專業知識之外,你什麼都沒有了。" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "Landscaper" -msgstr "" +msgstr "園丁" #. ~ Profession (female Landscaper) description #: lang/json/professions_from_json.py @@ -108408,12 +109251,12 @@ msgid "" "You used to mow lawns and trim hedges for the wealthy. Contract work was " "getting scarce even before the zombies came, but now you've got nothing left" " but your tools and expertise." -msgstr "" +msgstr "你過去常常為有錢人修剪草坪和修整籬笆。即便在殭屍來臨之前,承包工程早就越來越少,現在除了你的工具和專業知識之外,你什麼都沒有了。" #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Nursing Assistant" -msgstr "" +msgstr "護理助理員" #. ~ Profession (male Nursing Assistant) description #: lang/json/professions_from_json.py @@ -108422,12 +109265,12 @@ msgid "" "You were providing in-home care for the elderly, even as the whole world " "fell apart around you. You can only pray that you don't see your former " "clients among the walking dead..." -msgstr "" +msgstr "即使整個世界都在你周圍崩潰,你依然為老年人提供著家庭護理。你只能祈禱你不會看到你的前客戶在行屍走肉的行列中..." #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "Nursing Assistant" -msgstr "" +msgstr "護理助理員" #. ~ Profession (female Nursing Assistant) description #: lang/json/professions_from_json.py @@ -108436,7 +109279,7 @@ msgid "" "You were providing in-home care for the elderly, even as the whole world " "fell apart around you. You can only pray that you don't see your former " "clients among the walking dead..." -msgstr "" +msgstr "即使整個世界都在你周圍崩潰,你依然為老年人提供著家庭護理。你只能祈禱你不會看到你的前客戶在行屍走肉的行列中..." #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -108592,6 +109435,34 @@ msgid "" "next hit." msgstr "妳還搞不清楚到底發生了什麼事, 所有事情都亂了套, 妳腦子現在只想找到下一包安非他命。" +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Pillhead" +msgstr "服藥成癮者" + +#. ~ Profession (male Pillhead) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"After an accident in your youth, you got addicted to the opiates treating " +"your pain. With the pharmacies shut down and dealers turned undead, " +"satisfying your fix just got a lot more difficult." +msgstr "在年輕時發生意外事故之後,你對治療疼痛的鴉片類藥物上癮了。隨著藥局關閉,藥頭也變成了不死生物,想要滿足你的慾望變得越來越困難了。" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Pillhead" +msgstr "服藥成癮者" + +#. ~ Profession (female Pillhead) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"After an accident in your youth, you got addicted to the opiates treating " +"your pain. With the pharmacies shut down and dealers turned undead, " +"satisfying your fix just got a lot more difficult." +msgstr "在年輕時發生意外事故之後,你對治療疼痛的鴉片類藥物上癮了。隨著藥局關閉,藥頭也變成了不死生物,想要滿足你的慾望變得越來越困難了。" + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "K9 Officer" @@ -109411,7 +110282,7 @@ msgstr "你夢想藉由遺傳性的變化成為超人般的突變者, 這個夢 #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Prototype Cyborg" -msgstr "" +msgstr "原型生化人" #. ~ Profession (male Prototype Cyborg) description #: lang/json/professions_from_json.py @@ -109425,7 +110296,7 @@ msgstr "你曾經是正常的。但那些測試和實驗剝奪了你作為人類 #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "Prototype Cyborg" -msgstr "" +msgstr "原型生化人" #. ~ Profession (female Prototype Cyborg) description #: lang/json/professions_from_json.py @@ -109767,6 +110638,7 @@ msgid "" "bionic technology will be enough to ensure your survival after the " "apocalypse." msgstr "" +"你總要拿到市面上最新最好的巧妙裝置與小工具,大家都很好奇:難道你的智慧型手機升級了你的肉體嗎?只有時間才能證明,你對電子裝置的熱情與作為生化技術界的奇蹟地位,是否能確保你在大災變之後能生存下去。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -109783,6 +110655,7 @@ msgid "" "bionic technology will be enough to ensure your survival after the " "apocalypse." msgstr "" +"你總要拿到市面上最新最好的巧妙裝置與小工具,大家都很好奇:難道你的智慧型手機升級了你的肉體嗎?只有時間才能證明,你對電子裝置的熱情與作為生化技術界的奇蹟地位,是否能確保你在大災變之後能生存下去。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -111897,7 +112770,7 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Urban Samurai" -msgstr "" +msgstr "城市武士" #. ~ Profession (male Urban Samurai) description #: lang/json/professions_from_json.py @@ -111913,7 +112786,7 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "Urban Samurai" -msgstr "" +msgstr "城市武士" #. ~ Profession (female Urban Samurai) description #: lang/json/professions_from_json.py @@ -114352,7 +115225,6 @@ msgid "WEAPON" msgstr "武器" #. ~ Crafting recipes subcategory all -#. ~ Crafting recipes subcategory of 'ENCHANTED' category #: lang/json/recipe_category_from_json.py #: lang/json/recipe_category_from_json.py src/crafting_gui.cpp msgid "ALL" @@ -114550,17 +115422,17 @@ msgstr "車輛" #. ~ Crafting recipes category name #: lang/json/recipe_category_from_json.py msgid "ANIMALS" -msgstr "" +msgstr "動物" #. ~ Crafting recipes subcategory of 'ANIMALS' category #: lang/json/recipe_category_from_json.py msgid "CANINE ARMOR" -msgstr "" +msgstr "犬類護甲" #. ~ Crafting recipes subcategory of 'ANIMALS' category #: lang/json/recipe_category_from_json.py msgid "EQUINE ARMOR" -msgstr "" +msgstr "馬匹護甲" #. ~ Crafting recipes category name #: lang/json/recipe_category_from_json.py @@ -114580,17 +115452,17 @@ msgstr "擴充" #. ~ Crafting recipes category name #: lang/json/recipe_category_from_json.py msgid "ENCHANTED" -msgstr "" +msgstr "魔法" #. ~ Crafting recipes subcategory of 'ENCHANTED' category #: lang/json/recipe_category_from_json.py msgid "POTIONS" -msgstr "" +msgstr "藥劑" #. ~ Crafting recipes subcategory of 'ENCHANTED' category #: lang/json/recipe_category_from_json.py msgid "RUNES" -msgstr "" +msgstr "符文" #: lang/json/recipe_from_json.py msgid "Stuff THE MAN doesn't want you to know" @@ -114598,216 +115470,216 @@ msgstr "\"祂\" 不想讓你知道的東西" #: lang/json/recipe_from_json.py msgid "We should survey the base site and set up a bulletin board." -msgstr "" +msgstr "我們應該調查基址並建立告示牌。" #: lang/json/recipe_from_json.py msgid "We should survey the roof top and set up a bulletin board." -msgstr "" +msgstr "我們應該調查屋頂並建立告示牌。" #: lang/json/recipe_from_json.py msgid "" "Now that we have some cover, we should build a fireplace in the northeast " "shack." -msgstr "" +msgstr "現在我們有了一些掩護,我們應該在東北的棚寮建造一個壁爐。" #: lang/json/recipe_from_json.py msgid "" "Now that we have some cover, we should set up a brazier in the northeast " "shack." -msgstr "" +msgstr "現在我們有了一些掩護,我們應該在東北的棚寮設立一個火盆。" #: lang/json/recipe_from_json.py msgid "" "Now that we have some cover, we should build a stove in the northeast shack." -msgstr "" +msgstr "現在我們有了一些掩護,我們應該在東北的棚寮建造一個柴爐。" #: lang/json/recipe_from_json.py msgid "A straw bed in the northeast shack will make sleeping easier." -msgstr "" +msgstr "東北棚寮裡的草床讓人更容易入眠。" #: lang/json/recipe_from_json.py msgid "" "A proper bed in the northeast shack will give one of us a place to sleep " "soundly." -msgstr "" +msgstr "東北棚寮裡的舒適床,能讓我們其中之一睡得更香甜。" #: lang/json/recipe_from_json.py msgid "Another straw bed in the northeast shack will make sleeping easier." -msgstr "" +msgstr "東北棚寮裡的另一張草床讓人更容易入眠。" #: lang/json/recipe_from_json.py msgid "" "Another proper bed in the northeast shack will give one of us a place to " "sleep soundly." -msgstr "" +msgstr "東北棚寮裡的另一張舒適床,能讓我們其中之一睡得更香甜。" #: lang/json/recipe_from_json.py msgid "" "A pair of straw beds in the east tent will allow us to house two more people" " and expand the camp." -msgstr "" +msgstr "東邊帳篷裡的兩張草床,可以住兩個人,而且能擴建營寨。" #: lang/json/recipe_from_json.py msgid "" "A pair of proper beds in the east tent will allow us to house two more " "people and expand the camp." -msgstr "" +msgstr "東邊帳篷裡的兩張舒適的床,可以住兩個人,而且能擴建營寨。" #: lang/json/recipe_from_json.py msgid "" "A pair of straw beds in the east room will allow us to house two more people" " and expand the camp." -msgstr "" +msgstr "東邊房間裡的兩張草床,可以住兩個人,而且能擴建營寨。" #: lang/json/recipe_from_json.py msgid "" "A pair of proper beds in the east room will allow us to house two more " "people and expand the camp." -msgstr "" +msgstr "東邊房間裡的兩張舒適的床,可以住兩個人,而且能擴建營寨。" #: lang/json/recipe_from_json.py msgid "" "A pair of straw beds in the southeast tent will allow us to house two more " "people and expand the camp." -msgstr "" +msgstr "東南邊帳篷裡的兩張草床,可以住兩個人,而且能擴建營寨。" #: lang/json/recipe_from_json.py msgid "" "A pair of proper beds in the southeast tent will allow us to house two more " "people and expand the camp." -msgstr "" +msgstr "東南邊帳篷裡的兩張舒適的床,可以住兩個人,而且能擴建營寨。" #: lang/json/recipe_from_json.py msgid "" "A pair of straw beds in the southeast room will allow us to house two more " "people and expand the camp." -msgstr "" +msgstr "東南邊房間裡的兩張草床,可以住兩個人,而且能擴建營寨。" #: lang/json/recipe_from_json.py msgid "" "A pair of proper beds in the southeast room will allow us to house two more " "people and expand the camp." -msgstr "" +msgstr "東南邊房間裡的兩張舒適的床,可以住兩個人,而且能擴建營寨。" #: lang/json/recipe_from_json.py msgid "" "A pair of straw beds in the northwest building will allow us to house two " "more people and expand the camp." -msgstr "" +msgstr "西北邊房子裡的兩張草床,可以住兩個人,而且能擴建營寨。" #: lang/json/recipe_from_json.py msgid "" "A pair of proper beds in the northwest building will allow us to house two " "more people and expand the camp." -msgstr "" +msgstr "西北邊房子裡的兩張舒適的床,可以住兩個人,而且能擴建營寨。" #: lang/json/recipe_from_json.py msgid "" "A pair of straw beds in the west tent will allow us to house two more people" " and expand the camp." -msgstr "" +msgstr "西邊帳篷裡的兩張草床,可以住兩個人,而且能擴建營寨。" #: lang/json/recipe_from_json.py msgid "" "A pair of proper beds in the west tent will allow us to house two more " "people and expand the camp." -msgstr "" +msgstr "西邊帳篷裡的兩張舒適的床,可以住兩個人,而且能擴建營寨。" #: lang/json/recipe_from_json.py msgid "" "A pair of straw beds in the west room will allow us to house two more people" " and expand the camp." -msgstr "" +msgstr "西邊房間裡的兩張草床,可以住兩個人,而且能擴建營寨。" #: lang/json/recipe_from_json.py msgid "" "A pair of proper beds in the west room will allow us to house two more " "people and expand the camp." -msgstr "" +msgstr "西邊房間裡的兩張舒適的床,可以住兩個人,而且能擴建營寨。" #: lang/json/recipe_from_json.py msgid "" "A pair of straw beds in the southwest tent will allow us to house two more " "people and expand the camp." -msgstr "" +msgstr "西南邊帳篷裡的兩張草床,可以住兩個人,而且能擴建營寨。" #: lang/json/recipe_from_json.py msgid "" "A pair of proper beds in the southwest tent will allow us to house two more " "people and expand the camp." -msgstr "" +msgstr "西南邊帳篷裡的兩張舒適的床,可以住兩個人,而且能擴建營寨。" #: lang/json/recipe_from_json.py msgid "" "A pair of straw beds in the southwest room will allow us to house two more " "people and expand the camp." -msgstr "" +msgstr "西南邊房間裡的兩張草床,可以住兩個人,而且能擴建營寨。" #: lang/json/recipe_from_json.py msgid "" "A pair of proper beds in the southwest room will allow us to house two more " "people and expand the camp." -msgstr "" +msgstr "西南邊房間裡的兩張舒適的床,可以住兩個人,而且能擴建營寨。" #: lang/json/recipe_from_json.py msgid "" "A fireplace, counter, and some pots and pans in the central building will " "allow us to cook simple recipes and organize hunting expeditions." -msgstr "" +msgstr "中央建築內的壁爐、櫃檯和一些鍋碗瓢盆,能讓我們烹飪簡單的食物並組織狩獵任務。" #: lang/json/recipe_from_json.py msgid "" "We need a butchery rack to maximize the harvest from our hunting and " "trapping efforts." -msgstr "" +msgstr "我們需要一個屠宰架,能大幅增加狩獵和誘捕獵物的食物產量。" #: lang/json/recipe_from_json.py msgid "" "A tool rack in the central building will give us a place to store tools." -msgstr "" +msgstr "中央建築的工具架將為我們提供存放工具的空間。" #: lang/json/recipe_from_json.py msgid "" "Setting up some tables and chairs will make the central building into a " "dining area, and we can also use them as a workspace to organize the camp." -msgstr "" +msgstr "設置一些桌椅使中央建築成為用餐區,我們也可以把它當作工作空間來組織營寨。" #: lang/json/recipe_from_json.py msgid "" "A wood stove, counter, and some pots and pans in the south half of the " "central building will allow us to cook simple recipes and organize hunting " "expeditions. The stove will be more efficient than a fireplace." -msgstr "" +msgstr "中央建築南半部的柴爐、櫃檯和一些鍋碗瓢盆,能讓我們烹飪簡單的食物並組織狩獵任務。柴爐比壁爐更有效率。" #: lang/json/recipe_from_json.py msgid "Digging a well will give us easy access to water." -msgstr "" +msgstr "挖一口井將使我們能夠輕鬆獲得水資源。" #: lang/json/recipe_from_json.py msgid "Digging a root cellar will give us a way to preserve food." -msgstr "" +msgstr "挖一個根菜作物儲藏地窖將為我們提供一種保存食物的方法。" #: lang/json/recipe_from_json.py msgid "We could build a radio tower to improve the range of our radios." -msgstr "" +msgstr "我們可以建造一個無線電塔來增加我們無線電的接收範圍。" #: lang/json/recipe_from_json.py msgid "" "Adding a console to control the radio tower will help with recruiting more " "survivors." -msgstr "" +msgstr "添加控制台來控制無線電塔將有助於招募更多的倖存者。" #: lang/json/recipe_from_json.py msgid "" "Digging a trench along the north edge of the camp would provide some defense" " and generate building materials." -msgstr "" +msgstr "沿著營寨北邊邊緣挖出一條壕溝,能提供一些防禦並且產出一些建築材料。" #: lang/json/recipe_from_json.py msgid "" "Digging a trench along the south edge of the camp would provide some defense" " and generate building materials." -msgstr "" +msgstr "沿著營寨南邊邊緣挖出一條壕溝,能提供一些防禦並且產出一些建築材料。" #: lang/json/recipe_from_json.py msgid "" @@ -114816,6 +115688,7 @@ msgid "" "along the east side of the camp, we would only need to dig the trench long " "enough to reach the buildings." msgstr "" +"在營寨的東北角挖出一條壕溝,能提供一些防禦並產出一些建築材料。如果我們在營寨的東邊有堅固的建築物,那麼只需要挖掘長度能連接到建築物牆體的壕溝即可。" #: lang/json/recipe_from_json.py msgid "" @@ -114824,6 +115697,7 @@ msgid "" "along the west side of the camp, we would only need to dig the trench long " "enough to reach the buildings." msgstr "" +"在營寨的西北角挖出一條壕溝,能提供一些防禦並產出一些建築材料。如果我們在營寨的西邊有堅固的建築物,那麼只需要挖掘長度能連接到建築物牆體的壕溝即可。" #: lang/json/recipe_from_json.py msgid "" @@ -114832,6 +115706,7 @@ msgid "" "along the east side of the camp, we would only need to dig the trench long " "enough to reach the buildings." msgstr "" +"在營寨的東南角挖出一條壕溝,能提供一些防禦並產出一些建築材料。如果我們在營寨的東邊有堅固的建築物,那麼只需要挖掘長度能連接到建築物牆體的壕溝即可。" #: lang/json/recipe_from_json.py msgid "" @@ -114840,6 +115715,7 @@ msgid "" "along the west side of the camp, we would only need to dig the trench long " "enough to reach the buildings." msgstr "" +"在營寨的西南角挖出一條壕溝,能提供一些防禦並產出一些建築材料。如果我們在營寨的西邊有堅固的建築物,那麼只需要挖掘長度能連接到建築物牆體的壕溝即可。" #: lang/json/recipe_from_json.py msgid "" @@ -114847,6 +115723,7 @@ msgid "" "and generate building materials. We'll need to run the trench the length of" " the camp if we don't have solid buildings all along the east side." msgstr "" +"沿著營寨東邊邊緣挖出一條壕溝,能提供一些防禦並產出一些建築材料。如果我們在營寨東邊沒有堅固的建築物,那麼將需要挖出營寨邊長那麼長的壕溝才行。" #: lang/json/recipe_from_json.py msgid "" @@ -114854,479 +115731,480 @@ msgid "" "and generate building materials. We'll need to run the trench the length of" " the camp if we don't have solid buildings all along the west side." msgstr "" +"沿著營寨西邊邊緣挖出一條壕溝,能提供一些防禦並產出一些建築材料。如果我們在營寨西邊沒有堅固的建築物,那麼將需要挖出營寨邊長那麼長的壕溝才行。" #: lang/json/recipe_from_json.py msgid "" "We need some shelter, so build half of a metal shack with a metal roof on " "the northeast side of the camp" -msgstr "" +msgstr "我們需要遮風擋雨的地方,所以在營寨的東北邊上,建造半座金屬屋頂的金屬棚寮。" #: lang/json/recipe_from_json.py msgid "" "We should use metal to expand the shelter so we have space for another bed." -msgstr "" +msgstr "我們應該用金屬來擴建避難所,這樣我們就有空間擺另一張床。" #: lang/json/recipe_from_json.py msgid "We should use metal to finish the northeast shack." -msgstr "" +msgstr "我們應該用金屬來完成東北小屋。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by putting up a metal building on the east " "side, which we can also use as part of the central building." -msgstr "" +msgstr "我們應該在東側建造一座金屬建築來增加我們的住房,我們也可以將其作為中央建築的一部分。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by adding a metal room on the east side, which " "we can also use as part of the central building." -msgstr "" +msgstr "我們應該在東側增建一個金屬房間來增加我們的住房,我們也可以將其作為中央建築的一部分。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by putting up a metal building on the southeast" " side, which we can also use as part of the central building." -msgstr "" +msgstr "我們應該在東南側建造一座金屬建築來增加我們的住房,我們也可以將其作為中央建築的一部分。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by adding a metal room on the southeast side, " "which we can also use as part of the central building." -msgstr "" +msgstr "我們應該在東南側增建一個金屬房間來增加我們的住房,我們也可以將其作為中央建築的一部分。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by putting up a metal building on the northwest" " side, which we can also use as part of the central building." -msgstr "" +msgstr "我們應該在西北側建造一座金屬建築來增加我們的住房,我們也可以將其作為中央建築的一部分。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by putting up a metal building on the west " "side, which we can also use as part of the central building." -msgstr "" +msgstr "我們應該在西側建造一座金屬建築來增加我們的住房,我們也可以將其作為中央建築的一部分。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by adding a metal room on the west side, which " "we can also use as part of the central building." -msgstr "" +msgstr "我們應該在西側增建一個金屬房間來增加我們的住房,我們也可以將其作為中央建築的一部分。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by putting up a metal building on the southwest" " side, which we can also use as part of the central building." -msgstr "" +msgstr "我們應該在西南側建造一座金屬建築來增加我們的住房,我們也可以將其作為中央建築的一部分。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by adding a metal room on the southwest side, " "which we can also use as part of the central building." -msgstr "" +msgstr "我們應該在西南側增建一個金屬房間來增加我們的住房,我們也可以將其作為中央建築的一部分。" #: lang/json/recipe_from_json.py msgid "" "A central building can act as a kitchen and dining hall. We should build " "the northeast quarter of one from metal." -msgstr "" +msgstr "中央建築可以作為廚房和餐廳。我們應該用金屬建造東北側的部分。" #: lang/json/recipe_from_json.py msgid "" "A central building can act as a core and dining hall. We should build out " "from the east room with metal." -msgstr "" +msgstr "中央建築可以作為核心和餐廳。我們應該用金屬從東面的房間延伸建造。" #: lang/json/recipe_from_json.py msgid "" "A central building can act as a core and dining hall. We should build the " "northwest quarter of one from metal." -msgstr "" +msgstr "中央建築可以作為核心和餐廳。我們應該用金屬建造西北側的部分。" #: lang/json/recipe_from_json.py msgid "" "A central building can act as a core and dining hall. We should build out " "from the west room with metal." -msgstr "" +msgstr "中央建築可以作為核心和餐廳。我們應該用金屬從西面的房間延伸建造。" #: lang/json/recipe_from_json.py msgid "" "A central building can act as a core and dining hall. We should build " "between the east and west rooms with metal." -msgstr "" +msgstr "中央建築可以作為核心和餐廳。我們應該在東西兩房間之間用金屬來建造。" #: lang/json/recipe_from_json.py msgid "" "A central building can act as a core and dining hall. We should build the " "southeast quarter of one from metal." -msgstr "" +msgstr "中央建築可以作為核心和餐廳。我們應該用金屬建造東南側的部分。" #: lang/json/recipe_from_json.py msgid "" "A central building can act as a core and dining hall. We should build out " "from the southeast room with metal." -msgstr "" +msgstr "中央建築可以作為核心和餐廳。我們應該用金屬從東南面的房間延伸建造。" #: lang/json/recipe_from_json.py msgid "" "A central building can act as a core and dining hall. We should build the " "southwest quarter of one from metal." -msgstr "" +msgstr "中央建築可以作為核心和餐廳。我們應該用金屬建造西南側的部分。" #: lang/json/recipe_from_json.py msgid "" "A central building can act as a core and dining hall. We should build out " "from the southwest room with metal." -msgstr "" +msgstr "中央建築可以作為核心和餐廳。我們應該用金屬從西南面的房間延伸建造。" #: lang/json/recipe_from_json.py msgid "" "A central building can act as a core and dining hall. We should build " "between the southeast and southwest rooms with metal." -msgstr "" +msgstr "中央建築可以作為核心和餐廳。我們應該在東南跟西南兩房間之間用金屬來建造。" #: lang/json/recipe_from_json.py msgid "" "We need some shelter, so set up a tent on the northeast side of the camp." -msgstr "" +msgstr "我們需要遮風擋雨的地方,所以在營寨的東北邊上,搭起一座帳篷。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by putting up a tent on the east side, though " "doing so will mean we need more materials to build the central building." -msgstr "" +msgstr "我們應該在東側搭帳篷來增加我們的住房,但這樣做意味著我們需要更多的材料來建造中央建築。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by putting up a tent on the southeast side, " "though doing so will mean we need more materials to build the central " "building." -msgstr "" +msgstr "我們應該在東南側搭帳篷來增加我們的住房,但這樣做意味著我們需要更多的材料來建造中央建築。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by putting up a tent on the northwest side, " "though doing so will mean we need more materials to build the central " "building." -msgstr "" +msgstr "我們應該在西北側搭帳篷來增加我們的住房,但這樣做意味著我們需要更多的材料來建造中央建築。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by putting up a tent on the west side, though " "doing so will mean we need more materials to build the central building." -msgstr "" +msgstr "我們應該在西側搭帳篷來增加我們的住房,但這樣做意味著我們需要更多的材料來建造中央建築。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by putting up a tent on the southwest side, " "though doing so will mean we need more materials to build the central " "building." -msgstr "" +msgstr "我們應該在西南側搭帳篷來增加我們的住房,但這樣做意味著我們需要更多的材料來建造中央建築。" #: lang/json/recipe_from_json.py msgid "" "We need some shelter, so build half of a wattle-and-daub shack with a sod " "roof on the northeast side of the camp" -msgstr "" +msgstr "我們需要遮風擋雨的地方,所以在營寨的東北邊上,建造半座草皮屋頂的泥板牆棚寮。" #: lang/json/recipe_from_json.py msgid "" "We should use wattle-and-daub to expand the shelter so we have space for " "another bed." -msgstr "" +msgstr "我們應該用泥板牆來擴建避難所,這樣我們就有空間擺另一張床。" #: lang/json/recipe_from_json.py msgid "We should use wattle-and-daub to finish the northeast shack." -msgstr "" +msgstr "我們應該用泥板牆來完成東北小屋。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by putting up a wattle-and-daub building on the" " east side, which we can also use as part of the central building." -msgstr "" +msgstr "我們應該在東側建造一座泥板牆建築來增加我們的住房,我們也可以將其作為中央建築的一部分。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by adding a wattle-and-daub room on the east " "side, which we can also use as part of the central building." -msgstr "" +msgstr "我們應該在東側增建一個泥板牆房間來增加我們的住房,我們也可以將其作為中央建築的一部分。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by putting up a wattle-and-daub building on the" " southeast side, which we can also use as part of the central building." -msgstr "" +msgstr "我們應該在東南側建造一座泥板牆建築來增加我們的住房,我們也可以將其作為中央建築的一部分。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by adding a wattle-and-daub room on the " "southeast side, which we can also use as part of the central building." -msgstr "" +msgstr "我們應該在東南側增建一個泥板牆房間來增加我們的住房,我們也可以將其作為中央建築的一部分。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by putting up a wattle-and-daub building on the" " northwest side, which we can also use as part of the central building." -msgstr "" +msgstr "我們應該在西北側建造一座泥板牆建築來增加我們的住房,我們也可以將其作為中央建築的一部分。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by putting up a wattle-and-daub building on the" " west side, which we can also use as part of the central building." -msgstr "" +msgstr "我們應該在西側建造一座泥板牆建築來增加我們的住房,我們也可以將其作為中央建築的一部分。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by adding a wattle-and-daub room on the west " "side, which we can also use as part of the central building." -msgstr "" +msgstr "我們應該在西側增建一個泥板牆房間來增加我們的住房,我們也可以將其作為中央建築的一部分。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by putting up a wattle-and-daub building on the" " southwest side, which we can also use as part of the central building." -msgstr "" +msgstr "我們應該在西南側建造一座泥板牆建築來增加我們的住房,我們也可以將其作為中央建築的一部分。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by adding a wattle-and-daub room on the " "southwest side, which we can also use as part of the central building." -msgstr "" +msgstr "我們應該在西南側增建一個泥板牆房間來增加我們的住房,我們也可以將其作為中央建築的一部分。" #: lang/json/recipe_from_json.py msgid "" "A central building can act as a kitchen and dining hall. We should build " "the northeast quarter of one from wattle-and-daub." -msgstr "" +msgstr "中央建築可以作為廚房和餐廳。我們應該用泥板牆建造東北側的部分。" #: lang/json/recipe_from_json.py msgid "" "A central building can act as a core and dining hall. We should build out " "from the east room with wattle-and-daub." -msgstr "" +msgstr "中央建築可以作為核心和餐廳。我們應該用泥板牆從東面的房間延伸建造。" #: lang/json/recipe_from_json.py msgid "" "A central building can act as a core and dining hall. We should build the " "northwest quarter of one from wattle-and-daub." -msgstr "" +msgstr "中央建築可以作為核心和餐廳。我們應該用泥板牆建造西北側的部分。" #: lang/json/recipe_from_json.py msgid "" "A central building can act as a core and dining hall. We should build out " "from the west room with wattle-and-daub." -msgstr "" +msgstr "中央建築可以作為核心和餐廳。我們應該用泥板牆從西面的房間延伸建造。" #: lang/json/recipe_from_json.py msgid "" "A central building can act as a core and dining hall. We should build " "between the east and west rooms with wattle-and-daub." -msgstr "" +msgstr "中央建築可以作為核心和餐廳。我們應該在東西兩房間之間用泥板牆來建造。" #: lang/json/recipe_from_json.py msgid "" "A central building can act as a core and dining hall. We should build the " "southeast quarter of one from wattle-and-daub." -msgstr "" +msgstr "中央建築可以作為核心和餐廳。我們應該用泥板牆建造東南側的部分。" #: lang/json/recipe_from_json.py msgid "" "A central building can act as a core and dining hall. We should build out " "from the southeast room with wattle-and-daub." -msgstr "" +msgstr "中央建築可以作為核心和餐廳。我們應該用泥板牆從東南面的房間延伸建造。" #: lang/json/recipe_from_json.py msgid "" "A central building can act as a core and dining hall. We should build the " "southwest quarter of one from wattle-and-daub." -msgstr "" +msgstr "中央建築可以作為核心和餐廳。我們應該用泥板牆建造西南側的部分。" #: lang/json/recipe_from_json.py msgid "" "A central building can act as a core and dining hall. We should build out " "from the southwest room with wattle-and-daub." -msgstr "" +msgstr "中央建築可以作為核心和餐廳。我們應該用泥板牆從西南面的房間延伸建造。" #: lang/json/recipe_from_json.py msgid "" "A central building can act as a core and dining hall. We should build " "between the southeast and southwest rooms with wattle-and-daub." -msgstr "" +msgstr "中央建築可以作為核心和餐廳。我們應該在東南跟西南兩房間之間用泥板牆來建造。" #: lang/json/recipe_from_json.py msgid "" "We need some shelter, so build half of a wood panel shack with a wooden roof" " on the northeast side of the camp" -msgstr "" +msgstr "我們需要遮風擋雨的地方,所以在營寨的東北邊上,建造半座木頭屋頂的木板牆棚寮。" #: lang/json/recipe_from_json.py msgid "" "We should use wood panel to expand the shelter so we have space for another " "bed." -msgstr "" +msgstr "我們應該用木板來擴建避難所,這樣我們就有空間擺另一張床。" #: lang/json/recipe_from_json.py msgid "We should use wood panel to finish the northeast shack." -msgstr "" +msgstr "我們應該用木板來完成東北小屋。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by putting up a wood panel building on the east" " side, which we can also use as part of the central building." -msgstr "" +msgstr "我們應該在東側建造一座木板建築來增加我們的住房,我們也可以將其作為中央建築的一部分。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by adding a wood panel room on the east side, " "which we can also use as part of the central building." -msgstr "" +msgstr "我們應該在東側增建一個木板房間來增加我們的住房,我們也可以將其作為中央建築的一部分。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by putting up a wood panel building on the " "southeast side, which we can also use as part of the central building." -msgstr "" +msgstr "我們應該在東南側建造一座木板建築來增加我們的住房,我們也可以將其作為中央建築的一部分。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by adding a wood panel room on the southeast " "side, which we can also use as part of the central building." -msgstr "" +msgstr "我們應該在東南側增建一個木板房間來增加我們的住房,我們也可以將其作為中央建築的一部分。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by putting up a wood panel building on the " "northwest side, which we can also use as part of the central building." -msgstr "" +msgstr "我們應該在西北側建造一座木板建築來增加我們的住房,我們也可以將其作為中央建築的一部分。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by putting up a wood panel building on the west" " side, which we can also use as part of the central building." -msgstr "" +msgstr "我們應該在西側建造一座木板建築來增加我們的住房,我們也可以將其作為中央建築的一部分。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by adding a wood panel room on the west side, " "which we can also use as part of the central building." -msgstr "" +msgstr "我們應該在西側增建一個木板房間來增加我們的住房,我們也可以將其作為中央建築的一部分。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by putting up a wood panel building on the " "southwest side, which we can also use as part of the central building." -msgstr "" +msgstr "我們應該在西南側建造一座木板建築來增加我們的住房,我們也可以將其作為中央建築的一部分。" #: lang/json/recipe_from_json.py msgid "" "We should expand our housing by adding a wood panel room on the southwest " "side, which we can also use as part of the central building." -msgstr "" +msgstr "我們應該在西南側增建一個木板房間來增加我們的住房,我們也可以將其作為中央建築的一部分。" #: lang/json/recipe_from_json.py msgid "" "A central building can act as a kitchen and dining hall. We should build " "the northeast quarter of one from wood panel." -msgstr "" +msgstr "中央建築可以作為廚房和餐廳。我們應該用木板建造東北側的部分。" #: lang/json/recipe_from_json.py msgid "" "A central building can act as a core and dining hall. We should build out " "from the east room with wood panel." -msgstr "" +msgstr "中央建築可以作為核心和餐廳。我們應該用木板從東面的房間延伸建造。" #: lang/json/recipe_from_json.py msgid "" "A central building can act as a core and dining hall. We should build the " "northwest quarter of one from wood panel." -msgstr "" +msgstr "中央建築可以作為核心和餐廳。我們應該用木板建造西北側的部分。" #: lang/json/recipe_from_json.py msgid "" "A central building can act as a core and dining hall. We should build out " "from the west room with wood panel." -msgstr "" +msgstr "中央建築可以作為核心和餐廳。我們應該用木板從西面的房間延伸建造。" #: lang/json/recipe_from_json.py msgid "" "A central building can act as a core and dining hall. We should build " "between the east and west rooms with wood panel." -msgstr "" +msgstr "中央建築可以作為核心和餐廳。我們應該在東西兩房間之間用木板來建造。" #: lang/json/recipe_from_json.py msgid "" "A central building can act as a core and dining hall. We should build the " "southeast quarter of one from wood panel." -msgstr "" +msgstr "中央建築可以作為核心和餐廳。我們應該用木板建造東南側的部分。" #: lang/json/recipe_from_json.py msgid "" "A central building can act as a core and dining hall. We should build out " "from the southeast room with wood panel." -msgstr "" +msgstr "中央建築可以作為核心和餐廳。我們應該用木板從東南面的房間延伸建造。" #: lang/json/recipe_from_json.py msgid "" "A central building can act as a core and dining hall. We should build the " "southwest quarter of one from wood panel." -msgstr "" +msgstr "中央建築可以作為核心和餐廳。我們應該用木板建造西南側的部分。" #: lang/json/recipe_from_json.py msgid "" "A central building can act as a core and dining hall. We should build out " "from the southwest room with wood panel." -msgstr "" +msgstr "中央建築可以作為核心和餐廳。我們應該用木板從西南面的房間延伸建造。" #: lang/json/recipe_from_json.py msgid "" "A central building can act as a core and dining hall. We should build " "between the southeast and southwest rooms with wood panel." -msgstr "" +msgstr "中央建築可以作為核心和餐廳。我們應該在東南跟西南兩房間之間用木板來建造。" #: lang/json/recipe_from_json.py msgid "We need to survey the base site first." -msgstr "" +msgstr "我們需要先調查基址。" #: lang/json/recipe_from_json.py msgid "" "The first thing we are going to need is a command tent to manage and task " "workers from." -msgstr "" +msgstr "我們首先需要的是一個管理和任務工作人員的指揮帳篷。" #: lang/json/recipe_from_json.py msgid "" "We're going to need a fire pit and a bed if we want to stay here " "permanently." -msgstr "" +msgstr "如果我們想永久留在這裡,我們將需要一個火盆和一張床。" #: lang/json/recipe_from_json.py msgid "" "To make this outpost functional we are going to need storage containers to " "organize our supplies." -msgstr "" +msgstr "為了使這個前哨站有功能,我們將需要儲存容器來組織我們的物資。" #: lang/json/recipe_from_json.py msgid "" "Next we should expand the camp to comfortably support two people " "indefinitely." -msgstr "" +msgstr "接下來我們應該擴建營寨,才能無限期地供兩個人舒適地生活。" #: lang/json/recipe_from_json.py msgid "" "Additional housing and storage will allow our camp to expand into " "specialized industries." -msgstr "" +msgstr "額外的住房和倉庫將允許我們擴建營寨的專門工業區。" #: lang/json/recipe_from_json.py msgid "" "Constructing a hard command post will transform our little camp into a true " "base." -msgstr "" +msgstr "建立一個堅固的指揮所,把我們的小營寨變成一個真正的基地。" #: lang/json/recipe_from_json.py msgid "" "Building additional housing will allow us to send companions out to find " "recruits." -msgstr "" +msgstr "建造額外的住房將允許我們派出同伴去尋找新成員。" #: lang/json/recipe_from_json.py msgid "We need to expand our base to include basic dining facilities." @@ -115334,135 +116212,135 @@ msgstr "我們需要擴大我們的基地,讓它有基本的餐飲設施。" #: lang/json/recipe_from_json.py msgid "More housing means that we can support additional specialists." -msgstr "" +msgstr "更多住房意味著我們可以駐留更多專家。" #: lang/json/recipe_from_json.py msgid "An expanded kitchen is needed to support our growing settlement." -msgstr "" +msgstr "需要擴建廚房來支持我們不斷增長的定居點。" #: lang/json/recipe_from_json.py msgid "" "Finishing the hard structure will give us a more secure place to retreat to " "if we come under attack." -msgstr "" +msgstr "如果我們受到攻擊,完成這個堅硬的建築將為我們提供一個更安全的撤退地點。" #: lang/json/recipe_from_json.py msgid "" "I'm surprised we've made it this long without securing a clean water source," " we need a well." -msgstr "" +msgstr "我很驚訝我們已經撐了很長時間而沒有固定的乾淨的水源,我們需要一口井。" #: lang/json/recipe_from_json.py msgid "" "Building a strong wall will keep the base secure even if a small horde " "attacks." -msgstr "" +msgstr "即使一小群殭屍的攻擊,若有堅固的牆也將保持基地的安全。" #: lang/json/recipe_from_json.py msgid "We need to finish our half built fortifications." -msgstr "" +msgstr "我們需要完成這建到一半的防禦工事。" #: lang/json/recipe_from_json.py msgid "We're running out of room and need another living quarters." -msgstr "" +msgstr "我們已經沒有房間,需要另一個住房。" #: lang/json/recipe_from_json.py msgid "Our kitchen isn't able to keep up with demand, we need to expand it." -msgstr "" +msgstr "我們的廚房已無法滿足需求,我們需要擴大它。" #: lang/json/recipe_from_json.py msgid "We should build stronger doors to secure our compound." -msgstr "" +msgstr "我們應該建立更堅固的門來保護我們的化合物。" #: lang/json/recipe_from_json.py msgid "One more tent and our living space will be full." -msgstr "" +msgstr "再增加一個帳篷,我們的住房就滿了。" #: lang/json/recipe_from_json.py msgid "" "We could construct a radio tower to improve communication range, first step " "is the tower structure." -msgstr "" +msgstr "我們可以建造一個無線電塔來增加通訊範圍,首先是塔的結構。" #: lang/json/recipe_from_json.py msgid "We need to build a console to control the radio tower." -msgstr "" +msgstr "我們需要建立一個控制無線電塔的控制台。" #: lang/json/recipe_from_json.py msgid "Survey land for a farm shop." -msgstr "" +msgstr "勘查擴建農場的土地。" #: lang/json/recipe_from_json.py msgid "Plowing a few plots should get us started." -msgstr "" +msgstr "犁出一些農田可以讓我們開始農作。" #: lang/json/recipe_from_json.py msgid "We could use a farming shed to store resources where we'll be working." -msgstr "" +msgstr "我們可以使用農場棚屋來儲存我們要進行工作的資源。" #: lang/json/recipe_from_json.py msgid "" "Our farm could be expanded by finishing the shed and adding additional " "plots." -msgstr "" +msgstr "我們可以經由完成棚屋來擴建農場並增加額外的農地。" #: lang/json/recipe_from_json.py msgid "" "Building a processing shack should allow us to reclaim additional seeds from" " our byproducts." -msgstr "" +msgstr "建造一個農務棚寮能讓我們從農作副產品中回收額外的種子。" #: lang/json/recipe_from_json.py msgid "Survey land for a garage." -msgstr "" +msgstr "勘查擴建修車廠的土地。" #: lang/json/recipe_from_json.py msgid "Building a tool rack should be the first priority." -msgstr "" +msgstr "建立工具架應該是首要任務。" #: lang/json/recipe_from_json.py msgid "We should start construction of a roof for the garage." -msgstr "" +msgstr "我們應該開始建造修車廠的屋頂。" #: lang/json/recipe_from_json.py msgid "Finishing out the roof will let our mechanics work rain or shine." -msgstr "" +msgstr "完成屋頂將讓我們的技工無論風雨都能工作。" #: lang/json/recipe_from_json.py msgid "" "Our garage isn't big enough to work on larger vehicles. Let's start " "expanding it." -msgstr "" +msgstr "我們的修車廠不夠大,無法修改大型車輛。讓我們開始擴建它吧。" #: lang/json/recipe_from_json.py msgid "Finishing the roof will let us park RVs and buses in the garage." -msgstr "" +msgstr "完成屋頂將讓我們在車庫停放休旅車和公共汽車。" #: lang/json/recipe_from_json.py msgid "" "Attaching a quarters will let our mechanics work longer hours when needed." -msgstr "" +msgstr "連接住處將使我們的技工必要時能工作更長的時間。" #: lang/json/recipe_from_json.py msgid "Survey land for a kitchen." -msgstr "" +msgstr "勘查擴建廚房的土地。" #: lang/json/recipe_from_json.py msgid "Building a cook-shack is our first task." -msgstr "" +msgstr "建造廚房棚寮是我們的首要任務。" #: lang/json/recipe_from_json.py msgid "We need to finish framing the walls for the cook-shack." -msgstr "" +msgstr "我們需要為廚房棚寮完成牆壁的框架。" #: lang/json/recipe_from_json.py msgid "" "Expanding the shack by including a smoker will increase our versatility." -msgstr "" +msgstr "經由設立炭烤爐來擴建廚房將使它更有機能性。" #: lang/json/recipe_from_json.py msgid "A pantry will allow our cooks to store more non-perishables." -msgstr "" +msgstr "食品儲藏室將允許我們的廚師儲存更多的非易腐食品。" #: lang/json/recipe_from_json.py msgid "" @@ -115477,7 +116355,7 @@ msgstr "我們需要建造一口井, 這樣廚師就不用往返提水了。" msgid "" "Wood stoves will give us greater control of temperatures and let us craft " "more difficult recipes." -msgstr "" +msgstr "木爐將使我們更好地控制溫度,讓我們製作更難的食譜。" #: lang/json/recipe_from_json.py msgid "" @@ -115489,17 +116367,17 @@ msgstr "最後, 進一步擴大食品儲藏室能讓我們儲存更多的材料 msgid "" "A trench that may deter movement but is meant to be the foundation of a " "picket or palisade. Requirements are for 1/2 an over map tile." -msgstr "" +msgstr "壕溝可以阻礙行動,它更是鹿砦或柵欄的地基。需求是 1 / 2 地圖格子。" #: lang/json/recipe_from_json.py msgid "" "A deep trench filled with spikes, requires a trench. Requirements are for " "1/2 an over map tile." -msgstr "" +msgstr "布滿尖釘的深溝,需要壕溝為地基。需求是 1 / 2 地圖格子。" #: lang/json/recipe_from_json.py msgid "Survey land for a blacksmith shop." -msgstr "" +msgstr "勘查擴建鐵匠鋪的土地" #: lang/json/recipe_from_json.py msgid "Building a forge and kiln is our first task." @@ -115507,58 +116385,58 @@ msgstr "建造鍛造爐和碳化爐是我們的首要任務。" #: lang/json/recipe_from_json.py msgid "Building a proper roof for the shop is the next step." -msgstr "" +msgstr "下一步是為工坊建造一個合適的屋頂。" #: lang/json/recipe_from_json.py msgid "Building a working table and placing an anvil are next." -msgstr "" +msgstr "接下來是建造工作台和放置鐵砧。" #: lang/json/recipe_from_json.py msgid "" "If we're going to do more than simple metal casting we need a bigger shop." -msgstr "" +msgstr "如果我們要做的不僅僅是簡單的金屬鑄造,那我們將需要一個更大的工坊。" #: lang/json/recipe_from_json.py msgid "We need some basic tools to make more advanced crafts." -msgstr "" +msgstr "我們需要一些基本工具來製作更高階的工藝品。" #: lang/json/recipe_from_json.py msgid "An expanded forge will allow us to work on bigger projects." -msgstr "" +msgstr "擴建的鍛造爐將使我們能夠進行更大的項目。" #: lang/json/recipe_from_json.py msgid "Proper steel work requires a bellows and quenching setup." -msgstr "" +msgstr "正確的鍛鋼工作需要風箱和淬火設置。" #: lang/json/recipe_from_json.py msgid "A separate workshop will allow us to do the most basic of machining." -msgstr "" +msgstr "一個額外的工作室將使我們能夠進行最基本的機械加工。" #: lang/json/recipe_from_json.py msgid "Next we need to add some basic tools and vices to the workshop." -msgstr "" +msgstr "接下來,我們需要為工坊添加一些基本工具和虎頭鉗。" #: lang/json/recipe_from_json.py msgid "Advanced forging processes require more room to work." -msgstr "" +msgstr "進階的鍛造工藝需要更多的工作空間。" #: lang/json/recipe_from_json.py msgid "An on-site well will allow us to fill boilers as needed." -msgstr "" +msgstr "位於該地的水井將允許我們根據需要填充鍋爐。" #: lang/json/recipe_from_json.py msgid "" "A steam-powered drop hammer will greatly increase production speed in " "exchange for charcoal." -msgstr "" +msgstr "蒸汽動力鍛造錘能以木炭來換取大幅增加的生產速度。" #: lang/json/recipe_group_from_json.py msgid "Field Camp" -msgstr "" +msgstr "平原營寨" #: lang/json/recipe_group_from_json.py msgid "Old Camp" -msgstr "" +msgstr "舊營寨" #: lang/json/recipe_group_from_json.py msgid "Farm" @@ -115578,7 +116456,7 @@ msgstr "鐵匠鋪" #: lang/json/recipe_group_from_json.py msgid " Craft: Tinder" -msgstr "" +msgstr "製作:火種" #: lang/json/recipe_group_from_json.py msgid " Cook: Meat, Cooked" @@ -115738,7 +116616,7 @@ msgstr " 製作: 尖刺" #: lang/json/recipe_group_from_json.py msgid " Craft: Glass Caltrops" -msgstr "" +msgstr "製作:玻璃蒺藜" #: lang/json/recipe_group_from_json.py msgid " Craft: Steel, Chunk" @@ -115746,7 +116624,7 @@ msgstr " 製作: 鋼, 小塊" #: lang/json/recipe_group_from_json.py msgid " Craft: Crucible" -msgstr "" +msgstr "製作:坩鍋" #: lang/json/recipe_group_from_json.py msgid " Craft: Anvil" @@ -115778,23 +116656,23 @@ msgstr " 製作: 護甲, 廢金屬裝" #: lang/json/recipe_group_from_json.py msgid " Craft: Armor, Scrap Helmet" -msgstr "" +msgstr "製作:護甲,廢金屬頭盔" #: lang/json/recipe_group_from_json.py msgid " Craft: Armor, Scrap Cuirass" -msgstr "" +msgstr "製作:護甲,廢金屬胸甲" #: lang/json/recipe_group_from_json.py msgid " Craft: Armor, Scrap Arm Guards" -msgstr "" +msgstr "製作:護甲,廢金屬護臂" #: lang/json/recipe_group_from_json.py msgid " Craft: Armor, Scrap Leg Guards" -msgstr "" +msgstr "製作:護甲,廢金屬護腿" #: lang/json/recipe_group_from_json.py msgid " Craft: Armor, Scrap Boots" -msgstr "" +msgstr " 製作: 護甲, 廢金屬靴" #: lang/json/recipe_group_from_json.py msgid " Craft: Axe, Copper" @@ -115862,7 +116740,7 @@ msgstr " 製作: 鋼筋" #: lang/json/recipe_group_from_json.py msgid " Craft: Gold Ring" -msgstr "" +msgstr "製作:金戒指" #: lang/json/recipe_group_from_json.py msgid " Craft: Hammer, Sledge" @@ -116085,13 +116963,13 @@ msgstr "在鎮上" #: lang/json/scenario_from_json.py msgctxt "scenario_male" msgid "Large Building" -msgstr "" +msgstr "大樓" #. ~ Name for scenario 'Large Building' for a female character #: lang/json/scenario_from_json.py msgctxt "scenario_female" msgid "Large Building" -msgstr "" +msgstr "大樓" #. ~ Description for scenario 'Large Building' for a male character. #: lang/json/scenario_from_json.py @@ -116099,7 +116977,7 @@ msgctxt "scen_desc_male" msgid "" "Whether due to stubbornness, ignorance, or just plain bad luck, you missed " "the evacuation, and are stuck in a large building full of the risen dead." -msgstr "" +msgstr "無論是因頑固、無知,還是僅因運氣太背,你都錯過了避難疏散,並被困在一座滿是活死人的大樓裡。" #. ~ Description for scenario 'Large Building' for a female character. #: lang/json/scenario_from_json.py @@ -116107,13 +116985,13 @@ msgctxt "scen_desc_female" msgid "" "Whether due to stubbornness, ignorance, or just plain bad luck, you missed " "the evacuation, and are stuck in a large building full of the risen dead." -msgstr "" +msgstr "無論是因頑固、無知,還是僅因運氣太背,你都錯過了避難疏散,並被困在一座滿是活死人的大樓裡。" #. ~ Starting location for scenario 'Large Building'. #: lang/json/scenario_from_json.py msgctxt "start_name" msgid "In Large Building" -msgstr "" +msgstr "在大樓中" #. ~ Name for scenario 'Surrounded' for a male character #: lang/json/scenario_from_json.py @@ -116237,13 +117115,13 @@ msgstr "你正決定要在這個建築定居的時候就突然失火了! 你最 #: lang/json/scenario_from_json.py msgctxt "scenario_male" msgid "Challenge - Really Bad Day" -msgstr "" +msgstr "挑戰-衰神附身" #. ~ Name for scenario 'Challenge - Really Bad Day' for a female character #: lang/json/scenario_from_json.py msgctxt "scenario_female" msgid "Challenge - Really Bad Day" -msgstr "" +msgstr "挑戰-衰神附身" #. ~ Description for scenario 'Challenge - Really Bad Day' for a male #. character. @@ -116253,7 +117131,7 @@ msgid "" "You start drunk to the point of incapacitation, depressed, infected, " "surrounded by fire, and sick with the flu. This day went downhill really " "fast." -msgstr "" +msgstr "你開始喝酒,醉到癱瘓、感到沮喪、被屍毒感染、被火包圍、並且感染流感。這一天的狀況變糟的速度真的很快。" #. ~ Description for scenario 'Challenge - Really Bad Day' for a female #. character. @@ -116263,19 +117141,19 @@ msgid "" "You start drunk to the point of incapacitation, depressed, infected, " "surrounded by fire, and sick with the flu. This day went downhill really " "fast." -msgstr "" +msgstr "你開始喝酒,醉到癱瘓、感到沮喪、被屍毒感染、被火包圍、並且感染流感。這一天的狀況變糟的速度真的很快。" #. ~ Name for scenario 'Challenge - Medieval Peasant' for a male character #: lang/json/scenario_from_json.py msgctxt "scenario_male" msgid "Challenge - Medieval Peasant" -msgstr "" +msgstr "挑戰-中世紀農民" #. ~ Name for scenario 'Challenge - Medieval Peasant' for a female character #: lang/json/scenario_from_json.py msgctxt "scenario_female" msgid "Challenge - Medieval Peasant" -msgstr "" +msgstr "挑戰-中世紀農民" #. ~ Description for scenario 'Challenge - Medieval Peasant' for a male #. character. @@ -116284,7 +117162,7 @@ msgctxt "scen_desc_male" msgid "" "Som nigromancie hath brought yow hidder! Ye have only the hoose on youre " "legges and the knyf at youre syde and youre prayeres to Marie moder of God." -msgstr "" +msgstr "你貝召魂素勾到這呂!叔麼都妹有,阿呵嘎在還有一朱小刀在孫編,你主能向圣母嘛利亞倒告。(粗人 + 文盲)" #. ~ Description for scenario 'Challenge - Medieval Peasant' for a female #. character. @@ -116293,7 +117171,7 @@ msgctxt "scen_desc_female" msgid "" "Som nigromancie hath brought yow hidder! Ye have only the hoose on youre " "legges and the knyf at youre syde and youre prayeres to Marie moder of God." -msgstr "" +msgstr "你貝召魂素勾到這呂!叔麼都妹有,阿呵嘎在還有一朱小刀在孫編,你主能向圣母嘛利亞倒告。(粗人 + 文盲)" #. ~ Starting location for scenario 'Challenge - Medieval Peasant'. #. ~ Starting location for scenario 'Experiment'. @@ -116307,13 +117185,13 @@ msgstr "荒野" #: lang/json/scenario_from_json.py msgctxt "scenario_male" msgid "Challenge - Lab Patient" -msgstr "" +msgstr "挑戰-實驗室患者" #. ~ Name for scenario 'Challenge - Lab Patient' for a female character #: lang/json/scenario_from_json.py msgctxt "scenario_female" msgid "Challenge - Lab Patient" -msgstr "" +msgstr "挑戰-實驗室患者" #. ~ Description for scenario 'Challenge - Lab Patient' for a male character. #: lang/json/scenario_from_json.py @@ -116322,7 +117200,7 @@ msgid "" "The scientists stopped their experiments on you abruptly, leaving you behind" " while they evacuated before lockdown. Find a way to escape or starve to " "death." -msgstr "" +msgstr "科學家們突然停止了對你的實驗,在實驗室封鎖之前就撤離了,把你遺棄在這裡。想辦法逃離這裡而且別餓死。" #. ~ Description for scenario 'Challenge - Lab Patient' for a female #. character. @@ -116332,7 +117210,7 @@ msgid "" "The scientists stopped their experiments on you abruptly, leaving you behind" " while they evacuated before lockdown. Find a way to escape or starve to " "death." -msgstr "" +msgstr "科學家們突然停止了對你的實驗,在實驗室封鎖之前就撤離了,把你遺棄在這裡。想辦法逃離這裡而且別餓死。" #. ~ Starting location for scenario 'Challenge - Lab Patient'. #. ~ Starting location for scenario 'Challenge - Lab Staff'. @@ -116345,13 +117223,13 @@ msgstr "上鎖的實驗室" #: lang/json/scenario_from_json.py msgctxt "scenario_male" msgid "Challenge - Lab Staff" -msgstr "" +msgstr "挑戰-實驗室員工" #. ~ Name for scenario 'Challenge - Lab Staff' for a female character #: lang/json/scenario_from_json.py msgctxt "scenario_female" msgid "Challenge - Lab Staff" -msgstr "" +msgstr "挑戰-實驗室員工" #. ~ Description for scenario 'Challenge - Lab Staff' for a male character. #: lang/json/scenario_from_json.py @@ -116359,7 +117237,7 @@ msgctxt "scen_desc_male" msgid "" "You were deemed non-essential and made to stay behind during the lab " "evacuation. Find a way to escape or starve to death." -msgstr "" +msgstr "你被當成無關緊要的人員,在實驗室疏散的時候被遺留在這裡。想辦法逃離這裡而且不要餓死。" #. ~ Description for scenario 'Challenge - Lab Staff' for a female character. #: lang/json/scenario_from_json.py @@ -116367,7 +117245,7 @@ msgctxt "scen_desc_female" msgid "" "You were deemed non-essential and made to stay behind during the lab " "evacuation. Find a way to escape or starve to death." -msgstr "" +msgstr "你被當成無關緊要的人員,在實驗室疏散的時候被遺留在這裡。想辦法逃離這裡而且不要餓死。" #. ~ Name for scenario 'Ambush' for a male character #: lang/json/scenario_from_json.py @@ -116478,13 +117356,13 @@ msgstr "封閉的避難所" #: lang/json/scenario_from_json.py msgctxt "scenario_male" msgid "Challenge - Abandoned" -msgstr "" +msgstr "挑戰-被遺棄者" #. ~ Name for scenario 'Challenge - Abandoned' for a female character #: lang/json/scenario_from_json.py msgctxt "scenario_female" msgid "Challenge - Abandoned" -msgstr "" +msgstr "挑戰-被遺棄者" #. ~ Description for scenario 'Challenge - Abandoned' for a male character. #: lang/json/scenario_from_json.py @@ -116550,13 +117428,13 @@ msgstr "監獄" #: lang/json/scenario_from_json.py msgctxt "scenario_male" msgid "Challenge - Island Prison" -msgstr "" +msgstr "挑戰-綠島小夜曲" #. ~ Name for scenario 'Challenge - Island Prison' for a female character #: lang/json/scenario_from_json.py msgctxt "scenario_female" msgid "Challenge - Island Prison" -msgstr "" +msgstr "挑戰-綠島小夜曲" #. ~ Description for scenario 'Challenge - Island Prison' for a male #. character. @@ -116567,6 +117445,7 @@ msgid "" " to make it outside the inner walls... Too bad it's located on a remote " "island, and now you need to find out how to escape it too." msgstr "" +"在大災變之前你就被關在高度戒備的監獄裡。你千方百計地終於翻出了內牆......太糟糕了,監獄竟然位於偏遠的島嶼上,現在你需要找到逃出生天的方法才行。" #. ~ Description for scenario 'Challenge - Island Prison' for a female #. character. @@ -116577,12 +117456,13 @@ msgid "" " to make it outside the inner walls... Too bad it's located on a remote " "island, and now you need to find out how to escape it too." msgstr "" +"在大災變之前你就被關在高度戒備的監獄裡。你千方百計地終於翻出了內牆......太糟糕了,監獄竟然位於偏遠的島嶼上,現在你需要找到逃出生天的方法才行。" #. ~ Starting location for scenario 'Challenge - Island Prison'. #: lang/json/scenario_from_json.py msgctxt "start_name" msgid "Island prison" -msgstr "" +msgstr "離島監獄" #. ~ Name for scenario 'Experiment' for a male character #: lang/json/scenario_from_json.py @@ -117417,7 +118297,7 @@ msgstr "武器" #: lang/json/skill_from_json.py msgid "spellcraft" -msgstr "" +msgstr "法術技藝" #. ~ Description for spellcraft #: lang/json/skill_from_json.py @@ -117426,6 +118306,7 @@ msgid "" "higher skill increases how quickly you can learn spells, and decreases their" " spell failure chance. You learn this skill by studying books or spells." msgstr "" +"你的奧術領域技能。包括魔法理論以及相關的一切。技能越高你學習法術的速度就越快,而且也降低法術失敗的機率。你能透過閱讀魔法書或是練習施法來提高此技能。" #: lang/json/snippet_from_json.py msgid "Fires can spread easily, especially with abundance of fuel." @@ -117457,7 +118338,7 @@ msgstr "冷凍食物可以保存更長時間。找一個涼快的地下室或者 #: lang/json/snippet_from_json.py msgid "Dying is part of the experience. Try again with what you've learned." -msgstr "" +msgstr "死亡是體驗的一部分。用你學到的東西再接再厲。" #: lang/json/snippet_from_json.py msgid "Frozen food? Put it by a fire or heat it up in a pan." @@ -117471,7 +118352,7 @@ msgstr "地底空間像地下室或者洞穴是整年都會保持涼爽。" msgid "" "Afraid of wildlife? Yell until it goes away. But beware of what comes " "instead." -msgstr "" +msgstr "害怕野生動物?一直大喊可以嚇走牠們。但要注意另外一種被你聲音吸引來的東西。" #: lang/json/snippet_from_json.py msgid "Animals and zombies are not friends. You can take advantage of that." @@ -117487,7 +118368,7 @@ msgstr "別跟困難對抗,為生存而逃跑並不可恥。" #: lang/json/snippet_from_json.py msgid "You don't have to sit next to fire to use it." -msgstr "" +msgstr "用火並不需要緊貼在火源旁邊。" #: lang/json/snippet_from_json.py msgid "Many items have special actions. Try to find out what they do." @@ -117504,17 +118385,17 @@ msgstr "如果你正在入侵某地方的話,請確定你也知道要怎樣離 #: lang/json/snippet_from_json.py msgid "" "There's usually more than one way to do things. Think outside the box." -msgstr "" +msgstr "方法通常部會只有一種,發揮你的創造性思考能力吧。" #: lang/json/snippet_from_json.py msgid "Survival order: shelter, water, food, then everything else." -msgstr "" +msgstr "生存要件:住所、水、食物,再來才是其他林林總總的事物。" #: lang/json/snippet_from_json.py msgid "" "Balance armor versus encumbrance. Even dropping a backpack can help in " "melee." -msgstr "" +msgstr "在護甲值與累贅值之間取得最好的平衡。即使只脫掉一個背包,也能對近戰有所助益。" #: lang/json/snippet_from_json.py msgid "" @@ -117535,7 +118416,7 @@ msgstr "沒太多東西能在一輛時速120英里的車輛下生存,你可以 #: lang/json/snippet_from_json.py msgid "" "Rotten food typically attracts bugs, and bugs got a lot bigger recently..." -msgstr "" +msgstr "腐爛的食物通常會吸引蟲子,只是最近的蟲子變大了..." #: lang/json/snippet_from_json.py msgid "" @@ -117550,12 +118431,12 @@ msgid "" msgstr "明智地使用你的地圖。 會找到你正需要的物品的掠奪地點應優先處理。" #: lang/json/snippet_from_json.py -msgid "Wounds heal over time. Bandages and disinfectant speeds that up." -msgstr "" +msgid "Wounds heal over time. Bandages and antiseptic speeds that up." +msgstr "隨著時間的推移,傷口會慢慢癒合。繃帶和消毒劑能提升癒合速度。" #: lang/json/snippet_from_json.py msgid "Don't get grabbed by zombies. Their bites can be infectious." -msgstr "" +msgstr "不要被殭屍抓住。被它們咬到可能會被感染。" #: lang/json/snippet_from_json.py msgid "" @@ -117570,11 +118451,11 @@ msgstr "吃得健康點,不然會損害你的健康,快餐只適合在危急 #: lang/json/snippet_from_json.py msgid "Nature can provide. You can live off the land if you learn how." -msgstr "" +msgstr "大自然是很慷慨大方的。如果你學會如何在這片土地上生活的話。" #: lang/json/snippet_from_json.py msgid "Raw food and water from unsafe sources can't be healthy. Right?" -msgstr "" +msgstr "生食和不明水源的水是不健康的。應該是吧?" #: lang/json/snippet_from_json.py msgid "Why walk when you can use a car? Or a tank?" @@ -117582,7 +118463,7 @@ msgstr "當你有一輛車,或者一輛坦克,為甚麼還要用走的?" #: lang/json/snippet_from_json.py msgid "Food from before the Cataclysm won't last forever. Keep that in mind." -msgstr "" +msgstr "大災變前的食物不會永遠保持新鮮。牢記在心。" #: lang/json/snippet_from_json.py msgid "" @@ -117612,7 +118493,7 @@ msgstr "濕透又生氣? 一條乾的毛巾會把你的笑容帶回來。" #: lang/json/snippet_from_json.py msgid "Like to gamble? Use mutagen! Be a winner today!" -msgstr "" +msgstr "喜歡賭博?使用突變劑!高雄發大財!" #: lang/json/snippet_from_json.py msgid "Smoking and napping is asking for more than a hole in your shirt." @@ -117620,13 +118501,13 @@ msgstr "在抽菸時打瞌睡的危險可不僅僅是在衣服上燒個洞那麼 #: lang/json/snippet_from_json.py msgid "You're on fire? Stop and wait to put it out." -msgstr "" +msgstr "你著火了嗎?停止行動並等待來撲滅火勢。" #: lang/json/snippet_from_json.py msgid "" "Why it's called chicken walker? Because you'll chicken out every time " "you'll see it." -msgstr "為甚麼它叫鳥足機械人 (chicken walker) ? 因為你每次見到它都會臨陣退縮 (chicken out)。" +msgstr "為什麼雙足步行機器人被叫做鳥足機器人?因為你每次遇到它都會覺得自己太鳥了。" #: lang/json/snippet_from_json.py msgid "Routine kills. Stay alert! Don't let your guard down." @@ -117694,7 +118575,7 @@ msgstr "\"這只是一道刮痕? \" 無論如何, 消毒並包紮可以加速癒 msgid "" "Broken limb pinned you down? Hospitals might have next-gen tech to get you " "going." -msgstr "" +msgstr "缺手缺腳讓你行動遲緩?醫院裡可能有次世代的科技能處理,值得你前去一探究竟。" #: lang/json/snippet_from_json.py msgid "" @@ -117706,7 +118587,7 @@ msgstr "不要害怕讓你自己的遊戲變得更容易。世界可以在建立 msgid "" "Don't get caught with your pants down. There's no toilet paper anymore " "anyway." -msgstr "" +msgstr "別被殭屍們嚇得屁滾尿流了。因為衛生紙這東西已不復存在了。" #: lang/json/snippet_from_json.py msgid "Terrain that slows you down will also slow down your enemies." @@ -117726,16 +118607,16 @@ msgstr "選擇不同角色,用職業跟場景來為你的遊戲增加趣味! #: lang/json/snippet_from_json.py msgid "A survivor saved is a friend earned. Most of the time..." -msgstr "" +msgstr "救了一個倖存者等於賺到一個朋友,多數情況下..." #: lang/json/snippet_from_json.py msgid "" "Learning how to play? Visit the keybindings menu and learn your ropes." -msgstr "" +msgstr "想學怎麼玩?看看熱鍵設定選單,學會所有基本的操作方式吧。" #: lang/json/snippet_from_json.py msgid "Expect the unexpected, even if it's the Spanish Inquisition." -msgstr "" +msgstr "防患於未然,即使老大跟你保證五十年不變。(原文為西班牙宗教裁判所)" #: lang/json/snippet_from_json.py msgid "" @@ -117747,17 +118628,17 @@ msgstr "你可以在身處角落偷看時投擲物品,非常適合用來破壞 msgid "" "Nobody told the vending machines that the world ended. Save those cash " "cards!" -msgstr "" +msgstr "可沒人告訴那些自動販賣機說世界末日到了。蒐集那些現金卡!" #: lang/json/snippet_from_json.py msgid "" "There's got to be some cool stuff in those top-secret underground labs, " "right?" -msgstr "" +msgstr "那些最高機密的地下實驗室一定有一些很酷的東西,應該吧?" #: lang/json/snippet_from_json.py msgid "Put a funnel over a jug or barrel to collect rainwater over time." -msgstr "" +msgstr "將漏斗放在壺或桶上,隨著時間流動能收集雨水。" #: lang/json/snippet_from_json.py msgid "" @@ -117768,7 +118649,7 @@ msgstr "在城市裡的殭屍非常多但有限,你 (最終) 可以把牠們 #: lang/json/snippet_from_json.py msgid "" "Did you *only* take everything not nailed down? Go back for the nails!" -msgstr "" +msgstr "你是不是只拿沒被釘子釘住的東西?回去拿那些釘子!" #: lang/json/snippet_from_json.py msgid "You can make your own Safe Mode rules in the pause menu." @@ -117787,7 +118668,7 @@ msgstr "絕大部份殭屍會直接穿過車輛,而不是繞過。在逃走時 #: lang/json/snippet_from_json.py msgid "" "If you're stuck inside with a broken leg, read some books to pass the time." -msgstr "" +msgstr "如果你腿斷了困在室內,何不在等待痊癒的時間內閱覽群書。" #: lang/json/snippet_from_json.py msgid "Certain corpses can give you bionics if you dissect them." @@ -117799,7 +118680,7 @@ msgstr "別太貪心,你死了的話戰利品就不再重要了。" #: lang/json/snippet_from_json.py msgid "The floor is too hard to sleep on? Try gathering a pile of leaves." -msgstr "" +msgstr "地板太硬睡不著?試試看收集一堆樹葉。" #: lang/json/snippet_from_json.py msgid "This is a test of the sign snippet system" @@ -117817,7 +118698,7 @@ msgstr "這應該會重複同一個城市幾次: , , " #: lang/json/snippet_from_json.py msgid "Leave No Trace." -msgstr "" +msgstr "絕對嚴禁留下痕跡。" #: lang/json/snippet_from_json.py msgid "Plan Ahead and Prepare." @@ -117825,7 +118706,7 @@ msgstr "提前計劃和準備。" #: lang/json/snippet_from_json.py msgid "Travel and Camp on Durable Surfaces." -msgstr "" +msgstr "在結實的地面上行走跟露營。" #: lang/json/snippet_from_json.py msgid "Dispose of Waste Properly." @@ -117841,15 +118722,15 @@ msgstr "盡量減少營火影響。" #: lang/json/snippet_from_json.py msgid "Respect Wildlife." -msgstr "" +msgstr "尊重野生動物。" #: lang/json/snippet_from_json.py msgid "Be Considerate of Other Visitors." -msgstr "" +msgstr "關心其他來訪的人。" #: lang/json/snippet_from_json.py msgid "WARNING! BEAR COUNTRY." -msgstr "" +msgstr "警告!熊的國度。" #: lang/json/snippet_from_json.py msgid "For hiking, skiing, and enjoying nature." @@ -117861,31 +118742,33 @@ msgstr "請逗留一會。" #: lang/json/snippet_from_json.py msgid "No motorized vehicles." -msgstr "" +msgstr "非電動車輛" #: lang/json/snippet_from_json.py msgid "DANGER. HIGH FIRE HAZARD AREA. NO OPEN FIRE. NO SMOKING." -msgstr "" +msgstr "危險。火災高風險區。嚴禁煙火。禁止抽菸。" #: lang/json/snippet_from_json.py msgid "No Overnight Camping." -msgstr "" +msgstr "不准露營過夜" #: lang/json/snippet_from_json.py msgid "I left my wallet in " -msgstr "" +msgstr "我把錢包遺留在" #: lang/json/snippet_from_json.py msgid " + forever" -msgstr "" +msgstr " + 永遠" #: lang/json/snippet_from_json.py msgid "N = R * fp * ne * fl * fi * fc * L drake was right" msgstr "" +"N = R * fp * ne * fl * fi * fc * L " +"德雷克是對的!(譯註:前面是德雷克公式-計算可能與我們接觸的銀河系內外星球高智文明的數量的公式)" #: lang/json/snippet_from_json.py msgid "kilroy was here" -msgstr "" +msgstr "「齊天大聖到此一遊」(原文為「吉佬兒到此一遊」)" #: lang/json/snippet_from_json.py msgid "" @@ -117939,7 +118822,7 @@ msgid "" "Rubber boots aren't as tough as combat boots and you don't run very fast in " "them. But I've seen zombies vomiting puddles of acid, and I'd hate to have " "my feet melt off, so I'd consider having a pair of those." -msgstr "" +msgstr "橡膠靴不像戰鬥靴那麼堅韌,而且穿著它你跑不快。但我看到殭屍嘔吐酸液的水坑,我很不想讓我的腳融化掉,所以我考慮要有一雙橡膠靴。" #: lang/json/snippet_from_json.py msgid "" @@ -118284,8 +119167,8 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "" -"If you have extra disinfectant, use it to disinfect your wounds, even if " -"they aren't infected. They will recover faster that way." +"If you have extra antiseptic, use it to disinfect your wounds, even if they " +"aren't infected. They will recover faster that way." msgstr "" #: lang/json/snippet_from_json.py @@ -118874,7 +119757,7 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "I hate thorazine!" -msgstr "" +msgstr "我討厭抗精神異常藥!" #: lang/json/snippet_from_json.py msgid "Arg thorazine, don't touch it!" @@ -118926,11 +119809,11 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "I don't want to trade with you." -msgstr "" +msgstr "我不想跟你交易。" #: lang/json/snippet_from_json.py msgid "I have the best stuff. And I'm keeping it!" -msgstr "" +msgstr "我有最好的東西。而且我會留著它!" #: lang/json/snippet_from_json.py msgid "No trading, that's my rule." @@ -118938,7 +119821,7 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "I'm not interested." -msgstr "" +msgstr "沒興趣。" #: lang/json/snippet_from_json.py msgid "How about no?" @@ -118946,7 +119829,7 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "No thanks, I really don't feel like it." -msgstr "" +msgstr "不,謝謝,我真的不喜歡它。" #: lang/json/snippet_from_json.py msgid "Well, I would, but I don't want to right now." @@ -118958,7 +119841,7 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "I'll pass, it's too much work." -msgstr "" +msgstr "我不要,太費事了。" #: lang/json/snippet_from_json.py msgid "Who put you in charge of what I do?" @@ -121080,7 +121963,7 @@ msgstr "呃, 腐敗的臭味!" #: lang/json/snippet_from_json.py msgid "" -msgstr "" +msgstr "" #: lang/json/snippet_from_json.py msgid "I need some batteries to power my CBMs." @@ -121459,11 +122342,11 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "child" -msgstr "" +msgstr "小孩" #: lang/json/snippet_from_json.py msgid "my child" -msgstr "" +msgstr "我的孩子" #: lang/json/snippet_from_json.py msgid "dear" @@ -121471,11 +122354,11 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "my dear" -msgstr "" +msgstr "親愛的" #: lang/json/snippet_from_json.py msgid " will use ranged weapons." -msgstr "" +msgstr " 將使用遠程武器。" #: lang/json/snippet_from_json.py msgid " will not use ranged weapons." @@ -121483,11 +122366,11 @@ msgstr "" #: lang/json/snippet_from_json.py msgid " will use grenades." -msgstr "" +msgstr " 會使用手榴彈。" #: lang/json/snippet_from_json.py msgid " will not use grenades." -msgstr "" +msgstr " 不會使用手榴彈。" #: lang/json/snippet_from_json.py msgid " will only use silenced ranged weapons." @@ -121495,7 +122378,7 @@ msgstr "" #: lang/json/snippet_from_json.py msgid " will use any ranged weapons." -msgstr "" +msgstr " 將會使用任何遠距武器。" #: lang/json/snippet_from_json.py msgid " will avoid shooting if allies are in the line of fire." @@ -121503,67 +122386,67 @@ msgstr "" #: lang/json/snippet_from_json.py msgid " will shoot even if allies are in the line of fire." -msgstr "" +msgstr " 即使同伴在火線上也會開槍。" #: lang/json/snippet_from_json.py msgid "* will pick up items." -msgstr "" +msgstr "* 會撿拾物品。" #: lang/json/snippet_from_json.py msgid "* will only pick up items from the whitelist." -msgstr "" +msgstr "* 只會撿取白名單所條列的物品。" #: lang/json/snippet_from_json.py msgid "* will not pick up items." -msgstr "" +msgstr "* 不會撿拾物品。" #: lang/json/snippet_from_json.py msgid " will bash down obstacles." -msgstr "" +msgstr " 會打壞障礙物。" #: lang/json/snippet_from_json.py msgid " will not bash down obstacles." -msgstr "" +msgstr " 不會打壞障礙物。" #: lang/json/snippet_from_json.py msgid " will sleep when tired." -msgstr "" +msgstr " 疲累的時候會睡覺。" #: lang/json/snippet_from_json.py msgid " will stay awake as long as possible." -msgstr "" +msgstr " 會盡量保持清醒。" #: lang/json/snippet_from_json.py msgid " will complain about wounds and needs." -msgstr "" +msgstr " 會抱怨傷口跟需求。" #: lang/json/snippet_from_json.py msgid " will only complain in an emergency." -msgstr "" +msgstr " 只有在緊急情況下才會抱怨。" #: lang/json/snippet_from_json.py msgid " will smash nearby zombie corpses." -msgstr "" +msgstr " 會砸爛附近的殭屍屍體。" #: lang/json/snippet_from_json.py msgid " will leave zombie corpses intact." -msgstr "" +msgstr " 將保持殭屍屍體完整。" #: lang/json/snippet_from_json.py msgid " will close doors after passing through." -msgstr "" +msgstr " 會隨手關門。" #: lang/json/snippet_from_json.py msgid " will not close doors." -msgstr "" +msgstr " 不會隨手關門。" #: lang/json/snippet_from_json.py msgid " will follow you closely even when threatened." -msgstr "" +msgstr " 將緊緊跟隨你,不論是否面臨威脅。" #: lang/json/snippet_from_json.py msgid " will move freely as needed." -msgstr "" +msgstr " 在必要時會自由移動。" #: lang/json/snippet_from_json.py msgid " will follow you at about two paces." @@ -121575,11 +122458,11 @@ msgstr "" #: lang/json/snippet_from_json.py msgid " will not go places that require opening a door." -msgstr "" +msgstr " 不會移動到需要開門進出的地方。" #: lang/json/snippet_from_json.py msgid " will open doors to reach a destination." -msgstr "" +msgstr " 將會在前進途中有開門的動作。" #: lang/json/snippet_from_json.py msgid "" @@ -121601,11 +122484,11 @@ msgstr "" #: lang/json/snippet_from_json.py msgid " will not engage enemies if avoidable." -msgstr "" +msgstr " 會盡量避免跟敵人交戰。" #: lang/json/snippet_from_json.py msgid " will follow normal engagement rules." -msgstr "" +msgstr " 會遵守一般的交戰守則。" #: lang/json/snippet_from_json.py msgid "" @@ -124611,13 +125494,6 @@ msgstr "" "藥物使用率攀升: 最近研究指出在過去兩年中藥物的使用量攀升了 40%。\"人們對工作、國家甚至是自己的生命感到害怕, 所以他們轉而尋求藥物的慰藉。\" " "一名專家如此評論。" -#: lang/json/snippet_from_json.py -msgid "" -"WAR ON DRUGS DEAD: The government has finally reacted to long accumulated " -"evidence that suggests that decriminalized drugs cause fewer health problems" -" and are generally better managed while providing valuable tax revenues." -msgstr "藥物抗爭結束: 根據長久以來的實驗證明與記錄, 政府終於認同藥物合法化可使民眾健康問題降低, 變得較好管理且可提供穩定的稅收。" - #: lang/json/snippet_from_json.py msgid "" "FEELING BLUE? Try \"Greens\" for Magazines! Your local Supermarket! " @@ -126384,7 +127260,7 @@ msgstr "\"哈囉? \"" #: lang/json/speech_from_json.py msgid "\"Papaya!\"" -msgstr "" +msgstr "\"木瓜!\"" #: lang/json/speech_from_json.py msgid "\"Who's there?\"" @@ -129140,7 +130016,7 @@ msgstr "監獄" #: lang/json/start_location_from_json.py msgid "Island prison" -msgstr "" +msgstr "離島監獄" #: lang/json/start_location_from_json.py msgid "Hermit Shack" @@ -129231,6 +130107,8 @@ msgid "" "I'm my own person, but I'm willing to follow your lead. I can do a lot of things for you: I can fight, I can train you or you can train me, I can carry stuff, I can bandage your wounds, I can build faction camps, I can go places, I can guard things, I can use some bionics, I can even chit-chat with you or give you tips or talk about my background. You can give me instructions in conversation or by radio or shout commands at me.\n" " What do you want to know more about?" msgstr "" +"我是個獨立的個體,但我願意追隨你的領導。我可以為你做很多事情:我可以戰鬥,我可以訓練你,或者你可以訓練我,我可以攜帶東西,我可以包紮你的傷口,我可以建立陣營營寨,我可以去別的地方,我可以守衛東西 ,我可以使用一些生化插件,我甚至可以跟你閒聊、或給你提示、或談論我的背景。你可以透過對話、使用無線電、或喊出命令來給我行動指令。\n" +"   你想了解更多關於什麼的資訊?" #: lang/json/talk_topic_from_json.py msgid "Forget I asked." @@ -129270,7 +130148,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "Tell me about faction camps." -msgstr "" +msgstr "跟我聊聊陣營營寨。" #: lang/json/talk_topic_from_json.py msgid "What do you mean, you can go places?" @@ -129372,8 +130250,7 @@ msgid "" "Bionics are augmentation packages, right? They come in these installable Compact Bionic Modules or CBMs, and I can use some CBMs - if you examine a CBM, it will tell you if I can use it.\n" " Find a programmable surgical installer or autodoc, position me on the couch, and activate it, and you can install a suitable CBM to me - or if I think I'll do a better job, I'll do. I'll take over installing CBMs into you if I'm better at it.\n" " I can use almost all passive bionics and some active bionics. If I have any active bionics, I'll try to use them sensibly, but if we're in danger, I'm going to activate anything that might give me an edge. I'll use any weapon bionics if they're better than the weapons you gave me, but if you think I should reserve my bionic energy for my defensive and healing bionics, you can tell me how much to reserve. I'll try to keep my bionic energy topped off, but if we're running low on supplies, you can tell me to stop recharging when I'm not full.\n" -" I'll tell you if I'm low on bionic energy and can't recharge, and what fuel I need.\n" -" Sothere are some internal atomic reactor bionics - I can use those, but I can only recharge them with plutonium slurry. That stuff is radioactive, so do us both a favor and don't give me an internal reactor unless you really like glowing in the dark." +" I'll tell you if I'm low on bionic energy and can't recharge, and what fuel I need." msgstr "" #: lang/json/talk_topic_from_json.py @@ -129553,11 +130430,11 @@ msgid "Go back to sleep." msgstr "回去睡覺。" #: lang/json/talk_topic_from_json.py -msgid " *pshhhttt* I'm reading you boss, over." +msgid "What is it, friend?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "What is it, friend?" +msgid " *pshhhttt* I'm reading you boss, over." msgstr "" #: lang/json/talk_topic_from_json.py @@ -129570,7 +130447,7 @@ msgstr "你可以教我些東西嗎?" #: lang/json/talk_topic_from_json.py msgid "Let's trade items" -msgstr "" +msgstr "我們來交易吧。" #: lang/json/talk_topic_from_json.py msgid "Guard this position." @@ -129582,7 +130459,7 @@ msgstr "我想更了解你一點…" #: lang/json/talk_topic_from_json.py msgid "I want you to use this item." -msgstr "" +msgstr "我想要你使用這個物品。" #: lang/json/talk_topic_from_json.py msgid "Let's talk about your current activity." @@ -129590,7 +130467,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "Hold on to this item." -msgstr "" +msgstr "拿著這個物品。" #: lang/json/talk_topic_from_json.py msgid "Miscellaneous rules..." @@ -129622,7 +130499,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "Let's talk about faction camps." -msgstr "" +msgstr "我們來談談陣營營寨。" #: lang/json/talk_topic_from_json.py msgid "Change your engagement rules..." @@ -129796,11 +130673,11 @@ msgid "Show me what needs to be done at the camp." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I'm currently ." +msgid "I'm not doing much currently." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "I'm not doing much currently." +msgid "I'm currently ." msgstr "" #: lang/json/talk_topic_from_json.py @@ -129855,13 +130732,13 @@ msgid "OK, maybe it'll stop me from freezing in this weather, what's up?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "" -"Well, it's the time of day for a quick break surely! How are you holding " -"up?" +msgid "Man it's dark out isn't it? what's up?" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Man it's dark out isn't it? what's up?" +msgid "" +"Well, it's the time of day for a quick break surely! How are you holding " +"up?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -129870,14 +130747,14 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"Definitely, by the way, thanks for helping me so much with my tasks! " -"Anyway, you coping OK, ? " +"OK, let's take a moment, oh, and thanks for helping me with that thing, " +"so... what's up?" msgstr "" #: lang/json/talk_topic_from_json.py msgid "" -"OK, let's take a moment, oh, and thanks for helping me with that thing, " -"so... what's up?" +"Definitely, by the way, thanks for helping me so much with my tasks! " +"Anyway, you coping OK, ? " msgstr "" #: lang/json/talk_topic_from_json.py @@ -129896,7 +130773,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "Fair enough." -msgstr "" +msgstr "很公平。" #: lang/json/talk_topic_from_json.py msgid "Another survivor! We should travel together." @@ -129951,14 +130828,14 @@ msgstr "很好, 別突然亂動…" msgid "Keep your distance!" msgstr "保持你的距離!" -#: lang/json/talk_topic_from_json.py -msgid "" -msgstr "" - #: lang/json/talk_topic_from_json.py msgid "This is my territory, ." msgstr "這是我的地盤,。" +#: lang/json/talk_topic_from_json.py +msgid "" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Calm down. I'm not going to hurt you." msgstr "冷靜點。我不會傷害你。" @@ -130011,14 +130888,6 @@ msgstr "怎麼了?" msgid "I don't care." msgstr "我不在乎。" -#: lang/json/talk_topic_from_json.py -msgid "I don't have any jobs for you." -msgstr "我沒有可以給你的工作。" - -#: lang/json/talk_topic_from_json.py -msgid "I don't have any more jobs for you." -msgstr "我已經沒有可以給你辦的工作了。" - #: lang/json/talk_topic_from_json.py msgid "I have other jobs for you. Want to hear about them?" msgstr "" @@ -130027,13 +130896,21 @@ msgstr "" msgid "I have more jobs for you. Want to hear about them?" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "I just have one job for you. Want to hear about it?" +msgstr "我只有一件工作給你。想要聽看看嗎?" + #: lang/json/talk_topic_from_json.py msgid "I have another job for you. Want to hear about it?" msgstr "我有另一件工作給你。想要聽看看嗎?" #: lang/json/talk_topic_from_json.py -msgid "I just have one job for you. Want to hear about it?" -msgstr "我只有一件工作給你。想要聽看看嗎?" +msgid "I don't have any more jobs for you." +msgstr "我已經沒有可以給你辦的工作了。" + +#: lang/json/talk_topic_from_json.py +msgid "I don't have any jobs for you." +msgstr "我沒有可以給你的工作。" #: lang/json/talk_topic_from_json.py lang/json/talk_topic_from_json.py #: src/npctalk.cpp @@ -130045,16 +130922,16 @@ msgid "Never mind, I'm not interested." msgstr "別在意, 我沒興趣。" #: lang/json/talk_topic_from_json.py -msgid "You're not working on anything for me now." -msgstr "" +msgid "What about it?" +msgstr "這樣如何?" #: lang/json/talk_topic_from_json.py msgid "Which job?" msgstr "哪件工作?" #: lang/json/talk_topic_from_json.py -msgid "What about it?" -msgstr "這樣如何?" +msgid "You're not working on anything for me now." +msgstr "" #: lang/json/talk_topic_from_json.py msgid "I'll do it!" @@ -130110,7 +130987,7 @@ msgstr "還沒。我會繼續找, 再見!" #: lang/json/talk_topic_from_json.py msgid "Yup! Here it is!" -msgstr "" +msgstr "對!就在這!" #: lang/json/talk_topic_from_json.py msgid "We're here!" @@ -130172,7 +131049,7 @@ msgstr "不如給點東西作為報酬?" #: lang/json/talk_topic_from_json.py msgid "Maybe you can teach me something as payment?" -msgstr "" +msgstr "也許你可以教我一些技能當做報酬?" #: lang/json/talk_topic_from_json.py msgid "Glad to help. I need no payment. Bye!" @@ -130542,7 +131419,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "Smart choice." -msgstr "" +msgstr "選得好" #: lang/json/talk_topic_from_json.py msgid ", and if you ask again, !" @@ -130566,13 +131443,13 @@ msgstr "好吧, 好, 再見。" #: lang/json/talk_topic_from_json.py msgid "Okay" -msgstr "" +msgstr "好的" #: lang/json/talk_topic_from_json.py msgid "" "I'm willing to pay per batch for a total of " "." -msgstr "" +msgstr "每批量我會支付 ,總值 。" #: lang/json/talk_topic_from_json.py msgid "Works for me." @@ -130691,23 +131568,23 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "Suit yourself." -msgstr "" +msgstr "隨便你。" #: lang/json/talk_topic_from_json.py msgid "What about faction camps?" -msgstr "" +msgstr "關於陣營營寨?" #: lang/json/talk_topic_from_json.py msgid "Tell me how faction camps work." -msgstr "" +msgstr "告訴我陣營營寨如何運作。" #: lang/json/talk_topic_from_json.py msgid "Tell me how faction camps have changed." -msgstr "" +msgstr "跟我說說陣營營寨有甚麼變化。" #: lang/json/talk_topic_from_json.py msgid "I want you to build a camp here." -msgstr "" +msgstr "我要你在這裡建立一個營寨。" #: lang/json/talk_topic_from_json.py msgid "Nothing. Let's talk about something else." @@ -130726,27 +131603,27 @@ msgid "" "The faction camp system is designed to give you greater control over your " "companions by allowing you to assign them to their own missions. These " "missions can range from gathering and crafting to eventual combat patrols." -msgstr "" +msgstr "陣營營寨系統設計成讓你能透過分配同伴們進行各人專屬的任務,更佳地控制他們。這些任務的範圍從收集與製作,到最終的戰鬥巡邏。" #: lang/json/talk_topic_from_json.py msgid "Go on." -msgstr "" +msgstr "繼續。" #: lang/json/talk_topic_from_json.py msgid "Never mind, let's go back to talking about camps." -msgstr "" +msgstr "沒關係,我們回頭來說營寨的事吧。" #: lang/json/talk_topic_from_json.py msgid "Never mind, let's talk about other things you can do." -msgstr "" +msgstr "沒關係,我們聊聊你能做什麼別的事。" #: lang/json/talk_topic_from_json.py msgid "Never mind, let's talk about something else." -msgstr "" +msgstr "沒關係,我們談點別的吧。" #: lang/json/talk_topic_from_json.py msgid "Forget it. Let's go." -msgstr "" +msgstr "算了,我們走吧。" #: lang/json/talk_topic_from_json.py msgid "" @@ -130757,10 +131634,11 @@ msgid "" "reputation across the faction. Which can lead to VERY bad things if it gets" " too low." msgstr "" +"每次任務都需要或生產食物。需要一段固定時間的任務將要求你提前支付食物,而重複性的任務,例如收集木柴,將在完成任務後支付。沒有支付同伴所需的食物將導致整個陣營的聲譽受損。如果陣營聲譽太低,會導致非常糟糕的事情發生。" #: lang/json/talk_topic_from_json.py msgid "Wait, repeat what you said." -msgstr "" +msgstr "等等,你剛剛說什麼?" #: lang/json/talk_topic_from_json.py msgid "" @@ -130768,6 +131646,9 @@ msgid "" "The task list shows tasks for the central camp. If you have expansions, you can hit 'TAB' to move between the central camp and each expansion and see the tasks for the expansions. \n" "If you have a two way radio, you can use it to assign tasks remotely to any friendly NPC who also has a two way radio." msgstr "" +"每個陣營營寨都有一個關聯的告示牌。你可以按 e(檢查)告示牌,顯示可以進行的任務列表,以及該營寨目前已經完成的項目。你可以選擇任務並選擇同伴 NPC 來執行。\n" +"任務列表顯示的是營寨中央區塊的項目。如果你有擴建營寨的話,你可以按 TAB 鍵切換營寨的各個區塊,看看各擴建營區所能進行的任務項目。\n" +"如果你有雙向無線電,你可以使用它將任務遠程分配給任何也有雙向無線電的同伴 NPC。" #: lang/json/talk_topic_from_json.py msgid "" @@ -130777,6 +131658,8 @@ msgid "" "don't have to be too picky, you can build as many camps as you want. You " "need a friendly NPC to perform tasks at the camp." msgstr "" +"建立你的第一個營寨,必須選擇在相鄰的八格區塊中有平原,並且周圍有很多森林的地點。在早期的遊戲中,森林是建築材料的主要來源,而平原可以開發農業。你不必太過挑剔地點,因為你可以建立無數個營寨。你需要一個友善的" +" NPC 在營寨執行任務。" #: lang/json/talk_topic_from_json.py msgid "" @@ -130789,6 +131672,8 @@ msgid "" " to send companions to recruit new members, build overmap fortifications, or" " even conduct combat patrols" msgstr "" +"選好地點後,你需要搜尋或製作材料來升級營寨,這樣才能解鎖新的任務項目。起頭的幾個任務最好著重在收集材料,這樣你就不用自己去收集材料來升級營寨。經過兩到三次升級後,你將可以分派" +" [雜務] 任務,允許你指派同伴將你營寨周圍的物品進行分類堆放。之後的升級將允許你派遣同伴招募新成員,建立大地圖上的要塞,甚至進行戰鬥巡邏" #: lang/json/talk_topic_from_json.py msgid "" @@ -130805,10 +131690,14 @@ msgid "" "can build an additional expansion every other level after the first is " "unlocked and when one camp is full you can just as easily build another." msgstr "" +"當你升級第一個帳篷後,將解鎖擴建的功能。擴建營寨區塊後,你可以針對每個營區進行所需的特定產業建設。對於想要擁有一個大陣營的玩家,建議優先建設 [農場] " +",而對於那些只想要讓 NPC 去做所有的烹飪工作來改善生活品質的玩家, [廚房] 是更好的選擇。[修車廠] " +"的拆解車輛任務可以讓你把車輛拆解成大量的零件和資源。這些資源全都可以在 [鐵匠鋪] " +"中製作成更有價值的設備。在第一個擴建解鎖後,每增建一次中央營區,你就可以再擴建新的營區,當一個營寨全部建設完畢後,你可以輕易地再去建立另一個營寨。" #: lang/json/talk_topic_from_json.py msgid "Thanks, let's go back to talking about camps." -msgstr "" +msgstr "謝謝,我們回頭來說營寨的事吧。" #: lang/json/talk_topic_from_json.py msgid "" @@ -130818,6 +131707,11 @@ msgid "" "3. Faction camps used to upgrade by completely redrawing the map. Damage to the camp would be replaced when the camp was upgraded. Now upgrades only change the actual area being upgraded, and you will have to repair damage to the camp yourself.\n" "4. There used to be a single path for upgrading the main camp. Now, after you have completed the first tent, you will have many options for your next upgrade, and you can have different companions working on different upgrades of the main camp at the same time." msgstr "" +"\n" +"1. 陣營營寨原本要求第二個NPC來當營地經理與監督者,但這已經被營寨告示牌和雙向無線電取代了。\n" +"2. 原本如果在同一張地圖上有車輛,甚至只是購物車,是不可能升級陣營營寨的。現在你已經可以在地圖上有車輛的情況下升級營寨,即使升級了也不會改變車輛所在格的地表地貌。\n" +"3. 陣營營寨原本以完全重繪地圖的方式來進行升級。營寨升級後,損壞的建築將重新代換。現在升級只會改變升級的實際區域,你必須自行修復原本已經損壞的部分。\n" +"4. 原本只有一種方式可以升級營寨中央主營區。現在,在你建立第一個帳篷之後,將有許多選項讓你進行升級,並且你可以讓不同的同伴同時去處理主營區的不同升級任務。" #: lang/json/talk_topic_from_json.py msgid "" @@ -130826,52 +131720,53 @@ msgid "" "more. We could put up a bulletin board and you could write up what you want " "done there. What do you say?" msgstr "" +"嘿!老大。我在想,你真的不需要讓我坐在這個帳篷裡,這不是真正為營寨做出貢獻。這工作太簡單了,我可以做更多事情。我們可以設置一個營寨告示牌,你可以寫下你想要我們做的事情。你說好不好?" #: lang/json/talk_topic_from_json.py msgid "What needs to be done?" -msgstr "" +msgstr "需要做些什麼?" #: lang/json/talk_topic_from_json.py msgid "Yes, set up the bulletin board and then go back to normal duties." -msgstr "" +msgstr "好,設置營寨告示牌,然後繼續正常工作。" #: lang/json/talk_topic_from_json.py msgid "" -msgstr "" +msgstr "" #: lang/json/talk_topic_from_json.py msgid "Mind if we just chat for a bit?" -msgstr "" +msgstr "我們來閒聊一下好嗎?" #: lang/json/talk_topic_from_json.py msgid "" "Are you sure? This doesn't seem like a particularly safe place for small " "talk..." -msgstr "" +msgstr "你確定嗎?這裡看起來不太安全呢,不太適合閒聊..." #: lang/json/talk_topic_from_json.py msgid "It's fine, we've got a moment." -msgstr "" +msgstr "沒關係,我們還有時間。" #: lang/json/talk_topic_from_json.py msgid "Good point, let's find a more appropriate place." -msgstr "" +msgstr "好想法,讓我們找一個更合適的地方。" #: lang/json/talk_topic_from_json.py msgid "You're right. Forget I said anything, let's get moving." -msgstr "" +msgstr "你是對的。忘掉我說的,讓我們動起來吧。" #: lang/json/talk_topic_from_json.py msgid "What did you want to talk about?" -msgstr "" +msgstr "你想談什麼?" #: lang/json/talk_topic_from_json.py msgid "Actually, never mind." -msgstr "" +msgstr "其實,沒關係。" #: lang/json/talk_topic_from_json.py msgid "Yes, friend?" -msgstr "" +msgstr "是的,朋友?" #: lang/json/talk_topic_from_json.py msgid "Your travels be fruitful, friend." @@ -130938,15 +131833,15 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "Alright." -msgstr "" +msgstr "好的。" #: lang/json/talk_topic_from_json.py msgid "Can I join you?" -msgstr "" +msgstr "我能加入你們嗎?" #: lang/json/talk_topic_from_json.py msgid "Understood. Can I join you?" -msgstr "" +msgstr "了解。我能加入你們嗎?" #: lang/json/talk_topic_from_json.py msgid "Well, I gotta go." @@ -135528,7 +136423,7 @@ msgid "All right! Let's get going." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "We've done it! We've solved the list!" +msgid "Have I told you about cardboard, friend? Do you have any?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -135537,7 +136432,7 @@ msgid "" msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Have I told you about cardboard, friend? Do you have any?" +msgid "We've done it! We've solved the list!" msgstr "" #: lang/json/talk_topic_from_json.py @@ -139050,7 +139945,7 @@ msgstr "有辦法讓我加入你們的隊伍嗎?" #: lang/json/talk_topic_from_json.py msgid "What's with these beggars?" -msgstr "" +msgstr "那些乞丐是甚麼一回事?" #: lang/json/talk_topic_from_json.py msgid "I took care of your beggar problem." @@ -139066,7 +139961,7 @@ msgstr "我想你可能正在尋找一些幫助…" #: lang/json/talk_topic_from_json.py msgid "Well, I'd better be going. Bye." -msgstr "" +msgstr "我想我要走了,再見。" #: lang/json/talk_topic_from_json.py msgid "Welcome marshal..." @@ -139821,6 +140716,10 @@ msgstr "" msgid "What the hell were you testing out there?" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "So, about that protective gear?" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "No. Now leave." msgstr "" @@ -139836,6 +140735,21 @@ msgid "" "Shame about what happened, with the evisceration and all..." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"Given the current context, we are willing to sell you a set of our protective gear: gas mask, suit and gear, at a considerable discount. We will sell it for two of our coins.\n" +"\n" +"the intercom: Hmm wait, we might not have your size..." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "[ 2 Hub 01 Gold Coins ] Deal!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I have to give it a thought." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Just leave." msgstr "" @@ -141361,7 +142275,7 @@ msgstr "" #: lang/json/technique_from_json.py #, python-format msgid "You lash out at %s with a Dragon Claw" -msgstr "" +msgstr "你用龍爪猛擊 %s " #: lang/json/technique_from_json.py #, python-format @@ -141370,7 +142284,7 @@ msgstr "" #: lang/json/technique_from_json.py msgid "Dragon Vortex Block" -msgstr "" +msgstr "龍漩格擋" #: lang/json/technique_from_json.py #, python-format @@ -141384,12 +142298,12 @@ msgstr "" #: lang/json/technique_from_json.py msgid "Dragon Wing Dodge" -msgstr "" +msgstr "龍翼閃避" #: lang/json/technique_from_json.py #, python-format msgid "You dodge the attack and leave %s off balance" -msgstr "" +msgstr "你閃開了攻擊並令 %s 失衡" #: lang/json/technique_from_json.py #, python-format @@ -141398,12 +142312,12 @@ msgstr "" #: lang/json/technique_from_json.py msgid "Dragon Tail" -msgstr "" +msgstr "龍尾" #: lang/json/technique_from_json.py #, python-format msgid "You sweep %s with a quick Dragon Tail" -msgstr "" +msgstr "你以快速的龍尾掃擊 %s " #: lang/json/technique_from_json.py #, python-format @@ -141560,6 +142474,86 @@ msgstr "" msgid " delivers a perfect riposte to %s" msgstr "" +#: lang/json/technique_from_json.py +msgid "Displace and Hook" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You parry and hook %s down" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " parries and hooks %s down" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "High Round Strike" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You swing high and strike at %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " swings high and strikes %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "High Round Feint" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You fake a high round strike at %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " feints at %s" +msgstr " 對著 %s 佯攻" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab you, but you push away!" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "The %s tries to grab , but they push away!" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Hook and Drag" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You hook and drag %s down" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " hooks and drags %s down" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Colpo di Grazia" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You swing down hard and execute %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " swings down hard and executes %s" +msgstr "" + #: lang/json/technique_from_json.py msgid "quick punch" msgstr "速拳" @@ -141737,11 +142731,6 @@ msgstr "佯攻" msgid "You feint at %s" msgstr "你對著 %s 佯攻" -#: lang/json/technique_from_json.py -#, python-format -msgid " feints at %s" -msgstr " 對著 %s 佯攻" - #: lang/json/technique_from_json.py #, python-format msgid "You jab %s" @@ -142190,57 +143179,6 @@ msgstr "" msgid " receives %s's attack, and counters" msgstr "" -#: lang/json/technique_from_json.py -msgid "Displace and Hook" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You parry %s attack and hook them down" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid " parries %s attack and hooks them down" -msgstr "" - -#: lang/json/technique_from_json.py -msgid "High Round Strike" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You swing high and strike at %s" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid " swings high and strikes %s" -msgstr "" - -#: lang/json/technique_from_json.py -msgid "High Round Feint" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You fake a high round strike at %s" -msgstr "" - -#: lang/json/technique_from_json.py -msgid "High Round Stab" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid "You quickly stab %s" -msgstr "" - -#: lang/json/technique_from_json.py -#, python-format -msgid " quickly stabs %s" -msgstr "" - #: lang/json/technique_from_json.py msgid "grab and pommel strike" msgstr "" @@ -143908,6 +144846,16 @@ msgstr "" msgid "SMASH!" msgstr "" +#: lang/json/terrain_from_json.py +msgid "metal floor" +msgstr "金屬地板" + +#. ~ Description for metal floor +#: lang/json/terrain_from_json.py +msgid "" +"High-quality and tough checkered flooring to reduce risk of slips and falls." +msgstr "" + #: lang/json/terrain_from_json.py msgid "linoleum tile" msgstr "油氈磚" @@ -144005,10 +144953,6 @@ msgid "" "smoothed and the roof isn't quite filled in yet." msgstr "" -#: lang/json/terrain_from_json.py -msgid "metal floor" -msgstr "金屬地板" - #. ~ Description for metal floor #: lang/json/terrain_from_json.py msgid "" @@ -145525,23 +146469,23 @@ msgid "" "A machine with a bright screen flashing hypnotic promises of wealth. If " "gambling with your life on a daily basis isn't enough for you, you can also " "gamble with this." -msgstr "" +msgstr "一台有著明亮閃爍屏幕的機器不斷催眠你能夠發大財。如果你對現在每天為生存的豪賭還不過癮的話,你也可以玩這個。" #. ~ Description for water pump #: lang/json/terrain_from_json.py msgid "" "Deep well collecting ground water. Installed water pump allows to draw " "water from it." -msgstr "" +msgstr "採集地下水的深井。安裝的水泵能抽取地下水。" #: lang/json/terrain_from_json.py msgid "water dispenser" -msgstr "" +msgstr "飲水機" #. ~ Description for water dispenser #: lang/json/terrain_from_json.py msgid "A machine with several taps that dispenses clean water." -msgstr "" +msgstr "一台有著數個水龍頭並能供應淨水的機器。" #: lang/json/terrain_from_json.py msgid "plutonium generator" @@ -145985,7 +146929,7 @@ msgstr "" #: lang/json/terrain_from_json.py msgid "resin wall" -msgstr "" +msgstr "樹脂牆" #. ~ Description for resin wall #: lang/json/terrain_from_json.py @@ -145995,14 +146939,15 @@ msgid "" "pulsating green conduits, snaking like blood vessels through it. The " "material is hard, warm to the touch, and slightly damp." msgstr "" +"這面牆由發光的、接近不透明的類似塑膠的物質所製成。在物質構成的深處,你依稀能看到脈動的綠色管道網路,像血管一樣蜿蜒穿過它。材料堅硬,觸感溫暖,略微潮濕。" #: lang/json/terrain_from_json.py msgid "boom!" -msgstr "" +msgstr "轟!" #: lang/json/terrain_from_json.py msgid "resin cage" -msgstr "" +msgstr "樹脂籠" #. ~ Description for resin cage #: lang/json/terrain_from_json.py @@ -146010,11 +146955,11 @@ msgid "" "This resin wall opens into a series of small honeycomb-like hexagons, " "allowing the passage of air and light. While still made of the same sturdy " "material, it is thinner and more delicate in appearance." -msgstr "" +msgstr "這種樹脂壁有序列的小蜂窩狀的六邊形開口,允許空氣和光線通過。雖然仍採用相同的堅固材料製成,但外觀更薄更精緻。" #: lang/json/terrain_from_json.py msgid "resin floor" -msgstr "" +msgstr "樹脂地板" #. ~ Description for resin floor #: lang/json/terrain_from_json.py @@ -146022,18 +146967,18 @@ msgid "" "This nearly opaque, plastic-like floor has a gentle curve from wall to wall," " but in the central areas is quite flat. The material is hard, warm to the " "touch, and slightly damp." -msgstr "" +msgstr "這種近乎不透明的類似塑膠材質的地板,在兩邊牆壁接縫處呈現平緩的弧度,但在中央區域卻非常平坦。材料堅硬,觸感溫暖,略微潮濕。" #. ~ Description for resin floor #: lang/json/terrain_from_json.py msgid "" "This nearly opaque, plastic-like floor is smooth and flat. The material is " "hard, warm to the touch, and slightly damp." -msgstr "" +msgstr "這種近乎不透明的類似塑膠材質的地板。材料堅硬,觸感溫暖,略微潮濕。" #: lang/json/terrain_from_json.py msgid "resin roof" -msgstr "" +msgstr "樹脂天花板" #. ~ Description for resin roof #: lang/json/terrain_from_json.py @@ -146041,7 +146986,7 @@ msgid "" "A wide, domed section of nearly opaque, plastic-like material. When the " "light hits it, a network of multicolored conduits like blood vessels can be " "seen snaking through its glistening interior." -msgstr "" +msgstr "寬的圓頂部分,近乎不透明的塑膠類材料。當光照射到它上面時,可以看到多種顏色像血管般的管道交織成網路,蜿蜒穿過其發光的內部的內部。" #: lang/json/terrain_from_json.py msgid "closed resin portal" @@ -147279,12 +148224,12 @@ msgstr "" #: lang/json/terrain_from_json.py msgid "wooden stairs" -msgstr "" +msgstr "木板樓梯" #. ~ Description for wooden stairs #: lang/json/terrain_from_json.py msgid "A wooden staircase leading down." -msgstr "" +msgstr "往下走的木板樓梯。" #: lang/json/terrain_from_json.py msgid "half-built wooden stairs" @@ -147321,14 +148266,14 @@ msgstr "樓梯" #. ~ Description for stairs #: lang/json/terrain_from_json.py msgid "A flight of stairs leading down." -msgstr "" +msgstr "一段往下走的樓梯。" #. ~ Description for stairs #. ~ Description for low stairs (beginning section) #. ~ Description for low stairs (end section) #: lang/json/terrain_from_json.py msgid "A flight of stairs leading up." -msgstr "" +msgstr "一段往上走的樓梯。" #: lang/json/terrain_from_json.py msgid "manhole" @@ -147354,12 +148299,12 @@ msgstr "梯子" #. ~ Description for ladder #: lang/json/terrain_from_json.py msgid "A ladder leading up." -msgstr "" +msgstr "往上的梯子。" #. ~ Description for ladder #: lang/json/terrain_from_json.py msgid "A ladder leading down." -msgstr "" +msgstr "往下的梯子。" #: lang/json/terrain_from_json.py msgid "downward slope" @@ -147368,7 +148313,7 @@ msgstr "下坡" #. ~ Description for downward slope #: lang/json/terrain_from_json.py msgid "A downward facing slope." -msgstr "" +msgstr "向下的斜坡。" #: lang/json/terrain_from_json.py msgid "upward slope" @@ -147377,7 +148322,7 @@ msgstr "上坡" #. ~ Description for upward slope #: lang/json/terrain_from_json.py msgid "An upward facing slope." -msgstr "" +msgstr "向上的斜坡。" #: lang/json/terrain_from_json.py msgid "rope leading up" @@ -147386,7 +148331,7 @@ msgstr "向上延伸的繩子" #. ~ Description for rope leading up #: lang/json/terrain_from_json.py msgid "A rope. You could climb up it." -msgstr "" +msgstr "繩子。你可以爬上它。" #: lang/json/terrain_from_json.py msgid "low stairs (beginning section)" @@ -147716,35 +148661,35 @@ msgstr "卸彈" #: lang/json/tool_quality_from_json.py msgid "analysis" -msgstr "" +msgstr "分析" #: lang/json/tool_quality_from_json.py msgid "concentration" -msgstr "" +msgstr "濃縮" #: lang/json/tool_quality_from_json.py msgid "separation" -msgstr "" +msgstr "分離" #: lang/json/tool_quality_from_json.py msgid "fine distillation" -msgstr "" +msgstr "精餾" #: lang/json/tool_quality_from_json.py msgid "chromatography" -msgstr "" +msgstr "層析" #: lang/json/tool_quality_from_json.py msgid "grinding" -msgstr "" +msgstr "研磨" #: lang/json/tool_quality_from_json.py msgid "reaming" -msgstr "" +msgstr "絞孔" #: lang/json/tool_quality_from_json.py msgid "filing" -msgstr "" +msgstr "銼屑" #: lang/json/tool_quality_from_json.py msgid "vicing" @@ -147752,19 +148697,19 @@ msgstr "" #: lang/json/tool_quality_from_json.py msgid "pressurizing" -msgstr "" +msgstr "加壓" #: lang/json/tool_quality_from_json.py msgid "mana focusing" -msgstr "" +msgstr "法力聚焦" #: lang/json/tool_quality_from_json.py msgid "mana infusing" -msgstr "" +msgstr "法力灌注" #: lang/json/tool_quality_from_json.py msgid "mana weaving" -msgstr "" +msgstr "法力編織" #: lang/json/trap_from_json.py msgid "glass shards" @@ -147792,7 +148737,7 @@ msgstr "雞爪釘" #: lang/json/trap_from_json.py msgid "glass caltrops" -msgstr "" +msgstr "玻璃蒺藜" #: lang/json/trap_from_json.py msgid "tripwire" @@ -147832,7 +148777,7 @@ msgstr "窗台" #: lang/json/trap_from_json.py msgid "downspout funnel" -msgstr "" +msgstr "降流管漏斗" #: lang/json/trap_from_json.py msgid "firewood source" @@ -147840,11 +148785,11 @@ msgstr "薪柴源" #: lang/json/trap_from_json.py msgid "practice target" -msgstr "" +msgstr "練習靶" #: lang/json/trap_from_json.py msgid "unfinished construction" -msgstr "" +msgstr "未完成的建設" #: lang/json/trap_from_json.py msgid "raincatcher" @@ -148211,7 +149156,7 @@ msgstr "" #: lang/json/vehicle_from_json.py msgid "work light" -msgstr "" +msgstr "工作燈" #: lang/json/vehicle_from_json.py msgid "Bicycle" @@ -148219,7 +149164,7 @@ msgstr "自行車" #: lang/json/vehicle_from_json.py msgid "Mountain bike" -msgstr "" +msgstr "登山車" #: lang/json/vehicle_from_json.py msgid "Electric Bicycle" @@ -148227,11 +149172,11 @@ msgstr "電力自行車" #: lang/json/vehicle_from_json.py msgid "Motocross Bike" -msgstr "" +msgstr "越野摩托賽車" #: lang/json/vehicle_from_json.py msgid "Street-Legal Dirt Bike" -msgstr "" +msgstr "越野街車" #: lang/json/vehicle_from_json.py msgid "Motorcycle" @@ -148267,7 +149212,7 @@ msgstr "串聯" #: lang/json/vehicle_from_json.py msgid "Children's Tricycle" -msgstr "" +msgstr "兒童三輪車" #: lang/json/vehicle_from_json.py msgid "Unicycle" @@ -148279,15 +149224,15 @@ msgstr "獨木舟" #: lang/json/vehicle_from_json.py msgid "Amphibious Truck" -msgstr "" +msgstr "兩棲卡車" #: lang/json/vehicle_from_json.py msgid "kayak" -msgstr "" +msgstr "皮艇" #: lang/json/vehicle_from_json.py msgid "racing kayak" -msgstr "" +msgstr "競賽皮艇" #: lang/json/vehicle_from_json.py msgid "raft" @@ -148295,11 +149240,11 @@ msgstr "筏" #: lang/json/vehicle_from_json.py msgid "motor boat" -msgstr "" +msgstr "摩托快艇" #: lang/json/vehicle_from_json.py msgid "4x4 Car" -msgstr "" +msgstr "四驅車" #: lang/json/vehicle_from_json.py msgid "Beetle" @@ -148335,7 +149280,7 @@ msgstr "電動跑車" #: lang/json/vehicle_from_json.py msgid "Electric Racing Car" -msgstr "" +msgstr "電動賽車" #: lang/json/vehicle_from_json.py msgid "Electric Car" @@ -148359,7 +149304,7 @@ msgstr "電動運動型休旅車 (附自行車架)" #: lang/json/vehicle_from_json.py msgid "Engine Crane" -msgstr "" +msgstr "引擎起重機" #: lang/json/vehicle_from_json.py msgid "Food Vendor Cart" @@ -148531,19 +149476,19 @@ msgstr "太陽能測試" #: lang/json/vehicle_from_json.py msgid "Passenger Car" -msgstr "" +msgstr "轎車" #: lang/json/vehicle_from_json.py msgid "Two-Seated Motorized Draisine" -msgstr "" +msgstr "雙座電動軌道車" #: lang/json/vehicle_from_json.py msgid "Six-Seated Motorized Draisine" -msgstr "" +msgstr "六座電動軌道車" #: lang/json/vehicle_from_json.py msgid "Rail Motorcycle" -msgstr "" +msgstr "鐵路摩托車" #: lang/json/vehicle_from_json.py msgid "Flatbed Truck" @@ -148627,7 +149572,7 @@ msgstr "休旅車" #: lang/json/vehicle_from_json.py msgid "Limousine" -msgstr "" +msgstr "加長型豪華轎車" #: lang/json/vehicle_from_json.py msgid "Schoolbus" @@ -148635,11 +149580,11 @@ msgstr "校車" #: lang/json/vehicle_from_json.py msgid "Bus" -msgstr "" +msgstr "公車" #: lang/json/vehicle_from_json.py msgid "Tour Bus" -msgstr "" +msgstr "遊覽車" #: lang/json/vehicle_from_json.py msgid "Security Van" @@ -148659,19 +149604,19 @@ msgstr "custom_empty" #: lang/json/vehicle_from_json.py msgid "Gas Tanker" -msgstr "" +msgstr "油罐車" #: lang/json/vehicle_from_json.py msgid "Water Tanker" -msgstr "" +msgstr "水罐車" #: lang/json/vehicle_from_json.py msgid "Sports Bike" -msgstr "" +msgstr "運動自行車" #: lang/json/vehicle_from_json.py msgid "Electric Semi" -msgstr "" +msgstr "電動半掛式卡車" #: lang/json/vehicle_from_json.py msgid "Atomic Compact" @@ -149036,7 +149981,7 @@ msgstr "" #: lang/json/vehicle_part_from_json.py msgid "air jack system" -msgstr "" +msgstr "氣壓千斤頂" #: lang/json/vehicle_part_from_json.py msgid "foldable light frame" @@ -149170,7 +150115,7 @@ msgstr "" #: lang/json/vehicle_part_from_json.py msgid "wide angle headlight" -msgstr "" +msgstr "廣角車頭燈" #. ~ Description for wide angle headlight #: lang/json/vehicle_part_from_json.py @@ -149225,7 +150170,7 @@ msgstr "" #. ~ Description for electric motor #: lang/json/vehicle_part_from_json.py msgid "An electric motor." -msgstr "" +msgstr "電力馬達。" #: lang/json/vehicle_part_from_json.py msgid "" @@ -149266,6 +150211,16 @@ msgstr "甲殼保險桿" msgid "biosilicfied chitin ram" msgstr "生物矽化甲殼保險桿" +#: lang/json/vehicle_part_from_json.py +msgid "tied mattress" +msgstr "" + +#. ~ Description for tied mattress +#: lang/json/vehicle_part_from_json.py +msgid "" +"A mattress, strapped onto the vehicle. It could serve to blunt any impact." +msgstr "" + #. ~ Description for shredder #: lang/json/vehicle_part_from_json.py msgid "" @@ -149324,7 +150279,7 @@ msgstr "外置油箱 (200 公升)" #: lang/json/vehicle_part_from_json.py msgid "wooden barrel (100L)" -msgstr "" +msgstr "木桶 (100 公升)" #. ~ Description for wooden barrel (100L) #. ~ Description for steel drum (100L) @@ -149775,11 +150730,11 @@ msgstr "包含一些燈光和操控裝置的框架。" #: lang/json/vehicle_part_from_json.py msgid "vehicle-mounted heater" -msgstr "" +msgstr "車載暖氣" #: lang/json/vehicle_part_from_json.py msgid "vehicle-mounted cooler" -msgstr "" +msgstr "車載冷氣" #. ~ Description for electronics control unit #: lang/json/vehicle_part_from_json.py @@ -150096,7 +151051,7 @@ msgid "" "A device for recharging batteries. When turned on, it charges any " "rechargeable batteries (battery cells, lead-acid batteries, etc) placed " "directly in the attached storage space." -msgstr "" +msgstr "一種為電池充電的裝置。啟動後,它會開始對放在它這格的儲存空間裡的任何可充電電池(電池,鉛酸電池等)進行充電。" #: lang/json/vehicle_part_from_json.py msgid "wing mirror" @@ -150409,7 +151364,7 @@ msgstr "自行車輪胎 (轉向輪)" #: lang/json/vehicle_part_from_json.py msgid "off-road bicycle wheel (steerable)" -msgstr "" +msgstr "越野單車輪胎(轉向輪)" #: lang/json/vehicle_part_from_json.py msgid "casters" @@ -150433,7 +151388,7 @@ msgstr "機車輪胎 (轉向輪)" #: lang/json/vehicle_part_from_json.py msgid "off-road motorbike wheel (steerable)" -msgstr "" +msgstr "越野機車輪胎(轉向輪)" #: lang/json/vehicle_part_from_json.py msgid "small wheel (steerable)" @@ -150475,7 +151430,7 @@ msgstr "寬輪胎 (轉向輪)" #: lang/json/vehicle_part_from_json.py msgid "off-road wide wheel (steerable)" -msgstr "" +msgstr "越野寬輪胎(轉向輪)" #. ~ Description for wooden cart wheel #: lang/json/vehicle_part_from_json.py @@ -150514,7 +151469,7 @@ msgstr "" #: lang/json/vehicle_part_from_json.py msgid "mounted laser cannon" -msgstr "車載雷射加農" +msgstr "車載雷射砲" #. ~ Description for refrigerator #: lang/json/vehicle_part_from_json.py @@ -151829,6 +152784,7 @@ msgid "" "improves efficiency due to being able track the sun. Will recharge the " "vehicle's electrical power when exposed to the sun." msgstr "" +"十二片進階太陽能板,裝設在數公尺高的底盤上。它使脆弱的面板遠離任何潛在的威脅,還能夠跟踪太陽以提高效率。當暴露在陽光下,會為車輛的電力充電。" #: lang/json/vehicle_part_from_json.py msgid "rubber treads" @@ -152716,7 +153672,7 @@ msgstr "" #: src/activity_handlers.cpp src/iuse.cpp msgid "You're too exhausted to keep cranking." -msgstr "" +msgstr "你太累了,無法繼續轉動曲柄。" #: src/activity_handlers.cpp msgid "You have trouble breathing, and stop." @@ -152793,27 +153749,27 @@ msgstr "你這樣做不會學到更多東西。" #: src/activity_handlers.cpp #, c-format msgid "%s %s\n" -msgstr "" +msgstr "%s %s\n" #: src/activity_handlers.cpp #, c-format msgid "Charges: %s/%s %s (%s per use)\n" -msgstr "" +msgstr "電量:%s/%s %s ( 每次使用 %s )\n" #: src/activity_handlers.cpp #, c-format msgid "Skill used: %s (%s)\n" -msgstr "" +msgstr "使用技能:%s (%s)\n" #: src/activity_handlers.cpp #, c-format msgid "Success chance: %.1f%%\n" -msgstr "" +msgstr "成功機率:%.1f%%\n" #: src/activity_handlers.cpp #, c-format msgid "Damage chance: %.1f%%" -msgstr "" +msgstr "傷害機率:%.1f%%" #: src/activity_handlers.cpp #, c-format @@ -152861,15 +153817,15 @@ msgstr "你停住並進行精神冥想。" #: src/activity_handlers.cpp msgid "Auto-drive cancelled." -msgstr "" +msgstr "自動駕駛已取消。" #: src/activity_handlers.cpp msgid "You have reached your destination." -msgstr "" +msgstr "你已到達目的地。" #: src/activity_handlers.cpp msgid "You cannot reach that destination" -msgstr "" +msgstr "你無法到達那個目的地" #: src/activity_handlers.cpp src/game.cpp #, c-format @@ -152912,7 +153868,7 @@ msgstr "" #: src/activity_handlers.cpp #, c-format msgid "%s finishes chatting with you." -msgstr "" +msgstr "%s結束與你閒聊。" #: src/activity_handlers.cpp msgid "You toss and turn..." @@ -153125,26 +154081,26 @@ msgstr "hsh!" #: src/activity_handlers.cpp msgid "Something crawls out of the coffin!" -msgstr "" +msgstr "有東西從棺材裡爬出來!" #: src/activity_handlers.cpp msgctxt "memorial_male" msgid "Exhumed a grave." -msgstr "" +msgstr "挖掘墳墓。" #: src/activity_handlers.cpp msgctxt "memorial_female" msgid "Exhumed a grave." -msgstr "" +msgstr "挖掘墳墓。" #: src/activity_handlers.cpp msgid "You finish exhuming a grave." -msgstr "" +msgstr "你完成挖掘墳墓了。" #: src/activity_handlers.cpp #, c-format msgid "You finish digging the %s." -msgstr "" +msgstr "你完成了挖掘 %s。" #: src/activity_handlers.cpp #, c-format @@ -153159,7 +154115,7 @@ msgstr "你完成了填蓋 %s。" #: src/activity_handlers.cpp #, c-format msgid "Playing with your %s has lifted your spirits a bit." -msgstr "" +msgstr "跟你的%s一起玩之後,精神振奮了一點。" #: src/activity_handlers.cpp msgid "You open up your kit and shave." @@ -153181,7 +154137,7 @@ msgstr "你清空你的 %s。" #: src/activity_handlers.cpp msgid "You harvested all the plots you could." -msgstr "" +msgstr "你盡你所能地收穫了所有的田地。" #: src/activity_handlers.cpp src/iuse.cpp msgid "You churn up the earth here." @@ -153194,11 +154150,11 @@ msgstr "你盡可能整地了每一塊格子。" #: src/activity_handlers.cpp #, c-format msgid "You have run out of %s" -msgstr "" +msgstr "%s用完了" #: src/activity_handlers.cpp msgid "You fertilized every plot you could." -msgstr "" +msgstr "你盡你所能地為所有的田地施肥。" #: src/activity_handlers.cpp msgid "You planted all seeds you could." @@ -153313,38 +154269,38 @@ msgstr "" #: src/activity_handlers.cpp #, c-format msgid "You gain %i experience. New total %i." -msgstr "" +msgstr "你獲得%i經驗值。現在總共為%i。" #: src/activity_handlers.cpp msgid "cast a spell" -msgstr "" +msgstr "施法" #: src/activity_handlers.cpp #, c-format msgid "You cast %s!" -msgstr "" +msgstr "你施展了%s!" #: src/activity_handlers.cpp msgid "" "Something about how this spell works just clicked! You gained a level!" -msgstr "" +msgstr "你頓悟了這個法術的原理!你獲得了一個等級!" #: src/activity_handlers.cpp #, c-format msgid "You gained %i experience from your study session." -msgstr "" +msgstr "你從學習課程中獲得%i經驗值。" #: src/activity_handlers.cpp src/iuse_actor.cpp src/iuse_actor.cpp msgid "It's too dark to read." -msgstr "" +msgstr "太暗了,沒辦法閱讀!" #: src/activity_handlers.cpp msgid "...you finally find the memory banks." -msgstr "" +msgstr "......你終於找到了記憶庫。" #: src/activity_handlers.cpp msgid "The kit makes a copy of the data inside the bionic." -msgstr "" +msgstr "這套工具複製了生化插件裡的資料。" #: src/activity_item_handling.cpp #, c-format @@ -153497,7 +154453,7 @@ msgstr "你需要 %1$i 單位的清潔劑才能清洗這些物品。" #: src/activity_item_handling.cpp msgid "You washed your items." -msgstr "" +msgstr "你清洗了你的物品。" #: src/activity_item_handling.cpp msgid "The pet has moved somewhere else." @@ -153506,16 +154462,16 @@ msgstr "寵物移動到別處了。" #: src/activity_item_handling.cpp #, c-format msgid "%s can't reach the source tile to construct." -msgstr "" +msgstr "%s無法抵達源頭那格,以至於無法進行建造。" #: src/activity_item_handling.cpp msgid "It is too dark to construct anything." -msgstr "" +msgstr "太暗了,無法建造任何東西。" #: src/activity_item_handling.cpp #, c-format msgid "%s can't reach the source tile. Try to sort out loot without a cart." -msgstr "" +msgstr "%s無法拿到物品。請試著不使用購物車來整理物品。" #: src/activity_item_handling.cpp #, c-format @@ -153525,7 +154481,11 @@ msgstr "" #: src/activity_type.cpp #, c-format msgid "Stop %s?" -msgstr "" +msgstr "停止%s?" + +#: src/activity_type.h +msgid "THIS IS A BUG" +msgstr "這是程式錯誤" #: src/addiction.cpp msgid "You need some nicotine." @@ -153937,7 +154897,7 @@ msgstr "傷害" #: src/advanced_inv.cpp msgid "ammo/charge type" -msgstr "" +msgstr "彈藥/能量類別" #: src/advanced_inv.cpp msgid "spoilage" @@ -154027,7 +154987,7 @@ msgstr "你無法把物品放到那裡!" #: src/advanced_inv.cpp msgid "Really drop all your favorite items?" -msgstr "" +msgstr "確定要把你設為喜愛的物品全部丟棄嗎?" #: src/advanced_inv.cpp msgid "Skipping filled buckets to avoid spilling their contents." @@ -154122,7 +155082,7 @@ msgstr "請稍候…" #: src/armor_layers.cpp msgid "in your personal aura" -msgstr "" +msgstr "在你的個人光環之中" #: src/armor_layers.cpp msgid "close to your skin" @@ -154146,7 +155106,7 @@ msgstr "繫結" #: src/armor_layers.cpp msgid "an aura around you" -msgstr "" +msgstr "一到光環圍繞著你" #: src/armor_layers.cpp #, c-format @@ -154182,7 +155142,7 @@ msgstr[0] "" #: src/armor_layers.cpp msgid "This is in your personal aura." -msgstr "" +msgstr "這是在你的個人光環之中。" #: src/armor_layers.cpp msgid "This is worn next to the skin." @@ -154202,7 +155162,7 @@ msgstr "這件裝備可以繫結在身上。" #: src/armor_layers.cpp msgid "This is an aura around you." -msgstr "" +msgstr "這是一到光環圍繞著你。" #: src/armor_layers.cpp msgid "Properties" @@ -155078,10 +156038,6 @@ msgstr "%2$s 之 %1$s" msgid "artifact file" msgstr "神器文件" -#: src/auto_pickup.cpp -msgid " AUTO PICKUP MANAGER " -msgstr " 自動撿取管理器 " - #: src/auto_pickup.cpp src/game.cpp src/safemode_ui.cpp msgid "dd" msgstr " 新增" @@ -155130,14 +156086,6 @@ msgstr "規則" msgid "I/E" msgstr "模式" -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "[]" -msgstr "[<全域>]" - -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "[]" -msgstr "[<角色>]" - #: src/auto_pickup.cpp msgid "Auto pickup enabled:" msgstr "啟用自動撿取:" @@ -155154,10 +156102,6 @@ msgstr "是" msgid "witch" msgstr " 切換" -#: src/auto_pickup.cpp src/safemode_ui.cpp -msgid "Please load a character first to use this page!" -msgstr "請先讀取一個角色以使用這個頁面!" - #: src/auto_pickup.cpp src/safemode_ui.cpp msgid "" msgstr "<空白規則>" @@ -155208,6 +156152,18 @@ msgstr "自動撿取規則:" msgid "Save changes?" msgstr "儲存變更?" +#: src/auto_pickup.cpp +msgid " AUTO PICKUP MANAGER " +msgstr " 自動撿取管理器 " + +#: src/auto_pickup.cpp src/safemode_ui.cpp +msgid "[]" +msgstr "[<全域>]" + +#: src/auto_pickup.cpp src/safemode_ui.cpp +msgid "[]" +msgstr "[<角色>]" + #: src/auto_pickup.cpp #, c-format msgid "%1$d item matches: %2$s" @@ -155226,6 +156182,11 @@ msgstr "自動撿取功能沒有啟用。現在啟用?" msgid "autopickup configuration" msgstr "自動撿取設定" +#: src/auto_pickup.cpp +#, c-format +msgid "Pickup rules for %s" +msgstr "%s 的撿取規則" + #: src/avatar.cpp src/iuse.cpp msgid "He" msgstr "他" @@ -156107,7 +157068,7 @@ msgstr "%s 粉碎了!" #: src/ballistics.cpp #, c-format msgid "The %s bursts!" -msgstr "" +msgstr "%s 爆裂了!" #: src/ballistics.cpp #, c-format @@ -156138,6 +157099,11 @@ msgid "" "Skills used: %s\n" "%s\n" msgstr "" +"註記:\n" +"%s\n" +"\n" +"使用的技能:%s\n" +"%s\n" #: src/basecamp.cpp #, c-format @@ -156145,22 +157111,24 @@ msgid "" "Risk: None\n" "Time: %s\n" msgstr "" +"風險:無\n" +"時間:%s\n" #: src/basecamp.cpp msgid "Name this camp" -msgstr "" +msgstr "為此營寨命名" #: src/basecamp.cpp src/faction_camp.cpp msgid "Base Missions" -msgstr "" +msgstr "基本任務" #: src/basecamp.cpp msgid "Expansion" -msgstr "" +msgstr "擴建" #: src/basecamp.cpp msgid "Empty Expansion" -msgstr "" +msgstr "閒置的擴建" #: src/bionics.cpp #, c-format @@ -156455,7 +157423,37 @@ msgstr "你收回你的 %s。" #: src/bionics.cpp #, c-format -msgid "%s withdraws %s %s." +msgid " withdraws %s %s." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Your %s does not have enought fuel to start." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "'s %s does not have enought fuel to start." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Your %s turns off to not waste fuel." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "'s %s turns off to not waste fuel." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "Your %s runs out of fuel and turn off." +msgstr "" + +#: src/bionics.cpp +#, c-format +msgid "'s %s runs out of fuel and turn off." msgstr "" #: src/bionics.cpp @@ -156821,6 +157819,10 @@ msgid "" "enjoy the operation." msgstr "當你開始失去意識時,你對無法享受手術過程感到可惜。" +#: src/bionics_ui.cpp +msgid "Available Fuel: " +msgstr "可用燃料:" + #: src/bionics_ui.cpp #, c-format msgid "" @@ -156883,7 +157885,7 @@ msgstr "(啟動)" #: src/bionics_ui.cpp msgid "(incapacitated)" -msgstr "" +msgstr "(嚴重傷殘)" #: src/bionics_ui.cpp #, c-format @@ -156963,7 +157965,7 @@ msgstr "護甲" #: src/bonuses.cpp msgid "Armor penetration" -msgstr "" +msgstr "護甲穿透" #: src/bonuses.cpp msgid "Target armor multiplier" @@ -157163,15 +158165,15 @@ msgstr "%1$d 年, %2$s, 第 %3$d 天 %4$s" #: src/cata_tiles.cpp msgid "direct3d" -msgstr "" +msgstr "direct3d" #: src/cata_tiles.cpp msgid "opengl" -msgstr "" +msgstr "opengl" #: src/cata_tiles.cpp msgid "opengles2" -msgstr "" +msgstr "opengles2" #: src/cata_utility.cpp src/options.cpp msgid "mph" @@ -157512,7 +158514,7 @@ msgstr "筋疲力竭" #: src/character.cpp msgid "Dead Tired" -msgstr "" +msgstr "累得半死" #: src/character.cpp #, c-format @@ -157868,31 +158870,31 @@ msgstr "友善的 NPC 不會撿取這個區域裡的物品。" #: src/clzones.cpp msgid "NPC Retreat" -msgstr "" +msgstr "NPC 撤退" #: src/clzones.cpp msgid "" "When fleeing, friendly NPCs will attempt to retreat toward this zone if it " "is within 60 tiles." -msgstr "" +msgstr "撤退時,在這區域 60 格內的友善的 NPC 們將嘗試移動至此。" #: src/clzones.cpp msgid "NPC Ignore Sounds" -msgstr "" +msgstr "NPC 忽略聲響" #: src/clzones.cpp msgid "Friendly NPCs won't investigate unseen sounds coming from this zone." -msgstr "" +msgstr "友善的 NPC 不會去調查這區域內發出來的聲響。" #: src/clzones.cpp msgid "NPC Investigation Area" -msgstr "" +msgstr "NPC 搜索區域" #: src/clzones.cpp msgid "" "Friendly NPCs will investigate unseen sounds only if they come from inside " "this area." -msgstr "" +msgstr "友善的 NPC 只有在這個區域內,才會去調查視野之外發出來的聲響。" #: src/clzones.cpp msgid "Loot: Unsorted" @@ -158126,11 +159128,11 @@ msgstr "薪柴和其他可作為薪柴使用的物品的目的地。" #: src/clzones.cpp msgid "Loot: Custom" -msgstr "" +msgstr "物資:自訂" #: src/clzones.cpp msgid "Destination for loot with a custom filter that you can modify." -msgstr "" +msgstr "指定區域存放的物資類別,可以用自訂的篩選器進行篩選。" #: src/clzones.cpp msgid "Loot: Ignore" @@ -158142,11 +159144,11 @@ msgstr "在這個區域裡的物品會忽略 \"整理物資\" 區域動作。" #: src/clzones.cpp msgid "Construction: Blueprint" -msgstr "" +msgstr "建造:藍圖" #: src/clzones.cpp msgid "Designate a blueprint zone for construction." -msgstr "" +msgstr "指定建築藍圖區域。" #: src/clzones.cpp msgid "Farm: Plot" @@ -158158,13 +159160,13 @@ msgstr "劃定用於整地和種植的農田。" #: src/clzones.cpp msgid "Basecamp: Food" -msgstr "" +msgstr "營寨:儲糧" #: src/clzones.cpp msgid "" "Items in this zone will be added to a basecamp's food supply in the " "Distribute Food mission." -msgstr "" +msgstr "該區域中的物品將被添加到分配食物的任務,成為營寨的存糧。" #: src/clzones.cpp src/game.cpp msgid "Filter:" @@ -158177,31 +159179,31 @@ msgstr "沒有種子" #: src/clzones.cpp #, c-format msgid "Loot: Custom : %s" -msgstr "" +msgstr "物資:自訂:%s" #: src/clzones.cpp msgid "Loot: Custom : No Filter" -msgstr "" +msgstr "物資:自訂:無篩選" #: src/clzones.cpp msgid "Loot: Custom: " -msgstr "" +msgstr "物資:自訂:" #: src/clzones.cpp msgid "No filter" -msgstr "" +msgstr "無篩選" #: src/clzones.cpp msgid "No construction" -msgstr "" +msgstr "沒有建造" #: src/clzones.cpp msgid "Construct: " -msgstr "" +msgstr "建造:" #: src/clzones.cpp msgid "No Construction" -msgstr "" +msgstr "沒有建造" #: src/clzones.cpp msgid "Plant seed: " @@ -158221,15 +159223,15 @@ msgstr "<沒有名稱>" #: src/clzones.cpp msgid "Bind this zone to the cargo part here?" -msgstr "" +msgstr "將此區域與貨艙區綁定在一起?" #: src/clzones.cpp msgid "You cannot add that type of zone to a vehicle." -msgstr "" +msgstr "你無法將該類別的區域添加到車輛中。" #: src/clzones.cpp msgid "You cannot change the order of vehicle loot zones." -msgstr "" +msgstr "你無法更改車輛物資區域的順序。" #: src/clzones.cpp msgid "zones date" @@ -158371,7 +159373,7 @@ msgstr "根目錄選單" #: src/computer.cpp msgid "Quit and Shut Down" -msgstr "" +msgstr "離開並關機" #: src/computer.cpp msgid "Password required." @@ -159429,7 +160431,7 @@ msgstr "" msgid "" "Unfortunately you don't have anything sharp to place an inscription on the " "grave." -msgstr "" +msgstr "不幸的是,你沒有任何鋒利的東西可以在墳墓上刻上銘文。" #: src/construction.cpp src/veh_interact.cpp msgid "Enter new vehicle name:" @@ -159526,7 +160528,7 @@ msgstr "它看起來不能食用。" #: src/consumption.cpp msgid "That doesn't look edible to you." -msgstr "" +msgstr "你無法吃這東西。" #: src/consumption.cpp msgid "That doesn't look edible in its current form." @@ -159944,6 +160946,18 @@ msgid " digests a %s and recharges %d point of energy." msgid_plural " digests a %s and recharges %d points of energy." msgstr[0] " 消化了 %s 並轉換成 %d 點能量。" +#: src/consumption.cpp +#, c-format +msgid "You load %i charge of %s in your %s." +msgid_plural "You load %i charges of %s in your %s." +msgstr[0] "" + +#: src/consumption.cpp +#, c-format +msgid " load %i charge of %s in their %s." +msgid_plural " load %i charges of %s in their %s." +msgstr[0] "" + #: src/craft_command.cpp src/crafting.cpp src/veh_interact.cpp msgid " (nearby)" msgstr " (在附近)" @@ -160027,8 +161041,10 @@ msgstr "你無法繼續製作物品!" #: src/crafting.cpp #, c-format -msgid "You don't have anything to store %s in!" -msgstr "你沒有可以容納 %s 的容器!" +msgid "" +"You don't have anything in which to store %s and may have to pour it out or " +"consume it as soon as it is prepared! Proceed?" +msgstr "" #: src/crafting.cpp src/pickup.cpp #, c-format @@ -160085,36 +161101,36 @@ msgstr "要對 %s 做什麼?" #: src/crafting.cpp #, c-format msgid "Dispose of your wielded %s and start working." -msgstr "" +msgstr "丟下你手持的%s並開始作業。" #: src/crafting.cpp msgid "Put it down and start working." -msgstr "" +msgstr "放下它並開始作業。" #: src/crafting.cpp msgid "Store it in your inventory." -msgstr "" +msgstr "把它放進你的物品欄。" #: src/crafting.cpp msgid "Drop it on the ground." -msgstr "" +msgstr "把它丟到地上。" #: src/crafting.cpp #, c-format msgid "Wield and activate the %s to start crafting." -msgstr "" +msgstr "把%s拿到手上並開始製作。" #: src/crafting.cpp src/iexamine.cpp src/iuse.cpp #, c-format msgctxt "in progress craft" msgid "You start working on the %s." -msgstr "" +msgstr "你開始著手在%s。" #: src/crafting.cpp src/iexamine.cpp src/iuse.cpp #, c-format msgctxt "in progress craft" msgid " starts working on the %s." -msgstr "" +msgstr "開始著手在%s。" #: src/crafting.cpp #, c-format @@ -160139,22 +161155,22 @@ msgstr "%s 幫助了你的製作…" #: src/crafting.cpp #, c-format msgid "You mess up and destroy the %s." -msgstr "" +msgstr "你搞砸了,也毀掉了%s。" #: src/crafting.cpp #, c-format msgid " messes up and destroys the %s" -msgstr "" +msgstr "搞砸了,也毀掉了%s。" #: src/crafting.cpp #, c-format msgid "You mess up and lose %d%% progress." -msgstr "" +msgstr "你搞砸了,進度延後%d%%。" #: src/crafting.cpp #, c-format msgid " messes up and loses %d%% progress." -msgstr "" +msgstr "搞砸了,進度延後%d%%。" #: src/crafting.cpp #, c-format @@ -160173,19 +161189,19 @@ msgstr "你記住了 %s 的配方!" #: src/crafting.cpp msgid "You don't have the required components to continue crafting!" -msgstr "" +msgstr "你沒有所需的元件來繼續製作!" #: src/crafting.cpp msgid "Consume the missing components and continue crafting?" -msgstr "" +msgstr "耗用損失的元件並且繼續製作嗎?" #: src/crafting.cpp msgid "You stop crafting." -msgstr "" +msgstr "你停止製作。" #: src/crafting.cpp msgid "You don't have the necessary tools to continue crafting!" -msgstr "" +msgstr "你沒有所需的工具來繼續製作!" #: src/crafting.cpp #, c-format @@ -160223,22 +161239,22 @@ msgstr "要使用哪個工具?" #: src/crafting.cpp #, c-format msgid "You have insufficient %s charges and can't continue crafting" -msgstr "" +msgstr "你缺少%s單位而無法繼續製作。" #: src/crafting.cpp #, c-format msgid " has insufficient %s charges and can't continue crafting" -msgstr "" +msgstr "缺少%s單位而無法繼續製作。" #: src/crafting.cpp #, c-format msgid "You no longer have a %s and can't continue crafting" -msgstr "" +msgstr "你失去了%s而無法繼續製作。" #: src/crafting.cpp #, c-format msgid " no longer has a %s and can't continue crafting" -msgstr "" +msgstr "失去了%s而無法繼續製作。" #: src/crafting.cpp msgid "You cannot disassemble this." @@ -160523,6 +161539,9 @@ msgid "" "You can use arrow keys to go through search history\n" "\n" msgstr "" +"\n" +"你可以按 方向鍵 來瀏覽搜索記錄\n" +"\n" #: src/crafting_gui.cpp src/newcharacter.cpp src/overmap_ui.cpp msgid "Search:" @@ -160614,6 +161633,10 @@ msgstr "射的好!" msgid "Grazing hit." msgstr "這一擊僅僅擦過。" +#: src/creature.cpp +msgid "You feel poison coursing through your body!" +msgstr "你感覺到毒素在你的身體裡流淌著!" + #: src/creature.cpp msgid "The shot misses!" msgstr "沒有命中!" @@ -160710,7 +161733,7 @@ msgstr "是" #: src/damage.cpp msgctxt "damage type" msgid "biological" -msgstr "" +msgstr "生物" #: src/damage.cpp msgctxt "damage type" @@ -160725,22 +161748,22 @@ msgstr "割傷的" #: src/damage.cpp msgctxt "damage type" msgid "acid" -msgstr "" +msgstr "酸" #: src/damage.cpp msgctxt "damage type" msgid "stab" -msgstr "" +msgstr "刺" #: src/damage.cpp msgctxt "damage type" msgid "heat" -msgstr "" +msgstr "熱" #: src/damage.cpp msgctxt "damage type" msgid "cold" -msgstr "" +msgstr "冷" #: src/damage.cpp msgctxt "damage type" @@ -160794,7 +161817,7 @@ msgstr "編輯玩家/NPC" #: src/debug_menu.cpp msgid "Damage self" -msgstr "" +msgstr "自殘" #: src/debug_menu.cpp msgid "Set automove route" @@ -160802,27 +161825,27 @@ msgstr "設置自動移動路徑" #: src/debug_menu.cpp msgid "Learn all spells" -msgstr "" +msgstr "學習所有法術" #: src/debug_menu.cpp msgid "Level a spell" -msgstr "" +msgstr "升級一個法術" #: src/debug_menu.cpp msgid "Player..." -msgstr "" +msgstr "玩家 ... " #: src/debug_menu.cpp msgid "Take screenshot" -msgstr "" +msgstr "擷取螢幕畫面" #: src/debug_menu.cpp msgid "Generate game report" -msgstr "" +msgstr "產生遊戲報告" #: src/debug_menu.cpp msgid "Check game state" -msgstr "" +msgstr "檢查遊戲狀態" #: src/debug_menu.cpp msgid "Display hordes" @@ -160830,11 +161853,11 @@ msgstr "顯示屍潮" #: src/debug_menu.cpp msgid "Test item group" -msgstr "" +msgstr "測試物品群組" #: src/debug_menu.cpp msgid "Show sound clustering" -msgstr "" +msgstr "顯示聲音聚集" #: src/debug_menu.cpp msgid "Display weather" @@ -160846,19 +161869,19 @@ msgstr "顯示氣味大地圖" #: src/debug_menu.cpp msgid "Toggle display local scents" -msgstr "" +msgstr "切換顯示本地氣味" #: src/debug_menu.cpp msgid "Toggle display temperature" -msgstr "" +msgstr "切換顯示溫度" #: src/debug_menu.cpp msgid "Toggle display visibility" -msgstr "" +msgstr "切換顯示視線" #: src/debug_menu.cpp msgid "Toggle display radiation" -msgstr "" +msgstr "切換顯示輻射值" #: src/debug_menu.cpp msgid "Show mutation category levels" @@ -160866,7 +161889,7 @@ msgstr "顯示突變分類等級" #: src/debug_menu.cpp msgid "Draw benchmark (X seconds)" -msgstr "" +msgstr "繪圖基準測試(5 秒)" #: src/debug_menu.cpp msgid "Test trait group" @@ -160882,35 +161905,35 @@ msgstr "崩潰遊戲(測試崩潰處理)" #: src/debug_menu.cpp msgid "Toggle NPC pathfinding on map" -msgstr "" +msgstr "切換NPC在地圖上的尋徑" #: src/debug_menu.cpp msgid "Test weather" -msgstr "" +msgstr "測試天氣" #: src/debug_menu.cpp msgid "Info..." -msgstr "" +msgstr "資訊 ... " #: src/debug_menu.cpp msgid "Teleport - short range" -msgstr "" +msgstr "傳送 - 短距" #: src/debug_menu.cpp msgid "Teleport - long range" -msgstr "" +msgstr "傳送 - 長距" #: src/debug_menu.cpp msgid "Teleport - adjacent overmap" -msgstr "" +msgstr "傳送 - 鄰近的大地圖" #: src/debug_menu.cpp msgid "Teleport..." -msgstr "" +msgstr "傳送 ... " #: src/debug_menu.cpp msgid "Spawn an item" -msgstr "" +msgstr "產生物品" #: src/debug_menu.cpp msgid "Spawn NPC" @@ -160918,7 +161941,7 @@ msgstr "產生NPC" #: src/debug_menu.cpp msgid "Spawn monster" -msgstr "" +msgstr "產生怪物" #: src/debug_menu.cpp msgid "Spawn a vehicle" @@ -160926,15 +161949,15 @@ msgstr "產生車輛" #: src/debug_menu.cpp msgid "Spawn artifact" -msgstr "" +msgstr "產生神器" #: src/debug_menu.cpp msgid "Spawn clairvoyance artifact" -msgstr "" +msgstr "產生千里眼神器" #: src/debug_menu.cpp msgid "Spawning..." -msgstr "" +msgstr "產生 ..." #: src/debug_menu.cpp msgid "Reveal map" @@ -160954,11 +161977,11 @@ msgstr "改變天氣" #: src/debug_menu.cpp msgid "Change wind direction" -msgstr "" +msgstr "改變風向" #: src/debug_menu.cpp msgid "Change wind speed" -msgstr "" +msgstr "改變風速" #: src/debug_menu.cpp msgid "Kill all monsters" @@ -160974,15 +161997,15 @@ msgstr "大地圖編輯器" #: src/debug_menu.cpp msgid "Spawn map extra" -msgstr "" +msgstr "產生地圖附掛" #: src/debug_menu.cpp msgid "Map..." -msgstr "" +msgstr "地圖 ... " #: src/debug_menu.cpp msgid "Quit to main menu" -msgstr "" +msgstr "返回主選單" #: src/debug_menu.cpp msgid "" @@ -160991,10 +162014,14 @@ msgid "" "Taking this shortcut will gain you nothing. Your victory will be hollow.\n" "Nothing will be risked and nothing will be gained." msgstr "" +"除錯功能 - 使用這些功能不僅是作弊,還會變成超級魯蛇。\n" +"你無法成長。你不會變強。\n" +"採取這種捷徑使你一無所獲。你的勝利將是空虛寂寞覺得冷的。\n" +"不進行冒險,也就不會有任何收穫。" #: src/debug_menu.cpp msgid "Debug Functions" -msgstr "" +msgstr "除錯功能" #: src/debug_menu.cpp #, c-format @@ -161030,11 +162057,11 @@ msgstr "男性" #: src/debug_menu.cpp msgid "no faction" -msgstr "" +msgstr "沒有陣營" #: src/debug_menu.cpp msgid "no currency" -msgstr "" +msgstr "沒有貨幣" #: src/debug_menu.cpp #, c-format @@ -161133,7 +162160,7 @@ msgstr "[h] 設定 HP" #: src/debug_menu.cpp msgid "Set [S]tamina" -msgstr "" +msgstr "更改耐力值[S]" #: src/debug_menu.cpp msgid "Set m[o]rale" @@ -161177,11 +162204,11 @@ msgstr "[c] 隨機選擇職業" #: src/debug_menu.cpp msgid "Set [A]ttitude" -msgstr "" +msgstr "設定態度[A]" #: src/debug_menu.cpp msgid "Set [O]pinion" -msgstr "" +msgstr "設定看法[O]" #: src/debug_menu.cpp msgid "Maximum strength" @@ -161236,11 +162263,11 @@ msgstr "將 HP 設置為? 目前: %d" #: src/debug_menu.cpp #, c-format msgid "Set stamina to? Current: %d. Max: %d." -msgstr "" +msgstr "把耐力值改成多少?目前:%d。最高:%d。" #: src/debug_menu.cpp msgid "Target stamina value out of bounds!" -msgstr "" +msgstr "目標耐力值超出範圍!" #: src/debug_menu.cpp #, c-format @@ -161249,48 +162276,48 @@ msgstr "把士氣設定為多少? 目前士氣: %d" #: src/debug_menu.cpp msgid "trust" -msgstr "" +msgstr "信任" #: src/debug_menu.cpp msgid "fear" -msgstr "" +msgstr "畏懼" #: src/debug_menu.cpp msgid "value" -msgstr "" +msgstr "重視" #: src/debug_menu.cpp msgid "anger" -msgstr "" +msgstr "憤怒" #: src/debug_menu.cpp msgid "owed" -msgstr "" +msgstr "占有" #: src/debug_menu.cpp #, c-format msgid "Set trust to? Currently: %d" -msgstr "" +msgstr "將信任改成?目前:%d" #: src/debug_menu.cpp #, c-format msgid "Set fear to? Currently: %d" -msgstr "" +msgstr "將畏懼改成?目前:%d" #: src/debug_menu.cpp #, c-format msgid "Set value to? Currently: %d" -msgstr "" +msgstr "將重視改成?目前:%d" #: src/debug_menu.cpp #, c-format msgid "Set anger to? Currently: %d" -msgstr "" +msgstr "將憤怒改成?目前:%d" #: src/debug_menu.cpp #, c-format msgid "Set owed to? Currently: %d" -msgstr "" +msgstr "將占有改成?目前:%d" #: src/debug_menu.cpp msgid "Rename:" @@ -161316,7 +162343,7 @@ msgstr "飢餓" #: src/debug_menu.cpp msgid "Stored kCal" -msgstr "" +msgstr "儲存熱量" #: src/debug_menu.cpp msgid "Thirst" @@ -161328,7 +162355,7 @@ msgstr "疲勞" #: src/debug_menu.cpp msgid "Reset all basic needs" -msgstr "" +msgstr "重設所有基礎需求" #: src/debug_menu.cpp #, c-format @@ -161338,7 +162365,7 @@ msgstr "將飢餓度設置為? 目前: %d" #: src/debug_menu.cpp #, c-format msgid "Set stored kCal to? Currently: %d" -msgstr "" +msgstr "更改儲存熱量為?目前:%d" #: src/debug_menu.cpp #, c-format @@ -161387,7 +162414,7 @@ msgstr "選擇新的職業" #: src/debug_menu.cpp msgid "Choose new attitude" -msgstr "" +msgstr "選擇一個新的態度" #: src/debug_menu.cpp src/npc.cpp msgid "Unknown attitude" @@ -161569,7 +162596,7 @@ msgstr "" #: src/debug_menu.cpp #, c-format msgid "Kill xp: %d" -msgstr "" +msgstr "擊殺經驗值:%d" #: src/debug_menu.cpp #, c-format @@ -161715,7 +162742,7 @@ msgstr "不存檔直接退出? 這可能會導致各種問題, 例如重複或 #: src/debug_menu.cpp #, c-format msgid "Successfully saved your screenshot to: %s" -msgstr "" +msgstr "成功儲存螢幕擷取畫面到: %s" #: src/debug_menu.cpp msgid "An error occurred while trying to save the screenshot." @@ -161723,7 +162750,7 @@ msgstr "" #: src/debug_menu.cpp msgid "Report written to debug.log" -msgstr "" +msgstr "寫入 debug.log 的報告" #: src/debug_menu.cpp msgid " and to the clipboard." @@ -161741,19 +162768,19 @@ msgstr "" #: src/debug_menu.cpp msgid "Try learning some spells first." -msgstr "" +msgstr "先學些法術吧。" #: src/debug_menu.cpp msgid "Spell" -msgstr "" +msgstr "法術" #: src/debug_menu.cpp msgid "LVL" -msgstr "" +msgstr "等級" #: src/debug_menu.cpp msgid "MAX" -msgstr "" +msgstr "上限" #: src/debug_menu.cpp msgid "Debug level spell:" @@ -161859,7 +162886,7 @@ msgstr "按方向鍵來循環, 按 Enter 來切換" #: src/defense.cpp msgid "Press S to start" -msgstr "" +msgstr "按 S 鍵開始" #: src/defense.cpp msgid "Scenario:" @@ -162019,7 +163046,7 @@ msgstr "一個入口以及多個房間。有些許醫療資源。" #: src/defense.cpp msgid "Easily fortifiable building. Lots of useful tools." -msgstr "" +msgstr "易於加固的建築。很多有用的工具。" #: src/defense.cpp msgid "A large building with various supplies." @@ -162031,7 +163058,7 @@ msgstr "一個有著大量酒類的小建築物。" #: src/defense.cpp msgid "A large house with many rooms." -msgstr "" +msgstr "有很多房間的大房子。" #: src/defense.cpp #, c-format @@ -162060,7 +163087,7 @@ msgstr "你的錢不夠!" #, c-format msgid "Buy %d item, leaving you with %s?" msgid_plural "Buy %d items, leaving you with %s?" -msgstr[0] "" +msgstr[0] "買下 %d 物品,剩下 %s?" #: src/defense.cpp msgid "You drop some items." @@ -162172,21 +163199,21 @@ msgid "You can't see the terrain here." msgstr "你看不到地形。" #: src/descriptions.cpp +#, c-format msgid "" "\n" -"Sign: ???" +"Sign: %s" msgstr "" "\n" -"告示牌: ???" +"告示牌: %s" #: src/descriptions.cpp -#, c-format msgid "" "\n" -"Sign: %s" +"Sign: ???" msgstr "" "\n" -"告示牌: %s" +"告示牌: ???" #: src/descriptions.cpp src/iexamine.cpp #, c-format @@ -162342,7 +163369,7 @@ msgstr "塗鴉: %s" #: src/editmap.cpp src/game.cpp #, c-format msgid "Inscription: %s" -msgstr "" +msgstr "銘文:%s" #: src/editmap.cpp #, c-format @@ -162375,7 +163402,7 @@ msgstr "地形/家具" #: src/editmap.cpp msgctxt "Map editor: Field effects shortkeys" msgid "[s/tab] shape select, [m]ove, [<,>] intensity" -msgstr "" +msgstr "[s/Tab]形狀選擇, [m]移動, []強度" #: src/editmap.cpp msgctxt "Map editor: Field effects shortkeys" @@ -162539,11 +163566,11 @@ msgstr "將 oter_id 從 '%s' (%s) 更改為 '%s' (%s)" #: src/editmap.cpp msgid "Your mechanic could not find a vehicle at the garage." -msgstr "" +msgstr "你的技工在修車廠中找不到車輛。" #: src/editmap.cpp msgid "Select the Vehicle" -msgstr "" +msgstr "選擇車輛" #: src/editmap.cpp msgctxt "map generator" @@ -162983,17 +164010,17 @@ msgstr "%s 被電磁脈衝烤熟了!" #: src/explosion.cpp #, c-format msgid "The %s's electrical field momentarily goes out!" -msgstr "" +msgstr "%s的電場瞬間熄滅!" #: src/explosion.cpp #, c-format msgid "The %s's disabled electrical field reverses polarity!" -msgstr "" +msgstr "%s禁用電場極性反轉!" #: src/explosion.cpp #, c-format msgid "It takes %d damage." -msgstr "" +msgstr "造成%d傷害。" #: src/explosion.cpp #, c-format @@ -163203,59 +164230,59 @@ msgstr "無用" #: src/faction.cpp msgid "Press enter to rename this camp" -msgstr "" +msgstr "按 Enter 鍵重新命名此營寨" #: src/faction.cpp msgid "Direction : to the " -msgstr "" +msgstr "前往:到" #: src/faction.cpp #, c-format msgid "Location : (%d, %d)" -msgstr "" +msgstr "位置:(%d, %d)" #: src/faction.cpp #, c-format msgid "Food Supply : %s %d calories" -msgstr "" +msgstr "儲糧:%s%d卡路里" #: src/faction.cpp msgid "Next Upgrade : " -msgstr "" +msgstr "下個升級:" #: src/faction.cpp msgid "Press enter to talk to this follower " -msgstr "" +msgstr "按 Enter 鍵與該追隨者對話" #: src/faction.cpp msgid "travelling to : " -msgstr "" +msgstr "移動到:" #: src/faction.cpp #, c-format msgid "travelling to : (%d, %d)" -msgstr "" +msgstr "移動到:(%d,%d)" #: src/faction.cpp msgid "Current Mission : " -msgstr "" +msgstr "目前任務:" #: src/faction.cpp msgid "Direction : Nearby" -msgstr "" +msgstr "前往:附近" #: src/faction.cpp #, c-format msgid "Location : (%d, %d), at camp: %s" -msgstr "" +msgstr "位置:(%d, %d),所在營寨:%s" #: src/faction.cpp msgid "Status : " -msgstr "" +msgstr "狀態:" #: src/faction.cpp msgid "In Combat!" -msgstr "" +msgstr "戰鬥中!" #: src/faction.cpp src/npc.cpp msgid "Following" @@ -163267,64 +164294,64 @@ msgstr "帶領" #: src/faction.cpp msgid "Patrolling" -msgstr "" +msgstr "巡邏中" #: src/faction.cpp msgid "Guarding" -msgstr "" +msgstr "守衛中" #: src/faction.cpp msgid "Condition : " -msgstr "" +msgstr "身體狀況:" #: src/faction.cpp msgid "Hunger : " -msgstr "" +msgstr "飢餓度:" #: src/faction.cpp msgid "Thirst : " -msgstr "" +msgstr "口渴度:" #: src/faction.cpp msgid "Fatigue : " -msgstr "" +msgstr "疲勞度:" #: src/faction.cpp msgid "Wielding : " -msgstr "" +msgstr "手持:" #: src/faction.cpp msgid "Best other skills : " -msgstr "" +msgstr "最好的其他技能:" #: src/faction.cpp #, c-format msgid "Best combat skill : %s : %d" -msgstr "" +msgstr "最好的戰鬥技能:%s:%d" #: src/faction.cpp msgid "YOUR FACTION" -msgstr "" +msgstr "你的陣營" #: src/faction.cpp msgid "YOUR FOLLOWERS" -msgstr "" +msgstr "你的追隨者們" #: src/faction.cpp msgid "OTHER FACTIONS" -msgstr "" +msgstr "其他陣營" #: src/faction.cpp msgid "You have no camps" -msgstr "" +msgstr "你沒有營寨" #: src/faction.cpp msgid "You have no followers" -msgstr "" +msgstr "你沒有追隨者" #: src/faction_camp.cpp msgid "Upgrade camp" -msgstr "" +msgstr "升級營寨" #: src/faction_camp.cpp msgid "Working to expand your camp!\n" @@ -163340,7 +164367,7 @@ msgstr "繁忙的製作!\n" #: src/faction_camp.cpp msgid "Craft Item" -msgstr "" +msgstr "製作物品" #: src/faction_camp.cpp msgid " (Finish) Crafting" @@ -163348,15 +164375,15 @@ msgstr " (結束) 製作" #: src/faction_camp.cpp msgid "Busy travelling!\n" -msgstr "" +msgstr "正在移動中!\n" #: src/faction_camp.cpp msgid "Travelling" -msgstr "" +msgstr "移動中" #: src/faction_camp.cpp msgid "Recall ally from travelling" -msgstr "" +msgstr "召回移動中的盟友" #: src/faction_camp.cpp msgid "Gather Materials" @@ -163372,263 +164399,263 @@ msgstr "從蒐集中恢復盟友" #: src/faction_camp.cpp msgid "Collect Firewood" -msgstr "" +msgstr "蒐集薪柴" #: src/faction_camp.cpp msgid "Searching for firewood.\n" -msgstr "" +msgstr "正在搜尋薪柴。\n" #: src/faction_camp.cpp msgid "Recover Firewood Gatherers" -msgstr "" +msgstr "召回蒐集者" #: src/faction_camp.cpp msgid "Menial Labor" -msgstr "" +msgstr "雜務" #: src/faction_camp.cpp msgid "Performing menial labor...\n" -msgstr "" +msgstr "執行瑣碎任務的勞工...\n" #: src/faction_camp.cpp msgid "Recover Menial Laborer" -msgstr "" +msgstr "召回雜務人員" #: src/faction_camp.cpp msgid "Expand Base" -msgstr "" +msgstr "擴建營寨" #: src/faction_camp.cpp msgid "Surveying for expansion...\n" -msgstr "" +msgstr "調查擴建地點...\n" #: src/faction_camp.cpp msgid "Recover Surveyor" -msgstr "" +msgstr "召回調查者" #: src/faction_camp.cpp msgid "Cut Logs" -msgstr "" +msgstr "砍伐原木" #: src/faction_camp.cpp msgid "Cutting logs in the woods...\n" -msgstr "" +msgstr "正在樹林中伐木...\n" #: src/faction_camp.cpp msgid "Recover Log Cutter" -msgstr "" +msgstr "召回伐木工" #: src/faction_camp.cpp msgid "Clear a forest" -msgstr "" +msgstr "清除樹林" #: src/faction_camp.cpp msgid "Clearing a forest...\n" -msgstr "" +msgstr "正在清除樹林...\n" #: src/faction_camp.cpp msgid "Recover Clearcutter" -msgstr "" +msgstr "召回砍樹者" #: src/faction_camp.cpp msgid "Setting up a hide site...\n" -msgstr "" +msgstr "設立藏身處...\n" #: src/faction_camp.cpp msgid "Setup Hide Site" -msgstr "" +msgstr "設立藏身處" #: src/faction_camp.cpp msgid "Recover Hide Setup" -msgstr "" +msgstr "召回建設者" #: src/faction_camp.cpp msgid "Relay Hide Site" -msgstr "" +msgstr "輸送到藏身處" #: src/faction_camp.cpp msgid "Transferring gear to a hide site...\n" -msgstr "" +msgstr "將裝備輸送到藏身處...\n" #: src/faction_camp.cpp msgid "Recover Hide Relay" -msgstr "" +msgstr "召回輸送者" #: src/faction_camp.cpp msgid "Forage for plants" -msgstr "" +msgstr "採集蔬果" #: src/faction_camp.cpp msgid "Foraging for edible plants.\n" -msgstr "" +msgstr "正在採集可食用的蔬果。\n" #: src/faction_camp.cpp msgid "Recover Foragers" -msgstr "" +msgstr "召回採集者" #: src/faction_camp.cpp msgid "Trap Small Game" -msgstr "" +msgstr "陷捕小動物" #: src/faction_camp.cpp msgid "Trapping Small Game.\n" -msgstr "" +msgstr "正在設陷阱捕捉小動物。\n" #: src/faction_camp.cpp msgid "Recover Trappers" -msgstr "" +msgstr "召回捕捉者" #: src/faction_camp.cpp msgid "Hunt Large Animals" -msgstr "" +msgstr "狩獵大型動物" #: src/faction_camp.cpp msgid "Hunting large animals.\n" -msgstr "" +msgstr "正在狩獵大型動物。\n" #: src/faction_camp.cpp msgid "Recover Hunter" -msgstr "" +msgstr "召回狩獵者" #: src/faction_camp.cpp msgid "Construct Map Fortifications" -msgstr "" +msgstr "建設地圖防禦工事" #: src/faction_camp.cpp msgid "Constructing fortifications...\n" -msgstr "" +msgstr "正在建設防禦工事...\n" #: src/faction_camp.cpp msgid "Finish Map Fortifications" -msgstr "" +msgstr "完成地圖防禦工事" #: src/faction_camp.cpp msgid "Recruit Companions" -msgstr "" +msgstr "招募同伴" #: src/faction_camp.cpp msgid "Searching for recruits.\n" -msgstr "" +msgstr "正在尋找新成員。\n" #: src/faction_camp.cpp msgid "Recover Recruiter" -msgstr "" +msgstr "召回招募者" #: src/faction_camp.cpp msgid "Scout Mission" -msgstr "" +msgstr "偵察任務" #: src/faction_camp.cpp msgid "Scouting the region.\n" -msgstr "" +msgstr "正在偵查區域...\n" #: src/faction_camp.cpp msgid "Recover Scout" -msgstr "" +msgstr "召回偵查者" #: src/faction_camp.cpp msgid "Combat Patrol" -msgstr "" +msgstr "戰鬥巡邏" #: src/faction_camp.cpp msgid "Patrolling the region.\n" -msgstr "" +msgstr "正在巡邏地區。\n" #: src/faction_camp.cpp msgid "Recover Combat Patrol" -msgstr "" +msgstr "召回巡邏者" #: src/faction_camp.cpp msgid " Expansion Upgrade" -msgstr "" +msgstr "擴建升級" #: src/faction_camp.cpp msgid "Working to upgrade your expansions!\n" -msgstr "" +msgstr "努力擴建升級你的營寨!\n" #: src/faction_camp.cpp msgid "Recover Ally" -msgstr "" +msgstr "召回盟友" #: src/faction_camp.cpp msgid " Chop Shop" -msgstr "" +msgstr "車輛拆解" #: src/faction_camp.cpp msgid "Working at the chop shop...\n" -msgstr "" +msgstr "正在拆解車輛中...\n" #: src/faction_camp.cpp msgid " (Finish) Chop Shop" -msgstr "" +msgstr "(完成)車輛拆解" #: src/faction_camp.cpp msgid " Kitchen Cooking" -msgstr "" +msgstr "廚房烹飪" #: src/faction_camp.cpp msgid "Working in your kitchen!\n" -msgstr "" +msgstr "正在廚房工作!\n" #: src/faction_camp.cpp msgid " (Finish) Cooking" -msgstr "" +msgstr "(完成)烹飪" #: src/faction_camp.cpp msgid " Blacksmithing" -msgstr "" +msgstr "鍛造工作" #: src/faction_camp.cpp msgid "Working in your blacksmith shop!\n" -msgstr "" +msgstr "正在鐵匠鋪工作!\n" #: src/faction_camp.cpp msgid " (Finish) Smithing" -msgstr "" +msgstr "(完成)鍛造工作" #: src/faction_camp.cpp msgid " Plow Fields" -msgstr "" +msgstr "犁田" #: src/faction_camp.cpp msgid "Working to plow your fields!\n" -msgstr "" +msgstr "正在農場犁田!\n" #: src/faction_camp.cpp msgid " (Finish) Plow fields" -msgstr "" +msgstr "(完成)犁田" #: src/faction_camp.cpp msgid " Plant Fields" -msgstr "" +msgstr "播種" #: src/faction_camp.cpp msgid "Working to plant your fields!\n" -msgstr "" +msgstr "正在農場播種!\n" #: src/faction_camp.cpp msgid " (Finish) Plant Fields" -msgstr "" +msgstr "(完成)播種" #: src/faction_camp.cpp msgid " Harvest Fields" -msgstr "" +msgstr "收成" #: src/faction_camp.cpp msgid "Working to harvest your fields!\n" -msgstr "" +msgstr "正在農場收穫作物!\n" #: src/faction_camp.cpp msgid " (Finish) Harvest Fields" -msgstr "" +msgstr "(完成)收成" #: src/faction_camp.cpp msgid " Farm Crafting" -msgstr "" +msgstr "農務" #: src/faction_camp.cpp msgid "Working on your farm!\n" -msgstr "" +msgstr "正在農場工作!\n" #: src/faction_camp.cpp msgid " [DONE]\n" @@ -163650,19 +164677,19 @@ msgstr "" #: src/faction_camp.cpp msgid "You choose to wait..." -msgstr "" +msgstr "你選擇等待..." #: src/faction_camp.cpp msgid "You cannot build a camp here." -msgstr "" +msgstr "你無法在此建立營寨。" #: src/faction_camp.cpp msgid "Select a camp type:" -msgstr "" +msgstr "選擇營寨類別:" #: src/faction_camp.cpp msgid "You need more at least 4 adjacent for camp expansions!" -msgstr "" +msgstr "擴建營寨至少需要 4個以上鄰近的平原區塊!" #: src/faction_camp.cpp msgid "You are too close to another camp!" @@ -163673,23 +164700,25 @@ msgid "" "Warning, you have selected a region with the following issues:\n" " \n" msgstr "" +"警告,你選擇的地區有下列的狀況:\n" +"\n" #: src/faction_camp.cpp msgid "There are few forests. Wood is your primary construction material.\n" -msgstr "" +msgstr "森林太少。木材是你主要的建築材料。\n" #: src/faction_camp.cpp msgid "There are few large clean-ish water sources.\n" -msgstr "" +msgstr "幾乎沒有大型的清潔水源。\n" #: src/faction_camp.cpp msgid "" "There are no swamps. Swamps provide access to a few late game industries.\n" -msgstr "" +msgstr "附近沒有沼澤。沼澤能提供遊戲後期的工業資源。\n" #: src/faction_camp.cpp msgid "There are few fields. Farming may be difficult.\n" -msgstr "" +msgstr "太少平原。要開墾農場有點困難。\n" #: src/faction_camp.cpp #, c-format @@ -163703,20 +164732,20 @@ msgstr "" #: src/faction_camp.cpp #, c-format msgid "%s failed to start the %s basecamp." -msgstr "" +msgstr "%s 無法開始建造 %s 營寨。" #: src/faction_camp.cpp msgid "There is no faction camp here to recover!" -msgstr "" +msgstr "這裡沒有陣營營寨可收復!" #: src/faction_camp.cpp msgid ", Camp Manager" -msgstr "" +msgstr ", 營寨管理員" #: src/faction_camp.cpp #, c-format msgid "%s has abandoned the camp." -msgstr "" +msgstr "%s 已經廢棄了這營寨。" #: src/faction_camp.cpp #, c-format @@ -163732,6 +164761,16 @@ msgid "" "Time: 3 Hours, Repeated\n" "Positions: %d/3\n" msgstr "" +"註記:\n" +"派遣同伴為下一次的營寨升級收集材料。\n" +" \n" +"使用的技能:生存\n" +"難度:N/A\n" +"可能收集的物品:\n" +"%s\n" +"風險:非常低\n" +"時間:3小時,重複執行\n" +"職缺:%d / 3\n" #: src/faction_camp.cpp #, c-format @@ -163750,10 +164789,23 @@ msgid "" "Total faction food stock: %d kcal\n" "or %d day's rations" msgstr "" +"註記:\n" +"將食物分配給你的追隨者並填滿糧倉。將你想要發配的食物放在 [營寨:儲糧] 區。你必須要設有 [營寨:儲糧] 區、 [物資:未整理] 區以及至少一個 [物資:(任意)] 區,否則系統將提示你使用區域管理員來創建它們。\n" +"功效:\n" +"> 增加你的陣營的糧食供應數值,這也等於勞動者所能運用的總工時\n" +" \n" +"食物的享受值必須 > = -6\n" +"根據升級與距離腐爛時間,易腐食物將會做減值加權計算:\n" +"> 已經腐爛的食物:0%%\n" +"> 將在 2天內腐爛:60%%\n" +"> 將在 5天內腐爛:80%%\n" +" \n" +"陣營糧食總庫存:%d千卡\n" +"或者 %d 天的配給" #: src/faction_camp.cpp msgid "Distribute Food" -msgstr "" +msgstr "分配食物" #: src/faction_camp.cpp msgid "" @@ -163765,10 +164817,17 @@ msgid "" "> Only items that are in the unsorted loot zone and not in any other zone will be sorted.\n" "Items that do not have a loot destination zone will be sorted using the normal rules for automatic zone sorting." msgstr "" +"註記:\n" +"重置物品分類區域, [雜務] 任務進行物品分類歸位的區域。\n" +" \n" +"效果:\n" +"> 使用區域管理員指定分類的區域。你必須有一個 [營寨:儲糧] 區,一個 [物資:未整理] 區和至少一個 [物資:(任意)] 區。\n" +"> 僅對 [物資:未整理] 區中的物品進行分類歸位,而不對其他任何區域中的物品進行分類歸位。\n" +"沒有所屬分類區域的物品將使用自動區域分類的一般規則進行分類歸位。" #: src/faction_camp.cpp msgid "Reset Sort Points" -msgstr "" +msgstr "區域管理員" #: src/faction_camp.cpp #, c-format @@ -163787,6 +164846,19 @@ msgid "" "Time: 3 Hours, Repeated\n" "Positions: %d/3\n" msgstr "" +"註記:\n" +"派遣同伴去收集灌木和木棍。\n" +" \n" +"使用的技能:生存\n" +"難度:N/A\n" +"可能收集的物品:\n" +"> 木棍\n" +"> 枯萎的植物\n" +"> 碎裂的木頭\n" +" \n" +"風險:非常低\n" +"時間:3小時,重複執行\n" +"職缺:%d / 3\n" #: src/faction_camp.cpp #, c-format @@ -163803,6 +164875,17 @@ msgid "" "Time: 3 Hours\n" "Positions: %d/1\n" msgstr "" +"註記:\n" +"派遣同伴去做簡單的雜務和分類物品。\n" +" \n" +"使用的技能:製作\n" +"難度:N/A\n" +"效果:\n" +"> [物資:未分類] 區中的物品將被移動到所屬類別的區域。\n" +"\n" +"風險:無\n" +"時間:3小時\n" +"職缺:%d / 1\n" #: src/faction_camp.cpp #, c-format @@ -163820,6 +164903,18 @@ msgid "" "Time: 3 Hours \n" "Positions: %d/1\n" msgstr "" +"註記:\n" +"你的營寨已經成長到足以擴建新的營區。擴建雖然帶來新契機,卻也耗材又耗時。謹慎地選擇擴建的營區,因為一個營寨只能擴建出周圍八個營區。\n" +" \n" +"使用的技能:N/A\n" +"效果:\n" +"> 選擇擴建一種種類的營區。從 [農場] 開始是一個踏實的選項,因為食物用於支付同伴進行任務,而且維運 [農場] 並不需要太高的成本。只需少少的投資,有機械技能的同伴就可以在 [修車廠] 快速拆除大型的車輛。 [鐵匠鋪] 則能提供製造木炭的設備。\n" +" \n" +"注意:擴建後營區所能進行的任務請在營寨管理員(告示牌)的視窗中選取。\n" +" \n" +"風險:無\n" +"時間:3小時\n" +"職缺:%d / 1\n" #: src/faction_camp.cpp #, c-format @@ -163838,6 +164933,19 @@ msgid "" "Time: 6 Hour Base + Travel Time + Cutting Time\n" "Positions: %d/1\n" msgstr "" +"註記:\n" +"派遣同伴到附近的森林砍伐原木。\n" +" \n" +"使用的技能:製作\n" +"難度:1\n" +"效果:\n" +"> 50%% 位於該森林位置的樹木/樹幹將被砍倒。\n" +"> 100%% 材料會被運回來。\n" +"> 可重複,收益遞減。\n" +"> 最終會把森林變成平原。\n" +"風險:無\n" +"時間:基本 6小時 + 旅行的耗時 + 伐木的耗時\n" +"職缺:%d / 1\n" #: src/faction_camp.cpp #, c-format @@ -163857,6 +164965,20 @@ msgid "" "Time: 6 Hour Base + Travel Time + Cutting Time\n" "Positions: %d/1\n" msgstr "" +"註記:\n" +"派遣同伴去砍伐附近的森林。\n" +" \n" +"使用的技能:製作\n" +"難度:1\n" +"效果:\n" +"> 95%% 位於該森林位置的樹木/樹幹將被砍倒。\n" +"> 0%% 材料會被運回來。\n" +"> 森林變成平原地形。\n" +"> 用來清除其他陣營營寨的土地非常好用。\n" +" \n" +"風險:無\n" +"時間:基本 6小時 + 旅行的耗時 + 伐木的耗時\n" +"職缺:%d/ 1\n" #: src/faction_camp.cpp #, c-format @@ -163875,6 +164997,19 @@ msgid "" "Time: 6 Hour Construction + Travel\n" "Positions: %d/1\n" msgstr "" +"註記:\n" +"派遣同伴到地圖上遠距離的地方去,建造一個臨時的避難所,並將裝備物品存放到那裡。\n" +" \n" +"使用的技能:生存\n" +"難度:3\n" +"效果:\n" +"> 有利於設立中繼站與臨時哨點。\n" +"> 放在那的裝備物品無人看管,可能會被偷走。\n" +"> 時間取決於要帶走的裝備物品重量。\n" +" \n" +"風險:中等\n" +"時間:6小時建造 + 旅行的耗時\n" +"職缺:%d / 1\n" #: src/faction_camp.cpp #, c-format @@ -163893,6 +165028,19 @@ msgid "" "Time: 1 Hour Base + Travel\n" "Positions: %d/1\n" msgstr "" +"註記:\n" +"將裝備輸送到藏身處或是從藏身處帶回裝備。\n" +" \n" +"使用的技能:生存\n" +"難度:1\n" +"效果:\n" +"> 方便帶回你留在藏身處的裝備。\n" +"> 放在那的裝備物品無人看管,可能會被偷走。\n" +"> 時間取決於要帶走或是要帶回的裝備物品重量。\n" +" \n" +"風險:中等\n" +"時間:基本 1 小時 + 旅行的耗時\n" +"職缺:%d / 1\n" #: src/faction_camp.cpp #, c-format @@ -163910,6 +165058,18 @@ msgid "" "Time: 4 Hours, Repeated\n" "Positions: %d/3\n" msgstr "" +"註記:\n" +"派遣同伴去採集可食用的植物。\n" +" \n" +"使用的技能:生存\n" +"難度:N/A\n" +"可能的收穫:\n" +"> 野菜\n" +"> 水果與堅果將取決於季節\n" +"耗用的食物可能比獲得得更多!\n" +"風險:非常低\n" +"時間:4小時,重複執行\n" +"職缺:%d / 3\n" #: src/faction_camp.cpp #, c-format @@ -163926,6 +165086,17 @@ msgid "" "Time: 6 Hours, Repeated\n" "Positions: %d/2\n" msgstr "" +"註記:\n" +"派遣同伴設置陷阱捕捉小型動物。\n" +" \n" +"使用技巧:陷阱\n" +"難度:N/A\n" +"可能的捕獲物:\n" +"> 小型動物的屍體\n" +"耗用的食物可能比獲得得更多!\n" +"風險:低\n" +"時間:6小時,重複執行\n" +"職缺:%d / 2\n" #: src/faction_camp.cpp #, c-format @@ -163942,10 +165113,21 @@ msgid "" "Time: 6 Hours, Repeated\n" "Positions: %d/1\n" msgstr "" +"註記:\n" +"派遣同伴去捕獵大型動物。\n" +" \n" +"使用的技能:射擊\n" +"難度:N/A\n" +"可能的戰利品:\n" +"> 小型、中型或大型動物的屍體\n" +"耗用的食物可能比獲得得更多!\n" +"風險:中等\n" +"時間:6小時,重複執行\n" +"職缺:%d / 1\n" #: src/faction_camp.cpp msgid "Construct Spiked Trench" -msgstr "" +msgstr "建造尖刺壕" #: src/faction_camp.cpp #, c-format @@ -163964,6 +165146,19 @@ msgid "" "Time: Travel\n" "Positions: %d/3\n" msgstr "" +"註記:\n" +"派遣同伴到廣大的未知地域。需要很高的生存技能才能避免戰鬥,但你可預期應會有一兩次的遭遇戰。\n" +" \n" +"使用的技能:生存\n" +"難度:3\n" +"效果:\n" +"> 選取哨點來自定義巡邏路徑。\n" +"> 揭示路徑周圍的地形地貌。\n" +"> 可以探查隱藏的地點來擴大範圍。\n" +" \n" +"風險:高\n" +"時間:旅行的耗時\n" +"職缺:%d / 3\n" #: src/faction_camp.cpp #, c-format @@ -163982,14 +165177,27 @@ msgid "" "Time: Travel\n" "Positions: %d/3\n" msgstr "" +"註記:\n" +"派遣同伴清理荒地。他們的目標是殺死遇到的任何敵人,並且在嚴重受傷或是勝率過低的情況下返回營寨。\n" +" \n" +"使用的技能:生存\n" +"難度:4\n" +"效果:\n" +"> 將殺光所有遇到的不死生物而非逃跑。\n" +"> 選取哨點來自定義巡邏路徑。\n" +"> 可以探查隱藏的地點來擴大範圍。\n" +" \n" +"風險:非常高\n" +"時間:旅行的耗時\n" +"職缺:%d / 3\n" #: src/faction_camp.cpp msgid " Expansion" -msgstr "" +msgstr "擴建營區" #: src/faction_camp.cpp msgid "Recover Ally, " -msgstr "" +msgstr "召回盟友," #: src/faction_camp.cpp msgid "" @@ -164005,6 +165213,17 @@ msgid "" "Risk: None\n" "Time: 5 days \n" msgstr "" +"註記:\n" +"派遣同伴嘗試將車輛完全拆解成零件。\n" +" \n" +"使用的技能:機械\n" +"難度:2\n" +"效果:\n" +"> 完全拆解放在 [修車廠] 建築內的車輛。\n" +"> 技能在判斷能拆解回收出哪些零件時發揮著極重要的作用。\n" +" \n" +"風險:無\n" +"時間:5天\n" #: src/faction_camp.cpp msgid "" @@ -164012,6 +165231,9 @@ msgid "" "Plow any spaces that have reverted to dirt or grass.\n" " \n" msgstr "" +"註記:\n" +"將已經變成土地或草地的地方再重新犁成農田。\n" +"\n" #: src/faction_camp.cpp msgid "" @@ -164027,6 +165249,17 @@ msgid "" "Time: 5 Min / Plot \n" "Positions: 0/1 \n" msgstr "" +"\n" +" \n" +"使用的技能:製作\n" +"難度:N/A\n" +"效果:\n" +"> 僅恢復上次擴建升級中開闢的田地。\n" +"> 不會破壞現有作物。\n" +" \n" +"風險:無\n" +"時間:5分鐘/每塊田\n" +"職缺:0/1\n" #: src/faction_camp.cpp msgid "" @@ -164034,6 +165267,9 @@ msgid "" "Plant designated seeds in the spaces that have already been tilled.\n" " \n" msgstr "" +"註記:\n" +"在已經犁好的田地中播種植物種子。\n" +"\n" #: src/faction_camp.cpp msgid "" @@ -164050,6 +165286,18 @@ msgid "" "Time: 1 Min / Plot \n" "Positions: 0/1 \n" msgstr "" +"\n" +" \n" +"使用的技能:生存\n" +"難度:N/A\n" +"效果:\n" +"> 選擇要播種的種子類別或是播種你全部的種子。\n" +"> 沒有種子或是沒有農地時會停止作業。\n" +"> 會在該營區中所有農地播種。\n" +" \n" +"風險:無\n" +"時間:1 分鐘/每塊田地\n" +"職缺:0/1\n" #: src/faction_camp.cpp msgid "" @@ -164057,6 +165305,9 @@ msgid "" "Harvest any plants that are ripe and bring the produce back.\n" " \n" msgstr "" +"註記:\n" +"收割所有成熟的作物並帶回來。\n" +"\n" #: src/faction_camp.cpp msgid "" @@ -164071,87 +165322,97 @@ msgid "" "Time: 3 Min / Plot \n" "Positions: 0/1 \n" msgstr "" +"\n" +" \n" +"使用的技能:生存\n" +"難度:N/A\n" +"效果:\n" +"> 所有收穫的作物將放到你所在的位置。\n" +" \n" +"風險:無\n" +"時間:3 分鐘/每塊田地\n" +"職缺:0/1\n" #: src/faction_camp.cpp msgid "departs to search for materials..." -msgstr "" +msgstr "出發去收集材料..." #: src/faction_camp.cpp msgid "departs to search for firewood..." -msgstr "" +msgstr "出發去蒐集薪柴..." #: src/faction_camp.cpp msgid "returns from working in the woods..." -msgstr "" +msgstr "從樹林工作後返回..." #: src/faction_camp.cpp msgid "returns from working on the hide site..." -msgstr "" +msgstr "從藏身處工作後返回..." #: src/faction_camp.cpp msgid "returns from shuttling gear between the hide site..." -msgstr "" +msgstr "從藏身處間輸送裝備後返回..." #: src/faction_camp.cpp msgid "departs to search for edible plants..." -msgstr "" +msgstr "出發去尋找可食用的蔬果..." #: src/faction_camp.cpp msgid "departs to set traps for small animals..." -msgstr "" +msgstr "出發去設陷阱誘捕小型動物..." #: src/faction_camp.cpp msgid "departs to hunt for meat..." -msgstr "" +msgstr "出發去獵捕大型動物..." #: src/faction_camp.cpp msgid "departs to search for recruits..." -msgstr "" +msgstr "出發去找尋招募新成員..." #: src/faction_camp.cpp msgid "departs to survey land..." -msgstr "" +msgstr "出發去調查土地..." #: src/faction_camp.cpp msgid "returns to you with something..." -msgstr "" +msgstr "回來了,並給你帶回了一些東西..." #: src/faction_camp.cpp msgid "returns from your farm with something..." -msgstr "" +msgstr "從你的農場返回並帶回了一些東西..." #: src/faction_camp.cpp msgid "returns from your kitchen with something..." -msgstr "" +msgstr "從你的廚房返回並帶回了一些東西..." #: src/faction_camp.cpp msgid "returns from your blacksmith shop with something..." -msgstr "" +msgstr "從你的鐵匠鋪返回並帶回了一些東西..." #: src/faction_camp.cpp msgid "returns from your garage..." -msgstr "" +msgstr "從你的修車廠回來了..." #: src/faction_camp.cpp msgid "You don't have enough food stored to feed your companion." -msgstr "" +msgstr "你沒有足夠的儲糧來餵飽你的同伴。" #: src/faction_camp.cpp msgid "begins to upgrade the camp..." -msgstr "" +msgstr "開始升級營寨......" #: src/faction_camp.cpp msgid "You don't have the materials for the upgrade." -msgstr "" +msgstr "你沒有升級所需的材料。" #: src/faction_camp.cpp #, c-format msgid "%s goes off to clean toilets and sort loot." -msgstr "" +msgstr "%s去清潔廁所和分類歸放物品。" #: src/faction_camp.cpp msgid "Forests and swamps are the only valid cutting locations." -msgstr "" +msgstr "只有森林跟沼澤能進行清除樹林的任務。" #: src/faction_camp.cpp #, c-format @@ -164159,91 +165420,93 @@ msgid "" "Trip Estimate:\n" "%s" msgstr "" +"行程評估:\n" +"%s" #: src/faction_camp.cpp msgid "departs to cut logs..." -msgstr "" +msgstr "出發去砍伐原木..." #: src/faction_camp.cpp msgid "Forests are the only valid cutting locations." -msgstr "" +msgstr "森林是唯一能進行砍伐原木的地點。" #: src/faction_camp.cpp msgid "departs to clear a forest..." -msgstr "" +msgstr "出發去清除樹林..." #: src/faction_camp.cpp msgid "Forests, swamps, and fields are valid hide site locations." -msgstr "" +msgstr "森林、沼澤跟平原是能建立藏身處的地點。" #: src/faction_camp.cpp msgid "Do you wish to give your companion additional items?" -msgstr "" +msgstr "你想給同伴額外的物品嗎?" #: src/faction_camp.cpp msgid "departs to build a hide site..." -msgstr "" +msgstr "出發去建立藏身處..." #: src/faction_camp.cpp msgid "You need equipment to setup a hide site..." -msgstr "" +msgstr "你需要裝備來建立藏身處..." #: src/faction_camp.cpp msgid "You must select an existing hide site." -msgstr "" +msgstr "你必須選擇一個已經存在的藏身處。" #: src/faction_camp.cpp msgid "Bring gear back?" -msgstr "" +msgstr "帶回裝備?" #: src/faction_camp.cpp msgid "departs for the hide site..." -msgstr "" +msgstr "出發到藏身處..." #: src/faction_camp.cpp msgid "You need equipment to transport between the hide site..." -msgstr "" +msgstr "你需要裝備來輸送到藏身處..." #: src/faction_camp.cpp msgid "" "Select a start and end point. Line must be straight. Fields, forests, and " "swamps are valid fortification locations. In addition to existing " "fortification constructions." -msgstr "" +msgstr "選擇起點和終點。路線必須筆直。除了早已有防禦工事的地點之外,平原、森林和沼澤是能建立防禦工事的地點。" #: src/faction_camp.cpp msgid "Select an end point." -msgstr "" +msgstr "選擇終點。" #: src/faction_camp.cpp msgid "Spiked pits must be built over existing trenches!" -msgstr "" +msgstr "尖刺坑必須建造在壕溝之內!" #: src/faction_camp.cpp msgid "Invalid terrain in construction path." -msgstr "" +msgstr "施工路徑中有無效的地形。" #: src/faction_camp.cpp msgid "You don't have the material to build the fortification." -msgstr "" +msgstr "你沒有材料來建造防禦工事。" #: src/faction_camp.cpp msgid "begins constructing fortifications..." -msgstr "" +msgstr "開始建造防禦工事..." #: src/faction_camp.cpp msgid "" "Select checkpoints until you reach maximum range or select the last point " "again to end." -msgstr "" +msgstr "選擇一個哨點直到已達最大範圍,或是繼續選擇哨點直到終點。" #: src/faction_camp.cpp msgid "departs on patrol..." -msgstr "" +msgstr "出發去巡邏..." #: src/faction_camp.cpp msgid "You don't have the materials to craft that" -msgstr "" +msgstr "你沒有材料來製作那個" #: src/faction_camp.cpp #, c-format @@ -164252,23 +165515,23 @@ msgstr "批量製作 %s [最多:%d]:" #: src/faction_camp.cpp msgid "Your batch is too large!" -msgstr "" +msgstr "這批數量太大了!" #: src/faction_camp.cpp msgid "begins to work..." -msgstr "" +msgstr "開始作業..." #: src/faction_camp.cpp msgid "+ more \n" -msgstr "" +msgstr "+ 更多\n" #: src/faction_camp.cpp msgid "begins to harvest the field..." -msgstr "" +msgstr "開始收成作物..." #: src/faction_camp.cpp msgid "You have no additional seeds to give your companions..." -msgstr "" +msgstr "你沒有額外的種子能給你的同伴......" #: src/faction_camp.cpp src/mission_companion.cpp msgid "Which seeds do you wish to have planted?" @@ -164276,11 +165539,11 @@ msgstr "你想種下那一類種子?" #: src/faction_camp.cpp msgid "begins planting the field..." -msgstr "" +msgstr "開始播種田地..." #: src/faction_camp.cpp msgid "begins plowing the field..." -msgstr "" +msgstr "開始耕犁農地..." #: src/faction_camp.cpp #, c-format @@ -164288,10 +165551,12 @@ msgid "" " Chopping this vehicle:\n" "%s" msgstr "" +" 拆解這輛車:\n" +"%s" #: src/faction_camp.cpp msgid "begins working in the garage..." -msgstr "" +msgstr "開始在修車廠作業..." #: src/faction_camp.cpp msgid "Your companion seems disappointed that your pantry is empty..." @@ -164300,64 +165565,64 @@ msgstr "你的同伴似乎對於你的食品儲藏室是空的感到失望。" #: src/faction_camp.cpp #, c-format msgid "%s failed to build the %s upgrade." -msgstr "" +msgstr "%s 無法建造升級 %s 。" #: src/faction_camp.cpp msgid "returns from upgrading the camp having earned a bit of experience..." -msgstr "" +msgstr "完成了升級營寨的工作,並獲得了一點經驗值..." #: src/faction_camp.cpp msgid "returns from doing the dirty work to keep the camp running..." -msgstr "" +msgstr "完成了骯髒的工作使營寨能繼續運作..." #: src/faction_camp.cpp msgid "gathering materials" -msgstr "" +msgstr "收集材料中" #: src/faction_camp.cpp msgid "foraging for edible plants" -msgstr "" +msgstr "正在採集可食用的蔬果" #: src/faction_camp.cpp msgid "trapping small animals" -msgstr "" +msgstr "正在設陷阱捕捉小動物" #: src/faction_camp.cpp msgid "hunting for meat" -msgstr "" +msgstr "獵捕大型動物中" #: src/faction_camp.cpp #, c-format msgid "returns from %s carrying supplies and has a bit more experience..." -msgstr "" +msgstr "從%s返回,帶回一些補給品也獲得了一些經驗值..." #: src/faction_camp.cpp msgid "returns from constructing fortifications..." -msgstr "" +msgstr "從建築防禦工事作業中返回..." #: src/faction_camp.cpp msgid "returns from searching for recruits with a bit more experience..." -msgstr "" +msgstr "完成了找尋招募新成員的工作,並獲得了一點經驗值..." #: src/faction_camp.cpp #, c-format msgid "%s encountered %s..." -msgstr "" +msgstr "%s遇到了%s..." #: src/faction_camp.cpp #, c-format msgid "%s didn't find anyone to recruit..." -msgstr "" +msgstr "%s沒有找到可招募的新成員..." #: src/faction_camp.cpp #, c-format msgid "%s convinced %s to hear a recruitment offer from you..." -msgstr "" +msgstr "%s說服了%s來聽你提供的招募條件..." #: src/faction_camp.cpp #, c-format msgid "%s wasn't interested in anything %s had to offer..." -msgstr "" +msgstr "%s對%s提供的東西完全不感興趣..." #: src/faction_camp.cpp msgid "" @@ -164414,6 +165679,8 @@ msgid "" "> Food: %10d days\n" " \n" msgstr "" +"> 儲糧: %10d 天\n" +" \n" #: src/faction_camp.cpp #, c-format @@ -164421,6 +165688,8 @@ msgid "" "Faction Food:%9d days\n" " \n" msgstr "" +"陣營儲糧:%9d天\n" +"\n" #: src/faction_camp.cpp #, c-format @@ -164428,10 +165697,12 @@ msgid "" "Recruit Chance: %10d%%\n" " \n" msgstr "" +"招募機率:%10d%%\n" +"\n" #: src/faction_camp.cpp msgid "Select an option:" -msgstr "" +msgstr "選擇一個選項:" #: src/faction_camp.cpp msgid "Increase Food" @@ -164443,11 +165714,11 @@ msgstr "降低優先權" #: src/faction_camp.cpp msgid "Make Offer" -msgstr "" +msgstr "出價" #: src/faction_camp.cpp msgid "Not Interested" -msgstr "" +msgstr "沒興趣" #: src/faction_camp.cpp msgid "You decide you aren't interested..." @@ -164456,75 +165727,75 @@ msgstr "" #: src/faction_camp.cpp #, c-format msgid "%s has been convinced to join!" -msgstr "" +msgstr "%s已經被說服要加入了!" #: src/faction_camp.cpp #, c-format msgid "%s wasn't interested..." -msgstr "" +msgstr "%s沒有意願..." #: src/faction_camp.cpp msgid "Your companion hit a river and didn't know how to swim..." -msgstr "" +msgstr "你的同伴遇見一條河,但不會游泳而無法過河......" #: src/faction_camp.cpp msgid "" "Your companion hit a river and didn't know how to swim well enough to " "cross..." -msgstr "" +msgstr "你的同伴遇見一條河,但游泳技能不足無法游泳過河......" #: src/faction_camp.cpp #, c-format msgid "%s didn't return from patrol..." -msgstr "" +msgstr "%s沒有從巡邏任務回來..." #: src/faction_camp.cpp msgid "returns from patrol..." -msgstr "" +msgstr "從巡邏任務回來..." #: src/faction_camp.cpp #, c-format msgid "Select a tile up to %d tiles away." -msgstr "" +msgstr "選擇%d格內的格子。" #: src/faction_camp.cpp #, c-format msgid "You must select a tile within %d range of the camp" -msgstr "" +msgstr "你必須選擇距離營寨%d格內的的格子。" #: src/faction_camp.cpp msgid "Expansions must be on the same level as the camp" -msgstr "" +msgstr "擴建必須跟營寨在同一層地面上" #: src/faction_camp.cpp msgid "You already have an expansion at that location" -msgstr "" +msgstr "那裡已經有擴建的營區了" #: src/faction_camp.cpp #, c-format msgid "You can't build any expansions in a %s." -msgstr "" +msgstr "你不能在%s上擴建任何營區。" #: src/faction_camp.cpp msgid "Select an expansion:" -msgstr "" +msgstr "選擇擴建營區類別:" #: src/faction_camp.cpp #, c-format msgid "%s failed to add the %s expansion" -msgstr "" +msgstr "%s無法加入%s擴建中" #: src/faction_camp.cpp msgid "returns from surveying for the expansion." -msgstr "" +msgstr "從擴建的前置測量調查中返回。" #: src/faction_camp.cpp msgid "returns from working your fields... " -msgstr "" +msgstr "從平原工作中返回..." #: src/faction_camp.cpp msgid "MAIN" -msgstr "" +msgstr "中央營區" #: src/faction_camp.cpp msgid " [N] " @@ -164561,67 +165832,67 @@ msgstr "[西北]" #: src/faction_camp.cpp #, c-format msgid "Select a location between %d and %d tiles away." -msgstr "" +msgstr "選擇距離%d到%d格之內的地點。" #: src/faction_camp.cpp #, c-format msgid "" "You must select a target between %d and %d range from the base. Range: %d" -msgstr "" +msgstr "你必須選擇距離營寨介於%d到%d格內的地點。距離:%d" #: src/faction_camp.cpp msgid "You must be able to see the target that you select." -msgstr "" +msgstr "你必須選擇視野範圍內的目標。" #: src/faction_camp.cpp msgid "Do you want to bounce off this location to extend range?" -msgstr "" +msgstr "你想探查這個地點來拓展距離嗎?" #: src/faction_camp.cpp msgid "You do not have sufficient sort zones. Do you want to add them?" -msgstr "" +msgstr "你沒有足夠的物品分類區域。要增加嗎?" #: src/faction_camp.cpp msgid "" "Sorting zones have changed. Please create some sorting zones. You must " "create a camp food zone for your camp, an unsorted loot zone, and at least " "one destination loot zone." -msgstr "" +msgstr "物品分類區域已經更改。請先設立一些物品分類區域:[營寨:儲糧]、[物資:未分類]、至少一個 [物資:(任意)](請自行選擇任意的類別)" #: src/faction_camp.cpp #, c-format msgid ">Distance:%15.2f (km)\n" -msgstr "" +msgstr "> 距離:%15.2f(公里)\n" #: src/faction_camp.cpp #, c-format msgid ">One Way: %15d (trips)\n" -msgstr "" +msgstr "> 單程:%15d(旅程)\n" #: src/faction_camp.cpp #, c-format msgid ">Covered: %15.2f (km)\n" -msgstr "" +msgstr "> 涵蓋:%15.2f(公里)\n" #: src/faction_camp.cpp #, c-format msgid ">Distance:%15d (m)\n" -msgstr "" +msgstr "> 距離:%15d(公尺)\n" #: src/faction_camp.cpp #, c-format msgid ">Covered: %15d (m)\n" -msgstr "" +msgstr "> 涵蓋:%15d(公尺)\n" #: src/faction_camp.cpp #, c-format msgid ">Travel: %23s\n" -msgstr "" +msgstr "> 移動:%23s\n" #: src/faction_camp.cpp #, c-format msgid ">Working: %23s\n" -msgstr "" +msgstr "> 作業:%23s\n" #: src/faction_camp.cpp #, c-format @@ -164645,6 +165916,10 @@ msgid "" "%s\n" "Time: %s\n" msgstr "" +"使用的技能:%s\n" +"難度:%d\n" +"%s\n" +"時間:%s\n" #: src/faction_camp.cpp #, c-format @@ -164665,86 +165940,101 @@ msgid "" "Time: 4 Days\n" "Positions: %d/1\n" msgstr "" +"註記:\n" +"招募額外的追隨者是非常危險而且花費昂貴的。結果在很大程度上取決於執行任務同伴的技能和你營寨的吸引力。\n" +" \n" +"使用技能:口才\n" +"難度:2\n" +"基本分數:+%3d%%\n" +">擴建加成:+%3d%%\n" +">陣營加成:+%3d%%\n" +">特殊加成:+%3d%%\n" +" \n" +"總計:技能 +%3d%%\n" +" \n" +"風險:高\n" +"時間:4天\n" +"職缺:%d / 1\n" #: src/faction_camp.cpp msgid "Harvestable: " -msgstr "" +msgstr "可收穫的:" #: src/faction_camp.cpp msgid "Ready for Planting: " -msgstr "" +msgstr "能播種的:" #: src/faction_camp.cpp msgid "Needs Plowing: " -msgstr "" +msgstr "需要犁田:" #: src/faction_camp.cpp #, c-format msgid "Name: %25s\n" -msgstr "" +msgstr "名稱: %25s\n" #: src/faction_camp.cpp msgid "---- Engines ----\n" -msgstr "" +msgstr "---- 引擎 ----\n" #: src/faction_camp.cpp #, c-format msgid "Engine: %25s\n" -msgstr "" +msgstr "引擎:%25s\n" #: src/faction_camp.cpp #, c-format msgid ">Status: %24d%%\n" -msgstr "" +msgstr "> 狀態:%24d%%\n" #: src/faction_camp.cpp #, c-format msgid ">Fuel: %25s\n" -msgstr "" +msgstr "> 燃料:%25s\n" #: src/faction_camp.cpp msgid "---- Fuel Storage & Battery ----\n" -msgstr "" +msgstr "---- 燃料儲備 & 電池 ----\n" #: src/faction_camp.cpp msgid "Estimated Chop Time: 5 Days\n" -msgstr "" +msgstr "預計拆解耗時: 5 Days\n" #: src/faction_camp.cpp msgid "You do not have a camp food zone. Aborting..." -msgstr "" +msgstr "你沒有 [營寨:儲糧] 區。中止..." #: src/faction_camp.cpp msgid "No items are located at the drop point..." -msgstr "" +msgstr "該區域內沒有物品..." #: src/faction_camp.cpp #, c-format msgid "You distribute %d kcal worth of food to your companions." -msgstr "" +msgstr "你分配了%d千卡的儲糧給你的同伴們。" #: src/faction_camp.cpp #, c-format msgid "While %s, a silent specter approaches %s..." -msgstr "" +msgstr "正當%s,一個無聲的幽靈接近%s..." #: src/faction_camp.cpp #, c-format msgid "" "%s notices the antlered horror and slips away before it gets too close." -msgstr "" +msgstr "%s注意到了恐怖鹿角,並在它靠近前就悄悄溜開了。" #: src/faction_camp.cpp #, c-format msgid "Another survivor approaches %s asking for directions." -msgstr "" +msgstr "另一名倖存者接近%s來問路。" #: src/faction_camp.cpp #, c-format msgid "" "Fearful that he may be an agent of some hostile faction, %s doesn't mention " "the camp." -msgstr "" +msgstr "他擔心他可能是一些敵對陣營的間諜,%s沒有提到那營寨。" #: src/faction_camp.cpp msgid "The two part on friendly terms and the survivor isn't seen again." @@ -164806,7 +166096,7 @@ msgstr "" #: src/faction_camp.cpp msgid "(You wonder if your companions are fit to work on their own...)" -msgstr "" +msgstr "(你想知道你的同伴是否適合被指派的工作......)" #: src/fungal_effects.cpp src/iuse.cpp #, c-format @@ -164952,7 +166242,7 @@ msgstr "%s %s" #: src/game.cpp msgid "Faction Camp" -msgstr "" +msgstr "陣營營寨" #: src/game.cpp msgid "Confirm:" @@ -165031,12 +166321,12 @@ msgstr "拆解" #: src/game.cpp msgctxt "action" msgid "unfavorite" -msgstr "" +msgstr "取消喜愛" #: src/game.cpp msgctxt "action" msgid "favorite" -msgstr "" +msgstr "設為喜愛" #: src/game.cpp msgctxt "action" @@ -165133,7 +166423,7 @@ msgstr "玩家資料" #: src/game.cpp msgid "player map memory" -msgstr "" +msgstr "玩家地圖記憶" #: src/game.cpp msgid "weather state" @@ -165155,20 +166445,6 @@ msgstr "使用者介面資料" msgid "Failed to save game data" msgstr "無法儲存遊戲數據" -#: src/game.cpp -msgid "You haven't killed any monsters yet!" -msgstr "沒有怪物死在你手上!" - -#: src/game.cpp -#, c-format -msgid "KILL COUNT: %d" -msgstr "殺戮統計: %d" - -#: src/game.cpp -#, c-format -msgid "Experience: %d (%d points available)" -msgstr "" - #: src/game.cpp msgid " You are forgotten among the billions lost in the cataclysm..." msgstr "" @@ -165610,7 +166886,7 @@ msgstr "" msgid "" "Without extra fuel it might burn yet for maybe %s, but might also go out " "sooner." -msgstr "" +msgstr "沒有額外燃料的話應該可以燃燒 %s ,但也可能會早一點熄滅。" #: src/game.cpp #, c-format @@ -167106,6 +168382,11 @@ msgstr "無法飲用溢出的液體" msgid "You're fully charged" msgstr "你的能量已滿" +#: src/game_inventory.cpp +#, c-format +msgid "No space to store more %s" +msgstr "" + #: src/game_inventory.cpp msgid "soon!" msgstr "即將腐敗!" @@ -167138,6 +168419,18 @@ msgstr "瀕臨腐敗" msgid "rotten" msgstr "腐敗" +#: src/game_inventory.cpp src/panels.cpp +msgid "Food :" +msgstr "" + +#: src/game_inventory.cpp src/panels.cpp +msgid "Drink:" +msgstr "" + +#: src/game_inventory.cpp src/panels.cpp +msgid "Pain :" +msgstr "" + #: src/game_inventory.cpp msgid "Consume item" msgstr "食用物品" @@ -167152,23 +168445,23 @@ msgstr "" #: src/game_inventory.cpp msgid "You have no food to consume." -msgstr "" +msgstr "你沒有食物可以吃。" #: src/game_inventory.cpp msgid "Consume drink" -msgstr "" +msgstr "喝飲料" #: src/game_inventory.cpp msgid "You have no drink to consume." -msgstr "" +msgstr "你沒有飲料可以喝。" #: src/game_inventory.cpp msgid "Consume medication" -msgstr "" +msgstr "服用藥物" #: src/game_inventory.cpp msgid "You have no medication to consume." -msgstr "" +msgstr "你沒有藥物可服用。" #: src/game_inventory.cpp msgid "ACTION" @@ -167228,11 +168521,11 @@ msgstr "武術" #: src/game_inventory.cpp #, c-format msgid "%s to %d (%d)" -msgstr "" +msgstr "%s 到 %d (%d)" #: src/game_inventory.cpp msgid "TRAINS (CURRENT)" -msgstr "" +msgstr "訓練(當前)" #: src/game_inventory.cpp msgid "RECIPES" @@ -167375,7 +168668,7 @@ msgstr "" msgid "" "Patient has Sensory Dulling CBM installed. Anesthesia " "unneeded." -msgstr "" +msgstr "患者安裝了CBM:知覺阻隔,無需使用麻醉藥。" #: src/game_inventory.cpp #, c-format @@ -167424,7 +168717,7 @@ msgstr "" #: src/game_inventory.cpp msgid "/!\\ CBM is not sterile. /!\\" -msgstr "" +msgstr "/!\\ 生化插件並非無菌狀態 /!\\" #: src/game_inventory.cpp msgid "CBM already deployed. Please reset to factory state." @@ -168007,19 +169300,19 @@ msgstr "抽出什麼?" #: src/handle_action.cpp msgid "Change to which movement mode?" -msgstr "" +msgstr "切換至哪種行動模式?" #: src/handle_action.cpp msgid "Walk" -msgstr "" +msgstr "步行" #: src/handle_action.cpp msgid "Run" -msgstr "" +msgstr "跑步" #: src/handle_action.cpp msgid "Crouch" -msgstr "" +msgstr "蹲伏" #: src/handle_action.cpp msgid "You don't know any spells to cast." @@ -168044,11 +169337,11 @@ msgstr "" #: src/handle_action.cpp msgid "What do you want to consume?" -msgstr "" +msgstr "你要使用什麼?" #: src/handle_action.cpp msgid "Medication" -msgstr "" +msgstr "藥物" #: src/handle_action.cpp msgid "Auto-move canceled" @@ -168193,11 +169486,11 @@ msgstr "你在殼中的時候不能控制車輛。" #: src/handle_action.cpp msgid "Auto travel mode OFF!" -msgstr "" +msgstr "自動旅行模式關閉!" #: src/handle_action.cpp msgid "Auto travel mode ON!" -msgstr "" +msgstr "自動旅行模式開啟!" #: src/handle_action.cpp msgid "Safe mode OFF!" @@ -169851,6 +171144,14 @@ msgstr "選取要移除的已安裝生化插件。" msgid "ERROR NO SPACE AVAILABLE. Operation impossible. Exiting." msgstr "" +#: src/iexamine.cpp +msgid "Personality_Override" +msgstr "" + +#: src/iexamine.cpp +msgid "C0RR#PTED?D#TA" +msgstr "" + #: src/iexamine.cpp msgid "Choose bionic to uninstall" msgstr "選取要移除的生化插件" @@ -170228,11 +171529,11 @@ msgstr "在煙燻架裡放入生肉、生魚或生香腸以進行煙燻, 或放 #: src/iexamine.cpp msgid "You cannot disassemble this smoking rack while it is active!" -msgstr "" +msgstr "你不能拆解正在啟用中的煙燻架!" #: src/iexamine.cpp msgid "Disassemble the smoking rack" -msgstr "" +msgstr "拆解煙燻架" #: src/iexamine.cpp msgid "Remove food from smoking rack" @@ -170410,7 +171711,7 @@ msgstr "怪物派系" #: src/init.cpp msgid "Factions" -msgstr "" +msgstr "陣營" #: src/init.cpp msgid "Crafting recipes" @@ -170526,7 +171827,7 @@ msgstr "NPC 樣本" #: src/init.cpp msgid "Spells" -msgstr "" +msgstr "法術" #: src/input.cpp msgid "key bindings configuration" @@ -171076,8 +172377,8 @@ msgid "Capacity: " msgstr "容量: " #: src/item.cpp -msgid " per round" -msgstr "每發 " +msgid " moves per round" +msgstr "" #: src/item.cpp msgid "Reload time: " @@ -171173,8 +172474,8 @@ msgid "" msgstr "" #: src/item.cpp -msgid " seconds" -msgstr " 秒" +msgid " moves " +msgstr "" #: src/item.cpp msgid "Time to reach aim level: " @@ -171208,10 +172509,6 @@ msgstr "有效後座力: " msgid "Recommended strength (burst): " msgstr "建議力量 (連發): " -#: src/item.cpp -msgid " seconds per round" -msgstr " 秒一發" - #: src/item.cpp msgid "Fire modes: " msgstr "射擊模式: " @@ -171425,15 +172722,15 @@ msgstr " (不合身)" #: src/item.cpp msgid " (too big)" -msgstr "" +msgstr " (太大)" #: src/item.cpp msgid " (huge!)" -msgstr "" +msgstr " (極大!)" #: src/item.cpp msgid " (too small)" -msgstr "" +msgstr " (太小)" #: src/item.cpp msgid " (tiny!)" @@ -171477,6 +172774,14 @@ msgid "" "improve them by repairing this item." msgstr "防護值會因損傷而減少,你可以透過修復去改善。" +#: src/item.cpp +msgid "Weight capacity modifier: " +msgstr "" + +#: src/item.cpp +msgid "Weight capacity bonus: " +msgstr "" + #: src/item.cpp msgid "Just for fun." msgstr "僅供娛樂。" @@ -171508,12 +172813,12 @@ msgstr "這能被新手理解。" #: src/item.cpp #, c-format msgid "Can bring your %s skill to ." -msgstr "" +msgstr "能夠提昇你的 %s 技能到 。" #: src/item.cpp #, c-format msgid "Your current %s skill is ." -msgstr "" +msgstr "你目前的 %s 技能。" #: src/item.cpp #, c-format @@ -171737,7 +173042,7 @@ msgstr "* 這件物品能 與頭盔一起穿戴。" #: src/item.cpp msgid "* This clothing fits you perfectly." -msgstr "" +msgstr "* 這件衣物很合身。" #: src/item.cpp msgid "* This clothing fits your large frame perfectly." @@ -171750,7 +173055,7 @@ msgstr "" #: src/item.cpp msgid "" "* This clothing is oversized and does not fit you." -msgstr "" +msgstr "* 這件衣物太大且並不合身。" #: src/item.cpp msgid "" @@ -171779,7 +173084,7 @@ msgstr "" #: src/item.cpp msgid "" "* This clothing is undersized and does not fit you." -msgstr "" +msgstr "* 這件衣物太小且並不合身。" #: src/item.cpp msgid "* This clothing can be upsized." @@ -171809,12 +173114,12 @@ msgstr "" #: src/item.cpp msgid "" "* This clothing can be refitted but not downsized." -msgstr "" +msgstr "* 這件衣物可以被修改無法改小。" #: src/item.cpp msgid "" "* This clothing can be refitted but not upsized." -msgstr "" +msgstr "* 這件衣物可以被修改無法改大。" #: src/item.cpp msgid "* This clothing can be refitted." @@ -171822,7 +173127,7 @@ msgstr "" #: src/item.cpp msgid "* This clothing can not be refitted, upsized, or downsized." -msgstr "" +msgstr "* 這件衣物無法修改、改大,或者改小。" #: src/item.cpp msgid "* This item can be worn on either side of the body." @@ -171902,6 +173207,14 @@ msgstr "* 這件物品接受到無線電信號後會立即啟動Encumbrance: " +msgstr "" + +#: src/item.cpp +msgid "Environmental Protection: " +msgstr "" + #: src/item.cpp msgid "* This weapon needs two free hands to fire." msgstr "* 這件武器需要雙手並用才能射擊。" @@ -172124,19 +173437,19 @@ msgstr " (融化)" #: src/item.cpp msgid " (too big)" -msgstr "" +msgstr "(太大)" #: src/item.cpp msgid " (huge!)" -msgstr "" +msgstr "(巨大!)" #: src/item.cpp msgid " (too small)" -msgstr "" +msgstr "(太小)" #: src/item.cpp msgid " (tiny!)" -msgstr "" +msgstr "(微小!)" #: src/item.cpp msgid " (poor fit)" @@ -172148,7 +173461,7 @@ msgstr " (骯髒)" #: src/item.cpp msgid " (sterile)" -msgstr "" +msgstr "(無菌)" #: src/item.cpp msgid " (packed)" @@ -172291,7 +173604,7 @@ msgstr "破裂的 " #: src/item.cpp msgid "fully intact " -msgstr "" +msgstr "完整無缺" #: src/item.cpp msgid "isn't a weapon" @@ -173356,31 +174669,31 @@ msgstr "你把 %s 拆封。" #: src/iuse.cpp msgid "Choose CBM to pack" -msgstr "" +msgstr "選取要包裝的生化插件" #: src/iuse.cpp msgid "You don't have any CBMs." -msgstr "" +msgstr "你沒有任何生化插件" #: src/iuse.cpp msgid "This CBM is faulty. You should mend it first. Do you want to try?" -msgstr "" +msgstr "這個生化插件是不完整的,你應該先修補好它。你要繼續嘗試嗎?" #: src/iuse.cpp msgid "This CBM is already packed. Do you want to put it in a new pouch?" -msgstr "" +msgstr "這個生化插件已經包裝過了,你要把它放入新的包裝袋內嗎?" #: src/iuse.cpp msgid "You carefully prepare the CBM for sterilization." -msgstr "" +msgstr "你小心地準備好生化插件以進行高壓滅菌。" #: src/iuse.cpp msgid "You put the CBM in the pouch and close it." -msgstr "" +msgstr "你把生化插件放進包裝袋中並包好它。" #: src/iuse.cpp msgid "You're not sure about the quality of your work." -msgstr "" +msgstr "你不確定你包裝的對不對。" #: src/iuse.cpp #, c-format @@ -174292,7 +175605,7 @@ msgstr "" #: src/iuse.cpp #, c-format msgid "You start cranking the %s to charge its %s." -msgstr "" +msgstr "你開始搖動%s的曲柄來為%s進行充電。" #: src/iuse.cpp #, c-format @@ -174301,7 +175614,7 @@ msgstr "" #: src/iuse.cpp msgid "You need a rechargeable battery cell to charge." -msgstr "" +msgstr "你需要一個可充電電池來充電。" #: src/iuse.cpp msgid "It's waterproof, but oxygen maybe?" @@ -174842,12 +176155,12 @@ msgstr "你校準你的 %s。" #: src/iuse.cpp src/iuse_actor.cpp #, c-format msgid "You repair your %s! ( %s-> %s)" -msgstr "" +msgstr "你修理了 %s!(%s-> %s)" #: src/iuse.cpp src/iuse_actor.cpp #, c-format msgid "You repair your %s completely! ( %s-> %s)" -msgstr "" +msgstr "你完全修復了 %s !(%s-> %s)" #: src/iuse.cpp msgid "Select tool to modify" @@ -175145,6 +176458,11 @@ msgstr "" msgid " illuminated by %s" msgstr "" +#: src/iuse.cpp +#, c-format +msgid " in %s cloud" +msgstr "" + #: src/iuse.cpp #, c-format msgid " with graffiti \"%s\"" @@ -176058,19 +177376,19 @@ msgstr "" #: src/iuse.cpp msgid "Cleanser" -msgstr "" +msgstr "清潔劑" #: src/iuse.cpp msgid "ITEMS TO CLEAN" -msgstr "" +msgstr "要清洗的物品" #: src/iuse.cpp msgid "Multiclean" -msgstr "" +msgstr "複數清洗" #: src/iuse.cpp msgid "To clean x items, type a number before selecting." -msgstr "" +msgstr "要清洗指定數量,在選擇之前輸物數量。" #: src/iuse.cpp msgid "You have nothing to clean." @@ -176344,6 +177662,10 @@ msgstr "你的 %s 需要電力來源 (簡單的 UPS 就行了) 。" msgid "There is also a certain bionic that helps with this kind of armor." msgstr "那裡有一個可以幫助你使用這類裝甲的生化插件。" +#: src/iuse_actor.cpp +msgid "No lock to pick." +msgstr "" + #: src/iuse_actor.cpp msgid "Use your lockpick where?" msgstr "把你的的開鎖器用在哪邊?" @@ -177363,7 +178685,7 @@ msgstr "你確定嗎? 你無法拿回任何材料。" #: src/iuse_actor.cpp #, c-format msgid "You damage your %s trying to modify it! ( %s-> %s)" -msgstr "" +msgstr "你在修改 %s 時弄壞了它!(%s->%s)" #: src/iuse_actor.cpp msgid "You fail to modify the clothing, and you waste thread and materials." @@ -178378,6 +179700,20 @@ msgstr "<-> 上個關卡" msgid "ndo move" msgstr " 取消移動" +#: src/kill_tracker.cpp +msgid "You haven't killed any monsters yet!" +msgstr "沒有怪物死在你手上!" + +#: src/kill_tracker.cpp +#, c-format +msgid "KILL COUNT: %d" +msgstr "殺戮統計: %d" + +#: src/kill_tracker.cpp +#, c-format +msgid "Experience: %d (%d points available)" +msgstr "" + #. ~ abbreviated direction names and long direction names #: src/line.cpp msgid "N " @@ -178605,11 +179941,11 @@ msgstr "正在讀取" #: src/magic.cpp msgid "ERROR: Invalid energy string. Defaulting to NONE" -msgstr "" +msgstr "錯誤:無效的能量字串。預設成 NONE" #: src/magic.cpp msgid "ERROR: Invalid damage type string. Defaulting to none" -msgstr "" +msgstr "錯誤:無效的傷害類別字串。預設成 none" #: src/magic.cpp msgid "Too Difficult!" @@ -178647,6 +179983,16 @@ msgstr "" msgid "an explosion" msgstr "" +#: src/magic.cpp +#, c-format +msgid "%s and %s" +msgstr "%s 又 %s" + +#: src/magic.cpp src/player.cpp +#, c-format +msgid "%s, %s" +msgstr "%s, %s" + #: src/magic.cpp #, c-format msgid "" @@ -178692,6 +180038,11 @@ msgstr "" msgid "Popup Distractions" msgstr "" +#: src/magic.cpp +#, c-format +msgid "%d moves" +msgstr "" + #: src/magic.cpp msgid "requires concentration" msgstr "" @@ -179210,7 +180561,7 @@ msgstr "" #: src/map.cpp #, c-format -msgid "The autoclave in the %s has finished washing." +msgid "The autoclave in the %s has finished its cycle." msgstr "" #: src/map.cpp @@ -179476,22 +180827,6 @@ msgstr "開啟房間" msgid "Missile Controls" msgstr "飛彈控制台" -#: src/mapgen.cpp -msgid "EnviroCom OS v2.03" -msgstr "EnviroCom OS v2.03" - -#: src/mapgen.cpp -msgid "Unlock stairs" -msgstr "解鎖階梯" - -#: src/mapgen.cpp -msgid "Download Sewer Maps" -msgstr "下載下水道地圖" - -#: src/mapgen.cpp -msgid "Divert sample" -msgstr "轉移樣本" - #: src/mapgen.cpp msgid "NEPowerOS" msgstr "NEPowerOS" @@ -180601,7 +181936,7 @@ msgstr "" #: src/mission_companion.cpp msgid "Assign Ally to Menial Labor" -msgstr "" +msgstr "指派盟友執行雜務" #: src/mission_companion.cpp msgid "" @@ -180613,10 +181948,17 @@ msgid "" " \n" "Labor Roster:\n" msgstr "" +"利潤:每小時 $8\n" +"危險:可忽略\n" +"時間:至少 1小時\n" +" \n" +"將一位你的盟友分配給雜務工作,這是一種安全的方式來訓練他們的基本技能,並建立前哨站的聲譽。不過,不要期待有很多報酬。\n" +" \n" +"勞工名冊:\n" #: src/mission_companion.cpp msgid "Recover Ally from Menial Labor" -msgstr "" +msgstr "召回執行雜務的盟友" #: src/mission_companion.cpp msgid "" @@ -180710,7 +182052,7 @@ msgstr "" #: src/mission_companion.cpp msgid "Upgrade East Field I" -msgstr "" +msgstr "升級東營區 I" #: src/mission_companion.cpp msgid "" @@ -181242,7 +182584,7 @@ msgstr "" #: src/mission_companion.cpp msgid "The companion you selected doesn't have the skills!" -msgstr "" +msgstr "你選擇的同伴沒有需要的技能!" #: src/mission_companion.cpp msgid "You don't have any companions ready to return..." @@ -182065,6 +183407,11 @@ msgstr "%s 的雙臂飛向, 但是他躲開了!" msgid "The %1$s's arms fly out and pull and grab %2$s!" msgstr "%1$s 雙臂飛出, 抓住了 %2$s!" +#: src/monattack.cpp +#, c-format +msgid "The %1$s reaches out and pulls %2$s!" +msgstr "" + #: src/monattack.cpp #, c-format msgid "The %s gropes at you, but you dodge!" @@ -182766,6 +184113,19 @@ msgstr "空出雙手並站在原地, 公民!" msgid "fzzzzzt" msgstr "滋滋滋" +#: src/monattack.cpp +msgid "The floor trembles underneath your feet." +msgstr "" + +#: src/monattack.cpp +msgid "a deafening roar!" +msgstr "" + +#: src/monattack.cpp +#, c-format +msgid "A %s struggles to pull itself free from the %s!" +msgstr "" + #: src/monattack.cpp #, c-format msgid "The %1$s mechanically grabs at %2$s!" @@ -183009,12 +184369,12 @@ msgstr "鼠群從四周竄出於視線之中。" #: src/mondeath.cpp #, c-format msgid "The %s inflates and melts away." -msgstr "" +msgstr "%s膨脹並熔化了。" #: src/mondeath.cpp #, c-format msgid "a %s explodes!" -msgstr "" +msgstr "%s爆炸了!" #: src/mondeath.cpp #, c-format @@ -183052,11 +184412,11 @@ msgstr "蟑螂幼蟲從懷孕的巨大蟑螂屍體爬出來。" #: src/mondeath.cpp #, c-format msgid "an explosion of tank of the %s's flamethrower!" -msgstr "" +msgstr "%s的火焰噴射器燃料罐爆炸了!" #: src/mondeath.cpp msgid "I love the smell of burning zed in the morning." -msgstr "" +msgstr "早上飄來陣陣殭屍BBQ的味道真是香啊。" #: src/mondefense.cpp #, c-format @@ -183097,7 +184457,7 @@ msgstr "把物品放進袋子" #: src/monexamine.cpp msgid "Drop all items except armor" -msgstr "" +msgstr "除了護甲外,丟棄所有的物品" #: src/monexamine.cpp msgid "Attach bag" @@ -183106,17 +184466,17 @@ msgstr "連接袋子" #: src/monexamine.cpp #, c-format msgid "Remove vehicle harness from %s" -msgstr "" +msgstr "移除%s身上的衡軛" #: src/monexamine.cpp #, c-format msgid "Remove armor from %s" -msgstr "" +msgstr "移除%s身上的護甲" #: src/monexamine.cpp #, c-format msgid "Equip %s with armor" -msgstr "" +msgstr "為%s裝戴上護甲" #: src/monexamine.cpp #, c-format @@ -183134,7 +184494,7 @@ msgstr "綁" #: src/monexamine.cpp #, c-format msgid "You need any type of rope to tie %s in place" -msgstr "" +msgstr "你需要一條繩索來把%s綁在這裡" #: src/monexamine.cpp msgid "Tear out pheromone ball" @@ -183148,85 +184508,85 @@ msgstr "擠奶 %s" #: src/monexamine.cpp #, c-format msgid "Attach a saddle to %s" -msgstr "" +msgstr "把鞍具披到%s身上" #: src/monexamine.cpp #, c-format msgid "Remove the saddle from %s" -msgstr "" +msgstr "從%s身上移除鞍具" #: src/monexamine.cpp #, c-format msgid "You don't know how to saddle %s" -msgstr "" +msgstr "你不知道怎麼鞍具披到%s身上" #: src/monexamine.cpp #, c-format msgid "Mount %s" -msgstr "" +msgstr "騎乘%s" #: src/monexamine.cpp #, c-format msgid "%s cannot be mounted" -msgstr "" +msgstr "%s不能被騎乘" #: src/monexamine.cpp #, c-format msgid "%s is too small to carry your weight" -msgstr "" +msgstr "%s太小隻,無法負荷你的體重" #: src/monexamine.cpp msgid "You have no knowledge of riding at all" -msgstr "" +msgstr "你不懂怎麼騎乘" #: src/monexamine.cpp #, c-format msgid "You are too heavy to mount %s" -msgstr "" +msgstr "對%s來說,你太重了無法騎乘它" #: src/monexamine.cpp msgid "You are not skilled enough to ride without a saddle" -msgstr "" +msgstr "你技術還沒好到不用鞍具就能成騎乘動物" #: src/monexamine.cpp #, c-format msgid "Despite the saddle, you still don't know how to ride %s" -msgstr "" +msgstr "儘管有鞍具,你還是不知道如何騎乘%s" #: src/monexamine.cpp #, c-format msgid "%s battery level is %d%%" -msgstr "" +msgstr "%s電池等級為%d%%" #: src/monexamine.cpp msgid "Climb into the mech and take control" -msgstr "" +msgstr "爬進機甲並取得控制權" #: src/monexamine.cpp msgid "You cannot pilot the mech whilst wielding something" -msgstr "" +msgstr "你不能駕駛機甲,同時揮舞東西" #: src/monexamine.cpp msgid "This mech has a dead battery and won't turn on" -msgstr "" +msgstr "這機甲的電池電量已耗盡,無法啟動。" #: src/monexamine.cpp msgid "Remove the mech's battery pack" -msgstr "" +msgstr "取下機甲的電池組" #: src/monexamine.cpp msgid "Insert a new battery pack" -msgstr "" +msgstr "裝入新的電池組" #: src/monexamine.cpp #, c-format msgid "You need a %s to power this mech" -msgstr "" +msgstr "你需要一個%s來為這個機甲供電" #: src/monexamine.cpp #, c-format msgid "Spend a few minutes to play with your %s?" -msgstr "" +msgstr "花幾分鐘跟你的%s玩耍?" #: src/monexamine.cpp msgid "Really kill the zombie slave?" @@ -183234,16 +184594,16 @@ msgstr "確定殺掉屍奴?" #: src/monexamine.cpp msgid "Pet armor" -msgstr "" +msgstr "寵物護甲" #: src/monexamine.cpp #, c-format msgid "Select an battery to insert into your %s." -msgstr "" +msgstr "選擇要裝入%s的電池" #: src/monexamine.cpp msgid "Swipe your ID card into the mech's security port?" -msgstr "" +msgstr "把你的ID卡刷入機甲的安全連接埠嗎?" #: src/monexamine.cpp #, c-format @@ -183257,17 +184617,17 @@ msgstr "" #: src/monexamine.cpp #, c-format msgid "You remove the %s's harness." -msgstr "" +msgstr "你移除%s上的輓具" #: src/monexamine.cpp #, c-format msgid "You climb on the %s." -msgstr "" +msgstr "你爬上%s" #: src/monexamine.cpp #, c-format msgid "You hear your %s whir to life." -msgstr "" +msgstr "你聽到%s發出聲響活過來了。" #: src/monexamine.cpp #, c-format @@ -183325,22 +184685,22 @@ msgstr "你的 %1$s 的 %2$s 沒有空間來容納它, 它太龐大了!" #: src/monexamine.cpp #, c-format msgid "Your %1$s is too heavy for your %2$s." -msgstr "" +msgstr "你的%1$s對%2$s來說太重了。" #: src/monexamine.cpp #, c-format msgid "You put the %1$s on your %2$s, protecting it from future harm." -msgstr "" +msgstr "你把%1$s穿到%2$s上,保護它減少傷害。" #: src/monexamine.cpp #, c-format msgid "You unhitch %s from the vehicle." -msgstr "" +msgstr "你從車輛解開了%s。" #: src/monexamine.cpp #, c-format msgid "Your %1$s isn't wearing armor!" -msgstr "" +msgstr "你的%1$s並沒有穿著護甲!" #: src/monexamine.cpp msgid "You tear out the pheromone ball from the zombie slave." @@ -183349,7 +184709,7 @@ msgstr "你從屍奴的身上扯下費洛蒙球體。" #: src/monexamine.cpp #, c-format msgid "Select an item to tie your %s with." -msgstr "" +msgstr "選擇要跟%s綁在一起的物品。" #: src/monexamine.cpp #, c-format @@ -183370,18 +184730,18 @@ msgstr "在地上圍繞著物體流竄的 %s 快速的散開!" #: src/monmove.cpp #, c-format msgid "The %1$s slowly but firmly puts %2$s down onto the autodoc couch." -msgstr "" +msgstr "%1$s緩慢但堅定地把%2$s放到自動醫生的操作沙發上。" #: src/monmove.cpp #, c-format msgid "The %s produces a syringe full of some translucent liquid." -msgstr "" +msgstr "%s做了一隻注滿半透明液體的注射器。" #: src/monmove.cpp msgid "" "a soft robotic voice say, \"Please step away from the autodoc, this patient " "needs immediate care.\"" -msgstr "" +msgstr "一個溫柔的機器人聲音說:「請遠離自動醫生,這名患者需要緊急治療。」" #: src/monmove.cpp #, c-format @@ -183447,7 +184807,7 @@ msgstr "%1$s 反彈 %2$s。" #: src/monmove.cpp #, c-format msgid "%1$s shoves %2$s out of their way!" -msgstr "" +msgstr "%1$s把擋路的%2$s用力推開!" #: src/monster.cpp msgid "tiny" @@ -183523,12 +184883,12 @@ msgstr "裝甲板" #: src/monster.cpp msgid "dense jelly mass" -msgstr "" +msgstr "濃稠膠凍塊" #: src/monster.cpp #, c-format msgid "wearing %1$s" -msgstr "" +msgstr "穿戴%1$s" #: src/monster.cpp #, c-format @@ -183569,32 +184929,32 @@ msgstr "難度" #: src/monster.cpp msgid "Minimal threat." -msgstr "" +msgstr "可忽視的威脅。" #: src/monster.cpp msgid "Mildly dangerous." -msgstr "" +msgstr "輕度危險。" #: src/monster.cpp msgid "Dangerous." -msgstr "" +msgstr "危險。" #: src/monster.cpp msgid "Very dangerous." -msgstr "" +msgstr "非常危險。" #: src/monster.cpp msgid "Extremely dangerous." -msgstr "" +msgstr "極度危險的。" #: src/monster.cpp msgid "Fatally dangerous!" -msgstr "" +msgstr "致命的危險!" #: src/monster.cpp #, c-format msgid "This is a %s. %s %s" -msgstr "" +msgstr "這是%s。%s%s" #: src/monster.cpp #, c-format @@ -183781,15 +185141,15 @@ msgstr "有東西擊中你的 %1$s, 但你的 %2$s 擋住了。" #: src/monster.cpp msgid "You're envenomed!" -msgstr "" +msgstr "你被下毒了!" #: src/monster.cpp msgid "You feel venom flood your body, wracking you with pain..." -msgstr "" +msgstr "你感覺毒液竄流你的全身,讓你異常疼痛..." #: src/monster.cpp msgid "You feel venom enter your body!" -msgstr "" +msgstr "你感覺到毒液進入你的身體!" #: src/monster.cpp #, c-format @@ -183924,11 +185284,11 @@ msgstr "孢子把 %1$s 轉化成 %2$s!" #: src/morale.cpp msgid "Total morale:" -msgstr "" +msgstr "總士氣:" #: src/morale.cpp msgid "Focus trends towards:" -msgstr "" +msgstr "關注動向:" #: src/morale.cpp msgid "Nothing affects your morale" @@ -183948,11 +185308,11 @@ msgstr "數值" #: src/morale.cpp msgid "Total positive morale" -msgstr "" +msgstr "積極的士氣:" #: src/morale.cpp msgid "Total negative morale" -msgstr "" +msgstr "總負面士氣:" #: src/mutation.cpp #, c-format @@ -184009,11 +185369,11 @@ msgstr "我們是個隊伍, 我們行的!" #: src/mutation.cpp msgid "You can only do that in a wooded area." -msgstr "" +msgstr "你只能在樹木繁茂的地區做這個。" #: src/mutation.cpp msgid "You can only do that next to a tree." -msgstr "" +msgstr "你只能在樹旁做這個。" #: src/mutation.cpp msgid "You reach out to the trees with your roots." @@ -184208,12 +185568,12 @@ msgstr "你過往的生活片段在你眼前閃過。" #: src/mutation_data.cpp msgctxt "memorial_male" msgid "Crossed a threshold" -msgstr "" +msgstr "越過門檻" #: src/mutation_data.cpp msgctxt "memorial_female" msgid "Crossed a threshold" -msgstr "" +msgstr "越過門檻" #: src/mutation_data.cpp msgid "Oh, yeah! That's the stuff!" @@ -184413,7 +185773,7 @@ msgstr "點數" msgid "" "Sort by: %1$s (Press %2$s to" " change)" -msgstr "" +msgstr "排序方式:%1$s (按 %2$s更換) " #: src/newcharacter.cpp msgid "Multiple pools" @@ -184709,15 +186069,15 @@ msgstr "啟動" #: src/newcharacter.cpp msgid "Pets:" -msgstr "" +msgstr "寵物:" #: src/newcharacter.cpp msgid "Spells:" -msgstr "" +msgstr "法術:" #: src/newcharacter.cpp msgid " level " -msgstr "" +msgstr "等級" #: src/newcharacter.cpp #, c-format @@ -184964,7 +186324,7 @@ msgstr " 穿戴了 %s。" #: src/npc.cpp #, c-format msgid " puts away the %s in the %s." -msgstr "" +msgstr "把%s放入%s。" #: src/npc.cpp #, c-format @@ -185136,7 +186496,7 @@ msgstr "憤怒: " #: src/npc.cpp #, c-format msgid "%s disappears." -msgstr "" +msgstr "%s 消失了。" #: src/npc.cpp src/player.cpp #, c-format @@ -185169,13 +186529,13 @@ msgstr "冷血的殺害了看起來很美味的無辜者, %s。" #, c-format msgctxt "memorial_male" msgid "Killed an innocent, %s, in cold blood. They were weak." -msgstr "" +msgstr "冷血地殺害了無辜的 %s。他們很弱。" #: src/npc.cpp #, c-format msgctxt "memorial_female" msgid "Killed an innocent, %s, in cold blood. They were weak." -msgstr "" +msgstr "冷血地殺害了無辜的 %s。他們很弱。" #: src/npc.cpp #, c-format @@ -185237,11 +186597,11 @@ msgstr "治療你" #: src/npc.cpp msgid "Performing a task" -msgstr "" +msgstr "執行任務" #: src/npc.cpp msgid "Trying to recover stolen goods" -msgstr "" +msgstr "試圖追回贓物" #: src/npc.cpp msgid "NPC Legacy Attitude" @@ -185265,7 +186625,7 @@ msgstr "正在追隨你。" #: src/npc.cpp msgid "Is guiding you." -msgstr "" +msgstr "指引著你。" #: src/npc.cpp msgid "Will try to kill you or flee from you if you reveal yourself." @@ -185281,35 +186641,35 @@ msgstr "仍是無辜的, 殺害他們將被視為謀殺。" #: src/npc.cpp msgid "He " -msgstr "" +msgstr "他" #: src/npc.cpp msgid "She " -msgstr "" +msgstr "她" #: src/npc.cpp msgid "is uninjured." -msgstr "" +msgstr "沒有受傷。" #: src/npc.cpp msgid "is lightly injured." -msgstr "" +msgstr "有點輕傷。" #: src/npc.cpp msgid "is moderately injured." -msgstr "" +msgstr "中度受傷。" #: src/npc.cpp msgid "is heavily injured." -msgstr "" +msgstr "受了重傷。" #: src/npc.cpp msgid "is severely injured." -msgstr "" +msgstr "嚴重受傷。" #: src/npc.cpp msgid "is nearly dead!" -msgstr "" +msgstr "瀕臨死亡!" #: src/npc.cpp msgid " gets angry!" @@ -185339,7 +186699,7 @@ msgstr "%s 躺下並開始睡覺。" #: src/npcmove.cpp #, c-format msgid "Hold still %s, I'm coming to help you." -msgstr "" +msgstr "%s別動,我來幫你。" #: src/npcmove.cpp msgid "Don't move a muscle..." @@ -185400,6 +186760,11 @@ msgstr "%1$s 丟棄了 %2$s。" msgid "Hold on, I want to pulp that %s." msgstr "等等, 我要把 %s 搗爛。" +#: src/npcmove.cpp +#, c-format +msgid "%s completed the assigned task." +msgstr "%s完成了被指派的工作。" + #: src/npcmove.cpp #, c-format msgid "%1$s throws a %2$s." @@ -185452,7 +186817,7 @@ msgstr "%1$s 拿了你的 %2$s 。" #, c-format msgid "" "From your two-way radio you hear %s reporting in, 'I've arrived, boss!'" -msgstr "" +msgstr "你聽到 %s 的聲音從雙向無線電傳來:「老大,我到了!」。" #: src/npcmove.cpp #, c-format @@ -185509,93 +186874,93 @@ msgstr "勸說" #: src/npctalk.cpp msgid "Everyone" -msgstr "" +msgstr "每個人" #: src/npctalk.cpp #, c-format msgid "%s currently has these temporary orders:" -msgstr "" +msgstr "%s 目前有這些臨時指令:" #: src/npctalk.cpp msgid "None." -msgstr "" +msgstr "沒有。" #: src/npctalk.cpp msgid "Other followers might have different temporary orders." -msgstr "" +msgstr "其他的追隨者可能有不同的臨時命令。" #: src/npctalk.cpp msgid "Issue what temporary order?" -msgstr "" +msgstr "發出什麼臨時命令?" #: src/npctalk.cpp msgid "Done issuing orders" -msgstr "" +msgstr "完成發號施令" #: src/npctalk.cpp msgid "Don't engage hostiles for the time being" -msgstr "" +msgstr "暫時不要與敵人交戰" #: src/npctalk.cpp msgid "Go back to your usual engagement habits" -msgstr "" +msgstr "回復成你平常的攻擊習慣" #: src/npctalk.cpp msgid "Don't use ranged weapons for a while" -msgstr "" +msgstr "暫時不要使用遠程武器" #: src/npctalk.cpp msgid "Use whatever weapon you normally would" -msgstr "" +msgstr "使用你常用的武器" #: src/npctalk.cpp msgid "Hold off on pulping zombies for a while" -msgstr "" +msgstr "暫時停止砸爛殭屍" #: src/npctalk.cpp msgid "Pulp zombies if you like" -msgstr "" +msgstr "隨你高興地搗毀殭屍" #: src/npctalk.cpp msgid "Go back to keeping your usual distance" -msgstr "" +msgstr "回復到你平常保持的距離" #: src/npctalk.cpp msgid "Stick close to me for now" -msgstr "" +msgstr "現在緊靠著我" #: src/npctalk.cpp msgid "Move farther from me if you need to" -msgstr "" +msgstr "必要的話可以遠離我" #: src/npctalk.cpp msgid "Go back to your usual sleeping habits" -msgstr "" +msgstr "回復成你平常的睡眠習慣" #: src/npctalk.cpp msgid "Take a nap if you need it" -msgstr "" +msgstr "必要的話打個盹沒關係" #: src/npctalk.cpp msgid "Let's go back to your usual behaviors" -msgstr "" +msgstr "恢復到你平常的行為模式吧。" #: src/npctalk.cpp msgid "You can't speak without your face!" -msgstr "" +msgstr "你的臉不見了,不能說話!" #: src/npctalk.cpp msgid "What do you want to do?" -msgstr "" +msgstr "你想要做什麼?" #: src/npctalk.cpp #, c-format msgid "Talk to %s" -msgstr "" +msgstr "與 %s 交談" #: src/npctalk.cpp msgid "Talk to ..." -msgstr "" +msgstr "交談 ... " #: src/npctalk.cpp msgid "Yell" @@ -185608,44 +186973,44 @@ msgstr "大聲喊出一句話" #: src/npctalk.cpp #, c-format msgid "Tell %s to follow" -msgstr "" +msgstr "叫 %s 跟隨" #: src/npctalk.cpp msgid "Tell someone to follow..." -msgstr "" +msgstr "叫某人跟隨 ... " #: src/npctalk.cpp #, c-format msgid "Tell %s to guard" -msgstr "" +msgstr "叫 %s 守衛" #: src/npctalk.cpp msgid "Tell someone to guard..." -msgstr "" +msgstr "叫某人守衛 ... " #: src/npctalk.cpp msgid "Tell everyone on your team to wake up" -msgstr "" +msgstr "叫你團隊裡的每個人都起床" #: src/npctalk.cpp msgid "Tell everyone on your team to prepare for danger" -msgstr "" +msgstr "叫你團隊裡的每個人準備好面對危險" #: src/npctalk.cpp msgid "Tell everyone on your team to relax (Clear Overrides)" -msgstr "" +msgstr "叫你團隊裡的每個人放輕鬆(清除其他指令)。" #: src/npctalk.cpp msgid "Tell everyone on your team to temporarily..." -msgstr "" +msgstr "叫你團隊裡的每個人暫時 ... " #: src/npctalk.cpp msgid "Talk to whom?" -msgstr "" +msgstr "跟誰說?" #: src/npctalk.cpp msgid "loudly." -msgstr "" +msgstr "大聲地。" #: src/npctalk.cpp msgid "Enter a sentence to yell" @@ -185653,29 +187018,29 @@ msgstr "輸入你想喊出的話" #: src/npctalk.cpp msgid "Who should guard here?" -msgstr "" +msgstr "哪位要守衛這裡?" #: src/npctalk.cpp msgid "Everyone guard here!" -msgstr "" +msgstr "大家守衛這裡!" #: src/npctalk.cpp #, c-format msgid "Guard here, %s!" -msgstr "" +msgstr "守衛此地,%s!" #: src/npctalk.cpp msgid "Who should follow you?" -msgstr "" +msgstr "哪位該跟隨你?" #: src/npctalk.cpp msgid "Everyone follow me!" -msgstr "" +msgstr "大家跟我來!" #: src/npctalk.cpp #, c-format msgid "Follow me, %s!" -msgstr "" +msgstr "跟我來, %s!" #: src/npctalk.cpp msgid "Stay awake!" @@ -185685,11 +187050,11 @@ msgstr "保持清醒!" msgid "" "We're in danger. Stay awake, stay close, don't go wandering off, and don't " "open any doors." -msgstr "" +msgstr "我們處於危險之中。保持清醒,不要分散,不要亂跑,不要打開任何門。" #: src/npctalk.cpp msgid "As you were." -msgstr "" +msgstr "和你一樣。" #: src/npctalk.cpp #, c-format @@ -185699,7 +187064,7 @@ msgstr "你大喊 %s" #: src/npctalk.cpp #, c-format msgid "%s yelling %s" -msgstr "" +msgstr "%s大喊%s" #: src/npctalk.cpp #, c-format @@ -185714,11 +187079,11 @@ msgstr "%s 和你說話。" #: src/npctalk.cpp #, c-format msgid "&%s stays silent." -msgstr "" +msgstr "&%s 保持沉默。" #: src/npctalk.cpp msgid "&You can't talk without your face." -msgstr "" +msgstr "&你的臉不見了,不能說話。" #: src/npctalk.cpp msgid "&You are deaf and can't talk." @@ -185736,6 +187101,8 @@ msgid "" "%1$s is sedated and can't be moved or woken up until the medication or sedation wears off.\n" "You estimate it will wear off in %2$s." msgstr "" +"%1$s吃了鎮靜劑,藥效消失前無法移動也醒不來。\n" +"你估計藥效大約能持續%2$s。" #: src/npctalk.cpp msgid " And I have more I'd like you to do." @@ -185822,13 +187189,15 @@ msgstr "不累" #: src/npctalk.cpp msgid ". Will need sleep in " -msgstr "" +msgstr "。 保持清醒的時間 " #: src/npctalk.cpp msgid "" "\n" "Will need water in " msgstr "" +"\n" +"保持水分充足的時間" #: src/npctalk.cpp msgid "" @@ -185843,6 +187212,8 @@ msgid "" "\n" "Will need food in " msgstr "" +"\n" +"保持飽腹狀態的時間" #: src/npctalk.cpp msgid "" @@ -185878,12 +187249,12 @@ msgstr "%s (花費 $%d)" #: src/npctalk.cpp #, c-format msgid "%s: %d (%d%%) -> %d (cost $%d)" -msgstr "" +msgstr "%s:%d(%d%%)->%d(花費 $%d)" #: src/npctalk.cpp #, c-format msgid "%s: %d (%d%%) -> %d" -msgstr "" +msgstr "%s:%d(%d%%)->%d" #: src/npctalk.cpp msgid "Okay, thanks." @@ -185905,6 +187276,10 @@ msgstr "拳頭" msgid "BADAMMO" msgstr "卡彈" +#: src/npctalk.cpp +msgid "doing this and that" +msgstr "做各種事情" + #: src/npctalk.cpp msgctxt "punctuation" msgid "." @@ -185970,7 +187345,7 @@ msgstr "你: %s" #: src/npctalk.cpp msgid "You can't afford it!" -msgstr "" +msgstr "你負擔不起!" #. ~ %1%s is the NPC name, %2$s is an item #: src/npctalk.cpp @@ -185982,7 +187357,7 @@ msgstr "%1$s 給了你 %2$s 。" #: src/npctalk.cpp #, c-format msgid "%1$s gives you %2$d %3$s." -msgstr "" +msgstr "%1$s給你%2$d個%3$s。" #. ~ %1$s is a translated item name #: src/npctalk.cpp @@ -185994,19 +187369,24 @@ msgstr "你沒有 %1$s !" #: src/npctalk.cpp #, c-format msgid "You give %1$s a %2$s." -msgstr "" +msgstr "你給%1$s一個%2$s。" #. ~ %1%s is the NPC name, %2$d is a number of items, %3$s are items #: src/npctalk.cpp #, c-format msgid "You give %1$s %2$d %3$s." -msgstr "" +msgstr "你給%1$s%2$d個%3$s。" #. ~ %1%s is the "You" or the NPC name, %2$s are a translated item name #: src/npctalk.cpp #, c-format msgid "%1$s doesn't have a %2$s!" -msgstr "" +msgstr "%1$s並沒有%2$s!" + +#: src/npctalk.cpp +#, c-format +msgid "%1$s gives you %2$s." +msgstr "%1$s給你%2$s。" #: src/npctalk.cpp msgid "I don't trust you enough to eat THIS..." @@ -186073,7 +187453,7 @@ msgstr "我只能再裝 %s %s。" #: src/npctalk.cpp msgid "...or to store anything else for that matter." -msgstr "" +msgstr "...或為此儲存各種其他物品。" #: src/npctalk.cpp msgid "It is too heavy for me to carry." @@ -186089,45 +187469,45 @@ msgstr "交易" #: src/npctalk_funcs.cpp msgid "Select a destination" -msgstr "" +msgstr "選擇目的地" #: src/npctalk_funcs.cpp #, c-format msgid "%s at (%d, %d)" -msgstr "" +msgstr "%s 位於(%d,%d)" #: src/npctalk_funcs.cpp msgid "My current location" -msgstr "" +msgstr "我目前的位置" #. ~ %1$s is the NPC's translated name, %2$s is the translated faction camp #. name #: src/npctalk_funcs.cpp #, c-format msgid "%1$s is assigned to %2$s" -msgstr "" +msgstr "%1$s被派到%2$s營寨" #. ~ %1$s is the NPC's translated name, %2$s is the translated faction camp #. name #: src/npctalk_funcs.cpp #, c-format msgid "%1$s is assigned to guard %2$s" -msgstr "" +msgstr "%1$s被派到守衛%2$s營寨" #. ~ %1$s is the NPC's translated name, %2$s is the pronoun for the NPC's #. gender #: src/npctalk_funcs.cpp #, c-format msgid "%1$s will wait for you where %2$s is." -msgstr "" +msgstr "%1$s會在%2$s所在的位置等待著你。" #: src/npctalk_funcs.cpp msgid "he" -msgstr "" +msgstr "他" #: src/npctalk_funcs.cpp msgid "she" -msgstr "" +msgstr "她" #: src/npctalk_funcs.cpp #, c-format @@ -186177,19 +187557,19 @@ msgstr "%1$s 給了你 %2$s" #: src/npctalk_funcs.cpp msgid "Choose a new hairstyle" -msgstr "" +msgstr "選擇新髮型" #: src/npctalk_funcs.cpp msgid "Choose a new facial hair style" -msgstr "" +msgstr "選擇新鬍型" #: src/npctalk_funcs.cpp msgid "Actually... I've changed my mind." -msgstr "" +msgstr "其實...我改變主意了。" #: src/npctalk_funcs.cpp msgid "You get a trendy new cut!" -msgstr "" +msgstr "你剪了個酷潮的新造型!" #: src/npctalk_funcs.cpp #, c-format @@ -186204,12 +187584,12 @@ msgstr "%s 替你刮了一臉體面的鬍子…" #: src/npctalk_funcs.cpp #, c-format msgid "That was a pleasant conversation with %s..." -msgstr "" +msgstr "與%s愉快的談話..." #: src/npctalk_funcs.cpp #, c-format msgid "That was a pleasant conversation with %s." -msgstr "" +msgstr "與%s愉快的談話。" #: src/npctalk_funcs.cpp #, c-format @@ -186261,11 +187641,6 @@ msgstr "交付:" msgid "Select a follower" msgstr "選擇一位追隨者" -#: src/npctalk_funcs.cpp -#, c-format -msgid "Pickup rules for %s" -msgstr "%s 的撿取規則" - #: src/npctrade.cpp #, c-format msgid "Volume: %s %s, Weight: %.1f %s" @@ -186278,22 +187653,22 @@ msgstr "交易" #: src/npctrade.cpp #, c-format msgid "Credit %s" -msgstr "" +msgstr "信用%s" #: src/npctrade.cpp #, c-format msgid "Debt %s" -msgstr "" +msgstr "債務%s" #: src/npctrade.cpp #, c-format msgid ": trading %d" -msgstr "" +msgstr ":交易%d" #: src/npctrade.cpp #, c-format msgid " (%d)" -msgstr "" +msgstr "(%d)" #: src/npctrade.cpp msgid "< Back" @@ -186310,16 +187685,16 @@ msgstr "檢視哪個物品?" #: src/npctrade.cpp #, c-format msgid "Trade how many %s [MAX: %d]: " -msgstr "" +msgstr "交易多少 %s [最多:%d]:" #: src/npctrade.cpp msgid "You'll need to offer me more than that." -msgstr "" +msgstr "你需要給我更多才行。" #: src/npctrade.cpp #, c-format msgid "Sorry, I'm only willing to extend you %s in credit." -msgstr "" +msgstr "抱歉,我只願意給你的信用額度擴展%s。" #: src/npctrade.cpp #, c-format @@ -186336,7 +187711,7 @@ msgstr "" #: src/npctrade.cpp msgid "Looks like a deal! Accept this trade?" -msgstr "" +msgstr "似乎是不錯的交易!願意成交嗎?" #: src/npctrade.h msgid "" @@ -186672,11 +188047,11 @@ msgstr "自動註記" #: src/options.cpp msgid "If true, automatically sets notes" -msgstr "" +msgstr "如果設定成 [是] ,將會開啟大地圖自動註記" #: src/options.cpp msgid "Auto notes (stairs)" -msgstr "" +msgstr "自動註記(上下樓梯)" #: src/options.cpp msgid "" @@ -186686,12 +188061,12 @@ msgstr "設定為 [是], 會自動將上下樓梯的位置註記於地圖上。" #: src/options.cpp msgid "Auto notes (map extras)" -msgstr "" +msgstr "自動註記(特殊地點)" #: src/options.cpp msgid "" "If true, automatically sets notes on places that contain various map extras" -msgstr "" +msgstr "如果設定成 [是],將會在大地圖上自動註記各種特殊的地點" #: src/options.cpp msgid "Circular distances" @@ -186753,7 +188128,7 @@ msgstr "選擇音效包" #: src/options.cpp msgid "Choose the soundpack you want to use. Requires restart." -msgstr "" +msgstr "選擇你想要使用的音效包。需要重啟遊戲。" #: src/options.cpp msgid "Music volume" @@ -186773,11 +188148,11 @@ msgstr "調整遊戲音效的音量。" #: src/options.cpp msgid "Ambient sound volume" -msgstr "" +msgstr "環境音量" #: src/options.cpp msgid "Adjust the volume of ambient sounds being played by the game." -msgstr "" +msgstr "調整遊戲播放環境聲音的音量。" #: src/options.cpp msgid "Language" @@ -186985,13 +188360,13 @@ msgstr "設定為 [是], 控制車輛時會把車輛的朝向以白色的 X 符 #: src/options.cpp msgid "Reverse steering direction in reverse" -msgstr "" +msgstr "倒車時將方向鍵左右顛倒。" #: src/options.cpp msgid "" "If true, when driving a vehicle in reverse, steering should also reverse " "like real life." -msgstr "" +msgstr "如果設定成 [是],當駕駛車輛倒車時,方向盤轉向也應該像現實世界一樣是跟前進相反的。" #: src/options.cpp msgid "Sidebar position" @@ -188670,11 +190045,11 @@ msgstr "[移動鍵] 平移地圖" #: src/overmap_ui.cpp msgid "Press W to preview route." -msgstr "" +msgstr "按 W 來預覽路線" #: src/overmap_ui.cpp msgid "Press again to confirm." -msgstr "" +msgstr "再按一次確定路線" #: src/overmap_ui.cpp #, c-format @@ -188804,7 +190179,7 @@ msgstr "[Esc 或 Q] 取消" #: src/overmap_ui.cpp msgid "Travel to this point?" -msgstr "" +msgstr "移動至此?" #. ~ First parameter is a terrain name, second parameter is a direction, and #. third parameter is a city name. @@ -188850,75 +190225,75 @@ msgstr "感知 " #: src/panels.cpp msgid "New moon" -msgstr "" +msgstr "新月" #: src/panels.cpp msgid "Waxing crescent" -msgstr "" +msgstr "眉月" #: src/panels.cpp msgid "Half moon" -msgstr "" +msgstr "半月" #: src/panels.cpp msgid "Waxing gibbous" -msgstr "" +msgstr "盈凸月" #: src/panels.cpp msgid "Full moon" -msgstr "" +msgstr "滿月" #: src/panels.cpp msgid "Waning gibbous" -msgstr "" +msgstr "虧凸月" #: src/panels.cpp msgid "Waning crescent" -msgstr "" +msgstr "殘月" #: src/panels.cpp msgid "Dark moon" -msgstr "" +msgstr "闇月" #: src/panels.cpp msgid "Around midnight" -msgstr "" +msgstr "午夜" #: src/panels.cpp msgid "Dead of night" -msgstr "" +msgstr "深夜" #: src/panels.cpp msgid "Around dawn" -msgstr "" +msgstr "黎明" #: src/panels.cpp msgid "Early morning" -msgstr "" +msgstr "清晨" #: src/panels.cpp msgid "Morning" -msgstr "" +msgstr "早上" #: src/panels.cpp msgid "Around noon" -msgstr "" +msgstr "中午" #: src/panels.cpp msgid "Afternoon" -msgstr "" +msgstr "下午" #: src/panels.cpp msgid "Early evening" -msgstr "" +msgstr "傍晚" #: src/panels.cpp msgid "Around dusk" -msgstr "" +msgstr "黃昏" #: src/panels.cpp msgid "Night" -msgstr "" +msgstr "夜晚" #: src/panels.cpp msgid " (Rising!!)" @@ -188946,31 +190321,27 @@ msgstr " (下降中!!)" #: src/panels.cpp msgid "Scorching!" -msgstr "" +msgstr "酷熱!" #: src/panels.cpp msgid "Very hot!" -msgstr "" +msgstr "很熱!" #: src/panels.cpp msgid "Very cold!" -msgstr "" +msgstr "很冷!" #: src/panels.cpp msgid "Freezing!" -msgstr "" - -#: src/panels.cpp -msgid "Pain " -msgstr "" +msgstr "凍僵!" #: src/panels.cpp msgid "Bad" -msgstr "" +msgstr "惡劣" #: src/panels.cpp msgid "Good" -msgstr "" +msgstr "良好" #: src/panels.cpp msgid "SAFE" @@ -188978,27 +190349,27 @@ msgstr "安全" #: src/panels.cpp msgid "STM" -msgstr "" +msgstr "體力" #: src/panels.cpp msgid "PWR" -msgstr "" +msgstr "能量" #: src/panels.cpp msgid "STR" -msgstr "" +msgstr "力量" #: src/panels.cpp msgid "DEX" -msgstr "" +msgstr "敏捷" #: src/panels.cpp msgid "INT" -msgstr "" +msgstr "智力" #: src/panels.cpp msgid "PER" -msgstr "" +msgstr "感知" #: src/panels.cpp msgctxt "movement-type" @@ -189017,11 +190388,11 @@ msgstr "走" #: src/panels.cpp msgid "DEAF" -msgstr "" +msgstr "耳聾" #: src/panels.cpp msgid "Sound:" -msgstr "" +msgstr "聲響:" #: src/panels.cpp msgid "Time: ???" @@ -189029,7 +190400,7 @@ msgstr "時間: ???" #: src/panels.cpp msgid "Moon" -msgstr "" +msgstr "月亮" #: src/panels.cpp msgid "Focus" @@ -189037,119 +190408,107 @@ msgstr "專注" #: src/panels.cpp msgid "Stam :" -msgstr "" +msgstr "體力:" #: src/panels.cpp msgid "Focus:" -msgstr "" +msgstr "專注:" #: src/panels.cpp msgid "Mood :" -msgstr "" +msgstr "心情:" #: src/panels.cpp msgid "Speed:" -msgstr "" +msgstr "速度:" #: src/panels.cpp msgid "Move :" -msgstr "" +msgstr "行動:" #: src/panels.cpp msgid "Str :" -msgstr "" +msgstr "力量:" #: src/panels.cpp msgid "Int :" -msgstr "" +msgstr "智力:" #: src/panels.cpp msgid "Dex :" -msgstr "" +msgstr "敏捷:" #: src/panels.cpp msgid "Per :" -msgstr "" +msgstr "感知:" #: src/panels.cpp msgid "Power:" -msgstr "" +msgstr "能量:" #: src/panels.cpp msgid "Safe :" -msgstr "" +msgstr "安全:" #: src/panels.cpp msgid "On" -msgstr "" +msgstr "開" #: src/panels.cpp msgid "Place: " -msgstr "" +msgstr "地點:" #: src/panels.cpp msgid "Sky : Underground" -msgstr "" +msgstr "天空:在地下看不到" #: src/panels.cpp msgid "Sky :" -msgstr "" +msgstr "天空:" #: src/panels.cpp msgid "Light:" -msgstr "" +msgstr "光線:" #: src/panels.cpp #, c-format msgid "Date : %s, day %d" -msgstr "" +msgstr "日期 : %s, 第 %d 日" #: src/panels.cpp #, c-format msgid "Time : %s" -msgstr "" +msgstr "時間 : %s" #: src/panels.cpp msgid "Time : ???" -msgstr "" +msgstr "時間 : ???" #: src/panels.cpp #, c-format msgid "Moon : %s" -msgstr "" +msgstr "月亮 : %s" #: src/panels.cpp #, c-format msgid "Temp : %s" -msgstr "" +msgstr "氣溫 : %s" #: src/panels.cpp msgid "Wield:" -msgstr "" +msgstr "手持:" #: src/panels.cpp msgid "Style:" -msgstr "" - -#: src/panels.cpp -msgid "Food :" -msgstr "" - -#: src/panels.cpp -msgid "Drink:" -msgstr "" +msgstr "武術:" #: src/panels.cpp msgid "Rest :" -msgstr "" - -#: src/panels.cpp -msgid "Pain :" -msgstr "" +msgstr "休息:" #: src/panels.cpp msgid "Heat :" -msgstr "" +msgstr "溫度:" #: src/panels.cpp msgid "Underground" @@ -189157,7 +190516,7 @@ msgstr "地下" #: src/panels.cpp msgid "Wind" -msgstr "" +msgstr "風速" #: src/panels.cpp msgid "Stm" @@ -189165,7 +190524,7 @@ msgstr "體力" #: src/panels.cpp msgid "Spd " -msgstr "" +msgstr "速度" #: src/panels.cpp msgid "POWER" @@ -189173,28 +190532,28 @@ msgstr "能量" #: src/panels.cpp msgid "Head :" -msgstr "" +msgstr "頭部:" #: src/panels.cpp msgid "Torso:" -msgstr "" +msgstr "軀幹:" #: src/panels.cpp msgid "Arms :" -msgstr "" +msgstr "手臂:" #: src/panels.cpp msgid "Legs :" -msgstr "" +msgstr "腿部:" #: src/panels.cpp msgid "Feet :" -msgstr "" +msgstr "腳掌:" #: src/panels.cpp #, c-format msgid "Goal: %s" -msgstr "" +msgstr "目標: %s" #: src/panels.cpp msgid "Weather :" @@ -189202,7 +190561,7 @@ msgstr "天氣 :" #: src/panels.cpp msgid "Moon :" -msgstr "" +msgstr "月亮:" #: src/panels.cpp msgid "Lighting:" @@ -189214,7 +190573,7 @@ msgstr "聽不見!" #: src/panels.cpp msgid "Weapon :" -msgstr "" +msgstr "武器:" #: src/panels.cpp msgid "No Style" @@ -189222,123 +190581,123 @@ msgstr "沒有招式" #: src/panels.cpp msgid "Day " -msgstr "" +msgstr "天數" #: src/panels.cpp msgid "Temp : " -msgstr "" +msgstr "氣溫:" #: src/panels.cpp msgid "to open sidebar options" -msgstr "" +msgstr "打開側邊欄選項" #: src/panels.cpp msgid "Mana" -msgstr "" +msgstr "法力" #: src/panels.cpp msgid "Max Mana" -msgstr "" +msgstr "法力最大值" #: src/panels.cpp msgid "Location" -msgstr "" +msgstr "地點" #: src/panels.cpp msgid "Weather" -msgstr "" +msgstr "天氣" #: src/panels.cpp msgid "Lighting" -msgstr "" +msgstr "光線" #: src/panels.cpp msgid "Weapon" -msgstr "" +msgstr "武器" #: src/panels.cpp msgid "Time" -msgstr "" +msgstr "時間" #: src/panels.cpp msgid "Compass" -msgstr "" +msgstr "方向" #: src/panels.cpp msgid "Log" -msgstr "" +msgstr "訊息" #: src/panels.cpp msgid "Map" -msgstr "" +msgstr "地圖" #: src/panels.cpp msgid "Limbs" -msgstr "" +msgstr "肢體" #: src/panels.cpp msgid "Sound" -msgstr "" +msgstr "聲響" #: src/panels.cpp msgid "Stats" -msgstr "" +msgstr "屬性" #: src/panels.cpp msgid "Needs" -msgstr "" +msgstr "需求" #: src/panels.cpp msgid "Env" -msgstr "" +msgstr "環境" #: src/panels.cpp msgid "Vehicle" -msgstr "" +msgstr "載具" #: src/panels.cpp msgid "Hint" -msgstr "" +msgstr "提示" #: src/panels.cpp msgid "Movement" -msgstr "" +msgstr "運動" #: src/panels.cpp msgid "Location Alt" -msgstr "" +msgstr "位置環境" #: src/panels.cpp msgid "classic" -msgstr "" +msgstr "經典樣式" #: src/panels.cpp msgid "compact" -msgstr "" +msgstr "緊湊樣式" #: src/panels.cpp msgid "labels-narrow" -msgstr "" +msgstr "較窄標籤" #: src/panels.cpp msgid "labels" -msgstr "" +msgstr "標籤樣式" #: src/panels.cpp msgid "panel options" -msgstr "" +msgstr "面板選項" #: src/panels.cpp msgid "SIDEBAR OPTIONS" -msgstr "" +msgstr "側邊欄選項" #: src/panels.cpp msgid "Toggle panels on/off" -msgstr "" +msgstr "切換面板顯示與否" #: src/panels.cpp msgid "Change display order" -msgstr "" +msgstr "改變顯示順序" #: src/panels.cpp msgid "Exit" @@ -189393,11 +190752,11 @@ msgstr "你的儲物空間不足了!" #: src/pickup.cpp msgid "Get items from vehicle cargo" -msgstr "" +msgstr "從車輛貨箱中拿取物品" #: src/pickup.cpp msgid "Get items from where?" -msgstr "" +msgstr "從哪邊拿取物品?" #: src/pickup.cpp src/vehicle_use.cpp msgid "Get items on the ground" @@ -190894,11 +192253,6 @@ msgstr "%s (%d)" msgid "%s with %s (%d)" msgstr "%s 含 %s (%d)" -#: src/player.cpp -#, c-format -msgid "%s, %s" -msgstr "%s, %s" - #: src/player.cpp msgid "| Location " msgstr "| 位置 " @@ -191629,12 +192983,16 @@ msgstr "你的 %s 技能下降到 %d!" #: src/player.cpp msgid "Very Hungry" -msgstr "" +msgstr "非常飢餓" #: src/player.cpp msgid "Peckish" msgstr "空腹" +#: src/player.cpp +msgid "Pain " +msgstr "疼痛" + #: src/player_activity.cpp msgid "You pause for a moment to catch your breath." msgstr "你暫停一會去恢復正常呼吸。" @@ -191737,17 +193095,17 @@ msgstr "" #: src/player_display.cpp #, c-format msgid "Base HP: %d" -msgstr "" +msgstr "基礎生命值: %d" #: src/player_display.cpp #, c-format msgid "Carry weight (%s): %.1f" -msgstr "" +msgstr "攜帶重量 (%s): %.1f" #: src/player_display.cpp #, c-format msgid "Melee damage: %.1f" -msgstr "" +msgstr "近戰傷害: %.1f" #: src/player_display.cpp msgid "" @@ -191760,17 +193118,17 @@ msgstr "" #: src/player_display.cpp #, c-format msgid "Melee to-hit bonus: %+.1lf" -msgstr "" +msgstr "近戰命中率加成: %+.1lf" #: src/player_display.cpp #, c-format msgid "Ranged penalty: %+d" -msgstr "" +msgstr "遠程懲罰: %+d" #: src/player_display.cpp #, c-format msgid "Throwing penalty per target's dodge: %+d" -msgstr "" +msgstr "每點目標閃避值的投擲懲罰: %+d" #: src/player_display.cpp msgid "" @@ -191785,17 +193143,17 @@ msgstr "" #: src/player_display.cpp #, c-format msgid "Read times: %d%%" -msgstr "" +msgstr "閱讀時間: %d%%" #: src/player_display.cpp #, c-format msgid "Crafting bonus: %d%%" -msgstr "" +msgstr "製作加成: %d%%" #: src/player_display.cpp #, c-format msgid "Skill rust: %d%%" -msgstr "" +msgstr "技能衰減: %d%%" #: src/player_display.cpp msgid "" @@ -191806,23 +193164,23 @@ msgstr "感知是遠程戰鬥的重要屬性。它同時也用於偵測陷阱和 #: src/player_display.cpp #, c-format msgid "Trap detection level: %d" -msgstr "" +msgstr "偵測陷阱等級: %d" #: src/player_display.cpp #, c-format msgid "Aiming penalty: %+d" -msgstr "" +msgstr "瞄準懲罰: %+d" #: src/player_display.cpp msgid "Weight:" -msgstr "" +msgstr "體重:" #: src/player_display.cpp msgid "" "Your weight is a general indicator of how much fat your body has stored up, " "which in turn shows how prepared you are to survive for a time without " "food.Having too much, or too little, can be unhealthy." -msgstr "" +msgstr "你的體重是你身體儲存多少脂肪的總指標,這也說明了你在沒有食物的情況下能夠生存下去的準備有多少。過多或過少,都是不健康的。" #: src/player_display.cpp #, c-format @@ -191832,7 +193190,7 @@ msgstr "生化能量: %1$d" #: src/player_display.cpp #, c-format msgid "Bionic Power: %1$d / %2$d" -msgstr "" +msgstr "生化能量: %1$d / %2$d" #: src/player_display.cpp msgid "Base Move Cost:" @@ -191859,12 +193217,12 @@ msgstr "口渴 -%s%d%%" #: src/player_display.cpp msgid "Underfed" -msgstr "" +msgstr "營養不良" #: src/player_display.cpp #, c-format msgid "%-20s-%s%d%%" -msgstr "" +msgstr "%-20s-%s%d%%" #: src/player_display.cpp #, c-format @@ -192630,12 +193988,12 @@ msgstr "" #: src/ranged.cpp #, c-format msgid "%s shoots something." -msgstr "" +msgstr "%s 射擊了某物。" #: src/ranged.cpp #, c-format msgid "You hear %s." -msgstr "" +msgstr "你聽到 %s 。" #: src/ranged.cpp #, c-format @@ -193008,11 +194366,11 @@ msgstr "和 " #: src/requirements.cpp msgid "These tools are required:" -msgstr "" +msgstr "需要這些工具:" #: src/requirements.cpp msgid "These components are required:" -msgstr "" +msgstr "需要這些元件:" #: src/requirements.cpp msgid "These tools are missing:" @@ -193020,7 +194378,7 @@ msgstr "這工具缺少:" #: src/requirements.cpp msgid "These components are missing:" -msgstr "" +msgstr "缺少這些元件:" #: src/requirements.cpp msgid "Components required:" @@ -193070,6 +194428,10 @@ msgstr "模式" msgid "Safe Mode enabled:" msgstr "啟用安全模式:" +#: src/safemode_ui.cpp +msgid "Please load a character first to use this page!" +msgstr "請先讀取一個角色以使用這個頁面!" + #: src/safemode_ui.cpp msgid "Safe Mode manager currently inactive." msgstr "安全模式管理器尚未啟動。" @@ -193176,7 +194538,7 @@ msgstr "聽到 %s!" #: src/sounds.cpp #, c-format msgid "From your position you hear %1$s." -msgstr "" +msgstr "你聽到 %1$s 從你的位置傳來。" #: src/sounds.cpp #, c-format @@ -193234,7 +194596,7 @@ msgstr "吸引了更多暗古龍的注意!" #: src/timed_event.cpp msgid "a tortured scream!" -msgstr "" +msgstr "一聲被折磨的尖叫!" #: src/timed_event.cpp msgid "The eye you're carrying lets out a tortured scream!" @@ -193508,12 +194870,12 @@ msgstr " 被絆索陷阱絆倒了!" #: src/trapfunc.cpp #, c-format msgid "Your %s trips over a tripwire!" -msgstr "" +msgstr "你的%s被絆索陷阱絆倒了!" #: src/trapfunc.cpp #, c-format msgid "Your %s triggers a crossbow trap." -msgstr "" +msgstr "你的%s觸發了十字弓陷阱。" #: src/trapfunc.cpp msgid "You trigger a crossbow trap!" @@ -193564,7 +194926,7 @@ msgstr "喀碰!" #: src/trapfunc.cpp #, c-format msgid "Your %s triggers a shotgun trap!" -msgstr "" +msgstr "你的%s觸發了霰彈槍陷阱!" #: src/trapfunc.cpp msgid "You trigger a shotgun trap!" @@ -193592,7 +194954,7 @@ msgstr "霰彈槍射中了 %s!" #: src/trapfunc.cpp #, c-format msgid "A blade swings out and hacks your %s!" -msgstr "" +msgstr "刀刃揮出並且砍中了你的 %s !" #: src/trapfunc.cpp msgid "A blade swings out and hacks your torso!" @@ -193619,7 +194981,7 @@ msgstr "啪!" #: src/trapfunc.cpp #, c-format msgid "A snare closes on your %s's leg!" -msgstr "" +msgstr "你的%s的腳被小型繩套陷阱綁住了!" #: src/trapfunc.cpp msgid "A snare closes on your leg." @@ -193642,7 +195004,7 @@ msgstr "觸發輕型圈套。" #: src/trapfunc.cpp #, c-format msgid "A snare closes on your %s's leg" -msgstr "" +msgstr "你的%s的腳被小型繩套陷阱綁住了" #: src/trapfunc.cpp #, c-format @@ -193780,7 +195142,7 @@ msgstr "踏上了解剖器。" #: src/trapfunc.cpp #, c-format msgid "Electrical beams emit from the floor and slice your %s!" -msgstr "" +msgstr "電子光束從地板中射出並切割你的 %s !" #: src/trapfunc.cpp msgid " falls in a pit!" @@ -193817,7 +195179,7 @@ msgstr "你靈巧地著地。" #: src/trapfunc.cpp #, c-format msgid "Your %s falls into a pit!" -msgstr "" +msgstr "你的 %s 掉進了坑裡!" #: src/trapfunc.cpp msgid "You fall in a spiked pit!" @@ -193900,7 +195262,7 @@ msgstr "踩入岩漿。" #: src/trapfunc.cpp #, c-format msgid "Your %s is burned by the lava!" -msgstr "" +msgstr "你的 %s 被岩漿燒掉了!" #: src/trapfunc.cpp msgid "You fail to attach it..." @@ -193922,7 +195284,7 @@ msgstr " 踩進了一個流沙坑, 但設法把自己拉回安全的地 #: src/trapfunc.cpp #, c-format msgid "Your %s falls into a sinkhole!" -msgstr "" +msgstr "你的 %s 摔進了流沙坑!" #: src/trapfunc.cpp msgctxt "memorial_male" @@ -194119,7 +195481,7 @@ msgstr[0] "%s 對著你的方向發出了 %d 吵雜的聲響。" #, c-format msgid "%s emits an IFF warning beep." msgid_plural "%s emits %d annoyed sounding beeps." -msgstr[0] "" +msgstr[0] "%s 發出了 %d 吵雜的嗶嗶聲。" #. ~ default name for the tutorial #: src/tutorial.cpp @@ -194151,17 +195513,17 @@ msgstr "> %1$s%2$s %3$i\n" #: src/veh_interact.cpp #, c-format msgid "You cannot rename this vehicle as it is owned by: %s." -msgstr "" +msgstr "你不能重新命名此載具,因為它是由 %s 所擁有的。" #: src/veh_interact.cpp #, c-format msgid "You cannot assign crew on this vehicle as it is owned by: %s." -msgstr "" +msgstr "你不能在此載具上指派乘員,因為它是由 %s 所擁有的。" #: src/veh_interact.cpp #, c-format msgid "You cannot relabel this vehicle as it is owned by: %s." -msgstr "" +msgstr "你不能重新標記此載具,因為它是由 %s 所擁有的。" #. ~ %1$s is fuel_type #: src/veh_interact.cpp @@ -194198,7 +195560,7 @@ msgstr "> %1$s>%2$s %3$i 以安裝更多轉向軸。" #: src/veh_interact.cpp #, c-format msgid "strength ( assisted ) %d" -msgstr "" +msgstr "力量 ( 協助 ) %d" #: src/veh_interact.cpp #, c-format @@ -194313,7 +195675,7 @@ msgstr "士氣低落無法進行建造…" #: src/veh_interact.cpp msgid "It's too dark to see what you are doing..." -msgstr "" +msgstr "太暗了,看不到東西無法進行動作..." #: src/veh_interact.cpp msgid "You can't install parts while driving." @@ -194321,7 +195683,7 @@ msgstr "你無法在開車時安裝零件。" #: src/veh_interact.cpp msgid "Installing this part will make the vehicle unfoldable. Continue?" -msgstr "" +msgstr "安裝此部件將使載具無法折疊。是否繼續?" #: src/veh_interact.cpp msgid "Choose shape:" @@ -194378,7 +195740,7 @@ msgstr "你不能使用便攜式電池為車輛電池充電。" #: src/veh_interact.cpp #, c-format msgid "Engines: %sSafe %4d kW %sMax %4d kW" -msgstr "" +msgstr "引擎功率:%s安全%4dkW%s最大%4dkW" #: src/veh_interact.cpp msgid "Fuel Use" @@ -194687,22 +196049,22 @@ msgstr "需要修理:" #: src/veh_interact.cpp #, c-format msgid "Air drag: %5.2f" -msgstr "" +msgstr "空氣阻力: %5.2f" #: src/veh_interact.cpp #, c-format msgid "Water drag: %5.2f" -msgstr "" +msgstr "流體阻力: %5.2f" #: src/veh_interact.cpp #, c-format msgid "Rolling drag: %5.2f" -msgstr "" +msgstr "滾動阻力: %5.2f" #: src/veh_interact.cpp #, c-format msgid "Static drag: %5d" -msgstr "" +msgstr "靜態阻力: %5d" #: src/veh_interact.cpp #, c-format @@ -194712,7 +196074,7 @@ msgstr "越野: %4d%%" #: src/veh_interact.cpp #, c-format msgid "Draft: %4.2fm" -msgstr "" +msgstr "吃水: %4.2fm" #: src/veh_interact.cpp msgid "Name: " @@ -194720,11 +196082,11 @@ msgstr "名稱: " #: src/veh_interact.cpp msgid "Yours" -msgstr "" +msgstr "占有" #: src/veh_interact.cpp msgid "not owned" -msgstr "" +msgstr "非占有" #: src/veh_interact.cpp msgid "nstall" @@ -194926,7 +196288,7 @@ msgstr "你找不到 %s 要求的基礎零件。" #: src/veh_interact.cpp #, c-format msgid "Choose a facing direction for the new %s. Press space to continue." -msgstr "" +msgstr "設定新安裝的%s的照射方向。按空白鍵繼續。" #: src/veh_interact.cpp #, c-format @@ -195007,12 +196369,12 @@ msgstr "你沒有達成修理 %s 的需求。" #: src/veh_utils.cpp #, c-format msgid "You replace the %1$s's %2$s. (was %3$s)" -msgstr "" +msgstr "你替換了 %1$s 的 %2$s,(原本是 %3$s)" #: src/veh_utils.cpp #, c-format msgid "You repair the %1$s's %2$s. (was %3$s)" -msgstr "" +msgstr "你修復了 %1$s 的 %2$s,(原本是 %3$s)" #: src/vehicle.cpp msgid "Lost connection with the vehicle due to distance!" @@ -195097,17 +196459,17 @@ msgstr "" #: src/vehicle.cpp #, c-format msgid "You unload the %s from the bike rack." -msgstr "" +msgstr "你從自行車架上卸下了 %s。" #. ~ %s is the vehicle being loaded onto the bicycle rack #: src/vehicle.cpp #, c-format msgid "You can't unload the %s from the bike rack." -msgstr "" +msgstr "你無法從自行車架上卸下 %s。" #: src/vehicle.cpp msgid "hmm" -msgstr "" +msgstr "隆隆" #: src/vehicle.cpp msgid "hummm!" @@ -195142,7 +196504,7 @@ msgstr "BRUMBRUMBRUMBRUM!!!" msgid "" "This vehicle belongs to: %s, there may be consequences if you are observed " "interacting with it, continue?" -msgstr "" +msgstr "此載具屬於 %s 所有,如果被注意到你跟它有互動可能會產生一些後果,是否繼續?" #: src/vehicle.cpp #, c-format @@ -195206,12 +196568,12 @@ msgstr "這裡有更多的零件…" #: src/vehicle_display.cpp #, c-format msgid " (%s/%s charge)" -msgstr "" +msgstr "(%s/%s 單位)" #: src/vehicle_display.cpp #, c-format msgid " (%.1fL %s)" -msgstr "" +msgstr " (%.1fL %s)" #. ~ used/total volume of a cargo vehicle part #: src/vehicle_display.cpp @@ -195236,11 +196598,11 @@ msgstr "標籤: %s" #: src/vehicle_display.cpp msgid "mL" -msgstr "" +msgstr "毫升" #: src/vehicle_display.cpp msgid "kJ" -msgstr "" +msgstr "千焦耳" #: src/vehicle_display.cpp msgid "full" @@ -195504,11 +196866,11 @@ msgstr "車頭燈" #: src/vehicle_use.cpp msgid "wide angle headlights" -msgstr "" +msgstr "廣角車頭燈" #: src/vehicle_use.cpp msgid "directed overhead lights" -msgstr "" +msgstr "定向車頂燈" #: src/vehicle_use.cpp msgid "overhead lights" @@ -195532,11 +196894,11 @@ msgstr "冰箱" #: src/vehicle_use.cpp msgid "space heater" -msgstr "" +msgstr "小型供暖器" #: src/vehicle_use.cpp msgid "cooler" -msgstr "" +msgstr "冷卻器" #: src/vehicle_use.cpp msgid "recharger" @@ -195665,7 +197027,7 @@ msgstr "你關閉了引擎並且放開了控制器。" #: src/vehicle_use.cpp msgid "the engine go silent" -msgstr "" +msgstr "引擎熄火了" #: src/vehicle_use.cpp msgid "Turn off the engine" @@ -195805,7 +197167,7 @@ msgstr "" #: src/vehicle_use.cpp #, c-format msgid "the %s starting" -msgstr "" +msgstr " %s 開始了" #: src/vehicle_use.cpp msgid "You honk the horn!" @@ -195882,27 +197244,31 @@ msgstr "嗶嗶" msgid "" "You turn the autoclave off before it's finished the program, and open its " "door." -msgstr "" +msgstr "你在高壓滅菌器完成滅菌週期之前把它關閉,並打開蓋子。" + +#: src/vehicle_use.cpp +msgid "The autoclave is empty, there's no point in starting it." +msgstr "高壓滅菌器裡沒有東西,啟動它沒有意義。" #: src/vehicle_use.cpp #, c-format msgid "" "You need 8 charges of water in tanks of the %s for the autoclave to run." -msgstr "" +msgstr "你的 %s 的儲水容器裡需要有 8 單位的水讓高壓滅菌器使用。" #: src/vehicle_use.cpp msgid "" "You need to remove all filthy items from the autoclave to start the " "sterilizing cycle." -msgstr "" +msgstr "你必須把高壓滅菌器內所有骯髒的物品全部拿出來,高壓滅菌器才能開始滅菌週期。" #: src/vehicle_use.cpp msgid "Only CBMs can be sterilized in an autoclave." -msgstr "" +msgstr "只有生化插件才能使用高壓滅菌器來進行滅菌。" #: src/vehicle_use.cpp msgid "You turn the autoclave on and it starts its cycle." -msgstr "" +msgstr "你啟動高壓滅菌器,它開始進行它的滅菌週期。" #: src/vehicle_use.cpp msgid "" @@ -195910,6 +197276,10 @@ msgid "" "its lid." msgstr "你在洗衣機完成洗滌程序之前把它關閉, 並打開蓋子。" +#: src/vehicle_use.cpp +msgid "The washing machine is empty, there's no point in starting it." +msgstr "洗衣機裡沒有東西,啟動它沒有意義。" + #: src/vehicle_use.cpp #, c-format msgid "" @@ -195928,7 +197298,7 @@ msgstr "你需要移除所有在洗衣機裡的非污穢物品才能開始洗滌 #: src/vehicle_use.cpp msgid "CBMs can't be cleaned in a washing machine. You need to remove them." -msgstr "" +msgstr "生化插件無法使用洗衣機來清洗。你需要移除他們。" #: src/vehicle_use.cpp msgid "" @@ -195940,65 +197310,69 @@ msgstr "你把一些洗衣粉倒進洗衣機中, 把蓋子蓋上, 然後開著 msgid "" "Soft items can't be cleaned in a dishwasher, you should use a washing " "machine for that. You need to remove them:" -msgstr "" +msgstr "一些東西無法使用洗碗機清洗,你需要使用洗衣機來清洗。你需要移除它們:" #: src/vehicle_use.cpp msgid "" "You turn the dishwasher off before it's finished the program, and open its " "lid." -msgstr "" +msgstr "你在洗碗機完成洗滌程序之前把它關閉,並打開蓋子。" + +#: src/vehicle_use.cpp +msgid "The dishwasher is empty, there's no point in starting it." +msgstr "洗碗機裡沒有東西,啟動它沒有意義。" #: src/vehicle_use.cpp #, c-format msgid "" "You need 24 charges of water in tanks of the %s to fill the dishwasher." -msgstr "" +msgstr "你的 %s 的儲水容器裡需要有 24 單位的水去注入洗碗機。" #: src/vehicle_use.cpp msgid "You need 5 charges of detergent for the dishwasher." -msgstr "" +msgstr "洗碗機需要 5 單位的清潔劑才能使用。" #: src/vehicle_use.cpp msgid "" "You need to remove all non-filthy items from the dishwasher to start the " "washing program." -msgstr "" +msgstr "你必須把洗碗機內不是骯髒的物品全部拿出來,洗碗機才能開始洗滌程序。" #: src/vehicle_use.cpp msgid "" "You pour some detergent into the dishwasher, close its lid, and turn it on." " The dishwasher is being filled with water from vehicle tanks." -msgstr "" +msgstr "你把一些清潔劑倒進洗碗機中,蓋上蓋子,然後打開開關。洗碗機正從載具的儲水箱注入水。" #: src/vehicle_use.cpp msgid "Where is the creature to harness?" -msgstr "" +msgstr "將此生物套到哪裡?" #: src/vehicle_use.cpp #, c-format msgid "You harness your %s to the %s." -msgstr "" +msgstr "你把你的 %s 套到了 %s 上。" #: src/vehicle_use.cpp #, c-format msgid "You untie your %s." -msgstr "" +msgstr "你解開你的 %s。" #: src/vehicle_use.cpp msgid "This creature is not friendly!" -msgstr "" +msgstr "此生物並非友善狀態!" #: src/vehicle_use.cpp msgid "This creature cannot be harnessed." -msgstr "" +msgstr "此生物不能套上轅與軛。" #: src/vehicle_use.cpp msgid "The harness is blocked." -msgstr "" +msgstr "車轅受阻。" #: src/vehicle_use.cpp msgid "No creature there." -msgstr "" +msgstr "沒有生物在那裡" #: src/vehicle_use.cpp msgid "Examine vehicle" @@ -196006,11 +197380,11 @@ msgstr "檢視車輛" #: src/vehicle_use.cpp msgid "Deactivate the autoclave" -msgstr "" +msgstr "關閉高壓滅菌器" #: src/vehicle_use.cpp msgid "Activate the autoclave (1.5 hours)" -msgstr "" +msgstr "啟動高壓滅菌器 (1.5小時)" #: src/vehicle_use.cpp msgid "Deactivate the washing machine" @@ -196022,11 +197396,11 @@ msgstr "啟動洗衣機 (1.5小時)" #: src/vehicle_use.cpp msgid "Deactivate the dishwasher" -msgstr "" +msgstr "關閉洗碗機" #: src/vehicle_use.cpp msgid "Activate the dishwasher (1.5 hours)" -msgstr "" +msgstr "啟動洗碗機 (1.5小時)" #: src/vehicle_use.cpp msgid "Use the hotplate" @@ -196038,7 +197412,7 @@ msgstr "把水裝滿容器" #: src/vehicle_use.cpp msgid "Use a towel" -msgstr "" +msgstr "使用毛巾" #: src/vehicle_use.cpp msgid "Use the welding rig?" @@ -196062,16 +197436,16 @@ msgstr "裝載或卸載車輛" #: src/vehicle_use.cpp msgid "Harness an animal" -msgstr "" +msgstr "套上動物" #: src/vehicle_use.cpp msgid "Reload seed drill with seeds" -msgstr "" +msgstr "以種子重新裝填播種機" #: src/vehicle_use.cpp #, c-format msgid "Craft at the %s" -msgstr "" +msgstr "在 %s 上製作" #: src/vehicle_use.cpp #, c-format @@ -196235,71 +197609,71 @@ msgstr "%s kPa" #: src/weather.cpp msgid "North-East" -msgstr "" +msgstr "東北" #: src/weather.cpp msgid "South-East" -msgstr "" +msgstr "東南" #: src/weather.cpp msgid "South-West" -msgstr "" +msgstr "西南" #: src/weather.cpp msgid "North-West" -msgstr "" +msgstr "西北" #: src/weather.cpp msgid "Calm" -msgstr "" +msgstr "無風" #: src/weather.cpp msgid "Light Air" -msgstr "" +msgstr "軟風" #: src/weather.cpp msgid "Light Breeze" -msgstr "" +msgstr "輕風" #: src/weather.cpp msgid "Gentle Breeze" -msgstr "" +msgstr "微風" #: src/weather.cpp msgid "Moderate Breeze" -msgstr "" +msgstr "和風" #: src/weather.cpp msgid "Fresh Breeze" -msgstr "" +msgstr "清風" #: src/weather.cpp msgid "Strong Breeze" -msgstr "" +msgstr "強風" #: src/weather.cpp msgid "Moderate Gale" -msgstr "" +msgstr "疾風" #: src/weather.cpp msgid "Gale" -msgstr "" +msgstr "大風" #: src/weather.cpp msgid "Strong Gale" -msgstr "" +msgstr "烈風" #: src/weather.cpp msgid "Whole Gale" -msgstr "" +msgstr "狂風" #: src/weather.cpp msgid "Violent Storm" -msgstr "" +msgstr "暴風" #: src/weather.cpp msgid "Hurricane" -msgstr "" +msgstr "颶風" #: src/weather.cpp #, c-format @@ -196535,7 +197909,7 @@ msgstr "選擇一個要進入遊戲的世界。" #: src/worldfactory.cpp msgid "last world info" -msgstr "" +msgstr "上次的世界的資訊" #: src/worldfactory.cpp msgid " ACTIVE WORLD MODS " diff --git a/lang/update_pot.sh b/lang/update_pot.sh index 24c990bfefe97..ae988c8dbf63d 100755 --- a/lang/update_pot.sh +++ b/lang/update_pot.sh @@ -30,8 +30,8 @@ xgettext --default-domain="cataclysm-dda" \ --keyword="ngettext:1,2" \ --keyword="translate_marker" \ --keyword="translate_marker_context:1c,2" \ - --keyword="translation:1,1t" \ - --keyword="translation:1c,2,2t" \ + --keyword="to_translation:1,1t" \ + --keyword="to_translation:1c,2,2t" \ --from-code="UTF-8" \ src/*.cpp src/*.h lang/json/*.py if [ $? -ne 0 ]; then @@ -61,7 +61,7 @@ then fi # convert line endings to unix -if [[ $(uname -s) =~ ^(CYGWIN|MINGW)* ]] +if [[ $(uname -s) =~ ^\(CYGWIN|MINGW\)* ]] then echo "> Converting line endings to Unix" if ! sed -i -e 's/\r$//' lang/po/cataclysm-dda.pot diff --git a/org.Cataclysm.DDA.Tiles.json b/org.Cataclysm.DDA.Tiles.json deleted file mode 100644 index 86485e08f7bd3..0000000000000 --- a/org.Cataclysm.DDA.Tiles.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "id": "org.Cataclysm.DDA.Tiles", - "runtime": "org.freedesktop.Platform", - "runtime-version": "18.08", - "sdk": "org.freedesktop.Sdk", - "command": "cataclysm-launcher", - "finish-args": [ - "--filesystem=home", - "--socket=pulseaudio", - "--socket=wayland", - "--socket=fallback-x11", - "--share=ipc", - "--device=dri" - ], - "modules": [ - { - "name": "cataclysm-tiles", - "buildsystem": "simple", - "build-commands": [ - "CPPPATH=/app/include make -j4 NATIVE=linux64 USE_HOME_DIR=1 CLANG=1 TILES=1 SOUND=1 RELEASE=1 CCACHE=1 LTO=1 RUNTESTS=0 ASTYLE=0", - "install -Dm755 cataclysm-tiles /app/bin/cataclysm-tiles", - "install -Dm755 cataclysm-launcher /app/bin/cataclysm-launcher", - "install -Dm755 data/xdg/org.Cataclysm.DDA.Tiles.desktop /app/share/applications/org.Cataclysm.DDA.Tiles.desktop", - "install -Dm644 data/xdg/cataclysm-dda.appdata.xml /app/share/metainfo/org.Cataclysm.DDA.Tiles.appdata.xml", - "install -Dm644 data/xdg/cataclysm-dda.svg /app/share/icons/hicolor/128x128/apps/org.Cataclysm.DDA.Tiles.svg", - "cp -r data /app/bin/data", - "cp -r gfx /app/bin/gfx" - ], - "sources": [ - { - "type": "dir", - "path": "." - } - ] - } - ] -} diff --git a/org.Cataclysm.DDA.json b/org.Cataclysm.DDA.json deleted file mode 100644 index a8c27e7f74076..0000000000000 --- a/org.Cataclysm.DDA.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "id": "org.Cataclysm.DDA", - "runtime": "org.freedesktop.Platform", - "runtime-version": "18.08", - "sdk": "org.freedesktop.Sdk", - "command": "cataclysm-launcher", - "finish-args": [ - "--filesystem=home" - ], - "modules": [ - { - "name": "cataclysm", - "buildsystem": "simple", - "build-commands": [ - "CPPPATH=/app/include make -j4 NATIVE=linux64 USE_HOME_DIR=1 CLANG=1 RELEASE=1 LTO=1 CCACHE=1 RUNTESTS=0 ASTYLE=0", - "install -Dm755 cataclysm /app/bin/cataclysm", - "install -Dm755 cataclysm-launcher /app/bin/cataclysm-launcher", - "install -Dm755 data/xdg/org.Cataclysm.DDA.desktop /app/share/applications/org.Cataclysm.DDA.desktop", - "install -Dm644 data/xdg/cataclysm-dda.appdata.xml /app/share/metainfo/org.Cataclysm.DDA.appdata.xml", - "install -Dm644 data/xdg/cataclysm-dda.svg /app/share/icons/hicolor/128x128/apps/org.Cataclysm.DDA.svg", - "cp -r data /app/bin/data" - ], - "sources": [ - { - "type": "dir", - "path": "." - } - ] - } - ] -} diff --git a/org.cataclysmdda.CataclysmDDA.json b/org.cataclysmdda.CataclysmDDA.json new file mode 100644 index 0000000000000..6311853d7ab54 --- /dev/null +++ b/org.cataclysmdda.CataclysmDDA.json @@ -0,0 +1,43 @@ +{ + "id": "org.cataclysmdda.CataclysmDDA", + "runtime": "org.freedesktop.Platform", + "runtime-version": "18.08", + "sdk": "org.freedesktop.Sdk", + "command": "cataclysm-tiles", + "rename-desktop-file": "cataclysm-dda.desktop", + "rename-appdata-file": "cataclysm-dda.appdata.xml", + "rename-icon": "cataclysm-dda", + "finish-args": [ + "--socket=pulseaudio", + "--socket=wayland", + "--socket=fallback-x11", + "--share=ipc", + "--device=dri" + ], + "modules": [ + { + "name": "cataclysm-tiles", + "buildsystem": "simple", + "build-options": { + "env": { + "MAKE_ARGS": "PREFIX=/app LANGUAGES=all USE_XDG_DIR=1 TILES=1 SOUND=1 RELEASE=1 RUNTESTS=0 ASTYLE=0 LINTJSON=0" + } + }, + "build-commands": [ + "make -j $FLATPAK_BUILDER_N_JOBS $MAKE_ARGS", + "make $MAKE_ARGS localization", + "make $MAKE_ARGS install", + "install -Dm755 data/xdg/cataclysm-dda.desktop /app/share/applications/cataclysm-dda.desktop", + "install -Dm644 data/xdg/cataclysm-dda.appdata.xml /app/share/metainfo/cataclysm-dda.appdata.xml", + "install -Dm644 data/xdg/cataclysm-dda.svg /app/share/icons/hicolor/scalable/apps/cataclysm-dda.svg" + ], + "sources": [ + { + "type": "git", + "url": "https://github.com/CleverRaven/Cataclysm-DDA", + "tag": "0.D" + } + ] + } + ] +} diff --git a/src/action.cpp b/src/action.cpp index 845857838ed9f..419ad2483ffa5 100644 --- a/src/action.cpp +++ b/src/action.cpp @@ -70,9 +70,8 @@ void parse_keymap( std::istream &keymap_txt, std::map &kmap, } else if( id[0] != '#' ) { const action_id act = look_up_action( id ); if( act == ACTION_NULL ) { - debugmsg( "\ -Warning! keymap.txt contains an unknown action, \"%s\"\n\ -Fix \"%s\" at your next chance!", id, FILENAMES["keymap"] ); + debugmsg( "Warning! keymap.txt contains an unknown action, \"%s\"\n" + "Fix \"%s\" at your next chance!", id, FILENAMES["keymap"] ); } else { while( !keymap_txt.eof() ) { char ch; @@ -81,10 +80,9 @@ Fix \"%s\" at your next chance!", id, FILENAMES["keymap"] ); break; } else if( ch != ' ' || keymap_txt.peek() == '\n' ) { if( kmap.find( ch ) != kmap.end() ) { - debugmsg( "\ -Warning! '%c' assigned twice in the keymap!\n\ -%s is being ignored.\n\ -Fix \"%s\" at your next chance!", ch, id, FILENAMES["keymap"] ); + debugmsg( "Warning! '%c' assigned twice in the keymap!\n" + "%s is being ignored.\n" + "Fix \"%s\" at your next chance!", ch, id, FILENAMES["keymap"] ); } else { kmap[ ch ] = act; } @@ -274,6 +272,8 @@ std::string action_ident( action_id act ) return "safemode"; case ACTION_TOGGLE_AUTOSAFE: return "autosafe"; + case ACTION_TOGGLE_THIEF_MODE: + return "toggle_thief_mode"; case ACTION_IGNORE_ENEMY: return "ignore_enemy"; case ACTION_WHITELIST_ENEMY: @@ -358,6 +358,8 @@ std::string action_ident( action_id act ) return "open_options"; case ACTION_AUTOPICKUP: return "open_autopickup"; + case ACTION_AUTONOTES: + return "open_autonotes"; case ACTION_SAFEMODE: return "open_safemode"; case ACTION_COLOR: @@ -408,6 +410,7 @@ bool can_action_change_worldstate( const action_id act ) case ACTION_KEYBINDINGS: case ACTION_OPTIONS: case ACTION_AUTOPICKUP: + case ACTION_AUTONOTES: case ACTION_SAFEMODE: case ACTION_COLOR: case ACTION_WORLD_MODS: @@ -487,27 +490,27 @@ std::string press_x( action_id act, const std::string &key_bound_pre, return ctxt.press_x( action_ident( act ), key_bound_pre, key_bound_suf, key_unbound ); } -action_id get_movement_direction_from_delta( const int dx, const int dy, const int dz ) +action_id get_movement_direction_from_delta( const tripoint &d ) { - if( dz == -1 ) { + if( d.z == -1 ) { return ACTION_MOVE_DOWN; - } else if( dz == 1 ) { + } else if( d.z == 1 ) { return ACTION_MOVE_UP; } - if( dx == 0 && dy == -1 ) { + if( d.xy() == point_north ) { return ACTION_MOVE_N; - } else if( dx == 1 && dy == -1 ) { + } else if( d.xy() == point_north_east ) { return ACTION_MOVE_NE; - } else if( dx == 1 && dy == 0 ) { + } else if( d.xy() == point_east ) { return ACTION_MOVE_E; - } else if( dx == 1 && dy == 1 ) { + } else if( d.xy() == point_south_east ) { return ACTION_MOVE_SE; - } else if( dx == 0 && dy == 1 ) { + } else if( d.xy() == point_south ) { return ACTION_MOVE_S; - } else if( dx == -1 && dy == 1 ) { + } else if( d.xy() == point_south_west ) { return ACTION_MOVE_SW; - } else if( dx == -1 && dy == 0 ) { + } else if( d.xy() == point_west ) { return ACTION_MOVE_W; } else { return ACTION_MOVE_NW; @@ -874,6 +877,7 @@ action_id handle_action_menu() REGISTER_ACTION( ACTION_MUTATIONS ); REGISTER_ACTION( ACTION_CONTROL_VEHICLE ); REGISTER_ACTION( ACTION_ITEMACTION ); + REGISTER_ACTION( ACTION_TOGGLE_THIEF_MODE ); #if defined(TILES) if( use_tiles ) { REGISTER_ACTION( ACTION_ZOOM_OUT ); @@ -891,7 +895,7 @@ action_id handle_action_menu() std::string title = _( "Actions" ); if( category != "back" ) { - catgname = _( category ); + catgname = category; capitalize_letter( catgname, 0 ); title += ": " + catgname; } @@ -945,6 +949,7 @@ action_id handle_main_menu() REGISTER_ACTION( ACTION_KEYBINDINGS ); REGISTER_ACTION( ACTION_OPTIONS ); REGISTER_ACTION( ACTION_AUTOPICKUP ); + REGISTER_ACTION( ACTION_AUTONOTES ); REGISTER_ACTION( ACTION_SAFEMODE ); REGISTER_ACTION( ACTION_COLOR ); REGISTER_ACTION( ACTION_WORLD_MODS ); @@ -976,11 +981,6 @@ action_id handle_main_menu() } } -cata::optional choose_direction( const std::string &message ) -{ - return choose_direction( message, false ); -} - cata::optional choose_direction( const std::string &message, const bool allow_vertical ) { input_context ctxt( "DEFAULTMODE" ); @@ -1019,11 +1019,6 @@ cata::optional choose_direction( const std::string &message, const boo return cata::nullopt; } -cata::optional choose_adjacent( const std::string &message ) -{ - return choose_adjacent( message, false ); -} - cata::optional choose_adjacent( const std::string &message, const bool allow_vertical ) { const cata::optional dir = choose_direction( message, allow_vertical ); @@ -1031,35 +1026,40 @@ cata::optional choose_adjacent( const std::string &message, const bool } cata::optional choose_adjacent_highlight( const std::string &message, - const action_id action_to_highlight ) + const action_id action, const bool allow_vertical ) { - return choose_adjacent_highlight( message, action_to_highlight, false ); -} - -cata::optional choose_adjacent_highlight( const std::string &message, - const action_id action_to_highlight, const bool allow_vertical ) -{ - const std::function f = [&action_to_highlight]( tripoint p ) { - return can_interact_at( action_to_highlight, p ); + const std::function f = [&action]( const tripoint & p ) { + return can_interact_at( action, p ); }; return choose_adjacent_highlight( message, f, allow_vertical ); } cata::optional choose_adjacent_highlight( const std::string &message, - const std::function &should_highlight, const bool allow_vertical ) + const std::function &allowed, + const bool allow_vertical, const bool auto_select_if_single ) { // Highlight nearby terrain according to the highlight function - bool highlighted = false; - for( const tripoint &pos : g->m.points_in_radius( g->u.pos(), 1 ) ) { - if( should_highlight( pos ) ) { - highlighted = true; - g->m.drawsq( g->w_terrain, g->u, pos, - true, true, g->u.pos() + g->u.view_offset ); + if( allowed != nullptr ) { + cata::optional single; + bool highlighted = false; + for( const tripoint &pos : g->m.points_in_radius( g->u.pos(), 1 ) ) { + if( allowed( pos ) ) { + if( !highlighted ) { + single = pos; + highlighted = true; + } else { + single = cata::nullopt; + } + g->m.drawsq( g->w_terrain, g->u, pos, + true, true, g->u.pos() + g->u.view_offset ); + } + } + if( highlighted ) { + wrefresh( g->w_terrain ); + } + if( auto_select_if_single && single ) { + return single; } } - if( highlighted ) { - wrefresh( g->w_terrain ); - } - return choose_adjacent( message, allow_vertical ); } diff --git a/src/action.h b/src/action.h index 67ff89e4e3238..d21a31f3342cc 100644 --- a/src/action.h +++ b/src/action.h @@ -211,6 +211,8 @@ enum action_id : int { ACTION_TOGGLE_SAFEMODE, /** Turn automatic triggering of safemode on/off */ ACTION_TOGGLE_AUTOSAFE, + /** Toggle permanent attitude to stealing */ + ACTION_TOGGLE_THIEF_MODE, /** Ignore the enemy that triggered safemode */ ACTION_IGNORE_ENEMY, /** Whitelist the enemy that triggered safemode */ @@ -253,6 +255,8 @@ enum action_id : int { ACTION_OPTIONS, /** Open autopickup manager */ ACTION_AUTOPICKUP, + /** Open autonotes manager */ + ACTION_AUTONOTES, /** Open safemode manager */ ACTION_SAFEMODE, /** Open color manager */ @@ -410,17 +414,6 @@ bool can_action_change_worldstate( action_id act ); */ action_id action_from_key( char ch ); -/** - * Request player input of adjacent tile on current z-level - * - * Asks the player to input desired direction of an adjacent tile, for example when executing - * an examine or directional item drop. This version of the function assumes that the requested - * tile will be on the player's current z-level. - * - * @param[in] message Message used in assembling the prompt to the player - */ -cata::optional choose_adjacent( const std::string &message ); - /** * Request player input of adjacent tile, possibly including vertical tiles * @@ -431,35 +424,7 @@ cata::optional choose_adjacent( const std::string &message ); * @param[in] message Message used in assembling the prompt to the player * @param[in] allow_vertical Allows player to select tiles above/below them if true */ -cata::optional choose_adjacent( const std::string &message, bool allow_vertical ); - -/** - * Request player input of a direction on current z-level - * - * Asks the player to input a desired direction. This differs from @ref choose_adjacent in that - * the selected direction is returned as an offset to the player's current position rather than - * coordinate of a tile. This version of the function assumes the requested z-level is the same - * as the player's current z-level. - * - * @param[in] message Message used in assembling the prompt to the player - */ -cata::optional choose_direction( const std::string &message ); - -/** - * Request player input of adjacent tile on current z-level with highlighting - * - * Asks the player to input desired direction of an adjacent tile, for example when executing - * an examine or directional item drop. This version of the function assumes that the requested - * tile will be on the player's current z-level. - * - * This function is identical to @ref choose_adjacent except that squares are highlighted for - * the player to indicate valid squares for a given @ref action_id - * - * @param[in] message Message used in assembling the prompt to the player - * @param[in] action_to_highlight An action ID to drive the highlighting output - */ -cata::optional choose_adjacent_highlight( const std::string &message, - action_id action_to_highlight ); +cata::optional choose_adjacent( const std::string &message, bool allow_vertical = false ); /** * Request player input of a direction, possibly including vertical component @@ -472,7 +437,8 @@ cata::optional choose_adjacent_highlight( const std::string &message, * @param[in] message Message used in assembling the prompt to the player * @param[in] allow_vertical Allows direction vector to have vertical component if true */ -cata::optional choose_direction( const std::string &message, bool allow_vertical ); +cata::optional choose_direction( const std::string &message, + bool allow_vertical = false ); /** * Request player input of adjacent tile with highlighting, possibly on different z-level @@ -485,10 +451,11 @@ cata::optional choose_direction( const std::string &message, bool allo * the player to indicate valid squares for a given @ref action_id * * @param[in] message Message used in assembling the prompt to the player - * @param[in] action_to_highlight An action ID to drive the highlighting output + * @param[in] action An action ID to drive the highlighting output + * @param[in] allow_vertical Allows direction vector to have vertical component if true */ cata::optional choose_adjacent_highlight( const std::string &message, - action_id action_to_highlight, bool allow_vertical ); + action_id action, bool allow_vertical = false ); /** * Request player input of adjacent tile with highlighting, possibly on different z-level @@ -502,11 +469,13 @@ cata::optional choose_adjacent_highlight( const std::string &message, * function. * * @param[in] message Message used in assembling the prompt to the player - * @param[in] should_highlight A function that will be called to determine if a given location should be highlighted + * @param[in] allowed A function that will be called to determine if a given location is allowed for selection * @param[in] allow_vertical Allows direction vector to have vertical component if true */ cata::optional choose_adjacent_highlight( const std::string &message, - const std::function &should_highlight, bool allow_vertical ); + const std::function &allowed, + bool allow_vertical = false, + bool auto_select_if_single = false ); // (Press X (or Y)|Try) to Z std::string press_x( action_id act ); @@ -525,20 +494,18 @@ std::string press_x( action_id act, const std::string &act_desc ); * that would generated that delta. See @ref action_id for the list of available movement * commands that may be generated. * - * The only valid values for the parameters of this function are -1, 0 and 1 + * The only valid values for the coordinates of \p d are -1, 0 and 1 * * @note: This function does not sanitize its inputs, which can result in some strange behavior: - * 1. If dz is valid and non-zero, then dx and dy are ignored. - * 2. If dz is invalid, it is treated as if it were zero. - * 3. If dz is 0 or invalid, then any invalid dx or dy results in @ref ACTION_MOVE_NW - * 4. If dz is 0 or invalid, then a dx == dy == 0 results in @ref ACTION_MOVE_NW - * - * @param[in] dx X component of direction, should be -1, 0, or 1 - * @param[in] dy Y component of direction, should be -1, 0, or 1 - * @param[in] dz Z component of direction, should be -1, 0, or 1 + * 1. If d.z is valid and non-zero, then d.x and d.y are ignored. + * 2. If d.z is invalid, it is treated as if it were zero. + * 3. If d.z is 0 or invalid, then any invalid d.x or d.y results in @ref ACTION_MOVE_NW + * 4. If d.z is 0 or invalid, then a d.x == d.y == 0 results in @ref ACTION_MOVE_NW + * + * @param[in] d direction, each coordinate should be -1, 0, or 1 * @returns ID of corresponding move action (usually... see note above) */ -action_id get_movement_direction_from_delta( int dx, int dy, int dz = 0 ); +action_id get_movement_direction_from_delta( const tripoint &d ); // Helper function to convert movement direction to coordinate delta point point get_delta_from_movement_direction( action_id act ); diff --git a/src/activity_handlers.cpp b/src/activity_handlers.cpp index f42e39265849c..e26773899da19 100644 --- a/src/activity_handlers.cpp +++ b/src/activity_handlers.cpp @@ -24,6 +24,7 @@ #include "coordinate_conversions.h" #include "craft_command.h" #include "debug.h" +#include "event_bus.h" #include "fault.h" #include "field.h" #include "game.h" @@ -44,6 +45,7 @@ #include "morale_types.h" #include "mtype.h" #include "npc.h" +#include "npctalk.h" #include "output.h" #include "overmapbuffer.h" #include "player.h" @@ -110,6 +112,8 @@ const efftype_id effect_milked( "milked" ); const efftype_id effect_sleep( "sleep" ); const efftype_id effect_under_op( "under_operation" ); const efftype_id effect_pet( "pet" ); +const efftype_id effect_controlled( "controlled" ); +const efftype_id effect_saddled( "saddled" ); using namespace activity_handlers; @@ -130,11 +134,15 @@ activity_handlers::do_turn_functions = { { activity_id( "ACT_AIM" ), aim_do_turn }, { activity_id( "ACT_PICKUP" ), pickup_do_turn }, { activity_id( "ACT_WEAR" ), wear_do_turn }, + { activity_id( "ACT_MULTIPLE_FISH" ), multiple_fish_do_turn }, { activity_id( "ACT_MULTIPLE_CONSTRUCTION" ), multiple_construction_do_turn }, + { activity_id( "ACT_MULTIPLE_BUTCHER" ), multiple_butcher_do_turn }, { activity_id( "ACT_MULTIPLE_FARM" ), multiple_farm_do_turn }, { activity_id( "ACT_FETCH_REQUIRED" ), fetch_do_turn }, { activity_id( "ACT_BUILD" ), build_do_turn }, { activity_id( "ACT_EAT_MENU" ), eat_menu_do_turn }, + { activity_id( "ACT_VEHICLE_DECONSTRUCTION" ), vehicle_deconstruction_do_turn }, + { activity_id( "ACT_MULTIPLE_CHOP_TREES" ), chop_trees_do_turn }, { activity_id( "ACT_CONSUME_FOOD_MENU" ), consume_food_menu_do_turn }, { activity_id( "ACT_CONSUME_DRINK_MENU" ), consume_drink_menu_do_turn }, { activity_id( "ACT_CONSUME_MEDS_MENU" ), consume_meds_menu_do_turn }, @@ -159,12 +167,15 @@ activity_handlers::do_turn_functions = { { activity_id( "ACT_HACKSAW" ), hacksaw_do_turn }, { activity_id( "ACT_CHOP_TREE" ), chop_tree_do_turn }, { activity_id( "ACT_CHOP_LOGS" ), chop_tree_do_turn }, + { activity_id( "ACT_TIDY_UP" ), tidy_up_do_turn }, { activity_id( "ACT_CHOP_PLANKS" ), chop_tree_do_turn }, { activity_id( "ACT_TIDY_UP" ), tidy_up_do_turn }, { activity_id( "ACT_JACKHAMMER" ), jackhammer_do_turn }, + { activity_id( "ACT_FIND_MOUNT" ), find_mount_do_turn }, { activity_id( "ACT_DIG" ), dig_do_turn }, { activity_id( "ACT_DIG_CHANNEL" ), dig_channel_do_turn }, { activity_id( "ACT_FILL_PIT" ), fill_pit_do_turn }, + { activity_id( "ACT_MULTIPLE_CHOP_PLANKS" ), multiple_chop_planks_do_turn }, { activity_id( "ACT_TILL_PLOT" ), till_plot_do_turn }, { activity_id( "ACT_HARVEST_PLOT" ), harvest_plot_do_turn }, { activity_id( "ACT_PLANT_PLOT" ), plant_plot_do_turn }, @@ -202,6 +213,7 @@ activity_handlers::finish_functions = { { activity_id( "ACT_VEHICLE" ), vehicle_finish }, { activity_id( "ACT_START_ENGINES" ), start_engines_finish }, { activity_id( "ACT_OXYTORCH" ), oxytorch_finish }, + { activity_id( "ACT_PULP" ), pulp_finish }, { activity_id( "ACT_CRACKING" ), cracking_finish }, { activity_id( "ACT_OPEN_GATE" ), open_gate_finish }, { activity_id( "ACT_REPAIR_ITEM" ), repair_item_finish }, @@ -273,8 +285,8 @@ void activity_handlers::burrow_do_turn( player_activity *act, player *p ) { sfx::play_activity_sound( "activity", "burrow", sfx::get_heard_volume( act->placement ) ); if( calendar::once_every( 1_minutes ) ) { - //~ Sound of a Rat mutant burrowing! sounds::sound( act->placement, 10, sounds::sound_t::movement, + //~ Sound of a Rat mutant burrowing! _( "ScratchCrunchScrabbleScurry." ) ); messages_in_process( *act, *p ); } @@ -451,11 +463,6 @@ static void set_up_butchery( player_activity &act, player &u, butcher_type actio u.has_amount( "vine_30", 1 ) || u.has_amount( "grapnel", 1 ); const bool big_corpse = corpse.size >= MS_MEDIUM; - if( !u.has_quality( quality_id( "CUT" ) ) ) { - u.add_msg_if_player( m_info, _( "You need a cutting tool to perform a full butchery." ) ); - act.targets.pop_back(); - return; - } if( big_corpse ) { if( has_rope && !has_tree_nearby && !b_rack_present ) { u.add_msg_if_player( m_info, @@ -531,24 +538,28 @@ static void set_up_butchery( player_activity &act, player &u, butcher_type actio if( is_human && !( u.has_trait_flag( "CANNIBAL" ) || u.has_trait_flag( "PSYCHOPATH" ) || u.has_trait_flag( "SAPIOVORE" ) ) ) { - if( query_yn( _( "Would you dare desecrate the mortal remains of a fellow human being?" ) ) ) { - g->u.add_morale( MORALE_BUTCHER, -50, 0, 2_days, 3_hours ); - switch( rng( 1, 3 ) ) { - case 1: - u.add_msg_if_player( m_bad, _( "You clench your teeth at the prospect of this gruesome job." ) ); - break; - case 2: - u.add_msg_if_player( m_bad, _( "This will haunt you in your dreams." ) ); - break; - case 3: - u.add_msg_if_player( m_bad, - _( "You try to look away, but this gruesome image will stay on your mind for some time." ) ); - break; + if( u.is_player() ) { + if( query_yn( _( "Would you dare desecrate the mortal remains of a fellow human being?" ) ) ) { + switch( rng( 1, 3 ) ) { + case 1: + u.add_msg_if_player( m_bad, _( "You clench your teeth at the prospect of this gruesome job." ) ); + break; + case 2: + u.add_msg_if_player( m_bad, _( "This will haunt you in your dreams." ) ); + break; + case 3: + u.add_msg_if_player( m_bad, + _( "You try to look away, but this gruesome image will stay on your mind for some time." ) ); + break; + } + g->u.add_morale( MORALE_BUTCHER, -50, 0, 2_days, 3_hours ); + } else { + u.add_msg_if_player( m_good, _( "It needs a coffin, not a knife." ) ); + act.targets.pop_back(); + return; } } else { - u.add_msg_if_player( m_good, _( "It needs a coffin, not a knife." ) ); - act.targets.pop_back(); - return; + u.add_morale( MORALE_BUTCHER, -50, 0, 2_days, 3_hours ); } } @@ -898,7 +909,12 @@ static void butchery_drops_harvest( item *corpse_item, const mtype &mt, player & for( const fault_id &flt : entry.faults ) { obj.faults.emplace( flt ); } - liquid_handler::handle_all_liquid( obj, 1 ); + // TODO : smarter NPC liquid handling + if( p.is_npc() ) { + drop_on_map( p, item_drop_reason::deliberate, { obj }, p.pos() ); + } else { + liquid_handler::handle_all_liquid( obj, 1 ); + } } else if( drop->count_by_charges() ) { item obj( drop, calendar::turn, roll ); if( obj.has_temperature() ) { @@ -913,6 +929,9 @@ static void butchery_drops_harvest( item *corpse_item, const mtype &mt, player & for( const fault_id &flt : entry.faults ) { obj.faults.emplace( flt ); } + if( !p.backlog.empty() && p.backlog.front().id() == activity_id( "ACT_MULTIPLE_BUTCHER" ) ) { + obj.set_var( "activity_var", p.name ); + } g->m.add_item_or_charges( p.pos(), obj ); } else { item obj( drop, calendar::turn ); @@ -929,6 +948,9 @@ static void butchery_drops_harvest( item *corpse_item, const mtype &mt, player & for( const fault_id &flt : entry.faults ) { obj.faults.emplace( flt ); } + if( !p.backlog.empty() && p.backlog.front().id() == activity_id( "ACT_MULTIPLE_BUTCHER" ) ) { + obj.set_var( "activity_var", p.name ); + } for( int i = 0; i != roll; ++i ) { g->m.add_item_or_charges( p.pos(), obj ); } @@ -965,6 +987,9 @@ static void butchery_drops_harvest( item *corpse_item, const mtype &mt, player & ruined_parts.set_mtype( &mt ); ruined_parts.set_item_temperature( 0.00001 * corpse_item->temperature ); ruined_parts.set_rot( corpse_item->get_rot() ); + if( !p.backlog.empty() && p.backlog.front().id() == activity_id( "ACT_MULTIPLE_BUTCHER" ) ) { + ruined_parts.set_var( "activity_var", p.name ); + } g->m.add_item_or_charges( p.pos(), ruined_parts ); } } @@ -1250,6 +1275,10 @@ void activity_handlers::butcher_finish( player_activity *act, player *p ) // Ready to move on to the next item, if there is one (for example if multibutchering) act->index = true; + // if its mutli-tile butchering,then restart the backlog. + if( !p->backlog.empty() && p->backlog.front().id() == activity_id( "ACT_MULTIPLE_BUTCHER" ) ) { + p->activity = player_activity(); + } } void activity_handlers::fill_liquid_do_turn( player_activity *act, player *p ) @@ -1528,8 +1557,9 @@ void activity_handlers::game_do_turn( player_activity *act, player *p ) void activity_handlers::hotwire_finish( player_activity *act, player *p ) { //Grab this now, in case the vehicle gets shifted - if( const optional_vpart_position vp = g->m.veh_at( tripoint( act->values[0], act->values[1], - p->posz() ) ) ) { + if( const optional_vpart_position vp = g->m.veh_at( g->m.getlocal( tripoint( act->values[0], + act->values[1], + p->posz() ) ) ) ) { vehicle *const veh = &vp->vehicle(); const int mech_skill = act->values[2]; if( mech_skill > static_cast( rng( 1, 6 ) ) ) { @@ -1756,7 +1786,7 @@ void activity_handlers::pulp_do_turn( player_activity *act, player *p ) float stamina_ratio = static_cast( p->stamina ) / p->get_stamina_max(); moves += 100 / std::max( 0.25f, stamina_ratio ); - if( stamina_ratio < 0.33 ) { + if( stamina_ratio < 0.33 || p->is_npc() ) { p->moves = std::min( 0, p->moves - moves ); return; } @@ -1767,7 +1797,6 @@ void activity_handlers::pulp_do_turn( player_activity *act, player *p ) } } } - // If we reach this, all corpses have been pulped, finish the activity act->moves_left = 0; if( num_corpses == 0 ) { @@ -1781,6 +1810,16 @@ void activity_handlers::pulp_do_turn( player_activity *act, player *p ) " finished pulping the corpses.", num_corpses ) ); } +void activity_handlers::pulp_finish( player_activity *act, player *p ) +{ + if( p->is_npc() ) { + npc *guy = dynamic_cast( p ); + guy->revert_after_activity(); + } else { + act->set_to_null(); + } +} + void activity_handlers::reload_finish( player_activity *act, player *p ) { act->set_to_null(); @@ -1907,21 +1946,14 @@ void activity_handlers::train_finish( player_activity *act, player *p ) const Skill &skill = sk.obj(); std::string skill_name = skill.name(); int old_skill_level = p->get_skill_level( sk ); - p->practice( sk, 100, old_skill_level ); + p->practice( sk, 100, old_skill_level + 2 ); int new_skill_level = p->get_skill_level( sk ); if( old_skill_level != new_skill_level ) { add_msg( m_good, _( "You finish training %s to level %d." ), skill_name, new_skill_level ); - if( new_skill_level % 4 == 0 ) { - //~ %d is skill level %s is skill name - p->add_memorial_log( pgettext( "memorial_male", - "Reached skill level %1$d in %2$s." ), - pgettext( "memorial_female", - "Reached skill level %1$d in %2$s." ), - new_skill_level, skill_name ); - } + g->events().send( p->getID(), sk, new_skill_level ); } else { - add_msg( m_good, _( "You finish training %s." ), skill_name ); + add_msg( m_good, _( "You get some training in %s." ), skill_name ); } act->set_to_null(); return; @@ -1932,10 +1964,7 @@ void activity_handlers::train_finish( player_activity *act, player *p ) const auto &mastyle = ma_id.obj(); // Trained martial arts, add_msg( m_good, _( "You learn %s." ), mastyle.name ); - //~ %s is martial art - p->add_memorial_log( pgettext( "memorial_male", "Learned %s." ), - pgettext( "memorial_female", "Learned %s." ), - mastyle.name ); + g->events().send( p->getID(), ma_id ); p->add_martialart( mastyle.id ); } else { debugmsg( "train_finish without a valid skill or style name" ); @@ -1948,9 +1977,10 @@ void activity_handlers::train_finish( player_activity *act, player *p ) void activity_handlers::vehicle_finish( player_activity *act, player *p ) { //Grab this now, in case the vehicle gets shifted - const optional_vpart_position vp = g->m.veh_at( tripoint( act->values[0], act->values[1], - p->posz() ) ); - veh_interact::complete_vehicle(); + const optional_vpart_position vp = g->m.veh_at( g->m.getlocal( tripoint( act->values[0], + act->values[1], + p->posz() ) ) ); + veh_interact::complete_vehicle( *p ); // complete_vehicle set activity type to NULL if the vehicle // was completely dismantled, otherwise the vehicle still exist and // is to be examined again. @@ -1958,22 +1988,24 @@ void activity_handlers::vehicle_finish( player_activity *act, player *p ) return; } act->set_to_null(); - if( act->values.size() < 7 ) { - dbg( D_ERROR ) << "game:process_activity: invalid ACT_VEHICLE values: " - << act->values.size(); - debugmsg( "process_activity invalid ACT_VEHICLE values:%d", - act->values.size() ); - } else { - if( vp ) { - g->m.invalidate_map_cache( g->get_levz() ); - g->refresh_all(); - // TODO: Z (and also where the activity is queued) - // Or not, because the vehicle coordinates are dropped anyway - g->exam_vehicle( vp->vehicle(), point( act->values[ 2 ], act->values[ 3 ] ) ); - return; + if( !p->is_npc() ) { + if( act->values.size() < 7 ) { + dbg( D_ERROR ) << "game:process_activity: invalid ACT_VEHICLE values: " + << act->values.size(); + debugmsg( "process_activity invalid ACT_VEHICLE values:%d", + act->values.size() ); } else { - dbg( D_ERROR ) << "game:process_activity: ACT_VEHICLE: vehicle not found"; - debugmsg( "process_activity ACT_VEHICLE: vehicle not found" ); + if( vp ) { + g->m.invalidate_map_cache( g->get_levz() ); + g->refresh_all(); + // TODO: Z (and also where the activity is queued) + // Or not, because the vehicle coordinates are dropped anyway + g->exam_vehicle( vp->vehicle(), point( act->values[ 2 ], act->values[ 3 ] ) ); + return; + } else { + dbg( D_ERROR ) << "game:process_activity: ACT_VEHICLE: vehicle not found"; + debugmsg( "process_activity ACT_VEHICLE: vehicle not found" ); + } } } } @@ -2602,7 +2634,7 @@ void activity_handlers::move_items_do_turn( player_activity *act, player *p ) void activity_handlers::move_loot_do_turn( player_activity *act, player *p ) { - generic_multi_activity_handler( *act, *p ); + activity_on_turn_move_loot( *act, *p ); } void activity_handlers::adv_inventory_do_turn( player_activity *, player *p ) @@ -2712,6 +2744,11 @@ static void rod_fish( player *p, std::vector &fishables ) p->add_msg_if_player( m_good, _( "You caught a %s." ), chosen_fish->type->nname() ); } } + for( auto &elem : g->m.i_at( p->pos() ) ) { + if( elem.is_corpse() && !elem.has_var( "activity_var" ) ) { + elem.set_var( "activity_var", p->name ); + } + } } void activity_handlers::fish_do_turn( player_activity *act, player *p ) @@ -2740,7 +2777,7 @@ void activity_handlers::fish_do_turn( player_activity *act, player *p ) // no matter the population of fish, your skill and tool limits the ease of catching. fish_chance = std::min( survival_skill * 10, fish_chance ); if( x_in_y( fish_chance, 600000 ) ) { - add_msg( m_good, _( "You feel a tug on your line!" ) ); + p->add_msg_if_player( m_good, _( "You feel a tug on your line!" ) ); rod_fish( p, fishables ); } if( calendar::once_every( 60_minutes ) ) { @@ -2753,7 +2790,11 @@ void activity_handlers::fish_finish( player_activity *act, player *p ) { ( void )p; act->set_to_null(); - add_msg( m_info, _( "You finish fishing" ) ); + p->add_msg_if_player( m_info, _( "You finish fishing" ) ); + if( !p->backlog.empty() && p->backlog.front().id() == activity_id( "ACT_MULTIPLE_FISH" ) ) { + p->backlog.clear(); + p->assign_activity( activity_id( "ACT_TIDY_UP" ) ); + } } void activity_handlers::cracking_do_turn( player_activity *act, player *p ) @@ -2826,6 +2867,49 @@ void activity_handlers::wait_weather_finish( player_activity *act, player *p ) act->set_to_null(); } +void activity_handlers::find_mount_do_turn( player_activity *act, player *p ) +{ + //npc only activity + if( p->is_player() ) { + act->set_to_null(); + return; + } + npc &guy = dynamic_cast( *p ); + monster *mon = guy.chosen_mount.lock().get(); + if( !mon ) { + act->set_to_null(); + guy.revert_after_activity(); + return; + } + if( rl_dist( guy.pos(), mon->pos() ) <= 1 ) { + if( mon->has_effect( effect_controlled ) ) { + mon->remove_effect( effect_controlled ); + } + if( p->can_mount( *mon ) ) { + act->set_to_null(); + guy.revert_after_activity(); + guy.chosen_mount = std::weak_ptr(); + p->mount_creature( *mon ); + } else { + act->set_to_null(); + guy.revert_after_activity(); + return; + } + } else { + const std::vector route = route_adjacent( *p, guy.chosen_mount.lock().get()->pos() ); + if( route.empty() ) { + act->set_to_null(); + guy.revert_after_activity(); + mon->remove_effect( effect_controlled ); + return; + } else { + p->activity = player_activity(); + mon->add_effect( effect_controlled, 40_turns ); + p->set_destination( route, player_activity( activity_id( "ACT_FIND_MOUNT" ) ) ); + } + } +} + void activity_handlers::wait_npc_finish( player_activity *act, player *p ) { p->add_msg_if_player( _( "%s finishes with you..." ), act->str_values[0] ); @@ -3086,12 +3170,17 @@ void activity_handlers::operation_finish( player_activity *act, player *p ) act->set_to_null(); } -static bool character_has_skill_for( const player *p, const construction &con ) +void activity_handlers::churn_finish( player_activity *act, player *p ) { - return std::all_of( con.required_skills.begin(), con.required_skills.end(), - [&]( const std::pair &pr ) { - return p->get_skill_level( pr.first ) >= pr.second; - } ); + p->add_msg_if_player( _( "You finish churning up the earth here." ) ); + g->m.ter_set( g->m.getlocal( act->placement ), t_dirtmound ); + // Go back to what we were doing before + // could be player zone activity, or could be NPC multi-farming + act->set_to_null(); + if( !p->backlog.empty() ) { + p->activity = p->backlog.front(); + p->backlog.pop_front(); + } } void activity_handlers::churn_do_turn( player_activity *act, player *p ) @@ -3101,17 +3190,6 @@ void activity_handlers::churn_do_turn( player_activity *act, player *p ) p->set_moves( 0 ); } -void activity_handlers::churn_finish( player_activity *act, player *p ) -{ - p->add_msg_if_player( _( "You finish churning up the earth here." ) ); - g->m.ter_set( g->m.getlocal( act->placement ), t_dirtmound ); - // Go back to what we were doing before - // could be player zone activity, or could be NPC multi-farming - act->set_to_null(); - p->activity = p->backlog.front(); - p->backlog.pop_front(); -} - void activity_handlers::build_do_turn( player_activity *act, player *p ) { const std::vector &list_constructions = get_constructions(); @@ -3131,7 +3209,7 @@ void activity_handlers::build_do_turn( player_activity *act, player *p ) } // if you ( or NPC ) are finishing someone elses started construction... const construction &built = list_constructions[pc->id]; - if( !character_has_skill_for( p, built ) ) { + if( !p->meets_skill_requirements( built ) ) { add_msg( m_info, _( "%s can't work on this construction anymore." ), p->disp_name() ); p->cancel_activity(); if( p->is_npc() ) { @@ -3172,11 +3250,36 @@ void activity_handlers::tidy_up_do_turn( player_activity *act, player *p ) generic_multi_activity_handler( *act, *p ); } +void activity_handlers::multiple_fish_do_turn( player_activity *act, player *p ) +{ + generic_multi_activity_handler( *act, *p ); +} + void activity_handlers::multiple_construction_do_turn( player_activity *act, player *p ) { generic_multi_activity_handler( *act, *p ); } +void activity_handlers::multiple_chop_planks_do_turn( player_activity *act, player *p ) +{ + generic_multi_activity_handler( *act, *p ); +} + +void activity_handlers::multiple_butcher_do_turn( player_activity *act, player *p ) +{ + generic_multi_activity_handler( *act, *p ); +} + +void activity_handlers::vehicle_deconstruction_do_turn( player_activity *act, player *p ) +{ + generic_multi_activity_handler( *act, *p ); +} + +void activity_handlers::chop_trees_do_turn( player_activity *act, player *p ) +{ + generic_multi_activity_handler( *act, *p ); +} + void activity_handlers::multiple_farm_do_turn( player_activity *act, player *p ) { generic_multi_activity_handler( *act, *p ); @@ -3384,26 +3487,44 @@ void activity_handlers::hacksaw_finish( player_activity *act, player *p ) void activity_handlers::chop_tree_do_turn( player_activity *act, player *p ) { - sfx::play_activity_sound( "tool", "axe", sfx::get_heard_volume( act->placement ) ); + sfx::play_activity_sound( "tool", "axe", sfx::get_heard_volume( g->m.getlocal( act->placement ) ) ); if( calendar::once_every( 1_minutes ) ) { //~ Sound of a wood chopping tool at work! - sounds::sound( act->placement, 15, sounds::sound_t::activity, _( "CHK!" ) ); + sounds::sound( g->m.getlocal( act->placement ), 15, sounds::sound_t::activity, _( "CHK!" ) ); messages_in_process( *act, *p ); } } void activity_handlers::chop_tree_finish( player_activity *act, player *p ) { - const tripoint &pos = act->placement; + const tripoint &pos = g->m.getlocal( act->placement ); tripoint direction; - while( true ) { - if( const cata::optional dir = choose_direction( - _( "Select a direction for the tree to fall in." ) ) ) { - direction = *dir; - break; + if( p->is_player() ) { + while( true ) { + if( const cata::optional dir = choose_direction( + _( "Select a direction for the tree to fall in." ) ) ) { + direction = *dir; + break; + } + // try again + } + } else { + for( const auto elem : g->m.points_in_radius( pos, 1 ) ) { + bool cantuse = false; + tripoint direc = elem - pos; + tripoint proposed_to = pos + point( 3 * direction.x, 3 * direction.y ); + std::vector rough_tree_line = line_to( pos, proposed_to ); + for( const auto elem : rough_tree_line ) { + if( g->critter_at( elem ) ) { + cantuse = true; + break; + } + } + if( !cantuse ) { + direction = direc; + } } - // try again } const tripoint to = pos + 3 * direction.xy() + point( rng( -1, 1 ), rng( -1, 1 ) ); @@ -3414,30 +3535,53 @@ void activity_handlers::chop_tree_finish( player_activity *act, player *p ) } g->m.ter_set( pos, t_stump ); - const int helpersize = g->u.get_num_crafting_helpers( 3 ); + const int helpersize = p->get_num_crafting_helpers( 3 ); p->mod_stored_nutr( 5 - helpersize ); p->mod_thirst( 5 - helpersize ); p->mod_fatigue( 10 - ( helpersize * 2 ) ); p->add_msg_if_player( m_good, _( "You finish chopping down a tree." ) ); // sound of falling tree - sfx::play_variant_sound( "misc", "timber", sfx::get_heard_volume( act->placement ) ); + sfx::play_variant_sound( "misc", "timber", + sfx::get_heard_volume( g->m.getlocal( act->placement ) ) ); act->set_to_null(); } void activity_handlers::chop_logs_finish( player_activity *act, player *p ) { - const tripoint &pos = act->placement; - + const tripoint &pos = g->m.getlocal( act->placement ); + int log_quan; + int stick_quan; + int splint_quan; if( g->m.ter( pos ) == t_trunk ) { - g->m.spawn_item( pos.xy(), "log", rng( 2, 3 ), 0, calendar::turn ); - g->m.spawn_item( pos.xy(), "stick_long", rng( 0, 1 ), 0, calendar::turn ); + log_quan = rng( 2, 3 ); + stick_quan = rng( 0, 1 ); + splint_quan = 0; } else if( g->m.ter( pos ) == t_stump ) { - g->m.spawn_item( pos.xy(), "log", rng( 0, 2 ), 0, calendar::turn ); - g->m.spawn_item( pos.xy(), "splinter", rng( 5, 15 ), 0, calendar::turn ); + log_quan = rng( 0, 2 ); + stick_quan = 0; + splint_quan = rng( 5, 15 ); + } else { + log_quan = 0; + stick_quan = 0; + splint_quan = 0; + } + for( int i = 0; i != log_quan; ++i ) { + item obj( "log", calendar::turn ); + obj.set_var( "activity_var", p->name ); + g->m.add_item_or_charges( pos, obj ); + } + for( int i = 0; i != stick_quan; ++i ) { + item obj( "stick_long", calendar::turn ); + obj.set_var( "activity_var", p->name ); + g->m.add_item_or_charges( pos, obj ); + } + for( int i = 0; i != splint_quan; ++i ) { + item obj( "splinter", calendar::turn ); + obj.set_var( "activity_var", p->name ); + g->m.add_item_or_charges( pos, obj ); } - g->m.ter_set( pos, t_dirt ); - const int helpersize = g->u.get_num_crafting_helpers( 3 ); + const int helpersize = p->get_num_crafting_helpers( 3 ); p->mod_stored_nutr( 5 - helpersize ); p->mod_thirst( 5 - helpersize ); p->mod_fatigue( 10 - ( helpersize * 2 ) ); @@ -3456,11 +3600,11 @@ void activity_handlers::chop_planks_finish( player_activity *act, player *p ) planks = std::min( planks, max_planks ); if( planks > 0 ) { - g->m.spawn_item( act->placement, "2x4", planks, 0, calendar::turn ); + g->m.spawn_item( g->m.getlocal( act->placement ), "2x4", planks, 0, calendar::turn ); p->add_msg_if_player( m_good, _( "You produce %d planks." ), planks ); } if( scraps > 0 ) { - g->m.spawn_item( act->placement, "splinter", scraps, 0, calendar::turn ); + g->m.spawn_item( g->m.getlocal( act->placement ), "splinter", scraps, 0, calendar::turn ); p->add_msg_if_player( m_good, _( "You produce %d splinters." ), scraps ); } if( planks < max_planks / 2 ) { @@ -3548,8 +3692,7 @@ void activity_handlers::dig_finish( player_activity *act, player *p ) it->set_damage( rng( 1, it->max_damage() - 1 ) ); } } - g->u.add_memorial_log( pgettext( "memorial_male", "Exhumed a grave." ), - pgettext( "memorial_female", "Exhumed a grave." ) ); + g->events().send( p->getID() ); } g->m.ter_set( pos, result_terrain ); @@ -3772,9 +3915,8 @@ void activity_handlers::till_plot_do_turn( player_activity *, player *p ) const auto dig = []( player & p, const tripoint & tile_loc ) { p.assign_activity( activity_id( "ACT_CHURN" ), 18000, -1 ); - p.activity.placement = tile_loc; + p.activity.placement = g->m.getabs( tile_loc ); }; - perform_zone_activity_turn( p, zone_type_id( "FARM_PLOT" ), reject_tile, @@ -4114,8 +4256,7 @@ void activity_handlers::hack_safe_finish( player_activity *act, player *p ) } else if( result == HACK_FAIL ) { act->set_to_null(); - p->add_memorial_log( pgettext( "memorial_male", "Set off an alarm." ), - pgettext( "memorial_female", "Set off an alarm." ) ); + g->events().send( p->getID() ); sounds::sound( p->pos(), 60, sounds::sound_t::music, _( "an alarm sound!" ), true, "environment", "alarm" ); if( act->placement.z > 0 && !g->timed_events.queued( TIMED_EVENT_WANTED ) ) { @@ -4222,7 +4363,7 @@ void activity_handlers::spellcasting_finish( player_activity *act, player *p ) false ); } - p->add_msg_if_player( _( "You cast %s!" ), casting.name() ); + p->add_msg_if_player( casting.message(), casting.name() ); casting.cast_all_effects( *p, target ); diff --git a/src/activity_handlers.h b/src/activity_handlers.h index 42c79aa993c67..13b8ab1daf26c 100644 --- a/src/activity_handlers.h +++ b/src/activity_handlers.h @@ -44,7 +44,40 @@ enum do_activity_reason : int { NEEDS_HARVESTING, // For farming - tile is harvestable now. NEEDS_PLANTING, // For farming - tile can be planted NEEDS_TILLING, // For farming - tile can be tilled - BLOCKING_TILE // Something has made it's way onto the tile, so the activity cannot proceed + BLOCKING_TILE, // Something has made it's way onto the tile, so the activity cannot proceed + NEEDS_CHOPPING, // There is wood there to be chopped + NEEDS_TREE_CHOPPING, // There is a tree there that needs to be chopped + NEEDS_BIG_BUTCHERING, // There is at least one corpse there to butcher, and it's a big one + NEEDS_BUTCHERING, // THere is at least one corpse there to butcher, and theres no need for additional tools + ALREADY_WORKING, // somebody is already working there + NEEDS_VEH_DECONST, // There is a vehicle part there that we can deconstruct, given the right tools. + NEEDS_FISHING // This spot can be fished, if the right tool is present. +}; + +struct activity_reason_info { + do_activity_reason reason; //reason for success or fail + bool can_do; //is it possible to do this + cata::optional con_idx; //construction index + + activity_reason_info( do_activity_reason reason_, bool can_do_, + cata::optional con_idx_ = cata::optional() ) : + reason( reason_ ), + can_do( can_do_ ), + con_idx( con_idx_ ) + { } + + static activity_reason_info ok( const do_activity_reason &reason_ ) { + return activity_reason_info( reason_, true ); + } + + static activity_reason_info build( const do_activity_reason &reason_, bool can_do_, + size_t con_idx_ ) { + return activity_reason_info( reason_, can_do_, con_idx_ ); + } + + static activity_reason_info fail( const do_activity_reason &reason_ ) { + return activity_reason_info( reason_, false ); + } }; int butcher_time_to_cut( const player &u, const item &corpse_item, butcher_type action ); @@ -88,6 +121,7 @@ void churn_do_turn( player_activity *act, player *p ); void start_fire_do_turn( player_activity *act, player *p ); void vibe_do_turn( player_activity *act, player *p ); void hand_crank_do_turn( player_activity *act, player *p ); +void multiple_chop_planks_do_turn( player_activity *act, player *p ); void oxytorch_do_turn( player_activity *act, player *p ); void aim_do_turn( player_activity *act, player *p ); void pickup_do_turn( player_activity *act, player *p ); @@ -98,7 +132,11 @@ void consume_drink_menu_do_turn( player_activity *act, player *p ); void consume_meds_menu_do_turn( player_activity *act, player *p ); void move_items_do_turn( player_activity *act, player *p ); void multiple_farm_do_turn( player_activity *act, player *p ); +void multiple_fish_do_turn( player_activity *act, player *p ); void multiple_construction_do_turn( player_activity *act, player *p ); +void multiple_butcher_do_turn( player_activity *act, player *p ); +void vehicle_deconstruction_do_turn( player_activity *act, player *p ); +void chop_trees_do_turn( player_activity *act, player *p ); void fetch_do_turn( player_activity *act, player *p ); void move_loot_do_turn( player_activity *act, player *p ); void travel_do_turn( player_activity *act, player *p ); @@ -113,6 +151,7 @@ void butcher_do_turn( player_activity *act, player *p ); void hacksaw_do_turn( player_activity *act, player *p ); void chop_tree_do_turn( player_activity *act, player *p ); void jackhammer_do_turn( player_activity *act, player *p ); +void find_mount_do_turn( player_activity *act, player *p ); void tidy_up_do_turn( player_activity *act, player *p ); void dig_do_turn( player_activity *act, player *p ); void build_do_turn( player_activity *act, player *p ); @@ -143,6 +182,7 @@ void fish_finish( player_activity *act, player *p ); void forage_finish( player_activity *act, player *p ); void hotwire_finish( player_activity *act, player *p ); void longsalvage_finish( player_activity *act, player *p ); +void pulp_finish( player_activity *act, player *p ); void make_zlave_finish( player_activity *act, player *p ); void pickaxe_finish( player_activity *act, player *p ); void reload_finish( player_activity *act, player *p ); diff --git a/src/activity_item_handling.cpp b/src/activity_item_handling.cpp index 9a89253f2d254..7d002830733df 100644 --- a/src/activity_item_handling.cpp +++ b/src/activity_item_handling.cpp @@ -56,8 +56,11 @@ void cancel_aim_processing(); const efftype_id effect_controlled( "controlled" ); const efftype_id effect_pet( "pet" ); +const zone_type_id zone_source_firewood( "SOURCE_FIREWOOD" ); const zone_type_id z_loot_unsorted( "LOOT_UNSORTED" ); +const quality_id LIFT( "LIFT" ); + const trap_str_id tr_firewood_source( "tr_firewood_source" ); const trap_str_id tr_unfinished_construction( "tr_unfinished_construction" ); @@ -675,8 +678,24 @@ void activity_on_turn_pickup() // Otherwise, we are done. if( !keep_going || g->u.activity.targets.empty() ) { g->u.cancel_activity(); + if( g->u.get_value( "THIEF_MODE_KEEP" ) != "YES" ) { + g->u.set_value( "THIEF_MODE", "THIEF_ASK" ); + } + } + + // TODO: Move this to advanced inventory instead of hacking it in here + + if( !keep_going ) { + // The user canceled the activity, so we're done + g->u.cancel_activity(); + // AIM might have more pickup activities pending, also cancel them. // TODO: Move this to advanced inventory instead of hacking it in here cancel_aim_processing(); + } else if( g->u.activity.targets.empty() ) { + // The user did not cancel, but there's no item left + g->u.cancel_activity(); + // But do not cancel AIM processing as it might have more pickup activities + // pending for other locations. } } @@ -715,6 +734,9 @@ static void move_items( player &p, const tripoint &relative_dest, bool to_vehicl if( !newit.made_of_from_type( LIQUID ) ) { // This is for hauling across zlevels, remove when going up and down stairs // is no longer teleportation + if( !newit.has_owner() && p.is_player() ) { + newit.set_owner( p.get_faction() ); + } const tripoint src = target.position(); int distance = src.z == dest.z ? std::max( rl_dist( src, dest ), 1 ) : 1; p.mod_moves( -Pickup::cost_to_move_item( p, newit ) * distance ); @@ -853,6 +875,42 @@ static int move_cost( const item &it, const tripoint &src, const tripoint &dest return move_cost_inv( it, src, dest ); } +static void vehicle_deconstruct_activity( player &p, const tripoint src_loc, int vpindex ) +{ + vehicle *veh = veh_pointer_or_null( g->m.veh_at( src_loc ) ); + if( !veh ) { + return; + } else { + if( vpindex >= static_cast( veh->parts.size() ) ) { + vpindex = veh->get_next_shifted_index( vpindex, p ); + if( vpindex == -1 ) { + return; + } + } + const vpart_info &vp = veh->part_info( vpindex ); + p.assign_activity( activity_id( "ACT_VEHICLE" ), vp.removal_time( p ), static_cast( 'o' ) ); + // so , NPCs can remove the last part on a position, then there is no vehicle there anymore, + // for someone else who stored that position at the start of their activity. + // so we may need to go looking a bit further afield to find it , at activities end. + for( const auto pt : veh->get_points( true ) ) { + p.activity.coord_set.insert( g->m.getabs( pt ) ); + } + p.activity.values.push_back( g->m.getabs( src_loc ).x ); // values[0] + p.activity.values.push_back( g->m.getabs( src_loc ).y ); // values[1] + p.activity.values.push_back( point_zero.x ); // values[2] + p.activity.values.push_back( point_zero.y ); // values[3] + p.activity.values.push_back( -point_zero.x ); // values[4] + p.activity.values.push_back( -point_zero.y ); // values[5] + p.activity.values.push_back( veh->index_of_part( &veh->parts[vpindex] ) ); // values[6] + p.activity.str_values.push_back( vp.get_id().str() ); + // this would only be used for refilling tasks + item_location target; + p.activity.targets.emplace_back( std::move( target ) ); + p.activity.placement = g->m.getabs( src_loc ); + p.activity_vehicle_part_index = -1; + } +} + static void move_item( player &p, item &it, int quantity, const tripoint &src, const tripoint &dest, vehicle *src_veh, int src_part, activity_id activity_to_restore = activity_id::NULL_ID() ) @@ -922,29 +980,145 @@ std::vector route_adjacent( const player &p, const tripoint &dest ) return std::vector(); } -static construction check_build_pre( const construction &con ) +static activity_reason_info find_base_construction( + const std::vector &list_constructions, + player &p, + const inventory &inv, + const tripoint &loc, + const cata::optional part_con_idx, + const size_t idx, + std::set &used ) { - const std::string pre_con_str = con.pre_terrain; - construction pre_con = con; - const std::vector &list_constructions = get_constructions(); - for( const construction elem : list_constructions ) { - if( !elem.post_terrain.empty() && elem.post_terrain == pre_con_str && - elem.category != string_id( "REPAIR" ) && - elem.category != string_id( "REINFORCE" ) ) { - //we found the construction that could build the required terrain - pre_con = elem; - break; + const construction &build = list_constructions[idx]; + //already done? + const furn_id furn = g->m.furn( loc ); + const ter_id ter = g->m.ter( loc ); + if( !build.post_terrain.empty() ) { + if( build.post_is_furniture ) { + if( furn_id( build.post_terrain ) == furn ) { + return activity_reason_info::build( ALREADY_DONE, false, idx ); + } + } else { + if( ter_id( build.post_terrain ) == ter ) { + return activity_reason_info::build( ALREADY_DONE, false, idx ); + } + } + } + //if theres an apropriate partial construction on the tile, then we can work on it, no need to check inventories. + const bool has_skill = p.meets_skill_requirements( build ); + if( part_con_idx && *part_con_idx == idx ) { + if( !has_skill ) { + return activity_reason_info::build( DONT_HAVE_SKILL, false, idx ); + } + return activity_reason_info::build( CAN_DO_CONSTRUCTION, true, idx ); + } + //can build? + const bool cc = can_construct( build, loc ); + const bool pcb = player_can_build( p, inv, build ); + if( !has_skill ) { + return activity_reason_info::build( DONT_HAVE_SKILL, false, idx ); + } + if( cc ) { + if( pcb ) { + return activity_reason_info::build( CAN_DO_CONSTRUCTION, true, idx ); + } + //can't build with current inventory, do not look for pre-req + return activity_reason_info::build( NO_COMPONENTS, false, idx ); + } + + // there are no pre-requisites. + // so we need to potentially fetch components + if( build.pre_terrain.empty() && build.pre_special( loc ) ) { + return activity_reason_info::build( NO_COMPONENTS, false, idx ); + } else if( !build.pre_special( loc ) ) { + return activity_reason_info::build( BLOCKING_TILE, false, idx ); + } + + // cant build it + // maybe we can build the pre-requisite instead + // see if the reason is because of pre-terrain requirement + if( !build.pre_terrain.empty() && + ( ( build.pre_is_furniture && + furn_id( build.pre_terrain ) == furn ) || + ( !build.pre_is_furniture && + ter_id( build.pre_terrain ) == ter ) ) ) { + // the pre-req is already built, so the reason is due to lack of tools/components + return activity_reason_info::build( NO_COMPONENTS, false, idx ); + } + + //we can't immediately build it, looking for pre-req + used.insert( idx ); + cata::optional reason; + size_t pre_req_idx = 0; + //first step: try only constructions with the same description + //second step: try all constructions + for( int try_num = 0; try_num < 2; ++try_num ) { + for( const construction &pre_build : list_constructions ) { + //skip if already checked this one + if( pre_build.id == idx || used.find( pre_build.id ) != used.end() ) { + continue; + } + //skip unknown + if( pre_build.post_terrain.empty() ) { + continue; + } + //skip if it is not a pre-build required or gives the same result + if( pre_build.post_terrain != build.pre_terrain && + pre_build.post_terrain != build.post_terrain ) { + continue; + } + //at first step, try to get building with the same description + if( try_num == 0 && + pre_build.description != build.description ) { + continue; + } + activity_reason_info act_info_pre = find_base_construction( list_constructions, + p, inv, loc, part_con_idx, pre_build.id, used ); + if( act_info_pre.can_do ) { + return activity_reason_info::build( CAN_DO_PREREQ, true, *act_info_pre.con_idx ); + } + //find first pre-req failed reason + if( !reason ) { + reason = act_info_pre.reason; + pre_req_idx = *act_info_pre.con_idx; + } + if( act_info_pre.reason == ALREADY_DONE ) { + //pre-req is already here, but we still can't build over it + reason.reset(); + break; + } } } - return pre_con; + //have a partial construction which is not leading to the required construction + if( part_con_idx ) { + return activity_reason_info::build( BLOCKING_TILE, false, idx ); + } + //pre-req failed? + if( reason ) { + if( *reason == NO_COMPONENTS ) { + return activity_reason_info::build( NO_COMPONENTS_PREREQ, false, pre_req_idx ); + } + return activity_reason_info::build( *reason, false, pre_req_idx ); + } + if( !pcb ) { + return activity_reason_info::build( NO_COMPONENTS, false, idx ); + } + //only cc failed, no pre-req + return activity_reason_info::build( BLOCKING_TILE, false, idx ); } -static bool character_has_skill_for( const player &p, const construction &con ) +static std::string random_string( size_t length ) { - return std::all_of( con.required_skills.begin(), con.required_skills.end(), - [&]( const std::pair &pr ) { - return p.get_skill_level( pr.first ) >= pr.second; - } ); + auto randchar = []() -> char { + const char charset[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz"; + const size_t max_index = ( sizeof( charset ) - 1 ); + return charset[rand() % max_index]; + }; + std::string str( length, 0 ); + std::generate_n( str.begin(), length, randchar ); + return str; } static bool are_requirements_nearby( const std::vector &loot_spots, @@ -956,7 +1130,17 @@ static bool are_requirements_nearby( const std::vector &loot_spots, units::volume volume_allowed = p.volume_capacity() - p.volume_carried(); units::mass weight_allowed = p.weight_capacity() - p.weight_carried(); const bool check_weight = p.backlog.front().id() == activity_id( "ACT_MULTIPLE_FARM" ) || - activity_to_restore == activity_id( "ACT_MULTIPLE_FARM" ); + activity_to_restore == activity_id( "ACT_MULTIPLE_FARM" ) || + p.backlog.front().id() == activity_id( "ACT_MULTIPLE_CHOP_PLANKS" ) || + activity_to_restore == activity_id( "ACT_MULTIPLE_CHOP_PLANKS" ) || + p.backlog.front().id() == activity_id( "ACT_MULTIPLE_BUTCHER" ) || + activity_to_restore == activity_id( "ACT_MULTIPLE_BUTCHER" ) || + p.backlog.front().id() == activity_id( "ACT_VEHICLE_DECONSTRUCTION" ) || + activity_to_restore == activity_id( "ACT_VEHICLE_DECONSTRUCTION" ) || + p.backlog.front().id() == activity_id( "ACT_MULTIPLE_CHOP_TREES" ) || + activity_to_restore == activity_id( "ACT_MULTIPLE_CHOP_TREES" ) || + p.backlog.front().id() == activity_id( "ACT_MULTIPLE_FISH" ) || + activity_to_restore == activity_id( "ACT_MULTIPLE_FISH" ); for( const tripoint &elem : loot_spots ) { // if we are searching for things to fetch, we can skip certain thngs. // if, however they are already near the work spot, then the crafting / inventory fucntions will have their own method to use or discount them. @@ -997,111 +1181,209 @@ static bool are_requirements_nearby( const std::vector &loot_spots, return needed_things.obj().can_make_with_inventory( temp_inv, is_crafting_component ); } -static std::pair can_do_activity_there( const activity_id &act, player &p, +static activity_reason_info can_do_activity_there( const activity_id &act, player &p, const tripoint &src_loc ) { // see activity_handlers.h cant_do_activity_reason enums zone_manager &mgr = zone_manager::get_manager(); std::vector zones; - if( act == activity_id( "ACT_MOVE_LOOT" ) ) { - // skip tiles in IGNORE zone and tiles on fire - // (to prevent taking out wood off the lit brazier) - // and inaccessible furniture, like filled charcoal kiln - if( mgr.has( zone_type_id( "LOOT_IGNORE" ), g->m.getabs( src_loc ) ) || - g->m.get_field( src_loc, fd_fire ) != nullptr || - !g->m.can_put_items_ter_furn( src_loc ) ) { - return std::make_pair( false, BLOCKING_TILE ); + if( act == activity_id( "ACT_VEHICLE_DECONSTRUCTION" ) ) { + if( g->m.getlocal( g->u.activity.placement ) == src_loc ) { + return activity_reason_info::fail( ALREADY_WORKING ); + } + for( const npc &guy : g->all_npcs() ) { + if( g->m.getlocal( guy.activity.placement ) == src_loc || guy.pos() == src_loc ) { + return activity_reason_info::fail( ALREADY_WORKING ); + } + } + vehicle *veh = veh_pointer_or_null( g->m.veh_at( src_loc ) ); + if( !veh ) { + return activity_reason_info::fail( NO_ZONE ); + } else { + // find out if there is a vehicle part here we can remove. + std::vector parts = veh->get_parts_at( src_loc, "", part_status_flag::any ); + for( vehicle_part *part_elem : parts ) { + const vpart_info &vpinfo = part_elem->info(); + int vpindex = veh->index_of_part( part_elem, true ); + // if part is not on this vehicle, or if its attached to another part that needs to be removed first. + if( vpindex == -1 || !veh->can_unmount( vpindex ) ) { + continue; + } + for( const npc &guy : g->all_npcs() ) { + if( guy.disp_name() != p.disp_name() && guy.activity_vehicle_part_index != -1 && + guy.activity_vehicle_part_index == vpindex ) { + continue; + } + } + // if the vehicle is moving or player is controlling it. + if( abs( veh->velocity ) > 100 || veh->engine_on ) { + continue; + } + // dont have skill to remove it + std::map removal_skills = vpinfo.removal_skills; + for( const auto &e : removal_skills ) { + bool hasSkill = p.get_skill_level( e.first ) >= e.second; + if( !hasSkill ) { + continue; + } + } + item base( vpinfo.item ); + if( base.is_wheel() ) { + // no wheel removal yet + continue; + } + const quality_id qual = LIFT; + const int max_lift = p.best_nearby_lifting_assist( src_loc ); + const int lvl = ceil( units::quantity( base.weight() ) / + TOOL_LIFT_FACTOR ); + const bool use_aid = max_lift >= lvl; + const bool use_str = p.can_lift( base ); + if( !( use_aid || use_str ) ) { + continue; + } + const auto &reqs = vpinfo.removal_requirements(); + const std::string ran_str = random_string( 10 ); + const requirement_id req_id( ran_str ); + requirement_data::save_requirement( reqs, req_id ); + std::vector points_to_check; + for( const auto elem : g->m.points_in_radius( src_loc, PICKUP_RANGE - 1 ) ) { + points_to_check.push_back( elem ); + } + const inventory &inv = p.crafting_inventory(); + const bool can_make = reqs.can_make_with_inventory( inv, is_crafting_component ); + p.set_value( "veh_index_type", vpinfo.name() ); + // temporarily store the intended index, we do this so two NPCs dont try and work on the same part at same time. + p.activity_vehicle_part_index = vpindex; + if( !can_make ) { + return activity_reason_info::fail( NEEDS_VEH_DECONST ); + } else { + return activity_reason_info::ok( NEEDS_VEH_DECONST ); + } + } + return activity_reason_info::fail( NO_ZONE ); + } + } + if( act == activity_id( "ACT_MULTIPLE_FISH" ) ) { + if( !g->m.has_flag( "FISHABLE", src_loc ) ) { + return activity_reason_info::fail( NO_ZONE ); + } + std::vector rod_inv = p.items_with( []( const item & itm ) { + return itm.has_flag( "FISH_POOR" ) || itm.has_flag( "FISH_GOOD" ); + } ); + if( rod_inv.empty() ) { + return activity_reason_info::fail( NEEDS_FISHING ); + } else { + return activity_reason_info::ok( NEEDS_FISHING ); + } + } + if( act == activity_id( "ACT_MULTIPLE_CHOP_TREES" ) ) { + if( g->m.has_flag( "TREE", src_loc ) || g->m.ter( src_loc ) == t_trunk || + g->m.ter( src_loc ) == t_stump ) { + if( p.has_quality( quality_id( "AXE" ) ) ) { + return activity_reason_info::ok( NEEDS_TREE_CHOPPING ); + } else { + return activity_reason_info::fail( NEEDS_TREE_CHOPPING ); + } } else { - return std::make_pair( true, CAN_DO_FETCH ); + return activity_reason_info::fail( NO_ZONE ); + } + } + if( act == activity_id( "ACT_MULTIPLE_BUTCHER" ) ) { + std::vector corpses; + int big_count = 0; + int small_count = 0; + for( const auto &i : g->m.i_at( src_loc ) ) { + // make sure nobody else is working on that corpse right now + if( i.is_corpse() && !i.has_var( "activity_var" ) ) { + const mtype corpse = *i.get_mtype(); + if( corpse.size >= MS_MEDIUM ) { + big_count += 1; + } else { + small_count += 1; + } + corpses.push_back( i ); + } + } + bool has_table_nearby = false; + for( const tripoint &pt : g->m.points_in_radius( src_loc, 2 ) ) { + if( g->m.has_flag_furn( "FLAT_SURF", pt ) || g->m.has_flag( "FLAT_SURF", pt ) || + ( ( g->m.veh_at( pt ) && ( g->m.veh_at( pt )->vehicle().has_part( "KITCHEN" ) || + g->m.veh_at( pt )->vehicle().has_part( "FLAT_SURF" ) ) ) ) ) { + has_table_nearby = true; + } + } + bool b_rack_present = false; + for( const tripoint &pt : g->m.points_in_radius( src_loc, 2 ) ) { + if( g->m.has_flag_furn( "BUTCHER_EQ", pt ) ) { + b_rack_present = true; + } + } + if( !corpses.empty() ) { + if( big_count > 0 && small_count == 0 ) { + if( !has_table_nearby || !b_rack_present ) { + return activity_reason_info::fail( NO_ZONE ); + } + if( p.has_quality( quality_id( "BUTCHER" ), 1 ) && ( p.has_quality( quality_id( "SAW_W" ) ) || + p.has_quality( quality_id( "SAW_M" ) ) ) ) { + return activity_reason_info::ok( NEEDS_BIG_BUTCHERING ); + } else { + return activity_reason_info::fail( NEEDS_BIG_BUTCHERING ); + } + } + if( ( big_count > 0 && small_count > 0 ) || ( big_count == 0 ) ) { + // there are small corpses here, so we can ignore any big corpses here for the moment. + if( p.has_quality( quality_id( "BUTCHER" ), 1 ) ) { + return activity_reason_info::ok( NEEDS_BUTCHERING ); + } else { + return activity_reason_info::fail( NEEDS_BUTCHERING ); + } + } + } + return activity_reason_info::fail( NO_ZONE ); + } + if( act == activity_id( "ACT_MULTIPLE_CHOP_PLANKS" ) ) { + //are there even any logs there? + for( auto &i : g->m.i_at( src_loc ) ) { + if( i.typeId() == "log" ) { + // do we have an axe? + if( p.has_quality( quality_id( "AXE" ), 1 ) ) { + return activity_reason_info::fail( NEEDS_CHOPPING ); + } else { + return activity_reason_info::fail( NEEDS_CHOPPING ); + } + } } + return activity_reason_info::fail( NO_ZONE ); } if( act == activity_id( "ACT_TIDY_UP" ) ) { if( mgr.has_near( z_loot_unsorted, g->m.getabs( src_loc ), 60 ) ) { - return std::make_pair( true, CAN_DO_FETCH ); + return activity_reason_info::ok( CAN_DO_FETCH ); } - return std::make_pair( false, NO_ZONE ); + return activity_reason_info::fail( NO_ZONE ); } if( act == activity_id( "ACT_MULTIPLE_CONSTRUCTION" ) ) { const std::vector &list_constructions = get_constructions(); zones = mgr.get_zones( zone_type_id( "CONSTRUCTION_BLUEPRINT" ), g->m.getabs( src_loc ) ); - partial_con *nc = g->m.partial_con_at( src_loc ); - // if theres a partial construction on the tile, then we can work on it, no need to check inventories. - if( nc ) { - const construction &built = list_constructions[nc->id]; - if( !character_has_skill_for( p, built ) ) { - return std::make_pair( false, DONT_HAVE_SKILL ); - } - return std::make_pair( true, CAN_DO_CONSTRUCTION ); + const partial_con *part_con = g->m.partial_con_at( src_loc ); + cata::optional part_con_idx; + if( part_con ) { + part_con_idx = part_con->id; } - construction built_pre; + const map_stack stuff_there = g->m.i_at( src_loc ); + // PICKUP_RANGE -1 because we will be adjacent to the spot when arriving. const inventory pre_inv = p.crafting_inventory( src_loc, PICKUP_RANGE - 1 ); for( const zone_data &zone : zones ) { const blueprint_options options = dynamic_cast( zone.get_options() ); const int index = options.get_index(); - const construction &built = list_constructions[index]; - // maybe it's already built? - if( !built.post_terrain.empty() ) { - if( built.post_is_furniture ) { - if( furn_id( built.post_terrain ) == g->m.furn( src_loc ) ) { - return std::make_pair( false, ALREADY_DONE ); - } - } else { - if( ter_id( built.post_terrain ) == g->m.ter( src_loc ) ) { - return std::make_pair( false, ALREADY_DONE ); - } - } - } - - if( can_construct( built, src_loc ) && player_can_build( p, pre_inv, built ) ) { - return std::make_pair( true, CAN_DO_CONSTRUCTION ); - } else { - // if both return false, then there is a pre_special requirement that failed. - if( !player_can_build( p, pre_inv, built ) && !can_construct( built, src_loc ) ) { - return std::make_pair( false, NO_ZONE ); - } - auto stuff_there = g->m.i_at( src_loc ); - if( !stuff_there.empty() ) { - return std::make_pair( false, BLOCKING_TILE ); - } - // there are no pre-requisites. - // so we need to potentially fetch components - if( built.pre_terrain.empty() && built.pre_special( src_loc ) ) { - return std::make_pair( false, NO_COMPONENTS ); - } else if( !built.pre_special( src_loc ) ) { - return std::make_pair( false, BLOCKING_TILE ); - } - // cant build it - // maybe we can build the pre-requisite instead - // see if the reason is because of pre-terrain requirement - if( !built.pre_terrain.empty() && ( ( built.pre_is_furniture && - furn_id( built.pre_terrain ) == g->m.furn( src_loc ) ) || ( !built.pre_is_furniture && - ter_id( built.pre_terrain ) == g->m.ter( src_loc ) ) ) ) { - // the pre-req is already built, so the reason is due to lack of tools/components - return std::make_pair( false, NO_COMPONENTS ); - } - built_pre = check_build_pre( built ); - // the pre-terrain requirement is not a possible construction. - if( built_pre.id == built.id ) { - return std::make_pair( false, NO_ZONE ); - } - // so lets check if we can build the pre-req - if( can_construct( built_pre, src_loc ) && player_can_build( p, pre_inv, built_pre ) ) { - return std::make_pair( true, CAN_DO_PREREQ ); - } else { - // Ok we'll go one more pre-req deep - for things like doors and walls that have 3 steps. - construction built_pre_2 = check_build_pre( built_pre ); - if( built_pre.id == built_pre_2.id ) { - //the 2nd pre-req down is not possible to build - return std::make_pair( false, NO_ZONE ); - } - if( can_construct( built_pre, src_loc ) && player_can_build( p, pre_inv, built_pre ) ) { - return std::make_pair( true, CAN_DO_PREREQ_2 ); - } - return std::make_pair( false, NO_COMPONENTS_PREREQ_2 ); - } + if( !stuff_there.empty() ) { + return activity_reason_info::build( BLOCKING_TILE, false, static_cast( index ) ); } + std::set used_idx; + const activity_reason_info act_info = find_base_construction( list_constructions, p, pre_inv, + src_loc, part_con_idx, static_cast( index ), used_idx ); + return act_info; } } else if( act == activity_id( "ACT_MULTIPLE_FARM" ) ) { zones = mgr.get_zones( zone_type_id( "FARM_PLOT" ), @@ -1109,18 +1391,18 @@ static std::pair can_do_activity_there( const activity for( const zone_data &zone : zones ) { if( g->m.has_flag_furn( "GROWTH_HARVEST", src_loc ) ) { // simple work, pulling up plants, nothing else required. - return std::make_pair( true, NEEDS_HARVESTING ); + return activity_reason_info::ok( NEEDS_HARVESTING ); } else if( g->m.has_flag( "PLOWABLE", src_loc ) && !g->m.has_furn( src_loc ) ) { if( p.has_quality( quality_id( "DIG" ), 1 ) ) { // we have a shovel/hoe already, great - return std::make_pair( true, NEEDS_TILLING ); + return activity_reason_info::ok( NEEDS_TILLING ); } else { // we need a shovel/hoe - return std::make_pair( false, NEEDS_TILLING ); + return activity_reason_info::fail( NEEDS_TILLING ); } } else if( g->m.has_flag_ter_or_furn( "PLANTABLE", src_loc ) && warm_enough_to_plant( src_loc ) ) { if( g->m.has_items( src_loc ) ) { - return std::make_pair( false, BLOCKING_TILE ); + return activity_reason_info::fail( BLOCKING_TILE ); } else { // do we have the required seed on our person? const auto options = dynamic_cast( zone.get_options() ); @@ -1130,7 +1412,7 @@ static std::pair can_do_activity_there( const activity } ); for( const auto elem : seed_inv ) { if( elem->typeId() == itype_id( seed ) ) { - return std::make_pair( true, NEEDS_PLANTING ); + return activity_reason_info::ok( NEEDS_PLANTING ); } } // didnt find the seed, but maybe there are overlapping farm zones @@ -1140,20 +1422,20 @@ static std::pair can_do_activity_there( const activity } else { // cant plant, till or harvest - return std::make_pair( false, ALREADY_DONE ); + return activity_reason_info::fail( ALREADY_DONE ); } } // looped through all zones, and only got here if its plantable, but have no seeds. - return std::make_pair( false, NEEDS_PLANTING ); + return activity_reason_info::fail( NEEDS_PLANTING ); } else if( act == activity_id( "ACT_FETCH_REQUIRED" ) ) { // we check if its possible to get all the requirements for fetching at two other places. // 1. before we even assign the fetch activity and; // 2. when we form the src_set to loop through at the beginning of the fetch activity. - return std::make_pair( true, CAN_DO_FETCH ); + return activity_reason_info::ok( CAN_DO_FETCH ); } // Shouldnt get here because the zones were checked previously. if it does, set enum reason as "no zone" - return std::make_pair( false, NO_ZONE ); + return activity_reason_info::fail( NO_ZONE ); } static std::vector> requirements_map( player &p ) @@ -1168,7 +1450,12 @@ static std::vector> requirements_map( player const units::volume volume_allowed = p.volume_capacity() - p.volume_carried(); const units::mass weight_allowed = p.weight_capacity() - p.weight_carried(); zone_manager &mgr = zone_manager::get_manager(); - const bool pickup_task = p.backlog.front().id() == activity_id( "ACT_MULTIPLE_FARM" ); + const bool pickup_task = p.backlog.front().id() == activity_id( "ACT_MULTIPLE_FARM" ) || + p.backlog.front().id() == activity_id( "ACT_MULTIPLE_CHOP_PLANKS" ) || + p.backlog.front().id() == activity_id( "ACT_MULTIPLE_BUTCHER" ) || + p.backlog.front().id() == activity_id( "ACT_MULTIPLE_CHOP_TREES" ) || + p.backlog.front().id() == activity_id( "ACT_VEHICLE_DECONSTRUCTION" ) || + p.backlog.front().id() == activity_id( "ACT_MULTIPLE_FISH" ); // where it is, what it is, how much of it, and how much in total is required of that item. std::vector> requirement_map; std::vector> final_map; @@ -1268,7 +1555,7 @@ static std::vector> requirements_map( player } for( auto map_elem : temp_map ) { total_map[map_elem.first] += map_elem.second; - // if its a construction/crafting task, we can discount any items already near the work spot + // if its a construction/crafting task, we can discount any items already near the work spot. // we dont need to fetch those, they will be used automatically in the construction. // a shovel for tilling, for example, however, needs to be picked up, no matter if its near the spot or not. if( !pickup_task ) { @@ -1439,19 +1726,16 @@ static bool plant_activity( player &p, const zone_data *zone, const tripoint src } static void construction_activity( player &p, const zone_data *zone, const tripoint src_loc, - do_activity_reason reason, const std::vector &list_constructions, + const activity_reason_info &act_info, const std::vector &list_constructions, activity_id activity_to_restore ) { const blueprint_options options = dynamic_cast( zone->get_options() ); // the actual desired construction - construction built_chosen; - if( reason == CAN_DO_CONSTRUCTION ) { - built_chosen = list_constructions[options.get_index()]; - } else if( reason == CAN_DO_PREREQ ) { - built_chosen = check_build_pre( list_constructions[options.get_index()] ); - } else { - built_chosen = check_build_pre( check_build_pre( list_constructions[options.get_index()] ) ); + if( !act_info.con_idx ) { + debugmsg( "no construction selected" ); + return; } + const construction &built_chosen = list_constructions[*act_info.con_idx]; std::list used; // create the partial construction struct partial_con pc; @@ -1568,7 +1852,12 @@ static void fetch_activity( player &p, const tripoint src_loc, activity_id activ g->m.getlocal( p.backlog.front().coords.back() ), src_veh, src_part, activity_to_restore ); return; // other tasks want the tool picked up - } else if( !p.backlog.empty() && p.backlog.front().id() == activity_id( "ACT_MULTIPLE_FARM" ) ) { + } else if( !p.backlog.empty() && ( p.backlog.front().id() == activity_id( "ACT_MULTIPLE_FARM" ) || + p.backlog.front().id() == activity_id( "ACT_MULTIPLE_CHOP_PLANKS" ) || + p.backlog.front().id() == activity_id( "ACT_VEHICLE_DECONSTRUCTION" ) || + p.backlog.front().id() == activity_id( "ACT_MULTIPLE_BUTCHER" ) || + p.backlog.front().id() == activity_id( "ACT_MULTIPLE_CHOP_TREES" ) || + p.backlog.front().id() == activity_id( "ACT_MULTIPLE_FISH" ) ) ) { if( it->volume() > volume_allowed || it->weight() > weight_allowed ) { continue; } @@ -1605,113 +1894,285 @@ static void fetch_activity( player &p, const tripoint src_loc, activity_id activ } } -static bool move_loot_activity( player &p, tripoint src_loc, zone_manager &mgr, - activity_id activity_to_restore ) +static bool butcher_corpse_activity( player &p, tripoint src_loc, do_activity_reason reason ) { - // the boolean in this pair being true indicates the item is from a vehicle storage space - auto items = std::vector>(); - vehicle *src_veh, *dest_veh; - int src_part, dest_part; - tripoint src = g->m.getabs( src_loc ); - tripoint abspos = g->m.getabs( p.pos() ); - //Check source for cargo part - //map_stack and vehicle_stack are different types but inherit from item_stack - // TODO: use one for loop - if( const cata::optional vp = g->m.veh_at( src_loc ).part_with_feature( "CARGO", - false ) ) { - src_veh = &vp->vehicle(); - src_part = vp->part_index(); - for( auto &it : src_veh->get_items( src_part ) ) { - items.push_back( std::make_pair( &it, true ) ); + map_stack items = g->m.i_at( src_loc ); + for( auto &elem : items ) { + if( elem.is_corpse() && !elem.has_var( "activity_var" ) ) { + const mtype corpse = *elem.get_mtype(); + if( corpse.size >= MS_MEDIUM && reason != NEEDS_BIG_BUTCHERING ) { + continue; + } + elem.set_var( "activity_var", p.name ); + p.assign_activity( activity_id( "ACT_BUTCHER_FULL" ), 0, true ); + p.activity.targets.emplace_back( map_cursor( src_loc ), &elem ); + p.activity.placement = g->m.getabs( src_loc ); + return true; } - } else { - src_veh = nullptr; - src_part = -1; } - for( auto &it : g->m.i_at( src_loc ) ) { - items.push_back( std::make_pair( &it, false ) ); + return false; +} + +static item *best_quality_item( player &p, quality_id qual ) +{ + std::vector qual_inv = p.items_with( [qual]( const item & itm ) { + return itm.has_quality( qual ); + } ); + item *best_qual = random_entry( qual_inv ); + for( const auto elem : qual_inv ) { + if( elem->get_quality( qual ) > best_qual->get_quality( qual ) ) { + best_qual = elem; + } } - //Skip items that have already been processed - for( auto it = items.begin() + mgr.get_num_processed( src ); it < items.end(); it++ ) { + return best_qual; +} - mgr.increment_num_processed( src ); +static bool chop_plank_activity( player &p, tripoint src_loc ) +{ + item *best_qual = best_quality_item( p, quality_id( "AXE" ) ); + if( !best_qual ) { + return false; + } + p.consume_charges( *best_qual, best_qual->type->charges_to_use() ); + for( auto &i : g->m.i_at( src_loc ) ) { + if( i.typeId() == "log" ) { + g->m.i_rem( src_loc, &i ); + int moves = to_moves( 20_minutes ); + p.add_msg_if_player( _( "You cut the log into planks." ) ); + p.assign_activity( activity_id( "ACT_CHOP_PLANKS" ), moves, -1 ); + p.activity.placement = g->m.getabs( src_loc ); + return true; + } + } + return false; +} - const auto thisitem = it->first; +void activity_on_turn_move_loot( player_activity &, player &p ) +{ + const activity_id act_move_loot = activity_id( "ACT_MOVE_LOOT" ); + auto &mgr = zone_manager::get_manager(); + if( g->m.check_vehicle_zones( g->get_levz() ) ) { + mgr.cache_vzones(); + } + const auto abspos = g->m.getabs( p.pos() ); + const auto &src_set = mgr.get_near( zone_type_id( "LOOT_UNSORTED" ), abspos ); + vehicle *src_veh, *dest_veh; + int src_part, dest_part; - if( thisitem->made_of_from_type( LIQUID ) ) { // skip unpickable liquid + // Nuke the current activity, leaving the backlog alone. + p.activity = player_activity(); + + // sort source tiles by distance + const auto &src_sorted = get_sorted_tiles_by_distance( abspos, src_set ); + + if( !mgr.is_sorting() ) { + mgr.start_sort( src_sorted ); + } + + for( auto &src : src_sorted ) { + const auto &src_loc = g->m.getlocal( src ); + if( !g->m.inbounds( src_loc ) ) { + if( !g->m.inbounds( p.pos() ) ) { + // p is implicitly an NPC that has been moved off the map, so reset the activity + // and unload them + p.assign_activity( act_move_loot ); + p.set_moves( 0 ); + g->reload_npcs(); + mgr.end_sort(); + return; + } + std::vector route; + route = g->m.route( p.pos(), src_loc, p.get_pathfinding_settings(), + p.get_path_avoid() ); + if( route.empty() ) { + // can't get there, can't do anything, skip it + continue; + } + p.set_destination( route, player_activity( act_move_loot ) ); + mgr.end_sort(); + return; + } + + bool is_adjacent_or_closer = square_dist( p.pos(), src_loc ) <= 1; + // skip tiles in IGNORE zone and tiles on fire + // (to prevent taking out wood off the lit brazier) + // and inaccessible furniture, like filled charcoal kiln + if( mgr.has( zone_type_id( "LOOT_IGNORE" ), src ) || + g->m.get_field( src_loc, fd_fire ) != nullptr || + !g->m.can_put_items_ter_furn( src_loc ) ) { continue; } - // Only if it's from a vehicle do we use the vehicle source location information. - vehicle *this_veh = it->second ? src_veh : nullptr; - const int this_part = it->second ? src_part : -1; + // the boolean in this pair being true indicates the item is from a vehicle storage space + auto items = std::vector>(); - const auto id = mgr.get_near_zone_type_for_item( *thisitem, abspos ); + //Check source for cargo part + //map_stack and vehicle_stack are different types but inherit from item_stack + // TODO: use one for loop + if( const cata::optional vp = g->m.veh_at( src_loc ).part_with_feature( "CARGO", + false ) ) { + src_veh = &vp->vehicle(); + src_part = vp->part_index(); + for( auto &it : src_veh->get_items( src_part ) ) { + items.push_back( std::make_pair( &it, true ) ); + } + } else { + src_veh = nullptr; + src_part = -1; + } + for( auto &it : g->m.i_at( src_loc ) ) { + items.push_back( std::make_pair( &it, false ) ); + } + //Skip items that have already been processed + for( auto it = items.begin() + mgr.get_num_processed( src ); it < items.end(); it++ ) { - // checks whether the item is already on correct loot zone or not - // if it is, we can skip such item, if not we move the item to correct pile - // think empty bag on food pile, after you ate the content - if( !mgr.has( id, src ) ) { - const auto &dest_set = mgr.get_near( id, abspos ); + mgr.increment_num_processed( src ); - for( auto &dest : dest_set ) { - const auto &dest_loc = g->m.getlocal( dest ); + const auto thisitem = it->first; - //Check destination for cargo part - if( const cata::optional vp = g->m.veh_at( dest_loc ).part_with_feature( "CARGO", - false ) ) { - dest_veh = &vp->vehicle(); - dest_part = vp->part_index(); - } else { - dest_veh = nullptr; - dest_part = -1; - } + if( thisitem->made_of_from_type( LIQUID ) ) { // skip unpickable liquid + continue; + } - // skip tiles with inaccessible furniture, like filled charcoal kiln - if( !g->m.can_put_items_ter_furn( dest_loc ) ) { - continue; - } + // Only if it's from a vehicle do we use the vehicle source location information. + vehicle *this_veh = it->second ? src_veh : nullptr; + const int this_part = it->second ? src_part : -1; - units::volume free_space; - // if there's a vehicle with space do not check the tile beneath - if( dest_veh ) { - free_space = dest_veh->free_volume( dest_part ); - } else { - free_space = g->m.free_volume( dest_loc ); - } - // check free space at destination - if( free_space >= thisitem->volume() ) { - move_item( p, *thisitem, thisitem->count(), src_loc, dest_loc, this_veh, this_part ); + const auto id = mgr.get_near_zone_type_for_item( *thisitem, abspos ); - // moved item away from source so decrement - mgr.decrement_num_processed( src ); + // checks whether the item is already on correct loot zone or not + // if it is, we can skip such item, if not we move the item to correct pile + // think empty bag on food pile, after you ate the content + if( !mgr.has( id, src ) ) { + const auto &dest_set = mgr.get_near( id, abspos, 60, thisitem ); - break; + for( auto &dest : dest_set ) { + const auto &dest_loc = g->m.getlocal( dest ); + + //Check destination for cargo part + if( const cata::optional vp = g->m.veh_at( dest_loc ).part_with_feature( "CARGO", + false ) ) { + dest_veh = &vp->vehicle(); + dest_part = vp->part_index(); + } else { + dest_veh = nullptr; + dest_part = -1; + } + + // skip tiles with inaccessible furniture, like filled charcoal kiln + if( !g->m.can_put_items_ter_furn( dest_loc ) ) { + continue; + } + + units::volume free_space; + // if there's a vehicle with space do not check the tile beneath + if( dest_veh ) { + free_space = dest_veh->free_volume( dest_part ); + } else { + free_space = g->m.free_volume( dest_loc ); + } + // check free space at destination + if( free_space >= thisitem->volume() ) { + // before we move any item, check if player is at or + // adjacent to the loot source tile + if( !is_adjacent_or_closer ) { + std::vector route; + bool adjacent = false; + + // get either direct route or route to nearest adjacent tile if + // source tile is impassable + if( g->m.passable( src_loc ) ) { + route = g->m.route( p.pos(), src_loc, p.get_pathfinding_settings(), + p.get_path_avoid() ); + } else { + // immpassable source tile (locker etc.), + // get route to nerest adjacent tile instead + route = route_adjacent( p, src_loc ); + adjacent = true; + } + + // check if we found path to source / adjacent tile + if( route.empty() ) { + add_msg( m_info, _( "%s can't reach the source tile. Try to sort out loot without a cart." ), + p.disp_name() ); + mgr.end_sort(); + return; + } + + // shorten the route to adjacent tile, if necessary + if( !adjacent ) { + route.pop_back(); + } + + // set the destination and restart activity after player arrives there + // we don't need to check for safe mode, + // activity will be restarted only if + // player arrives on destination tile + p.set_destination( route, player_activity( act_move_loot ) ); + mgr.end_sort(); + return; + } + move_item( p, *thisitem, thisitem->count(), src_loc, dest_loc, this_veh, this_part ); + + // moved item away from source so decrement + mgr.decrement_num_processed( src ); + + break; + } + } + if( p.moves <= 0 ) { + // Restart activity and break from cycle. + p.assign_activity( act_move_loot ); + mgr.end_sort(); + return; } - } - if( p.moves <= 0 ) { - // Restart activity and break from cycle. - p.assign_activity( activity_to_restore ); - mgr.end_sort(); - return true; } } } - return false; + + // If we got here without restarting the activity, it means we're done + add_msg( m_info, _( "%s sorted out every item possible." ), p.disp_name() ); + if( p.is_npc() ) { + npc *guy = dynamic_cast( &p ); + guy->revert_after_activity(); + guy->current_activity_id = activity_id::NULL_ID(); + } + mgr.end_sort(); } -static std::string random_string( size_t length ) +static int chop_moves( player &p, item *it ) { - auto randchar = []() -> char { - const char charset[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "abcdefghijklmnopqrstuvwxyz"; - const size_t max_index = ( sizeof( charset ) - 1 ); - return charset[rand() % max_index]; - }; - std::string str( length, 0 ); - std::generate_n( str.begin(), length, randchar ); - return str; + // quality of tool + const int quality = it->get_quality( quality_id( "AXE" ) ); + + // attribute; regular tools - based on STR, powered tools - based on DEX + const int attr = it->has_flag( "POWERED" ) ? p.dex_cur : p.str_cur; + + int moves = to_moves( time_duration::from_minutes( 60 - attr ) / std::pow( 2, quality - 1 ) ); + const int helpersize = p.get_num_crafting_helpers( 3 ); + moves = moves * ( 1 - ( helpersize / 10 ) ); + return moves; +} + +static bool chop_tree_activity( player &p, const tripoint &src_loc ) +{ + item *best_qual = best_quality_item( p, quality_id( "AXE" ) ); + if( !best_qual ) { + return false; + } + int moves = chop_moves( p, best_qual ); + p.consume_charges( *best_qual, best_qual->type->charges_to_use() ); + const ter_id ter = g->m.ter( src_loc ); + if( g->m.has_flag( "TREE", src_loc ) ) { + p.assign_activity( activity_id( "ACT_CHOP_TREE" ), moves, -1, p.get_item_position( best_qual ) ); + p.activity.placement = g->m.getabs( src_loc ); + return true; + } else if( ter == t_trunk || ter == t_stump ) { + p.assign_activity( activity_id( "ACT_CHOP_LOGS" ), moves, -1, p.get_item_position( best_qual ) ); + p.activity.placement = g->m.getabs( src_loc ); + return true; + } + return false; } void generic_multi_activity_handler( player_activity &act, player &p ) @@ -1730,13 +2191,6 @@ void generic_multi_activity_handler( player_activity &act, player &p ) // Nuke the current activity, leaving the backlog alone p.activity = player_activity(); // now we setup the target spots based on whch activity is occuring - if( activity_to_restore == activity_id( "ACT_MOVE_LOOT" ) ) { - dark_capable = true; - if( g->m.check_vehicle_zones( g->get_levz() ) ) { - mgr.cache_vzones(); - } - src_set = mgr.get_near( zone_type_id( "LOOT_UNSORTED" ), abspos ); - } if( activity_to_restore == activity_id( "ACT_TIDY_UP" ) ) { dark_capable = true; tripoint unsorted_spot; @@ -1768,6 +2222,12 @@ void generic_multi_activity_handler( player_activity &act, player &p ) } } } + if( activity_to_restore == activity_id( "ACT_VEHICLE_DECONSTRUCTION" ) ) { + src_set = mgr.get_near( zone_type_id( "VEHICLE_DECONSTRUCT" ), abspos, 60 ); + } + if( activity_to_restore == activity_id( "ACT_MULTIPLE_CHOP_TREES" ) ) { + src_set = mgr.get_near( zone_type_id( "CHOP_TREES" ), abspos, 60 ); + } // multiple construction will form a list of targets based on blueprint zones and unfinished constructions if( activity_to_restore == activity_id( "ACT_MULTIPLE_CONSTRUCTION" ) ) { src_set = mgr.get_near( zone_type_id( "CONSTRUCTION_BLUEPRINT" ), abspos, 60 ); @@ -1794,6 +2254,16 @@ void generic_multi_activity_handler( player_activity &act, player &p ) src_set.insert( g->m.getabs( elem_point ) ); } } + if( activity_to_restore == activity_id( "ACT_MULTIPLE_BUTCHER" ) ) { + src_set = mgr.get_near( zone_type_id( "LOOT_CORPSE" ), abspos, 60 ); + } + if( activity_to_restore == activity_id( "ACT_MULTIPLE_CHOP_PLANKS" ) ) { + // we want to chop logs so get loot wood spots + src_set = mgr.get_near( zone_type_id( "LOOT_WOOD" ), abspos, 60 ); + } + if( activity_to_restore == activity_id( "ACT_MULTIPLE_FISH" ) ) { + src_set = mgr.get_near( zone_type_id( "FISHING_SPOT" ), abspos, 60 ); + } // prune the set to remove tiles that are never gonna work out. for( auto it2 = src_set.begin(); it2 != src_set.end(); ) { // remove dangerous tiles @@ -1803,17 +2273,19 @@ void generic_multi_activity_handler( player_activity &act, player &p ) // remove tiles in darkness, if we arent lit-up ourselves } else if( !dark_capable && p.fine_detail_vision_mod( set_pt ) > 4.0 ) { it2 = src_set.erase( it2 ); + } else if( activity_to_restore == activity_id( "ACT_MULTIPLE_FISH" ) ) { + const ter_id terrain_id = g->m.ter( set_pt ); + if( !terrain_id.obj().has_flag( TFLAG_DEEP_WATER ) ) { + it2 = src_set.erase( it2 ); + } else { + ++it2; + } } else { ++it2; } } // now we have our final set of points std::vector src_sorted = get_sorted_tiles_by_distance( abspos, src_set ); - if( activity_to_restore == activity_id( "ACT_MOVE_LOOT" ) ) { - if( !mgr.is_sorting() ) { - mgr.start_sort( src_sorted ); - } - } // now loop through the work-spot tiles and judge whether its worth travelling to it yet // or if we need to fetch something first. for( const tripoint &src : src_sorted ) { @@ -1825,9 +2297,6 @@ void generic_multi_activity_handler( player_activity &act, player &p ) p.assign_activity( activity_to_restore ); p.set_moves( 0 ); g->reload_npcs(); - if( activity_to_restore == activity_id( "ACT_MOVE_LOOT" ) ) { - mgr.end_sort(); - } return; } const std::vector route = route_adjacent( p, src_loc ); @@ -1839,13 +2308,18 @@ void generic_multi_activity_handler( player_activity &act, player &p ) p.set_destination( route, player_activity( activity_to_restore ) ); return; } - std::pair check_can_do = can_do_activity_there( activity_to_restore, p, - src_loc ); - const bool can_do_it = check_can_do.first; - const do_activity_reason reason = check_can_do.second; + activity_reason_info act_info = can_do_activity_there( activity_to_restore, p, + src_loc ); + const bool &can_do_it = act_info.can_do; + const do_activity_reason &reason = act_info.reason; const zone_data *zone = mgr.get_zone_at( src ); const bool needs_to_be_in_zone = activity_to_restore == activity_id( "ACT_FETCH_REQUIRED" ) || activity_to_restore == activity_id( "ACT_MULTIPLE_FARM" ) || + activity_to_restore == activity_id( "ACT_MULTIPLE_BUTCHER" ) || + activity_to_restore == activity_id( "ACT_MULTIPLE_CHOP_PLANKS" ) || + activity_to_restore == activity_id( "ACT_MULTIPLE_CHOP_TREES" ) || + activity_to_restore == activity_id( "ACT_VEHICLE_DECONSTRUCTION" ) || + activity_to_restore == activity_id( "ACT_MULTIPLE_FISH" ) || ( activity_to_restore == activity_id( "ACT_MULTIPLE_CONSTRUCTION" ) && !g->m.partial_con_at( src_loc ) ); // some activities require the target tile to be part of a zone. @@ -1860,12 +2334,12 @@ void generic_multi_activity_handler( player_activity &act, player &p ) p.add_msg_if_player( m_info, _( "You don't have the skill for this task." ) ); } else if( reason == BLOCKING_TILE ) { p.add_msg_if_player( m_info, _( "There is something blocking the location for this task." ) ); - } else { - p.add_msg_if_player( m_info, _( "You cannot do this task there." ) ); } continue; } else if( ( !can_do_it ) && ( reason == NO_COMPONENTS || reason == NEEDS_PLANTING || - reason == NEEDS_TILLING ) ) { + reason == NEEDS_TILLING || reason == NEEDS_CHOPPING || reason == NEEDS_BUTCHERING || + reason == NEEDS_BIG_BUTCHERING || reason == NEEDS_VEH_DECONST || reason == NEEDS_TREE_CHOPPING || + reason == NEEDS_FISHING ) ) { // we can do it, but we need to fetch some stuff first // before we set the task to fetch components - is it even worth it? are the components anywhere? requirement_id what_we_need; @@ -1881,27 +2355,48 @@ void generic_multi_activity_handler( player_activity &act, player &p ) if( ( reason == NO_COMPONENTS || reason == NO_COMPONENTS_PREREQ || reason == NO_COMPONENTS_PREREQ_2 ) && activity_to_restore == activity_id( "ACT_MULTIPLE_CONSTRUCTION" ) ) { - // its a construction and we need the components. - const blueprint_options options = dynamic_cast( zone->get_options() ); - construction built_chosen; - if( reason == NO_COMPONENTS ) { - built_chosen = list_constructions[options.get_index()]; - } else if( reason == NO_COMPONENTS_PREREQ ) { - built_chosen = check_build_pre( list_constructions[options.get_index()] ); - } else { - built_chosen = check_build_pre( check_build_pre( list_constructions[options.get_index()] ) ); + if( !act_info.con_idx ) { + debugmsg( "no construction selected" ); + continue; } + // its a construction and we need the components. + const construction &built_chosen = list_constructions[ *act_info.con_idx ]; what_we_need = built_chosen.requirements; - } else if( reason == NEEDS_TILLING || reason == NEEDS_PLANTING ) { + } else if( reason == NEEDS_VEH_DECONST ) { + vehicle *veh = veh_pointer_or_null( g->m.veh_at( src_loc ) ); + // we already checked this in can_do_activity() but check again just incase. + if( !veh ) { + p.activity_vehicle_part_index = 1; + continue; + } + const vpart_info &vpinfo = veh->part_info( p.activity_vehicle_part_index ); + const auto &reqs = vpinfo.removal_requirements(); + const std::string ran_str = random_string( 10 ); + const requirement_id req_id( ran_str ); + requirement_data::save_requirement( reqs, req_id ); + what_we_need = req_id; + } else if( reason == NEEDS_TILLING || reason == NEEDS_PLANTING || reason == NEEDS_CHOPPING || + reason == NEEDS_BUTCHERING || reason == NEEDS_BIG_BUTCHERING || reason == NEEDS_TREE_CHOPPING || + reason == NEEDS_FISHING ) { std::vector> requirement_comp_vector; std::vector> quality_comp_vector; std::vector> tool_comp_vector; if( reason == NEEDS_TILLING ) { quality_comp_vector.push_back( std::vector { quality_requirement( quality_id( "DIG" ), 1, 1 ) } ); + } else if( reason == NEEDS_CHOPPING || reason == NEEDS_TREE_CHOPPING ) { + quality_comp_vector.push_back( std::vector { quality_requirement( quality_id( "AXE" ), 1, 1 ) } ); } else if( reason == NEEDS_PLANTING ) { requirement_comp_vector.push_back( std::vector { item_comp( itype_id( dynamic_cast ( zone->get_options() ).get_seed() ), 1 ) } ); + } else if( reason == NEEDS_BUTCHERING || reason == NEEDS_BIG_BUTCHERING ) { + quality_comp_vector.push_back( std::vector { quality_requirement( quality_id( "BUTCHER" ), 1, 1 ) } ); + if( reason == NEEDS_BIG_BUTCHERING ) { + quality_comp_vector.push_back( std::vector { quality_requirement( quality_id( "SAW_M" ), 1, 1 ), quality_requirement( quality_id( "SAW_W" ), 1, 1 ) } ); + } + + } else if( reason == NEEDS_FISHING ) { + quality_comp_vector.push_back( std::vector {quality_requirement( quality_id( "FISHING" ), 1, 1 )} ); } // ok, we need a shovel/hoe/axe/etc // this is an activity that only requires this one tool, so we will fetch and wield it. @@ -1912,11 +2407,16 @@ void generic_multi_activity_handler( player_activity &act, player &p ) requirement_data::save_requirement( reqs_data, req_id ); what_we_need = req_id; } - bool tool_pickup = reason == NEEDS_TILLING || reason == NEEDS_PLANTING; + bool tool_pickup = reason == NEEDS_TILLING || reason == NEEDS_PLANTING || + reason == NEEDS_CHOPPING || reason == NEEDS_BUTCHERING || reason == NEEDS_BIG_BUTCHERING || + reason == NEEDS_TREE_CHOPPING || reason == NEEDS_VEH_DECONST; // is it even worth fetching anything if there isnt enough nearby? if( !are_requirements_nearby( tool_pickup ? loot_zone_spots : combined_spots, what_we_need, p, activity_to_restore, tool_pickup ) ) { p.add_msg_if_player( m_info, _( "The required items are not available to complete this task." ) ); + if( reason == NEEDS_VEH_DECONST ) { + p.activity_vehicle_part_index = -1; + } continue; } else { p.backlog.push_front( activity_to_restore ); @@ -1957,14 +2457,12 @@ void generic_multi_activity_handler( player_activity &act, player &p ) // check if we found path to source / adjacent tile if( route.empty() ) { - if( activity_to_restore == activity_id( "ACT_MOVE_LOOT" ) ) { - mgr.end_sort(); - } return; } if( p.moves <= 0 ) { // Restart activity and break from cycle. p.assign_activity( activity_to_restore ); + p.activity_vehicle_part_index = -1; return; } // set the destination and restart activity after player arrives there @@ -1988,13 +2486,24 @@ void generic_multi_activity_handler( player_activity &act, player &p ) if( !plant_activity( p, zone, src_loc ) ) { continue; } - } else if( reason == CAN_DO_CONSTRUCTION && g->m.partial_con_at( src_loc ) ) { + } else if( reason == NEEDS_CHOPPING && p.has_quality( quality_id( "AXE" ), 1 ) ) { + if( chop_plank_activity( p, src_loc ) ) { + p.backlog.push_front( activity_to_restore ); + return; + } + } else if( reason == NEEDS_BUTCHERING || reason == NEEDS_BIG_BUTCHERING ) { p.backlog.push_front( activity_to_restore ); - p.assign_activity( activity_id( "ACT_BUILD" ) ); - p.activity.placement = src; - return; - } else if( reason == CAN_DO_CONSTRUCTION || reason == CAN_DO_PREREQ || reason == CAN_DO_PREREQ_2 ) { - construction_activity( p, zone, src_loc, reason, list_constructions, activity_to_restore ); + if( butcher_corpse_activity( p, src_loc, reason ) ) { + return; + } + } else if( reason == CAN_DO_CONSTRUCTION || reason == CAN_DO_PREREQ ) { + if( g->m.partial_con_at( src_loc ) ) { + p.backlog.push_front( activity_to_restore ); + p.assign_activity( activity_id( "ACT_BUILD" ) ); + p.activity.placement = src; + return; + } + construction_activity( p, zone, src_loc, act_info, list_constructions, activity_to_restore ); return; } else if( reason == CAN_DO_FETCH && activity_to_restore == activity_id( "ACT_TIDY_UP" ) ) { if( !tidy_activity( p, src_loc, activity_to_restore ) ) { @@ -2003,19 +2512,29 @@ void generic_multi_activity_handler( player_activity &act, player &p ) } else if( reason == CAN_DO_FETCH && activity_to_restore == activity_id( "ACT_FETCH_REQUIRED" ) ) { fetch_activity( p, src_loc, activity_to_restore ); return; - } else if( reason == CAN_DO_FETCH && activity_to_restore == activity_id( "ACT_MOVE_LOOT" ) ) { - if( move_loot_activity( p, src_loc, mgr, activity_to_restore ) ) { + } else if( reason == NEEDS_TREE_CHOPPING && p.has_quality( quality_id( "AXE" ), 1 ) ) { + p.backlog.push_front( activity_to_restore ); + if( chop_tree_activity( p, src_loc ) ) { return; } - continue; + } else if( reason == NEEDS_FISHING && p.has_quality( quality_id( "FISHING" ), 1 ) ) { + p.backlog.push_front( activity_to_restore ); + // we dont want to keep repeating the fishing activity, just piggybacking on this functions structure to find requirements. + p.activity = player_activity(); + item *best_rod = best_quality_item( p, quality_id( "FISHING" ) ); + p.assign_activity( activity_id( "ACT_FISH" ), to_moves( 5_hours ), 0, + p.get_item_position( best_rod ), best_rod->tname() ); + p.activity.coord_set = g->get_fishable_locations( 60, src_loc ); + return; + } else if( reason == NEEDS_VEH_DECONST ) { + p.backlog.push_front( activity_to_restore ); + vehicle_deconstruct_activity( p, src_loc, p.activity_vehicle_part_index ); + return; } } if( p.moves <= 0 ) { // Restart activity and break from cycle. p.assign_activity( activity_to_restore ); - if( activity_to_restore == activity_id( "ACT_MOVE_LOOT" ) ) { - mgr.end_sort(); - } return; } // if we got here, we need to revert otherwise NPC will be stuck in AI Limbo and have a head explosion. @@ -2026,16 +2545,19 @@ void generic_multi_activity_handler( player_activity &act, player &p ) } // tidy up leftover moved parts and tools left lying near the work spots. if( activity_to_restore == activity_id( "ACT_MULTIPLE_FARM" ) || - activity_to_restore == activity_id( "ACT_MULTIPLE_CONSTRUCTION" ) ) { + activity_to_restore == activity_id( "ACT_MULTIPLE_CONSTRUCTION" ) || + activity_to_restore == activity_id( "ACT_MULTIPLE_CHOP_PLANKS" ) || + activity_to_restore == activity_id( "ACT_MULTIPLE_BUTCHER" ) || + activity_to_restore == activity_id( "ACT_VEHICLE_DECONSTRUCTION" ) || + activity_to_restore == activity_id( "ACT_MULTIPLE_CHOP_TREES" ) ) { p.assign_activity( activity_id( "ACT_TIDY_UP" ) ); - } else if( activity_to_restore == activity_id( "ACT_MOVE_LOOT" ) ) { - mgr.end_sort(); } + p.activity_vehicle_part_index = -1; } } -static cata::optional find_best_fire( - const std::vector &from, const tripoint ¢er ) +static cata::optional find_best_fire( const std::vector &from, + const tripoint ¢er ) { cata::optional best_fire; time_duration best_fire_age = 1_days; @@ -2060,6 +2582,49 @@ static cata::optional find_best_fire( return best_fire; } +static inline bool has_clear_path_to_pickup_items( const tripoint &from, const tripoint &to ) +{ + return g->m.has_items( to ) && + g->m.accessible_items( to ) && + g->m.clear_path( from, to, PICKUP_RANGE, 1, 100 ); +} + +static cata::optional find_refuel_spot_zone( const tripoint ¢er ) +{ + const zone_manager &mgr = zone_manager::get_manager(); + const tripoint center_abs = g->m.getabs( center ); + + const std::unordered_set &tiles_abs_unordered = + mgr.get_near( zone_source_firewood, center_abs, PICKUP_RANGE ); + const std::vector &tiles_abs = + get_sorted_tiles_by_distance( center_abs, tiles_abs_unordered ); + + for( const tripoint &tile_abs : tiles_abs ) { + const tripoint tile = g->m.getlocal( tile_abs ); + if( has_clear_path_to_pickup_items( center, tile ) ) { + return tile; + } + } + + return {}; +} + +static cata::optional find_refuel_spot_trap( const std::vector &from, + const tripoint ¢er ) +{ + const auto tile = std::find_if( from.begin(), from.end(), [center]( const tripoint & pt ) { + // Hacky - firewood spot is a trap and it's ID-checked + return g->m.tr_at( pt ).id == tr_firewood_source + && has_clear_path_to_pickup_items( center, pt ); + } ); + + if( tile != from.end() ) { + return *tile; + } + + return {}; +} + void try_fuel_fire( player_activity &act, player &p, const bool starting_fire ) { const tripoint pos = p.pos(); @@ -2073,15 +2638,12 @@ void try_fuel_fire( player_activity &act, player &p, const bool starting_fire ) return; } - const auto refuel_spot = std::find_if( adjacent.begin(), adjacent.end(), - [pos]( const tripoint & pt ) { - // Hacky - firewood spot is a trap and it's ID-checked - // TODO: Something cleaner than ID-checking a trap - return g->m.tr_at( pt ).id == tr_firewood_source && g->m.has_items( pt ) && - g->m.accessible_items( pt ) && g->m.clear_path( pos, pt, PICKUP_RANGE, 1, 100 ); - } ); - if( refuel_spot == adjacent.end() ) { - return; + cata::optional refuel_spot = find_refuel_spot_zone( pos ); + if( !refuel_spot ) { + refuel_spot = find_refuel_spot_trap( adjacent, pos ); + if( !refuel_spot ) { + return; + } } // Special case: fire containers allow burning logs, so use them as fuel iif fire is contained diff --git a/src/activity_type.h b/src/activity_type.h index 2b007017c6fa1..98dce00ac6c83 100644 --- a/src/activity_type.h +++ b/src/activity_type.h @@ -31,7 +31,7 @@ class activity_type private: activity_id id_; bool rooted_ = false; - translation verb_ = translation( "THIS IS A BUG" ); + translation verb_ = to_translation( "THIS IS A BUG" ); bool suspendable_ = true; based_on_type based_on_ = based_on_type::SPEED; bool no_resume_ = false; diff --git a/src/addiction.cpp b/src/addiction.cpp index b81f35df1e704..17243d1bd7aad 100644 --- a/src/addiction.cpp +++ b/src/addiction.cpp @@ -15,6 +15,38 @@ const efftype_id effect_hallu( "hallu" ); const efftype_id effect_shakes( "shakes" ); +namespace io +{ + +template<> +std::string enum_to_string( add_type data ) +{ + switch( data ) { + // *INDENT-OFF* + case add_type::ADD_NULL: return "NULL"; + case add_type::ADD_CAFFEINE: return "CAFFEINE"; + case add_type::ADD_ALCOHOL: return "ALCOHOL"; + case add_type::ADD_SLEEP: return "SLEEP"; + case add_type::ADD_PKILLER: return "PKILLER"; + case add_type::ADD_SPEED: return "SPEED"; + case add_type::ADD_CIG: return "CIG"; + case add_type::ADD_COKE: return "COKE"; + case add_type::ADD_CRACK: return "CRACK"; + case add_type::ADD_MUTAGEN: return "MUTAGEN"; + case add_type::ADD_DIAZEPAM: return "DIAZEPAM"; + case add_type::ADD_MARLOSS_R: return "MARLOSS_R"; + case add_type::ADD_MARLOSS_B: return "MARLOSS_B"; + case add_type::ADD_MARLOSS_Y: return "MARLOSS_Y"; + // *INDENT-ON* + case add_type::NUM_ADD_TYPES: + break; + } + debugmsg( "Invalid add_type" ); + abort(); +} + +} // namespace io + void marloss_add( player &u, int in, const char *msg ); void addict_effect( player &u, addiction &add ) @@ -57,14 +89,6 @@ void addict_effect( player &u, addiction &add ) case ADD_ALCOHOL: case ADD_DIAZEPAM: { - static const std::string alc_1 = _( "You could use a drink. " ); - static const std::string alc_2 = _( "Your hands start shaking... you need a drink bad!" ) ; - static const std::string dia_1 = _( "You could use some diazepam." ); - static const std::string dia_2 = _( "You're shaking... you need some diazepam!" ); - - const std::string &msg_1 = add.type == ADD_ALCOHOL ? alc_1 : dia_1; - const std::string &msg_2 = add.type == ADD_ALCOHOL ? alc_2 : dia_2; - const auto morale_type = add.type == ADD_ALCOHOL ? MORALE_CRAVING_ALCOHOL : MORALE_CRAVING_DIAZEPAM; u.mod_per_bonus( -1 ); @@ -73,9 +97,15 @@ void addict_effect( player &u, addiction &add ) u.mod_healthy_mod( -1, -in * 10 ); } if( one_in( 20 ) && rng( 0, 20 ) < in ) { + const std::string msg_1 = add.type == ADD_ALCOHOL ? + _( "You could use a drink." ) : + _( "You could use some diazepam." ); u.add_msg_if_player( m_warning, msg_1 ); u.add_morale( morale_type, -35, -10 * in ); } else if( rng( 8, 300 ) < in ) { + const std::string msg_2 = add.type == ADD_ALCOHOL ? + _( "Your hands start shaking... you need a drink bad!" ) : + _( "You're shaking... you need some diazepam!" ); u.add_msg_if_player( m_bad, msg_2 ); u.add_morale( morale_type, -35, -10 * in ); u.add_effect( effect_shakes, 5_minutes ); @@ -151,9 +181,9 @@ void addict_effect( player &u, addiction &add ) case ADD_COKE: case ADD_CRACK: { - static const std::string coke_msg = _( "You feel like you need a bump." ); - static const std::string crack_msg = _( "You're shivering, you need some crack." ); - const std::string &cur_msg = add.type == ADD_COKE ? coke_msg : crack_msg; + const std::string &cur_msg = add.type == ADD_COKE ? + _( "You feel like you need a bump." ) : + _( "You're shivering, you need some crack." ); const auto morale_type = add.type == ADD_COKE ? MORALE_CRAVING_COCAINE : MORALE_CRAVING_CRACK; u.mod_int_bonus( -1 ); u.mod_per_bonus( -1 ); @@ -200,6 +230,7 @@ void addict_effect( player &u, addiction &add ) marloss_add( u, in, _( "You daydream about succulent, pale golden gel, sweet but light." ) ); break; case ADD_NULL: + case NUM_ADD_TYPES: break; } } @@ -208,60 +239,58 @@ void addict_effect( player &u, addiction &add ) * Returns the name of an addiction. It should be able to finish the sentence * "Became addicted to ______". */ -const std::string &addiction_type_name( add_type const cur ) +std::string addiction_type_name( add_type const cur ) { static const std::map type_map = {{ - { ADD_CIG, _( "nicotine" ) }, - { ADD_CAFFEINE, _( "caffeine" ) }, - { ADD_ALCOHOL, _( "alcohol" ) }, - { ADD_SLEEP, _( "sleeping pills" ) }, - { ADD_PKILLER, _( "opiates" ) }, - { ADD_SPEED, _( "amphetamine" ) }, - { ADD_COKE, _( "cocaine" ) }, - { ADD_CRACK, _( "crack cocaine" ) }, - { ADD_MUTAGEN, _( "mutation" ) }, - { ADD_DIAZEPAM, _( "diazepam" ) }, - { ADD_MARLOSS_R, _( "Marloss berries" ) }, - { ADD_MARLOSS_B, _( "Marloss seeds" ) }, - { ADD_MARLOSS_Y, _( "Marloss gel" ) }, + { ADD_CIG, translate_marker( "nicotine" ) }, + { ADD_CAFFEINE, translate_marker( "caffeine" ) }, + { ADD_ALCOHOL, translate_marker( "alcohol" ) }, + { ADD_SLEEP, translate_marker( "sleeping pills" ) }, + { ADD_PKILLER, translate_marker( "opiates" ) }, + { ADD_SPEED, translate_marker( "amphetamine" ) }, + { ADD_COKE, translate_marker( "cocaine" ) }, + { ADD_CRACK, translate_marker( "crack cocaine" ) }, + { ADD_MUTAGEN, translate_marker( "mutation" ) }, + { ADD_DIAZEPAM, translate_marker( "diazepam" ) }, + { ADD_MARLOSS_R, translate_marker( "Marloss berries" ) }, + { ADD_MARLOSS_B, translate_marker( "Marloss seeds" ) }, + { ADD_MARLOSS_Y, translate_marker( "Marloss gel" ) }, } }; const auto iter = type_map.find( cur ); if( iter != type_map.end() ) { - return iter->second; + return _( iter->second ); } - static const std::string error_string( "bugs in addiction.cpp" ); - return error_string; + return "bugs in addiction.cpp"; } -const std::string &addiction_name( const addiction &cur ) +std::string addiction_name( const addiction &cur ) { static const std::map type_map = {{ - { ADD_CIG, _( "Nicotine Withdrawal" ) }, - { ADD_CAFFEINE, _( "Caffeine Withdrawal" ) }, - { ADD_ALCOHOL, _( "Alcohol Withdrawal" ) }, - { ADD_SLEEP, _( "Sleeping Pill Dependence" ) }, - { ADD_PKILLER, _( "Opiate Withdrawal" ) }, - { ADD_SPEED, _( "Amphetamine Withdrawal" ) }, - { ADD_COKE, _( "Cocaine Withdrawal" ) }, - { ADD_CRACK, _( "Crack Cocaine Withdrawal" ) }, - { ADD_MUTAGEN, _( "Mutation Withdrawal" ) }, - { ADD_DIAZEPAM, _( "Diazepam Withdrawal" ) }, - { ADD_MARLOSS_R, _( "Marloss Longing" ) }, - { ADD_MARLOSS_B, _( "Marloss Desire" ) }, - { ADD_MARLOSS_Y, _( "Marloss Cravings" ) }, + { ADD_CIG, translate_marker( "Nicotine Withdrawal" ) }, + { ADD_CAFFEINE, translate_marker( "Caffeine Withdrawal" ) }, + { ADD_ALCOHOL, translate_marker( "Alcohol Withdrawal" ) }, + { ADD_SLEEP, translate_marker( "Sleeping Pill Dependence" ) }, + { ADD_PKILLER, translate_marker( "Opiate Withdrawal" ) }, + { ADD_SPEED, translate_marker( "Amphetamine Withdrawal" ) }, + { ADD_COKE, translate_marker( "Cocaine Withdrawal" ) }, + { ADD_CRACK, translate_marker( "Crack Cocaine Withdrawal" ) }, + { ADD_MUTAGEN, translate_marker( "Mutation Withdrawal" ) }, + { ADD_DIAZEPAM, translate_marker( "Diazepam Withdrawal" ) }, + { ADD_MARLOSS_R, translate_marker( "Marloss Longing" ) }, + { ADD_MARLOSS_B, translate_marker( "Marloss Desire" ) }, + { ADD_MARLOSS_Y, translate_marker( "Marloss Cravings" ) }, } }; const auto iter = type_map.find( cur.type ); if( iter != type_map.end() ) { - return iter->second; + return _( iter->second ); } - static const std::string error_string( "Erroneous addiction" ); - return error_string; + return "Erroneous addiction"; } morale_type addiction_craving( add_type const cur ) @@ -318,38 +347,37 @@ add_type addiction_type( const std::string &name ) return ADD_NULL; } -const std::string &addiction_text( const addiction &cur ) +std::string addiction_text( const addiction &cur ) { static const std::map addiction_msg = {{ - { ADD_CIG, _( "Intelligence - 1; Occasional cravings" ) }, - { ADD_CAFFEINE, _( "Strength - 1; Slight sluggishness; Occasional cravings" ) }, + { ADD_CIG, translate_marker( "Intelligence - 1; Occasional cravings" ) }, + { ADD_CAFFEINE, translate_marker( "Strength - 1; Slight sluggishness; Occasional cravings" ) }, { - ADD_ALCOHOL, _( "Perception - 1; Intelligence - 1; Occasional Cravings;\nRisk of delirium tremens" ) + ADD_ALCOHOL, translate_marker( "Perception - 1; Intelligence - 1; Occasional Cravings;\nRisk of delirium tremens" ) }, - { ADD_SLEEP, _( "You may find it difficult to sleep without medication." ) }, + { ADD_SLEEP, translate_marker( "You may find it difficult to sleep without medication." ) }, { - ADD_PKILLER, _( "Strength - 1; Perception - 1; Dexterity - 1;\nDepression and physical pain to some degree. Frequent cravings. Vomiting." ) + ADD_PKILLER, translate_marker( "Strength - 1; Perception - 1; Dexterity - 1;\nDepression and physical pain to some degree. Frequent cravings. Vomiting." ) }, - { ADD_SPEED, _( "Strength - 1; Intelligence - 1;\nMovement rate reduction. Depression. Weak immune system. Frequent cravings." ) }, - { ADD_COKE, _( "Perception - 1; Intelligence - 1; Frequent cravings." ) }, - { ADD_CRACK, _( "Perception - 2; Intelligence - 2; Frequent cravings." ) }, - { ADD_MUTAGEN, _( "You've gotten a taste for mutating and the chemicals that cause it. But you can stop, yeah, any time you want." ) }, + { ADD_SPEED, translate_marker( "Strength - 1; Intelligence - 1;\nMovement rate reduction. Depression. Weak immune system. Frequent cravings." ) }, + { ADD_COKE, translate_marker( "Perception - 1; Intelligence - 1; Frequent cravings." ) }, + { ADD_CRACK, translate_marker( "Perception - 2; Intelligence - 2; Frequent cravings." ) }, + { ADD_MUTAGEN, translate_marker( "You've gotten a taste for mutating and the chemicals that cause it. But you can stop, yeah, any time you want." ) }, { - ADD_DIAZEPAM, _( "Perception - 1; Intelligence - 1;\nAnxiety, nausea, hallucinations, and general malaise." ) + ADD_DIAZEPAM, translate_marker( "Perception - 1; Intelligence - 1;\nAnxiety, nausea, hallucinations, and general malaise." ) }, - { ADD_MARLOSS_R, _( "You should try some of those pink berries." ) }, - { ADD_MARLOSS_B, _( "You should try some of those cyan seeds." ) }, - { ADD_MARLOSS_Y, _( "You should try some of that golden gel." ) }, + { ADD_MARLOSS_R, translate_marker( "You should try some of those pink berries." ) }, + { ADD_MARLOSS_B, translate_marker( "You should try some of those cyan seeds." ) }, + { ADD_MARLOSS_Y, translate_marker( "You should try some of that golden gel." ) }, } }; const auto iter = addiction_msg.find( cur.type ); if( iter != addiction_msg.end() ) { - return iter->second; + return _( iter->second ); } - static const std::string error_string; - return error_string; + return "You crave to report this bug."; } void marloss_add( player &u, int in, const char *msg ) diff --git a/src/addiction.h b/src/addiction.h index b9627ae1ecbb9..6e8f273180349 100644 --- a/src/addiction.h +++ b/src/addiction.h @@ -18,14 +18,14 @@ constexpr int MAX_ADDICTION_LEVEL = 20; // with an optional pre-translated message. void addict_effect( player &u, addiction &add ); -const std::string &addiction_type_name( add_type cur ); +std::string addiction_type_name( add_type cur ); -const std::string &addiction_name( const addiction &cur ); +std::string addiction_name( const addiction &cur ); morale_type addiction_craving( add_type cur ); add_type addiction_type( const std::string &name ); -const std::string &addiction_text( const addiction &cur ); +std::string addiction_text( const addiction &cur ); #endif diff --git a/src/advanced_inv.cpp b/src/advanced_inv.cpp index 0ba28602957af..193199316e9f7 100644 --- a/src/advanced_inv.cpp +++ b/src/advanced_inv.cpp @@ -131,6 +131,7 @@ advanced_inventory::~advanced_inventory() werase( left_window ); werase( right_window ); g->refresh_all(); + g->u.check_item_encumbrance_flag(); } } @@ -354,7 +355,7 @@ void advanced_inventory::print_items( advanced_inventory_pane &pane, bool active bool stolen = false; if( it.has_owner() ) { const faction *item_fac = it.get_owner(); - if( item_fac != g->faction_manager_ptr->get( faction_id( "your_followers" ) ) ) { + if( item_fac != g->u.get_faction() ) { stolen_string = "!"; stolen = true; } diff --git a/src/animation.cpp b/src/animation.cpp index 6a9850c5b64b1..c547918ebf1f1 100644 --- a/src/animation.cpp +++ b/src/animation.cpp @@ -775,3 +775,139 @@ void game::draw_zones( const tripoint &start, const tripoint &end, const tripoin draw_zones_curses( w_terrain, start, end, offset ); } #endif + +#if defined(TILES) +void game::draw_radiation_override( const tripoint &p, const int rad ) +{ + if( use_tiles ) { + tilecontext->init_draw_radiation_override( p, rad ); + } +} +#else +void game::draw_radiation_override( const tripoint &, const int ) +{ +} +#endif + +#if defined(TILES) +void game::draw_terrain_override( const tripoint &p, const ter_id &id ) +{ + if( use_tiles ) { + tilecontext->init_draw_terrain_override( p, id ); + } +} +#else +void game::draw_terrain_override( const tripoint &, const ter_id & ) +{ +} +#endif + +#if defined(TILES) +void game::draw_furniture_override( const tripoint &p, const furn_id &id ) +{ + if( use_tiles ) { + tilecontext->init_draw_furniture_override( p, id ); + } +} +#else +void game::draw_furniture_override( const tripoint &, const furn_id & ) +{ +} +#endif + +#if defined(TILES) +void game::draw_graffiti_override( const tripoint &p, const bool has ) +{ + if( use_tiles ) { + tilecontext->init_draw_graffiti_override( p, has ); + } +} +#else +void game::draw_graffiti_override( const tripoint &, const bool ) +{ +} +#endif + +#if defined(TILES) +void game::draw_trap_override( const tripoint &p, const trap_id &id ) +{ + if( use_tiles ) { + tilecontext->init_draw_trap_override( p, id ); + } +} +#else +void game::draw_trap_override( const tripoint &, const trap_id & ) +{ +} +#endif + +#if defined(TILES) +void game::draw_field_override( const tripoint &p, const field_type_id &id ) +{ + if( use_tiles ) { + tilecontext->init_draw_field_override( p, id ); + } +} +#else +void game::draw_field_override( const tripoint &, const field_type_id & ) +{ +} +#endif + +#if defined(TILES) +void game::draw_item_override( const tripoint &p, const itype_id &id, const mtype_id &mid, + const bool hilite ) +{ + if( use_tiles ) { + tilecontext->init_draw_item_override( p, id, mid, hilite ); + } +} +#else +void game::draw_item_override( const tripoint &, const itype_id &, const mtype_id &, + const bool ) +{ +} +#endif + +#if defined(TILES) +void game::draw_vpart_override( const tripoint &p, const vpart_id &id, const int part_mod, + const int veh_dir, const bool hilite, const point &mount ) +{ + if( use_tiles ) { + tilecontext->init_draw_vpart_override( p, id, part_mod, veh_dir, hilite, mount ); + } +} +#else +void game::draw_vpart_override( const tripoint &, const vpart_id &, const int, + const int, const bool, const point & ) +{ +} +#endif + +#if defined(TILES) +void game::draw_below_override( const tripoint &p, const bool draw ) +{ + if( use_tiles ) { + tilecontext->init_draw_below_override( p, draw ); + } +} +#else +void game::draw_below_override( const tripoint &, const bool ) +{ +} +#endif + +#if defined(TILES) +void game::draw_monster_override( const tripoint &p, const mtype_id &id, const int count, + const bool more, const Creature::Attitude att ) +{ + if( use_tiles ) { + tilecontext->init_draw_monster_override( p, id, count, more, att ); + } +} +#else +void game::draw_monster_override( const tripoint &, const mtype_id &, const int, + const bool, const Creature::Attitude ) +{ +} +#endif diff --git a/src/artifact.cpp b/src/artifact.cpp index 9b871754f55ea..9dc150d4477c0 100644 --- a/src/artifact.cpp +++ b/src/artifact.cpp @@ -234,6 +234,7 @@ struct artifact_armor_form_datum { units::volume volume; units::mass weight; int encumb; + int max_encumb; int coverage; int thickness; int env_resist; @@ -446,9 +447,9 @@ static const std::array artifact_weapon_dat } }; static const std::array artifact_armor_form_data = { { - // Name color Material Vol Wgt Enc Cov Thk Env Wrm Sto Bsh Cut Hit + // Name color Material Vol Wgt Enc MaxEnc Cov Thk Env Wrm Sto Bsh Cut Hit { - translate_marker( "Robe" ), def_c_red, material_id( "wool" ), 1500_ml, 700_gram, 1, 90, 3, 0, 2, 0_ml, -8, 0, -3, + translate_marker( "Robe" ), def_c_red, material_id( "wool" ), 1500_ml, 700_gram, 1, 1, 90, 3, 0, 2, 0_ml, -8, 0, -3, { { bp_torso, bp_leg_l, bp_leg_r } }, false, {{ ARMORMOD_LIGHT, ARMORMOD_BULKY, ARMORMOD_POCKETED, ARMORMOD_FURRED, @@ -458,7 +459,7 @@ static const std::array artifact_arm }, { - translate_marker( "Coat" ), def_c_brown, material_id( "leather" ), 3500_ml, 1600_gram, 2, 80, 2, 1, 4, 1000_ml, -6, 0, -3, + translate_marker( "Coat" ), def_c_brown, material_id( "leather" ), 3500_ml, 1600_gram, 2, 2, 80, 2, 1, 4, 1000_ml, -6, 0, -3, { bp_torso }, false, {{ ARMORMOD_LIGHT, ARMORMOD_POCKETED, ARMORMOD_FURRED, ARMORMOD_PADDED, @@ -468,7 +469,7 @@ static const std::array artifact_arm }, { - translate_marker( "Mask" ), def_c_white, material_id( "wood" ), 1000_ml, 100_gram, 2, 50, 2, 1, 2, 0_ml, 2, 0, -2, + translate_marker( "Mask" ), def_c_white, material_id( "wood" ), 1000_ml, 100_gram, 2, 2, 50, 2, 1, 2, 0_ml, 2, 0, -2, { { bp_eyes, bp_mouth } }, false, {{ ARMORMOD_FURRED, ARMORMOD_FURRED, ARMORMOD_NULL, ARMORMOD_NULL, @@ -477,9 +478,9 @@ static const std::array artifact_arm } }, - // Name color Materials Vol Wgt Enc Cov Thk Env Wrm Sto Bsh Cut Hit + // Name color Materials Vol Wgt Enc MaxEnc Cov Thk Env Wrm Sto Bsh Cut Hit { - translate_marker( "Helm" ), def_c_dark_gray, material_id( "silver" ), 1500_ml, 700_gram, 2, 85, 3, 0, 1, 0_ml, 8, 0, -2, + translate_marker( "Helm" ), def_c_dark_gray, material_id( "silver" ), 1500_ml, 700_gram, 2, 2, 85, 3, 0, 1, 0_ml, 8, 0, -2, { bp_head }, false, {{ ARMORMOD_BULKY, ARMORMOD_FURRED, ARMORMOD_PADDED, ARMORMOD_PLATED, @@ -489,7 +490,7 @@ static const std::array artifact_arm }, { - translate_marker( "Gloves" ), def_c_light_blue, material_id( "leather" ), 500_ml, 100_gram, 1, 90, 3, 1, 2, 0_ml, -4, 0, -2, + translate_marker( "Gloves" ), def_c_light_blue, material_id( "leather" ), 500_ml, 100_gram, 1, 1, 90, 3, 1, 2, 0_ml, -4, 0, -2, { { bp_hand_l, bp_hand_r } }, true, {{ ARMORMOD_BULKY, ARMORMOD_FURRED, ARMORMOD_PADDED, ARMORMOD_PLATED, @@ -498,9 +499,9 @@ static const std::array artifact_arm } }, - // Name color Materials Vol Wgt Enc Cov Thk Env Wrm Sto Bsh Cut Hit + // Name color Materials Vol Wgt Enc MaxEnc Cov Thk Env Wrm Sto Bsh Cut Hit { - translate_marker( "Boots" ), def_c_blue, material_id( "leather" ), 1500_ml, 250_gram, 1, 75, 3, 1, 3, 0_ml, 4, 0, -1, + translate_marker( "Boots" ), def_c_blue, material_id( "leather" ), 1500_ml, 250_gram, 1, 1, 75, 3, 1, 3, 0_ml, 4, 0, -1, { { bp_foot_l, bp_foot_r } }, true, {{ ARMORMOD_LIGHT, ARMORMOD_BULKY, ARMORMOD_PADDED, ARMORMOD_PLATED, @@ -510,7 +511,7 @@ static const std::array artifact_arm }, { - translate_marker( "Ring" ), def_c_light_green, material_id( "silver" ), 0_ml, 4_gram, 0, 0, 0, 0, 0, 0_ml, 0, 0, 0, + translate_marker( "Ring" ), def_c_light_green, material_id( "silver" ), 0_ml, 4_gram, 0, 0, 0, 0, 0, 0, 0_ml, 0, 0, 0, {}, false, {{ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL}} } @@ -523,45 +524,45 @@ static const std::array artifact_arm */ static const std::array artifact_armor_mod_data = { { { - "", def_c_white, material_id( "null" ), 0_ml, 0_gram, 0, 0, 0, 0, 0, 0_ml, 0, 0, 0, {}, false, + "", def_c_white, material_id( "null" ), 0_ml, 0_gram, 0, 0, 0, 0, 0, 0, 0_ml, 0, 0, 0, {}, false, {{ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL}} }, // Description; "It is ..." or "They are ..." { translate_marker( "very thin and light." ), def_c_white, material_id( "null" ), - // Vol Wgt Enc Cov Thk Env Wrm Sto - -1000_ml, -950_gram, -2, -1, -1, -1, -1, 0_ml, 0, 0, 0, {}, false, + // Vol Wgt Enc MaxEnc Cov Thk Env Wrm Sto + -1000_ml, -950_gram, -2, -2, -1, -1, -1, -1, 0_ml, 0, 0, 0, {}, false, {{ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL}} }, { translate_marker( "extremely bulky." ), def_c_white, material_id( "null" ), - 2000_ml, 1150_gram, 2, 1, 1, 0, 1, 0_ml, 0, 0, 0, {}, false, + 2000_ml, 1150_gram, 2, 2, 1, 1, 0, 1, 0_ml, 0, 0, 0, {}, false, {{ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL}} }, { translate_marker( "covered in pockets." ), def_c_white, material_id( "null" ), - 250_ml, 150_gram, 1, 0, 0, 0, 0, 4000_ml, 0, 0, 0, {}, false, + 250_ml, 150_gram, 1, 1, 0, 0, 0, 0, 4000_ml, 0, 0, 0, {}, false, {{ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL}} }, { translate_marker( "disgustingly furry." ), def_c_white, material_id( "wool" ), - // Vol Wgt Enc Dmg Cut Env Wrm Sto - 1000_ml, 250_gram, 1, 1, 1, 1, 3, 0_ml, 0, 0, 0, {}, false, + // Vol Wgt Enc MaxEnc Dmg Cut Env Wrm Sto + 1000_ml, 250_gram, 1, 1, 1, 1, 1, 3, 0_ml, 0, 0, 0, {}, false, {{ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL}} }, { translate_marker( "leather-padded." ), def_c_white, material_id( "leather" ), - 1000_ml, 450_gram, 1, 1, 1, 0, 1, -750_ml, 0, 0, 0, {}, false, + 1000_ml, 450_gram, 1, 1, 1, 1, 0, 1, -750_ml, 0, 0, 0, {}, false, {{ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL}} }, { translate_marker( "plated in iron." ), def_c_white, material_id( "iron" ), - 1000_ml, 1400_gram, 3, 2, 2, 0, 1, -1000_ml, 0, 0, 0, {}, false, + 1000_ml, 1400_gram, 3, 3, 2, 2, 0, 1, -1000_ml, 0, 0, 0, {}, false, {{ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL}} }, } @@ -823,6 +824,7 @@ std::string new_artifact() def.m_to_hit = info.melee_hit; def.armor->covers = info.covers; def.armor->encumber = info.encumb; + def.armor->max_encumber = info.max_encumb; def.armor->coverage = info.coverage; def.armor->thickness = info.thickness; def.armor->env_resist = info.env_resist; @@ -1154,7 +1156,7 @@ void it_artifact_tool::deserialize( JsonObject &jo ) } } volume = jo.get_int( "volume" ) * units::legacy_volume_factor; - weight = units::from_gram( jo.get_int( "weight" ) ); + weight = units::from_gram( jo.get_int( "weight" ) ); melee[DT_BASH] = jo.get_int( "melee_dam" ); melee[DT_CUT] = jo.get_int( "melee_cut" ); m_to_hit = jo.get_int( "m_to_hit" ); @@ -1269,7 +1271,7 @@ void it_artifact_armor::deserialize( JsonObject &jo ) } } volume = jo.get_int( "volume" ) * units::legacy_volume_factor; - weight = units::from_gram( jo.get_int( "weight" ) ); + weight = units::from_gram( jo.get_int( "weight" ) ); melee[DT_BASH] = jo.get_int( "melee_dam" ); melee[DT_CUT] = jo.get_int( "melee_cut" ); m_to_hit = jo.get_int( "m_to_hit" ); @@ -1277,6 +1279,7 @@ void it_artifact_armor::deserialize( JsonObject &jo ) jo.read( "covers", armor->covers ); armor->encumber = jo.get_int( "encumber" ); + armor->max_encumber = jo.get_int( "max_encumber" ); armor->coverage = jo.get_int( "coverage" ); armor->thickness = jo.get_int( "material_thickness" ); armor->env_resist = jo.get_int( "env_resist" ); @@ -1412,6 +1415,7 @@ void it_artifact_armor::serialize( JsonOut &json ) const // armor data json.member( "covers", armor->covers ); json.member( "encumber", armor->encumber ); + json.member( "max_encumber", armor->max_encumber ); json.member( "coverage", armor->coverage ); json.member( "material_thickness", armor->thickness ); json.member( "env_resist", armor->env_resist ); diff --git a/src/assign.h b/src/assign.h index 8e3bd0245b908..a918af6f61c16 100644 --- a/src/assign.h +++ b/src/assign.h @@ -282,11 +282,58 @@ inline bool assign( JsonObject &jo, const std::string &name, units::mass &val, const units::mass lo = units::mass_min, const units::mass hi = units::mass_max ) { - auto tmp = val.value(); - if( !assign( jo, name, tmp, strict, lo.value(), hi.value() ) ) { + const auto parse = [&name]( JsonObject & obj, units::mass & out ) { + if( obj.has_int( name ) ) { + out = units::from_gram( obj.get_int( name ) ); + return true; + } + if( obj.has_string( name ) ) { + + out = read_from_json_string ( *obj.get_raw( name ), units::mass_units ); + return true; + } + return false; + }; + + units::mass out; + + // Object via which to report errors which differs for proportional/relative values + JsonObject err = jo; + + // Do not require strict parsing for relative and proportional values as rules + // such as +10% are well-formed independent of whether they affect base value + if( jo.get_object( "relative" ).has_member( name ) ) { + units::mass tmp; + err = jo.get_object( "relative" ); + if( !parse( err, tmp ) ) { + err.throw_error( "invalid relative value specified", name ); + } + strict = false; + out = val + tmp; + + } else if( jo.get_object( "proportional" ).has_member( name ) ) { + double scalar; + err = jo.get_object( "proportional" ); + if( !err.read( name, scalar ) || scalar <= 0 || scalar == 1 ) { + err.throw_error( "invalid proportional scalar", name ); + } + strict = false; + out = val * scalar; + + } else if( !parse( jo, out ) ) { return false; } - val = units::mass{ tmp, units::mass::unit_type{} }; + + if( out < lo || out > hi ) { + err.throw_error( "value outside supported range", name ); + } + + if( strict && out == val ) { + report_strict_violation( err, "assignment does not update value", name ); + } + + val = out; + return true; } @@ -315,7 +362,7 @@ std::enable_if::type, time_duration>::value, read_with_factor( JsonObject jo, const std::string &name, T &val, const T &factor ) { int tmp; - if( jo.read( name, tmp ) ) { + if( jo.read( name, tmp, false ) ) { // JSON contained a raw number -> apply factor val = tmp * factor; return true; diff --git a/src/auto_note.cpp b/src/auto_note.cpp new file mode 100644 index 0000000000000..ce77f1379b9db --- /dev/null +++ b/src/auto_note.cpp @@ -0,0 +1,382 @@ +#include "auto_note.h" + +#include + +#include "game.h" +#include "json.h" +#include "string_formatter.h" +#include "color.h" +#include "cursesdef.h" +#include "input.h" +#include "options.h" +#include "cata_utility.h" +#include "output.h" +#include "debug.h" +#include "filesystem.h" +#include "translations.h" +#include "avatar.h" +#include "map_extras.h" +#include "generic_factory.h" + +namespace auto_notes +{ +std::string auto_note_settings::build_save_path() const +{ + return g->get_player_base_save_path() + ".ano.json"; +} + +void auto_note_settings::clear() +{ + autoNoteEnabled.clear(); +} + +bool auto_note_settings::save() +{ + if( !file_exist( g->get_player_base_save_path() + ".sav" ) ) { + return true; + } + + return write_to_file( build_save_path(), [&]( std::ostream & fstr ) { + JsonOut jout{ fstr, true }; + + jout.start_object(); + + jout.member( "enabled" ); + + jout.start_array(); + for( const string_id &entry : autoNoteEnabled ) { + jout.write( entry.str() ); + } + jout.end_array(); + + jout.member( "discovered" ); + + jout.start_array(); + for( const string_id &entry : discovered ) { + jout.write( entry.str() ); + } + jout.end_array(); + + jout.end_object(); + + }, _( "auto notes configuration" ) ); +} + +void auto_note_settings::load() +{ + clear(); + + const auto parseJson = [&]( JsonIn & jin ) { + jin.start_object(); + + while( !jin.end_object() ) { + const std::string name = jin.get_member_name(); + + if( name == "enabled" ) { + jin.start_array(); + while( !jin.end_array() ) { + const std::string entry = jin.get_string(); + autoNoteEnabled.insert( string_id {entry} ); + } + } else if( name == "discovered" ) { + jin.start_array(); + while( !jin.end_array() ) { + const std::string entry = jin.get_string(); + discovered.insert( string_id {entry} ); + } + } else { + jin.skip_value(); + } + + } + }; + + if( !read_from_file_optional_json( build_save_path(), parseJson ) ) { + default_initialize(); + save(); + } +} + +void auto_note_settings::default_initialize() +{ + clear(); + + for( auto &extra : MapExtras::mapExtraFactory().get_all() ) { + if( extra.autonote ) { + autoNoteEnabled.insert( extra.id ); + } + } +} + +void auto_note_settings::set_discovered( const string_id &mapExtId ) +{ + discovered.insert( mapExtId ); +} + +bool auto_note_settings::was_discovered( const string_id &mapExtId ) const +{ + return discovered.count( mapExtId ) != 0; +} + +void auto_note_settings::show_gui() +{ + auto_note_manager_gui gui{ }; + gui.show(); + + if( gui.was_changed() ) { + save(); + } +} + +bool auto_note_settings::has_auto_note_enabled( const string_id &mapExtId ) const +{ + return autoNoteEnabled.count( mapExtId ) != 0; +} + +void auto_note_settings::set_auto_note_status( const string_id &mapExtId, + const bool enabled ) +{ + if( enabled ) { + autoNoteEnabled.insert( mapExtId ); + } else if( has_auto_note_enabled( mapExtId ) ) { + autoNoteEnabled.erase( mapExtId ); + } +} + +auto_note_manager_gui::auto_note_manager_gui() +{ + const auto_note_settings &settings = get_auto_notes_settings(); + + for( auto &extra : MapExtras::mapExtraFactory().get_all() ) { + // Ignore all extras that have autonote disabled in the JSON. + // This filters out lots of extras users shouldnt see (like "normal") + if( !extra.autonote ) { + continue; + } + + bool isAutoNoteEnabled = settings.has_auto_note_enabled( extra.id ); + + mapExtraCache.emplace( std::make_pair( extra.id, std::make_pair( extra, + isAutoNoteEnabled ) ) ); + + if( settings.was_discovered( extra.id ) ) { + displayCache.push_back( extra.id ); + } + } +} + +bool auto_note_manager_gui::was_changed() const +{ + return wasChanged; +} + +void auto_note_manager_gui::show() +{ + const int iHeaderHeight = 3; + const int iContentHeight = FULL_SCREEN_HEIGHT - 2 - iHeaderHeight; + + const int iOffsetX = TERMX > FULL_SCREEN_WIDTH ? ( TERMX - FULL_SCREEN_WIDTH ) / 2 : 0; + const int iOffsetY = TERMY > FULL_SCREEN_HEIGHT ? ( TERMY - FULL_SCREEN_HEIGHT ) / 2 : 0; + + catacurses::window w_help = catacurses::newwin( FULL_SCREEN_HEIGHT / 2 + 2, + FULL_SCREEN_WIDTH * 3 / 4, + point( iOffsetX + 19 / 2, 7 + iOffsetY + FULL_SCREEN_HEIGHT / 2 / 2 ) ); + + catacurses::window w_border = catacurses::newwin( FULL_SCREEN_HEIGHT, FULL_SCREEN_WIDTH, + point( iOffsetX, iOffsetY ) ); + + catacurses::window w_header = catacurses::newwin( iHeaderHeight, FULL_SCREEN_WIDTH - 2, + point( 1 + iOffsetX, 1 + iOffsetY ) ); + + catacurses::window w = catacurses::newwin( iContentHeight, FULL_SCREEN_WIDTH - 2, + point( 1 + iOffsetX, iHeaderHeight + 1 + iOffsetY ) ); + + // =========================================================================== + // Perform initial draw. This includes things like the window border that do + // not need to be refreshed more than once. + + // == Draw border + draw_border( w_border, BORDER_COLOR, _( " AUTO NOTES MANAGER " ) ); + mvwputch( w_border, point( 0, 2 ), c_light_gray, LINE_XXXO ); + mvwputch( w_border, point( 79, 2 ), c_light_gray, LINE_XOXX ); + mvwputch( w_border, point( 61, FULL_SCREEN_HEIGHT - 1 ), c_light_gray, LINE_XXOX ); + wrefresh( w_border ); + + // == Draw header + int tmpx = 0; + tmpx += shortcut_print( w_header, point( tmpx, 0 ), c_white, c_light_green, _( "nable" ) ) + 2; + tmpx += shortcut_print( w_header, point( tmpx, 0 ), c_white, c_light_green, _( "isable" ) ) + 2; + // NOLINTNEXTLINE(clang-analyzer-deadcode.DeadStores) + tmpx += shortcut_print( w_header, point( tmpx, 0 ), c_white, c_light_green, + _( " - Toggle" ) ) + 2; + + // Draw horizontal line and corner pieces of the table + for( int x = 0; x < 78; x++ ) { + if( x == 60 ) { + mvwputch( w_header, point( x, 1 ), c_light_gray, LINE_OXXX ); + mvwputch( w_header, point( x, 2 ), c_light_gray, LINE_XOXO ); + } else { + mvwputch( w_header, point( x, 1 ), c_light_gray, LINE_OXOX ); + } + } + + mvwprintz( w_header, point( 1, 2 ), c_white, _( "Map Extra" ) ); + mvwprintz( w_header, point( 62, 2 ), c_white, _( "Enabled" ) ); + + wrefresh( w_header ); + + // =========================================================================== + + // If the display cache contains no entries, the player might not have discovered any of + // the map extras. In this case, we switch to a special state that alerts the user of this + // in order to avoid confusion a completely empty GUI might normally create. + const bool emptyMode = displayCache.empty(); + + int currentLine = 0; + int startPosition = 0; + int endPosition = 0; + + input_context ctx{ "AUTO_NOTES" }; + ctx.register_action( "QUIT" ); + ctx.register_action( "SWITCH_AUTO_NOTE_OPTION" ); + + if( !emptyMode ) { + ctx.register_cardinal(); + ctx.register_action( "CONFIRM" ); + ctx.register_action( "QUIT" ); + ctx.register_action( "ENABLE_MAPEXTRA_NOTE" ); + ctx.register_action( "DISABLE_MAPEXTRA_NOTE" ); + } + + while( true ) { + mvwprintz( w_header, point( 39, 0 ), c_white, _( "Auto notes enabled:" ) ); + + int currentX = 60; + currentX += shortcut_print( w_header, point( currentX, 0 ), + get_option( "AUTO_NOTES" ) ? c_light_green : c_light_red, c_white, + get_option( "AUTO_NOTES" ) ? _( "True" ) : _( "False" ) ); + + currentX += shortcut_print( w_header, point( currentX, 0 ), c_white, c_light_green, " " ); + // NOLINTNEXTLINE(clang-analyzer-deadcode.DeadStores) + currentX += shortcut_print( w_header, point( currentX, 0 ), c_white, c_light_green, + _( "witch " ) ); + + + // Clear table + for( int y = 0; y < iContentHeight; y++ ) { + for( int x = 0; x < 79; x++ ) { + // The middle beam needs special treatment + if( x == 60 ) { + mvwputch( w, point( x, y ), c_light_gray, LINE_XOXO ); + } else { + mvwputch( w, point( x, y ), c_black, ' ' ); + } + } + } + + const int cacheSize = static_cast( displayCache.size() ); + + draw_scrollbar( w_border, currentLine, iContentHeight, cacheSize, point( 0, 4 ) ); + + if( emptyMode ) { + // NOLINTNEXTLINE(cata-use-named-point-constants) + mvwprintz( w, point( 1, 0 ), c_light_gray, + _( "Discover more special encounters to populate this list" ) ); + } else { + calcStartPos( startPosition, currentLine, iContentHeight, displayCache.size() ); + endPosition = startPosition + ( iContentHeight > cacheSize ? cacheSize : iContentHeight ); + + for( int i = startPosition; i < endPosition; ++i ) { + const string_id &displayCacheEntry = displayCache[i]; + const auto &cacheEntry = mapExtraCache[displayCacheEntry]; + + const auto lineColor = ( i == currentLine ) ? hilite( c_white ) : c_white; + const auto statusColor = cacheEntry.second ? c_green : c_red; + const auto statusString = cacheEntry.second ? _( "yes" ) : _( "no" ); + + mvwprintz( w, point( 1, i - startPosition ), lineColor, "" ); + + if( i == currentLine ) { + wprintz( w, c_yellow, ">> " ); + } else { + wprintz( w, c_yellow, " " ); + } + + wprintz( w, lineColor, "%s", cacheEntry.first.name ); + + // Since yes is longer than no, we need to clear the space for the status string before + // displaying the current text. Otherwise artifacts might occur. + mvwprintz( w, point( 64, i - startPosition ), statusColor, " " ); + mvwprintz( w, point( 64, i - startPosition ), statusColor, "%s", statusString ); + } + } + + wrefresh( w_header ); + wrefresh( w_border ); + wrefresh( w ); + + const std::string currentAction = ctx.handle_input(); + + // Actions that also work with no items to display + if( currentAction == "SWITCH_AUTO_NOTE_OPTION" ) { + get_options().get_option( "AUTO_NOTES" ).setNext(); + + if( get_option( "AUTO_NOTES" ) && !get_option( "AUTO_NOTES_MAP_EXTRAS" ) ) { + get_options().get_option( "AUTO_NOTES_MAP_EXTRAS" ).setNext(); + } + + get_options().save(); + } else if( currentAction == "QUIT" ) { + break; + } + + if( emptyMode ) { + continue; + } + + const string_id ¤tItem = displayCache[currentLine]; + std::pair &entry = mapExtraCache[currentItem]; + + if( currentAction == "UP" ) { + if( currentLine > 0 ) { + --currentLine; + } else { + currentLine = cacheSize - 1; + } + } else if( currentAction == "DOWN" ) { + if( currentLine == cacheSize - 1 ) { + currentLine = 0; + } else { + ++currentLine; + } + } else if( currentAction == "ENABLE_MAPEXTRA_NOTE" ) { + entry.second = true; + wasChanged = true; + } else if( currentAction == "DISABLE_MAPEXTRA_NOTE" ) { + entry.second = false; + wasChanged = true; + } else if( currentAction == "CONFIRM" ) { + entry.second = !entry.second; + wasChanged = true; + } + } + + if( !was_changed() ) { + return; + } + + if( query_yn( _( "Save changes?" ) ) ) { + auto_notes::auto_note_settings &settings = get_auto_notes_settings(); + + for( const auto &entry : mapExtraCache ) { + settings.set_auto_note_status( entry.second.first.id, entry.second.second ); + } + } +} +} // namespace auto_notes + +auto_notes::auto_note_settings &get_auto_notes_settings() +{ + static auto_notes::auto_note_settings staticSettings; + return staticSettings; +} diff --git a/src/auto_note.h b/src/auto_note.h new file mode 100644 index 0000000000000..02d077067763b --- /dev/null +++ b/src/auto_note.h @@ -0,0 +1,93 @@ +#pragma once +#ifndef AUTO_NOTE_H +#define AUTO_NOTE_H + +#include +#include +#include +#include +#include + +#include "string_id.h" +#include "map_extras.h" + + +namespace auto_notes +{ +/** + * Class implementing the user interface for the auto note configuration. + */ +class auto_note_manager_gui +{ + public: + auto_note_manager_gui(); + + void show(); + + bool was_changed() const; + + private: + /// The map extra type cache. This is initialized with all known map extra types + /// and their auto note status with every call of initialize(). All changes to this + /// will be applied to the per-character auto notes settings object after the user + /// closes the GUI. + std::unordered_map, std::pair> mapExtraCache; + + /// All map extra types that will be displayed in the GUI. + std::vector> displayCache; + + bool wasChanged{false}; +}; + + +/** + * A class storing auto note settings for all map features for a given player. + * Since auto note is something that is very dependent on in which stage of the game + * a player is (f.e., dead college kids are useful in the early game, but not so much + * in the late game), the settings are only available tied to a specific game save, meaning + * there is no global setting like with the auto-pickup manager. + */ +class auto_note_settings +{ + // Allow private member access to the auto note manager GUI + friend class auto_note_manager_gui; + + public: + bool has_auto_note_enabled( const string_id &mapExtId ) const; + + void set_auto_note_status( const string_id &mapExtId, bool enabled ); + + void set_discovered( const string_id &mapExtId ); + + bool was_discovered( const string_id &mapExtId ) const; + + public: + void load(); + + bool save(); + + void clear(); + + void show_gui(); + + /// Perform default initialization. This will use the auto note property of + /// registered map extras in order to determine their enable status. + void default_initialize(); + + private: + /// Build string containing path to the auto notes save file for the active player. + std::string build_save_path() const; + + private: + /// This set contains the ID strings of all map extras that have auto note enabled. + std::unordered_set> autoNoteEnabled; + + /// This set contains the ID strings of all map extras that were already encountered by the player. + /// This is used in order to avoid spoilers in the GUI. + std::unordered_set> discovered; +}; +} // namespace auto_notes + +auto_notes::auto_note_settings &get_auto_notes_settings(); + +#endif // AUTO_NOTE_H diff --git a/src/avatar.cpp b/src/avatar.cpp index c836bd7e0681a..0600de860179c 100644 --- a/src/avatar.cpp +++ b/src/avatar.cpp @@ -111,226 +111,6 @@ avatar::avatar() grab_type = OBJECT_NONE; } -void avatar::memorial( std::ostream &memorial_file, const std::string &epitaph ) -{ - static const char *eol = cata_files::eol(); - - //Size of indents in the memorial file - const std::string indent = " "; - - const std::string pronoun = male ? _( "He" ) : _( "She" ); - - //Avoid saying "a male unemployed" or similar - std::string profession_name; - if( prof == profession::generic() ) { - if( male ) { - profession_name = _( "an unemployed male" ); - } else { - profession_name = _( "an unemployed female" ); - } - } else { - profession_name = string_format( _( "a %s" ), prof->gender_appropriate_name( male ) ); - } - - const std::string locdesc = overmap_buffer.get_description_at( global_sm_location() ); - //~ First parameter is a pronoun ("He"/"She"), second parameter is a description - // that designates the location relative to its surroundings. - const std::string kill_place = string_format( _( "%1$s was killed in a %2$s." ), - pronoun, locdesc ); - - //Header - memorial_file << string_format( _( "Cataclysm - Dark Days Ahead version %s memorial file" ), - getVersionString() ) << eol; - memorial_file << eol; - memorial_file << string_format( _( "In memory of: %s" ), name ) << eol; - if( epitaph.length() > 0 ) { //Don't record empty epitaphs - //~ The "%s" will be replaced by an epitaph as displayed in the memorial files. Replace the quotation marks as appropriate for your language. - memorial_file << string_format( pgettext( "epitaph", "\"%s\"" ), epitaph ) << eol << eol; - } - //~ First parameter: Pronoun, second parameter: a profession name (with article) - memorial_file << string_format( _( "%1$s was %2$s when the apocalypse began." ), - pronoun, profession_name ) << eol; - memorial_file << string_format( _( "%1$s died on %2$s." ), pronoun, - to_string( time_point( calendar::turn ) ) ) << eol; - memorial_file << kill_place << eol; - memorial_file << eol; - - //Misc - memorial_file << string_format( _( "Cash on hand: %s" ), format_money( cash ) ) << eol; - memorial_file << eol; - - //HP - - const auto limb_hp = - [this, &memorial_file, &indent]( const std::string & desc, const hp_part bp ) { - memorial_file << indent << string_format( desc, get_hp( bp ), get_hp_max( bp ) ) << eol; - }; - - memorial_file << _( "Final HP:" ) << eol; - limb_hp( _( " Head: %d/%d" ), hp_head ); - limb_hp( _( "Torso: %d/%d" ), hp_torso ); - limb_hp( _( "L Arm: %d/%d" ), hp_arm_l ); - limb_hp( _( "R Arm: %d/%d" ), hp_arm_r ); - limb_hp( _( "L Leg: %d/%d" ), hp_leg_l ); - limb_hp( _( "R Leg: %d/%d" ), hp_leg_r ); - memorial_file << eol; - - //Stats - memorial_file << _( "Final Stats:" ) << eol; - memorial_file << indent << string_format( _( "Str %d" ), str_cur ) - << indent << string_format( _( "Dex %d" ), dex_cur ) - << indent << string_format( _( "Int %d" ), int_cur ) - << indent << string_format( _( "Per %d" ), per_cur ) << eol; - memorial_file << _( "Base Stats:" ) << eol; - memorial_file << indent << string_format( _( "Str %d" ), str_max ) - << indent << string_format( _( "Dex %d" ), dex_max ) - << indent << string_format( _( "Int %d" ), int_max ) - << indent << string_format( _( "Per %d" ), per_max ) << eol; - memorial_file << eol; - - //Last 20 messages - memorial_file << _( "Final Messages:" ) << eol; - std::vector > recent_messages = Messages::recent_messages( 20 ); - for( const std::pair &recent_message : recent_messages ) { - memorial_file << indent << recent_message.first << " " << recent_message.second; - memorial_file << eol; - } - memorial_file << eol; - - //Kill list - memorial_file << _( "Kills:" ) << eol; - - int total_kills = 0; - - std::map, int> kill_counts; - - // map to kill count - const kill_tracker &kills = g->get_kill_tracker(); - for( const mtype &type : MonsterGenerator::generator().get_all_mtypes() ) { - int this_count = kills.kill_count( type.id ); - if( this_count > 0 ) { - kill_counts[std::make_tuple( type.nname(), type.sym )] += this_count; - total_kills += this_count; - } - } - - for( const std::pair, int> &entry : kill_counts ) { - memorial_file << " " << std::get<1>( entry.first ) << " - " - << string_format( "%4d", entry.second ) << " " - << std::get<0>( entry.first ) << eol; - } - - if( total_kills == 0 ) { - memorial_file << indent << _( "No monsters were killed." ) << eol; - } else { - memorial_file << string_format( _( "Total kills: %d" ), total_kills ) << eol; - } - memorial_file << eol; - - //Skills - memorial_file << _( "Skills:" ) << eol; - for( const std::pair &pair : *_skills ) { - const SkillLevel &lobj = pair.second; - //~ 1. skill name, 2. skill level, 3. exercise percentage to next level - memorial_file << indent << string_format( _( "%s: %d (%d %%)" ), pair.first->name(), lobj.level(), - lobj.exercise() ) << eol; - } - memorial_file << eol; - - //Traits - memorial_file << _( "Traits:" ) << eol; - for( const std::pair &iter : my_mutations ) { - memorial_file << indent << mutation_branch::get_name( iter.first ) << eol; - } - if( !my_mutations.empty() ) { - memorial_file << indent << _( "(None)" ) << eol; - } - memorial_file << eol; - - //Effects (illnesses) - memorial_file << _( "Ongoing Effects:" ) << eol; - bool had_effect = false; - if( get_perceived_pain() > 0 ) { - had_effect = true; - memorial_file << indent << _( "Pain" ) << " (" << get_perceived_pain() << ")"; - } - if( !had_effect ) { - memorial_file << indent << _( "(None)" ) << eol; - } - memorial_file << eol; - - //Bionics - memorial_file << _( "Bionics:" ) << eol; - int total_bionics = 0; - for( size_t i = 0; i < my_bionics->size(); ++i ) { - memorial_file << indent << i + 1 << ": " << ( *my_bionics )[i].id->name << eol; - total_bionics++; - } - if( total_bionics == 0 ) { - memorial_file << indent << _( "No bionics were installed." ) << eol; - } else { - memorial_file << string_format( _( "Total bionics: %d" ), total_bionics ) << eol; - } - memorial_file << string_format( - _( "Bionic Power: %d/%d" ), power_level, - max_power_level ) << eol; - memorial_file << eol; - - //Equipment - memorial_file << _( "Weapon:" ) << eol; - memorial_file << indent << weapon.invlet << " - " << weapon.tname( 1, false ) << eol; - memorial_file << eol; - - memorial_file << _( "Equipment:" ) << eol; - for( const item &elem : worn ) { - item next_item = elem; - memorial_file << indent << next_item.invlet << " - " << next_item.tname( 1, false ); - if( next_item.charges > 0 ) { - memorial_file << " (" << next_item.charges << ")"; - } else if( next_item.contents.size() == 1 && next_item.contents.front().charges > 0 ) { - memorial_file << " (" << next_item.contents.front().charges << ")"; - } - memorial_file << eol; - } - memorial_file << eol; - - //Inventory - memorial_file << _( "Inventory:" ) << eol; - inv.restack( *this ); - invslice slice = inv.slice(); - for( const std::list *elem : slice ) { - const item &next_item = elem->front(); - memorial_file << indent << next_item.invlet << " - " << - next_item.tname( static_cast( elem->size() ), false ); - if( elem->size() > 1 ) { - memorial_file << " [" << elem->size() << "]"; - } - if( next_item.charges > 0 ) { - memorial_file << " (" << next_item.charges << ")"; - } else if( next_item.contents.size() == 1 && next_item.contents.front().charges > 0 ) { - memorial_file << " (" << next_item.contents.front().charges << ")"; - } - memorial_file << eol; - } - memorial_file << eol; - - //Lifetime stats - memorial_file << _( "Lifetime Stats" ) << eol; - memorial_file << indent << string_format( _( "Distance walked: %d squares" ), - lifetime_stats.squares_walked ) << eol; - memorial_file << indent << string_format( _( "Damage taken: %d damage" ), - lifetime_stats.damage_taken ) << eol; - memorial_file << indent << string_format( _( "Damage healed: %d damage" ), - lifetime_stats.damage_healed ) << eol; - memorial_file << indent << string_format( _( "Headshots: %d" ), - lifetime_stats.headshots ) << eol; - memorial_file << eol; - - //History - memorial_file << _( "Game History" ) << eol; - memorial_file << dump_memorial(); -} - void avatar::toggle_map_memory() { show_map_memory = !show_map_memory; @@ -1003,15 +783,11 @@ void avatar::do_read( item &book ) std::string skill_name = skill.obj().name(); if( skill_level != originalSkillLevel ) { + g->events().send( + learner->getID(), skill, skill_level.level() ); if( learner->is_player() ) { add_msg( m_good, _( "You increase %s to level %d." ), skill.obj().name(), originalSkillLevel + 1 ); - if( skill_level.level() % 4 == 0 ) { - //~ %s is skill name. %d is skill level - add_memorial_log( pgettext( "memorial_male", "Reached skill level %1$d in %2$s." ), - pgettext( "memorial_female", "Reached skill level %1$d in %2$s." ), - skill_level.level(), skill_name ); - } } else { add_msg( m_good, _( "%s increases their %s level." ), learner->disp_name(), skill_name ); } @@ -1567,3 +1343,8 @@ void avatar::upgrade_stat_prompt( const Character::stat &stat ) } } } + +faction *avatar::get_faction() const +{ + return g->faction_manager_ptr->get( faction_id( "your_followers" ) ); +} diff --git a/src/avatar.h b/src/avatar.h index fcbd5e88e58e5..462bd1a7ffb1d 100644 --- a/src/avatar.h +++ b/src/avatar.h @@ -55,9 +55,6 @@ class avatar : public player return this; } - /** Prints out the player's memorial file */ - void memorial( std::ostream &memorial_file, const std::string &epitaph ); - void toggle_map_memory(); bool should_show_map_memory(); /** Memorizes a given tile in tiles mode; finalize_tile_memory needs to be called after it */ @@ -163,6 +160,9 @@ class avatar : public player int free_upgrade_points() const; // how much "kill xp" you have int kill_xp() const; + + faction *get_faction() const override; + private: map_memory player_map_memory; bool show_map_memory; diff --git a/src/avatar_action.cpp b/src/avatar_action.cpp index 0cd8245417009..e6a659ee0a572 100644 --- a/src/avatar_action.cpp +++ b/src/avatar_action.cpp @@ -58,6 +58,7 @@ static const efftype_id effect_onfire( "onfire" ); static const efftype_id effect_pet( "pet" ); static const efftype_id effect_relax_gas( "relax_gas" ); static const efftype_id effect_stunned( "stunned" ); +static const efftype_id effect_ridden( "ridden" ); static const efftype_id effect_harnessed( "harnessed" ); static const fault_id fault_gun_clogged( "fault_gun_clogged" ); @@ -262,7 +263,8 @@ bool avatar_action::move( avatar &you, map &m, int dx, int dy, int dz ) } g->draw_hit_mon( dest_loc, critter, critter.is_dead() ); return false; - } else if( critter.has_flag( MF_IMMOBILE ) || critter.has_effect( effect_harnessed ) ) { + } else if( critter.has_flag( MF_IMMOBILE ) || critter.has_effect( effect_harnessed ) || + critter.has_effect( effect_ridden ) ) { add_msg( m_info, _( "You can't displace your %s." ), critter.name() ); return false; } diff --git a/src/ballistics.cpp b/src/ballistics.cpp index e73e0b6ec86ca..0902e6b563a40 100644 --- a/src/ballistics.cpp +++ b/src/ballistics.cpp @@ -278,7 +278,7 @@ dealt_projectile_attack projectile_attack( const projectile &proj_arg, const tri trajectory.insert( trajectory.begin(), source ); // Add the first point to the trajectory - static emit_id muzzle_smoke( "emit_smoke_plume" ); + static emit_id muzzle_smoke( "emit_smaller_smoke_plume" ); if( proj_effects.count( "MUZZLE_SMOKE" ) ) { g->m.emit_field( trajectory.front(), muzzle_smoke ); } diff --git a/src/basecamp.cpp b/src/basecamp.cpp index 1dc541b226384..bf6e047382513 100644 --- a/src/basecamp.cpp +++ b/src/basecamp.cpp @@ -566,7 +566,7 @@ void basecamp::form_crafting_inventory( map &target_map ) { _inv.clear(); const tripoint &origin = target_map.getlocal( get_dumping_spot() ); - _inv.form_from_map( target_map, origin, range, false, false ); + _inv.form_from_map( target_map, origin, range, nullptr, false, false ); /* * something of a hack: add the resources we know the camp has * the hacky part is that we're adding resources based on the camp's flags, which were diff --git a/src/bionics.cpp b/src/bionics.cpp index 056a871b2ae90..3faa1db2a1ec3 100644 --- a/src/bionics.cpp +++ b/src/bionics.cpp @@ -13,10 +13,12 @@ #include "action.h" #include "avatar.h" #include "avatar_action.h" +#include "assign.h" #include "ballistics.h" #include "cata_utility.h" #include "debug.h" #include "effect.h" +#include "event_bus.h" #include "explosion.h" #include "field.h" #include "game.h" @@ -32,6 +34,7 @@ #include "options.h" #include "output.h" #include "overmapbuffer.h" +#include "memorial_logger.h" #include "npc.h" #include "player.h" #include "projectile.h" @@ -384,47 +387,47 @@ bool player::activate_bionic( int b, bool eff_only ) mod_moves( -100 ); } else if( bio.id == "bio_blood_anal" ) { static const std::map bad_effects = {{ - { effect_fungus, _( "Fungal Infection" ) }, - { effect_dermatik, _( "Insect Parasite" ) }, - { effect_stung, _( "Stung" ) }, - { effect_poison, _( "Poison" ) }, + { effect_fungus, translate_marker( "Fungal Infection" ) }, + { effect_dermatik, translate_marker( "Insect Parasite" ) }, + { effect_stung, translate_marker( "Stung" ) }, + { effect_poison, translate_marker( "Poison" ) }, // Those may be good for the player, but the scanner doesn't like them - { effect_drunk, _( "Alcohol" ) }, - { effect_cig, _( "Nicotine" ) }, - { effect_meth, _( "Methamphetamines" ) }, - { effect_high, _( "Intoxicant: Other" ) }, - { effect_weed_high, _( "THC Intoxication" ) }, + { effect_drunk, translate_marker( "Alcohol" ) }, + { effect_cig, translate_marker( "Nicotine" ) }, + { effect_meth, translate_marker( "Methamphetamines" ) }, + { effect_high, translate_marker( "Intoxicant: Other" ) }, + { effect_weed_high, translate_marker( "THC Intoxication" ) }, // This little guy is immune to the blood filter though, as he lives in your bowels. - { effect_tapeworm, _( "Intestinal Parasite" ) }, - { effect_bloodworms, _( "Hemolytic Parasites" ) }, + { effect_tapeworm, translate_marker( "Intestinal Parasite" ) }, + { effect_bloodworms, translate_marker( "Hemolytic Parasites" ) }, // These little guys are immune to the blood filter too, as they live in your brain. - { effect_brainworms, _( "Intracranial Parasites" ) }, + { effect_brainworms, translate_marker( "Intracranial Parasites" ) }, // These little guys are immune to the blood filter too, as they live in your muscles. - { effect_paincysts, _( "Intramuscular Parasites" ) }, + { effect_paincysts, translate_marker( "Intramuscular Parasites" ) }, // Tetanus infection. - { effect_tetanus, _( "Clostridium Tetani Infection" ) }, - { effect_datura, _( "Anticholinergic Tropane Alkaloids" ) }, + { effect_tetanus, translate_marker( "Clostridium Tetani Infection" ) }, + { effect_datura, translate_marker( "Anticholinergic Tropane Alkaloids" ) }, // TODO: Hallucinations not inducted by chemistry - { effect_hallu, _( "Hallucinations" ) }, - { effect_visuals, _( "Hallucinations" ) }, + { effect_hallu, translate_marker( "Hallucinations" ) }, + { effect_visuals, translate_marker( "Hallucinations" ) }, } }; static const std::map good_effects = {{ - { effect_pkill1, _( "Minor Painkiller" ) }, - { effect_pkill2, _( "Moderate Painkiller" ) }, - { effect_pkill3, _( "Heavy Painkiller" ) }, - { effect_pkill_l, _( "Slow-Release Painkiller" ) }, - - { effect_pblue, _( "Prussian Blue" ) }, - { effect_iodine, _( "Potassium Iodide" ) }, - - { effect_took_xanax, _( "Xanax" ) }, - { effect_took_prozac, _( "Prozac" ) }, - { effect_took_flumed, _( "Antihistamines" ) }, - { effect_adrenaline, _( "Adrenaline Spike" ) }, + { effect_pkill1, translate_marker( "Minor Painkiller" ) }, + { effect_pkill2, translate_marker( "Moderate Painkiller" ) }, + { effect_pkill3, translate_marker( "Heavy Painkiller" ) }, + { effect_pkill_l, translate_marker( "Slow-Release Painkiller" ) }, + + { effect_pblue, translate_marker( "Prussian Blue" ) }, + { effect_iodine, translate_marker( "Potassium Iodide" ) }, + + { effect_took_xanax, translate_marker( "Xanax" ) }, + { effect_took_prozac, translate_marker( "Prozac" ) }, + { effect_took_flumed, translate_marker( "Antihistamines" ) }, + { effect_adrenaline, translate_marker( "Adrenaline Spike" ) }, // Should this be described like that? Does the bionic know what is this? - { effect_adrenaline_mycus, _( "Mycal Spike" ) }, + { effect_adrenaline_mycus, translate_marker( "Mycal Spike" ) }, } }; @@ -438,13 +441,13 @@ bool player::activate_bionic( int b, bool eff_only ) // TODO: Expose the player's effects to check it in a cleaner way for( const auto &pr : bad_effects ) { if( has_effect( pr.first ) ) { - bad.push_back( pr.second ); + bad.push_back( _( pr.second ) ); } } for( const auto &pr : good_effects ) { if( has_effect( pr.first ) ) { - good.push_back( pr.second ); + good.push_back( _( pr.second ) ); } } @@ -678,28 +681,49 @@ bool player::activate_bionic( int b, bool eff_only ) reactor_plut = 0; } } else if( bio.id == "bio_cable" ) { - bool has_cable = has_item_with( []( const item & it ) { - return it.active && it.has_flag( "CABLE_SPOOL" ); - } ); - bool has_connected_cable = has_item_with( []( const item & it ) { - return it.active && it.has_flag( "CABLE_SPOOL" ) && it.get_var( "state" ) == "solar_pack_link"; + std::vector cables = items_with( []( const item & it ) { + return it.has_flag( "CABLE_SPOOL" ); } ); - + bool has_cable = !cables.empty(); + bool free_cable = false; if( !has_cable ) { add_msg_if_player( m_info, - _( "You need a jumper cable connected to a vehicle to drain power from it." ) ); - } - if( is_wearing( "solarpack_on" ) || is_wearing( "q_solarpack_on" ) ) { - if( has_connected_cable ) { - add_msg_if_player( m_info, _( "Your plugged-in solar pack is now able to charge" - " your system." ) ); - } else { - add_msg_if_player( m_info, _( "You need to connect the cable to yourself and the solar pack" - " before your solar pack can charge your system." ) ); + _( "You need a jumper cable connected to a power source to drain power from it." ) ); + } else { + for( item *cable : cables ) { + const std::string state = cable->get_var( "state" ); + if( state == "cable_charger" ) { + add_msg_if_player( m_info, + _( "Cable is plugged-in to the CBM but it has to be also connected to the power source." ) ); + } + if( state == "cable_charger_link" ) { + add_msg_if_player( m_info, + _( "You are plugged to the vehicle. It will charge you if it has some juice in it." ) ); + } + if( state == "solar_pack_link" ) { + add_msg_if_player( m_info, + _( "You are plugged to a solar pack. It will charge you if it's unfolded and in sunlight." ) ); + } + if( state == "UPS_link" ) { + add_msg_if_player( m_info, + _( "You are plugged to a UPS. It will charge you if it has some juice in it." ) ); + } + if( state == "solar_pack" || state == "UPS" ) { + add_msg_if_player( m_info, + _( "You have a cable plugged to a portable power source, but you need to plug it in to the CBM." ) ); + } + if( state == "pay_oyt_cable" ) { + add_msg_if_player( m_info, + _( "You have a cable plugged to a vehicle, but you need to plug it in to the CBM." ) ); + } + if( state == "attach_first" ) { + free_cable = true; + } } - } else if( is_wearing( "solarpack" ) || is_wearing( "q_solarpack" ) ) { - add_msg_if_player( m_info, _( "You might plug in your solar pack to the cable charging" - " system, if you unfold it." ) ); + } + if( free_cable ) { + add_msg_if_player( m_info, + _( "You have at least one free cable in your inventory that you could use to plug yourself in." ) ); } } @@ -981,6 +1005,30 @@ void player::process_bionic( int b ) for( const item *cable : cables ) { const cata::optional target = cable->get_cable_target( this, pos() ); if( !target ) { + if( g->m.is_outside( pos() ) && !is_night( calendar::turn ) && + cable->get_var( "state" ) == "solar_pack_link" ) { + double modifier = g->natural_light_level( pos().z ) / default_daylight_level(); + // basic solar panel produces 50W = 1 charge/20_seconds = 180 charges/hour(3600) + if( is_wearing( "solarpack_on" ) && x_in_y( 180 * modifier, 3600 ) ) { + charge_power( 1 ); + } + // quantum solar backpack = solar panel x6 + if( is_wearing( "q_solarpack_on" ) && x_in_y( 6 * 180 * modifier, 3600 ) ) { + charge_power( 1 ); + } + } + if( cable->get_var( "state" ) == "UPS_link" ) { + static const item_filter used_ups = [&]( const item & itm ) { + return itm.get_var( "cable" ) == "plugged_in"; + }; + if( has_charges( "UPS_off", 1, used_ups ) ) { + use_charges( "UPS_off", 1, used_ups ); + charge_power( 1 ); + } else if( has_charges( "adv_UPS_off", 1, used_ups ) ) { + use_charges( "adv_UPS_off", roll_remainder( 0.6 ), used_ups ); + charge_power( 1 ); + } + } continue; } const optional_vpart_position vp = g->m.veh_at( *target ); @@ -1395,12 +1443,7 @@ void player::perform_uninstall( bionic_id bid, int difficulty, int success, int int pl_skill ) { if( success > 0 ) { - - if( is_player() ) { - add_memorial_log( pgettext( "memorial_male", "Removed bionic: %s." ), - pgettext( "memorial_female", "Removed bionic: %s." ), - bid.obj().name ); - } + g->events().send( getID(), bid ); // until bionics can be flagged as non-removable add_msg_player_or_npc( m_neutral, _( "Your parts are jiggled back into their familiar places." ), @@ -1421,12 +1464,7 @@ void player::perform_uninstall( bionic_id bid, int difficulty, int success, int cbm.faults.emplace( fault_id( "fault_bionic_salvaged" ) ); g->m.add_item( pos(), cbm ); } else { - if( is_player() ) { - add_memorial_log( pgettext( "memorial_male", "Failed to remove bionic: %s." ), - pgettext( "memorial_female", "Failed to remove bionic: %s." ), - bid.obj().name ); - } - + g->events().send( getID(), bid ); // for chance_of_success calculation, shift skill down to a float between ~0.4 - 30 float adjusted_skill = static_cast( pl_skill ) - std::min( static_cast( 40 ), static_cast( pl_skill ) - static_cast( pl_skill ) / static_cast @@ -1665,12 +1703,7 @@ void player::perform_install( bionic_id bid, bionic_id upbid, int difficulty, in std::vector trait_to_rem, tripoint patient_pos ) { if( success > 0 ) { - - if( is_player() ) { - add_memorial_log( pgettext( "memorial_male", "Installed bionic: %s." ), - pgettext( "memorial_female", "Installed bionic: %s." ), - bid.obj().name ); - } + g->events().send( getID(), bid ); if( upbid != bionic_id( "" ) ) { remove_bionic( upbid ); //~ %1$s - name of the bionic to be upgraded (inferior), %2$s - name of the upgraded bionic (superior). @@ -1690,11 +1723,7 @@ void player::perform_install( bionic_id bid, bionic_id upbid, int difficulty, in } } else { - if( is_player() ) { - add_memorial_log( pgettext( "memorial_male", "Failed install of bionic: %s." ), - pgettext( "memorial_female", "Failed install of bionic: %s." ), - bid.obj().name ); - } + g->events().send( getID(), bid ); // for chance_of_success calculation, shift skill down to a float between ~0.4 - 30 float adjusted_skill = static_cast( pl_skill ) - std::min( static_cast( 40 ), @@ -1775,20 +1804,17 @@ void player::bionics_install_failure( bionic_id bid, std::string installer, int add_msg( m_bad, _( "%s lose power capacity!" ), disp_name() ); max_power_level = rng( 0, max_power_level - 25 ); if( is_player() ) { - add_memorial_log( pgettext( "memorial_male", "Lost %d units of power capacity." ), - pgettext( "memorial_female", "Lost %d units of power capacity." ), - old_power - max_power_level ); + g->memorial().add( + pgettext( "memorial_male", "Lost %d units of power capacity." ), + pgettext( "memorial_female", "Lost %d units of power capacity." ), + old_power - max_power_level ); } } // TODO: What if we can't lose power capacity? No penalty? } else { const bionic_id &id = random_entry( valid ); add_bionic( id ); - if( is_player() ) { - add_memorial_log( pgettext( "memorial_male", "Installed bad bionic: %s." ), - pgettext( "memorial_female", "Installed bad bionic: %s." ), - bionics[ id ].name ); - } + g->events().send( getID(), id ); } } break; @@ -2065,11 +2091,7 @@ void load_bionic( JsonObject &jsobj ) new_bionic.weight_capacity_modifier = jsobj.get_float( "weight_capacity_modifier", 1.0 ); - if( jsobj.has_string( "weight_capacity_bonus" ) ) { - new_bionic.weight_capacity_bonus = read_from_json_string - ( *jsobj.get_raw( "weight_capacity_bonus" ), units::mass_units ); - } - + assign( jsobj, "weight_capacity_bonus", new_bionic.weight_capacity_bonus, false, 0_gram ); jsobj.read( "canceled_mutations", new_bionic.canceled_mutations ); jsobj.read( "included_bionics", new_bionic.included_bionics ); diff --git a/src/bodypart.cpp b/src/bodypart.cpp index 21d37963705ac..fcc77a0527440 100644 --- a/src/bodypart.cpp +++ b/src/bodypart.cpp @@ -48,6 +48,25 @@ std::string enum_to_string( side data ) abort(); } +template<> +std::string enum_to_string( hp_part data ) +{ + switch( data ) { + // *INDENT-OFF* + case hp_part::hp_head: return "head"; + case hp_part::hp_torso: return "torso"; + case hp_part::hp_arm_l: return "arm_l"; + case hp_part::hp_arm_r: return "arm_r"; + case hp_part::hp_leg_l: return "leg_l"; + case hp_part::hp_leg_r: return "leg_r"; + // *INDENT-ON* + case hp_part::num_hp_parts: + break; + } + debugmsg( "Invalid hp_part" ); + abort(); +} + } // namespace io namespace diff --git a/src/calendar.cpp b/src/calendar.cpp index cc70366e5746d..11eda61ad3009 100644 --- a/src/calendar.cpp +++ b/src/calendar.cpp @@ -109,6 +109,17 @@ time_point sunset( const time_point &p ) return midnight + time_duration::from_minutes( static_cast( time * 60 ) ); } +time_point night_time( const time_point &p ) +{ + return sunset( p ) + twilight_duration; +} + +time_point daylight_time( const time_point &p ) +{ + // @TODO Actual dailight should start 18 degrees before sunrise + return sunrise( p ) + 15_minutes; +} + bool is_night( const time_point &p ) { const time_duration now = time_past_midnight( p ); @@ -162,7 +173,7 @@ double current_daylight_level( const time_point &p ) return modifier * default_daylight_level(); } -float sunlight( const time_point &p ) +float sunlight( const time_point &p, const bool vision ) { const time_duration now = time_past_midnight( p ); const time_duration sunrise = time_past_midnight( ::sunrise( p ) ); @@ -175,7 +186,8 @@ float sunlight( const time_point &p ) current_phase = static_cast( MOON_PHASE_MAX ) - current_phase; } - const int moonlight = 1 + static_cast( current_phase * moonlight_per_quarter ); + const int moonlight = vision ? 1 + static_cast( current_phase * moonlight_per_quarter ) : + 0; if( now > sunset + twilight_duration || now < sunrise ) { // Night return moonlight; diff --git a/src/calendar.h b/src/calendar.h index a38bce3898ab4..9421397f1a870 100644 --- a/src/calendar.h +++ b/src/calendar.h @@ -536,6 +536,10 @@ moon_phase get_moon_phase( const time_point &p ); time_point sunrise( const time_point &p ); /** Returns the current sunset time based on the time of year. */ time_point sunset( const time_point &p ); +/** Returns the time it gets light based on sunrise */ +time_point daylight_time( const time_point &p ); +/** Returns the time it gets dark based on sunset */ +time_point night_time( const time_point &p ); /** Returns whether it's currently after sunset + TWILIGHT_SECONDS or before sunrise - TWILIGHT_SECONDS. */ bool is_night( const time_point &p ); /** Returns true if it's currently after sunset and before sunset + TWILIGHT_SECONDS. */ @@ -546,8 +550,11 @@ bool is_sunrise_now( const time_point &p ); double current_daylight_level( const time_point &p ); /** How much light is provided in full daylight */ double default_daylight_level(); -/** Returns the current sunlight or moonlight level through the preceding functions. */ -float sunlight( const time_point &p ); +/** Returns the current sunlight or moonlight level through the preceding functions. + * By default, returns sunlight level for vision, with moonlight providing a measurable amount + * of light. with vision == false, returns sunlight for solar panel purposes, and moonlight + * provides 0 light */ +float sunlight( const time_point &p, bool vision = true ); enum class weekdays : int { SUNDAY = 0, diff --git a/src/cata_tiles.cpp b/src/cata_tiles.cpp index 2e1bd70693e62..19902cd89a402 100644 --- a/src/cata_tiles.cpp +++ b/src/cata_tiles.cpp @@ -53,7 +53,6 @@ #include "calendar.h" #include "character.h" #include "color.h" -#include "creature.h" #include "cursesdef.h" #include "int_id.h" #include "map_memory.h" @@ -978,12 +977,29 @@ void tileset_loader::load_tile_spritelists( JsonObject &entry, struct tile_render_info { const tripoint pos; int height_3d = 0; // accumulator for 3d tallness of sprites rendered here so far - tile_render_info( const tripoint &pos, int height_3d ) : pos( pos ), height_3d( height_3d ) { + bool invisible[5]; + tile_render_info( const tripoint &pos, const int height_3d, const bool ( &invisible )[5] ) + : pos( pos ), height_3d( height_3d ) { + std::copy( invisible, invisible + 5, this->invisible ); } }; -void cata_tiles::draw( int destx, int desty, const tripoint ¢er, int width, int height, - std::multimap &overlay_strings, color_block_overlay_container &color_blocks ) +static int divide_round_down( int a, int b ) +{ + if( b < 0 ) { + a = -a; + b = -b; + } + if( a >= 0 ) { + return a / b; + } else { + return -( ( -a + b - 1 ) / b ); + } +} + +void cata_tiles::draw( const point &dest, const tripoint ¢er, int width, int height, + std::multimap &overlay_strings, + color_block_overlay_container &color_blocks ) { if( !g ) { return; @@ -998,7 +1014,7 @@ void cata_tiles::draw( int destx, int desty, const tripoint ¢er, int width, { //set clipping to prevent drawing over stuff we shouldn't - SDL_Rect clipRect = {destx, desty, width, height}; + SDL_Rect clipRect = {dest.x, dest.y, width, height}; printErrorIf( SDL_RenderSetClipRect( renderer.get(), &clipRect ) != 0, "SDL_RenderSetClipRect failed" ); @@ -1006,8 +1022,6 @@ void cata_tiles::draw( int destx, int desty, const tripoint ¢er, int width, render_fill_rect( renderer, clipRect, 0, 0, 0 ); } - const point pos = center.xy(); - int sx = 0; int sy = 0; get_window_tile_counts( width, height, sx, sy ); @@ -1018,9 +1032,9 @@ void cata_tiles::draw( int destx, int desty, const tripoint ¢er, int width, const bool iso_mode = tile_iso; - o = iso_mode ? pos : pos - point( POSX, POSY ); + o = iso_mode ? center.xy() : center.xy() - point( POSX, POSY ); - op = point( destx, desty ); + op = dest; // Rounding up to include incomplete tiles at the bottom/right edges screentile_width = divide_round_up( width, tile_width ); screentile_height = divide_round_up( height, tile_height ); @@ -1036,11 +1050,7 @@ void cata_tiles::draw( int destx, int desty, const tripoint ¢er, int width, const int max_visible_x = ( g->u.posx() % SEEX ) + ( MAPSIZE - 1 ) * SEEX; const int max_visible_y = ( g->u.posy() % SEEY ) + ( MAPSIZE - 1 ) * SEEY; - tripoint temp; - temp.z = center.z; - int &x = temp.x; - int &y = temp.y; - auto &ch = g->m.access_cache( temp.z ); + const auto &ch = g->m.access_cache( center.z ); //set up a default tile for the edges outside the render area visibility_type offscreen_type = VIS_DARK; @@ -1063,55 +1073,71 @@ void cata_tiles::draw( int destx, int desty, const tripoint ¢er, int width, } } + static const point neighborhood[4] = { + point_south, point_east, point_west, point_north + }; for( int row = min_row; row < max_row; row ++ ) { std::vector draw_points; draw_points.reserve( max_col ); for( int col = min_col; col < max_col; col ++ ) { + int temp_x, temp_y; if( iso_mode ) { //in isometric, rows and columns represent a checkerboard screen space, and we place //the appropriate tile in valid squares by getting position relative to the screen center. - if( modulo( row + o.y, 2 ) != modulo( col + o.x, 2 ) ) { + if( modulo( row - sy / 2, 2 ) != modulo( col - sx / 2, 2 ) ) { continue; } - x = ( col - row - sx / 2 + sy / 2 ) / 2 + o.x; - y = ( row + col - sy / 2 - sx / 2 ) / 2 + o.y; + temp_x = divide_round_down( col - row - sx / 2 + sy / 2, 2 ) + o.x; + temp_y = divide_round_down( row + col - sy / 2 - sx / 2, 2 ) + o.y; } else { - x = col + o.x; - y = row + o.y; + temp_x = col + o.x; + temp_y = row + o.y; } + const tripoint pos( temp_x, temp_y, center.z ); + const int &x = pos.x; + const int &y = pos.y; + + bool invisible[5]; // invisible to normal eyes + invisible[0] = false; + if( y < min_visible_y || y > max_visible_y || x < min_visible_x || x > max_visible_x ) { - int height_3d = 0; - if( !draw_terrain_from_memory( tripoint( x, y, center.z ), height_3d ) ) { - apply_vision_effects( temp, offscreen_type ); + if( has_draw_override( pos ) || has_memory_at( pos ) ) { + invisible[0] = true; + } else { + apply_vision_effects( pos, offscreen_type ); + continue; } - continue; } // Add scent value to the overlay_strings list for every visible tile when displaying scent - if( g->displaying_scent ) { - const int scent_value = g->scent.get( {x, y, center.z} ); + if( g->displaying_scent && !invisible[0] ) { + const int scent_value = g->scent.get( pos ); if( scent_value > 0 ) { - overlay_strings.emplace( player_to_screen( x, y ) + point( tile_width / 2, 0 ), + overlay_strings.emplace( player_to_screen( point( x, y ) ) + point( tile_width / 2, 0 ), formatted_text( std::to_string( scent_value ), 8 + catacurses::yellow, NORTH ) ); } } if( g->displaying_radiation ) { - const int rad_value = g->m.get_radiation( {x, y, center.z} ); - catacurses::base_color col; - if( rad_value > 0 ) { - col = catacurses::green; - } else { - col = catacurses::cyan; + const auto rad_override = radiation_override.find( pos ); + const bool rad_overridden = rad_override != radiation_override.end(); + if( rad_overridden || !invisible[0] ) { + const int rad_value = rad_overridden ? rad_override->second : g->m.get_radiation( pos ); + catacurses::base_color col; + if( rad_value > 0 ) { + col = catacurses::green; + } else { + col = catacurses::cyan; + } + overlay_strings.emplace( player_to_screen( point( x, y ) ) + point( tile_width / 2, 0 ), + formatted_text( std::to_string( rad_value ), 8 + col, NORTH ) ); } - overlay_strings.emplace( player_to_screen( x, y ) + point( tile_width / 2, 0 ), - formatted_text( std::to_string( rad_value ), 8 + col, NORTH ) ); } // Add temperature value to the overlay_strings list for every visible tile when displaying temperature - if( g->displaying_temperature ) { - int temp_value = g->weather.get_temperature( {x, y, center.z} ); + if( g->displaying_temperature && !invisible[0] ) { + int temp_value = g->weather.get_temperature( pos ); int ctemp = temp_to_celsius( temp_value ); short color; const short bold = 8; @@ -1134,47 +1160,53 @@ void cata_tiles::draw( int destx, int desty, const tripoint ¢er, int width, temp_value = temp_to_kelvin( temp_value ); } - overlay_strings.emplace( player_to_screen( x, y ) + point( tile_width / 2, 0 ), + overlay_strings.emplace( player_to_screen( point( x, y ) ) + point( tile_width / 2, 0 ), formatted_text( std::to_string( temp_value ), color, NORTH ) ); } - if( g->displaying_visibility && ( g->displaying_visibility_creature != nullptr ) ) { - const bool visibility = g->displaying_visibility_creature->sees( { x, y, center.z } ); + if( g->displaying_visibility && g->displaying_visibility_creature && + !invisible[0] ) { + const bool visibility = g->displaying_visibility_creature->sees( pos ); // color overlay. auto block_color = visibility ? windowsPalette[catacurses::green] : SDL_Color{ 192, 192, 192, 255 }; block_color.a = 100; color_blocks.first = SDL_BLENDMODE_BLEND; - color_blocks.second.emplace( player_to_screen( x, y ), block_color ); + color_blocks.second.emplace( player_to_screen( point( x, y ) ), block_color ); // overlay string std::string visibility_str = visibility ? "+" : "-"; - overlay_strings.emplace( player_to_screen( x, y ) + point( tile_width / 4, tile_height / 4 ), - formatted_text( visibility_str, catacurses::black, NORTH ) ); + overlay_strings.emplace( + player_to_screen( point( x, y ) ) + point( tile_width / 4, tile_height / 4 ), + formatted_text( visibility_str, catacurses::black, NORTH ) ); } - if( apply_vision_effects( temp, g->m.get_visibility( ch.visibility_cache[x][y], cache ) ) ) { - int height_3d = 0; - draw_terrain_from_memory( tripoint( x, y, center.z ), height_3d ); - const auto critter = g->critter_at( tripoint( x, y, center.z ), true ); - if( critter != nullptr && g->u.sees_with_infrared( *critter ) ) { - // TODO: defer drawing this until later when we know how tall - // the terrain/furniture under the creature is. - draw_from_id_string( "infrared_creature", C_NONE, empty_string, temp, 0, 0, LL_LIT, false ); + if( !invisible[0] && + apply_vision_effects( pos, g->m.get_visibility( ch.visibility_cache[x][y], cache ) ) ) { + + const Creature *critter = g->critter_at( pos, true ); + if( has_draw_override( pos ) || has_memory_at( pos ) || + ( critter && g->u.sees_with_infrared( *critter ) ) ) { + + invisible[0] = true; + } else { + continue; } - continue; + } + for( int i = 0; i < 4; i++ ) { + const tripoint np = pos + neighborhood[i]; + invisible[1 + i] = np.y < min_visible_y || np.y > max_visible_y || + np.x < min_visible_x || np.x > max_visible_x || + would_apply_vision_effects( g->m.get_visibility( ch.visibility_cache[np.x][np.y], cache ) ); } int height_3d = 0; // light level is now used for choosing between grayscale filter and normal lit tiles. - // Draw Terrain if possible. If not possible then we need to continue on to the next part of loop - if( !draw_terrain( tripoint( x, y, center.z ), ch.visibility_cache[x][y], height_3d ) ) { - continue; - } + draw_terrain( pos, ch.visibility_cache[x][y], height_3d, invisible ); - draw_points.push_back( tile_render_info( tripoint( x, y, center.z ), height_3d ) ); + draw_points.emplace_back( pos, height_3d, invisible ); } const std::array drawing_layers = {{ &cata_tiles::draw_furniture, &cata_tiles::draw_graffiti, &cata_tiles::draw_trap, @@ -1188,46 +1220,87 @@ void cata_tiles::draw( int destx, int desty, const tripoint ¢er, int width, for( auto f : drawing_layers ) { // ... draw all the points we drew terrain for, in the same order for( auto &p : draw_points ) { - ( this->*f )( p.pos, ch.visibility_cache[p.pos.x][p.pos.y], p.height_3d ); + ( this->*f )( p.pos, ch.visibility_cache[p.pos.x][p.pos.y], p.height_3d, p.invisible ); + } + } + // display number of monsters to spawn in mapgen preview + for( const auto &p : draw_points ) { + const auto mon_override = monster_override.find( p.pos ); + if( mon_override != monster_override.end() ) { + const int count = std::get<1>( mon_override->second ); + const bool more = std::get<2>( mon_override->second ); + if( count > 1 || more ) { + std::string text = "x" + std::to_string( count ); + if( more ) { + text += "+"; + } + overlay_strings.emplace( player_to_screen( p.pos.xy() ) + point( tile_width / 2, 0 ), + formatted_text( text, catacurses::red, NORTH ) ); + } } } } + // tile overrides are already drawn in the previous code + void_radiation_override(); + void_terrain_override(); + void_furniture_override(); + void_graffiti_override(); + void_trap_override(); + void_field_override(); + void_item_override(); + void_vpart_override(); + void_draw_below_override(); + void_monster_override(); //Memorize everything the character just saw even if it wasn't displayed. - for( int mem_y = 0; mem_y < MAPSIZE_Y; mem_y++ ) { - for( int mem_x = 0; mem_x < MAPSIZE_X; mem_x++ ) { - tripoint p( mem_x, mem_y, center.z ); - //just finished o through s+o so skip them - rectangle skip_region( o, o + point( sx, sy ) ); - if( skip_region.contains_half_open( p.xy() ) ) { - continue; - } - int height_3d = 0; + for( int mem_y = min_visible_y; mem_y <= max_visible_y; mem_y++ ) { + for( int mem_x = min_visible_x; mem_x <= max_visible_x; mem_x++ ) { + rectangle already_drawn( point( min_col, min_row ), point( max_col, max_row ) ); if( iso_mode ) { - //Iso_mode skips in a checkerboard - if( modulo( mem_y, 2 ) != modulo( mem_x, 2 ) ) { + // calculate the screen position according to the drawing code above (division rounded down): + + // mem_x = ( col - row - sx / 2 + sy / 2 ) / 2 + o.x; + // mem_y = ( row + col - sy / 2 - sx / 2 ) / 2 + o.y; + // ( col - sx / 2 ) % 2 = ( row - sy / 2 ) % 2 + // || + // \/ + const int col = mem_y + mem_x + sx / 2 - o.y - o.x; + const int row = mem_y - mem_x + sy / 2 - o.y + o.x; + if( already_drawn.contains_half_open( point( col, row ) ) ) { continue; } - //in isometric, rows and columns represent a checkerboard screen space, and we place - //the appropriate tile in valid squares by getting position relative to the screen center. - //The MAPSIZE_X/2 offset is to keep the rectangle in the upper right quadrant. - p.x = ( mem_x - mem_y - MAPSIZE_X / 2 + MAPSIZE_Y / 2 ) / 2 + MAPSIZE_X / 2; - p.y = ( mem_y + mem_x - MAPSIZE_Y / 2 - MAPSIZE_X / 2 ) / 2 + MAPSIZE_Y / 2; - //Check if we're in previously done iso_mode space - if( p.x >= ( 0 - sy - sx / 2 + sy / 2 ) / 2 + o.x && p.x < ( sx - 0 - sx / 2 + sy / 2 ) / 2 + o.x && - p.y >= ( 0 + 0 - sy / 2 - sx / 2 ) / 2 + o.y && p.y < ( sy + sx - sy / 2 - sx / 2 ) / 2 + o.y ) { + } else { + // calculate the screen position according to the drawing code above: + + // mem_x = col + o.x + // mem_y = row + o.y + // || + // \/ + // col = mem_x - o.x + // row = mem_y - o.y + if( already_drawn.contains_half_open( point( mem_x, mem_y ) - o ) ) { continue; } } + const tripoint p( mem_x, mem_y, center.z ); lit_level lighting = ch.visibility_cache[p.x][p.y]; if( apply_vision_effects( p, g->m.get_visibility( lighting, cache ) ) ) { continue; } + int height_3d = 0; + bool invisible[5]; + invisible[0] = false; + for( int i = 0; i < 4; i++ ) { + const tripoint np = p + neighborhood[i]; + invisible[1 + i] = np.y < min_visible_y || np.y > max_visible_y || + np.x < min_visible_x || np.x > max_visible_x || + would_apply_vision_effects( g->m.get_visibility( ch.visibility_cache[np.x][np.y], cache ) ); + } //calling draw to memorize everything. - draw_terrain( p, lighting, height_3d ); - draw_furniture( p, lighting, height_3d ); - draw_trap( p, lighting, height_3d ); - draw_vpart( p, lighting, height_3d ); + draw_terrain( p, lighting, height_3d, invisible ); + draw_furniture( p, lighting, height_3d, invisible ); + draw_trap( p, lighting, height_3d, invisible ); + draw_vpart( p, lighting, height_3d, invisible ); } } @@ -1293,9 +1366,9 @@ void cata_tiles::draw( int destx, int desty, const tripoint ¢er, int width, "SDL_RenderSetClipRect failed" ); } -void cata_tiles::draw_minimap( int destx, int desty, const tripoint ¢er, int width, int height ) +void cata_tiles::draw_minimap( const point &dest, const tripoint ¢er, int width, int height ) { - minimap->draw( SDL_Rect{ destx, desty, width, height }, center ); + minimap->draw( SDL_Rect{ dest.x, dest.y, width, height }, center ); } void cata_tiles::get_window_tile_counts( const int width, const int height, int &columns, @@ -1641,7 +1714,7 @@ bool cata_tiles::draw_from_id_string( std::string id, TILE_CATEGORY category, } // translate from player-relative to screen relative tile position - const point screen_pos = player_to_screen( pos.x, pos.y ); + const point screen_pos = player_to_screen( pos.xy() ); // seed the PRNG to get a reproducible random int // TODO: faster solution here @@ -1659,9 +1732,19 @@ bool cata_tiles::draw_from_id_string( std::string id, TILE_CATEGORY category, // TODO: also use some vehicle id, for less predictability { // new scope for variable declarations - const optional_vpart_position vp = g->m.veh_at( pos ); - if( vp ) { - seed = vp->mount().x + vp->mount().y * 65536; + const auto vp_override = vpart_override.find( pos ); + const bool vp_overridden = vp_override != vpart_override.end(); + if( vp_overridden ) { + const vpart_id &vp_id = std::get<0>( vp_override->second ); + if( vp_id ) { + const point &mount = std::get<4>( vp_override->second ); + seed = mount.x + mount.y * 65536; + } + } else { + const optional_vpart_position vp = g->m.veh_at( pos ); + if( vp ) { + seed = vp->mount().x + vp->mount().y * 65536; + } } //convert vehicle 360-degree direction (0=E,45=SE, etc) to 4-way tile rotation (0=N,1=W,etc) @@ -1681,7 +1764,9 @@ bool cata_tiles::draw_from_id_string( std::string id, TILE_CATEGORY category, break; case C_MONSTER: // FIXME: add persistent id to Creature type, instead of using monster pointer address - seed = reinterpret_cast( g->critter_at( pos ) ); + if( monster_override.find( pos ) == monster_override.end() ) { + seed = reinterpret_cast( g->critter_at( pos ) ); + } break; default: // player @@ -1730,26 +1815,26 @@ bool cata_tiles::draw_from_id_string( std::string id, TILE_CATEGORY category, } //draw it! - draw_tile_at( display_tile, screen_pos.x, screen_pos.y, loc_rand, rota, ll, + draw_tile_at( display_tile, screen_pos, loc_rand, rota, ll, apply_night_vision_goggles, height_3d ); return true; } -bool cata_tiles::draw_sprite_at( const tile_type &tile, - const weighted_int_list> &svlist, - int x, int y, unsigned int loc_rand, bool rota_fg, int rota, lit_level ll, - bool apply_night_vision_goggles ) +bool cata_tiles::draw_sprite_at( + const tile_type &tile, const weighted_int_list> &svlist, + const point &p, unsigned int loc_rand, bool rota_fg, int rota, lit_level ll, + bool apply_night_vision_goggles ) { int nullint = 0; - return cata_tiles::draw_sprite_at( tile, svlist, x, y, loc_rand, rota_fg, rota, ll, + return cata_tiles::draw_sprite_at( tile, svlist, p, loc_rand, rota_fg, rota, ll, apply_night_vision_goggles, nullint ); } -bool cata_tiles::draw_sprite_at( const tile_type &tile, - const weighted_int_list> &svlist, - int x, int y, unsigned int loc_rand, bool rota_fg, int rota, lit_level ll, - bool apply_night_vision_goggles, int &height_3d ) +bool cata_tiles::draw_sprite_at( + const tile_type &tile, const weighted_int_list> &svlist, + const point &p, unsigned int loc_rand, bool rota_fg, int rota, lit_level ll, + bool apply_night_vision_goggles, int &height_3d ) { auto picked = svlist.pick( loc_rand ); if( !picked ) { @@ -1810,8 +1895,8 @@ bool cata_tiles::draw_sprite_at( const tile_type &tile, std::tie( width, height ) = sprite_tex->dimension(); SDL_Rect destination; - destination.x = x + tile.offset.x * tile_width / tileset_ptr->get_tile_width(); - destination.y = y + ( tile.offset.y - height_3d ) * tile_width / tileset_ptr->get_tile_width(); + destination.x = p.x + tile.offset.x * tile_width / tileset_ptr->get_tile_width(); + destination.y = p.y + ( tile.offset.y - height_3d ) * tile_width / tileset_ptr->get_tile_width(); destination.w = width * tile_width / tileset_ptr->get_tile_width(); destination.h = height * tile_height / tileset_ptr->get_tile_height(); @@ -1865,20 +1950,28 @@ bool cata_tiles::draw_sprite_at( const tile_type &tile, return true; } -bool cata_tiles::draw_tile_at( const tile_type &tile, int x, int y, unsigned int loc_rand, - int rota, - lit_level ll, bool apply_night_vision_goggles, int &height_3d ) +bool cata_tiles::draw_tile_at( + const tile_type &tile, const point &p, unsigned int loc_rand, int rota, + lit_level ll, bool apply_night_vision_goggles, int &height_3d ) { - draw_sprite_at( tile, tile.bg, x, y, loc_rand, /*fg:*/ false, rota, ll, + draw_sprite_at( tile, tile.bg, p, loc_rand, /*fg:*/ false, rota, ll, apply_night_vision_goggles ); - draw_sprite_at( tile, tile.fg, x, y, loc_rand, /*fg:*/ true, rota, ll, apply_night_vision_goggles, - height_3d ); + draw_sprite_at( tile, tile.fg, p, loc_rand, /*fg:*/ true, rota, ll, + apply_night_vision_goggles, height_3d ); return true; } +bool cata_tiles::would_apply_vision_effects( const visibility_type visibility ) const +{ + return visibility != VIS_CLEAR; +} + bool cata_tiles::apply_vision_effects( const tripoint &pos, const visibility_type visibility ) { + if( !would_apply_vision_effects( visibility ) ) { + return false; + } std::string light_name; switch( visibility ) { case VIS_HIDDEN: @@ -1896,8 +1989,9 @@ bool cata_tiles::apply_vision_effects( const tripoint &pos, case VIS_DARK: light_name = "lighting_lowlight_dark"; break; - case VIS_CLEAR: // Handled by the caller. - return false; + case VIS_CLEAR: + // should never happen + break; } // lighting is never rotated, though, could possibly add in random rotation? @@ -1906,9 +2000,13 @@ bool cata_tiles::apply_vision_effects( const tripoint &pos, return true; } -bool cata_tiles::draw_terrain_below( const tripoint &p, lit_level /*ll*/, int &/*height_3d*/ ) +bool cata_tiles::draw_terrain_below( const tripoint &p, const lit_level, int &, + const bool ( &invisible )[5] ) { - if( !g->m.need_draw_lower_floor( p ) ) { + const auto low_override = draw_below_override.find( p ); + const bool low_overridden = low_override != draw_below_override.end(); + if( low_overridden ? !low_override->second : ( invisible[0] || + !g->m.need_draw_lower_floor( p ) ) ) { return false; } @@ -1972,238 +2070,499 @@ bool cata_tiles::draw_terrain_below( const tripoint &p, lit_level /*ll*/, int &/ return true; } -bool cata_tiles::draw_terrain( const tripoint &p, lit_level ll, int &height_3d ) +bool cata_tiles::draw_terrain( const tripoint &p, const lit_level ll, int &height_3d, + const bool ( &invisible )[5] ) { - const ter_id t = g->m.ter( p ); // get the ter_id value at this point - // check for null, if null return false - if( t == t_null ) { - return false; + const auto override = terrain_override.find( p ); + const bool overridden = override != terrain_override.end(); + bool neighborhood_overridden = overridden; + if( !neighborhood_overridden ) { + // *INDENT-OFF* + for( const point &dir : { + point_south, point_east, point_west, point_north + } ) { + if( terrain_override.find( p + dir ) != terrain_override.end() ) { + neighborhood_overridden = true; + break; + } + } + // *INDENT-ON* + } + // first memorize the actual terrain + const ter_id &t = g->m.ter( p ); + if( t && !invisible[0] ) { + int subtile = 0; + int rotation = 0; + int connect_group = 0; + if( t.obj().connects( connect_group ) ) { + get_connect_values( p, subtile, rotation, connect_group, {} ); + } else { + get_terrain_orientation( p, rotation, subtile, {}, invisible ); + // do something to get other terrain orientation values + } + const std::string &tname = t.id().str(); + if( !g->m.check_and_set_seen_cache( p ) ) { + g->u.memorize_tile( g->m.getabs( p ), tname, subtile, rotation ); + } + // draw the actual terrain if there's no override + if( !neighborhood_overridden ) { + return draw_from_id_string( tname, C_TERRAIN, empty_string, p, subtile, rotation, ll, + nv_goggles_activated, height_3d ); + } + } + if( invisible[0] ? overridden : neighborhood_overridden ) { + // and then draw the override terrain + const ter_id &t2 = overridden ? override->second : t; + if( t2 ) { + // both the current and neighbouring overrides may change the appearance + // of the tile, so always re-calculate it. + int subtile = 0; + int rotation = 0; + int connect_group = 0; + if( t2.obj().connects( connect_group ) ) { + get_connect_values( p, subtile, rotation, connect_group, terrain_override ); + } else { + get_terrain_orientation( p, rotation, subtile, terrain_override, invisible ); + } + const std::string &tname = t2.id().str(); + // tile overrides are never memorized + // tile overrides are always shown with full visibility + const lit_level lit = overridden ? LL_LIT : ll; + const bool nv = overridden ? false : nv_goggles_activated; + return draw_from_id_string( tname, C_TERRAIN, empty_string, p, subtile, rotation, lit, nv, + height_3d ); + } + } else if( invisible[0] && has_terrain_memory_at( p ) ) { + // try drawing memory if invisible and not overridden + const auto &t = get_terrain_memory_at( p ); + return draw_from_id_string( t.tile, C_TERRAIN, empty_string, p, t.subtile, t.rotation, + LL_MEMORIZED, nv_goggles_activated, height_3d ); } + return false; +} - //char alteration = 0; - int subtile = 0; - int rotation = 0; - int connect_group; - if( g->m.ter( p ).obj().connects( connect_group ) ) { - get_connect_values( p, subtile, rotation, connect_group ); - } else { - get_terrain_orientation( p, rotation, subtile ); - // do something to get other terrain orientation values +bool cata_tiles::has_memory_at( const tripoint &p ) const +{ + if( g->u.should_show_map_memory() ) { + const memorized_terrain_tile t = g->u.get_memorized_tile( g->m.getabs( p ) ); + return !t.tile.empty(); } + return false; +} - const std::string &tname = t.obj().id.str(); - if( !g->m.check_and_set_seen_cache( p ) ) { - g->u.memorize_tile( g->m.getabs( p ), tname, subtile, rotation ); +bool cata_tiles::has_terrain_memory_at( const tripoint &p ) const +{ + if( g->u.should_show_map_memory() ) { + const memorized_terrain_tile t = g->u.get_memorized_tile( g->m.getabs( p ) ); + if( t.tile.substr( 0, 2 ) == "t_" ) { + return true; + } } - - return draw_from_id_string( tname, C_TERRAIN, empty_string, p, subtile, rotation, ll, - nv_goggles_activated, height_3d ); + return false; } -bool cata_tiles::draw_terrain_from_memory( const tripoint &p, int &height_3d ) +bool cata_tiles::has_furniture_memory_at( const tripoint &p ) const { - if( !g->u.should_show_map_memory() ) { - return false; - } - const memorized_terrain_tile t = g->u.get_memorized_tile( g->m.getabs( p ) ); - if( t.tile.empty() ) { - return false; + if( g->u.should_show_map_memory() ) { + const memorized_terrain_tile t = g->u.get_memorized_tile( g->m.getabs( p ) ); + if( t.tile.substr( 0, 2 ) == "f_" ) { + return true; + } } + return false; +} - TILE_CATEGORY category = C_NONE; - - switch( t.tile[0] ) { - case 't': - category = C_TERRAIN; - break; - case 'f': - category = C_FURNITURE; - break; - case 'v': - category = C_VEHICLE_PART; - break; - default: - debugmsg( "Could not infer category for memorized tile %s", t.tile ); - break; +bool cata_tiles::has_trap_memory_at( const tripoint &p ) const +{ + if( g->u.should_show_map_memory() ) { + const memorized_terrain_tile t = g->u.get_memorized_tile( g->m.getabs( p ) ); + if( t.tile.substr( 0, 3 ) == "tr_" ) { + return true; + } } - - return draw_from_id_string( t.tile, category, empty_string, p, t.subtile, t.rotation, - LL_MEMORIZED, nv_goggles_activated, height_3d ); + return false; } -bool cata_tiles::draw_furniture( const tripoint &p, lit_level ll, int &height_3d ) +bool cata_tiles::has_vpart_memory_at( const tripoint &p ) const { - // get furniture ID at x,y - bool has_furn = g->m.has_furn( p ); - if( !has_furn ) { - return false; + if( g->u.should_show_map_memory() ) { + const memorized_terrain_tile t = g->u.get_memorized_tile( g->m.getabs( p ) ); + if( t.tile.substr( 0, 3 ) == "vp_" ) { + return true; + } } + return false; +} - const furn_id f_id = g->m.furn( p ); - - // for rotation information - const int neighborhood[4] = { - static_cast( g->m.furn( p + point_south ) ), - static_cast( g->m.furn( p + point_east ) ), - static_cast( g->m.furn( p + point_west ) ), - static_cast( g->m.furn( p + point_north ) ) - }; - - int subtile = 0; - int rotation = 0; - get_tile_values( f_id, neighborhood, subtile, rotation ); - - // get the name of this furniture piece - const std::string &f_name = f_id.obj().id.str(); - if( !g->m.check_and_set_seen_cache( p ) ) { - g->u.memorize_tile( g->m.getabs( p ), f_name, subtile, rotation ); +memorized_terrain_tile cata_tiles::get_terrain_memory_at( const tripoint &p ) const +{ + if( g->u.should_show_map_memory() ) { + const memorized_terrain_tile t = g->u.get_memorized_tile( g->m.getabs( p ) ); + if( t.tile.substr( 0, 2 ) == "t_" ) { + return t; + } } + return {}; +} - bool ret = draw_from_id_string( f_name, C_FURNITURE, empty_string, p, subtile, rotation, ll, - nv_goggles_activated, height_3d ); - return ret; +memorized_terrain_tile cata_tiles::get_furniture_memory_at( const tripoint &p ) const +{ + if( g->u.should_show_map_memory() ) { + const memorized_terrain_tile t = g->u.get_memorized_tile( g->m.getabs( p ) ); + if( t.tile.substr( 0, 2 ) == "f_" ) { + return t; + } + } + return {}; } -bool cata_tiles::draw_trap( const tripoint &p, lit_level ll, int &height_3d ) +memorized_terrain_tile cata_tiles::get_trap_memory_at( const tripoint &p ) const { - const trap &tr = g->m.tr_at( p ); - if( !tr.can_see( p, g->u ) ) { - return false; + if( g->u.should_show_map_memory() ) { + const memorized_terrain_tile t = g->u.get_memorized_tile( g->m.getabs( p ) ); + if( t.tile.substr( 0, 3 ) == "tr_" ) { + return t; + } } + return {}; +} - const int neighborhood[4] = { - static_cast( g->m.tr_at( p + point_south ).loadid ), - static_cast( g->m.tr_at( p + point_east ).loadid ), - static_cast( g->m.tr_at( p + point_west ).loadid ), - static_cast( g->m.tr_at( p + point_north ).loadid ) - }; +memorized_terrain_tile cata_tiles::get_vpart_memory_at( const tripoint &p ) const +{ + if( g->u.should_show_map_memory() ) { + const memorized_terrain_tile t = g->u.get_memorized_tile( g->m.getabs( p ) ); + if( t.tile.substr( 0, 3 ) == "vp_" ) { + return t; + } + } + return {}; +} - int subtile = 0; - int rotation = 0; - get_tile_values( tr.loadid, neighborhood, subtile, rotation ); +bool cata_tiles::draw_furniture( const tripoint &p, const lit_level ll, int &height_3d, + const bool ( &invisible )[5] ) +{ + const auto override = furniture_override.find( p ); + const bool overridden = override != furniture_override.end(); + bool neighborhood_overridden = overridden; + if( !neighborhood_overridden ) { + // *INDENT-OFF* + for( const point &dir : { + point_south, point_east, point_west, point_north + } ) { + if( furniture_override.find( p + dir ) != furniture_override.end() ) { + neighborhood_overridden = true; + break; + } + } + // *INDENT-ON* + } + // first memorize the actual furniture + const furn_id &f = g->m.furn( p ); + if( f && !invisible[0] ) { + const int neighborhood[4] = { + static_cast( g->m.furn( p + point_south ) ), + static_cast( g->m.furn( p + point_east ) ), + static_cast( g->m.furn( p + point_west ) ), + static_cast( g->m.furn( p + point_north ) ) + }; + int subtile = 0; + int rotation = 0; + get_tile_values( f, neighborhood, subtile, rotation ); + const std::string &fname = f.id().str(); + if( !g->m.check_and_set_seen_cache( p ) ) { + g->u.memorize_tile( g->m.getabs( p ), fname, subtile, rotation ); + } + // draw the actual furniture if there's no override + if( !neighborhood_overridden ) { + return draw_from_id_string( fname, C_FURNITURE, empty_string, p, subtile, rotation, ll, + nv_goggles_activated, height_3d ); + } + } + if( invisible[0] ? overridden : neighborhood_overridden ) { + // and then draw the override furniture + const furn_id &f2 = overridden ? override->second : f; + if( f2 ) { + // both the current and neighbouring overrides may change the appearance + // of the tile, so always re-calculate it. + const auto furn = [&]( const tripoint & q, const bool invis ) -> furn_id { + const auto it = furniture_override.find( q ); + return it != furniture_override.end() ? it->second : + ( !overridden || !invis ) ? g->m.furn( q ) : f_null; + }; + const int neighborhood[4] = { + static_cast( furn( p + point_south, invisible[1] ) ), + static_cast( furn( p + point_east, invisible[2] ) ), + static_cast( furn( p + point_west, invisible[3] ) ), + static_cast( furn( p + point_north, invisible[4] ) ) + }; + int subtile = 0; + int rotation = 0; + get_tile_values( f2, neighborhood, subtile, rotation ); + const std::string &fname = f2.id().str(); + // tile overrides are never memorized + // tile overrides are always shown with full visibility + const lit_level lit = overridden ? LL_LIT : ll; + const bool nv = overridden ? false : nv_goggles_activated; + return draw_from_id_string( fname, C_FURNITURE, empty_string, p, subtile, rotation, lit, nv, + height_3d ); + } + } else if( invisible[0] && has_furniture_memory_at( p ) ) { + // try drawing memory if invisible and not overridden + const auto &t = get_furniture_memory_at( p ); + return draw_from_id_string( t.tile, C_FURNITURE, empty_string, p, t.subtile, t.rotation, + LL_MEMORIZED, nv_goggles_activated, height_3d ); + } + return false; +} - if( !g->m.check_and_set_seen_cache( p ) ) { - g->u.memorize_tile( g->m.getabs( p ), tr.id.str(), subtile, rotation ); +bool cata_tiles::draw_trap( const tripoint &p, const lit_level ll, int &height_3d, + const bool ( &invisible )[5] ) +{ + const auto override = trap_override.find( p ); + const bool overridden = override != trap_override.end(); + bool neighborhood_overridden = overridden; + if( !neighborhood_overridden ) { + // *INDENT-OFF* + for( const point &dir : { + point_south, point_east, point_west, point_north + } ) { + if( trap_override.find( p + dir ) != trap_override.end() ) { + neighborhood_overridden = true; + break; + } + } + // *INDENT-ON* } - return draw_from_id_string( tr.id.str(), C_TRAP, empty_string, p, subtile, rotation, ll, - nv_goggles_activated, height_3d ); + // first memorize the actual trap + const trap_id &tr = g->m.tr_at( p ).loadid; + if( tr && !invisible[0] && tr.obj().can_see( p, g->u ) ) { + const int neighborhood[4] = { + static_cast( g->m.tr_at( p + point_south ).loadid ), + static_cast( g->m.tr_at( p + point_east ).loadid ), + static_cast( g->m.tr_at( p + point_west ).loadid ), + static_cast( g->m.tr_at( p + point_north ).loadid ) + }; + int subtile = 0; + int rotation = 0; + get_tile_values( tr, neighborhood, subtile, rotation ); + const std::string trname = tr.id().str(); + if( !g->m.check_and_set_seen_cache( p ) ) { + g->u.memorize_tile( g->m.getabs( p ), trname, subtile, rotation ); + } + // draw the actual trap if there's no override + if( !neighborhood_overridden ) { + return draw_from_id_string( trname, C_TRAP, empty_string, p, subtile, rotation, ll, + nv_goggles_activated, height_3d ); + } + } + if( overridden || ( !invisible[0] && neighborhood_overridden && tr.obj().can_see( p, g->u ) ) ) { + // and then draw the override trap + const trap_id &tr2 = overridden ? override->second : tr; + if( tr2 ) { + // both the current and neighbouring overrides may change the appearance + // of the tile, so always re-calculate it. + const auto tr_at = [&]( const tripoint & q, const bool invis ) -> trap_id { + const auto it = trap_override.find( q ); + return it != trap_override.end() ? it->second : + ( !overridden || !invis ) ? g->m.tr_at( q ).loadid : tr_null; + }; + const int neighborhood[4] = { + static_cast( tr_at( p + point_south, invisible[1] ) ), + static_cast( tr_at( p + point_east, invisible[2] ) ), + static_cast( tr_at( p + point_west, invisible[3] ) ), + static_cast( tr_at( p + point_north, invisible[4] ) ) + }; + int subtile = 0; + int rotation = 0; + get_tile_values( tr2, neighborhood, subtile, rotation ); + const std::string &trname = tr2.id().str(); + // tile overrides are never memorized + // tile overrides are always shown with full visibility + const lit_level lit = overridden ? LL_LIT : ll; + const bool nv = overridden ? false : nv_goggles_activated; + return draw_from_id_string( trname, C_TRAP, empty_string, p, subtile, rotation, lit, nv, + height_3d ); + } + } else if( invisible[0] && has_trap_memory_at( p ) ) { + // try drawing memory if invisible and not overridden + const auto &t = get_trap_memory_at( p ); + return draw_from_id_string( t.tile, C_TRAP, empty_string, p, t.subtile, t.rotation, + LL_MEMORIZED, nv_goggles_activated, height_3d ); + } + return false; } -bool cata_tiles::draw_graffiti( const tripoint &p, lit_level ll, int &height_3d ) +bool cata_tiles::draw_graffiti( const tripoint &p, const lit_level ll, int &height_3d, + const bool ( &invisible )[5] ) { - if( !g->m.has_graffiti_at( p ) ) { + const auto override = graffiti_override.find( p ); + const bool overridden = override != graffiti_override.end(); + if( overridden ? !override->second : ( invisible[0] || !g->m.has_graffiti_at( p ) ) ) { return false; } - - return draw_from_id_string( "graffiti", C_NONE, empty_string, p, 0, 0, ll, false, height_3d ); + const lit_level lit = overridden ? LL_LIT : ll; + return draw_from_id_string( "graffiti", C_NONE, empty_string, p, 0, 0, lit, false, height_3d ); } -bool cata_tiles::draw_field_or_item( const tripoint &p, lit_level ll, int &height_3d ) +bool cata_tiles::draw_field_or_item( const tripoint &p, const lit_level ll, int &height_3d, + const bool ( &invisible )[5] ) { - const field &f = g->m.field_at( p ); - const field_type &fld_type = g->m.field_at( p ).displayed_field_type().obj(); - bool ret_draw_field = true; - bool ret_draw_items = true; - if( fld_type.display_field ) { + const auto fld_override = field_override.find( p ); + const bool fld_overridden = fld_override != field_override.end(); + const field_type_id &fld = fld_overridden ? + fld_override->second : g->m.field_at( p ).displayed_field_type(); + bool ret_draw_field = false; + bool ret_draw_items = false; + if( ( fld_overridden || !invisible[0] ) && fld.obj().display_field ) { + const lit_level lit = fld_overridden ? LL_LIT : ll; + const bool nv = fld_overridden ? false : nv_goggles_activated; + + auto field_at = [&]( const tripoint & q, const bool invis ) -> field_type_id { + const auto it = field_override.find( q ); + return it != field_override.end() ? it->second : + ( !fld_overridden || !invis ) ? g->m.field_at( q ).displayed_field_type() : fd_null; + }; // for rotation information const int neighborhood[4] = { - static_cast( g->m.field_at( p + point_south ).displayed_field_type() ), - static_cast( g->m.field_at( p + point_east ).displayed_field_type() ), - static_cast( g->m.field_at( p + point_west ).displayed_field_type() ), - static_cast( g->m.field_at( p + point_north ).displayed_field_type() ) + static_cast( field_at( p + point_south, invisible[1] ) ), + static_cast( field_at( p + point_east, invisible[2] ) ), + static_cast( field_at( p + point_west, invisible[3] ) ), + static_cast( field_at( p + point_north, invisible[4] ) ) }; int subtile = 0; int rotation = 0; - get_tile_values( f.displayed_field_type(), neighborhood, subtile, rotation ); - - ret_draw_field = draw_from_id_string( fld_type.id.c_str(), C_FIELD, empty_string, p, subtile, - rotation, ll, nv_goggles_activated ); - } - if( fld_type.display_items ) { - if( !g->m.sees_some_items( p, g->u ) ) { - return false; - } - const maptile &cur_maptile = g->m.maptile_at( p ); - // get the last item in the stack, it will be used for display - const item &displayed_item = cur_maptile.get_uppermost_item(); - // get the item's name, as that is the key used to find it in the map - const std::string it_name = displayed_item.is_corpse() ? "corpse_" + - displayed_item.get_mtype()->id.str() : displayed_item.typeId(); - - const std::string it_category = displayed_item.type->get_item_type_string(); - ret_draw_items = draw_from_id_string( it_name, C_ITEM, it_category, p, 0, 0, ll, - nv_goggles_activated, height_3d ); - if( ret_draw_items && cur_maptile.get_item_count() > 1 ) { - draw_item_highlight( p ); + get_tile_values( fld, neighborhood, subtile, rotation ); + + ret_draw_field = draw_from_id_string( fld.id().str(), C_FIELD, empty_string, p, subtile, + rotation, lit, nv ); + } + if( fld.obj().display_items ) { + const auto it_override = item_override.find( p ); + const bool it_overridden = it_override != item_override.end(); + + itype_id it_id; + mtype_id mon_id; + bool hilite; + const itype *it_type; + if( it_overridden ) { + it_id = std::get<0>( it_override->second ); + mon_id = std::get<1>( it_override->second ); + hilite = std::get<2>( it_override->second ); + it_type = item::find_type( it_id ); + } else if( !invisible[0] && g->m.sees_some_items( p, g->u ) ) { + const maptile &tile = g->m.maptile_at( p ); + const item &itm = tile.get_uppermost_item(); + const mtype *const mon = itm.get_mtype(); + it_id = itm.typeId(); + mon_id = mon ? mon->id : mtype_id::NULL_ID(); + hilite = tile.get_item_count() > 1; + it_type = itm.type; + } else { + it_type = nullptr; + } + if( it_type && it_id != "null" ) { + const std::string disp_id = it_id == "corpse" && mon_id ? + "corpse_" + mon_id.str() : it_id; + const std::string it_category = it_type->get_item_type_string(); + const lit_level lit = it_overridden ? LL_LIT : ll; + const bool nv = it_overridden ? false : nv_goggles_activated; + + ret_draw_items = draw_from_id_string( disp_id, C_ITEM, it_category, p, 0, 0, lit, + nv, height_3d ); + if( ret_draw_items && hilite ) { + draw_item_highlight( p ); + } } } return ret_draw_field && ret_draw_items; } -bool cata_tiles::draw_vpart_below( const tripoint &p, lit_level /*ll*/, int &/*height_3d*/ ) +bool cata_tiles::draw_vpart_below( const tripoint &p, const lit_level /*ll*/, int &/*height_3d*/, + const bool ( &invisible )[5] ) { - if( !g->m.need_draw_lower_floor( p ) ) { + const auto low_override = draw_below_override.find( p ); + const bool low_overridden = low_override != draw_below_override.end(); + if( low_overridden ? !low_override->second : ( invisible[0] || + !g->m.need_draw_lower_floor( p ) ) ) { return false; } tripoint pbelow( p.xy(), p.z - 1 ); int height_3d_below = 0; - return draw_vpart( pbelow, LL_LOW, height_3d_below ); + bool below_invisible[5]; + std::fill( below_invisible, below_invisible + 5, false ); + return draw_vpart( pbelow, LL_LOW, height_3d_below, below_invisible ); } -bool cata_tiles::draw_vpart( const tripoint &p, lit_level ll, int &height_3d ) +bool cata_tiles::draw_vpart( const tripoint &p, lit_level ll, int &height_3d, + const bool ( &invisible )[5] ) { + const auto override = vpart_override.find( p ); + const bool overridden = override != vpart_override.end(); + // first memorize the actual vpart const optional_vpart_position vp = g->m.veh_at( p ); - - if( !vp ) { - return false; - } - vehicle *const veh = &vp->vehicle(); - // veh_part is the index of the part - const int veh_part = vp->part_index(); - - // Gets the visible part, should work fine once tileset vp_ids are updated to work with the vehicle part json ids - // get the vpart_id - char part_mod = 0; - const vpart_id &vp_id = veh->part_id_string( veh_part, part_mod ); - - // prefix with vp_ ident - const std::string vpid = "vp_" + vp_id.str(); - int subtile = 0; - if( part_mod > 0 ) { - switch( part_mod ) { - case 1: - subtile = open_; - break; - case 2: - subtile = broken; - break; - } - } - const cata::optional cargopart = vp.part_with_feature( "CARGO", true ); - bool draw_highlight = cargopart && !veh->get_items( cargopart->part_index() ).empty(); - - int veh_dir = veh->face.dir(); - if( !veh->forward_velocity() && !veh->player_in_control( g->u ) ) { - if( !g->m.check_and_set_seen_cache( p ) ) { - g->u.memorize_tile( g->m.getabs( p ), vpid, subtile, veh_dir ); + if( vp && !invisible[0] ) { + const vehicle &veh = vp->vehicle(); + const int veh_part = vp->part_index(); + // Gets the visible part, should work fine once tileset vp_ids are updated to work with the vehicle part json ids + // get the vpart_id + char part_mod = 0; + const vpart_id &vp_id = veh.part_id_string( veh_part, part_mod ); + const int subtile = part_mod == 1 ? open_ : part_mod == 2 ? broken : 0; + const int rotation = veh.face.dir(); + const std::string vpname = "vp_" + vp_id.str(); + if( !veh.forward_velocity() && !veh.player_in_control( g->u ) && + !g->m.check_and_set_seen_cache( p ) ) { + g->u.memorize_tile( g->m.getabs( p ), vpname, subtile, rotation ); + } + if( !overridden ) { + const cata::optional cargopart = vp.part_with_feature( "CARGO", true ); + const bool draw_highlight = cargopart && !veh.get_items( cargopart->part_index() ).empty(); + const bool ret = draw_from_id_string( vpname, C_VEHICLE_PART, empty_string, p, subtile, rotation, + ll, nv_goggles_activated, height_3d ); + if( ret && draw_highlight ) { + draw_item_highlight( p ); + } + return ret; + } + } + if( overridden ) { + // and then draw the override vpart + const vpart_id &vp2 = std::get<0>( override->second ); + if( vp2 ) { + const char part_mod = std::get<1>( override->second ); + const int subtile = part_mod == 1 ? open_ : part_mod == 2 ? broken : 0; + const int rotation = std::get<2>( override->second ); + const int draw_highlight = std::get<3>( override->second ); + const std::string vpname = "vp_" + vp2.str(); + // tile overrides are never memorized + // tile overrides are always shown with full visibility + const bool ret = draw_from_id_string( vpname, C_VEHICLE_PART, empty_string, p, subtile, rotation, + LL_LIT, false, height_3d ); + if( ret && draw_highlight ) { + draw_item_highlight( p ); + } + return ret; } + } else if( invisible[0] && has_vpart_memory_at( p ) ) { + // try drawing memory if invisible and not overridden + const auto &t = get_vpart_memory_at( p ); + return draw_from_id_string( t.tile, C_VEHICLE_PART, empty_string, p, t.subtile, t.rotation, + LL_MEMORIZED, nv_goggles_activated, height_3d ); } - - bool ret = draw_from_id_string( vpid, C_VEHICLE_PART, empty_string, p, subtile, veh_dir, - ll, nv_goggles_activated, height_3d ); - if( ret && draw_highlight ) { - draw_item_highlight( p ); - } - return ret; + return false; } -bool cata_tiles::draw_critter_at_below( const tripoint &p, lit_level, int & ) +bool cata_tiles::draw_critter_at_below( const tripoint &p, const lit_level, int &, + const bool ( &invisible )[5] ) { // Check if we even need to draw below. If not, bail. - if( !g->m.need_draw_lower_floor( p ) ) { + const auto low_override = draw_below_override.find( p ); + const bool low_overridden = low_override != draw_below_override.end(); + if( low_overridden ? !low_override->second : ( invisible[0] || + !g->m.need_draw_lower_floor( p ) ) ) { return false; } @@ -2223,7 +2582,7 @@ bool cata_tiles::draw_critter_at_below( const tripoint &p, lit_level, int & ) return false; } - const point screen_point = player_to_screen( pbelow.x, pbelow.y ); + const point screen_point = player_to_screen( pbelow.xy() ); SDL_Color tercol = curses_color_to_SDL( c_red ); const int sizefactor = 2; @@ -2249,17 +2608,126 @@ bool cata_tiles::draw_critter_at_below( const tripoint &p, lit_level, int & ) return true; } -bool cata_tiles::draw_critter_at( const tripoint &p, lit_level ll, int &height_3d ) +bool cata_tiles::draw_critter_at( const tripoint &p, lit_level ll, int &height_3d, + const bool ( &invisible )[5] ) { - const auto critter = g->critter_at( p, true ); - if( critter != nullptr ) { - return draw_entity( *critter, p, ll, height_3d ); + bool result; + bool is_player; + bool sees_player; + Creature::Attitude attitude; + const auto override = monster_override.find( p ); + if( override != monster_override.end() ) { + const mtype_id id = std::get<0>( override->second ); + if( !id ) { + return false; + } + is_player = false; + sees_player = false; + attitude = std::get<3>( override->second ); + const std::string &chosen_id = id.str(); + const std::string &ent_subcategory = id.obj().species.empty() ? + empty_string : id.obj().species.begin()->str(); + result = draw_from_id_string( chosen_id, C_MONSTER, ent_subcategory, p, corner, 0, LL_LIT, false, + height_3d ); + } else if( !invisible[0] ) { + const Creature *pcritter = g->critter_at( p, true ); + if( pcritter == nullptr ) { + return false; + } + const Creature &critter = *pcritter; + + if( !g->u.sees( critter ) ) { + if( g->u.sees_with_infrared( critter ) ) { + return draw_from_id_string( "infrared_creature", C_NONE, empty_string, p, 0, 0, + LL_LIT, false, height_3d ); + } + return false; + } + result = false; + sees_player = false; + is_player = false; + attitude = Creature::A_ANY; + const monster *m = dynamic_cast( &critter ); + if( m != nullptr ) { + const auto ent_category = C_MONSTER; + std::string ent_subcategory = empty_string; + if( !m->type->species.empty() ) { + ent_subcategory = m->type->species.begin()->str(); + } + const int subtile = corner; + // depending on the toggle flip sprite left or right + int rot_facing = -1; + if( m->facing == FD_RIGHT ) { + rot_facing = 0; + } else if( m->facing == FD_LEFT ) { + rot_facing = 4; + } + if( rot_facing >= 0 ) { + const auto ent_name = m->type->id; + std::string chosen_id = ent_name.str(); + if( m->has_effect( effect_ridden ) ) { + int pl_under_height = 6; + if( m->mounted_player ) { + draw_entity_with_overlays( *m->mounted_player, p, ll, pl_under_height ); + } + const std::string prefix = "rid_"; + std::string copy_id = chosen_id; + const std::string ridden_id = copy_id.insert( 0, prefix ); + const tile_type *tt = tileset_ptr->find_tile_type( ridden_id ); + if( tt ) { + chosen_id = ridden_id; + } + } + result = draw_from_id_string( chosen_id, ent_category, ent_subcategory, p, subtile, rot_facing, + ll, false, height_3d ); + sees_player = m->sees( g->u ); + attitude = m->attitude_to( g-> u ); + } + } + const player *pl = dynamic_cast( &critter ); + if( pl != nullptr ) { + draw_entity_with_overlays( *pl, p, ll, height_3d ); + result = true; + if( pl->is_player() ) { + is_player = true; + } else { + sees_player = pl->sees( g-> u ); + attitude = pl->attitude_to( g-> u ); + } + } + } else { // invisible + const Creature *critter = g->critter_at( p, true ); + if( critter && g->u.sees_with_infrared( *critter ) ) { + // try drawing infrared creature if invisible and not overridden + // return directly without drawing overlay + return draw_from_id_string( "infrared_creature", C_NONE, empty_string, p, 0, 0, LL_LIT, false, + height_3d ); + } else { + return false; + } } - return false; + + if( result && !is_player ) { + std::ostringstream tmp_id; + tmp_id << "overlay_" << Creature::attitude_raw_string( attitude ); + if( sees_player ) { + tmp_id << "_sees_player"; + } + const std::string draw_id = tmp_id.str(); + if( tileset_ptr->find_tile_type( draw_id ) ) { + draw_from_id_string( draw_id, C_NONE, empty_string, p, 0, 0, LL_LIT, false, height_3d ); + } + } + return result; } -bool cata_tiles::draw_zone_mark( const tripoint &p, lit_level ll, int &height_3d ) +bool cata_tiles::draw_zone_mark( const tripoint &p, lit_level ll, int &height_3d, + const bool ( &invisible )[5] ) { + if( invisible[0] ) { + return false; + } + if( !g->is_zones_manager_open() ) { return false; } @@ -2280,81 +2748,6 @@ bool cata_tiles::draw_zone_mark( const tripoint &p, lit_level ll, int &height_3d return false; } -bool cata_tiles::draw_entity( const Creature &critter, const tripoint &p, lit_level ll, - int &height_3d ) -{ - if( !g->u.sees( critter ) ) { - if( g->u.sees_with_infrared( critter ) ) { - return draw_from_id_string( "infrared_creature", C_NONE, empty_string, p, 0, 0, - LL_LIT, false, height_3d ); - } - return false; - } - bool result = false; - bool sees_player = false; - bool is_player = false; - Creature::Attitude attitude = Creature::A_ANY; - const monster *m = dynamic_cast( &critter ); - if( m != nullptr ) { - const auto ent_category = C_MONSTER; - std::string ent_subcategory = empty_string; - if( !m->type->species.empty() ) { - ent_subcategory = m->type->species.begin()->str(); - } - const int subtile = corner; - // depending on the toggle flip sprite left or right - int rot_facing = -1; - if( m->facing == FD_RIGHT ) { - rot_facing = 0; - } else if( m->facing == FD_LEFT ) { - rot_facing = 4; - } - if( rot_facing >= 0 ) { - const auto ent_name = m->type->id; - std::string chosen_id = ent_name.str(); - if( m->has_effect( effect_ridden ) ) { - int pl_under_height = 6; - draw_entity_with_overlays( g->u, p, ll, pl_under_height ); - const std::string prefix = "rid_"; - std::string copy_id = chosen_id; - const std::string ridden_id = copy_id.insert( 0, prefix ); - const tile_type *tt = tileset_ptr->find_tile_type( ridden_id ); - if( tt ) { - chosen_id = ridden_id; - } - } - result = draw_from_id_string( chosen_id, ent_category, ent_subcategory, p, subtile, rot_facing, - ll, false, height_3d ); - sees_player = m->sees( g->u ); - attitude = m->attitude_to( g-> u ); - } - } - const player *pl = dynamic_cast( &critter ); - if( pl != nullptr ) { - draw_entity_with_overlays( *pl, p, ll, height_3d ); - result = true; - if( pl->is_player() ) { - is_player = true; - } else { - sees_player = pl->sees( g-> u ); - attitude = pl->attitude_to( g-> u ); - } - } - - if( result && !is_player ) { - std::ostringstream tmp_id; - tmp_id << "overlay_" << Creature::attitude_raw_string( attitude ); - if( sees_player ) { - tmp_id << "_sees_player"; - } - const std::string draw_id = tmp_id.str(); - if( tileset_ptr->find_tile_type( draw_id ) ) { - draw_from_id_string( draw_id, C_NONE, empty_string, p, 0, 0, LL_LIT, false, height_3d ); - } - } - return result; -} - void cata_tiles::draw_entity_with_overlays( const player &pl, const tripoint &p, lit_level ll, int &height_3d ) { @@ -2477,6 +2870,49 @@ void cata_tiles::init_draw_zones( const tripoint &_start, const tripoint &_end, zone_end = _end; zone_offset = _offset; } +void cata_tiles::init_draw_radiation_override( const tripoint &p, const int rad ) +{ + radiation_override.emplace( p, rad ); +} +void cata_tiles::init_draw_terrain_override( const tripoint &p, const ter_id &id ) +{ + terrain_override.emplace( p, id ); +} +void cata_tiles::init_draw_furniture_override( const tripoint &p, const furn_id &id ) +{ + furniture_override.emplace( p, id ); +} +void cata_tiles::init_draw_graffiti_override( const tripoint &p, const bool has ) +{ + graffiti_override.emplace( p, has ); +} +void cata_tiles::init_draw_trap_override( const tripoint &p, const trap_id &id ) +{ + trap_override.emplace( p, id ); +} +void cata_tiles::init_draw_field_override( const tripoint &p, const field_type_id &id ) +{ + field_override.emplace( p, id ); +} +void cata_tiles::init_draw_item_override( const tripoint &p, const itype_id &id, + const mtype_id &mid, const bool hilite ) +{ + item_override.emplace( p, std::make_tuple( id, mid, hilite ) ); +} +void cata_tiles::init_draw_vpart_override( const tripoint &p, const vpart_id &id, + const int part_mod, const int veh_dir, const bool hilite, const point &mount ) +{ + vpart_override.emplace( p, std::make_tuple( id, part_mod, veh_dir, hilite, mount ) ); +} +void cata_tiles::init_draw_below_override( const tripoint &p, const bool draw ) +{ + draw_below_override.emplace( p, draw ); +} +void cata_tiles::init_draw_monster_override( const tripoint &p, const mtype_id &id, const int count, + const bool more, const Creature::Attitude att ) +{ + monster_override.emplace( p, std::make_tuple( id, count, more, att ) ); +} /* -- Void Animators */ void cata_tiles::void_explosion() { @@ -2533,6 +2969,59 @@ void cata_tiles::void_zones() { do_draw_zones = false; } +void cata_tiles::void_radiation_override() +{ + radiation_override.clear(); +} +void cata_tiles::void_terrain_override() +{ + terrain_override.clear(); +} +void cata_tiles::void_furniture_override() +{ + furniture_override.clear(); +} +void cata_tiles::void_graffiti_override() +{ + graffiti_override.clear(); +} +void cata_tiles::void_trap_override() +{ + trap_override.clear(); +} +void cata_tiles::void_field_override() +{ + field_override.clear(); +} +void cata_tiles::void_item_override() +{ + item_override.clear(); +} +void cata_tiles::void_vpart_override() +{ + vpart_override.clear(); +} +void cata_tiles::void_draw_below_override() +{ + draw_below_override.clear(); +} +void cata_tiles::void_monster_override() +{ + monster_override.clear(); +} +bool cata_tiles::has_draw_override( const tripoint &p ) const +{ + return radiation_override.find( p ) != radiation_override.end() || + terrain_override.find( p ) != terrain_override.end() || + furniture_override.find( p ) != furniture_override.end() || + graffiti_override.find( p ) != graffiti_override.end() || + trap_override.find( p ) != trap_override.end() || + field_override.find( p ) != field_override.end() || + item_override.find( p ) != item_override.end() || + vpart_override.find( p ) != vpart_override.end() || + draw_below_override.find( p ) != draw_below_override.end() || + monster_override.find( p ) != monster_override.end(); +} /* -- Animation Renders */ void cata_tiles::draw_explosion_frame() { @@ -2718,7 +3207,7 @@ void cata_tiles::draw_sct_frame( std::multimap &overlay_s const int direction_offset = ( -direction_XY( direction ).x + 1 ) * full_text_length / 2; overlay_strings.emplace( - player_to_screen( iDX + direction_offset, iDY ), + player_to_screen( point( iDX + direction_offset, iDY ) ), formatted_text( sText, FG, direction ) ); } else { for( auto &it : sText ) { @@ -2764,10 +3253,18 @@ void cata_tiles::init_light() g->reset_light_level(); } -void cata_tiles::get_terrain_orientation( const tripoint &p, int &rota, int &subtile ) +void cata_tiles::get_terrain_orientation( const tripoint &p, int &rota, int &subtile, + const std::map &ter_override, const bool ( &invisible )[5] ) { + const bool overridden = ter_override.find( p ) != ter_override.end(); + const auto ter = [&]( const tripoint & q, const bool invis ) -> ter_id { + const auto override = ter_override.find( q ); + return override != ter_override.end() ? override->second : + ( !overridden || !invis ) ? g->m.ter( q ) : t_null; + }; + // get terrain at x,y - ter_id tid = g->m.ter( p ); + const ter_id tid = ter( p, invisible[0] ); if( tid == t_null ) { subtile = 0; rota = 0; @@ -2776,20 +3273,17 @@ void cata_tiles::get_terrain_orientation( const tripoint &p, int &rota, int &sub // get terrain neighborhood const ter_id neighborhood[4] = { - g->m.ter( p + point_south ), - g->m.ter( p + point_east ), - g->m.ter( p + point_west ), - g->m.ter( p + point_north ) + ter( p + point_south, invisible[1] ), + ter( p + point_east, invisible[2] ), + ter( p + point_west, invisible[3] ), + ter( p + point_north, invisible[4] ) }; - bool connects[4]; char val = 0; // populate connection information for( int i = 0; i < 4; ++i ) { - connects[i] = ( neighborhood[i] == tid ); - - if( connects[i] ) { + if( neighborhood[i] == tid ) { val += 1 << i; } } @@ -2874,9 +3368,9 @@ void cata_tiles::get_rotation_and_subtile( const char val, int &rotation, int &s } void cata_tiles::get_connect_values( const tripoint &p, int &subtile, int &rotation, - int connect_group ) + const int connect_group, const std::map &ter_override ) { - uint8_t connections = g->m.get_known_connections( p, connect_group ); + uint8_t connections = g->m.get_known_connections( p, connect_group, ter_override ); get_rotation_and_subtile( connections, rotation, subtile ); } @@ -2922,21 +3416,21 @@ void cata_tiles::do_tile_loading_report() DebugLog( D_INFO, DC_ALL ); } -point cata_tiles::player_to_screen( const int x, const int y ) const +point cata_tiles::player_to_screen( const point &p ) const { int screen_x = 0; int screen_y = 0; if( tile_iso ) { - screen_x = ( ( x - o.x ) - ( o.y - y ) + screentile_width - 2 ) * tile_width / 2 + + screen_x = ( ( p.x - o.x ) - ( o.y - p.y ) + screentile_width - 2 ) * tile_width / 2 + op.x; // y uses tile_width because width is definitive for iso tiles // tile footprints are half as tall as wide, arbitrarily tall - screen_y = ( ( y - o.y ) - ( x - o.x ) - 4 ) * tile_width / 4 + + screen_y = ( ( p.y - o.y ) - ( p.x - o.x ) - 4 ) * tile_width / 4 + screentile_height * tile_height / 2 + // TODO: more obvious centering math op.y; } else { - screen_x = ( x - o.x ) * tile_width + op.x; - screen_y = ( y - o.y ) * tile_height + op.y; + screen_x = ( p.x - o.x ) * tile_width + op.x; + screen_y = ( p.y - o.y ) * tile_height + op.y; } return {screen_x, screen_y}; } diff --git a/src/cata_tiles.h b/src/cata_tiles.h index c36ce46a59973..de08172077338 100644 --- a/src/cata_tiles.h +++ b/src/cata_tiles.h @@ -12,8 +12,10 @@ #include "sdl_wrappers.h" #include "animation.h" +#include "creature.h" #include "lightmap.h" #include "line.h" +#include "map_memory.h" #include "options.h" #include "weather.h" #include "enums.h" @@ -25,6 +27,8 @@ class player; class pixel_minimap; class JsonObject; +using itype_id = std::string; + extern void set_displaybuffer_rendertarget(); /** Structures */ @@ -272,12 +276,12 @@ class cata_tiles void on_options_changed(); /** Draw to screen */ - void draw( int destx, int desty, const tripoint ¢er, int width, int height, + void draw( const point &dest, const tripoint ¢er, int width, int height, std::multimap &overlay_strings, color_block_overlay_container &color_blocks ); /** Minimap functionality */ - void draw_minimap( int destx, int desty, const tripoint ¢er, int width, int height ); + void draw_minimap( const point &dest, const tripoint ¢er, int width, int height ); protected: /** How many rows and columns of tiles fit into given dimensions **/ @@ -297,36 +301,62 @@ class cata_tiles bool draw_from_id_string( std::string id, TILE_CATEGORY category, const std::string &subcategory, const tripoint &pos, int subtile, int rota, lit_level ll, bool apply_night_vision_goggles, int &height_3d ); - bool draw_sprite_at( const tile_type &tile, const weighted_int_list> &svlist, - int x, int y, unsigned int loc_rand, bool rota_fg, int rota, lit_level ll, - bool apply_night_vision_goggles ); - bool draw_sprite_at( const tile_type &tile, const weighted_int_list> &svlist, - int x, int y, unsigned int loc_rand, bool rota_fg, int rota, lit_level ll, - bool apply_night_vision_goggles, int &height_3d ); - bool draw_tile_at( const tile_type &tile, int x, int y, unsigned int loc_rand, int rota, + bool draw_sprite_at( + const tile_type &tile, const weighted_int_list> &svlist, + const point &, unsigned int loc_rand, bool rota_fg, int rota, lit_level ll, + bool apply_night_vision_goggles ); + bool draw_sprite_at( + const tile_type &tile, const weighted_int_list> &svlist, + const point &, unsigned int loc_rand, bool rota_fg, int rota, lit_level ll, + bool apply_night_vision_goggles, int &height_3d ); + bool draw_tile_at( const tile_type &tile, const point &, unsigned int loc_rand, int rota, lit_level ll, bool apply_night_vision_goggles, int &height_3d ); /* Tile Picking */ void get_tile_values( int t, const int *tn, int &subtile, int &rotation ); - void get_connect_values( const tripoint &p, int &subtile, int &rotation, int connect_group ); - void get_terrain_orientation( const tripoint &p, int &rota, int &subtile ); + void get_connect_values( const tripoint &p, int &subtile, int &rotation, int connect_group, + const std::map &ter_override ); + void get_terrain_orientation( const tripoint &p, int &rota, int &subtile, + const std::map &ter_override, + const bool ( &invisible )[5] ); void get_rotation_and_subtile( char val, int &rota, int &subtile ); + /** Map memory */ + bool has_memory_at( const tripoint &p ) const; + bool has_terrain_memory_at( const tripoint &p ) const; + bool has_furniture_memory_at( const tripoint &p ) const; + bool has_trap_memory_at( const tripoint &p ) const; + bool has_vpart_memory_at( const tripoint &p ) const; + memorized_terrain_tile get_terrain_memory_at( const tripoint &p ) const; + memorized_terrain_tile get_furniture_memory_at( const tripoint &p ) const; + memorized_terrain_tile get_trap_memory_at( const tripoint &p ) const; + memorized_terrain_tile get_vpart_memory_at( const tripoint &p ) const; + /** Drawing Layers */ + bool would_apply_vision_effects( visibility_type visibility ) const; bool apply_vision_effects( const tripoint &pos, visibility_type visibility ); - bool draw_terrain( const tripoint &p, lit_level ll, int &height_3d ); - bool draw_terrain_from_memory( const tripoint &p, int &height_3d ); - bool draw_terrain_below( const tripoint &p, lit_level ll, int &height_3d ); - bool draw_furniture( const tripoint &p, lit_level ll, int &height_3d ); - bool draw_graffiti( const tripoint &p, lit_level ll, int &height_3d ); - bool draw_trap( const tripoint &p, lit_level ll, int &height_3d ); - bool draw_field_or_item( const tripoint &p, lit_level ll, int &height_3d ); - bool draw_vpart( const tripoint &p, lit_level ll, int &height_3d ); - bool draw_vpart_below( const tripoint &p, lit_level ll, int &height_3d ); - bool draw_critter_at( const tripoint &p, lit_level ll, int &height_3d ); - bool draw_critter_at_below( const tripoint &p, lit_level ll, int &height_3d ); - bool draw_zone_mark( const tripoint &p, lit_level ll, int &height_3d ); - bool draw_entity( const Creature &critter, const tripoint &p, lit_level ll, int &height_3d ); + bool draw_terrain( const tripoint &p, lit_level ll, int &height_3d, + const bool ( &invisible )[5] ); + bool draw_terrain_below( const tripoint &p, lit_level ll, int &height_3d, + const bool ( &invisible )[5] ); + bool draw_furniture( const tripoint &p, lit_level ll, int &height_3d, + const bool ( &invisible )[5] ); + bool draw_graffiti( const tripoint &p, lit_level ll, int &height_3d, + const bool ( &invisible )[5] ); + bool draw_trap( const tripoint &p, lit_level ll, int &height_3d, + const bool ( &invisible )[5] ); + bool draw_field_or_item( const tripoint &p, lit_level ll, int &height_3d, + const bool ( &invisible )[5] ); + bool draw_vpart( const tripoint &p, lit_level ll, int &height_3d, + const bool ( &invisible )[5] ); + bool draw_vpart_below( const tripoint &p, lit_level ll, int &height_3d, + const bool ( &invisible )[5] ); + bool draw_critter_at( const tripoint &p, lit_level ll, int &height_3d, + const bool ( &invisible )[5] ); + bool draw_critter_at_below( const tripoint &p, lit_level ll, int &height_3d, + const bool ( &invisible )[5] ); + bool draw_zone_mark( const tripoint &p, lit_level ll, int &height_3d, + const bool ( &invisible )[5] ); void draw_entity_with_overlays( const player &pl, const tripoint &p, lit_level ll, int &height_3d ); bool draw_item_highlight( const tripoint &pos ); @@ -377,6 +407,40 @@ class cata_tiles void draw_zones_frame(); void void_zones(); + void init_draw_radiation_override( const tripoint &p, int rad ); + void void_radiation_override(); + + void init_draw_terrain_override( const tripoint &p, const ter_id &id ); + void void_terrain_override(); + + void init_draw_furniture_override( const tripoint &p, const furn_id &id ); + void void_furniture_override(); + + void init_draw_graffiti_override( const tripoint &p, bool has ); + void void_graffiti_override(); + + void init_draw_trap_override( const tripoint &p, const trap_id &id ); + void void_trap_override(); + + void init_draw_field_override( const tripoint &p, const field_type_id &id ); + void void_field_override(); + + void init_draw_item_override( const tripoint &p, const itype_id &id, const mtype_id &mid, + bool hilite ); + void void_item_override(); + + void init_draw_vpart_override( const tripoint &p, const vpart_id &id, int part_mod, + int veh_dir, bool hilite, const point &mount ); + void void_vpart_override(); + + void init_draw_below_override( const tripoint &p, bool draw ); + void void_draw_below_override(); + + void init_draw_monster_override( const tripoint &p, const mtype_id &id, int count, + bool more, Creature::Attitude att ); + void void_monster_override(); + + bool has_draw_override( const tripoint &p ) const; public: /** * Initialize the current tileset (load tile images, load mapping), using the current @@ -406,7 +470,7 @@ class cata_tiles return tile_ratioy; } void do_tile_loading_report(); - point player_to_screen( int x, int y ) const; + point player_to_screen( const point & ) const; static std::vector build_renderer_list(); protected: template @@ -484,6 +548,21 @@ class cata_tiles // offset for drawing, in pixels. point op; + std::map radiation_override; + std::map terrain_override; + std::map furniture_override; + std::map graffiti_override; + std::map trap_override; + std::map field_override; + // bool represents item highlight + std::map> item_override; + // int, int, bool represents part_mod, veh_dir, and highlight respectively + // point represents the mount direction + std::map> vpart_override; + std::map draw_below_override; + // int represents spawn count + std::map> monster_override; + private: /** * Tracks active night vision goggle status for each draw call. diff --git a/src/cata_variant.cpp b/src/cata_variant.cpp index 104f709a7cb46..21831bf63d587 100644 --- a/src/cata_variant.cpp +++ b/src/cata_variant.cpp @@ -2,20 +2,34 @@ #include -namespace cata_variant_detail +namespace io { -std::string to_string( cata_variant_type type ) +template<> +std::string enum_to_string( cata_variant_type type ) { switch( type ) { - case cata_variant_type::character_id: - return "character_id"; - case cata_variant_type::itype_id: - return "itype_id"; - case cata_variant_type::mtype_id: - return "mtype_id"; - case cata_variant_type::string: - return "string"; + // *INDENT-OFF* + case cata_variant_type::void_: return "void"; + case cata_variant_type::add_type: return "add_type"; + case cata_variant_type::bionic_id: return "bionic_id"; + case cata_variant_type::body_part: return "body_part"; + case cata_variant_type::bool_: return "bool"; + case cata_variant_type::character_id: return "character_id"; + case cata_variant_type::efftype_id: return "efftype_id"; + case cata_variant_type::hp_part: return "hp_part"; + case cata_variant_type::int_: return "int"; + case cata_variant_type::itype_id: return "itype_id"; + case cata_variant_type::matype_id: return "matype_id"; + case cata_variant_type::mtype_id: return "mtype_id"; + case cata_variant_type::mutagen_technique: return "mutagen_technique"; + case cata_variant_type::mutation_category_id: return "mutation_category_id"; + case cata_variant_type::oter_id: return "oter_id"; + case cata_variant_type::skill_id: return "skill_id"; + case cata_variant_type::string: return "string"; + case cata_variant_type::trait_id: return "trait_id"; + case cata_variant_type::trap_str_id: return "trap_str_id"; + // *INDENT-ON* case cata_variant_type::num_types: break; }; @@ -23,31 +37,4 @@ std::string to_string( cata_variant_type type ) return ""; } -static std::unordered_map create_type_lookup_map() -{ - std::unordered_map result; - int num_types = static_cast( cata_variant_type::num_types ); - for( int i = 0; i < num_types; ++i ) { - cata_variant_type type = static_cast( i ); - std::string type_as_string = to_string( type ); - bool inserted = result.insert( {type_as_string, type} ).second; - if( !inserted ) { - debugmsg( "Duplicate variant type name %s", type_as_string ); - } - } - return result; -} - -cata_variant_type from_string( const std::string &s ) -{ - static const std::unordered_map type_lookup_map = - create_type_lookup_map(); - auto it = type_lookup_map.find( s ); - if( it == type_lookup_map.end() ) { - debugmsg( "Unexpected cata_variant_type name %s", s ); - assert( false ); - } - return it->second; -} - -} // namespace cata_variant_detail +} // namespace io diff --git a/src/cata_variant.h b/src/cata_variant.h index df1ee752eb241..c38e90d883999 100644 --- a/src/cata_variant.h +++ b/src/cata_variant.h @@ -8,32 +8,55 @@ #include "character_id.h" #include "debug.h" +#include "enum_conversions.h" +#include "enum_traits.h" +#include "hash_utils.h" #include "type_id.h" +enum add_type : int; +enum body_part : int; +enum class mutagen_technique : int; +enum hp_part : int; + using itype_id = std::string; // cata_variant is a variant-like type that stores a variety of different cata // types. All types are stored by converting them to a string. enum class cata_variant_type : int { + void_, // Special type for empty variants + add_type, + bionic_id, + body_part, + bool_, character_id, + efftype_id, + hp_part, + int_, itype_id, + matype_id, mtype_id, + mutagen_technique, + mutation_category_id, + oter_id, + skill_id, string, + trait_id, + trap_str_id, num_types, // last }; +template<> +struct enum_traits { + static constexpr cata_variant_type last = cata_variant_type::num_types; +}; + // Here follows various implementation details. Skip to the bottom of the file // to see cata_variant itself. namespace cata_variant_detail { -// Converting cata_variant_type enum values to and from string for serialization and error -// reporting. -std::string to_string( cata_variant_type ); -cata_variant_type from_string( const std::string & ); - // The convert struct is specialized for each cata_variant_type to provide the // code for converting that type to or from a string. template @@ -63,15 +86,94 @@ template constexpr cata_variant_type type_for() { constexpr size_t num_types = static_cast( cata_variant_type::num_types ); - using SimpleT = std::remove_reference_t; + using SimpleT = std::remove_cv_t>; return type_for_impl( std::make_index_sequence {} ); } +// Inherit from this struct to easily implement convert specializations for any +// string type +template +struct convert_string { + using type = T; + static_assert( std::is_same::value, + "Intended for use only with string typedefs" ); + static std::string to_string( const T &v ) { + return v; + } + static T from_string( const std::string &v ) { + return v; + } +}; + +// Inherit from this struct to easily implement convert specializations for any +// string_id type +template +struct convert_string_id { + using type = T; + static std::string to_string( const T &v ) { + return v.str(); + } + static T from_string( const std::string &v ) { + return T( v ); + } +}; + +// Inherit from this struct to easily implement convert specializations for any +// int_id type +template +struct convert_int_id { + using type = T; + static std::string to_string( const T &v ) { + return v.id().str(); + } + static T from_string( const std::string &v ) { + return T( v ); + } +}; + +// Inherit from this struct to easily implement convert specializations for any +// enum type +template +struct convert_enum { + using type = T; + static std::string to_string( const T &v ) { + return io::enum_to_string( v ); + } + static T from_string( const std::string &v ) { + return io::string_to_enum( v ); + } +}; + // These are the specializations of convert for each value type. -static_assert( static_cast( cata_variant_type::num_types ) == 4, +static_assert( static_cast( cata_variant_type::num_types ) == 19, "This assert is a reminder to add conversion support for any new types to the " "below specializations" ); +template<> +struct convert { + using type = void; +}; + +template<> +struct convert : convert_enum {}; + +template<> +struct convert : convert_string_id {}; + +template<> +struct convert : convert_enum {}; + +template<> +struct convert { + using type = bool; + static std::string to_string( const bool v ) { + return std::to_string( static_cast( v ) ); + } + static bool from_string( const std::string &v ) { + return std::stoi( v ); + } +}; + template<> struct convert { using type = character_id; @@ -84,43 +186,61 @@ struct convert { }; template<> -struct convert { - using type = itype_id; - static std::string to_string( const itype_id &v ) { - return v; - } - static itype_id from_string( const std::string &v ) { - return v; - } -}; +struct convert : convert_string_id {}; template<> -struct convert { - using type = mtype_id; - static std::string to_string( const mtype_id &v ) { - return v.str(); - } - static mtype_id from_string( const std::string &v ) { - return mtype_id( v ); - } -}; +struct convert : convert_enum {}; template<> -struct convert { - using type = std::string; - static std::string to_string( const std::string &v ) { - return v; +struct convert { + using type = int; + static std::string to_string( const int v ) { + return std::to_string( v ); } - static std::string from_string( const std::string &v ) { - return v; + static int from_string( const std::string &v ) { + return std::stoi( v ); } }; +template<> +struct convert : convert_string {}; + +template<> +struct convert : convert_string_id {}; + +template<> +struct convert : convert_string_id {}; + +template<> +struct convert : convert_enum {}; + +template<> +struct convert : convert_string {}; + +template<> +struct convert : convert_int_id {}; + +template<> +struct convert : convert_string_id {}; + +template<> +struct convert : convert_string {}; + +template<> +struct convert : convert_string_id {}; + +template<> +struct convert : convert_string_id {}; + } // namespace cata_variant_detail class cata_variant { public: + // Default constructor for an 'empty' variant (you can't get a value + // from it). + cata_variant() : type_( cata_variant_type::void_ ) {} + // Constructor that attempts to infer the type from the type of the // value passed. template < typename Value, @@ -152,8 +272,8 @@ class cata_variant auto get() const -> typename cata_variant_detail::convert::type { if( type_ != Type ) { debugmsg( "Tried to extract type %s from cata_variant which contained %s", - cata_variant_detail::to_string( Type ), - cata_variant_detail::to_string( type_ ) ); + io::enum_to_string( Type ), + io::enum_to_string( type_ ) ); return {}; } return cata_variant_detail::convert::from_string( value_ ); @@ -168,6 +288,24 @@ class cata_variant return value_; } + std::pair as_pair() const { + return std::make_pair( type_, value_ ); + } + + void serialize( JsonOut & ) const; + void deserialize( JsonIn & ); + +#define CATA_VARIANT_OPERATOR(op) \ + friend bool operator op( const cata_variant &l, const cata_variant &r ) { \ + return l.as_pair() op r.as_pair(); \ + } + CATA_VARIANT_OPERATOR( == ); + CATA_VARIANT_OPERATOR( != ); + CATA_VARIANT_OPERATOR( < ); + CATA_VARIANT_OPERATOR( <= ); + CATA_VARIANT_OPERATOR( > ); + CATA_VARIANT_OPERATOR( >= ); +#undef CATA_VARIANT_OPERATOR private: explicit cata_variant( cata_variant_type t, std::string &&v ) : type_( t ) @@ -178,4 +316,23 @@ class cata_variant std::string value_; }; +namespace std +{ + +template<> +struct hash { + size_t operator()( const cata_variant_type v ) const noexcept { + return static_cast( v ); + } +}; + +template<> +struct hash { + size_t operator()( const cata_variant &v ) const noexcept { + return cata::tuple_hash()( v.as_pair() ); + } +}; + +} // namespace std + #endif // CATA_VARIANT_H diff --git a/src/catacharset.cpp b/src/catacharset.cpp index 1f12aa72a35bb..8d21e1bc06794 100644 --- a/src/catacharset.cpp +++ b/src/catacharset.cpp @@ -5,6 +5,7 @@ #include #include "options.h" +#include "output.h" #include "wcwidth.h" #if defined(_WIN32) @@ -140,26 +141,17 @@ std::string utf32_to_utf8( uint32_t ch ) //CJK characters have a width of 2, etc int utf8_width( const char *s, const bool ignore_tags ) { + if( ignore_tags ) { + return utf8_width( remove_color_tags( s ) ); + } int len = strlen( s ); const char *ptr = s; int w = 0; - bool inside_tag = false; while( len > 0 ) { uint32_t ch = UTF8_getch( &ptr, &len ); if( ch == UNKNOWN_UNICODE ) { continue; } - if( ignore_tags ) { - if( ch == '<' ) { - inside_tag = true; - } else if( ch == '>' ) { - inside_tag = false; - continue; - } - if( inside_tag ) { - continue; - } - } w += mk_wcwidth( ch ); } return w; diff --git a/src/character.cpp b/src/character.cpp index 9c68500014254..c161e15485148 100644 --- a/src/character.cpp +++ b/src/character.cpp @@ -14,8 +14,10 @@ #include "avatar.h" #include "bionics.h" #include "cata_utility.h" +#include "construction.h" #include "debug.h" #include "effect.h" +#include "event_bus.h" #include "field.h" #include "game.h" #include "game_constants.h" @@ -64,6 +66,7 @@ const efftype_id effect_downed( "downed" ); const efftype_id effect_drunk( "drunk" ); const efftype_id effect_foodpoison( "foodpoison" ); const efftype_id effect_grabbed( "grabbed" ); +const efftype_id effect_grabbing( "grabbing" ); const efftype_id effect_heavysnare( "heavysnare" ); const efftype_id effect_infected( "infected" ); const efftype_id effect_in_pit( "in_pit" ); @@ -582,8 +585,7 @@ bool Character::move_effects( bool attacking ) } else { for( auto &&dest : g->m.points_in_radius( pos(), 1, 0 ) ) { // *NOPAD* const monster *const mon = g->critter_at( dest ); - if( mon && ( mon->has_flag( MF_GRABS ) || - mon->type->has_special_attack( "GRAB" ) ) ) { + if( mon && mon->has_effect( effect_grabbing ) ) { zed_number += mon->get_grab_strength(); } } @@ -604,6 +606,12 @@ bool Character::move_effects( bool attacking ) add_msg_player_or_npc( m_good, _( "You break out of the grab!" ), _( " breaks out of the grab!" ) ); remove_effect( effect_grabbed ); + for( auto &&dest : g->m.points_in_radius( pos(), 1, 0 ) ) { // *NOPAD* + monster *mon = g->critter_at( dest ); + if( mon && mon->has_effect( effect_grabbing ) ) { + mon->remove_effect( effect_grabbing ); + } + } } } } @@ -805,9 +813,14 @@ float Character::get_vision_threshold( float light_level ) const threshold_for_range( range ) * dimming_from_light ); } +void Character::flag_encumbrance() +{ + check_encumbrance = true; +} + void Character::check_item_encumbrance_flag() { - bool update_required = false; + bool update_required = check_encumbrance; for( auto &i : worn ) { if( !update_required && i.has_flag( "ENCUMBRANCE_UPDATE" ) ) { update_required = true; @@ -820,6 +833,15 @@ void Character::check_item_encumbrance_flag() } } +std::vector Character::get_bionics() const +{ + std::vector result; + for( const bionic &b : *my_bionics ) { + result.push_back( b.id ); + } + return result; +} + bool Character::has_bionic( const bionic_id &b ) const { for( auto &i : *my_bionics ) { @@ -876,6 +898,17 @@ std::vector Character::get_bionic_fueled_with( const item &it ) const return bionics; } +std::vector Character::get_fueled_bionics() const +{ + std::vector bionics; + for( const bionic bio : *my_bionics ) { + if( !bio.info().fuel_opts.empty() ) { + bionics.emplace_back( bio.id ); + } + } + return bionics; +} + bionic_id Character::get_most_efficient_bionic( const std::vector &bids ) const { float temp_eff = 0; @@ -1397,28 +1430,48 @@ units::mass Character::weight_carried_with_tweaks( const item_tweaks &tweaks ) c const std::map &without = tweaks.without_items ? tweaks.without_items->get() : empty; + // Worn items units::mass ret = 0_gram; for( auto &i : worn ) { if( !without.count( &i ) ) { ret += i.weight(); } } + + // Items in inventory const inventory &i = tweaks.replace_inv ? tweaks.replace_inv->get() : inv; ret += i.weight_without( without ); - if( !without.count( &weapon ) ) { - - const units::mass thisweight = weapon.weight(); - if( thisweight + ret > weight_capacity() ) { - const float liftrequirement = ceil( units::to_gram( thisweight ) / units::to_gram - ( TOOL_LIFT_FACTOR ) ); - if( g->new_game || best_nearby_lifting_assist() < liftrequirement ) { - ret += thisweight; + // Wielded item + units::mass weaponweight = 0_gram; + auto weapon_it = without.find( &weapon ); + if( weapon_it == without.end() ) { + weaponweight = weapon.weight(); + } else { + int subtract_count = ( *weapon_it ).second; + if( weapon.count_by_charges() ) { + item copy = weapon; + copy.charges -= subtract_count; + if( copy.charges < 0 ) { + debugmsg( "Trying to remove more charges than the wielded item has" ); + copy.charges = 0; } - } else { - ret += thisweight; + weaponweight = copy.weight(); + } else if( subtract_count > 1 ) { + debugmsg( "Trying to remove more than one wielded item" ); + } + } + // Exclude wielded item if using lifting tool + if( weaponweight + ret > weight_capacity() ) { + const float liftrequirement = ceil( units::to_gram( weaponweight ) / units::to_gram + ( TOOL_LIFT_FACTOR ) ); + if( g->new_game || best_nearby_lifting_assist() < liftrequirement ) { + ret += weaponweight; } + } else { + ret += weaponweight; } + return ret; } @@ -1680,6 +1733,14 @@ bool Character::meets_skill_requirements( const std::map &req, return _skills->meets_skill_requirements( req, context ); } +bool Character::meets_skill_requirements( const construction &con ) const +{ + return std::all_of( con.required_skills.begin(), con.required_skills.end(), + [&]( const std::pair &pr ) { + return get_skill_level( pr.first ) >= pr.second; + } ); +} + bool Character::meets_stat_requirements( const item &it ) const { return get_str() >= it.get_min_str() && @@ -1828,7 +1889,8 @@ bool Character::has_nv() if( !nv_cached ) { nv_cached = true; nv = ( worn_with_flag( "GNV_EFFECT" ) || - has_active_bionic( bionic_id( "bio_night_vision" ) ) ); + has_active_bionic( bionic_id( "bio_night_vision" ) ) || + has_effect_with_flag( "EFFECT_NIGHT_VISION" ) ); } return nv; @@ -3787,8 +3849,7 @@ void Character::shout( std::string msg, bool order ) void Character::vomit() { - add_memorial_log( pgettext( "memorial_male", "Threw up." ), - pgettext( "memorial_female", "Threw up." ) ); + g->events().send( getID() ); if( stomach.contains() != 0_ml ) { // empty stomach contents @@ -3859,3 +3920,8 @@ void Character::healed_bp( int bp, int amount ) { healed_total[bp] += amount; } + +void Character::set_fac_id( const std::string &my_fac_id ) +{ + fac_id = string_id( my_fac_id ); +} diff --git a/src/character.h b/src/character.h index 24cac55acfc35..b45141c80e55f 100644 --- a/src/character.h +++ b/src/character.h @@ -49,6 +49,8 @@ class vehicle; struct mutation_branch; class bionic_collection; struct points_left; +class faction; +struct construction; enum vision_modes { DEBUG_NIGHTVISION, @@ -168,6 +170,13 @@ class Character : public Creature, public visitable Character &operator=( const Character & ) = delete; ~Character() override; + Character *as_character() override { + return this; + } + const Character *as_character() const override { + return this; + } + character_id getID() const; // sets the ID, will *only* succeed when the current id is not valid void setID( character_id i ); @@ -280,6 +289,12 @@ class Character : public Creature, public visitable /** Returns the name of the player's outer layer, e.g. "armor plates" */ std::string skin_name() const override; + /* returns the character's faction */ + virtual faction *get_faction() const { + return nullptr; + } + void set_fac_id( const std::string &my_fac_id ); + /* Adjusts provided sight dispersion to account for player stats */ int effective_dispersion( int dispersion ) const; @@ -369,6 +384,10 @@ class Character : public Creature, public visitable * to simulate glare, etc, night vision only works if you are in the dark. */ float get_vision_threshold( float light_level ) const; + /** + * Flag encumbrance for updating. + */ + void flag_encumbrance(); /** * Checks worn items for the "RESET_ENCUMBRANCE" flag, which indicates * that encumbrance may have changed and require recalculating. @@ -473,6 +492,7 @@ class Character : public Creature, public visitable float mutation_armor( body_part bp, const damage_unit &du ) const; // --------------- Bionic Stuff --------------- + std::vector get_bionics() const; /** Returns true if the player has the entered bionic id */ bool has_bionic( const bionic_id &b ) const; /** Returns true if the player has the entered bionic id and it is powered on */ @@ -481,8 +501,10 @@ class Character : public Creature, public visitable bool has_any_bionic() const; /**Returns true if the character can fuel a bionic with the item*/ bool can_fuel_bionic_with( const item &it ) const; - /**Return bionic_id of bionics able to use fuel*/ + /**Return bionic_id of bionics able to use it as fuel*/ std::vector get_bionic_fueled_with( const item &it ) const; + /**Return bionic_id of fueled bionics*/ + std::vector get_fueled_bionics() const; /**Return bionic_id of bionic of most fuel efficient bionic*/ bionic_id get_most_efficient_bionic( const std::vector &bids ) const; /**Return list of available fuel for this bionic*/ @@ -729,6 +751,8 @@ class Character : public Creature, public visitable /** Checks whether the character's skills meet the required */ bool meets_skill_requirements( const std::map &req, const item &context = item() ) const; + /** Checks whether the character's skills meet the required */ + bool meets_skill_requirements( const construction &con ) const; /** Checks whether the character's stats meets the stats required by the item */ bool meets_stat_requirements( const item &it ) const; /** Checks whether the character meets overall requirements to be able to use the item */ @@ -848,6 +872,8 @@ class Character : public Creature, public visitable int radiation; std::shared_ptr mounted_creature; + // for loading NPC mounts + int mounted_creature_id; void initialize_stomach_contents(); @@ -980,6 +1006,13 @@ class Character : public Creature, public visitable */ mutable pimpl path_settings; + // faction API versions + // 2 - allies are in your_followers faction; NPCATT_FOLLOW is follower but not an ally + // 0 - allies may be in your_followers faction; NPCATT_FOLLOW is an ally (legacy) + int faction_api_version = 2; // faction API versioning + string_id fac_id; // A temp variable used to inform the game which faction to link + faction *my_fac = nullptr; + private: // A unique ID number, assigned by the game class. Values should never be reused. character_id id; @@ -993,6 +1026,7 @@ class Character : public Creature, public visitable int fatigue; int sleep_deprivation; + bool check_encumbrance; }; #endif diff --git a/src/clone_ptr.h b/src/clone_ptr.h new file mode 100644 index 0000000000000..34a9d7eef64db --- /dev/null +++ b/src/clone_ptr.h @@ -0,0 +1,65 @@ +#ifndef CATA_CLONE_PTR_H +#define CATA_CLONE_PTR_H + +#include + +namespace cata +{ + +template +class clone_ptr +{ + public: + clone_ptr() = default; + clone_ptr( std::nullptr_t ) {} + clone_ptr( const clone_ptr &other ) : p_( other.p_ ? other.p_->clone() : nullptr ) {} + clone_ptr( clone_ptr && ) = default; + clone_ptr &operator=( const clone_ptr &other ) { + p_ = other.p_ ? other.p_->clone() : nullptr; + return *this; + } + clone_ptr &operator=( clone_ptr && ) = default; + + // implicit conversion from unique_ptr + template + clone_ptr( std::unique_ptr p ) : p_( std::move( p ) ) {} + + T &operator*() { + return *p_; + } + const T &operator*() const { + return *p_; + } + T *operator->() { + return p_.get(); + } + const T *operator->() const { + return p_.get(); + } + T *get() { + return p_.get(); + } + const T *get() const { + return p_.get(); + } + + explicit operator bool() const { + return !!*this; + } + bool operator!() const { + return !p_; + } + + friend bool operator==( const clone_ptr &l, const clone_ptr &r ) { + return l.p_ == r.p_; + } + friend bool operator!=( const clone_ptr &l, const clone_ptr &r ) { + return l.p_ != r.p_; + } + private: + std::unique_ptr p_; +}; + +} // namespace cata + +#endif // CATA_CLONE_PTR_H diff --git a/src/clzones.cpp b/src/clzones.cpp index c61972b506620..1990e00f38696 100644 --- a/src/clzones.cpp +++ b/src/clzones.cpp @@ -123,6 +123,9 @@ zone_manager::zone_manager() types.emplace( zone_type_id( "LOOT_ARTIFACTS" ), zone_type( translate_marker( "Loot: Artifacts" ), translate_marker( "Destination for artifacts" ) ) ); + types.emplace( zone_type_id( "LOOT_CORPSE" ), + zone_type( translate_marker( "Loot: Corpses" ), + translate_marker( "Destination for corpses" ) ) ); types.emplace( zone_type_id( "LOOT_ARMOR" ), zone_type( translate_marker( "Loot: Armor" ), translate_marker( "Destination for armor. Does include filthy armor if such zone is not specified." ) ) ); @@ -138,12 +141,25 @@ zone_manager::zone_manager() types.emplace( zone_type_id( "LOOT_IGNORE" ), zone_type( translate_marker( "Loot: Ignore" ), translate_marker( "Items inside of this zone are ignored by \"sort out loot\" zone-action." ) ) ); + types.emplace( zone_type_id( "SOURCE_FIREWOOD" ), + zone_type( translate_marker( "Source: Firewood" ), + translate_marker( "Source for firewood or other flammable materials in this zone may be used to automatically refuel fires. " + "This will be done to maintain light during long-running tasks such as crafting, reading or waiting." ) ) ); types.emplace( zone_type_id( "CONSTRUCTION_BLUEPRINT" ), zone_type( translate_marker( "Construction: Blueprint" ), translate_marker( "Designate a blueprint zone for construction." ) ) ); types.emplace( zone_type_id( "FARM_PLOT" ), zone_type( translate_marker( "Farm: Plot" ), translate_marker( "Designate a farm plot for tilling and planting." ) ) ); + types.emplace( zone_type_id( "CHOP_TREES" ), + zone_type( translate_marker( "Chop Trees" ), + translate_marker( "Designate an area to chop down trees." ) ) ); + types.emplace( zone_type_id( "FISHING_SPOT" ), + zone_type( translate_marker( "Fishing Spot" ), + translate_marker( "Designate an area to fish from." ) ) ); + types.emplace( zone_type_id( "VEHICLE_DECONSTRUCT" ), + zone_type( translate_marker( "Vehicle Deconstruct Zone" ), + translate_marker( "Any vehicles in this area are marked for deconstruction." ) ) ); types.emplace( zone_type_id( "CAMP_FOOD" ), zone_type( translate_marker( "Basecamp: Food" ), translate_marker( "Items in this zone will be added to a basecamp's food supply in the Distribute Food mission." ) ) ); @@ -187,19 +203,48 @@ bool zone_options::is_valid( const zone_type_id &type, const zone_options &optio return !options.has_options(); } +int blueprint_options::get_final_construction( + const std::vector &list_constructions, + int idx, + std::set &skip_index +) +{ + const construction &con = list_constructions[idx]; + if( con.post_terrain.empty() ) { + return idx; + } + + if( string_ends_with( con.post_terrain, "_half" ) || + string_ends_with( con.post_terrain, "_halfway" ) ) { + for( int i = 0; i < static_cast( list_constructions.size() ); ++i ) { + if( i == idx || skip_index.find( i ) != skip_index.end() ) { + continue; + } + const construction &con_next = list_constructions[i]; + if( con.description == con_next.description && + con.post_terrain == con_next.pre_terrain ) { + skip_index.insert( idx ); + return get_final_construction( list_constructions, i, skip_index ); + } + } + } + return idx; +} + blueprint_options::query_con_result blueprint_options::query_con() { int con_index = construction_menu( true ); if( con_index > -1 ) { const std::vector &list_constructions = get_constructions(); - std::string chosen_desc = list_constructions[con_index].description; - std::string chosen_mark; - if( !list_constructions[con_index].post_terrain.empty() ) { - chosen_mark = list_constructions[con_index].post_terrain; - } else { - chosen_mark = con; - } - if( chosen_desc != con || chosen_mark != mark || con_index != index ) { + std::set skip_index; + con_index = get_final_construction( list_constructions, con_index, skip_index ); + + const construction &chosen = list_constructions[con_index]; + + const std::string &chosen_desc = chosen.description; + const std::string &chosen_mark = chosen.post_terrain; + + if( con_index != index || chosen_desc != con || chosen_mark != mark ) { con = chosen_desc; mark = chosen_mark; index = con_index; @@ -800,6 +845,11 @@ zone_type_id zone_manager::get_near_zone_type_for_item( const item &it, return zone_type_id( "LOOT_WOOD" ); } } + if( it.is_corpse() ) { + if( has_near( zone_type_id( "LOOT_CORPSE" ), where, range ) ) { + return zone_type_id( "LOOT_CORPSE" ); + } + } if( cat.id() == "food" ) { const bool preserves = it.is_food_container() && it.type->container->preserves; diff --git a/src/clzones.h b/src/clzones.h index 7f085cebdb2ff..774cf58288141 100644 --- a/src/clzones.h +++ b/src/clzones.h @@ -11,6 +11,7 @@ #include #include #include +#include #include "optional.h" #include "point.h" @@ -23,6 +24,7 @@ class JsonObject; class item; class faction; class map; +struct construction; using faction_id = string_id; const faction_id your_fac( "your_followers" ); @@ -158,6 +160,11 @@ class blueprint_options : public zone_options, public mark_option return true; } + int get_final_construction( + const std::vector &list_constructions, + int idx, + std::set &skip_index ); + bool query_at_creation() override; bool query() override; diff --git a/src/computer.cpp b/src/computer.cpp index fabf891086894..7ec413b3d8116 100644 --- a/src/computer.cpp +++ b/src/computer.cpp @@ -14,8 +14,8 @@ #include "avatar.h" #include "coordinate_conversions.h" #include "debug.h" +#include "event_bus.h" #include "explosion.h" -#include "timed_event.h" #include "field.h" #include "game.h" #include "input.h" @@ -38,6 +38,7 @@ #include "sounds.h" #include "string_formatter.h" #include "text_snippets.h" +#include "timed_event.h" #include "translations.h" #include "trap.h" #include "color.h" @@ -55,7 +56,6 @@ const mtype_id mon_manhack( "mon_manhack" ); const mtype_id mon_secubot( "mon_secubot" ); -const mtype_id mon_turret( "mon_turret" ); const mtype_id mon_turret_rifle( "mon_turret_rifle" ); const skill_id skill_computer( "computer" ); @@ -360,8 +360,7 @@ static void remove_submap_turrets() for( monster &critter : g->all_monsters() ) { // Check 1) same overmap coords, 2) turret, 3) hostile if( ms_to_omt_copy( g->m.getabs( critter.pos() ) ) == ms_to_omt_copy( g->m.getabs( g->u.pos() ) ) && - ( critter.type->id == mon_turret || - critter.type->id == mon_turret_rifle ) && + ( critter.type->id == mon_turret_rifle ) && critter.attitude_to( g->u ) == Creature::Attitude::A_HOSTILE ) { g->remove_zombie( critter ); } @@ -408,8 +407,8 @@ void computer::activate_function( computer_action action ) //Toll is required for the church computer/mechanism to function case COMPACT_TOLL: - //~ the sound of a church bell ringing sounds::sound( g->u.pos(), 120, sounds::sound_t::music, + //~ the sound of a church bell ringing _( "Bohm... Bohm... Bohm..." ), true, "environment", "church_bells" ); break; @@ -452,8 +451,7 @@ void computer::activate_function( computer_action action ) break; case COMPACT_RELEASE: - g->u.add_memorial_log( pgettext( "memorial_male", "Released subspace specimens." ), - pgettext( "memorial_female", "Released subspace specimens." ) ); + g->events().send(); sounds::sound( g->u.pos(), 40, sounds::sound_t::alarm, _( "an alarm sound!" ), false, "environment", "alarm" ); g->m.translate_radius( t_reinforced_glass, t_thconc_floor, 25.0, g->u.pos(), true ); @@ -472,8 +470,7 @@ void computer::activate_function( computer_action action ) break; case COMPACT_TERMINATE: - g->u.add_memorial_log( pgettext( "memorial_male", "Terminated subspace specimens." ), - pgettext( "memorial_female", "Terminated subspace specimens." ) ); + g->events().send(); for( int x = 0; x < MAPSIZE_X; x++ ) { for( int y = 0; y < MAPSIZE_Y; y++ ) { tripoint p( x, y, g->u.posz() ); @@ -491,8 +488,7 @@ void computer::activate_function( computer_action action ) break; case COMPACT_PORTAL: { - g->u.add_memorial_log( pgettext( "memorial_male", "Opened a portal." ), - pgettext( "memorial_female", "Opened a portal." ) ); + g->events().send(); tripoint tmp = g->u.pos(); int &i = tmp.x; int &j = tmp.y; @@ -525,8 +521,7 @@ void computer::activate_function( computer_action action ) if( !query_bool( _( "WARNING: Resonance cascade carries severe risk! Continue?" ) ) ) { return; } - g->u.add_memorial_log( pgettext( "memorial_male", "Caused a resonance cascade." ), - pgettext( "memorial_female", "Caused a resonance cascade." ) ); + g->events().send(); std::vector cascade_points; for( const tripoint &dest : g->m.points_in_radius( g->u.pos(), 10 ) ) { if( g->m.ter( dest ) == t_radio_tower ) { @@ -648,18 +643,15 @@ void computer::activate_function( computer_action action ) g->refresh_all(); //Put some smoke gas and explosions at the nuke location. - for( int i = g->u.posx() + 8; i < g->u.posx() + 15; i++ ) { - for( int j = g->u.posy() + 3; j < g->u.posy() + 12; j++ ) { - if( !one_in( 4 ) ) { - tripoint dest( i + rng( -2, 2 ), j + rng( -2, 2 ), g->u.posz() ); - g->m.add_field( dest, fd_smoke, rng( 1, 9 ) ); - } + const tripoint nuke_location = { g->u.pos() - point( 12, 0 ) }; + for( const auto &loc : g->m.points_in_radius( nuke_location, 5, 0 ) ) { + if( one_in( 4 ) ) { + g->m.add_field( loc, fd_smoke, rng( 1, 9 ) ); } } - explosion_handler::explosion( tripoint( g->u.posx() + 10, g->u.posx() + 21, g->get_levz() ), 200, - 0.7, - true ); //Only explode once. But make it large. + //Only explode once. But make it large. + explosion_handler::explosion( nuke_location, 2000, 0.7, true ); //...ERASE MISSILE, OPEN SILO, DISABLE COMPUTER // For each level between here and the surface, remove the missile @@ -676,10 +668,7 @@ void computer::activate_function( computer_action action ) } const oter_id oter = overmap_buffer.ter( target ); - //~ %s is terrain name - g->u.add_memorial_log( pgettext( "memorial_male", "Launched a nuke at a %s." ), - pgettext( "memorial_female", "Launched a nuke at a %s." ), - oter->get_name() ); + g->events().send( oter ); for( int x = target.x - 2; x <= target.x + 2; x++ ) { for( int y = target.y - 2; y <= target.y + 2; y++ ) { // give it a nice rounded shape @@ -700,8 +689,7 @@ void computer::activate_function( computer_action action ) case COMPACT_MISS_DISARM: // TODO: stop the nuke from creating radioactive clouds. if( query_yn( _( "Disarm missile." ) ) ) { - g->u.add_memorial_log( pgettext( "memorial_male", "Disarmed a nuclear missile." ), - pgettext( "memorial_female", "Disarmed a nuclear missile." ) ); + g->events().send(); add_msg( m_info, _( "Nuclear missile disarmed!" ) ); //disable missile. options.clear(); @@ -799,9 +787,8 @@ void computer::activate_function( computer_action action ) } g->u.moves -= 30; reset_terminal(); - print_line( _( "\ -SITE %d%d%d\n\ -PERTINENT FOREMAN LOGS WILL BE PREPENDED TO NOTES" ), + print_line( _( "SITE %d%d%d\n" + "PERTINENT FOREMAN LOGS WILL BE PREPENDED TO NOTES" ), g->get_levx(), g->get_levy(), abs( g->get_levz() ) ); print_text( "%s", SNIPPET.get( SNIPPET.assign( "amigara4" ) ) ); print_gibberish_line(); @@ -956,27 +943,26 @@ PERTINENT FOREMAN LOGS WILL BE PREPENDED TO NOTES" ), case COMPACT_DISCONNECT: reset_terminal(); - print_line( _( "\n\ -ERROR: NETWORK DISCONNECT \n\ -UNABLE TO REACH NETWORK ROUTER OR PROXY. PLEASE CONTACT YOUR\n\ -SYSTEM ADMINISTRATOR TO RESOLVE THIS ISSUE.\n\ - \n" ) ); + print_line( _( "\n" + "ERROR: NETWORK DISCONNECT \n" + "UNABLE TO REACH NETWORK ROUTER OR PROXY. PLEASE CONTACT YOUR\n" + "SYSTEM ADMINISTRATOR TO RESOLVE THIS ISSUE.\n" + " \n" ) ); query_any( _( "Press any key to continue..." ) ); break; case COMPACT_EMERG_MESS: - print_line( _( "\ -GREETINGS CITIZEN. A BIOLOGICAL ATTACK HAS TAKEN PLACE AND A STATE OF \n\ -EMERGENCY HAS BEEN DECLARED. EMERGENCY PERSONNEL WILL BE AIDING YOU \n\ -SHORTLY. TO ENSURE YOUR SAFETY PLEASE FOLLOW THE STEPS BELOW. \n\ -\n\ -1. DO NOT PANIC. \n\ -2. REMAIN INSIDE THE BUILDING. \n\ -3. SEEK SHELTER IN THE BASEMENT. \n\ -4. USE PROVIDED GAS MASKS. \n\ -5. AWAIT FURTHER INSTRUCTIONS. \n\ -\n\ - \n" ) ); + print_line( _( "GREETINGS CITIZEN. A BIOLOGICAL ATTACK HAS TAKEN PLACE AND A STATE OF \n" + "EMERGENCY HAS BEEN DECLARED. EMERGENCY PERSONNEL WILL BE AIDING YOU \n" + "SHORTLY. TO ENSURE YOUR SAFETY PLEASE FOLLOW THE STEPS BELOW. \n" + "\n" + "1. DO NOT PANIC. \n" + "2. REMAIN INSIDE THE BUILDING. \n" + "3. SEEK SHELTER IN THE BASEMENT. \n" + "4. USE PROVIDED GAS MASKS. \n" + "5. AWAIT FURTHER INSTRUCTIONS. \n" + "\n" + " \n" ) ); query_any( _( "Press any key to continue..." ) ); break; @@ -987,209 +973,69 @@ SHORTLY. TO ENSURE YOUR SAFETY PLEASE FOLLOW THE STEPS BELOW. \n\ break; case COMPACT_TOWER_UNRESPONSIVE: - print_line( _( "\ - WARNING, RADIO TOWER IS UNRESPONSIVE. \n\ - \n\ - BACKUP POWER INSUFFICIENT TO MEET BROADCASTING REQUIREMENTS. \n\ - IN THE EVENT OF AN EMERGENCY, CONTACT LOCAL NATIONAL GUARD \n\ - UNITS TO RECEIVE PRIORITY WHEN GENERATORS ARE BEING DEPLOYED. \n\ - \n\ - \n" ) ); + print_line( _( " WARNING, RADIO TOWER IS UNRESPONSIVE. \n" + " \n" + " BACKUP POWER INSUFFICIENT TO MEET BROADCASTING REQUIREMENTS. \n" + " IN THE EVENT OF AN EMERGENCY, CONTACT LOCAL NATIONAL GUARD \n" + " UNITS TO RECEIVE PRIORITY WHEN GENERATORS ARE BEING DEPLOYED. \n" + " \n" + " \n" ) ); query_any( _( "Press any key to continue..." ) ); break; case COMPACT_SR1_MESS: reset_terminal(); - print_line( _( "\n\ - Subj: Security Reminder\n\ - To: all SRCF staff\n\ - From: Constantine Dvorak, Undersecretary of Nuclear Security\n\ - \n\ - I want to remind everyone on staff: Do not open or examine\n\ - containers above your security-clearance. If you have some\n\ - question about safety protocols or shipping procedures, please\n\ - contact your SRCF administrator or on-site military officer.\n\ - When in doubt, assume all containers are Class-A Biohazards\n\ - and highly toxic. Take full precautions!\n\ - \n" ) ); + print_text( "%s", SNIPPET.get( SNIPPET.assign( "sr1_mess" ) ) ); query_any( _( "Press any key to continue..." ) ); break; case COMPACT_SR2_MESS: reset_terminal(); - print_line( _( "\n\ - Subj: Security Reminder\n\ - To: all SRCF staff\n\ - From: Constantine Dvorak, Undersecretary of Nuclear Security\n\ - \n\ - From today onward medical wastes are not to be stored anywhere\n\ - near radioactive materials. All containers are to be\n\ - re-arranged according to these new regulations. If your\n\ - facility currently has these containers stored in close\n\ - proximity, you are to work with armed guards on duty at all\n\ - times. Report any unusual activity to your SRCF administrator\n\ - at once.\n\ - " ) ); + print_text( "%s", SNIPPET.get( SNIPPET.assign( "sr2_mess" ) ) ); query_any( _( "Press any key to continue..." ) ); break; case COMPACT_SR3_MESS: reset_terminal(); - print_line( _( "\n\ - Subj: Security Reminder\n\ - To: all SRCF staff\n\ - From: Constantine Dvorak, Undersecretary of Nuclear Security\n\ - \n\ - Worker health and safety is our number one concern! As such,\n\ - we are instituting weekly health examinations for all SRCF\n\ - employees. Report any unusual symptoms or physical changes\n\ - to your SRCF administrator at once.\n\ - " ) ); + print_text( "%s", SNIPPET.get( SNIPPET.assign( "sr3_mess" ) ) ); query_any( _( "Press any key to continue..." ) ); break; case COMPACT_SR4_MESS: reset_terminal(); - print_line( _( "\n\ - Subj: Security Reminder\n\ - To: all SRCF staff\n\ - From: Constantine Dvorak, Undersecretary of Nuclear Security\n\ - \n\ - All compromised facilities will remain under lock down until\n\ - further notice. Anyone who has seen or come in direct contact\n\ - with the creatures is to report to the home office for a full\n\ - medical evaluation and security debriefing.\n\ - " ) ); + print_text( "%s", SNIPPET.get( SNIPPET.assign( "sr4_mess" ) ) ); query_any( _( "Press any key to continue..." ) ); break; case COMPACT_SRCF_1_MESS: reset_terminal(); - print_line( _( "\n\ - Subj: EPA: Report All Potential Containment Breaches 3873643\n\ - To: all SRCF staff\n\ - From: Robert Shane, Director of the EPA\n\ - \n\ - All hazardous waste dumps and sarcophagi must submit three\n\ - samples from each operational leache system to the following\n\ - addresses:\n\ - \n\ - CDC Bioterrorism Lab \n\ - Building 10\n\ - Corporate Square Boulevard\n\ - Atlanta, GA 30329\n\ - \n\ - EPA Region 8 Laboratory\n\ - 16194 W. 45th Drive\n\ - Golden, Colorado 80403\n\ - \n\ - These samples must be accurate and any attempts to cover\n\ - incompetencies will result in charges of Federal Corruption\n\ - and potentially Treason.\n" ) ); - query_any( _( "Press any key to continue..." ) ); - reset_terminal(); - print_line( _( "Director of the EPA,\n\ - Robert Shane\n\ - \n" ) ); + print_text( "%s", SNIPPET.get( SNIPPET.assign( "scrf_1_mess" ) ) ); query_any( _( "Press any key to continue..." ) ); break; case COMPACT_SRCF_2_MESS: reset_terminal(); - print_line( _( " Subj: SRCF: Internal Memo, EPA [2918024]\n\ - To: all SRCF admin staff\n\ - From: Constantine Dvorak, Undersecretary of Nuclear Security\n\ - \n\ - Director Grimes has released a new series of accusations that\n\ - will soon be investigated by a Congressional committee. Below\n\ - is the message that he sent me.\n\ - \n\ - --------------------------------------------------------------\n\ - Subj: Congressional Investigations\n\ - To: Constantine Dvorak, Undersecretary of Nuclear Safety\n\ - From: Robert Shane, director of the EPA\n\ - \n\ - The EPA has opposed the Security-Restricted Containment\n\ - Facility (SRCF) project from its inception. We were horrified\n\ - that these facilities would be constructed so close to populated\n\ - areas, and only agreed to sign-off on the project if we were\n\ - allowed to freely examine and monitor the sarcophagi. But that\n\ - has not happened. Since then, the DoE has employed any and all\n\ - means to keep EPA agents from visiting the SRCFs, using military\n\ - secrecy, emergency powers, and inter-departmental gag orders to\n" ) ); + print_text( "%s", SNIPPET.get( SNIPPET.assign( "scrf_2_1_mess" ) ) ); query_any( _( "Press any key to continue..." ) ); reset_terminal(); - print_line( _( " surround the project with an impenetrable thicket of red tape.\n\ - \n\ - Although our agents have not been allowed inside, our atmospheric\n\ - testers in nearby communities have detected high levels of toxins\n\ - and radiation, and we've found dozens of potentially dangerous\n\ - unidentified compounds in the ground water. We now have\n\ - conclusive evidence that the SRCFs are a threat to the public\n\ - safety. We are taking these data to state representatives and\n\ - petitioning for a full Congressional inquiry. They should be\n\ - able to force open your secret vaults, and the world will see\n\ - what you've been hiding.\n\ - \n\ - If you had any hand in this outbreak I hope you rot in hell.\n\ - \n\ - Director of the EPA,\n\ - Robert Shane\n\ - \n" ) ); + print_text( "%s", SNIPPET.get( SNIPPET.assign( "scrf_2_2_mess" ) ) ); query_any( _( "Press any key to continue..." ) ); break; case COMPACT_SRCF_3_MESS: reset_terminal(); - print_line( _( " Subj: CDC: Internal Memo, Standby [2918115]\n\ - To: all SRCF staff\n\ - From: Ellen Grimes, Director of the CDC\n\ - \n\ - Your site along with many others has been found to be\n\ - contaminated with what we will now refer to as [redacted].\n\ - It is vital that you standby for further orders. We are\n\ - currently awaiting the President to decide our course of\n\ - action in this national crisis. You will proceed with fail-\n\ - safe procedures and rig the sarcophagus with C-4 as outlined\n\ - in Publication 4423. We will send you orders to either detonate\n\ - and seal the sarcophagus or remove the charges. It is of the\n\ - utmost importance that the facility be sealed immediately when\n\ - the orders are given. We have been alerted by Homeland Security\n\ - that there are potential terrorist suspects that are being\n\ - detained in connection with the recent national crisis.\n\ - \n\ - Director of the CDC,\n\ - Ellen Grimes\n\ - \n" ) ); + print_text( "%s", SNIPPET.get( SNIPPET.assign( "scrf_3_mess" ) ) ); query_any( _( "Press any key to continue..." ) ); break; case COMPACT_SRCF_SEAL_ORDER: reset_terminal(); - print_line( _( " Subj: USARMY: SEAL SRCF [987167]\n\ - To: all SRCF staff\n\ - From: Major General Cornelius, U.S. Army\n\ - \n\ - As a general warning to all civilian staff: the 10th Mountain\n\ - Division has been assigned to oversee the sealing of the SRCF\n\ - facilities. By direct order, all non-essential staff must vacate\n\ - at the earliest possible opportunity to prevent potential\n\ - contamination. Low yield tactical nuclear demolition charges\n\ - will be deployed in the lower tunnels to ensure that recovery\n\ - of hazardous material is impossible. The Army Corps of Engineers\n\ - will then dump concrete over the rubble so that we can redeploy \n\ - the 10th Mountain into the greater Boston area.\n\ - \n\ - Cornelius,\n\ - Major General, U.S. Army\n\ - Commander of the 10th Mountain Division\n\ - \n" ) ); + print_text( "%s", SNIPPET.get( SNIPPET.assign( "scrf_seal_order" ) ) ); query_any( _( "Press any key to continue..." ) ); break; case COMPACT_SRCF_SEAL: - g->u.add_memorial_log( pgettext( "memorial_male", "Sealed a Hazardous Material Sarcophagus." ), - pgettext( "memorial_female", "Sealed a Hazardous Material Sarcophagus." ) ); + g->events().send(); print_line( _( "Charges Detonated" ) ); print_line( _( "Backup Generator Power Failing" ) ); print_line( _( "Evacuate Immediately" ) ); @@ -1509,8 +1355,7 @@ void computer::activate_failure( computer_failure_type fail ) break; case COMPFAIL_ALARM: - g->u.add_memorial_log( pgettext( "memorial_male", "Set off an alarm." ), - pgettext( "memorial_female", "Set off an alarm." ) ); + g->events().send( g->u.getID() ); sounds::sound( g->u.pos(), 60, sounds::sound_t::alarm, _( "an alarm sound!" ), false, "environment", "alarm" ); if( g->get_levz() > 0 && !g->timed_events.queued( TIMED_EVENT_WANTED ) ) { @@ -1687,8 +1532,7 @@ void computer::remove_option( computer_action const action ) void computer::mark_refugee_center() { - print_line( _( "\ -SEARCHING FOR NEAREST REFUGEE CENTER, PLEASE WAIT ... " ) ); + print_line( _( "SEARCHING FOR NEAREST REFUGEE CENTER, PLEASE WAIT ... " ) ); const mission_type_id &mission_type = mission_type_id( "MISSION_REACH_REFUGEE_CENTER" ); tripoint mission_target; @@ -1714,15 +1558,14 @@ SEARCHING FOR NEAREST REFUGEE CENTER, PLEASE WAIT ... " ) ); } //~555-0164 is a fake phone number in the US, please replace it with a number that will not cause issues in your locale if possible. - print_line( _( "\ -\nREFUGEE CENTER FOUND! LOCATION: %d %s\n\n\ -IF YOU HAVE ANY FEEDBACK CONCERNING YOUR VISIT PLEASE CONTACT \n\ -THE DEPARTMENT OF EMERGENCY MANAGEMENT PUBLIC AFFAIRS OFFICE. \n\ -THE LOCAL OFFICE CAN BE REACHED BETWEEN THE HOURS OF 9AM AND \n\ -4PM AT 555-0164. \n\ -\n\ -IF YOU WOULD LIKE TO SPEAK WITH SOMEONE IN PERSON OR WOULD LIKE\n\ -TO WRITE US A LETTER PLEASE SEND IT TO...\n" ), rl_dist( g->u.pos(), mission_target ), + print_line( _( "\nREFUGEE CENTER FOUND! LOCATION: %d %s\n\n" + "IF YOU HAVE ANY FEEDBACK CONCERNING YOUR VISIT PLEASE CONTACT \n" + "THE DEPARTMENT OF EMERGENCY MANAGEMENT PUBLIC AFFAIRS OFFICE. \n" + "THE LOCAL OFFICE CAN BE REACHED BETWEEN THE HOURS OF 9AM AND \n" + "4PM AT 555-0164. \n" + "\n" + "IF YOU WOULD LIKE TO SPEAK WITH SOMEONE IN PERSON OR WOULD LIKE\n" + "TO WRITE US A LETTER PLEASE SEND IT TO...\n" ), rl_dist( g->u.pos(), mission_target ), direction_name_short( direction_from( g->u.pos(), mission_target ) ) ); query_any( _( "Press any key to continue..." ) ); diff --git a/src/condition.cpp b/src/condition.cpp index 1d475a58b2c45..8713bf56c2e1c 100644 --- a/src/condition.cpp +++ b/src/condition.cpp @@ -135,6 +135,14 @@ void conditional_t::set_has_activity( bool is_npc ) }; } +template +void conditional_t::set_is_riding( bool is_npc ) +{ + condition = [is_npc]( const T & d ) { + return ( is_npc ? d.alpha : d.beta )->is_mounted(); + }; +} + template void conditional_t::set_npc_has_class( JsonObject &jo ) { @@ -379,6 +387,48 @@ void conditional_t::set_has_var( JsonObject &jo, const std::string &member, b }; } + +template +void conditional_t::set_compare_var( JsonObject &jo, const std::string &member, bool is_npc ) +{ + const std::string var_name = get_talk_varname( jo, member, false ); + const std::string &op = jo.get_string( "op" ); + const int value = jo.get_int( "value" ); + condition = [var_name, op, value, is_npc]( const T & d ) { + player *actor = d.alpha; + if( is_npc ) { + actor = dynamic_cast( d.beta ); + } + + int stored_value = 0; + const std::string &var = actor->get_value( var_name ); + if( !var.empty() ) { + stored_value = std::stoi( var ); + } + + if( op == "==" ) { + return stored_value == value; + + } else if( op == "!=" ) { + return stored_value != value; + + } else if( op == "<=" ) { + return stored_value <= value; + + } else if( op == ">=" ) { + return stored_value >= value; + + } else if( op == "<" ) { + return stored_value < value; + + } else if( op == ">" ) { + return stored_value > value; + } + + return false; + }; +} + template void conditional_t::set_npc_role_nearby( JsonObject &jo ) { @@ -722,7 +772,7 @@ void conditional_t::set_has_stolen_item( bool is_npc ) bool found_in_inv = false; for( auto &elem : actor->inv_dump() ) { if( elem->get_old_owner() ) { - if( elem->get_old_owner()->id.str() == p.my_fac->id.str() ) { + if( elem->get_old_owner() == p.get_faction() ) { found_in_inv = true; } } @@ -812,6 +862,19 @@ void conditional_t::set_u_know_recipe( JsonObject &jo, const std::string &mem }; } +template +void conditional_t::set_mission_has_generic_rewards() +{ + condition = []( const T & d ) { + mission *miss = d.beta->chatbin.mission_selected; + if( miss == nullptr ) { + debugmsg( "mission_has_generic_rewards: mission_selected == nullptr" ); + return true; + } + return miss->has_generic_rewards(); + }; +} + template conditional_t::conditional_t( JsonObject jo ) { @@ -893,6 +956,8 @@ conditional_t::conditional_t( JsonObject jo ) set_npc_has_class( jo ); } else if( jo.has_string( "npc_has_activity" ) ) { set_has_activity( is_npc ); + } else if( jo.has_string( "npc_is_riding" ) ) { + set_is_riding( is_npc ); } else if( jo.has_string( "u_has_mission" ) ) { set_u_has_mission( jo ); } else if( jo.has_int( "u_has_strength" ) ) { @@ -947,6 +1012,10 @@ conditional_t::conditional_t( JsonObject jo ) set_has_var( jo, "u_has_var" ); } else if( jo.has_string( "npc_has_var" ) ) { set_has_var( jo, "npc_has_var", is_npc ); + } else if( jo.has_string( "u_compare_var" ) ) { + set_compare_var( jo, "u_compare_var" ); + } else if( jo.has_string( "npc_compare_var" ) ) { + set_compare_var( jo, "npc_compare_var", is_npc ); } else if( jo.has_string( "npc_role_nearby" ) ) { set_npc_role_nearby( jo ); } else if( jo.has_int( "npc_allies" ) ) { @@ -1054,6 +1123,8 @@ conditional_t::conditional_t( const std::string &type ) set_is_driving( is_npc ); } else if( type == "npc_has_activity" ) { set_has_activity( is_npc ); + } else if( type == "npc_is_riding" ) { + set_is_riding( is_npc ); } else if( type == "is_day" ) { set_is_day(); } else if( type == "u_has_stolen_item" ) { @@ -1068,6 +1139,8 @@ conditional_t::conditional_t( const std::string &type ) set_is_by_radio(); } else if( type == "has_reason" ) { set_has_reason(); + } else if( type == "mission_has_generic_rewards" ) { + set_mission_has_generic_rewards(); } else { condition = []( const T & ) { return false; diff --git a/src/condition.h b/src/condition.h index 17e2487c0f4ba..ceafb2b6cb96e 100644 --- a/src/condition.h +++ b/src/condition.h @@ -21,7 +21,7 @@ const std::unordered_set simple_string_conds = { { "u_male", "u_female", "npc_male", "npc_female", "has_no_assigned_mission", "has_assigned_mission", "has_many_assigned_missions", "has_no_available_mission", "has_available_mission", "has_many_available_missions", - "mission_complete", "mission_incomplete", + "mission_complete", "mission_incomplete", "mission_has_generic_rewards", "npc_available", "npc_following", "npc_friend", "npc_hostile", "npc_train_skills", "npc_train_styles", "at_safe_space", "is_day", "npc_has_activity", "is_outside", "u_has_camp", @@ -43,7 +43,7 @@ const std::unordered_set complex_conds = { { "npc_aim_rule", "npc_engagement_rule", "npc_rule", "npc_override", "npc_cbm_reserve_rule", "npc_cbm_recharge_rule", "days_since_cataclysm", "is_season", "mission_goal", "u_has_var", "npc_has_var", - "u_has_skill", "npc_has_skill", "u_know_recipe" + "u_has_skill", "npc_has_skill", "u_know_recipe", "u_compare_var", "npc_compare_var" } }; } // namespace dialogue_data @@ -76,7 +76,9 @@ struct conditional_t { void set_has_trait( JsonObject &jo, const std::string &member, bool is_npc = false ); void set_has_trait_flag( JsonObject &jo, const std::string &member, bool is_npc = false ); void set_has_var( JsonObject &jo, const std::string &member, bool is_npc = false ); + void set_compare_var( JsonObject &jo, const std::string &member, bool is_npc = false ); void set_has_activity( bool is_npc = false ); + void set_is_riding( bool is_npc = false ); void set_npc_has_class( JsonObject &jo ); void set_u_has_mission( JsonObject &jo ); void set_has_strength( JsonObject &jo, const std::string &member, bool is_npc = false ); @@ -132,6 +134,7 @@ struct conditional_t { void set_is_gender( bool is_male, bool is_npc = false ); void set_has_skill( JsonObject &jo, const std::string &member, bool is_npc = false ); void set_u_know_recipe( JsonObject &jo, const std::string &member ); + void set_mission_has_generic_rewards(); bool operator()( const T &d ) const { if( !condition ) { diff --git a/src/construction.cpp b/src/construction.cpp index dc40eb9f9832b..d477f5e499ac5 100644 --- a/src/construction.cpp +++ b/src/construction.cpp @@ -12,6 +12,7 @@ #include "cata_utility.h" #include "coordinate_conversions.h" #include "debug.h" +#include "event_bus.h" #include "game.h" #include "input.h" #include "item_group.h" @@ -708,21 +709,13 @@ bool player_can_build( player &p, const inventory &inv, const std::string &desc return false; } -static bool character_has_skill_for( const Character &c, const construction &con ) -{ - return std::all_of( con.required_skills.begin(), con.required_skills.end(), - [&]( const std::pair &pr ) { - return c.get_skill_level( pr.first ) >= pr.second; - } ); -} - bool player_can_build( player &p, const inventory &inv, const construction &con ) { if( p.has_trait( trait_DEBUG_HS ) ) { return true; } - if( !character_has_skill_for( p, con ) ) { + if( !p.meets_skill_requirements( con ) ) { return false; } return con.requirements->can_make_with_inventory( inv, is_crafting_component ); @@ -880,7 +873,7 @@ void complete_construction( player *p ) // TODO NPCs watching other NPCs do stuff and learning from it if( p->is_player() ) { for( auto &elem : g->u.get_crafting_helpers() ) { - if( character_has_skill_for( *elem, built ) ) { + if( elem->meets_skill_requirements( built ) ) { add_msg( m_info, _( "%s assists you with the work..." ), elem->name ); } else { //NPC near you isn't skilled enough to help @@ -1029,10 +1022,6 @@ void construct::done_grave( const tripoint &p ) } else { add_msg( m_neutral, _( "You bury remains of a human, whose name is lost in the Cataclysm." ) ); } - g->u.add_memorial_log( pgettext( "memorial_male", - string_format( "You buried unknown victim of the Cataclysm.", it.type_name() ).c_str() ), - pgettext( "memorial_female", string_format( "You buried unknown victim of The Cataclysm.", - it.type_name() ).c_str() ) ); } } else { if( g->u.has_trait( trait_SPIRITUAL ) ) { @@ -1045,10 +1034,9 @@ void construct::done_grave( const tripoint &p ) _( "You bury remains of %s, who joined uncounted masses perished in the Cataclysm." ), it.get_corpse_name() ); } - g->u.add_memorial_log( pgettext( "memorial_male", string_format( "You buried %s.", - it.get_corpse_name() ).c_str() ), - pgettext( "memorial_female", string_format( "You buried %s.", it.get_corpse_name() ).c_str() ) ); } + g->events().send( + g->u.getID(), it.get_mtype()->id, it.get_corpse_name() ); } } if( g->u.has_quality( quality_id( "CUT" ) ) ) { @@ -1190,8 +1178,7 @@ void construct::done_digormine_stair( const tripoint &p, bool dig ) unroll_digging( dig ? 8 : 12 ); } else { add_msg( m_warning, _( "You just tunneled into lava!" ) ); - g->u.add_memorial_log( pgettext( "memorial_male", "Dug a shaft into lava." ), - pgettext( "memorial_female", "Dug a shaft into lava." ) ); + g->events().send(); g->m.ter_set( p, t_hole ); } @@ -1512,7 +1499,7 @@ int construction::adjusted_time() const int assistants = 0; for( auto &elem : g->u.get_crafting_helpers() ) { - if( character_has_skill_for( *elem, *this ) ) { + if( elem->meets_skill_requirements( *this ) ) { assistants++; } } diff --git a/src/consumption.cpp b/src/consumption.cpp index 79b73f681ad6c..c434780cf269f 100644 --- a/src/consumption.cpp +++ b/src/consumption.cpp @@ -635,12 +635,14 @@ bool player::eat( item &food, bool force ) return false; } + int charges_used = 0; if( food.type->has_use() ) { if( !food.type->can_use( "DOGFOOD" ) && !food.type->can_use( "CATFOOD" ) && !food.type->can_use( "BIRDFOOD" ) && !food.type->can_use( "CATTLEFODDER" ) ) { - if( food.type->invoke( *this, food, pos() ) <= 0 ) { + charges_used = food.type->invoke( *this, food, pos() ); + if( charges_used <= 0 ) { return false; } } @@ -663,8 +665,6 @@ bool player::eat( item &food, bool force ) if( hibernate && ( get_hunger() > -60 && get_thirst() > -60 ) && ( get_hunger() - nutr < -60 || get_thirst() - quench < -60 ) ) { - add_memorial_log( pgettext( "memorial_male", "Began preparing for hibernation." ), - pgettext( "memorial_female", "Began preparing for hibernation." ) ); add_msg_if_player( _( "You've begun stockpiling calories and liquid for hibernation. You get the feeling that you should prepare for bed, just in case, but...you're hungry again, and you could eat a whole week's worth of food RIGHT NOW." ) ); } @@ -684,6 +684,10 @@ bool player::eat( item &food, bool force ) add_msg_if_player( m_good, _( "Mmm, this %s tastes delicious..." ), food.tname() ); } if( !consume_effects( food ) ) { + //Already consumed by using `food.type->invoke`? + if( charges_used > 0 ) { + food.mod_charges( -charges_used ); + } return false; } food.mod_charges( -1 ); @@ -1251,7 +1255,7 @@ bool player::can_feed_furnace_with( const item &it ) const return false; } - return it.typeId() != "corpse"; // TODO: Eliminate the hard-coded special case. + return !it.has_flag( "CORPSE" ); } bool player::feed_furnace_with( item &it ) diff --git a/src/coordinate_conversions.cpp b/src/coordinate_conversions.cpp index 2d772d5d41c74..1d7b624b85162 100644 --- a/src/coordinate_conversions.cpp +++ b/src/coordinate_conversions.cpp @@ -87,7 +87,7 @@ point sm_to_om_remain( int &x, int &y ) point omt_to_ms_copy( const point &p ) { - return point( p.x * 2 * SEEX, p.x * 2 * SEEY ); + return point( p.x * 2 * SEEX, p.y * 2 * SEEY ); } point omt_to_sm_copy( int x, int y ) diff --git a/src/craft_command.cpp b/src/craft_command.cpp index 66f7ab0e2b183..bf78837c0ddbf 100644 --- a/src/craft_command.cpp +++ b/src/craft_command.cpp @@ -104,7 +104,7 @@ void craft_command::execute( const tripoint &new_loc ) bool need_selections = true; inventory map_inv; - map_inv.form_from_map( crafter->pos(), PICKUP_RANGE ); + map_inv.form_from_map( crafter->pos(), PICKUP_RANGE, crafter ); if( has_cached_selections() ) { std::vector> missing_items = check_item_components_missing( map_inv ); @@ -219,7 +219,7 @@ item craft_command::create_in_progress_craft() } inventory map_inv; - map_inv.form_from_map( crafter->pos(), PICKUP_RANGE ); + map_inv.form_from_map( crafter->pos(), PICKUP_RANGE, crafter ); if( !check_item_components_missing( map_inv ).empty() ) { debugmsg( "Aborting crafting: couldn't find cached components" ); @@ -236,7 +236,18 @@ item craft_command::create_in_progress_craft() for( const comp_selection &selection : item_selections ) { item_comp comp_used = selection.comp; comp_used.count *= batch_size; - comps_used.emplace_back( comp_used ); + + //Handle duplicate component requirement + auto found_it = std::find_if( comps_used.begin(), + comps_used.end(), [&comp_used]( const item_comp & c ) { + return c.type == comp_used.type; + } ); + if( found_it != comps_used.end() ) { + item_comp &found_comp = *found_it; + found_comp.count += comp_used.count; + } else { + comps_used.emplace_back( comp_used ); + } } item new_craft( rec, batch_size, used, comps_used ); diff --git a/src/crafting.cpp b/src/crafting.cpp index 9f066d4209cdc..b233738fd02c5 100644 --- a/src/crafting.cpp +++ b/src/crafting.cpp @@ -60,7 +60,6 @@ #include "type_id.h" #include "clzones.h" #include "colony.h" -#include "faction.h" #include "flat_set.h" #include "iuse.h" #include "point.h" @@ -540,7 +539,7 @@ const inventory &player::crafting_inventory( const tripoint &src_pos, int radius && cached_position == inv_pos ) { return cached_crafting_inventory; } - cached_crafting_inventory.form_from_map( inv_pos, radius, false ); + cached_crafting_inventory.form_from_map( inv_pos, radius, this, false, true ); cached_crafting_inventory += inv; cached_crafting_inventory += weapon; cached_crafting_inventory += worn; @@ -624,14 +623,14 @@ static void set_item_food( item &newit ) newit.set_birthday( newit.birthday() + 3600_turns - time_duration::from_turns( bday_tmp ) ); } -static void finalize_crafted_item( item &newit ) +static void finalize_crafted_item( item &newit, faction *maker_fac ) { if( newit.is_food() ) { set_item_food( newit ); } // TODO for now this assumes player is doing the crafting // this will need to be updated when NPCs do crafting - newit.set_owner( g->faction_manager_ptr->get( faction_id( "your_followers" ) ) ); + newit.set_owner( maker_fac ); } static cata::optional wield_craft( player &p, item &craft ) @@ -1164,7 +1163,7 @@ void player::complete_craft( item &craft, const tripoint &loc ) } } - finalize_crafted_item( newit ); + finalize_crafted_item( newit, get_faction() ); if( newit.made_of( LIQUID ) ) { liquid_handler::handle_all_liquid( newit, PICKUP_RANGE ); } else if( loc == tripoint_zero ) { @@ -1188,7 +1187,7 @@ void player::complete_craft( item &craft, const tripoint &loc ) bp.reset_temp_check(); } } - finalize_crafted_item( bp ); + finalize_crafted_item( bp, get_faction() ); if( bp.made_of( LIQUID ) ) { liquid_handler::handle_all_liquid( bp, PICKUP_RANGE ); } else if( loc == tripoint_zero ) { @@ -1236,7 +1235,7 @@ bool player::can_continue_craft( item &craft ) } inventory map_inv; - map_inv.form_from_map( pos(), PICKUP_RANGE ); + map_inv.form_from_map( pos(), PICKUP_RANGE, this ); std::vector> item_selections; for( const auto &it : continue_reqs.get_components() ) { @@ -1286,7 +1285,7 @@ bool player::can_continue_craft( item &craft ) } inventory map_inv; - map_inv.form_from_map( pos(), PICKUP_RANGE ); + map_inv.form_from_map( pos(), PICKUP_RANGE, this ); std::vector> new_tool_selections; for( const std::vector &alternatives : tool_reqs ) { @@ -1549,7 +1548,7 @@ std::list player::consume_items( const std::vector &components, const std::function &filter ) { inventory map_inv; - map_inv.form_from_map( pos(), PICKUP_RANGE ); + map_inv.form_from_map( pos(), PICKUP_RANGE, this ); return consume_items( select_item_component( components, batch, map_inv, false, filter ), batch, filter ); } @@ -1691,7 +1690,7 @@ bool player::craft_consume_tools( item &craft, int mulitplier, bool start_craft craft.get_cached_tool_selections(); inventory map_inv; - map_inv.form_from_map( pos(), PICKUP_RANGE ); + map_inv.form_from_map( pos(), PICKUP_RANGE, this ); for( const comp_selection &tool_sel : cached_tool_selections ) { itype_id type = tool_sel.comp.type; @@ -1775,7 +1774,7 @@ void player::consume_tools( const std::vector &tools, int batch, const std::string &hotkeys ) { inventory map_inv; - map_inv.form_from_map( pos(), PICKUP_RANGE ); + map_inv.form_from_map( pos(), PICKUP_RANGE, this ); consume_tools( select_tool_component( tools, batch, map_inv, hotkeys ), batch ); } diff --git a/src/crash.cpp b/src/crash.cpp index 3f0c3544e7677..46013488fea90 100644 --- a/src/crash.cpp +++ b/src/crash.cpp @@ -52,7 +52,7 @@ extern "C" { static struct { alignas( SYMBOL_INFO ) char storage[SYM_SIZE]; } sym_storage; - static SYMBOL_INFO *const sym = ( SYMBOL_INFO * ) &sym_storage; + static SYMBOL_INFO *const sym = reinterpret_cast( &sym_storage ); // compose message ourselves to avoid potential dynamical allocation. static void append_str( FILE *file, char **beg, char *end, const char *from ) @@ -134,17 +134,18 @@ extern "C" { for( USHORT i = 0; i < num_bt; ++i ) { DWORD64 off; append_str( file, &beg, end, " " ); - if( SymFromAddr( proc, ( DWORD64 ) bt[i], &off, sym ) ) { + if( SymFromAddr( proc, reinterpret_cast( bt[i] ), &off, sym ) ) { append_str( file, &beg, end, sym->Name ); append_str( file, &beg, end, "+0x" ); append_uint( file, &beg, end, off ); } append_str( file, &beg, end, "@0x" ); append_ptr( file, &beg, end, bt[i] ); - DWORD64 mod_base = SymGetModuleBase64( proc, ( DWORD64 ) bt[i] ); + DWORD64 mod_base = SymGetModuleBase64( proc, reinterpret_cast( bt[i] ) ); if( mod_base ) { append_ch( file, &beg, end, '[' ); - DWORD mod_len = GetModuleFileName( ( HMODULE ) mod_base, mod_path, MODULE_PATH_LEN ); + DWORD mod_len = GetModuleFileName( reinterpret_cast( mod_base ), mod_path, + MODULE_PATH_LEN ); // mod_len == MODULE_NAME_LEN means insufficient buffer if( mod_len > 0 && mod_len < MODULE_PATH_LEN ) { const char *mod_name = mod_path + mod_len; @@ -156,7 +157,7 @@ extern "C" { append_uint( file, &beg, end, mod_base ); } append_str( file, &beg, end, "+0x" ); - append_uint( file, &beg, end, ( uintptr_t ) bt[i] - mod_base ); + append_uint( file, &beg, end, reinterpret_cast( bt[i] ) - mod_base ); append_ch( file, &beg, end, ']' ); } append_ch( file, &beg, end, '\n' ); diff --git a/src/creature.cpp b/src/creature.cpp index ca22aa46fff10..61dd14c806fe6 100644 --- a/src/creature.cpp +++ b/src/creature.cpp @@ -10,6 +10,7 @@ #include "avatar.h" #include "debug.h" #include "effect.h" +#include "event_bus.h" #include "field.h" #include "game.h" #include "map.h" @@ -178,8 +179,9 @@ bool Creature::is_dangerous_field( const field_entry &entry ) const bool Creature::sees( const Creature &critter ) const { + // Creatures always see themselves (simplifies drawing). if( &critter == this ) { - return true; // Can always see ourselves. + return true; } if( critter.is_hallucination() ) { @@ -193,10 +195,6 @@ bool Creature::sees( const Creature &critter ) const return false; } - // Creatures always see themselves (simplifies drawing). - if( this == &critter ) { - return true; - } // This check is ridiculously expensive so defer it to after everything else. auto visible = []( const player * p ) { return p == nullptr || !p->is_invisible(); @@ -255,7 +253,7 @@ bool Creature::sees( const tripoint &t, bool is_player, int range_mod ) const } const int range_cur = sight_range( g->m.ambient_light_at( t ) ); - const int range_day = sight_range( current_daylight_level( calendar::turn ) ); + const int range_day = sight_range( default_daylight_level() ); const int range_night = sight_range( 0 ); const int range_max = std::max( range_day, range_night ); const int range_min = std::min( range_cur, range_max ); @@ -490,14 +488,15 @@ void Creature::deal_melee_hit( Creature *source, int hit_spread, bool critical_h return; } // If carrying a rider, there is a chance the hits may hit rider instead. - if( has_effect( effect_riding ) ) { - monster *mon = g->u.mounted_creature.get(); //only the player can ride a monster - // If carrying a rider, there is a chance the hits may hit rider instead. - // big mounts and small player = big shield for player. - if( mon->has_flag( MF_MECH_DEFENSIVE ) || - !one_in( std::max( 2, mon->get_size() - g->u.get_size() ) ) ) { - mon->deal_melee_hit( source, hit_spread, critical_hit, dam, dealt_dam ); - return; + // melee attack will start off as targeted at mount + if( has_effect( effect_ridden ) ) { + monster *mons = dynamic_cast( this ); + if( mons && mons->mounted_player ) { + if( !mons->has_flag( MF_MECH_DEFENSIVE ) && + one_in( std::max( 2, mons->get_size() - mons->mounted_player->get_size() ) ) ) { + mons->mounted_player->deal_melee_hit( source, hit_spread, critical_hit, dam, dealt_dam ); + return; + } } } damage_instance d = dam; // copy, since we will mutate in block_hit @@ -554,14 +553,14 @@ void Creature::deal_projectile_attack( Creature *source, dealt_projectile_attack return; } // If carrying a rider, there is a chance the hits may hit rider instead. - if( has_effect( effect_riding ) ) { - monster *mon = g->u.mounted_creature.get(); //only the player can ride a monster - // If carrying a rider, there is a chance the hits may hit rider instead. - // big mounts and small player = big shield for player. - if( mon->has_flag( MF_MECH_DEFENSIVE ) || - !one_in( std::max( 2, mon->get_size() - g->u.get_size() ) ) ) { - mon->deal_projectile_attack( source, attack, print_messages ); - return; + if( has_effect( effect_ridden ) ) { + monster *mons = dynamic_cast( this ); + if( mons && mons->mounted_player ) { + if( !mons->has_flag( MF_MECH_DEFENSIVE ) && + one_in( std::max( 2, mons->get_size() - mons->mounted_player->get_size() ) ) ) { + mons->mounted_player->deal_projectile_attack( source, attack, print_messages ); + return; + } } } const projectile &proj = attack.proj; @@ -917,7 +916,10 @@ void Creature::add_effect( const efftype_id &eff_id, const time_duration dur, bo } if( eff_id == efftype_id( "knockdown" ) && ( has_effect( effect_ridden ) || has_effect( effect_riding ) ) ) { - g->u.forced_dismount(); + monster *mons = dynamic_cast( this ); + if( mons && mons->mounted_player ) { + mons->mounted_player->forced_dismount(); + } } if( !eff_id.is_valid() ) { @@ -1010,14 +1012,11 @@ void Creature::add_effect( const efftype_id &eff_id, const time_duration dur, bo e.set_intensity( e.get_max_intensity() ); } ( *effects )[eff_id][bp] = e; - if( is_player() ) { - if( !type.get_apply_message().empty() ) { + if( Character *ch = as_character() ) { + g->events().send( ch->getID(), eff_id ); + if( is_player() && !type.get_apply_message().empty() ) { add_msg( type.gain_game_message_type(), _( type.get_apply_message() ) ); } - if( !type.get_apply_memorial_log().empty() ) { - add_memorial_log( pgettext( "memorial_male", type.get_apply_memorial_log().c_str() ), - pgettext( "memorial_female", type.get_apply_memorial_log().c_str() ) ); - } } on_effect_int_change( eff_id, e.get_intensity(), bp ); // Perform any effect addition effects. @@ -1061,14 +1060,13 @@ bool Creature::remove_effect( const efftype_id &eff_id, body_part bp ) } const effect_type &type = eff_id.obj(); - if( is_player() ) { - if( !type.get_remove_message().empty() ) { - add_msg( type.lose_game_message_type(), _( type.get_remove_message() ) ); - } - if( !type.get_remove_memorial_log().empty() ) { - add_memorial_log( pgettext( "memorial_male", type.get_remove_memorial_log().c_str() ), - pgettext( "memorial_female", type.get_remove_memorial_log().c_str() ) ); + if( Character *ch = as_character() ) { + if( is_player() ) { + if( !type.get_remove_message().empty() ) { + add_msg( type.lose_game_message_type(), _( type.get_remove_message() ) ); + } } + g->events().send( ch->getID(), eff_id ); } // num_bp means remove all of a given effect id @@ -1104,6 +1102,18 @@ bool Creature::has_effect( const efftype_id &eff_id, body_part bp ) const } } +bool Creature::has_effect_with_flag( const std::string &flag, body_part bp ) const +{ + for( auto &elem : *effects ) { + for( const std::pair &_it : elem.second ) { + if( bp == _it.first && _it.second.has_flag( flag ) ) { + return true; + } + } + } + return false; +} + effect &Creature::get_effect( const efftype_id &eff_id, body_part bp ) { return const_cast( const_cast( this )->get_effect( eff_id, bp ) ); @@ -1616,16 +1626,16 @@ std::string Creature::attitude_raw_string( Attitude att ) } } -const std::pair &Creature::get_attitude_ui_data( Attitude att ) +const std::pair &Creature::get_attitude_ui_data( Attitude att ) { - using pair_t = std::pair; + using pair_t = std::pair; static const std::array strings { { - pair_t {_( "Hostile" ), c_red}, - pair_t {_( "Neutral" ), h_white}, - pair_t {_( "Friendly" ), c_green}, - pair_t {_( "Any" ), c_yellow}, - pair_t {_( "BUG: Behavior unnamed. (Creature::get_attitude_ui_data)" ), h_red} + pair_t {to_translation( "Hostile" ), c_red}, + pair_t {to_translation( "Neutral" ), h_white}, + pair_t {to_translation( "Friendly" ), c_green}, + pair_t {to_translation( "Any" ), c_yellow}, + pair_t {to_translation( "BUG: Behavior unnamed. (Creature::get_attitude_ui_data)" ), h_red} } }; diff --git a/src/creature.h b/src/creature.h index f62b66aa8c67d..7f90f301e9df2 100644 --- a/src/creature.h +++ b/src/creature.h @@ -13,6 +13,7 @@ #include "bodypart.h" #include "pimpl.h" #include "string_formatter.h" +#include "translations.h" #include "type_id.h" #include "units.h" #include "debug.h" @@ -22,13 +23,13 @@ enum game_message_type : int; class nc_color; class effect; class effects_map; -class translation; namespace catacurses { class window; } // namespace catacurses class avatar; +class Character; class field; class field_entry; class JsonObject; @@ -88,6 +89,12 @@ class Creature virtual bool is_monster() const { return false; } + virtual Character *as_character() { + return nullptr; + } + virtual const Character *as_character() const { + return nullptr; + } virtual player *as_player() { return nullptr; } @@ -149,7 +156,7 @@ class Creature /** * Creature Attitude as String and color */ - static const std::pair &get_attitude_ui_data( Attitude att ); + static const std::pair &get_attitude_ui_data( Attitude att ); /** * Attitude (of this creature) towards another creature. This might not be symmetric. @@ -329,14 +336,17 @@ class Creature const time_duration &dur, body_part bp = num_bp, bool permanent = false, int intensity = 1, bool force = false ); - /** Removes a listed effect, adding the removal memorial log if needed. bp = num_bp means to remove - * all effects of a given type, targeted or untargeted. Returns true if anything was removed. */ + /** Removes a listed effect. bp = num_bp means to remove all effects of + * a given type, targeted or untargeted. Returns true if anything was + * removed. */ bool remove_effect( const efftype_id &eff_id, body_part bp = num_bp ); /** Remove all effects. */ void clear_effects(); /** Check if creature has the matching effect. bp = num_bp means to check if the Creature has any effect * of the matching type, targeted or untargeted. */ bool has_effect( const efftype_id &eff_id, body_part bp = num_bp ) const; + /** Check if creature has any effect with the given flag. */ + bool has_effect_with_flag( const std::string &flag, body_part bp = num_bp ) const; /** Return the effect that matches the given arguments exactly. */ const effect &get_effect( const efftype_id &eff_id, body_part bp = num_bp ) const; effect &get_effect( const efftype_id &eff_id, body_part bp = num_bp ); @@ -701,20 +711,6 @@ class Creature string_format( npc_speech, std::forward( args )... ) ); } - virtual void add_memorial_log( const std::string &/*male_msg*/, - const std::string &/*female_msg*/ ) {} - template - void add_memorial_log( const char *const male_msg, const char *const female_msg, Args &&... args ) { - return add_memorial_log( string_format( male_msg, std::forward( args )... ), - string_format( female_msg, std::forward( args )... ) ); - } - template - void add_memorial_log( const std::string &male_msg, const std::string &female_msg, - Args &&... args ) { - return add_memorial_log( string_format( male_msg, std::forward( args )... ), - string_format( female_msg, std::forward( args )... ) ); - } - virtual std::string extended_description() const = 0; virtual nc_color symbol_color() const = 0; diff --git a/src/damage.cpp b/src/damage.cpp index 44eab79f3c6aa..f80f119c15200 100644 --- a/src/damage.cpp +++ b/src/damage.cpp @@ -141,9 +141,16 @@ bool damage_instance::operator==( const damage_instance &other ) const void damage_instance::deserialize( JsonIn &jsin ) { - JsonObject jo( jsin ); // TODO: Clean up - damage_units = load_damage_instance( jo ).damage_units; + if( jsin.test_object() ) { + JsonObject jo = jsin.get_object(); + damage_units = load_damage_instance( jo ).damage_units; + } else if( jsin.test_array() ) { + JsonArray ja = jsin.get_array(); + damage_units = load_damage_instance( ja ).damage_units; + } else { + jsin.error( "Expected object or array for damage_instance" ); + } } dealt_damage_instance::dealt_damage_instance() diff --git a/src/debug_menu.cpp b/src/debug_menu.cpp index f9a159ba7a38a..8273f18a0d639 100644 --- a/src/debug_menu.cpp +++ b/src/debug_menu.cpp @@ -380,7 +380,7 @@ void character_edit_menu() } const size_t index = charmenu.ret; // The NPC is also required for "Add mission", so has to be in this scope - npc *np = g->critter_at( locations[index] ); + npc *np = g->critter_at( locations[index], false ); player &p = np ? static_cast( *np ) : static_cast( g->u ); uilist nmenu; @@ -389,8 +389,8 @@ void character_edit_menu() data << np->name << " " << ( np->male ? _( "Male" ) : _( "Female" ) ) << std::endl; data << np->myclass.obj().get_name() << "; " << npc_attitude_name( np->get_attitude() ) << "; " << - ( np->my_fac ? np->my_fac->name : _( "no faction" ) ) << "; " << - ( np->my_fac ? np->my_fac->currency : _( "no currency" ) ) << "; " << + ( np->get_faction() ? np->get_faction()->name : _( "no faction" ) ) << "; " << + ( np->get_faction() ? np->get_faction()->currency : _( "no currency" ) ) << "; " << "api: " << np->get_faction_ver() << std::endl; if( np->has_destination() ) { data << string_format( _( "Destination: %d:%d:%d (%s)" ), @@ -811,23 +811,22 @@ void character_edit_menu() } } -static const std::string &mission_status_string( mission::mission_status status ) +static std::string mission_status_string( mission::mission_status status ) { static const std::map desc{ { - { mission::mission_status::yet_to_start, _( "Yet to start" ) }, - { mission::mission_status::in_progress, _( "In progress" ) }, - { mission::mission_status::success, _( "Success" ) }, - { mission::mission_status::failure, _( "Failure" ) } + { mission::mission_status::yet_to_start, translate_marker( "Yet to start" ) }, + { mission::mission_status::in_progress, translate_marker( "In progress" ) }, + { mission::mission_status::success, translate_marker( "Success" ) }, + { mission::mission_status::failure, translate_marker( "Failure" ) } } }; const auto &iter = desc.find( status ); if( iter != desc.end() ) { - return iter->second; + return _( iter->second ); } - static const std::string errmsg = _( "Bugged" ); - return errmsg; + return _( "Bugged" ); } std::string mission_debug::describe( const mission &m ) @@ -1063,7 +1062,7 @@ void debug() temp->mission = NPC_MISSION_NULL; temp->add_new_mission( mission::reserve_random( ORIGIN_ANY_NPC, temp->global_omt_location(), temp->getID() ) ); - temp->set_fac( faction_id( "wasteland_scavengers" ) ); + temp->set_fac( faction_id( "no_faction" ) ); g->load_npcs(); } break; diff --git a/src/defense.cpp b/src/defense.cpp index b6874ca0ac2e1..487b772810bce 100644 --- a/src/defense.cpp +++ b/src/defense.cpp @@ -570,8 +570,8 @@ void defense_game::setup() location = static_cast( location - 1 ); } } - mvwprintz( w, point( 2, 5 ), c_black, "\ - xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ); + mvwprintz( w, point( 2, 5 ), c_black, + " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ); mvwprintz( w, point( 2, 5 ), c_yellow, defense_location_name( location ) ); mvwprintz( w, point( 28, 5 ), c_light_gray, defense_location_description( location ) ); break; @@ -943,12 +943,11 @@ void defense_game::caravan() while( !done ) { const std::string action = ctxt.handle_input(); if( action == "HELP" ) { - popup_top( _( "\ -CARAVAN:\n\ -Start by selecting a category using your favorite up/down keys.\n\ -Switch between category selection and item selecting by pressing %s.\n\ -Pick an item with the up/down keys, press left/right to buy 1 less/more.\n\ -Press %s to buy everything in your cart, %s to buy nothing." ), + popup_top( _( "CARAVAN:\n" + "Start by selecting a category using your favorite up/down keys.\n" + "Switch between category selection and item selecting by pressing %s.\n" + "Pick an item with the up/down keys, press left/right to buy 1 less/more.\n" + "Press %s to buy everything in your cart, %s to buy nothing." ), ctxt.get_desc( "NEXT_TAB" ), ctxt.get_desc( "CONFIRM" ), ctxt.get_desc( "QUIT" ) diff --git a/src/descriptions.cpp b/src/descriptions.cpp index a3ff692cced03..ceb2cc3ac4f5b 100644 --- a/src/descriptions.cpp +++ b/src/descriptions.cpp @@ -47,8 +47,8 @@ void game::extended_description( const tripoint &p ) catacurses::window w_head = catacurses::newwin( top, TERMX, point_zero ); catacurses::window w_main = catacurses::newwin( height, width, point( left, top ) ); // TODO: De-hardcode - std::string header_message = _( "\ -c to describe creatures, f to describe furniture, t to describe terrain, Esc/Enter to close." ); + std::string header_message = + _( "c to describe creatures, f to describe furniture, t to describe terrain, Esc/Enter to close." ); mvwprintz( w_head, point_zero, c_white, header_message ); // Set up line drawings diff --git a/src/dialogue.h b/src/dialogue.h index c3d10cf4860be..4a3c77c1ca2c9 100644 --- a/src/dialogue.h +++ b/src/dialogue.h @@ -59,7 +59,7 @@ struct talk_trial { /** * Returns a user-friendly representation of @ref type */ - const std::string &name() const; + std::string name() const; std::vector modifiers; operator bool() const { return type != TALK_TRIAL_NONE; @@ -86,6 +86,7 @@ struct talk_topic { struct talk_effect_fun_t { private: std::function function; + std::vector> likely_rewards; public: talk_effect_fun_t() = default; @@ -99,6 +100,7 @@ struct talk_effect_fun_t { void set_remove_trait( JsonObject jo, const std::string &member, bool is_npc = false ); void set_add_var( JsonObject jo, const std::string &member, bool is_npc = false ); void set_remove_var( JsonObject jo, const std::string &member, bool is_npc = false ); + void set_adjust_var( JsonObject jo, const std::string &member, bool is_npc = false ); void set_u_buy_item( const std::string &item_name, int cost, int count, const std::string &container_name ); void set_u_spend_cash( int amount ); @@ -121,6 +123,7 @@ struct talk_effect_fun_t { void set_bulk_trade_accept( bool is_trade, bool is_npc = false ); void set_npc_gets_item( bool to_use ); void set_add_mission( std::string mission_id ); + const std::vector> &get_likely_rewards() const; void set_u_buy_monster( const std::string &monster_type_id, int cost, int count, bool pacified, const translation &name ); void set_u_learn_recipe( const std::string &learned_recipe_id ); diff --git a/src/editmap.cpp b/src/editmap.cpp index 05c4770d25692..f596ae33a2c71 100644 --- a/src/editmap.cpp +++ b/src/editmap.cpp @@ -10,7 +10,9 @@ #include #include #include +#include #include +#include #include "avatar.h" #include "calendar.h" @@ -48,16 +50,12 @@ #include "string_id.h" #include "colony.h" -#define dbg(x) DebugLog((DebugLevel)(x),D_GAME) << __FILE__ << ":" << __LINE__ << ": " - static constexpr tripoint editmap_boundary_min( 0, 0, -OVERMAP_DEPTH ); static constexpr tripoint editmap_boundary_max( MAPSIZE_X, MAPSIZE_Y, OVERMAP_HEIGHT + 1 ); static constexpr box editmap_boundaries( editmap_boundary_min, editmap_boundary_max ); static const ter_id undefined_ter_id( -1 ); -static const furn_id undefined_furn_id( -1 ); -static const trap_id undefined_trap_id( -1 ); static std::vector fld_string( const std::string &str, int width ) { @@ -177,24 +175,10 @@ editmap::editmap() height = TERMY; offsetX = VIEW_OFFSET_X; infoHeight = 0; - sel_ter = undefined_ter_id; - target_ter = undefined_ter_id; - sel_frn = undefined_furn_id; - target_frn = undefined_furn_id; - ter_frn_mode = 0; - cur_field = nullptr; - cur_trap = tr_null; sel_field = -1; sel_field_intensity = -1; - sel_trap = undefined_trap_id; - fsel = undefined_furn_id; - fset = undefined_furn_id; - trsel = undefined_trap_id; - trset = undefined_trap_id; w_info = catacurses::window(); - w_help = catacurses::window(); - padding = std::string( std::max( 0, width - 2 ), ' ' ); blink = false; altblink = false; moveall = false; @@ -202,11 +186,6 @@ editmap::editmap() refresh_mplans = true; tmax = point( getmaxx( g->w_terrain ), getmaxy( g->w_terrain ) ); - fids[fd_null] = "-clear-"; - fids[fd_fire_vent] = "fire_vent"; - fids[fd_push_items] = "push_items"; - fids[fd_shock_vent] = "shock_vent"; - fids[fd_acid_vent] = "acid_vent"; target_list.clear(); hilights.clear(); hilights["mplan"].blink_interval.push_back( true ); @@ -273,14 +252,6 @@ tripoint editmap::pos2screen( const tripoint &p ) return p + tmax / 2 - target.xy(); } -/* - * screen position to map position - */ -tripoint editmap::screen2pos( const tripoint &p ) -{ - return p + target.xy() + point( -POSX, -POSY ); -} - /* * get_direction with extended moving via HJKL keys */ @@ -313,31 +284,6 @@ bool editmap::eget_direction( tripoint &p, const std::string &action ) const return true; } -/* - * update the help text, which hijacks w_info's bottom border - */ -void editmap::uphelp( const std::string &txt1, const std::string &txt2, const std::string &title ) -{ - - if( !txt1.empty() ) { - mvwprintw( w_help, point_zero, padding ); - mvwprintw( w_help, point_south, padding ); - mvwprintw( w_help, point( 0, !txt2.empty() ? 0 : 1 ), txt1 ); - if( !txt2.empty() ) { - mvwprintw( w_help, point_south, txt2 ); - } - } - if( !title.empty() ) { - int hwidth = getmaxx( w_help ); - mvwhline( w_help, point( 0, 2 ), LINE_OXOX, hwidth ); - int starttxt = static_cast( ( hwidth - title.size() - 4 ) / 2 ); - mvwprintw( w_help, point( starttxt, 2 ), "< " ); - wprintz( w_help, c_cyan, title ); - wprintw( w_help, " >" ); - } - wrefresh( w_help ); -} - cata::optional editmap::edit() { target = g->u.pos() + g->u.view_offset; @@ -353,6 +299,7 @@ cata::optional editmap::edit() ctxt.register_action( "EDIT_TRAPS" ); ctxt.register_action( "EDIT_FIELDS" ); ctxt.register_action( "EDIT_TERRAIN" ); + ctxt.register_action( "EDIT_FURNITURE" ); ctxt.register_action( "EDIT_OVERMAP" ); ctxt.register_action( "EDIT_ITEMS" ); ctxt.register_action( "EDIT_MONSTER" ); @@ -365,12 +312,9 @@ cata::optional editmap::edit() uberdraw = uistate.editmap_nsa_viewmode; infoHeight = 20; + blink = true; w_info = catacurses::newwin( infoHeight, width, point( offsetX, TERMY - infoHeight ) ); - w_help = catacurses::newwin( 3, width, point( offsetX + 1, TERMY - 3 ) ); - for( int i = 0; i < getmaxx( w_help ); i++ ) { - mvwaddch( w_help, point( i, 2 ), LINE_OXOX ); - } do { if( target_list.empty() ) { target_list.push_back( target ); // 'editmap.target_list' always has point 'editmap.target' at least @@ -378,20 +322,32 @@ cata::optional editmap::edit() if( target_list.size() == 1 ) { origin = target; // 'editmap.origin' only makes sense if we have a list of target points. } - update_view( true ); - uphelp( pgettext( "map editor", "[t]rap, [f]ield, [HJKL] move++, [v] showall" ), - pgettext( "map editor", "[g] terrain/furn, [o] mapgen, [i]tems, [q]uit" ), - pgettext( "map editor state", "Looking around" ) ); + // \u00A0 is the non-breaking space + update_view_with_help( string_format( pgettext( "keybinding descriptions", + "%s, %s, [%s,%s,%s,%s]\u00A0fast scroll, %s, %s, %s, %s, %s, %s" ), + ctxt.describe_key_and_name( "EDIT_TRAPS" ), + ctxt.describe_key_and_name( "EDIT_FIELDS" ), + ctxt.get_desc( "LEFT_WIDE", 1 ), ctxt.get_desc( "RIGHT_WIDE", 1 ), + ctxt.get_desc( "UP_WIDE", 1 ), ctxt.get_desc( "DOWN_WIDE", 1 ), + ctxt.describe_key_and_name( "EDITMAP_SHOW_ALL" ), + ctxt.describe_key_and_name( "EDIT_TERRAIN" ), + ctxt.describe_key_and_name( "EDIT_FURNITURE" ), + ctxt.describe_key_and_name( "EDIT_OVERMAP" ), + ctxt.describe_key_and_name( "EDIT_ITEMS" ), + ctxt.describe_key_and_name( "QUIT" ) ), pgettext( "map editor state", "Looking around" ) ); + action = ctxt.handle_input( BLINK_SPEED ); if( action == "EDIT_TERRAIN" ) { - edit_ter(); + edit_feature(); + } else if( action == "EDIT_FURNITURE" ) { + edit_feature(); } else if( action == "EDIT_FIELDS" ) { edit_fld(); } else if( action == "EDIT_ITEMS" ) { edit_itm(); } else if( action == "EDIT_TRAPS" ) { - edit_trp(); + edit_feature(); } else if( action == "EDITMAP_SHOW_ALL" ) { uberdraw = !uberdraw; } else if( action == "EDIT_MONSTER" ) { @@ -407,13 +363,10 @@ cata::optional editmap::edit() target_list.push_back( target ); } else if( move_target( action, 1 ) ) { recalc_target( editshape ); // target_list must follow movement - if( target_list.size() > 1 ) { - blink = true; // display entire list if it's more than just target point - } - } else { - blink = !blink; } + blink = action == "TIMEOUT" ? !blink : true; } while( action != "QUIT" ); + blink = false; uistate.editmap_nsa_viewmode = uberdraw; @@ -423,11 +376,6 @@ cata::optional editmap::edit() return cata::nullopt; } -// pending radiation / misc edit -enum edit_drawmode { - drawmode_default, drawmode_radiation, -}; - /* * This is like game::draw_ter except it completely ignores line of sight, lighting, boomered, etc. * This is a map editor after all. @@ -484,28 +432,12 @@ void editmap::uber_draw_ter( const catacurses::window &w, map *m ) refresh_mplans = false; } } -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -///// redraw map and info (or not) -void editmap::update_view( bool update_info ) -{ - // Debug helper 2, child of debug helper - // Gather useful data - int veh_in = -1; - const optional_vpart_position vp = g->m.veh_at( target ); - if( vp ) { - veh_in = vp->is_inside(); - } - - target_ter = g->m.ter( target ); - const ter_t &terrain_type = target_ter.obj(); - target_frn = g->m.furn( target ); - const furn_t &furniture_type = target_frn.obj(); - cur_field = &g->m.get_field( target ); - cur_trap = g->m.tr_at( target ).loadid; +void editmap::update_view_with_help( const std::string &txt, const std::string &title ) +{ + // updating map const Creature *critter = g->critter_at( target ); - // update map always werase( g->w_terrain ); if( uberdraw ) { @@ -520,36 +452,74 @@ void editmap::update_view( bool update_info ) } else { g->m.drawsq( g->w_terrain, g->u, target, true, true, target ); } - g->draw_cursor( target ); - - // hilight target_list points if blink=true (and if it's more than a point ) - if( blink && target_list.size() > 1 ) { - for( auto &elem : target_list ) { - const tripoint &p = elem; - // but only if there's no vehicles/mobs/npcs on a point - if( !g->m.veh_at( p ) && !g->critter_at( p ) ) { - const ter_t &terrain = g->m.ter( p ).obj(); - char t_sym = terrain.symbol(); - nc_color t_col = terrain.color(); - - if( g->m.has_furn( p ) ) { - const furn_t &furniture_type = g->m.furn( p ).obj(); - t_sym = furniture_type.symbol(); - t_col = furniture_type.color(); +#ifdef TILES + // give some visual indication of different cursor moving modes + if( use_tiles && altblink ) { + point p[2] = { origin.xy(), target.xy() }; + if( editshape == editmap_rect || editshape == editmap_rect_filled || p[0] == p[1] ) { + if( p[0] == p[1] ) { + // ensure more than one cursor is drawn to differ from resizing mode + p[0] += point_north_west; + p[1] += point_south_east; + } + for( const auto &pi : p ) { + for( const auto &pj : p ) { + g->draw_cursor( tripoint( pi.x, pj.y, target.z ) ); } - const field &t_field = g->m.field_at( p ); - if( t_field.field_count() > 0 ) { - field_type_id t_ftype = t_field.displayed_field_type(); - const field_entry *t_fld = t_field.find_field( t_ftype ); - if( t_fld != nullptr ) { - t_col = t_fld->color(); - t_sym = t_fld->symbol()[0]; + } + } else if( editshape == editmap_circle ) { + g->draw_cursor( target ); + g->draw_cursor( origin * 2 - target ); + } else if( editshape == editmap_line ) { + g->draw_cursor( origin ); + g->draw_cursor( target ); + } + } else { +#endif + g->draw_cursor( target ); +#ifdef TILES + } +#endif + + // hilight target_list points if blink=true + if( blink ) { + for( const auto &p : target_list ) { +#ifdef TILES + if( use_tiles ) { + if( draw_target_override ) { + draw_target_override.value()( p ); + } else { + g->draw_highlight( p ); + } + } else { +#endif + // but only if there's no vehicles/mobs/npcs on a point + if( !g->m.veh_at( p ) && !g->critter_at( p ) ) { + const ter_t &terrain = g->m.ter( p ).obj(); + char t_sym = terrain.symbol(); + nc_color t_col = terrain.color(); + + if( g->m.has_furn( p ) ) { + const furn_t &furniture_type = g->m.furn( p ).obj(); + t_sym = furniture_type.symbol(); + t_col = furniture_type.color(); } + const field &t_field = g->m.field_at( p ); + if( t_field.field_count() > 0 ) { + field_type_id t_ftype = t_field.displayed_field_type(); + const field_entry *t_fld = t_field.find_field( t_ftype ); + if( t_fld != nullptr ) { + t_col = t_fld->color(); + t_sym = t_fld->symbol()[0]; + } + } + t_col = altblink ? green_background( t_col ) : cyan_background( t_col ); + tripoint scrpos = pos2screen( p ); + mvwputch( g->w_terrain, scrpos.xy(), t_col, t_sym ); } - t_col = altblink ? green_background( t_col ) : cyan_background( t_col ); - tripoint scrpos = pos2screen( p ); - mvwputch( g->w_terrain, scrpos.xy(), t_col, t_sym ); +#ifdef TILES } +#endif } } @@ -573,119 +543,140 @@ void editmap::update_view( bool update_info ) wrefresh( g->w_terrain ); g->draw_panels(); - if( update_info ) { // only if requested; this messes up windows layered on top - int off = 1; - draw_border( w_info ); + // updating info + werase( w_info ); - mvwprintz( w_info, point( 2, 0 ), c_light_gray, "< %d,%d >", target.x, target.y ); - for( int i = 1; i < infoHeight - 2; i++ ) { // clear window - mvwprintz( w_info, point( 1, i ), c_white, padding ); - } + const optional_vpart_position vp = g->m.veh_at( target ); + std::string veh_msg; + if( !vp ) { + veh_msg = pgettext( "vehicle", "no" ); + } else if( vp->is_inside() ) { + veh_msg = pgettext( "vehicle", "in" ); + } else { + veh_msg = pgettext( "vehicle", "out" ); + } - mvwputch( w_info, point( 2, off ), terrain_type.color(), terrain_type.symbol() ); - mvwprintw( w_info, point( 4, off ), _( "%d: %s; movecost %d" ), g->m.ter( target ).to_i(), - terrain_type.name(), - terrain_type.movecost + const ter_t &terrain_type = g->m.ter( target ).obj(); + const furn_t &furniture_type = g->m.furn( target ).obj(); + + int off = 1; + draw_border( w_info ); + + mvwprintz( w_info, point( 2, 0 ), c_light_gray, "< %d,%d >", target.x, target.y ); + + mvwputch( w_info, point( 2, off ), terrain_type.color(), terrain_type.symbol() ); + mvwprintw( w_info, point( 4, off ), _( "%d: %s; movecost %d" ), g->m.ter( target ).to_i(), + terrain_type.name(), + terrain_type.movecost + ); + off++; // 2 + if( g->m.furn( target ) > 0 ) { + mvwputch( w_info, point( 2, off ), furniture_type.color(), furniture_type.symbol() ); + mvwprintw( w_info, point( 4, off ), _( "%d: %s; movecost %d movestr %d" ), + g->m.furn( target ).to_i(), + furniture_type.name(), + furniture_type.movecost, + furniture_type.move_str_req ); - off++; // 2 - if( g->m.furn( target ) > 0 ) { - mvwputch( w_info, point( 2, off ), furniture_type.color(), furniture_type.symbol() ); - mvwprintw( w_info, point( 4, off ), _( "%d: %s; movecost %d movestr %d" ), - g->m.furn( target ).to_i(), - furniture_type.name(), - furniture_type.movecost, - furniture_type.move_str_req - ); - off++; // 3 - } - const auto &map_cache = g->m.get_cache( target.z ); - - mvwprintw( w_info, point( 1, off++ ), _( "dist: %d u_see: %d v_in: %d scent: %d" ), - rl_dist( g->u.pos(), target ), static_cast( g->u.sees( target ) ), - veh_in, g->scent.get( target ) ); - mvwprintw( w_info, point( 1, off++ ), _( "sight_range: %d, daylight_sight_range: %d," ), - g->u.sight_range( g->light_level( g->u.posz() ) ), - g->u.sight_range( current_daylight_level( calendar::turn ) ) ); - mvwprintw( w_info, point( 1, off++ ), _( "transparency: %.5f, visibility: %.5f," ), - map_cache.transparency_cache[target.x][target.y], - map_cache.seen_cache[target.x][target.y] ); - map::apparent_light_info al = map::apparent_light_helper( map_cache, target ); - int apparent_light = static_cast( - g->m.apparent_light_at( target, g->m.get_visibility_variables_cache() ) ); - mvwprintw( w_info, point( 1, off++ ), _( "outside: %d obstructed: %d" ), - static_cast( g->m.is_outside( target ) ), - static_cast( al.obstructed ) ); - mvwprintw( w_info, point( 1, off++ ), _( "light_at: %s" ), - map_cache.lm[target.x][target.y].to_string() ); - mvwprintw( w_info, point( 1, off++ ), _( "apparent light: %.5f (%d)" ), - al.apparent_light, apparent_light ); - std::string extras; - if( veh_in >= 0 ) { - extras += _( " [vehicle]" ); - } - if( g->m.has_flag( TFLAG_INDOORS, target ) ) { - extras += _( " [indoors]" ); - } - if( g->m.has_flag( TFLAG_SUPPORTS_ROOF, target ) ) { - extras += _( " [roof]" ); - } + off++; // 3 + } + const auto &map_cache = g->m.get_cache( target.z ); + + const std::string u_see_msg = g->u.sees( target ) ? _( "yes" ) : _( "no" ); + mvwprintw( w_info, point( 1, off++ ), _( "dist: %d u_see: %s veh: %s scent: %d" ), + rl_dist( g->u.pos(), target ), u_see_msg, veh_msg, g->scent.get( target ) ); + mvwprintw( w_info, point( 1, off++ ), _( "sight_range: %d, daylight_sight_range: %d," ), + g->u.sight_range( g->light_level( g->u.posz() ) ), + g->u.sight_range( current_daylight_level( calendar::turn ) ) ); + mvwprintw( w_info, point( 1, off++ ), _( "transparency: %.5f, visibility: %.5f," ), + map_cache.transparency_cache[target.x][target.y], + map_cache.seen_cache[target.x][target.y] ); + map::apparent_light_info al = map::apparent_light_helper( map_cache, target ); + int apparent_light = static_cast( + g->m.apparent_light_at( target, g->m.get_visibility_variables_cache() ) ); + mvwprintw( w_info, point( 1, off++ ), _( "outside: %d obstructed: %d" ), + static_cast( g->m.is_outside( target ) ), + static_cast( al.obstructed ) ); + mvwprintw( w_info, point( 1, off++ ), _( "light_at: %s" ), + map_cache.lm[target.x][target.y].to_string() ); + mvwprintw( w_info, point( 1, off++ ), _( "apparent light: %.5f (%d)" ), + al.apparent_light, apparent_light ); + std::string extras; + if( vp ) { + extras += _( " [vehicle]" ); + } + if( g->m.has_flag( TFLAG_INDOORS, target ) ) { + extras += _( " [indoors]" ); + } + if( g->m.has_flag( TFLAG_SUPPORTS_ROOF, target ) ) { + extras += _( " [roof]" ); + } - mvwprintw( w_info, point( 1, off ), "%s %s", g->m.features( target ).c_str(), extras ); - // 9 - off++; - for( auto &fld : *cur_field ) { - const field_entry &cur = fld.second; - mvwprintz( w_info, point( 1, off ), cur.color(), - _( "field: %s L:%d[%s] A:%d" ), - cur.get_field_type().id().c_str(), - cur.get_field_intensity(), - cur.name(), - to_turns( cur.get_field_age() ) - ); - off++; // 10ish - } + mvwprintw( w_info, point( 1, off ), "%s %s", g->m.features( target ), extras ); + // 9 + off++; + for( auto &fld : g->m.get_field( target ) ) { + const field_entry &cur = fld.second; + mvwprintz( w_info, point( 1, off ), cur.color(), + _( "field: %s L:%d[%s] A:%d" ), + cur.get_field_type().id().str(), + cur.get_field_intensity(), + cur.name(), + to_turns( cur.get_field_age() ) + ); + off++; // 10ish + } - if( cur_trap != tr_null ) { - auto &t = cur_trap.obj(); - mvwprintz( w_info, point( 1, off ), t.color, _( "trap: %s (%d)" ), t.name(), cur_trap.to_i() ); - off++; // 11 - } + const trap &cur_trap = g->m.tr_at( target ); + if( cur_trap.loadid != tr_null ) { + mvwprintz( w_info, point( 1, off ), cur_trap.color, _( "trap: %s (%d)" ), cur_trap.name(), + cur_trap.loadid.to_i() ); + off++; // 11 + } - if( critter != nullptr ) { - off = critter->print_info( w_info, off, 5, 1 ); - } else if( vp ) { - mvwprintw( w_info, point( 1, off ), _( "There is a %s there. Parts:" ), vp->vehicle().name ); - off++; - vp->vehicle().print_part_list( w_info, off, getmaxy( w_info ) - 1, width, vp->part_index() ); - off += 6; - } - map_stack target_stack = g->m.i_at( target ); - const int target_stack_size = target_stack.size(); - if( !g->m.has_flag( "CONTAINER", target ) && target_stack_size > 0 ) { - trim_and_print( w_info, point( 1, off ), getmaxx( w_info ), c_light_gray, - _( "There is a %s there." ), - target_stack.begin()->tname() ); + if( critter != nullptr ) { + off = critter->print_info( w_info, off, 5, 1 ); + } else if( vp ) { + mvwprintw( w_info, point( 1, off ), _( "There is a %s there. Parts:" ), vp->vehicle().name ); + off++; + vp->vehicle().print_part_list( w_info, off, getmaxy( w_info ) - 1, width, vp->part_index() ); + off += 6; + } + map_stack target_stack = g->m.i_at( target ); + const int target_stack_size = target_stack.size(); + if( !g->m.has_flag( "CONTAINER", target ) && target_stack_size > 0 ) { + trim_and_print( w_info, point( 1, off ), getmaxx( w_info ), c_light_gray, + _( "There is a %s there." ), + target_stack.begin()->tname() ); + off++; + if( target_stack_size > 1 ) { + mvwprintw( w_info, point( 1, off ), ngettext( "There is %d other item there as well.", + "There are %d other items there as well.", + target_stack_size - 1 ), + target_stack_size - 1 ); off++; - if( target_stack_size > 1 ) { - mvwprintw( w_info, point( 1, off ), ngettext( "There is %d other item there as well.", - "There are %d other items there as well.", - target_stack_size - 1 ), - target_stack_size - 1 ); - off++; - } } + } - if( g->m.has_graffiti_at( target ) ) { - mvwprintw( w_info, point( 1, off ), - g->m.ter( target ) == t_grave_new ? _( "Graffiti: %s" ) : _( "Inscription: %s" ), - g->m.graffiti_at( target ) ); - } - - wrefresh( w_info ); - - uphelp(); + if( g->m.has_graffiti_at( target ) ) { + mvwprintw( w_info, point( 1, off ), + g->m.ter( target ) == t_grave_new ? _( "Graffiti: %s" ) : _( "Inscription: %s" ), + g->m.graffiti_at( target ) ); } + // updating help + int line = getmaxy( w_info ) - 1; + if( !title.empty() ) { + const std::string str = string_format( "< %s >", title ); + center_print( w_info, line, BORDER_COLOR, str ); + } + --line; + std::vector folded = foldstring( txt, width - 2 ); + for( auto it = folded.rbegin(); it != folded.rend(); ++it, --line ) { + nc_color dummy = c_light_gray; + print_colored_text( w_info, point( 1, line ), dummy, c_light_gray, *it ); + } + wrefresh( w_info ); } static ter_id get_alt_ter( bool isvert, ter_id sel_ter ) @@ -713,338 +704,302 @@ static ter_id get_alt_ter( bool isvert, ter_id sel_ter ) return undefined_ter_id; } -/** - * Adds the delta value to the given id and adjusts for overflow out of the valid - * range [0...count-1]. - * @return Whether an overflow happened. - */ -template -bool increment( int_id &id, const int delta, const int count ) +template +static std::string info_title(); + +template<> +std::string info_title() { - const int new_id = id.to_i() + delta; - if( new_id < 0 ) { - id = int_id( new_id + count ); - return true; - } else if( new_id >= count ) { - id = int_id( new_id - count ); - return true; - } else { - id = int_id( new_id ); - return false; - } + return pgettext( "map editor state", "Terrain" ); } -template -bool would_overflow( const int_id &id, const int delta, const int count ) + +template<> +std::string info_title() { - const int new_id = id.to_i() + delta; - return new_id < 0 || new_id >= count; + return pgettext( "map editor state", "Furniture" ); } -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -///// edit terrain type / furniture -int editmap::edit_ter() +template<> +std::string info_title() { - int ret = 0; - int pwh = TERMY - 4; + return pgettext( "map editor: traps editing", "Traps" ); +} - catacurses::window w_pickter = catacurses::newwin( pwh, width, point( offsetX, VIEW_OFFSET_Y ) ); - draw_border( w_pickter ); - wrefresh( w_pickter ); +template +static T_id feature( const tripoint &p ); - int pickh = pwh - 2; - int pickw = width - 4; +template<> +ter_id feature( const tripoint &p ) +{ + return g->m.ter( p ); +} - if( sel_ter == undefined_ter_id ) { - sel_ter = target_ter; - } +template<> +furn_id feature( const tripoint &p ) +{ + return g->m.furn( p ); +} - if( sel_frn == undefined_furn_id ) { - sel_frn = target_frn; - } +template<> +trap_id feature( const tripoint &p ) +{ + return g->m.tr_at( p ).loadid; +} - ter_id lastsel_ter = sel_ter; - furn_id lastsel_frn = sel_frn; +template +static int symbol( const T_t &t ); - const int xmin = 3; // left margin - int xmax = pickw - xmin; - int tymax = static_cast( ter_t::count() / xmax ); - if( ter_t::count() % xmax != 0 ) { - tymax++; - } - int fymax = static_cast( furn_t::count() / xmax ); - if( furn_t::count() % xmax != 0 ) { - fymax++; - } +template<> +int symbol( const ter_t &t ) +{ + return t.symbol(); +} - tripoint sel_terp = tripoint_min; // screen coordinates of current selection - tripoint lastsel_terp = tripoint_min; // and last selection - tripoint target_terp = tripoint_min; // and current tile - tripoint sel_frnp = tripoint_min; // for furniture "" - tripoint lastsel_frnp = tripoint_min; - tripoint target_frnp = tripoint_min; +template<> +int symbol( const furn_t &t ) +{ + return t.symbol(); +} - input_context ctxt( "EDITMAP_TERRAIN" ); - ctxt.register_directions(); - ctxt.register_action( "EDITMAP_SHOW_ALL" ); - ctxt.register_action( "CONFIRM" ); - ctxt.register_action( "CONFIRM_QUIT" ); - ctxt.register_action( "EDITMAP_TAB" ); - ctxt.register_action( "EDITMAP_MOVE" ); - ctxt.register_action( "QUIT" ); - ctxt.register_action( "HELP_KEYBINDINGS" ); - std::string action; +template<> +int symbol( const trap &t ) +{ + return t.sym; +} - int mode = ter_frn_mode; - do { - if( mode != ter_frn_mode ) { - mode = ter_frn_mode; - wrefresh( w_pickter ); - } +template +static nc_color color( const T_t &t ); - // cursor is green for terrain or furniture, depending on selection - nc_color c_tercurs = ter_frn_mode == 0 ? c_light_green : c_dark_gray; - nc_color c_frncurs = ter_frn_mode == 1 ? c_light_green : c_dark_gray; - - int cur_t = 0; - int tstart = 2; - // draw icon grid - for( int y = tstart; y < pickh && cur_t < static_cast( ter_t::count() ); y += 2 ) { - for( int x = xmin; x < pickw && cur_t < static_cast( ter_t::count() ); x++, cur_t++ ) { - const ter_id tid( cur_t ); - const ter_t &ttype = tid.obj(); - mvwputch( w_pickter, point( x, y ), ter_frn_mode == 0 ? ttype.color() : c_dark_gray, - ttype.symbol() ); - if( tid == sel_ter ) { - sel_terp = tripoint( x, y, target.z ); - } else if( tid == lastsel_ter ) { - lastsel_terp = tripoint( x, y, target.z ); - } else if( tid == target_ter ) { - target_terp = tripoint( x, y, target.z ); - } - } - } - // clear last cursor area - mvwputch( w_pickter, lastsel_terp.xy() + point_south_west, c_tercurs, ' ' ); - mvwputch( w_pickter, lastsel_terp.xy() + point_north_east, c_tercurs, ' ' ); - mvwputch( w_pickter, lastsel_terp.xy() + point_south_east, c_tercurs, ' ' ); - mvwputch( w_pickter, lastsel_terp.xy() + point_north_west, c_tercurs, ' ' ); - // indicate current tile - mvwputch( w_pickter, target_terp.xy() + point_south, c_light_gray, '^' ); - mvwputch( w_pickter, target_terp.xy() + point_north, c_light_gray, 'v' ); - // draw cursor around selected terrain icon - mvwputch( w_pickter, sel_terp.xy() + point_south_west, c_tercurs, LINE_XXOO ); - mvwputch( w_pickter, sel_terp.xy() + point_north_east, c_tercurs, LINE_OOXX ); - mvwputch( w_pickter, sel_terp.xy() + point_south_east, c_tercurs, LINE_XOOX ); - mvwputch( w_pickter, sel_terp.xy() + point_north_west, c_tercurs, LINE_OXXO ); - - draw_border( w_pickter ); - // calculate offset, print terrain selection info - int tlen = tymax * 2; - int off = tstart + tlen; - mvwprintw( w_pickter, point( 1, off ), padding ); - if( ter_frn_mode == 0 ) { // unless furniture is selected - const ter_t &pttype = sel_ter.obj(); - - for( int i = 1; i < width - 2; i++ ) { - mvwaddch( w_pickter, point( i, 0 ), LINE_OXOX ); - } +template<> +nc_color color( const ter_t &t ) +{ + return t.color(); +} - mvwprintw( w_pickter, point( 2, 0 ), "< %s[%d]: %s >", pttype.id.c_str(), pttype.id.id().to_i(), - pttype.name() ); - mvwprintz( w_pickter, point( 2, off ), c_white, _( "movecost %d" ), pttype.movecost ); - std::string extras; - if( pttype.has_flag( TFLAG_INDOORS ) ) { - extras += _( "[indoors] " ); - } - if( pttype.has_flag( TFLAG_SUPPORTS_ROOF ) ) { - extras += _( "[roof] " ); - } - wprintw( w_pickter, " %s", extras ); - } +template<> +nc_color color( const furn_t &t ) +{ + return t.color(); +} - off += 2; - int cur_f = 0; - int fstart = off; // calculate vertical offset, draw furniture icons - for( int y = fstart; y < pickh && cur_f < static_cast( furn_t::count() ); y += 2 ) { - for( int x = xmin; x < pickw && cur_f < static_cast( furn_t::count() ); x++, cur_f++ ) { - const furn_id fid( cur_f ); - const furn_t &ftype = fid.obj(); - mvwputch( w_pickter, point( x, y ), ter_frn_mode == 1 ? ftype.color() : c_dark_gray, - ftype.symbol() ); - - if( fid == sel_frn ) { - sel_frnp = tripoint( x, y, target.z ); - } else if( fid == lastsel_frn ) { - lastsel_frnp = tripoint( x, y, target.z ); - } else if( fid == target_frn ) { - target_frnp = tripoint( x, y, target.z ); - } - } - } +template<> +nc_color color( const trap &t ) +{ + return t.color; +} - mvwputch( w_pickter, lastsel_frnp.xy() + point_south_west, c_frncurs, ' ' ); - mvwputch( w_pickter, lastsel_frnp.xy() + point_north_east, c_frncurs, ' ' ); - mvwputch( w_pickter, lastsel_frnp.xy() + point_south_east, c_frncurs, ' ' ); - mvwputch( w_pickter, lastsel_frnp.xy() + point_north_west, c_frncurs, ' ' ); +template +static std::string describe( const T_t &t ); - mvwputch( w_pickter, target_frnp.xy() + point_south, c_light_gray, '^' ); - mvwputch( w_pickter, target_frnp.xy() + point_north, c_light_gray, 'v' ); +template<> +std::string describe( const ter_t &type ) +{ + return string_format( _( "Move cost: %d\nIndoors: %s\nRoof: %s" ), type.movecost, + type.has_flag( TFLAG_INDOORS ) ? _( "Yes" ) : _( "No" ), + type.has_flag( TFLAG_SUPPORTS_ROOF ) ? _( "Yes" ) : _( "No" ) ); +} - mvwputch( w_pickter, sel_frnp.xy() + point_south_west, c_frncurs, LINE_XXOO ); - mvwputch( w_pickter, sel_frnp.xy() + point_north_east, c_frncurs, LINE_OOXX ); - mvwputch( w_pickter, sel_frnp.xy() + point_south_east, c_frncurs, LINE_XOOX ); - mvwputch( w_pickter, sel_frnp.xy() + point_north_west, c_frncurs, LINE_OXXO ); +template<> +std::string describe( const furn_t &type ) +{ + return string_format( _( "Move cost: %d\nIndoors: %s\nRoof: %s" ), type.movecost, + type.has_flag( TFLAG_INDOORS ) ? _( "Yes" ) : _( "No" ), + type.has_flag( TFLAG_SUPPORTS_ROOF ) ? _( "Yes" ) : _( "No" ) ); +} - int flen = fymax * 2; - off += flen; - mvwprintw( w_pickter, point( 1, off ), padding ); - if( ter_frn_mode == 1 ) { - const furn_t &pftype = sel_frn.obj(); +template<> +std::string describe( const trap &type ) +{ + return string_format( _( "Visible: %d\nAvoidance: %d\nDifficulty: %d\nBenign: %s" ), + type.get_visibility(), type.get_avoidance(), type.get_difficulty(), + type.is_benign() ? _( "Yes" ) : _( "No" ) ); +} - for( int i = 1; i < width - 2; i++ ) { - mvwaddch( w_pickter, point( i, 0 ), LINE_OXOX ); - } +template +static void draw_override( const tripoint &p, const T_id &id ); - mvwprintw( w_pickter, point( 2, 0 ), "< %s[%d]: %s >", pftype.id.c_str(), pftype.id.id().to_i(), - pftype.name() ); - mvwprintz( w_pickter, point( 2, off ), c_white, _( "movecost %d" ), pftype.movecost ); - std::string fextras; - if( pftype.has_flag( TFLAG_INDOORS ) ) { - fextras += _( "[indoors] " ); - } - if( pftype.has_flag( TFLAG_SUPPORTS_ROOF ) ) { - fextras += _( "[roof] " ); +template<> +void draw_override( const tripoint &p, const ter_id &id ) +{ + g->draw_terrain_override( p, id ); +} + +template<> +void draw_override( const tripoint &p, const furn_id &id ) +{ + g->draw_furniture_override( p, id ); +} + +template<> +void draw_override( const tripoint &p, const trap_id &id ) +{ + g->draw_trap_override( p, id ); +} + +template +static void apply( const T_t &t, shapetype editshape, const tripoint &target, + const tripoint &origin, const std::vector &target_list ); + +template<> +void apply( const ter_t &t, const shapetype editshape, const tripoint &target, + const tripoint &origin, const std::vector &target_list ) +{ + bool isvert = false; + bool ishori = false; + bool doalt = false; + ter_id teralt = undefined_ter_id; + int alta = -1; + int altb = -1; + const ter_id sel_ter = t.id.id(); + if( editshape == editmap_rect ) { + if( t.symbol() == LINE_XOXO || t.symbol() == '|' ) { + isvert = true; + teralt = get_alt_ter( isvert, sel_ter ); + } else if( t.symbol() == LINE_OXOX || t.symbol() == '-' ) { + ishori = true; + teralt = get_alt_ter( isvert, sel_ter ); + } + if( teralt != undefined_ter_id ) { + if( isvert ) { + alta = target.y; + altb = origin.y; + } else { + alta = target.x; + altb = origin.x; } - wprintw( w_pickter, " %s", fextras ); + doalt = true; } + } - // draw green |'s around terrain or furniture tilesets depending on selection - for( int y = tstart - 1; y < tstart + tlen + 1; y++ ) { - mvwputch( w_pickter, point( 1, y ), c_light_green, ter_frn_mode == 0 ? '|' : ' ' ); - mvwputch( w_pickter, point( width - 2, y ), c_light_green, ter_frn_mode == 0 ? '|' : ' ' ); - } - for( int y = fstart - 1; y < fstart + flen + 1; y++ ) { - mvwputch( w_pickter, point( 1, y ), c_light_green, ter_frn_mode == 1 ? '|' : ' ' ); - mvwputch( w_pickter, point( width - 2, y ), c_light_green, ter_frn_mode == 1 ? '|' : ' ' ); + for( auto &elem : target_list ) { + ter_id wter = sel_ter; + if( doalt ) { + if( isvert && ( elem.y == alta || elem.y == altb ) ) { + wter = teralt; + } else if( ishori && ( elem.x == alta || elem.x == altb ) ) { + wter = teralt; + } } + g->m.ter_set( elem, wter ); + } +} - uphelp( pgettext( "Map editor: terrain/furniture shortkeys", - "[s/tab] shape select, [m]ove, [<>^v] select" ), - pgettext( "Map editor: terrain/furniture shortkeys", - "[enter] change, [g] change/quit, [q]uit, [v] showall" ), - pgettext( "Map editor: terrain/furniture editing menu", "Terrain / Furniture" ) ); - - wrefresh( w_pickter ); - - action = ctxt.handle_input(); - lastsel_ter = sel_ter; - lastsel_frn = sel_frn; - if( ter_frn_mode == 0 ) { - if( action == "LEFT" ) { - increment( sel_ter, -1, ter_t::count() ); - } else if( action == "RIGHT" ) { - increment( sel_ter, +1, ter_t::count() ); - } else if( action == "UP" ) { - if( would_overflow( sel_ter, -xmax, ter_t::count() ) ) { - ter_frn_mode = ter_frn_mode == 0 ? 1 : 0; - } else { - increment( sel_ter, -xmax, ter_t::count() ); - } - } else if( action == "DOWN" ) { - if( would_overflow( sel_ter, +xmax, ter_t::count() ) ) { - ter_frn_mode = ter_frn_mode == 0 ? 1 : 0; - } else { - increment( sel_ter, +xmax, ter_t::count() ); - } - } else if( action == "CONFIRM" || action == "CONFIRM_QUIT" ) { - bool isvert = false; - bool ishori = false; - bool doalt = false; - ter_id teralt = undefined_ter_id; - int alta = -1; - int altb = -1; - if( editshape == editmap_rect ) { - const ter_t &t = sel_ter.obj(); - if( t.symbol() == LINE_XOXO || t.symbol() == '|' ) { - isvert = true; - teralt = get_alt_ter( isvert, sel_ter ); - } else if( t.symbol() == LINE_OXOX || t.symbol() == '-' ) { - ishori = true; - teralt = get_alt_ter( isvert, sel_ter ); - } - if( teralt != undefined_ter_id ) { - if( isvert ) { - alta = target.y; - altb = origin.y; - } else { - alta = target.x; - altb = origin.x; - } - doalt = true; - } - } +template<> +void apply( const furn_t &t, const shapetype, const tripoint &, + const tripoint &, const std::vector &target_list ) +{ + const furn_id sel_frn = t.id.id(); + for( auto &elem : target_list ) { + g->m.furn_set( elem, sel_frn ); + } +} - for( auto &elem : target_list ) { - ter_id wter = sel_ter; - if( doalt ) { - if( isvert && ( elem.y == alta || elem.y == altb ) ) { - wter = teralt; - } else if( ishori && ( elem.x == alta || elem.x == altb ) ) { - wter = teralt; - } - } - g->m.ter_set( elem, wter ); - } - if( action == "CONFIRM_QUIT" ) { - break; - } - update_view( false ); - } else if( action == "EDITMAP_TAB" || action == "EDITMAP_MOVE" ) { - ter_id sel_tmp = sel_ter; - select_shape( editshape, action == "EDITMAP_MOVE" ? 1 : 0 ); - sel_ter = sel_tmp; - } else if( action == "EDITMAP_SHOW_ALL" ) { - uberdraw = !uberdraw; - update_view( false ); - } - } else { // TODO: cleanup - if( action == "LEFT" ) { - increment( sel_frn, -1, furn_t::count() ); - } else if( action == "RIGHT" ) { - increment( sel_frn, +1, furn_t::count() ); - } else if( action == "UP" ) { - if( would_overflow( sel_frn, -xmax, furn_t::count() ) ) { - ter_frn_mode = ter_frn_mode == 0 ? 1 : 0; - } else { - increment( sel_frn, -xmax, furn_t::count() ); - } - } else if( action == "DOWN" ) { - if( would_overflow( sel_frn, +xmax, furn_t::count() ) ) { - ter_frn_mode = ter_frn_mode == 0 ? 1 : 0; - } else { - increment( sel_frn, +xmax, furn_t::count() ); - } - } else if( action == "CONFIRM" || action == "CONFIRM_QUIT" ) { - for( auto &elem : target_list ) { - g->m.furn_set( elem, sel_frn ); - } - if( action == "CONFIRM_QUIT" ) { - break; - } - update_view( false ); - } else if( action == "EDITMAP_TAB" || action == "EDITMAP_MOVE" ) { - furn_id sel_frn_tmp = sel_frn; - ter_id sel_ter_tmp = sel_ter; - select_shape( editshape, action == "EDITMAP_MOVE" ? 1 : 0 ); - sel_frn = sel_frn_tmp; - sel_ter = sel_ter_tmp; - } else if( action == "EDITMAP_SHOW_ALL" ) { +template<> +void apply( const trap &t, const shapetype, const tripoint &, + const tripoint &, const std::vector &target_list ) +{ + for( auto &elem : target_list ) { + g->m.trap_set( elem, t.loadid ); + } +} + +// edit terrain, furnitrue, or traps +template +void editmap::edit_feature() +{ + if( T_t::count() == 0 ) { + debugmsg( "Empty %s list", typeid( T_t ).name() ); + return; + } + + using T_id = decltype( T_t().id.id() ); + + uilist emenu; + emenu.w_width = width; + emenu.w_height = TERMY - infoHeight; + emenu.w_y = 0; + emenu.w_x = offsetX; + emenu.desc_enabled = true; + emenu.input_category = "EDITMAP_FEATURE"; + emenu.additional_actions = { + { "CONFIRM_QUIT", "" }, + { "EDITMAP_SHOW_ALL", "" }, + { "EDITMAP_TAB", "" }, + { "EDITMAP_MOVE", "" }, + { "HELP_KEYBINDINGS", "" } // to refresh the view after exiting from keybindings + }; + emenu.allow_additional = true; + + for( int i = 0; i < static_cast( T_t::count() ); ++i ) { + const T_t &type = T_id( i ).obj(); + std::string name; + if( type.name().empty() ) { + name = string_format( pgettext( "map feature id", "(%s)" ), type.id.str() ); + } else { + name = string_format( pgettext( "map feature name and id", "%s (%s)" ), type.name(), + type.id.str() ); + } + uilist_entry ent( name ); + ent.retval = i; + ent.enabled = true; + ent.hotkey = 0; + ent.extratxt.sym = symbol( type ); + ent.extratxt.color = color( type ); + ent.desc = describe( type ); + + emenu.entries.emplace_back( ent ); + } + int current_feature = emenu.selected = feature( target ).to_i(); + emenu.entries[current_feature].text_color = c_green; + + blink = true; + bool quit = false; + do { + const T_id override( emenu.selected ); + if( override ) { + draw_target_override = [override]( const tripoint & p ) { + draw_override( p, override ); + }; + } else { + draw_target_override = cata::nullopt; + } + input_context ctxt( emenu.input_category ); + update_view_with_help( string_format( pgettext( "keybinding descriptions", "%s, %s, %s, %s, %s" ), + ctxt.describe_key_and_name( "CONFIRM" ), + ctxt.describe_key_and_name( "CONFIRM_QUIT" ), + ctxt.describe_key_and_name( "EDITMAP_SHOW_ALL" ), + ctxt.describe_key_and_name( "EDITMAP_TAB" ), + ctxt.describe_key_and_name( "EDITMAP_MOVE" ) ), + info_title() ); + emenu.query( false, BLINK_SPEED ); + if( emenu.ret == UILIST_CANCEL ) { + quit = true; + } else if( ( emenu.ret >= 0 && static_cast( emenu.ret ) < T_t::count() ) || + ( emenu.ret == UILIST_ADDITIONAL && emenu.ret_act == "CONFIRM_QUIT" ) ) { + apply( T_id( emenu.selected ).obj(), editshape, target, origin, target_list ); + emenu.entries[current_feature].text_color = emenu.text_color; + current_feature = emenu.selected; + emenu.entries[current_feature].text_color = c_green; + quit = emenu.ret == UILIST_ADDITIONAL; + } else if( emenu.ret == UILIST_ADDITIONAL ) { + if( emenu.ret_act == "EDITMAP_TAB" ) { + select_shape( editshape, 0 ); + emenu.entries[current_feature].text_color = emenu.text_color; + current_feature = feature( target ).to_i(); + emenu.entries[current_feature].text_color = c_green; + } else if( emenu.ret_act == "EDITMAP_MOVE" ) { + select_shape( editshape, 1 ); + emenu.entries[current_feature].text_color = emenu.text_color; + current_feature = feature( target ).to_i(); + emenu.entries[current_feature].text_color = c_green; + } else if( emenu.ret_act == "EDITMAP_SHOW_ALL" ) { uberdraw = !uberdraw; - update_view( false ); } } - } while( action != "QUIT" ); - return ret; + blink = emenu.ret == UILIST_TIMEOUT ? !blink : true; + } while( !quit ); + blink = false; + draw_target_override = cata::nullopt; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1074,37 +1029,60 @@ void editmap::setup_fmenu( uilist &fmenu ) const field_type_id fid = static_cast( i ); fmenu.addentry( fid, true, -2, "" ); fmenu.entries[fid].extratxt.left = 1; - update_fmenu_entry( fmenu, *cur_field, fid ); + update_fmenu_entry( fmenu, g->m.get_field( target ), fid ); } if( sel_field >= 0 ) { fmenu.selected = sel_field; } } -int editmap::edit_fld() +void editmap::edit_fld() { - int ret = 0; uilist fmenu; fmenu.w_width = width; fmenu.w_height = TERMY - infoHeight; fmenu.w_y = 0; fmenu.w_x = offsetX; - fmenu.allow_anykey = true; setup_fmenu( fmenu ); + fmenu.input_category = "EDIT_FIELDS"; + fmenu.additional_actions = { + { "EDITMAP_TAB", "" }, + { "EDITMAP_MOVE", "" }, + { "LEFT", "" }, + { "RIGHT", "" }, + { "EDITMAP_SHOW_ALL", "" }, + { "HELP_KEYBINDINGS", "" } // to refresh the view after exiting from keybindings + }; + fmenu.allow_additional = true; + blink = true; do { - uphelp( pgettext( "Map editor: Field effects shortkeys", - "[s/tab] shape select, [m]ove, [<,>] intensity" ), - pgettext( "Map editor: Field effects shortkeys", "[enter] edit, [q]uit, [v] showall" ), - pgettext( "Map editor: Editing field effects", "Field effects" ) ); - - fmenu.query( false ); - if( fmenu.selected > 0 && fmenu.selected < static_cast( field_type::count() ) && - ( fmenu.ret > 0 || fmenu.keypress == KEY_LEFT || fmenu.keypress == KEY_RIGHT ) - ) { + const field_type_id override( fmenu.selected ); + if( override ) { + draw_target_override = [override]( const tripoint & p ) { + g->draw_field_override( p, override ); + }; + } else { + draw_target_override = cata::nullopt; + } + input_context ctxt( fmenu.input_category ); + // \u00A0 is the non-breaking space + update_view_with_help( string_format( pgettext( "keybinding descriptions", + "%s, %s, [%s,%s]\u00A0intensity, %s, %s, %s" ), + ctxt.describe_key_and_name( "EDITMAP_TAB" ), + ctxt.describe_key_and_name( "EDITMAP_MOVE" ), + ctxt.get_desc( "LEFT", 1 ), ctxt.get_desc( "RIGHT", 1 ), + ctxt.describe_key_and_name( "CONFIRM" ), + ctxt.describe_key_and_name( "QUIT" ), + ctxt.describe_key_and_name( "EDITMAP_SHOW_ALL" ) ), + pgettext( "Map editor: Editing field effects", "Field effects" ) ); + fmenu.query( false, BLINK_SPEED ); + if( ( fmenu.ret > 0 && static_cast( fmenu.ret ) < field_type::count() ) || + ( fmenu.ret == UILIST_ADDITIONAL && ( fmenu.ret_act == "LEFT" || fmenu.ret_act == "RIGHT" ) ) ) { + int field_intensity = 0; const field_type_id idx = static_cast( fmenu.selected ); - field_entry *fld = cur_field->find_field( idx ); + field_entry *fld = g->m.get_field( target ).find_field( idx ); if( fld != nullptr ) { field_intensity = fld->get_field_intensity(); } @@ -1133,10 +1111,10 @@ int editmap::edit_fld() if( femenu.ret >= 0 ) { fsel_intensity = femenu.ret; } - } else if( fmenu.keypress == KEY_RIGHT && + } else if( fmenu.ret_act == "RIGHT" && field_intensity < static_cast( ftype.get_max_intensity() ) ) { fsel_intensity++; - } else if( fmenu.keypress == KEY_LEFT && field_intensity > 0 ) { + } else if( fmenu.ret_act == "LEFT" && field_intensity > 0 ) { fsel_intensity--; } if( field_intensity != fsel_intensity || target_list.size() > 1 ) { @@ -1160,11 +1138,10 @@ int editmap::edit_fld() } } } - update_fmenu_entry( fmenu, *cur_field, idx ); + update_fmenu_entry( fmenu, g->m.get_field( target ), idx ); sel_field = fmenu.selected; sel_field_intensity = fsel_intensity; } - update_view( true ); } else if( fmenu.ret == 0 ) { for( auto &elem : target_list ) { field &t_field = g->m.get_field( elem ); @@ -1176,107 +1153,31 @@ int editmap::edit_fld() } } } - update_view( true ); sel_field = fmenu.selected; sel_field_intensity = 0; - } else if( fmenu.keypress == 's' || fmenu.keypress == '\t' || fmenu.keypress == 'm' ) { - int sel_tmp = fmenu.selected; - int ret = select_shape( editshape, fmenu.keypress == 'm' ? 1 : 0 ); - if( ret > 0 ) { - setup_fmenu( fmenu ); - } - fmenu.selected = sel_tmp; - } else if( fmenu.keypress == 'v' ) { - uberdraw = !uberdraw; - update_view( false ); - } - } while( fmenu.ret != UILIST_CANCEL ); - return ret; -} -///// edit traps -int editmap::edit_trp() -{ - int ret = 0; - int pwh = TERMY - infoHeight; - - catacurses::window w_picktrap = catacurses::newwin( pwh, width, point( offsetX, VIEW_OFFSET_Y ) ); - draw_border( w_picktrap ); - int tmax = pwh - 3; - int tshift = 0; - input_context ctxt( "EDITMAP_TRAPS" ); - ctxt.register_updown(); - ctxt.register_action( "EDITMAP_SHOW_ALL" ); - ctxt.register_action( "CONFIRM" ); - ctxt.register_action( "CONFIRM_QUIT" ); - ctxt.register_action( "EDITMAP_TAB" ); - ctxt.register_action( "EDITMAP_MOVE" ); - ctxt.register_action( "QUIT" ); - ctxt.register_action( "HELP_KEYBINDINGS" ); - std::string action; - if( trsel == undefined_trap_id ) { - trsel = cur_trap; - } - int num_trap_types = trap::count(); - do { - uphelp( pgettext( "map editor: traps shortkeys", "[s/tab] shape select, [m]ove, [v] showall" ), - pgettext( "map editor: traps shortkeys", "[enter] change, [t] change/quit, [q]uit" ), - pgettext( "map editor: traps editing", "Traps" ) ); - - if( trsel.to_i() < tshift ) { - tshift = trsel.to_i(); - } else if( trsel.to_i() > tshift + tmax ) { - tshift = trsel.to_i() - tmax; - } - std::string tnam; - for( int t = tshift; t <= tshift + tmax; t++ ) { - mvwprintz( w_picktrap, point( 1, t + 1 - tshift ), c_white, padding ); - if( t < num_trap_types ) { - auto &tr = trap_id( t ).obj(); - if( tr.is_null() ) { - tnam = _( "-clear-" ); - } else { - if( tr.name().length() > 0 ) { - //~ trap editor list entry. 1st string is display name, 2nd string is internal name of trap - tnam = string_format( _( "%s (%s)" ), tr.name(), tr.id.c_str() ); - } else { - tnam = tr.id.str(); - } + } else if( fmenu.ret == UILIST_ADDITIONAL ) { + if( fmenu.ret_act == "EDITMAP_TAB" ) { + int sel_tmp = fmenu.selected; + int ret = select_shape( editshape, 0 ); + if( ret > 0 ) { + setup_fmenu( fmenu ); } - mvwputch( w_picktrap, point( 2, t + 1 - tshift ), tr.color, tr.sym ); - mvwprintz( w_picktrap, point( 4, t + 1 - tshift ), - trsel == tr.loadid ? h_white : - cur_trap == tr.loadid ? c_green : c_light_gray, - "%d %s", t, tnam.c_str() ); - } - } - wrefresh( w_picktrap ); - - action = ctxt.handle_input(); - if( action == "UP" ) { - increment( trsel, -1, num_trap_types ); - } else if( action == "DOWN" ) { - increment( trsel, +1, num_trap_types ); - } else if( action == "CONFIRM" || action == "CONFIRM_QUIT" ) { - trset = trsel; - for( auto &elem : target_list ) { - g->m.trap_set( elem, trset ); - } - if( action == "CONFIRM_QUIT" ) { - break; + fmenu.selected = sel_tmp; + } else if( fmenu.ret_act == "EDITMAP_MOVE" ) { + int sel_tmp = fmenu.selected; + int ret = select_shape( editshape, 1 ); + if( ret > 0 ) { + setup_fmenu( fmenu ); + } + fmenu.selected = sel_tmp; + } else if( fmenu.ret_act == "EDITMAP_SHOW_ALL" ) { + uberdraw = !uberdraw; } - update_view( false ); - } else if( action == "EDITMAP_TAB" || action == "EDITMAP_MOVE" ) { - trap_id sel_tmp = trsel; - select_shape( editshape, action == "EDITMAP_MOVE" ? 1 : 0 ); - trsel = sel_tmp; - } else if( action == "EDITMAP_SHOW_ALL" ) { - uberdraw = !uberdraw; - update_view( false ); } - } while( action != "QUIT" ); - - wrefresh( w_info ); - return ret; + blink = fmenu.ret == UILIST_TIMEOUT ? !blink : true; + } while( fmenu.ret != UILIST_CANCEL ); + blink = false; + draw_target_override = cata::nullopt; } /* @@ -1289,9 +1190,8 @@ enum editmap_imenu_ent { imenu_exit, }; -int editmap::edit_itm() +void editmap::edit_itm() { - int ret = 0; uilist ilmenu; ilmenu.w_x = offsetX; ilmenu.w_y = 0; @@ -1304,8 +1204,14 @@ int editmap::edit_itm() an_item.is_emissive() ? " L" : "" ); } ilmenu.addentry( items.size(), true, 'a', _( "Add item" ) ); + ilmenu.input_category = "EDIT_ITEMS"; + ilmenu.additional_actions = { + { "HELP_KEYBINDINGS", "" } // to refresh the view after exiting from keybindings + }; + ilmenu.allow_additional = true; do { + update_view_with_help( "", "" ); ilmenu.query(); if( ilmenu.ret >= 0 && ilmenu.ret < static_cast( items.size() ) ) { item &it = *items.get_iterator_from_index( ilmenu.ret ); @@ -1324,8 +1230,14 @@ int editmap::edit_itm() "-[ light emission ]-" ) ); imenu.addentry( imenu_savetest, true, -1, pgettext( "item manipulation debug menu entry", "savetest" ) ); + imenu.input_category = "EDIT_ITEMS"; + imenu.additional_actions = { + { "HELP_KEYBINDINGS", "" } // to refresh the view after exiting from keybindings + }; + imenu.allow_additional = true; do { + ilmenu.show(); imenu.query(); if( imenu.ret >= 0 && imenu.ret < imenu_savetest ) { int intval = -1; @@ -1369,7 +1281,6 @@ int editmap::edit_itm() wrefresh( g->w_terrain ); g->draw_panels(); } while( imenu.ret != UILIST_CANCEL ); - update_view( true ); } else if( ilmenu.ret == static_cast( items.size() ) ) { debug_menu::wishitem( nullptr, target.x, target.y, target.z ); ilmenu.entries.clear(); @@ -1380,42 +1291,36 @@ int editmap::edit_itm() } ilmenu.addentry( items.size(), true, 'a', pgettext( "item manipulation debug menu entry for adding an item on a tile", "Add item" ) ); - update_view( true ); ilmenu.setup(); ilmenu.filterlist(); ilmenu.refresh(); } } while( ilmenu.ret != UILIST_CANCEL ); - return ret; } /* * Todo */ -int editmap::edit_critter( Creature &critter ) +void editmap::edit_critter( Creature &critter ) { if( monster *const mon_ptr = dynamic_cast( &critter ) ) { edit_json( *mon_ptr ); } else if( npc *const npc_ptr = dynamic_cast( &critter ) ) { edit_json( *npc_ptr ); } - return 0; } -int editmap::edit_veh() +void editmap::edit_veh() { - int ret = 0; edit_json( g->m.veh_at( target )->vehicle() ); - return ret; } /* * Calculate target_list based on origin and target class variables, and shapetype. */ -tripoint editmap::recalc_target( shapetype shape ) +void editmap::recalc_target( shapetype shape ) { const int z = target.z; - tripoint ret = target; target_list.clear(); switch( shape ) { case editmap_circle: { @@ -1467,8 +1372,6 @@ tripoint editmap::recalc_target( shapetype shape ) target_list = line_to( origin, target, 0, 0 ); break; } - - return ret; } /* @@ -1515,6 +1418,8 @@ int editmap::select_shape( shapetype shape, int mode ) { tripoint orig = target; tripoint origor = origin; + shapetype origshape = editshape; + editshape = shape; input_context ctxt( "EDITMAP_SHAPE" ); ctxt.set_iso( true ); ctxt.register_directions(); @@ -1541,15 +1446,31 @@ int editmap::select_shape( shapetype shape, int mode ) moveall = mode != 0; } altblink = moveall; - update_view( false ); + do { - uphelp( moveall ? _( "[s] resize, [y] swap" ) : - _( "[m]move, [s]hape, [y] swap, [z] to start" ), - _( "[enter] accept, [q] abort, [v] showall" ), - moveall ? _( "Moving selection" ) : _( "Resizing selection" ) ); + if( moveall ) { + update_view_with_help( string_format( pgettext( "keybinding descriptions", "%s, %s, %s, %s, %s" ), + ctxt.describe_key_and_name( "RESIZE" ), + ctxt.describe_key_and_name( "SWAP" ), + ctxt.describe_key_and_name( "CONFIRM" ), + ctxt.describe_key_and_name( "QUIT" ), + ctxt.describe_key_and_name( "EDITMAP_SHOW_ALL" ) ), + _( "Moving selection" ) ); + } else { + update_view_with_help( string_format( pgettext( "keybinding descriptions", + "%s, %s, %s, %s, %s, %s, %s" ), + ctxt.describe_key_and_name( "EDITMAP_MOVE" ), + ctxt.describe_key_and_name( "RESIZE" ), + ctxt.describe_key_and_name( "SWAP" ), + ctxt.describe_key_and_name( "START" ), + ctxt.describe_key_and_name( "CONFIRM" ), + ctxt.describe_key_and_name( "QUIT" ), + ctxt.describe_key_and_name( "EDITMAP_SHOW_ALL" ) ), + _( "Resizing selection" ) ); + } action = ctxt.handle_input( BLINK_SPEED ); if( action == "RESIZE" ) { - if( ! moveall ) { + if( !moveall ) { const int offset = 16; uilist smenu; smenu.text = _( "Selection type" ); @@ -1559,19 +1480,26 @@ int editmap::select_shape( shapetype shape, int mode ) smenu.addentry( editmap_line, true, 'l', pgettext( "shape", "Line" ) ); smenu.addentry( editmap_circle, true, 'c', pgettext( "shape", "Filled Circle" ) ); smenu.addentry( -2, true, 'p', pgettext( "shape", "Point" ) ); - smenu.selected = static_cast( shape ); - smenu.query(); - if( smenu.ret == UILIST_CANCEL ) { - // canceled - } else if( smenu.ret != -2 ) { - shape = static_cast( smenu.ret ); - update = true; - } else { - target_list.clear(); - origin = target; - target_list.push_back( target ); - moveall = true; - } + smenu.selected = static_cast( editshape ); + smenu.additional_actions = { + { "HELP_KEYBINDINGS", "" } // to refresh the view after exiting from keybindings + }; + smenu.allow_additional = true; + do { + update_view_with_help( "", pgettext( "map editor state", "Select a shape" ) ); + smenu.query(); + if( smenu.ret == UILIST_CANCEL ) { + // canceled + } else if( smenu.ret != -2 ) { + editshape = static_cast( smenu.ret ); + update = true; + } else if( smenu.ret != UILIST_ADDITIONAL ) { + target_list.clear(); + origin = target; + target_list.push_back( target ); + moveall = true; + } + } while( smenu.ret == UILIST_ADDITIONAL ); } else { moveall = false; } @@ -1597,50 +1525,37 @@ int editmap::select_shape( shapetype shape, int mode ) } } else if( move_target( action ) ) { update = true; - } else { - blink = !blink; } if( update ) { - blink = true; update = false; - recalc_target( shape ); + recalc_target( editshape ); } + blink = action == "TIMEOUT" ? !blink : true; altblink = moveall; - update_view( false ); } while( action != "CONFIRM" && action != "QUIT" ); - blink = true; + blink = false; altblink = false; - if( action == "CONFIRM" ) { - editshape = shape; - update_view( false ); - return target_list.size(); - } else { - target_list.clear(); + if( action != "CONFIRM" ) { target = orig; origin = origor; - target_list.push_back( target ); - blink = false; - update_view( false ); - return -1; + editshape = origshape; + recalc_target( editshape ); } + return target_list.size(); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////// /* * Display mapgen results over selected target position, and optionally regenerate / apply / abort */ -int editmap::mapgen_preview( const real_coords &tc, uilist &gmenu ) +void editmap::mapgen_preview( const real_coords &tc, uilist &gmenu ) { - int ret = 0; - hilights["mapgentgt"].points.clear(); hilights["mapgentgt"].points[target + point( -SEEX, -SEEY )] = 1; hilights["mapgentgt"].points[target + point( 1 + SEEX, 1 + SEEY )] = 1; hilights["mapgentgt"].points[target + point( -SEEX, 1 + SEEY )] = 1; hilights["mapgentgt"].points[target + point( 1 + SEEX, -SEEY )] = 1; - update_view( true ); - // Coordinates of the overmap terrain that should be generated. const point omt_pos = ms_to_omt_copy( tc.abs_pos ); oter_id &omt_ref = overmap_buffer.ter( tripoint( omt_pos, target.z ) ); @@ -1665,17 +1580,19 @@ int editmap::mapgen_preview( const real_coords &tc, uilist &gmenu ) gpmenu.w_height = infoHeight - 4; gpmenu.w_y = gmenu.w_height; gpmenu.w_x = offsetX; - gpmenu.allow_anykey = true; gpmenu.addentry( pgettext( "map generator", "Regenerate" ) ); gpmenu.addentry( pgettext( "map generator", "Rotate" ) ); gpmenu.addentry( pgettext( "map generator", "Apply" ) ); gpmenu.addentry( pgettext( "map generator", "Change Overmap (Doesn't Apply)" ) ); - gpmenu.show(); - uphelp( _( "[pgup/pgdn]: prev/next oter type" ), - _( "[up/dn] select, [enter] accept, [q] abort" ), - string_format( "Mapgen: %s", oter_id( gmenu.ret ).id().str().substr( 0, 40 ).c_str() ) - ); + gpmenu.input_category = "MAPGEN_PREVIEW"; + gpmenu.additional_actions = { + { "LEFT", "" }, + { "RIGHT", "" }, + { "HELP_KEYBINDINGS", "" } // to refresh the view after exiting from keybindings + }; + gpmenu.allow_additional = true; + int lastsel = gmenu.selected; bool showpreview = true; do { @@ -1684,11 +1601,93 @@ int editmap::mapgen_preview( const real_coords &tc, uilist &gmenu ) omt_ref = oter_id( gmenu.selected ); cleartmpmap( tmpmap ); tmpmap.generate( tripoint( omt_pos.x * 2, omt_pos.y * 2, target.z ), calendar::turn ); - showpreview = true; } - if( showpreview ) { + input_context ctxt( gpmenu.input_category ); +#ifdef TILES + if( use_tiles && showpreview ) { + const point origin_p = target.xy() + point( 1 - SEEX, 1 - SEEY ); + for( int x = 0; x < SEEX * 2; x++ ) { + for( int y = 0; y < SEEY * 2; y++ ) { + const tripoint tmp_p( x, y, target.z ); + const tripoint map_p = origin_p + tmp_p; + g->draw_radiation_override( map_p, tmpmap.get_radiation( tmp_p ) ); + // scent is managed in `game` instead of `map`, so there's no override for it + // temperature is managed in `game` instead of `map`, so there's no override for it + // TODO: visibility could be affected by both the actual map and the preview map, + // which complicates calculation, so there's no override for it (yet) + g->draw_terrain_override( map_p, tmpmap.ter( tmp_p ) ); + g->draw_furniture_override( map_p, tmpmap.furn( tmp_p ) ); + g->draw_graffiti_override( map_p, tmpmap.has_graffiti_at( tmp_p ) ); + g->draw_trap_override( map_p, tmpmap.tr_at( tmp_p ).loadid ); + g->draw_field_override( map_p, tmpmap.field_at( tmp_p ).displayed_field_type() ); + const maptile &tile = tmpmap.maptile_at( tmp_p ); + if( tmpmap.sees_some_items( tmp_p, g->u.pos() - origin_p ) ) { + const item &itm = tile.get_uppermost_item(); + const mtype *const mon = itm.get_mtype(); + g->draw_item_override( map_p, itm.typeId(), mon ? mon->id : mtype_id::NULL_ID(), + tile.get_item_count() > 1 ); + } else { + g->draw_item_override( map_p, "null", mtype_id::NULL_ID(), false ); + } + const optional_vpart_position vp = tmpmap.veh_at( tmp_p ); + if( vp ) { + const vehicle &veh = vp->vehicle(); + const int veh_part = vp->part_index(); + char part_mod = 0; + const vpart_id &vp_id = veh.part_id_string( veh_part, part_mod ); + const cata::optional cargopart = vp.part_with_feature( "CARGO", true ); + bool draw_highlight = cargopart && !veh.get_items( cargopart->part_index() ).empty(); + int veh_dir = veh.face.dir(); + g->draw_vpart_override( map_p, vp_id, part_mod, veh_dir, draw_highlight, vp->mount() ); + } else { + g->draw_vpart_override( map_p, vpart_id::NULL_ID(), 0, 0, false, point_zero ); + } + g->draw_below_override( map_p, g->m.has_zlevels() && + tmpmap.ter( tmp_p ).obj().has_flag( TFLAG_NO_FLOOR ) ); + } + } + // int: count, bool: more than 1 spawn data + std::map> spawns; + for( int x = 0; x < 2; x++ ) { + for( int y = 0; y < 2; y++ ) { + submap *sm = tmpmap.get_submap_at_grid( { x, y, target.z } ); + if( sm ) { + const tripoint sm_origin = origin_p + tripoint( x * SEEX, y * SEEY, target.z ); + for( const auto &sp : sm->spawns ) { + const tripoint spawn_p = sm_origin + sp.pos; + const auto spawn_it = spawns.find( spawn_p ); + if( spawn_it == spawns.end() ) { + const Creature::Attitude att = sp.friendly ? Creature::A_FRIENDLY : Creature::A_ANY; + spawns.emplace( spawn_p, std::make_tuple( sp.type, sp.count, false, att ) ); + } else { + std::get<2>( spawn_it->second ) = true; + } + } + } + } + } + for( const auto &it : spawns ) { + g->draw_monster_override( it.first, std::get<0>( it.second ), std::get<1>( it.second ), + std::get<2>( it.second ), std::get<3>( it.second ) ); + } + } +#endif + // \u00A0 is the non-breaking space + update_view_with_help( string_format( pgettext( "keybinding descriptions", + "[%s,%s]\u00A0prev/next oter type, [%s,%s]\u00A0select, %s, %s" ), + ctxt.get_desc( "LEFT", 1 ), ctxt.get_desc( "RIGHT", 1 ), + ctxt.get_desc( "UP", 1 ), ctxt.get_desc( "DOWN", 1 ), + ctxt.describe_key_and_name( "CONFIRM" ), + ctxt.describe_key_and_name( "QUIT" ) ), + string_format( pgettext( "map editor state", "Mapgen: %s" ), + oter_id( gmenu.selected ).id().str() ) ); +#ifdef TILES + const bool drawsq_preview = !use_tiles && showpreview; +#else + const bool drawsq_preview = showpreview; +#endif + if( drawsq_preview ) { hilights["mapgentgt"].draw( *this, true ); - wrefresh( g->w_terrain ); g->draw_panels(); tmpmap.reset_vehicle_cache( target.z ); for( int x = 0; x < SEEX * 2; x++ ) { @@ -1698,79 +1697,76 @@ int editmap::mapgen_preview( const real_coords &tc, uilist &gmenu ) } } wrefresh( w_preview ); - } else { - update_view( false ); //wrefresh(g->w_terrain); } - int gpmenupos = gpmenu.selected; + gmenu.show(); gpmenu.query( false, BLINK_SPEED * 3 ); - if( gpmenu.ret == UILIST_TIMEOUT ) { - showpreview = !showpreview; - } else if( gpmenu.ret != UILIST_UNBOUND ) { - if( gpmenu.ret == 0 ) { - - cleartmpmap( tmpmap ); - tmpmap.generate( tripoint( omt_pos.x * 2, omt_pos.y * 2, target.z ), calendar::turn ); - showpreview = true; - } else if( gpmenu.ret == 1 ) { - tmpmap.rotate( 1 ); - showpreview = true; - } else if( gpmenu.ret == 2 ) { - - point target_sub( target.x / SEEX, target.y / SEEY ); + if( gpmenu.ret == 0 ) { + cleartmpmap( tmpmap ); + tmpmap.generate( tripoint( omt_pos.x * 2, omt_pos.y * 2, target.z ), calendar::turn ); + } else if( gpmenu.ret == 1 ) { + tmpmap.rotate( 1 ); + } else if( gpmenu.ret == 2 ) { + const point target_sub( target.x / SEEX, target.y / SEEY ); - g->m.set_transparency_cache_dirty( target.z ); - g->m.set_outside_cache_dirty( target.z ); - g->m.set_floor_cache_dirty( target.z ); - g->m.set_pathfinding_cache_dirty( target.z ); + g->m.set_transparency_cache_dirty( target.z ); + g->m.set_outside_cache_dirty( target.z ); + g->m.set_floor_cache_dirty( target.z ); + g->m.set_pathfinding_cache_dirty( target.z ); - g->m.clear_vehicle_cache( target.z ); - g->m.clear_vehicle_list( target.z ); + g->m.clear_vehicle_cache( target.z ); + g->m.clear_vehicle_list( target.z ); - for( int x = 0; x < 2; x++ ) { - for( int y = 0; y < 2; y++ ) { - // Apply previewed mapgen to map. Since this is a function for testing, we try avoid triggering - // functions that would alter the results - const auto dest_pos = target_sub + tripoint( x, y, target.z ); - const auto src_pos = tripoint{ x, y, target.z }; + for( int x = 0; x < 2; x++ ) { + for( int y = 0; y < 2; y++ ) { + // Apply previewed mapgen to map. Since this is a function for testing, we try avoid triggering + // functions that would alter the results + const auto dest_pos = target_sub + tripoint( x, y, target.z ); + const auto src_pos = tripoint{ x, y, target.z }; - submap *destsm = g->m.get_submap_at_grid( dest_pos ); - submap *srcsm = tmpmap.get_submap_at_grid( src_pos ); + submap *destsm = g->m.get_submap_at_grid( dest_pos ); + submap *srcsm = tmpmap.get_submap_at_grid( src_pos ); - std::swap( *destsm, *srcsm ); + std::swap( *destsm, *srcsm ); - for( auto &veh : destsm->vehicles ) { - veh->sm_pos = dest_pos; - } - - g->m.update_vehicle_list( destsm, target.z ); // update real map's vcaches + for( auto &veh : destsm->vehicles ) { + veh->sm_pos = dest_pos; + } - if( !destsm->spawns.empty() ) { // trigger spawnpoints - g->m.spawn_monsters( true ); - } + if( !destsm->spawns.empty() ) { // trigger spawnpoints + g->m.spawn_monsters( true ); } } - g->m.reset_vehicle_cache( target.z ); + } + + // Since we cleared the vehicle cache of the whole z-level (not just the generate map), we add it back here + for( int x = 0; x < g->m.getmapsize(); x++ ) { + for( int y = 0; y < g->m.getmapsize(); y++ ) { + const tripoint dest_pos = tripoint( x, y, target.z ); + const submap *destsm = g->m.get_submap_at_grid( dest_pos ); + g->m.update_vehicle_list( destsm, target.z ); // update real map's vcaches + } + } - } else if( gpmenu.ret == 3 ) { - popup( _( "Changed oter_id from '%s' (%s) to '%s' (%s)" ), - orig_oters->get_name(), orig_oters.id().c_str(), - omt_ref->get_name(), omt_ref.id().c_str() ); + g->m.reset_vehicle_cache( target.z ); + } else if( gpmenu.ret == 3 ) { + popup( _( "Changed oter_id from '%s' (%s) to '%s' (%s)" ), + orig_oters->get_name(), orig_oters.id().str(), + omt_ref->get_name(), omt_ref.id().str() ); + } else if( gpmenu.ret == UILIST_ADDITIONAL ) { + if( gpmenu.ret_act == "LEFT" ) { + gmenu.scrollby( -1 ); + gmenu.show(); + gmenu.refresh(); + } else if( gpmenu.ret_act == "RIGHT" ) { + gmenu.scrollby( 1 ); + gmenu.show(); + gmenu.refresh(); } - } else if( gpmenu.keypress == 'm' ) { - // TODO: keep preview as is and move target - } else if( gpmenu.keypress == KEY_NPAGE || gpmenu.keypress == KEY_PPAGE || - gpmenu.keypress == KEY_LEFT || gpmenu.keypress == KEY_RIGHT ) { - - int dir = gpmenu.keypress == KEY_NPAGE || gpmenu.keypress == KEY_RIGHT ? 1 : -1; - gmenu.scrollby( dir ); - gpmenu.selected = gpmenupos; - gmenu.show(); - gmenu.refresh(); } + showpreview = gpmenu.ret == UILIST_TIMEOUT ? !showpreview : true; } while( gpmenu.ret != 2 && gpmenu.ret != 3 && gpmenu.ret != UILIST_CANCEL ); - update_view( true ); if( gpmenu.ret != 2 && // we didn't apply, so restore the original om_ter gpmenu.ret != 3 ) { // chose to change oter_id but not apply mapgen omt_ref = orig_oters; @@ -1780,7 +1776,6 @@ int editmap::mapgen_preview( const real_coords &tc, uilist &gmenu ) gmenu.redraw(); hilights["mapgentgt"].points.clear(); cleartmpmap( tmpmap ); - return ret; } vehicle *editmap::mapgen_veh_query( const tripoint &omt_tgt ) @@ -1842,9 +1837,8 @@ bool editmap::mapgen_veh_destroy( const tripoint &omt_tgt, vehicle *car_target ) /* * Move mapgen's target, which is different enough from the standard tile edit to warrant it's own function. */ -int editmap::mapgen_retarget() +void editmap::mapgen_retarget() { - int ret = 0; input_context ctxt( "EDITMAP_RETARGET" ); ctxt.set_iso( true ); ctxt.register_directions(); @@ -1855,13 +1849,14 @@ int editmap::mapgen_retarget() ctxt.register_action( "ANY_INPUT" ); std::string action; tripoint origm = target; - uphelp( "", - pgettext( "map generator", "[enter] accept, [q] abort" ), pgettext( "map generator", - "Mapgen: Moving target" ) ); + blink = true; do { + update_view_with_help( string_format( pgettext( "keybinding descriptions", "%s, %s" ), + ctxt.describe_key_and_name( "CONFIRM" ), + ctxt.describe_key_and_name( "QUIT" ) ), + pgettext( "map generator", "Mapgen: Moving target" ) ); action = ctxt.handle_input( BLINK_SPEED ); - blink = !blink; if( const cata::optional vec = ctxt.get_direction( action ) ) { point vec_ms = omt_to_ms_copy( vec->xy() ); tripoint ptarget = target + vec_ms; @@ -1870,69 +1865,52 @@ int editmap::mapgen_retarget() target = ptarget; target_list.clear(); - for( int x = target.x - SEEX - 1; x < target.x + SEEX + 1; x++ ) { - for( int y = target.y - SEEY - 1; y < target.y + SEEY + 1; y++ ) { - target_list.push_back( tripoint( x, y, target.z ) ); + for( int x = target.x - SEEX + 1; x < target.x + SEEX + 1; x++ ) { + for( int y = target.y - SEEY + 1; y < target.y + SEEY + 1; y++ ) { + if( x == target.x - SEEX + 1 || x == target.x + SEEX || + y == target.y - SEEY + 1 || y == target.y + SEEY ) { + target_list.push_back( tripoint( x, y, target.z ) ); + } } } - blink = true; } - } else { - blink = !blink; } - update_view( false ); + blink = action == "TIMEOUT" ? !blink : true; } while( action != "QUIT" && action != "CONFIRM" ); if( action != "CONFIRM" ) { target = origm; } - blink = true; - return ret; + blink = false; } -class edit_mapgen_callback : public uilist_callback -{ - private: - editmap *_e; - public: - edit_mapgen_callback( editmap *e ) { - _e = e; - } - bool key( const input_context &, const input_event &event, int /*entnum*/, uilist * ) override { - if( event.get_first_input() == 'm' ) { - _e->mapgen_retarget(); - return true; - } - return false; - } -}; - /* * apply mapgen to a temporary map and overlay over terrain window, optionally regenerating, rotating, and applying to the real in-game map */ -int editmap::edit_mapgen() +void editmap::edit_mapgen() { - int ret = 0; uilist gmenu; gmenu.w_width = width; gmenu.w_height = TERMY - infoHeight; gmenu.w_y = 0; gmenu.w_x = offsetX; - edit_mapgen_callback cb( this ); - gmenu.callback = &cb; + gmenu.input_category = "EDIT_MAPGEN"; + gmenu.additional_actions = { + { "EDITMAP_MOVE", "" }, + { "HELP_KEYBINDINGS", "" } // to refresh the view after exiting from keybindings + }; + gmenu.allow_additional = true; for( size_t i = 0; i < overmap_terrains::get_all().size(); i++ ) { const oter_id id( i ); - gmenu.addentry( -1, !id.id().is_null(), 0, "[%3d] %s", static_cast( id ), id.id().c_str() ); + gmenu.addentry( -1, !id.id().is_null(), 0, "[%3d] %s", static_cast( id ), id.id().str() ); gmenu.entries[i].extratxt.left = 1; gmenu.entries[i].extratxt.color = id->get_color(); gmenu.entries[i].extratxt.txt = id->get_symbol(); } real_coords tc; + do { - uphelp( pgettext( "map generator", "[m]ove" ), - pgettext( "map generator", "[enter] change, [q]uit" ), pgettext( "map generator", - "Mapgen stamp" ) ); tc.fromabs( g->m.getabs( target.xy() ) ); point omt_lpos = g->m.getlocal( tc.begin_om_pos() ); tripoint om_ltarget = omt_lpos + tripoint( -1 + SEEX, -1 + SEEY, target.z ); @@ -1952,14 +1930,25 @@ int editmap::edit_mapgen() } blink = true; - update_view( false ); + input_context ctxt( gmenu.input_category ); + update_view_with_help( string_format( pgettext( "keybinding descriptions", "%s, %s, %s" ), + ctxt.describe_key_and_name( "EDITMAP_MOVE" ), + ctxt.describe_key_and_name( "CONFIRM" ), + ctxt.describe_key_and_name( "QUIT" ) ), + pgettext( "map generator", "Mapgen stamp" ) ); gmenu.query(); - if( gmenu.ret > 0 ) { + if( gmenu.ret >= 0 ) { + blink = false; mapgen_preview( tc, gmenu ); + blink = true; + } else if( gmenu.ret == UILIST_ADDITIONAL ) { + if( gmenu.ret_act == "EDITMAP_MOVE" ) { + mapgen_retarget(); + } } } while( gmenu.ret != UILIST_CANCEL ); - return ret; + blink = false; } /* diff --git a/src/editmap.h b/src/editmap.h index 521819ba15224..e681085055c5c 100644 --- a/src/editmap.h +++ b/src/editmap.h @@ -2,6 +2,7 @@ #ifndef EDITMAP_H #define EDITMAP_H +#include #include #include #include @@ -44,71 +45,49 @@ struct editmap_hilight { class editmap { public: - void uphelp( const std::string &txt1 = "", const std::string &txt2 = "", - const std::string &title = "" ); tripoint pos2screen( const tripoint &p ); - tripoint screen2pos( const tripoint &p ); bool eget_direction( tripoint &p, const std::string &action ) const; cata::optional edit(); void uber_draw_ter( const catacurses::window &w, map *m ); - void update_view( bool update_info = false ); - int edit_ter(); - - int edit_fld(); - int edit_trp(); - int edit_itm(); - int edit_critter( Creature &critter ); - int edit_veh(); - int edit_mapgen(); + void update_view_with_help( const std::string &txt, const std::string &title ); + + // T_t can be ter_t, furn_t, and trap + template + void edit_feature(); + void edit_fld(); + void edit_itm(); + void edit_critter( Creature &critter ); + void edit_veh(); + void edit_mapgen(); void cleartmpmap( tinymap &tmpmap ); - int mapgen_preview( const real_coords &tc, uilist &gmenu ); + void mapgen_preview( const real_coords &tc, uilist &gmenu ); vehicle *mapgen_veh_query( const tripoint &omt_tgt ); bool mapgen_veh_destroy( const tripoint &omt_tgt, vehicle *car_target ); - int mapgen_retarget(); + void mapgen_retarget(); int select_shape( shapetype shape, int mode = -1 ); void update_fmenu_entry( uilist &fmenu, field &field, field_type_id idx ); void setup_fmenu( uilist &fmenu ); catacurses::window w_info; - catacurses::window w_help; int width; int height; int offsetX; int infoHeight; - int ter_frn_mode; - ter_id sel_ter; - ter_id target_ter; - furn_id sel_frn; - furn_id target_frn; - - tripoint recalc_target( shapetype shape ); + void recalc_target( shapetype shape ); bool move_target( const std::string &action, int moveorigin = -1 ); - field *cur_field; - - trap_id cur_trap; int sel_field; int sel_field_intensity; - trap_id sel_trap; - - furn_id fsel; - furn_id fset; - trap_id trsel; - trap_id trset; - tripoint target; tripoint origin; bool moveall; bool refresh_mplans; shapetype editshape; - std::string padding; - - std::map fids; - std::vector target_list; + cata::optional> draw_target_override; std::map hilights; bool blink; bool altblink; diff --git a/src/effect.cpp b/src/effect.cpp index 0c30f9b9df9da..97ebd604f2232 100644 --- a/src/effect.cpp +++ b/src/effect.cpp @@ -1294,8 +1294,14 @@ void load_effect_type( JsonObject &jo ) new_etype.impairs_movement = hardcoded_movement_impairing.count( new_etype.id ) > 0; + new_etype.flags = jo.get_tags( "flags" ); + effect_types[new_etype.id] = new_etype; +} +bool effect::has_flag( const std::string &flag ) const +{ + return eff_type->flags.count( flag ) > 0; } void reset_effect_types() diff --git a/src/effect.h b/src/effect.h index 7cea5a110335e..60f71155158e5 100644 --- a/src/effect.h +++ b/src/effect.h @@ -8,12 +8,13 @@ #include #include #include +#include #include "bodypart.h" #include "calendar.h" #include "string_id.h" #include "translations.h" -#include "tuple_hash.h" +#include "hash_utils.h" #include "type_id.h" class player; @@ -93,6 +94,8 @@ class effect_type int int_decay_tick; time_duration int_dur_factor; + std::set flags; + bool main_parts_only; // Determines if effect should be shown in description. @@ -249,6 +252,9 @@ class effect bool activated( const time_point &when, std::string arg, int val, bool reduced = false, double mod = 1 ) const; + /** Check if the effect has the specified flag */ + bool has_flag( const std::string &flag ) const; + /** Returns the modifier caused by addictions. Currently only handles painkiller addictions. */ double get_addict_mod( const std::string &arg, int addict_level ) const; /** Returns true if the coughs caused by an effect can harm the player directly. */ diff --git a/src/enum_conversions.h b/src/enum_conversions.h index 316f0a343309a..253cc8969efa7 100644 --- a/src/enum_conversions.h +++ b/src/enum_conversions.h @@ -36,7 +36,7 @@ class InvalidEnumString : public std::runtime_error }; template -std::string enum_to_string( E data ); +std::string enum_to_string( E ); template std::unordered_map build_enum_lookup_map() @@ -67,7 +67,8 @@ inline E string_to_enum_look_up( const C &container, const std::string &data ) { const auto iter = container.find( data ); if( iter == container.end() ) { - throw InvalidEnumString{}; + throw InvalidEnumString( "Invalid enum string '" + data + "' for '" + + typeid( E ).name() + "'" ); } return iter->second; } diff --git a/src/event.cpp b/src/event.cpp index 52799c4af73ad..6d86b37746587 100644 --- a/src/event.cpp +++ b/src/event.cpp @@ -1,16 +1,139 @@ #include "event.h" +namespace io +{ + +template<> +std::string enum_to_string( event_type data ) +{ + switch( data ) { + // *INDENT-OFF* + case event_type::activates_artifact: return "activates_artifact"; + case event_type::activates_mininuke: return "activates_mininuke"; + case event_type::administers_mutagen: return "administers_mutagen"; + case event_type::angers_amigara_horrors: return "angers_amigara_horrors"; + case event_type::avatar_moves: return "avatar_moves"; + case event_type::awakes_dark_wyrms: return "awakes_dark_wyrms"; + case event_type::becomes_wanted: return "becomes_wanted"; + case event_type::broken_bone_mends: return "broken_bone_mends"; + case event_type::buries_corpse: return "buries_corpse"; + case event_type::causes_resonance_cascade: return "causes_resonance_cascade"; + case event_type::character_gains_effect: return "character_gains_effect"; + case event_type::character_gets_headshot: return "character_gets_headshot"; + case event_type::character_heals_damage: return "character_heals_damage"; + case event_type::character_kills_character: return "character_kills_character"; + case event_type::character_kills_monster: return "character_kills_monster"; + case event_type::character_loses_effect: return "character_loses_effect"; + case event_type::character_takes_damage: return "character_takes_damage"; + case event_type::character_triggers_trap: return "character_triggers_trap"; + case event_type::consumes_marloss_item: return "consumes_marloss_item"; + case event_type::crosses_marloss_threshold: return "crosses_marloss_threshold"; + case event_type::crosses_mutation_threshold: return "crosses_mutation_threshold"; + case event_type::crosses_mycus_threshold: return "crosses_mycus_threshold"; + case event_type::dermatik_eggs_hatch: return "dermatik_eggs_hatch"; + case event_type::dermatik_eggs_injected: return "dermatik_eggs_injected"; + case event_type::destroys_triffid_grove: return "destroys_triffid_grove"; + case event_type::dies_from_asthma_attack: return "dies_from_asthma_attack"; + case event_type::dies_from_drug_overdose: return "dies_from_drug_overdose"; + case event_type::dies_of_infection: return "dies_of_infection"; + case event_type::dies_of_starvation: return "dies_of_starvation"; + case event_type::dies_of_thirst: return "dies_of_thirst"; + case event_type::digs_into_lava: return "digs_into_lava"; + case event_type::disarms_nuke: return "disarms_nuke"; + case event_type::eats_sewage: return "eats_sewage"; + case event_type::evolves_mutation: return "evolves_mutation"; + case event_type::exhumes_grave: return "exhumes_grave"; + case event_type::fails_to_install_cbm: return "fails_to_install_cbm"; + case event_type::fails_to_remove_cbm: return "fails_to_remove_cbm"; + case event_type::falls_asleep_from_exhaustion: return "falls_asleep_from_exhaustion"; + case event_type::fuel_tank_explodes: return "fuel_tank_explodes"; + case event_type::gains_addiction: return "gains_addiction"; + case event_type::gains_mutation: return "gains_mutation"; + case event_type::gains_skill_level: return "gains_skill_level"; + case event_type::game_over: return "game_over"; + case event_type::game_start: return "game_start"; + case event_type::installs_cbm: return "installs_cbm"; + case event_type::installs_faulty_cbm: return "installs_faulty_cbm"; + case event_type::launches_nuke: return "launches_nuke"; + case event_type::learns_martial_art: return "learns_martial_art"; + case event_type::loses_addiction: return "loses_addiction"; + case event_type::npc_becomes_hostile: return "npc_becomes_hostile"; + case event_type::opens_portal: return "opens_portal"; + case event_type::opens_temple: return "opens_temple"; + case event_type::releases_subspace_specimens: return "releases_subspace_specimens"; + case event_type::removes_cbm: return "removes_cbm"; + case event_type::seals_hazardous_material_sarcophagus: return "seals_hazardous_material_sarcophagus"; + case event_type::telefrags_creature: return "telefrags_creature"; + case event_type::teleglow_teleports: return "teleglow_teleports"; + case event_type::teleports_into_wall: return "teleports_into_wall"; + case event_type::terminates_subspace_specimens: return "terminates_subspace_specimens"; + case event_type::throws_up: return "throws_up"; + case event_type::triggers_alarm: return "triggers_alarm"; + // *INDENT-ON* + case event_type::num_event_types: + break; + } + debugmsg( "Invalid event_type" ); + abort(); +} + +} // namespace io + +namespace cata +{ + namespace event_detail { -static_assert( static_cast( event_type::num_event_types ) == 2, +constexpr std::array, + event_spec_empty::fields.size()> event_spec_empty::fields; + +constexpr std::array, + event_spec_character::fields.size()> event_spec_character::fields; + +static_assert( static_cast( event_type::num_event_types ) == 61, "This static_assert is a reminder to add a definition below when you add a new " - "event_type" ); + "event_type. If your event_spec specialization inherits from another struct for " + "its fields definition then you probably don't need a definition here." ); -constexpr std::array, 3> -event_spec::fields; +#define DEFINE_EVENT_FIELDS(type) \ + constexpr std::array, \ + event_spec::fields.size()> \ + event_spec::fields; -constexpr std::array, 2> -event_spec::fields; +DEFINE_EVENT_FIELDS( activates_artifact ) +DEFINE_EVENT_FIELDS( administers_mutagen ) +DEFINE_EVENT_FIELDS( avatar_moves ) +DEFINE_EVENT_FIELDS( broken_bone_mends ) +DEFINE_EVENT_FIELDS( buries_corpse ) +DEFINE_EVENT_FIELDS( character_gains_effect ) +DEFINE_EVENT_FIELDS( character_heals_damage ) +DEFINE_EVENT_FIELDS( character_kills_character ) +DEFINE_EVENT_FIELDS( character_kills_monster ) +DEFINE_EVENT_FIELDS( character_loses_effect ) +DEFINE_EVENT_FIELDS( character_takes_damage ) +DEFINE_EVENT_FIELDS( character_triggers_trap ) +DEFINE_EVENT_FIELDS( consumes_marloss_item ) +DEFINE_EVENT_FIELDS( crosses_mutation_threshold ) +DEFINE_EVENT_FIELDS( dies_from_drug_overdose ) +DEFINE_EVENT_FIELDS( evolves_mutation ) +DEFINE_EVENT_FIELDS( fails_to_install_cbm ) +DEFINE_EVENT_FIELDS( fails_to_remove_cbm ) +DEFINE_EVENT_FIELDS( fuel_tank_explodes ) +DEFINE_EVENT_FIELDS( gains_addiction ) +DEFINE_EVENT_FIELDS( gains_mutation ) +DEFINE_EVENT_FIELDS( gains_skill_level ) +DEFINE_EVENT_FIELDS( game_over ) +DEFINE_EVENT_FIELDS( installs_cbm ) +DEFINE_EVENT_FIELDS( installs_faulty_cbm ) +DEFINE_EVENT_FIELDS( launches_nuke ) +DEFINE_EVENT_FIELDS( learns_martial_art ) +DEFINE_EVENT_FIELDS( loses_addiction ) +DEFINE_EVENT_FIELDS( npc_becomes_hostile ) +DEFINE_EVENT_FIELDS( removes_cbm ) +DEFINE_EVENT_FIELDS( telefrags_creature ) +DEFINE_EVENT_FIELDS( teleports_into_wall ) } // namespace event_detail + +} // namespace cata diff --git a/src/event.h b/src/event.h index c64fb7b3ccfcd..c0af70a063972 100644 --- a/src/event.h +++ b/src/event.h @@ -1,12 +1,13 @@ #pragma once -#ifndef EVENT_H -#define EVENT_H +#ifndef CATA_EVENT_H +#define CATA_EVENT_H #include #include #include "calendar.h" #include "cata_variant.h" +#include "enum_conversions.h" #include "type_id.h" using itype_id = std::string; @@ -17,11 +18,98 @@ using itype_id = std::string; // Each event is of a specific type, taken from the event_type enum. enum class event_type { + activates_artifact, + activates_mininuke, + administers_mutagen, + angers_amigara_horrors, + avatar_moves, + awakes_dark_wyrms, + becomes_wanted, + broken_bone_mends, + buries_corpse, + causes_resonance_cascade, + character_gains_effect, + character_gets_headshot, + character_heals_damage, character_kills_character, character_kills_monster, + character_loses_effect, + character_takes_damage, + character_triggers_trap, + consumes_marloss_item, + crosses_marloss_threshold, + crosses_mutation_threshold, + crosses_mycus_threshold, + dermatik_eggs_hatch, + dermatik_eggs_injected, + destroys_triffid_grove, + dies_from_asthma_attack, + dies_from_drug_overdose, + dies_of_infection, + dies_of_starvation, + dies_of_thirst, + digs_into_lava, + disarms_nuke, + eats_sewage, + evolves_mutation, + exhumes_grave, + fails_to_install_cbm, + fails_to_remove_cbm, + falls_asleep_from_exhaustion, + fuel_tank_explodes, + gains_addiction, + gains_mutation, + gains_skill_level, + game_over, + game_start, + installs_cbm, + installs_faulty_cbm, + launches_nuke, + learns_martial_art, + loses_addiction, + npc_becomes_hostile, + opens_portal, + opens_temple, + releases_subspace_specimens, + removes_cbm, + seals_hazardous_material_sarcophagus, + telefrags_creature, + teleglow_teleports, + teleports_into_wall, + terminates_subspace_specimens, + throws_up, + triggers_alarm, num_event_types // last }; +template<> +struct enum_traits { + static constexpr event_type last = event_type::num_event_types; +}; + +namespace io +{ + +template<> +std::string enum_to_string( event_type data ); + +} // namespace io + +namespace std +{ + +template<> +struct hash { + size_t operator()( const event_type v ) const noexcept { + return static_cast( v ); + } +}; + +} // namespace std + +namespace cata +{ + class event; namespace event_detail @@ -34,10 +122,106 @@ namespace event_detail template struct event_spec; +struct event_spec_empty { + static constexpr std::array, 0> fields = {}; +}; + +struct event_spec_character { + static constexpr std::array, 1> fields = {{ + { "character", cata_variant_type::character_id }, + } + }; +}; + +static_assert( static_cast( event_type::num_event_types ) == 61, + "This static_assert is to remind you to add a specialization for your new " + "event_type below" ); + +template<> +struct event_spec { + static constexpr std::array, 2> fields = {{ + { "character", cata_variant_type::character_id }, + { "item_name", cata_variant_type::string }, + } + }; +}; + +template<> +struct event_spec : event_spec_character {}; + +template<> +struct event_spec { + static constexpr std::array, 2> fields = {{ + { "character", cata_variant_type::character_id }, + { "technique", cata_variant_type::mutagen_technique }, + } + }; +}; + +template<> +struct event_spec : event_spec_empty {}; + +template<> +struct event_spec { + static constexpr std::array, 1> fields = {{ + { "mount", cata_variant_type::mtype_id }, + } + }; +}; + +template<> +struct event_spec : event_spec_empty {}; + +template<> +struct event_spec : event_spec_character {}; + +template<> +struct event_spec { + static constexpr std::array, 2> fields = {{ + { "character", cata_variant_type::character_id }, + { "part", cata_variant_type::body_part }, + } + }; +}; + +template<> +struct event_spec { + static constexpr std::array, 3> fields = {{ + { "character", cata_variant_type::character_id }, + { "corpse_type", cata_variant_type::mtype_id }, + { "corpse_name", cata_variant_type::string }, + } + }; +}; + +template<> +struct event_spec : event_spec_empty {}; + +template<> +struct event_spec { + static constexpr std::array, 2> fields = {{ + { "character", cata_variant_type::character_id }, + { "effect", cata_variant_type::efftype_id }, + } + }; +}; + +template<> +struct event_spec : event_spec_character {}; + +template<> +struct event_spec { + static constexpr std::array, 2> fields = {{ + { "character", cata_variant_type::character_id }, + { "damage", cata_variant_type::int_ }, + } + }; +}; + template<> struct event_spec { static constexpr std::array, 2> fields = {{ - { "killer_id", cata_variant_type::character_id }, + { "killer", cata_variant_type::character_id }, { "victim_type", cata_variant_type::mtype_id }, } }; @@ -46,13 +230,289 @@ struct event_spec { template<> struct event_spec { static constexpr std::array, 3> fields = {{ - { "killer_id", cata_variant_type::character_id }, - { "victim_id", cata_variant_type::character_id }, + { "killer", cata_variant_type::character_id }, + { "victim", cata_variant_type::character_id }, + { "victim_name", cata_variant_type::string }, + } + }; +}; + +template<> +struct event_spec { + static constexpr std::array, 2> fields = {{ + { "character", cata_variant_type::character_id }, + { "effect", cata_variant_type::efftype_id }, + } + }; +}; + +template<> +struct event_spec { + static constexpr std::array, 2> fields = {{ + { "character", cata_variant_type::character_id }, + { "damage", cata_variant_type::int_ }, + } + }; +}; + +template<> +struct event_spec { + static constexpr std::array, 2> fields = {{ + { "character", cata_variant_type::character_id }, + { "trap", cata_variant_type::trap_str_id }, + } + }; +}; + +template<> +struct event_spec { + static constexpr std::array, 2> fields = {{ + { "character", cata_variant_type::character_id }, + { "itype", cata_variant_type::itype_id }, + } + }; +}; + +template<> +struct event_spec : event_spec_character {}; + +template<> +struct event_spec { + static constexpr std::array, 2> fields = {{ + { "character", cata_variant_type::character_id }, + { "category", cata_variant_type::mutation_category_id }, + } + }; +}; + +template<> +struct event_spec : event_spec_character {}; + +template<> +struct event_spec : event_spec_character {}; + +template<> +struct event_spec : event_spec_character {}; + +template<> +struct event_spec : event_spec_empty {}; + +template<> +struct event_spec : event_spec_character {}; + +template<> +struct event_spec { + static constexpr std::array, 2> fields = {{ + { "character", cata_variant_type::character_id }, + { "effect", cata_variant_type::efftype_id }, + } + }; +}; + +template<> +struct event_spec : event_spec_character {}; + +template<> +struct event_spec : event_spec_character {}; + +template<> +struct event_spec : event_spec_character {}; + +template<> +struct event_spec : event_spec_empty {}; + +template<> +struct event_spec : event_spec_empty {}; + +template<> +struct event_spec : event_spec_empty {}; + +template<> +struct event_spec { + static constexpr std::array, 3> fields = {{ + { "character", cata_variant_type::character_id }, + { "from_trait", cata_variant_type::trait_id }, + { "to_trait", cata_variant_type::trait_id }, + } + }; +}; + +template<> +struct event_spec : event_spec_character {}; + +template<> +struct event_spec { + static constexpr std::array, 2> fields = {{ + { "character", cata_variant_type::character_id }, + { "bionic", cata_variant_type::bionic_id }, + } + }; +}; + +template<> +struct event_spec { + static constexpr std::array, 2> fields = {{ + { "character", cata_variant_type::character_id }, + { "bionic", cata_variant_type::bionic_id }, + } + }; +}; + +template<> +struct event_spec : event_spec_character {}; + +template<> +struct event_spec { + static constexpr std::array, 1> fields = {{ + { "vehicle_name", cata_variant_type::string }, + } + }; +}; + +template<> +struct event_spec { + static constexpr std::array, 2> fields = {{ + { "character", cata_variant_type::character_id }, + { "add_type", cata_variant_type::add_type }, + } + }; +}; + +template<> +struct event_spec { + static constexpr std::array, 2> fields = {{ + { "character", cata_variant_type::character_id }, + { "trait", cata_variant_type::trait_id }, + } + }; +}; + +template<> +struct event_spec { + static constexpr std::array, 3> fields = {{ + { "character", cata_variant_type::character_id }, + { "skill", cata_variant_type::skill_id }, + { "new_level", cata_variant_type::int_ }, + } + }; +}; + +template<> +struct event_spec : event_spec_empty { + static constexpr std::array, 2> fields = {{ + { "is_suicide", cata_variant_type::bool_ }, + { "last_words", cata_variant_type::string }, + } + }; +}; + +template<> +struct event_spec : event_spec_empty {}; + +template<> +struct event_spec { + static constexpr std::array, 2> fields = {{ + { "character", cata_variant_type::character_id }, + { "bionic", cata_variant_type::bionic_id }, + } + }; +}; + +template<> +struct event_spec { + static constexpr std::array, 2> fields = {{ + { "character", cata_variant_type::character_id }, + { "bionic", cata_variant_type::bionic_id }, + } + }; +}; + +template<> +struct event_spec { + static constexpr std::array, 1> fields = {{ + { "target_terrain", cata_variant_type::oter_id }, + } + }; +}; + +template<> +struct event_spec { + static constexpr std::array, 2> fields = {{ + { "character", cata_variant_type::character_id }, + { "martial_art", cata_variant_type::matype_id }, + } + }; +}; + +template<> +struct event_spec { + static constexpr std::array, 2> fields = {{ + { "character", cata_variant_type::character_id }, + { "add_type", cata_variant_type::add_type }, + } + }; +}; + +template<> +struct event_spec { + static constexpr std::array, 2> fields = {{ + { "npc", cata_variant_type::character_id }, + { "npc_name", cata_variant_type::string }, + } + }; +}; + +template<> +struct event_spec : event_spec_empty {}; + +template<> +struct event_spec : event_spec_empty {}; + +template<> +struct event_spec : event_spec_empty {}; + +template<> +struct event_spec { + static constexpr std::array, 2> fields = {{ + { "character", cata_variant_type::character_id }, + { "bionic", cata_variant_type::bionic_id }, + } + }; +}; + +template<> +struct event_spec : event_spec_empty {}; + +template<> +struct event_spec { + static constexpr std::array, 2> fields = {{ + { "character", cata_variant_type::character_id }, { "victim_name", cata_variant_type::string }, } }; }; +template<> +struct event_spec : event_spec_character {}; + +template<> +struct event_spec { + static constexpr std::array, 2> fields = {{ + { "character", cata_variant_type::character_id }, + { "obstacle_name", cata_variant_type::string }, + } + }; +}; + +template<> +struct event_spec : event_spec_empty {}; + +template<> +struct event_spec : event_spec_character {}; + +template<> +struct event_spec : event_spec_character {}; + template struct make_event_helper; @@ -61,7 +521,9 @@ struct make_event_helper; class event { public: - event( event_type type, time_point time, std::map &&data ) + using data_type = std::map; + + event( event_type type, time_point time, data_type &&data ) : type_( type ) , time_( time ) , data_( std::move( data ) ) @@ -71,7 +533,7 @@ class event // verify that the types you pass match the expected types for the // event_type you pass as a template parameter. template - static event make( time_point time, Args &&... args ) { + static event make( Args &&... args ) { using Spec = event_detail::event_spec; // Using is_empty mostly just to verify that the type is defined at // all, but it so happens that it ought to be empty too. @@ -82,7 +544,7 @@ class event return event_detail::make_event_helper < Type, std::make_index_sequence - > ()( time, std::forward( args )... ); + > ()( calendar::turn, std::forward( args )... ); } event_type type() const { @@ -95,7 +557,8 @@ class event cata_variant get_variant( const std::string &key ) const { auto it = data_.find( key ); if( it == data_.end() ) { - debugmsg( "No such key %s in event of type %d", key, type_ ); + debugmsg( "No such key %s in event of type %s", key, + io::enum_to_string( type_ ) ); abort(); } return it->second; @@ -110,10 +573,14 @@ class event auto get( const std::string &key ) const { return get_variant( key ).get(); } + + const data_type &data() const { + return data_; + } private: event_type type_; time_point time_; - std::map data_; + data_type data_; }; namespace event_detail @@ -138,4 +605,6 @@ struct make_event_helper> { } // namespace event_detail -#endif // EVENT_H +} // namespace cata + +#endif // CATA_EVENT_H diff --git a/src/event_bus.cpp b/src/event_bus.cpp index 01ba1835628fe..53823388bb371 100644 --- a/src/event_bus.cpp +++ b/src/event_bus.cpp @@ -50,7 +50,7 @@ void event_bus::unsubscribe( event_subscriber *s ) } } -void event_bus::send( const event &e ) const +void event_bus::send( const cata::event &e ) const { for( event_subscriber *s : subscribers ) { s->notify( e ); diff --git a/src/event_bus.h b/src/event_bus.h index 6b269110e8641..a2bcd3dd1421d 100644 --- a/src/event_bus.h +++ b/src/event_bus.h @@ -13,7 +13,7 @@ class event_subscriber event_subscriber( const event_subscriber & ) = delete; event_subscriber &operator=( const event_subscriber & ) = delete; virtual ~event_subscriber(); - virtual void notify( const event & ) = 0; + virtual void notify( const cata::event & ) = 0; private: friend class event_bus; void on_subscribe( event_bus * ); @@ -31,7 +31,11 @@ class event_bus void subscribe( event_subscriber * ); void unsubscribe( event_subscriber * ); - void send( const event & ) const; + void send( const cata::event & ) const; + template + void send( Args &&... args ) const { + send( cata::event::make( std::forward( args )... ) ); + } private: std::vector subscribers; }; diff --git a/src/faction.cpp b/src/faction.cpp index 495856162f1ba..f3ff2f903cadf 100644 --- a/src/faction.cpp +++ b/src/faction.cpp @@ -36,8 +36,6 @@ namespace npc_factions std::vector all_templates; } // namespace npc_factions -const faction_id your_faction = faction_id( "your_followers" ); - faction_template::faction_template() { likes_u = 0; @@ -376,7 +374,7 @@ void basecamp::faction_display( const catacurses::window &fac_w, const int width mvwprintz( fac_w, point( width, ++y ), c_light_gray, _( "Direction : to the " ) + direction ); } mvwprintz( fac_w, point( width, ++y ), col, _( "Location : (%d, %d)" ), camp_pos.x, camp_pos.y ); - faction *yours = g->faction_manager_ptr->get( your_faction ); + faction *yours = g->u.get_faction(); std::string food_text = string_format( _( "Food Supply : %s %d calories" ), yours->food_supply_text(), yours->food_supply ); nc_color food_col = yours->food_supply_color(); @@ -448,7 +446,7 @@ int npc::faction_display( const catacurses::window &fac_w, const int width ) con bool guy_has_radio = has_item_with_flag( "TWO_WAY_RADIO", true ); // TODO NPCS on mission contactable same as travelling if( has_companion_mission() && mission != NPC_MISSION_TRAVELLING ) { - can_see = "Not interactable while on a mission"; + can_see = _( "Not interactable while on a mission" ); see_color = c_light_red; // is the NPC even in the same area as the player? } else if( rl_dist( player_abspos, global_omt_location() ) > 3 || @@ -476,28 +474,28 @@ int npc::faction_display( const catacurses::window &fac_w, const int width ) con if( ( ( g->u.pos().z >= 0 && pos().z >= 0 ) || ( g->u.pos().z == pos().z ) ) && square_dist( g->u.global_sm_location(), global_sm_location() ) <= max_range ) { retval = 2; - can_see = "Within radio range"; + can_see = _( "Within radio range" ); see_color = c_light_green; } else { - can_see = "Not within radio range"; + can_see = _( "Not within radio range" ); see_color = c_light_red; } } else if( guy_has_radio && !u_has_radio ) { - can_see = "You do not have a radio"; + can_see = _( "You do not have a radio" ); see_color = c_light_red; } else if( !guy_has_radio && u_has_radio ) { - can_see = "Follower does not have a radio"; + can_see = _( "Follower does not have a radio" ); see_color = c_light_red; } else { - can_see = "Both you and follower need a radio"; + can_see = _( "Both you and follower need a radio" ); see_color = c_light_red; } } else { retval = 1; - can_see = "Within interaction range"; + can_see = _( "Within interaction range" ); see_color = c_light_green; } - mvwprintz( fac_w, point( width, ++y ), see_color, can_see ); + mvwprintz( fac_w, point( width, ++y ), see_color, "%s", can_see ); nc_color status_col = col; std::string current_status = _( "Status : " ); if( current_target() != nullptr ) { @@ -521,13 +519,13 @@ int npc::faction_display( const catacurses::window &fac_w, const int width ) con const std::pair hunger_pair = get_hunger_description(); const std::pair thirst_pair = get_thirst_description(); const std::pair fatigue_pair = get_fatigue_description(); + const std::string nominal = pgettext( "needs", "Nominal" ); mvwprintz( fac_w, point( width, ++y ), hunger_pair.second, - _( "Hunger : " ) + ( hunger_pair.first.empty() ? "Nominal" : hunger_pair.first ) ); + _( "Hunger : " ) + ( hunger_pair.first.empty() ? nominal : hunger_pair.first ) ); mvwprintz( fac_w, point( width, ++y ), thirst_pair.second, - _( "Thirst : " ) + ( thirst_pair.first.empty() ? "Nominal" : thirst_pair.first ) ); + _( "Thirst : " ) + ( thirst_pair.first.empty() ? nominal : thirst_pair.first ) ); mvwprintz( fac_w, point( width, ++y ), fatigue_pair.second, - _( "Fatigue : " ) + ( fatigue_pair.first.empty() ? - "Nominal" : fatigue_pair.first ) ); + _( "Fatigue : " ) + ( fatigue_pair.first.empty() ? nominal : fatigue_pair.first ) ); int lines = fold_and_print( fac_w, point( width, ++y ), getmaxx( fac_w ) - width - 2, c_white, _( "Wielding : " ) + weapon.tname() ); y += lines; @@ -652,11 +650,10 @@ void new_faction_manager::display() const tab == tab_mode::TAB_FOLLOWERS ? LINE_XOXX : LINE_XXXX ); // + || -| mvwputch( w_missions, point( 30, FULL_SCREEN_HEIGHT - 1 ), BORDER_COLOR, LINE_XXOX ); // _|_ const nc_color col = c_white; - static const std::string no_camp = _( "You have no camps" ); - static const std::string no_ally = _( "You have no followers" ); switch( tab ) { - case tab_mode::TAB_MYFACTION: + case tab_mode::TAB_MYFACTION: { + const std::string no_camp = _( "You have no camps" ); if( active_vec_size > 0 ) { draw_scrollbar( w_missions, selection, entries_per_page, active_vec_size, point( 0, 3 ) ); @@ -675,8 +672,10 @@ void new_faction_manager::display() const } else { mvwprintz( w_missions, point( 31, 4 ), c_light_red, no_camp ); } - break; - case tab_mode::TAB_FOLLOWERS: + } + break; + case tab_mode::TAB_FOLLOWERS: { + const std::string no_ally = _( "You have no followers" ); if( !followers.empty() ) { draw_scrollbar( w_missions, selection, entries_per_page, active_vec_size, point( 0, 3 ) ); @@ -700,7 +699,8 @@ void new_faction_manager::display() const } else { mvwprintz( w_missions, point( 31, 4 ), c_light_red, no_ally ); } - break; + } + break; case tab_mode::TAB_OTHERFACTIONS: // Currently the info on factions is incomplete. break; diff --git a/src/faction_camp.cpp b/src/faction_camp.cpp index b7025dfb03553..280b45d60c773 100644 --- a/src/faction_camp.cpp +++ b/src/faction_camp.cpp @@ -3453,7 +3453,7 @@ std::string camp_car_description( vehicle *car ) // food supply int camp_food_supply( int change, bool return_days ) { - faction *yours = g->faction_manager_ptr->get( faction_id( "your_followers" ) ); + faction *yours = g->u.get_faction(); yours->food_supply += change; if( yours->food_supply < 0 ) { yours->likes_u += yours->food_supply / 500; @@ -3557,14 +3557,14 @@ bool basecamp::distribute_food() // morale int camp_discipline( int change ) { - faction *yours = g->faction_manager_ptr->get( faction_id( "your_followers" ) ); + faction *yours = g->u.get_faction(); yours->respects_u += change; return yours->respects_u; } int camp_morale( int change ) { - faction *yours = g->faction_manager_ptr->get( faction_id( "your_followers" ) ); + faction *yours = g->u.get_faction(); yours->likes_u += change; return yours->likes_u; } @@ -3608,7 +3608,7 @@ void apply_camp_ownership( const tripoint &camp_pos, int radius ) camp_pos + point( radius, radius ) ) ) { auto items = g->m.i_at( p.xy() ); for( item &elem : items ) { - elem.set_owner( g->faction_manager_ptr->get( faction_id( "your_followers" ) ) ); + elem.set_owner( g->u.get_faction() ); } } } diff --git a/src/game.cpp b/src/game.cpp index 39f4feb40f8d9..f906fa7661699 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -35,6 +35,7 @@ #include "bionics.h" #include "bodypart.h" #include "cata_utility.h" +#include "auto_note.h" #include "catacharset.h" #include "clzones.h" #include "computer.h" @@ -47,7 +48,6 @@ #include "dependency_tree.h" #include "editmap.h" #include "enums.h" -#include "timed_event.h" #include "faction.h" #include "filesystem.h" #include "game_constants.h" @@ -68,12 +68,14 @@ #include "line.h" #include "live_view.h" #include "loading_ui.h" +#include "magic_enchantment.h" #include "map.h" #include "map_item_stack.h" #include "map_iterator.h" #include "mapbuffer.h" #include "mapdata.h" #include "mapsharing.h" +#include "memorial_logger.h" #include "messages.h" #include "mission.h" #include "mod_manager.h" @@ -102,9 +104,11 @@ #include "sdltiles.h" #include "sounds.h" #include "start_location.h" +#include "stats_tracker.h" #include "string_formatter.h" #include "string_input_popup.h" #include "submap.h" +#include "timed_event.h" #include "translations.h" #include "trap.h" #include "uistate.h" @@ -277,7 +281,9 @@ game::game() : { player_was_sleeping = false; reset_light_level(); + events().subscribe( &*stats_tracker_ptr ); events().subscribe( &*kill_tracker_ptr ); + events().subscribe( &*memorial_logger_ptr ); world_generator = std::make_unique(); // do nothing, everything that was in here is moved to init_data() which is called immediately after g = new game; in main.cpp // The reason for this move is so that g is not uninitialized when it gets to installing the parts into vehicles. @@ -659,6 +665,7 @@ void game::setup() SCT.vSCT.clear(); //Delete pending messages + stats().clear(); // reset kill counts kill_tracker_ptr->clear(); // reset follower list @@ -749,6 +756,8 @@ bool game::start_game() //Reset character safe mode/pickup rules get_auto_pickup().clear_character_rules(); get_safemode().clear_character_rules(); + get_auto_notes_settings().clear(); + get_auto_notes_settings().default_initialize(); //Put some NPCs in there! if( get_option( "STARTING_NPC" ) == "always" || @@ -830,7 +839,7 @@ bool game::start_game() } } for( auto &e : u.inv_dump() ) { - e->set_owner( g->faction_manager_ptr->get( faction_id( "your_followers" ) ) ); + e->set_owner( g->u.get_faction() ); } // Now that we're done handling coordinates, ensure the player's submap is in the center of the map update_map( u ); @@ -860,10 +869,7 @@ bool game::start_game() mission->assign( u ); } - //~ %s is player name - u.add_memorial_log( pgettext( "memorial_male", "%s began their journey into the Cataclysm." ), - pgettext( "memorial_female", "%s began their journey into the Cataclysm." ), - u.name ); + g->events().send(); return true; } @@ -874,7 +880,6 @@ void game::load_npcs() // uses submap coordinates std::vector> just_added; for( const auto &temp : overmap_buffer.get_npcs_near_player( radius ) ) { - if( temp->is_active() ) { continue; } @@ -902,8 +907,8 @@ void game::load_npcs() if( temp->marked_for_death ) { temp->die( nullptr ); } else { - if( temp->my_fac != nullptr ) { - temp->my_fac->known_by_u = true; + if( temp->get_faction() != nullptr ) { + temp->get_faction()->known_by_u = true; } active_npc.push_back( temp ); just_added.push_back( temp ); @@ -1163,24 +1168,12 @@ bool game::cleanup_at_end() .max_length( iMaxWidth - 4 - 1 ) .query_string(); death_screen(); - if( uquit == QUIT_SUICIDE ) { - u.add_memorial_log( pgettext( "memorial_male", "%s committed suicide." ), - pgettext( "memorial_female", "%s committed suicide." ), - u.name ); - } else { - u.add_memorial_log( pgettext( "memorial_male", "%s was killed." ), - pgettext( "memorial_female", "%s was killed." ), - u.name ); - } - if( !sLastWords.empty() ) { - u.add_memorial_log( pgettext( "memorial_male", "Last words: %s" ), - pgettext( "memorial_female", "Last words: %s" ), - sLastWords ); - } + const bool is_suicide = uquit == QUIT_SUICIDE; + events().send( is_suicide, sLastWords ); // Struck the save_player_data here to forestall Weirdness move_save_to_graveyard(); write_memorial_file( sLastWords ); - u.memorial_log.clear(); + memorial().clear(); std::vector characters = list_active_characters(); // remove current player from the active characters list, as they are dead std::vector::iterator curchar = std::find( characters.begin(), @@ -1521,6 +1514,7 @@ bool game::do_turn() m.build_floor_caches(); m.process_falling(); + following_vehicles(); m.vehmove(); // Process power and fuel consumption for all vehicles, including off-map ones. @@ -1649,6 +1643,16 @@ void game::process_activity() } } +void game::following_vehicles() +{ + for( auto &veh : m.get_vehicles() ) { + auto &v = veh.v; + if( v->is_following ) { + v->drive_to_local_target( u.pos(), true ); + } + } +} + void game::catch_a_monster( monster *fish, const tripoint &pos, player *p, const time_duration &catch_duration ) // catching function { @@ -1862,6 +1866,25 @@ static void update_faction_api( npc *guy ) } } +void game::validate_mounted_npcs() +{ + for( monster &m : all_monsters() ) { + if( m.has_effect( effect_ridden ) && m.mounted_player_id.is_valid() ) { + player *mounted_pl = g->critter_by_id( m.mounted_player_id ); + if( !mounted_pl ) { + // Target no longer valid. + m.mounted_player_id = character_id(); + m.remove_effect( effect_ridden ); + continue; + } + mounted_pl->mounted_creature = shared_from( m ); + mounted_pl->setpos( m.pos() ); + mounted_pl->add_effect( effect_riding, 1_turns, num_bp, true ); + m.mounted_player = mounted_pl; + } + } +} + void game::validate_npc_followers() { // Make sure visible followers are in the list. @@ -2338,6 +2361,7 @@ input_context get_default_mode_input_context() ctxt.register_action( "open_keybindings" ); ctxt.register_action( "open_options" ); ctxt.register_action( "open_autopickup" ); + ctxt.register_action( "open_autonotes" ); ctxt.register_action( "open_safemode" ); ctxt.register_action( "open_color" ); ctxt.register_action( "open_world_mods" ); @@ -2360,6 +2384,7 @@ input_context get_default_mode_input_context() ctxt.register_action( "toggle_auto_mining" ); ctxt.register_action( "toggle_auto_foraging" ); ctxt.register_action( "toggle_auto_pickup" ); + ctxt.register_action( "toggle_thief_mode" ); ctxt.register_action( "action_menu" ); ctxt.register_action( "main_menu" ); ctxt.register_action( "item_action_menu" ); @@ -2635,7 +2660,7 @@ void game::load( const save_t &name ) weather.nextweather = calendar::turn; read_from_file_optional( worldpath + name.base_path() + ".log", - std::bind( &player::load_memorial_file, &u, _1 ) ); + std::bind( &memorial_logger::load, &memorial(), _1 ) ); #if defined(__ANDROID__) read_from_file_optional( worldpath + name.base_path() + ".shortcuts", @@ -2655,19 +2680,20 @@ void game::load( const save_t &name ) init_autosave(); get_auto_pickup().load_character(); // Load character auto pickup rules + get_auto_notes_settings().load(); // Load character auto notes settings get_safemode().load_character(); // Load character safemode rules zone_manager::get_manager().load_zones(); // Load character world zones read_from_file_optional( get_world_base_save_path() + "/uistate.json", []( std::istream & stream ) { JsonIn jsin( stream ); uistate.deserialize( jsin ); } ); - reload_npcs(); validate_npc_followers(); + validate_mounted_npcs(); validate_camps(); update_map( u ); for( auto &e : u.inv_dump() ) { - e->set_owner( g->faction_manager_ptr->get( faction_id( "your_followers" ) ) ); + e->set_owner( g->u.get_faction() ); } // legacy, needs to be here as we access the map. if( !u.getID().is_valid() ) { @@ -2791,7 +2817,7 @@ void game::reset_npc_dispositions() npc_to_add->op_of_u.trust = 0; npc_to_add->op_of_u.value = 0; npc_to_add->op_of_u.owed = 0; - npc_to_add->set_fac( faction_id( "wasteland_scavengers" ) ); + npc_to_add->set_fac( faction_id( "no_faction" ) ); npc_to_add->add_new_mission( mission::reserve_random( ORIGIN_ANY_NPC, npc_to_add->global_omt_location(), npc_to_add->getID() ) ); @@ -2843,7 +2869,7 @@ bool game::save_player_data() save_weather( fout ); }, _( "weather state" ) ); const bool saved_log = write_to_file( playerfile + ".log", [&]( std::ostream & fout ) { - fout << u.dump_memorial(); + fout << memorial().dump(); }, _( "player memorial" ) ); #if defined(__ANDROID__) const bool saved_shortcuts = write_to_file( playerfile + ".shortcuts", [&]( std::ostream & fout ) { @@ -2863,6 +2889,16 @@ event_bus &game::events() return *event_bus_ptr; } +stats_tracker &game::stats() +{ + return *stats_tracker_ptr; +} + +memorial_logger &game::memorial() +{ + return *memorial_logger_ptr; +} + bool game::save() { try { @@ -2871,6 +2907,7 @@ bool game::save() !save_artifacts() || !save_maps() || !get_auto_pickup().save_character() || + !get_auto_notes_settings().save() || !get_safemode().save_character() || !write_to_file( get_world_base_save_path() + "/uistate.json", [&]( std::ostream & fout ) { JsonOut jsout( fout ); @@ -2959,7 +2996,7 @@ void game::write_memorial_file( std::string sLastWords ) const std::string path_string = memorial_file_path.str(); write_to_file( memorial_file_path.str(), [&]( std::ostream & fout ) { - u.memorial( fout, sLastWords ); + memorial().write( fout, sLastWords ); }, _( "player memorial" ) ); } @@ -3001,79 +3038,79 @@ void game::disp_faction_ends() } else if( elem.name == "The Old Guard" && elem.power != 100 ) { if( elem.power < 150 ) { data.emplace_back( - _( " Locked in an endless battle, the Old Guard was forced to consolidate their \ -resources in a handful of fortified bases along the coast. Without the men \ -or material to rebuild, the soldiers that remained lost all hope..." ) ); + _( " Locked in an endless battle, the Old Guard was forced to consolidate their " + "resources in a handful of fortified bases along the coast. Without the men " + "or material to rebuild, the soldiers that remained lost all hope..." ) ); } else { - data.emplace_back( _( " The steadfastness of individual survivors after the cataclysm impressed \ -the tattered remains of the once glorious union. Spurred on by small \ -successes, a number of operations to re-secure facilities met with limited \ -success. Forced to eventually consolidate to large bases, the Old Guard left \ -these facilities in the hands of the few survivors that remained. As the \ -years past, little materialized from the hopes of rebuilding civilization..." ) ); + data.emplace_back( _( " The steadfastness of individual survivors after the cataclysm impressed " + "the tattered remains of the once glorious union. Spurred on by small " + "successes, a number of operations to re-secure facilities met with limited " + "success. Forced to eventually consolidate to large bases, the Old Guard left " + "these facilities in the hands of the few survivors that remained. As the " + "years past, little materialized from the hopes of rebuilding civilization..." ) ); } display_table( w, _( "The Old Guard" ), 1, data ); } else if( elem.name == "The Free Merchants" && elem.power != 100 ) { if( elem.power < 150 ) { - data.emplace_back( _( " Life in the refugee shelter deteriorated as food shortages and disease \ -destroyed any hope of maintaining a civilized enclave. The merchants and \ -craftsmen dispersed to found new colonies but most became victims of \ -marauding bandits. Those who survived never found a place to call home..." ) ); + data.emplace_back( _( " Life in the refugee shelter deteriorated as food shortages and disease " + "destroyed any hope of maintaining a civilized enclave. The merchants and " + "craftsmen dispersed to found new colonies but most became victims of " + "marauding bandits. Those who survived never found a place to call home..." ) ); } else { - data.emplace_back( _( " The Free Merchants struggled for years to keep themselves fed but their \ -once profitable trade routes were plundered by bandits and thugs. In squalor \ -and filth the first generations born after the cataclysm are told stories of \ -the old days when food was abundant and the children were allowed to play in \ -the sun..." ) ); + data.emplace_back( _( " The Free Merchants struggled for years to keep themselves fed but their " + "once profitable trade routes were plundered by bandits and thugs. In squalor " + "and filth the first generations born after the cataclysm are told stories of " + "the old days when food was abundant and the children were allowed to play in " + "the sun..." ) ); } display_table( w, _( "The Free Merchants" ), 1, data ); } else if( elem.name == "The Tacoma Commune" && elem.power != 100 ) { if( elem.power < 150 ) { - data.emplace_back( _( " The fledgling outpost was abandoned a few months later. The external \ -threats combined with low crop yields caused the Free Merchants to withdraw \ -their support. When the exhausted migrants returned to the refugee center \ -they were turned away to face the world on their own." ) ); + data.emplace_back( _( " The fledgling outpost was abandoned a few months later. The external " + "threats combined with low crop yields caused the Free Merchants to withdraw " + "their support. When the exhausted migrants returned to the refugee center " + "they were turned away to face the world on their own." ) ); } else { data.emplace_back( - _( " The commune continued to grow rapidly through the years despite constant \ -external threat. While maintaining a reputation as a haven for all law-\ -abiding citizens, the commune's leadership remained loyal to the interests of \ -the Free Merchants. Hard labor for little reward remained the price to be \ -paid for those who sought the safety of the community." ) ); + _( " The commune continued to grow rapidly through the years despite constant " + "external threat. While maintaining a reputation as a haven for all law-" + "abiding citizens, the commune's leadership remained loyal to the interests of " + "the Free Merchants. Hard labor for little reward remained the price to be " + "paid for those who sought the safety of the community." ) ); } display_table( w, _( "The Tacoma Commune" ), 1, data ); } else if( elem.name == "The Wasteland Scavengers" && elem.power != 100 ) { if( elem.power < 150 ) { data.emplace_back( - _( " The lone bands of survivors who wandered the now alien world dwindled in \ -number through the years. Unable to compete with the growing number of \ -monstrosities that had adapted to live in their world, those who did survive \ -lived in dejected poverty and hopelessness..." ) ); + _( " The lone bands of survivors who wandered the now alien world dwindled in " + "number through the years. Unable to compete with the growing number of " + "monstrosities that had adapted to live in their world, those who did survive " + "lived in dejected poverty and hopelessness..." ) ); } else { data.emplace_back( - _( " The scavengers who flourished in the opening days of the cataclysm found \ -an ever increasing challenge in finding and maintaining equipment from the \ -old world. Enormous hordes made cities impossible to enter while new \ -eldritch horrors appeared mysteriously near old research labs. But on the \ -fringes of where civilization once ended, bands of hunter-gatherers began to \ -adopt agrarian lifestyles in fortified enclaves..." ) ); + _( " The scavengers who flourished in the opening days of the cataclysm found " + "an ever increasing challenge in finding and maintaining equipment from the " + "old world. Enormous hordes made cities impossible to enter while new " + "eldritch horrors appeared mysteriously near old research labs. But on the " + "fringes of where civilization once ended, bands of hunter-gatherers began to " + "adopt agrarian lifestyles in fortified enclaves..." ) ); } display_table( w, _( "The Wasteland Scavengers" ), 1, data ); } else if( elem.name == "Hell's Raiders" && elem.power != 100 ) { if( elem.power < 150 ) { - data.emplace_back( _( " The raiders grew more powerful than any other faction as attrition \ -destroyed the Old Guard. The ruthless men and women who banded together to \ -rob refugees and pillage settlements soon found themselves without enough \ -victims to survive. The Hell's Raiders were eventually destroyed when \ -infighting erupted into civil war but there were few survivors left to \ -celebrate their destruction." ) ); + data.emplace_back( _( " The raiders grew more powerful than any other faction as attrition " + "destroyed the Old Guard. The ruthless men and women who banded together to " + "rob refugees and pillage settlements soon found themselves without enough " + "victims to survive. The Hell's Raiders were eventually destroyed when " + "infighting erupted into civil war but there were few survivors left to " + "celebrate their destruction." ) ); } else { - data.emplace_back( _( " Fueled by drugs and rage, the Hell's Raiders fought tooth and nail to \ -overthrow the last strongholds of the Old Guard. The costly victories \ -brought the warlords abundant territory and slaves but little in the way of \ -stability. Within weeks, infighting led to civil war as tribes vied for \ -leadership of the faction. When only one warlord finally secured control, \ -there was nothing left to fight for... just endless cities full of the dead." ) ); + data.emplace_back( _( " Fueled by drugs and rage, the Hell's Raiders fought tooth and nail to " + "overthrow the last strongholds of the Old Guard. The costly victories " + "brought the warlords abundant territory and slaves but little in the way of " + "stability. Within weeks, infighting led to civil war as tribes vied for " + "leadership of the faction. When only one warlord finally secured control, " + "there was nothing left to fight for... just endless cities full of the dead." ) ); } display_table( w, _( "Hell's Raiders" ), 1, data ); } @@ -4144,6 +4181,9 @@ void game::monmove() if( !critter.has_effect( effect_controlled ) ) { // Formulate a path to follow critter.plan(); + } else { + critter.moves = 0; + break; } critter.move(); // Move one square, possibly hit u critter.process_triggers(); @@ -4285,7 +4325,7 @@ void game::knockback( std::vector &traj, int force, int stun, int dam_ add_msg( _( "%s was stunned!" ), targ->name() ); } for( size_t i = 1; i < traj.size(); i++ ) { - if( m.impassable( point( traj[i].x, traj[i].y ) ) ) { + if( m.impassable( traj[i].xy() ) ) { targ->setpos( traj[i - 1] ); force_remaining = traj.size() - i; if( stun != 0 ) { @@ -4343,7 +4383,7 @@ void game::knockback( std::vector &traj, int force, int stun, int dam_ add_msg( _( "%s was stunned!" ), targ->name ); } for( size_t i = 1; i < traj.size(); i++ ) { - if( m.impassable( point( traj[i].x, traj[i].y ) ) ) { // oops, we hit a wall! + if( m.impassable( traj[i].xy() ) ) { // oops, we hit a wall! targ->setpos( traj[i - 1] ); force_remaining = traj.size() - i; if( stun != 0 ) { @@ -4525,7 +4565,18 @@ T *game::critter_at( const tripoint &p, bool allow_hallucination ) if( !allow_hallucination && mon_ptr->is_hallucination() ) { return nullptr; } - return dynamic_cast( mon_ptr.get() ); + // if we wanted to check for an NPC / player / avatar, + // there is sometimes a monster AND an NPC/player there at the same time. + // because the NPC/player etc may be riding that monster. + // so only return the monster if we were actually looking for a monster. + // otherwise, keep looking for the rider. + // critter_at or critter_at() with no template will still default to returning monster first, + // which is ok for the occasions where that happens. + if( !mon_ptr->has_effect( effect_ridden ) || ( std::is_same::value || + std::is_same::value || std::is_same::value || + std::is_same::value ) ) { + return dynamic_cast( mon_ptr.get() ); + } } if( p == u.pos() ) { return dynamic_cast( &u ); @@ -4991,7 +5042,7 @@ bool game::forced_door_closing( const tripoint &p, const ter_id &door_type, int } const tripoint kbp( kbx, kby, p.z ); const bool can_see = u.sees( tripoint( x, y, p.z ) ); - player *npc_or_player = critter_at( tripoint( x, y, p.z ) ); + player *npc_or_player = critter_at( tripoint( x, y, p.z ), false ); if( npc_or_player != nullptr ) { if( bash_dmg <= 0 ) { return false; @@ -5206,6 +5257,7 @@ void game::control_vehicle() for( const tripoint &target : veh->get_points() ) { u.clear_memorized_tile( m.getabs( target ) ); } + veh->is_following = false; } } @@ -5229,8 +5281,9 @@ bool game::npc_menu( npc &who ) amenu.text = string_format( _( "What to do with %s?" ), who.disp_name() ); amenu.addentry( talk, true, 't', _( "Talk" ) ); - amenu.addentry( swap_pos, obeys, 's', _( "Swap positions" ) ); - amenu.addentry( push, obeys, 'p', _( "Push away" ) ); + amenu.addentry( swap_pos, obeys && !who.is_mounted() && + !u.is_mounted(), 's', _( "Swap positions" ) ); + amenu.addentry( push, obeys && !who.is_mounted(), 'p', _( "Push away" ) ); amenu.addentry( examine_wounds, true, 'w', _( "Examine wounds" ) ); amenu.addentry( use_item, true, 'i', _( "Use item on" ) ); amenu.addentry( sort_armor, true, 'r', _( "Sort armor" ) ); @@ -6190,8 +6243,8 @@ void game::zones_manager() break; } - mgr.add( name, id, your_followers, false, true, position->first, position->second, - options ); + mgr.add( name, id, g->u.get_faction()->id, false, true, position->first, + position->second, options ); zones = get_zones(); active_index = zone_cnt - 1; @@ -6596,7 +6649,7 @@ look_around_result game::look_around( catacurses::window w_info, tripoint ¢e draw_border( w_info ); static const std::string title_prefix = "< "; - static const char *title = _( "Look Around" ); + const std::string title = _( "Look Around" ); static const std::string title_suffix = " >"; static const std::string full_title = title_prefix + title + title_suffix; const int start_pos = center_text_pos( full_title, 0, getmaxx( w_info ) - 1 ); @@ -7608,7 +7661,8 @@ game::vmenu_ret game::list_monsters( const std::vector &monster_list const int iCurPos = iStartPos + y; const int iCatPos = CatSortIter->first; if( iCurPos == iCatPos ) { - const std::string &cat_name = Creature::get_attitude_ui_data( CatSortIter->second ).first; + const std::string cat_name = Creature::get_attitude_ui_data( + CatSortIter->second ).first.translated(); mvwprintz( w_monsters, point( 1, y ), c_magenta, cat_name ); ++CatSortIter; continue; @@ -7966,8 +8020,8 @@ void game::butcher() const int factor = u.max_quality( quality_id( "BUTCHER" ) ); const int factorD = u.max_quality( quality_id( "CUT_FINE" ) ); - static const char *no_knife_msg = _( "You don't have a butchering tool." ); - static const char *no_corpse_msg = _( "There are no corpses here to butcher." ); + const std::string no_knife_msg = _( "You don't have a butchering tool." ); + const std::string no_corpse_msg = _( "There are no corpses here to butcher." ); //You can't butcher on sealed terrain- you have to smash/shovel/etc it open first if( m.has_flag( "SEALED", u.pos() ) ) { @@ -8304,6 +8358,9 @@ void game::eat( item_location( *menu )( player &p ), int pos ) item_loc.remove_item(); } } + if( g->u.get_value( "THIEF_MODE_KEEP" ) != "YES" ) { + g->u.set_value( "THIEF_MODE", "THIEF_ASK" ); + } } void game::change_side( int pos ) @@ -9071,8 +9128,12 @@ bool game::walk_move( const tripoint &dest_loc ) add_msg( m_good, _( "You are hiding in the %s." ), m.name( dest_loc ) ); } - if( dest_loc != u.pos() && !u.is_mounted() ) { - u.lifetime_stats.squares_walked++; + if( dest_loc != u.pos() ) { + mtype_id mount_type; + if( u.is_mounted() ) { + mount_type = u.mounted_creature->type->id; + } + g->events().send( mount_type ); } tripoint oldpos = u.pos(); @@ -9218,6 +9279,9 @@ point game::place_player( const tripoint &dest_loc ) critter.move_to( u.pos(), true ); // Force the movement even though the player is there right now. add_msg( _( "You displace the %s." ), critter.name() ); } + } else if( !u.has_effect( effect_riding ) ) { + add_msg( _( "You cannot move the %s out of the way." ), critter.name() ); + return u.pos().xy(); } } @@ -9723,7 +9787,7 @@ void game::on_move_effects() // TODO: Move this to a character method if( !u.is_mounted() ) { const item muscle( "muscle" ); - if( u.lifetime_stats.squares_walked % 8 == 0 ) { + if( one_in( 8 ) ) {// active power gen if( u.has_active_bionic( bionic_id( "bio_torsionratchet" ) ) ) { u.charge_power( 1 ); } @@ -9733,12 +9797,12 @@ void game::on_move_effects() } } } - if( u.lifetime_stats.squares_walked % 160 == 0 ) { + if( one_in( 160 ) ) {// passive power gen if( u.has_bionic( bionic_id( "bio_torsionratchet" ) ) ) { u.charge_power( 1 ); } for( const bionic_id &bid : u.get_bionic_fueled_with( muscle ) ) { - if( u.has_active_bionic( bid ) ) { + if( u.has_bionic( bid ) ) { u.charge_power( muscle.fuel_energy() * bid->fuel_efficiency ); } } @@ -10129,6 +10193,9 @@ void game::vertical_move( int movez, bool force ) if( !m.has_zlevels() ) { const tripoint to = u.pos(); for( monster &critter : all_monsters() ) { + if( critter.has_effect( effect_ridden ) ) { + continue; + } int turns = critter.turns_to_reach( to.xy() ); if( turns < 10 && coming_to_stairs.size() < 8 && critter.will_reach( to.xy() ) && !slippedpast ) { @@ -10150,14 +10217,14 @@ void game::vertical_move( int movez, bool force ) if( !m.has_zlevels() && abs( movez ) == 1 ) { std::copy_if( active_npc.begin(), active_npc.end(), back_inserter( npcs_to_bring ), [this]( const std::shared_ptr &np ) { - return np->is_walking_with() && rl_dist( np->pos(), u.pos() ) < 2; + return np->is_walking_with() && !np->is_mounted() && rl_dist( np->pos(), u.pos() ) < 2; } ); } if( m.has_zlevels() && abs( movez ) == 1 ) { for( monster &critter : all_monsters() ) { - if( critter.attack_target() == &g->u || ( critter.has_effect( effect_pet ) && - critter.friendly == -1 ) ) { + if( critter.attack_target() == &g->u || ( !critter.has_effect( effect_ridden ) && + critter.has_effect( effect_pet ) && critter.friendly == -1 ) ) { monsters_following.push_back( &critter ); } } @@ -10430,7 +10497,9 @@ void game::vertical_shift( const int z_after ) } m.spawn_monsters( true ); - + // this may be required after a vertical shift if z-levels are not enabled + // the critter is unloaded/loaded, and it needs to reconstruct its rider data after being reloaded. + validate_mounted_npcs(); vertical_notes( z_before, z_after ); } @@ -10976,13 +11045,12 @@ void game::teleport( player *p, bool add_teleglow ) p->setx( new_pos.x ); p->sety( new_pos.y ); if( m.impassable( new_pos ) ) { //Teleported into a wall + const std::string obstacle_name = m.obstacle_name( new_pos ); + g->events().send( p->getID(), obstacle_name ); if( can_see ) { if( is_u ) { add_msg( _( "You teleport into the middle of a %s!" ), m.obstacle_name( new_pos ) ); - p->add_memorial_log( pgettext( "memorial_male", "Teleported into a %s." ), - pgettext( "memorial_female", "Teleported into a %s." ), - m.obstacle_name( new_pos ) ); } else { add_msg( _( "%1$s teleports into the middle of a %2$s!" ), p->name, m.obstacle_name( new_pos ) ); @@ -10990,20 +11058,17 @@ void game::teleport( player *p, bool add_teleglow ) } p->apply_damage( nullptr, bp_torso, 500 ); p->check_dead_state(); - } else if( can_see ) { - if( monster *const mon_ptr = critter_at( new_pos ) ) { - monster &critter = *mon_ptr; + } else if( monster *const mon_ptr = critter_at( new_pos ) ) { + g->events().send( p->getID(), mon_ptr->name() ); + if( can_see ) { if( is_u ) { add_msg( _( "You teleport into the middle of a %s!" ), - critter.name() ); - u.add_memorial_log( pgettext( "memorial_male", "Telefragged a %s." ), - pgettext( "memorial_female", "Telefragged a %s." ), - critter.name() ); + mon_ptr->name() ); } else { add_msg( _( "%1$s teleports into the middle of a %2$s!" ), - p->name, critter.name() ); + p->name, mon_ptr->name() ); } - critter.die_in_explosion( p ); + mon_ptr->die_in_explosion( p ); } } if( is_u ) { @@ -11179,13 +11244,21 @@ void game::process_artifact( item &it, player &p ) const bool wielded = ( &it == &p.weapon ); std::vector effects = it.type->artifact->effects_carried; if( worn ) { - auto &ew = it.type->artifact->effects_worn; + const std::vector &ew = it.type->artifact->effects_worn; effects.insert( effects.end(), ew.begin(), ew.end() ); } if( wielded ) { - auto &ew = it.type->artifact->effects_wielded; + const std::vector &ew = it.type->artifact->effects_wielded; effects.insert( effects.end(), ew.begin(), ew.end() ); } + std::vector active_enchantments; + if( it.is_relic() ) { + for( const enchantment &ench : it.get_enchantments() ) { + if( ench.is_active( p, it ) ) { + active_enchantments.emplace_back( ench ); + } + } + } if( it.is_tool() ) { // Recharge it if necessary if( it.ammo_remaining() < it.ammo_capacity() && calendar::once_every( 1_minutes ) ) { @@ -11250,7 +11323,11 @@ void game::process_artifact( item &it, player &p ) } } - for( auto &i : effects ) { + for( const enchantment &ench : active_enchantments ) { + ench.activate_passive( p ); + } + + for( const art_effect_passive &i : effects ) { switch( i ) { case AEP_STR_UP: p.mod_str_bonus( +4 ); diff --git a/src/game.h b/src/game.h index f84421e6e4b48..864041cdbc4d4 100644 --- a/src/game.h +++ b/src/game.h @@ -87,10 +87,12 @@ class avatar; class event_bus; class kill_tracker; class map; +class memorial_logger; class faction_manager; class new_faction_manager; -class player; class npc; +class player; +class stats_tracker; class vehicle; class Creature_tracker; class scenario; @@ -256,11 +258,11 @@ class game template const T * critter_at( const tripoint &p, bool allow_hallucination = false ) const; /** - * Returns a shared pointer to the given critter (which can be of any of the subclasses of - * @ref Creature). The function may return an empty pointer if the given critter - * is not stored anywhere (e.g. it was allocated on the stack, not stored in - * the @ref critter_tracker nor in @ref active_npc nor is it @ref u). - */ + * Returns a shared pointer to the given critter (which can be of any of the subclasses of + * @ref Creature). The function may return an empty pointer if the given critter + * is not stored anywhere (e.g. it was allocated on the stack, not stored in + * the @ref critter_tracker nor in @ref active_npc nor is it @ref u). + */ template std::shared_ptr shared_from( const T &critter ); @@ -448,9 +450,11 @@ class game std::set get_follower_list(); /** validate list of followers to account for overmap buffers */ void validate_npc_followers(); + void validate_mounted_npcs(); /** validate camps to ensure they are on the overmap list */ void validate_camps(); - + /** process vehicles that are following the player */ + void following_vehicles(); /** Performs a random short-distance teleport on the given player, granting teleglow if needed. */ void teleport( player *p = nullptr, bool add_teleglow = true ); /** Picks and spawns a random fish from the remaining fish list when a fish is caught. */ @@ -623,6 +627,18 @@ class game // Draw a highlight graphic at p, for example when examining something. // TILES only, in curses this does nothing void draw_highlight( const tripoint &p ); + void draw_radiation_override( const tripoint &p, int rad ); + void draw_terrain_override( const tripoint &p, const ter_id &id ); + void draw_furniture_override( const tripoint &p, const furn_id &id ); + void draw_graffiti_override( const tripoint &p, bool has ); + void draw_trap_override( const tripoint &p, const trap_id &id ); + void draw_field_override( const tripoint &p, const field_type_id &id ); + void draw_item_override( const tripoint &p, const itype_id &id, const mtype_id &mid, bool hilite ); + void draw_vpart_override( const tripoint &p, const vpart_id &id, int part_mod, int veh_dir, + bool hilite, const point &mount ); + void draw_below_override( const tripoint &p, bool draw ); + void draw_monster_override( const tripoint &p, const mtype_id &id, int count, + bool more, Creature::Attitude att ); bool is_in_viewport( const tripoint &p, int margin = 0 ) const; /** @@ -874,7 +890,9 @@ class game pimpl scent_ptr; pimpl timed_event_manager_ptr; pimpl event_bus_ptr; + pimpl stats_tracker_ptr; pimpl kill_tracker_ptr; + pimpl memorial_logger_ptr; public: /** Make map a reference here, to avoid map.h in game.h */ @@ -884,6 +902,8 @@ class game timed_event_manager &timed_events; event_bus &events(); + stats_tracker &stats(); + memorial_logger &memorial(); pimpl critter_tracker; pimpl faction_manager_ptr; @@ -940,7 +960,6 @@ class game int mostseen; // # of mons seen last turn; if this increases, set safe_mode to SAFE_MODE_STOP private: std::shared_ptr u_shared_ptr; - std::vector> active_npc; catacurses::window w_terrain_ptr; catacurses::window w_minimap_ptr; @@ -953,6 +972,7 @@ class game bool safe_mode_warning_logged; bool bVMonsterLookFire; character_id next_npc_id; + std::vector> active_npc; int next_mission_id; std::set follower_ids; // Keep track of follower NPC IDs int moves_since_last_save; diff --git a/src/game_inventory.cpp b/src/game_inventory.cpp index 45ff27e63381a..3a6df324ff334 100644 --- a/src/game_inventory.cpp +++ b/src/game_inventory.cpp @@ -179,7 +179,7 @@ void game_menus::inv::common( avatar &you ) inv_s.set_title( _( "Inventory" ) ); inv_s.set_hint( string_format( _( "Item hotkeys assigned: %d/%d" ), - you.allocated_invlets().size(), inv_chars.size() ) ); + you.allocated_invlets().count(), inv_chars.size() ) ); int res = 0; @@ -667,17 +667,15 @@ class comestible_inventory_preset : public inventory_selector_preset static std::string get_consume_needs_hint( player &p ) { - const auto &cmgr = get_all_colors(); auto hint = std::string(); auto desc = p.get_hunger_description(); - hint.append( string_format( "[%s %s] ", _( "Food :" ), - cmgr.get_name( desc.second ), desc.first ) ); + hint.append( string_format( "%s %s", _( "Food :" ), colorize( desc.first, desc.second ) ) ); + hint.append( string_format( " %s ", LINE_XOXO_S ) ); desc = p.get_thirst_description(); - hint.append( string_format( "[%s %s] ", _( "Drink:" ), - cmgr.get_name( desc.second ), desc.first ) ); + hint.append( string_format( "%s %s", _( "Drink:" ), colorize( desc.first, desc.second ) ) ); + hint.append( string_format( " %s ", LINE_XOXO_S ) ); desc = p.get_pain_description(); - hint.append( string_format( "[%s %s] ", _( "Pain :" ), - cmgr.get_name( desc.second ), desc.first ) ); + hint.append( string_format( "%s %s", _( "Pain :" ), colorize( desc.first, desc.second ) ) ); return hint; } @@ -898,12 +896,11 @@ class read_inventory_preset: public pickup_inventory_preset { public: read_inventory_preset( const player &p ) : pickup_inventory_preset( p ), p( p ) { - static const std::string unknown( _( "?" ) ); - static const std::string martial_arts( _( "martial arts" ) ); + const std::string unknown = _( "?" ); - append_cell( [ this, &p ]( const item_location & loc ) -> std::string { + append_cell( [ this, &p, unknown ]( const item_location & loc ) -> std::string { if( loc->type->can_use( "MA_MANUAL" ) ) { - return martial_arts; + return _( "martial arts" ); } if( !is_known( loc ) ) { return unknown; @@ -918,7 +915,7 @@ class read_inventory_preset: public pickup_inventory_preset return std::string(); }, _( "TRAINS (CURRENT)" ), unknown ); - append_cell( [ this ]( const item_location & loc ) -> std::string { + append_cell( [ this, unknown ]( const item_location & loc ) -> std::string { if( !is_known( loc ) ) { return unknown; } @@ -928,14 +925,14 @@ class read_inventory_preset: public pickup_inventory_preset return unlearned > 0 ? to_string( unlearned ) : std::string(); }, _( "RECIPES" ), unknown ); - append_cell( [ this, &p ]( const item_location & loc ) -> std::string { + append_cell( [ this, &p, unknown ]( const item_location & loc ) -> std::string { if( !is_known( loc ) ) { return unknown; } return good_bad_none( p.book_fun_for( *loc, p ) ); }, _( "FUN" ), unknown ); - append_cell( [ this, &p ]( const item_location & loc ) -> std::string { + append_cell( [ this, &p, unknown ]( const item_location & loc ) -> std::string { if( !is_known( loc ) ) { return unknown; } diff --git a/src/generic_factory.h b/src/generic_factory.h index 9c77654883c23..327a48efc3321 100644 --- a/src/generic_factory.h +++ b/src/generic_factory.h @@ -473,7 +473,11 @@ inline void mandatory( JsonObject &jo, const bool was_loaded, const std::string { if( !jo.read( name, member ) ) { if( !was_loaded ) { - jo.throw_error( "missing mandatory member \"" + name + "\"" ); + if( jo.has_member( name ) ) { + jo.throw_error( "failed to read mandatory member \"" + name + "\"" ); + } else { + jo.throw_error( "missing mandatory member \"" + name + "\"" ); + } } } } @@ -483,7 +487,11 @@ inline void mandatory( JsonObject &jo, const bool was_loaded, const std::string { if( !reader( jo, name, member, was_loaded ) ) { if( !was_loaded ) { - jo.throw_error( "missing mandatory member \"" + name + "\"" ); + if( jo.has_member( name ) ) { + jo.throw_error( "failed to read mandatory member \"" + name + "\"" ); + } else { + jo.throw_error( "missing mandatory member \"" + name + "\"" ); + } } } } @@ -570,7 +578,7 @@ inline bool unicode_codepoint_from_symbol_reader( JsonObject &jo, const std::str { int sym_as_int; std::string sym_as_string; - if( !jo.read( member_name, sym_as_string ) ) { + if( !jo.read( member_name, sym_as_string, false ) ) { // Legacy fallback to integer `sym`. if( !jo.read( member_name, sym_as_int ) ) { return false; diff --git a/src/handle_action.cpp b/src/handle_action.cpp index 0f8a3192d921a..71f3f83d9b8c0 100644 --- a/src/handle_action.cpp +++ b/src/handle_action.cpp @@ -9,6 +9,7 @@ #include "action.h" #include "advanced_inv.h" #include "auto_pickup.h" +#include "auto_note.h" #include "avatar.h" #include "avatar_action.h" #include "bionics.h" @@ -419,7 +420,7 @@ static void pldrive( int x, int y ) } } - veh->pldrive( x, y ); + veh->pldrive( point( x, y ) ); } inline static void pldrive( point d ) @@ -821,14 +822,14 @@ static void wait() }; add_menu_item( 7, 'd', - setting_alarm ? _( "Set alarm for dawn" ) : _( "Wait till dawn" ), - diurnal_time_before( to_turns( sunrise( calendar::turn ) - calendar::turn_zero ) ) ); + setting_alarm ? _( "Set alarm for dawn" ) : _( "Wait till daylight" ), + diurnal_time_before( to_turns( daylight_time( calendar::turn ) - calendar::turn_zero ) ) ); add_menu_item( 8, 'n', setting_alarm ? _( "Set alarm for noon" ) : _( "Wait till noon" ), diurnal_time_before( last_midnight + 12_hours ) ); add_menu_item( 9, 'k', - setting_alarm ? _( "Set alarm for dusk" ) : _( "Wait till dusk" ), - diurnal_time_before( to_turns( sunset( calendar::turn ) - calendar::turn_zero ) ) ); + setting_alarm ? _( "Set alarm for dusk" ) : _( "Wait till night" ), + diurnal_time_before( to_turns( night_time( calendar::turn ) - calendar::turn_zero ) ) ); add_menu_item( 10, 'm', setting_alarm ? _( "Set alarm for midnight" ) : _( "Wait till midnight" ), diurnal_time_before( last_midnight + 0_hours ) ); @@ -2211,6 +2212,11 @@ bool game::handle_action() refresh_all(); break; + case ACTION_AUTONOTES: + get_auto_notes_settings().show_gui(); + refresh_all(); + break; + case ACTION_SAFEMODE: get_safemode().show(); refresh_all(); @@ -2276,6 +2282,28 @@ bool game::handle_action() get_option( "AUTO_MINING" ) ? _( "ON" ) : _( "OFF" ) ); break; + case ACTION_TOGGLE_THIEF_MODE: + if( g->u.get_value( "THIEF_MODE" ) == "THIEF_ASK" ) { + u.set_value( "THIEF_MODE", "THIEF_HONEST" ); + u.set_value( "THIEF_MODE_KEEP", "YES" ); + //~ Thief mode cycled between THIEF_ASK/THIEF_HONEST/THIEF_STEAL + add_msg( _( "You will not pick up other peoples belongings." ) ); + } else if( g->u.get_value( "THIEF_MODE" ) == "THIEF_HONEST" ) { + u.set_value( "THIEF_MODE", "THIEF_STEAL" ); + u.set_value( "THIEF_MODE_KEEP", "YES" ); + //~ Thief mode cycled between THIEF_ASK/THIEF_HONEST/THIEF_STEAL + add_msg( _( "You will pick up also those things that belong to others!" ) ); + } else if( g->u.get_value( "THIEF_MODE" ) == "THIEF_STEAL" ) { + u.set_value( "THIEF_MODE", "THIEF_ASK" ); + u.set_value( "THIEF_MODE_KEEP", "NO" ); + //~ Thief mode cycled between THIEF_ASK/THIEF_HONEST/THIEF_STEAL + add_msg( _( "You will be reminded not to steal." ) ); + } else { + // ERROR + add_msg( _( "THIEF_MODE CONTAINED BAD VALUE [ %s ]!" ), g->u.get_value( "THIEF_MODE" ) ); + } + break; + case ACTION_TOGGLE_AUTO_FORAGING: get_options().get_option( "AUTO_FORAGING" ).setNext(); get_options().save(); diff --git a/src/tuple_hash.h b/src/hash_utils.h similarity index 59% rename from src/tuple_hash.h rename to src/hash_utils.h index 47ef7a15c72ce..98aba822cccec 100644 --- a/src/tuple_hash.h +++ b/src/hash_utils.h @@ -2,10 +2,10 @@ #ifndef CATA_TUPLE_HASH_H #define CATA_TUPLE_HASH_H -// Support for tuple and pair hashing. +#include + +// Support for hashing standard types. // This is taken almost directly from the boost library code. -// Function has to live in the std namespace -// so that it is picked up by argument-dependent name lookup (ADL). namespace cata { @@ -15,10 +15,10 @@ namespace cata // See Mike Seymour in magic-numbers-in-boosthash-combine: // http://stackoverflow.com/questions/4948780 -template -inline void hash_combine( std::size_t &seed, const T &v ) +template > +inline void hash_combine( std::size_t &seed, const T &v, const Hash &hash = std::hash() ) { - seed ^= std::hash()( v ) + 0x9e3779b9 + ( seed << 6 ) + ( seed >> 2 ); + seed ^= hash( v ) + 0x9e3779b9 + ( seed << 6 ) + ( seed >> 2 ); } namespace tuple_hash_detail @@ -60,6 +60,32 @@ struct tuple_hash { } }; +// auto_hash will use std::hash for most types but tuple_hash for pair or +// tuple. +template +struct auto_hash : std::hash {}; + +template +struct auto_hash> : tuple_hash {}; + +template +struct auto_hash> : tuple_hash {}; + +struct range_hash { + template + std::size_t operator()( const Range &range ) const noexcept { + using value_type = typename Range::value_type; + using hash_type = auto_hash; + hash_type hash; + + std::size_t seed = range.size(); + for( const auto &value : range ) { + hash_combine( seed, value, hash ); + } + return seed; + } +}; + } // namespace cata #endif // CATA_TUPLE_HASH_H diff --git a/src/help.cpp b/src/help.cpp index 10ddc88510c3b..cb6692c0aa50d 100644 --- a/src/help.cpp +++ b/src/help.cpp @@ -73,12 +73,12 @@ std::string help::get_dir_grid() } }; - std::string movement = " \n"\ - " \\ | / \\ | /\n"\ - " \\|/ \\|/\n"\ - "---- ----\n"\ - " /|\\ /|\\\n"\ - " / | \\ / | \\\n"\ + std::string movement = " \n" + " \\ | / \\ | /\n" + " \\|/ \\|/\n" + "---- ----\n" + " /|\\ /|\\\n" + " / | \\ / | \\\n" " "; for( auto dir : movearray ) { @@ -96,9 +96,9 @@ void help::draw_menu( const catacurses::window &win ) { werase( win ); // NOLINTNEXTLINE(cata-use-named-point-constants) - int y = fold_and_print( win, point( 1, 0 ), getmaxx( win ) - 2, c_white, _( "\ -Please press one of the following for help on that topic:\n\ -Press ESC to return to the game." ) ) + 1; + int y = fold_and_print( win, point( 1, 0 ), getmaxx( win ) - 2, c_white, + _( "Please press one of the following for help on that topic:\n" + "Press ESC to return to the game." ) ) + 1; size_t half_size = help_texts.size() / 2 + 1; int second_column = divide_round_up( getmaxx( win ), 2 ); diff --git a/src/iexamine.cpp b/src/iexamine.cpp index d4ca63a801279..db5f5778a6f15 100644 --- a/src/iexamine.cpp +++ b/src/iexamine.cpp @@ -25,6 +25,7 @@ #include "craft_command.h" #include "debug.h" #include "effect.h" +#include "event_bus.h" #include "timed_event.h" #include "field.h" #include "fungal_effects.h" @@ -92,7 +93,6 @@ const mtype_id mon_fungal_blossom( "mon_fungal_blossom" ); const mtype_id mon_spider_web_s( "mon_spider_web_s" ); const mtype_id mon_spider_widow_giant_s( "mon_spider_widow_giant_s" ); const mtype_id mon_spider_cellar_giant_s( "mon_spider_cellar_giant_s" ); -const mtype_id mon_turret( "mon_turret" ); const mtype_id mon_turret_rifle( "mon_turret_rifle" ); const skill_id skill_computer( "computer" ); @@ -775,8 +775,7 @@ void iexamine::cardreader( player &p, const tripoint &examp ) for( monster &critter : g->all_monsters() ) { // Check 1) same overmap coords, 2) turret, 3) hostile if( ms_to_omt_copy( g->m.getabs( critter.pos() ) ) == ms_to_omt_copy( g->m.getabs( examp ) ) && - ( critter.type->id == mon_turret || - critter.type->id == mon_turret_rifle ) && + ( critter.type->id == mon_turret_rifle ) && critter.attitude_to( p ) == Creature::Attitude::A_HOSTILE ) { g->remove_zombie( critter ); } @@ -803,30 +802,8 @@ void iexamine::cardreader_robofac( player &p, const tripoint &examp ) add_msg( m_bad, _( "The card reader short circuits!" ) ); g->m.ter_set( examp, t_card_reader_broken ); intercom( p, examp ); - } else { - switch( hack_attempt( p ) ) { - case HACK_FAIL: - case HACK_NOTHING: - add_msg( _( "Nothing happens." ) ); - break; - case HACK_SUCCESS: { - add_msg( _( "You activate the panel!" ) ); - add_msg( m_bad, _( "The card reader short circuits!" ) ); - g->m.ter_set( examp, t_card_reader_broken ); - intercom( p, examp ); - } - break; - case HACK_UNABLE: - add_msg( - m_info, - p.get_skill_level( skill_computer ) > 0 ? - _( "Looks like you need a %s, or a tool to hack it with." ) : - _( "Looks like you need a %s." ), - item::nname( card_type ) - ); - break; - } + add_msg( _( "You have never seen this card reader model before. Hacking it seems impossible." ) ); } } @@ -879,7 +856,7 @@ void iexamine::cardreader_foodplace( player &p, const tripoint &examp ) void iexamine::intercom( player &p, const tripoint &examp ) { const std::vector intercom_npcs = g->get_npcs_if( [examp]( const npc & guy ) { - return guy.name == "the intercom" && rl_dist( guy.pos(), examp ) < 10; + return guy.myclass == npc_class_id( "NC_ROBOFAC_INTERCOM" ) && rl_dist( guy.pos(), examp ) < 10; } ); if( intercom_npcs.empty() ) { p.add_msg_if_player( m_info, _( "No one responds." ) ); @@ -1309,10 +1286,9 @@ void iexamine::bulletin_board( player &p, const tripoint &examp ) */ void iexamine::fault( player &, const tripoint & ) { - popup( _( "\ -This wall is perfectly vertical. Odd, twisted holes are set in it, leading\n\ -as far back into the solid rock as you can see. The holes are humanoid in\n\ -shape, but with long, twisted, distended limbs." ) ); + popup( _( "This wall is perfectly vertical. Odd, twisted holes are set in it, leading\n" + "as far back into the solid rock as you can see. The holes are humanoid in\n" + "shape, but with long, twisted, distended limbs." ) ); } /** @@ -1325,8 +1301,7 @@ void iexamine::pedestal_wyrm( player &p, const tripoint &examp ) return; } // Send in a few wyrms to start things off. - g->u.add_memorial_log( pgettext( "memorial_male", "Awoke a group of dark wyrms!" ), - pgettext( "memorial_female", "Awoke a group of dark wyrms!" ) ); + g->events().send(); int num_wyrms = rng( 1, 4 ); for( int i = 0; i < num_wyrms; i++ ) { int tries = 0; @@ -1367,8 +1342,8 @@ void iexamine::pedestal_temple( player &p, const tripoint &examp ) g->m.ter_set( examp, t_dirt ); g->timed_events.add( TIMED_EVENT_TEMPLE_OPEN, calendar::turn + 10_seconds ); } else { - add_msg( _( "This pedestal is engraved in eye-shaped diagrams, and has a \ -large semi-spherical indentation at the top." ) ); + add_msg( _( "This pedestal is engraved in eye-shaped diagrams, and has a " + "large semi-spherical indentation at the top." ) ); } } @@ -2575,9 +2550,10 @@ void iexamine::autoclave_full( player &, const tripoint &examp ) } g->m.furn_set( examp, next_autoclave_type ); - for( auto &it : items ) { - it.unset_flag( "NO_STERILE" ); - it.set_var( "sterile", 1 ); // sterile for 1s if not (packed) + for( item &it : items ) { + if( !it.has_flag( "NO_PACKED" ) ) { + it.unset_flag( "NO_STERILE" ); + } } add_msg( m_good, _( "The cycle is complete, the CBMs are now sterile." ) ); @@ -4074,8 +4050,7 @@ void iexamine::pay_gas( player &p, const tripoint &examp ) case HACK_UNABLE: break; case HACK_FAIL: - p.add_memorial_log( pgettext( "memorial_male", "Set off an alarm." ), - pgettext( "memorial_female", "Set off an alarm." ) ); + g->events().send( p.getID() ); sounds::sound( p.pos(), 60, sounds::sound_t::music, _( "an alarm sound!" ), true, "environment", "alarm" ); if( examp.z > 0 && !g->timed_events.queued( TIMED_EVENT_WANTED ) ) { @@ -4289,8 +4264,8 @@ static player &best_installer( player &p, player &null_player, int difficulty ) player &ally = *g->critter_by_id( e->getID() ); int ally_cos = bionic_manip_cos( ally_skills[ i ].first, true, difficulty ); if( e->has_effect( effect_sleep ) ) { - //~ %1$s is the name of the ally if( !g->u.query_yn( + //~ %1$s is the name of the ally _( "%1$s is asleep, but has a %2$d chance of success compared to your %3$d chance of success. Continue with a higher risk of failure?" ), ally.disp_name(), ally_cos, player_cos ) ) { return null_player; @@ -4930,7 +4905,7 @@ static void smoker_load_food( player &p, const tripoint &examp, comps.push_back( item_comp( what->typeId(), amount ) ); // select from where to get the items from and place them - inv.form_from_map( g->u.pos(), PICKUP_RANGE ); + inv.form_from_map( g->u.pos(), PICKUP_RANGE, &g->u ); inv.remove_items_with( []( const item & it ) { return it.rotten(); } ); @@ -5038,7 +5013,7 @@ static void mill_load_food( player &p, const tripoint &examp, comps.push_back( item_comp( what->typeId(), amount ) ); // select from where to get the items from and place them - inv.form_from_map( g->u.pos(), PICKUP_RANGE ); + inv.form_from_map( g->u.pos(), PICKUP_RANGE, &g->u ); inv.remove_items_with( []( const item & it ) { return it.rotten(); } ); @@ -5701,6 +5676,17 @@ iexamine_function iexamine_function_from_string( const std::string &function_nam return &iexamine::none; } +static int hack_level( const player &p ) +{ + ///\EFFECT_COMPUTER increases success chance of hacking card readers + int target = p.get_skill_level( skill_computer ); + // odds go up with int>8, down with int<8 + // 4 int stat is worth 1 computer skill here + ///\EFFECT_INT increases success chance of hacking card readers + target += static_cast( p.int_cur / 2 - 8 ); + return target; +} + hack_result iexamine::hack_attempt( player &p ) { if( p.has_trait( trait_ILLITERATE ) ) { @@ -5717,33 +5703,31 @@ hack_result iexamine::hack_attempt( player &p ) p.moves -= to_moves( 5_minutes ); p.practice( skill_computer, 20 ); - ///\EFFECT_COMPUTER increases success chance of hacking card readers - int player_computer_skill_level = p.get_skill_level( skill_computer ); - int success = rng( player_computer_skill_level / 4 - 2, player_computer_skill_level * 2 ); - success += rng( -3, 3 ); if( using_fingerhack ) { p.charge_power( -25 ); - success++; - } - if( using_electrohack ) { + } else { p.use_charges( "electrohack", 25 ); - success++; } - // odds go up with int>8, down with int<8 - // 4 int stat is worth 1 computer skill here - ///\EFFECT_INT increases success chance of hacking card readers - success += rng( 0, static_cast( ( p.int_cur - 8 ) / 2 ) ); - + // only skilled supergenius never cause short circuits, but the odds are low for people + // with moderate skills + const int hack_stddev = 5; + int success = std::ceil( normal_roll( hack_level( p ), hack_stddev ) ); if( success < 0 ) { add_msg( _( "You cause a short circuit!" ) ); + if( using_fingerhack ) { + p.charge_power( -25 ); + } else { + p.use_charges( "electrohack", 25 ); + } + if( success <= -5 ) { if( using_electrohack ) { add_msg( m_bad, _( "Your electrohack is ruined!" ) ); p.use_amount( "electrohack", 1 ); } else { add_msg( m_bad, _( "Your power is drained!" ) ); - p.charge_power( -rng( 0, p.power_level ) ); + p.charge_power( -rng( 25, p.power_level ) ); } } return HACK_FAIL; diff --git a/src/init.cpp b/src/init.cpp index cda20062c680c..5736edd91993e 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -194,6 +194,7 @@ void DynamicDataLoader::initialize() add( "profession", &profession::load_profession ); add( "profession_item_substitutions", &profession::load_item_substitutions ); add( "skill", &Skill::load_skill ); + add( "skill_display_type", &SkillDisplayType::load ); add( "dream", &dream::load ); add( "mutation_category", &mutation_category_trait::load ); add( "mutation_type", &load_mutation_type ); @@ -208,6 +209,7 @@ void DynamicDataLoader::initialize() add( "scenario", &scenario::load_scenario ); add( "start_location", &start_location::load_location ); add( "skill_boost", &skill_boost::load_boost ); + add( "enchantment", &enchantment::load_enchantment ); // json/colors.json would be listed here, but it's loaded before the others (see init_colors()) // Non Static Function Access diff --git a/src/input.cpp b/src/input.cpp index b9e98a330066b..17301d9204781 100644 --- a/src/input.cpp +++ b/src/input.cpp @@ -332,53 +332,58 @@ void input_manager::add_gamepad_keycode_pair( int ch, const std::string &name ) keyname_to_keycode[name] = ch; } +constexpr int char_key_beg = ' '; +constexpr int char_key_end = '~'; + void input_manager::init_keycode_mapping() { // Between space and tilde, all keys more or less map // to themselves(see ASCII table) - for( char c = ' '; c <= '~'; c++ ) { + for( char c = char_key_beg; c <= char_key_end; c++ ) { std::string name( 1, c ); add_keycode_pair( c, name ); } - add_keycode_pair( '\t', "TAB" ); - add_keycode_pair( KEY_BTAB, "BACKTAB" ); - add_keycode_pair( ' ', "SPACE" ); - add_keycode_pair( KEY_UP, "UP" ); - add_keycode_pair( KEY_DOWN, "DOWN" ); - add_keycode_pair( KEY_LEFT, "LEFT" ); - add_keycode_pair( KEY_RIGHT, "RIGHT" ); - add_keycode_pair( KEY_NPAGE, "NPAGE" ); - add_keycode_pair( KEY_PPAGE, "PPAGE" ); - add_keycode_pair( KEY_ESCAPE, "ESC" ); - add_keycode_pair( KEY_BACKSPACE, "BACKSPACE" ); - add_keycode_pair( KEY_HOME, "HOME" ); - add_keycode_pair( KEY_BREAK, "BREAK" ); - add_keycode_pair( KEY_END, "END" ); - add_keycode_pair( '\n', "RETURN" ); + add_keycode_pair( '\t', translate_marker_context( "key name", "TAB" ) ); + add_keycode_pair( KEY_BTAB, translate_marker_context( "key name", "BACKTAB" ) ); + add_keycode_pair( ' ', translate_marker_context( "key name", "SPACE" ) ); + add_keycode_pair( KEY_UP, translate_marker_context( "key name", "UP" ) ); + add_keycode_pair( KEY_DOWN, translate_marker_context( "key name", "DOWN" ) ); + add_keycode_pair( KEY_LEFT, translate_marker_context( "key name", "LEFT" ) ); + add_keycode_pair( KEY_RIGHT, translate_marker_context( "key name", "RIGHT" ) ); + add_keycode_pair( KEY_NPAGE, translate_marker_context( "key name", "NPAGE" ) ); + add_keycode_pair( KEY_PPAGE, translate_marker_context( "key name", "PPAGE" ) ); + add_keycode_pair( KEY_ESCAPE, translate_marker_context( "key name", "ESC" ) ); + add_keycode_pair( KEY_BACKSPACE, translate_marker_context( "key name", "BACKSPACE" ) ); + add_keycode_pair( KEY_HOME, translate_marker_context( "key name", "HOME" ) ); + add_keycode_pair( KEY_BREAK, translate_marker_context( "key name", "BREAK" ) ); + add_keycode_pair( KEY_END, translate_marker_context( "key name", "END" ) ); + add_keycode_pair( '\n', translate_marker_context( "key name", "RETURN" ) ); // function keys, as defined by ncurses - for( int i = 0; i <= 63; i++ ) { + for( int i = F_KEY_NUM_BEG; i <= F_KEY_NUM_END; i++ ) { + // not marked for translation here, but specially handled in get_keyname so + // it gets properly translated. add_keycode_pair( KEY_F( i ), string_format( "F%d", i ) ); } - add_gamepad_keycode_pair( JOY_LEFT, "JOY_LEFT" ); - add_gamepad_keycode_pair( JOY_RIGHT, "JOY_RIGHT" ); - add_gamepad_keycode_pair( JOY_UP, "JOY_UP" ); - add_gamepad_keycode_pair( JOY_DOWN, "JOY_DOWN" ); - add_gamepad_keycode_pair( JOY_LEFTUP, "JOY_LEFTUP" ); - add_gamepad_keycode_pair( JOY_LEFTDOWN, "JOY_LEFTDOWN" ); - add_gamepad_keycode_pair( JOY_RIGHTUP, "JOY_RIGHTUP" ); - add_gamepad_keycode_pair( JOY_RIGHTDOWN, "JOY_RIGHTDOWN" ); - - add_gamepad_keycode_pair( JOY_0, "JOY_0" ); - add_gamepad_keycode_pair( JOY_1, "JOY_1" ); - add_gamepad_keycode_pair( JOY_2, "JOY_2" ); - add_gamepad_keycode_pair( JOY_3, "JOY_3" ); - add_gamepad_keycode_pair( JOY_4, "JOY_4" ); - add_gamepad_keycode_pair( JOY_5, "JOY_5" ); - add_gamepad_keycode_pair( JOY_6, "JOY_6" ); - add_gamepad_keycode_pair( JOY_7, "JOY_7" ); + add_gamepad_keycode_pair( JOY_LEFT, translate_marker_context( "key name", "JOY_LEFT" ) ); + add_gamepad_keycode_pair( JOY_RIGHT, translate_marker_context( "key name", "JOY_RIGHT" ) ); + add_gamepad_keycode_pair( JOY_UP, translate_marker_context( "key name", "JOY_UP" ) ); + add_gamepad_keycode_pair( JOY_DOWN, translate_marker_context( "key name", "JOY_DOWN" ) ); + add_gamepad_keycode_pair( JOY_LEFTUP, translate_marker_context( "key name", "JOY_LEFTUP" ) ); + add_gamepad_keycode_pair( JOY_LEFTDOWN, translate_marker_context( "key name", "JOY_LEFTDOWN" ) ); + add_gamepad_keycode_pair( JOY_RIGHTUP, translate_marker_context( "key name", "JOY_RIGHTUP" ) ); + add_gamepad_keycode_pair( JOY_RIGHTDOWN, translate_marker_context( "key name", "JOY_RIGHTDOWN" ) ); + + add_gamepad_keycode_pair( JOY_0, translate_marker_context( "key name", "JOY_0" ) ); + add_gamepad_keycode_pair( JOY_1, translate_marker_context( "key name", "JOY_1" ) ); + add_gamepad_keycode_pair( JOY_2, translate_marker_context( "key name", "JOY_2" ) ); + add_gamepad_keycode_pair( JOY_3, translate_marker_context( "key name", "JOY_3" ) ); + add_gamepad_keycode_pair( JOY_4, translate_marker_context( "key name", "JOY_4" ) ); + add_gamepad_keycode_pair( JOY_5, translate_marker_context( "key name", "JOY_5" ) ); + add_gamepad_keycode_pair( JOY_6, translate_marker_context( "key name", "JOY_6" ) ); + add_gamepad_keycode_pair( JOY_7, translate_marker_context( "key name", "JOY_7" ) ); keyname_to_keycode["MOUSE_LEFT"] = MOUSE_BUTTON_LEFT; keyname_to_keycode["MOUSE_RIGHT"] = MOUSE_BUTTON_RIGHT; @@ -402,35 +407,51 @@ int input_manager::get_keycode( const std::string &name ) const std::string input_manager::get_keyname( int ch, input_event_t inp_type, bool portable ) const { + cata::optional raw; if( inp_type == CATA_INPUT_KEYBOARD ) { const t_key_to_name_map::const_iterator a = keycode_to_keyname.find( ch ); if( a != keycode_to_keyname.end() ) { - return a->second; + if( IS_F_KEY( ch ) ) { + // special case it since F key names are generated using loop + // and not marked individually for translation + if( portable ) { + return a->second; + } else { + return string_format( pgettext( "function key name", "F%d" ), F_KEY_NUM( ch ) ); + } + } else if( ch >= char_key_beg && ch <= char_key_end && ch != ' ' ) { + // character keys except space need no translation + return a->second; + } + raw = a->second; } } else if( inp_type == CATA_INPUT_MOUSE ) { if( ch == MOUSE_BUTTON_LEFT ) { - return "MOUSE_LEFT"; + raw = translate_marker_context( "key name", "MOUSE_LEFT" ); } else if( ch == MOUSE_BUTTON_RIGHT ) { - return "MOUSE_RIGHT"; + raw = translate_marker_context( "key name", "MOUSE_RIGHT" ); } else if( ch == SCROLLWHEEL_UP ) { - return "SCROLL_UP"; + raw = translate_marker_context( "key name", "SCROLL_UP" ); } else if( ch == SCROLLWHEEL_DOWN ) { - return "SCROLL_DOWN"; + raw = translate_marker_context( "key name", "SCROLL_DOWN" ); } else if( ch == MOUSE_MOVE ) { - return "MOUSE_MOVE"; + raw = translate_marker_context( "key name", "MOUSE_MOVE" ); } } else if( inp_type == CATA_INPUT_GAMEPAD ) { const t_key_to_name_map::const_iterator a = gamepad_keycode_to_keyname.find( ch ); if( a != gamepad_keycode_to_keyname.end() ) { - return a->second; + raw = a->second; } } else { - return "UNKNOWN"; + raw = translate_marker_context( "key name", "UNKNOWN" ); } - if( portable ) { - return std::string( "UNKNOWN_" ) + int_to_str( ch ); + if( !raw ) { + if( portable ) { + return std::string( "UNKNOWN_" ) + int_to_str( ch ); + } + return string_format( _( "unknown key %ld" ), ch ); } - return string_format( _( "unknown key %ld" ), ch ); + return portable ? *raw : pgettext( "key name", raw->c_str() ); } const std::vector &input_manager::get_input_for_action( const std::string @@ -769,8 +790,9 @@ std::string input_context::get_desc( const std::string &action_descriptor, const std::function evt_filter ) const { if( action_descriptor == "ANY_INPUT" ) { + // \u00A0 is the non-breaking space //~ keybinding description for anykey - return string_format( pgettext( "keybinding", "[any] %s" ), text ); + return string_format( pgettext( "keybinding", "[any]\u00A0%s" ), text ); } const auto &events = inp_mngr.get_input_for_action( action_descriptor, category ); @@ -795,14 +817,20 @@ std::string input_context::get_desc( const std::string &action_descriptor, if( na ) { //~ keybinding description for unbound or disabled keys - return string_format( pgettext( "keybinding", "[n/a] %s" ), text ); + return string_format( pgettext( "keybinding", "[n/a]\u00A0%s" ), text ); } else { //~ keybinding description for bound keys - return string_format( pgettext( "keybinding", "[%s] %s" ), + return string_format( pgettext( "keybinding", "[%s]\u00A0%s" ), get_desc( action_descriptor, 1, evt_filter ), text ); } } +std::string input_context::describe_key_and_name( const std::string &action_descriptor, + const std::function evt_filter ) const +{ + return get_desc( action_descriptor, get_action_name( action_descriptor ), evt_filter ); +} + const std::string &input_context::handle_input() { return handle_input( timeout ); diff --git a/src/input.h b/src/input.h index 91d871b9a12b3..35af30fea23e2 100644 --- a/src/input.h +++ b/src/input.h @@ -39,9 +39,20 @@ static constexpr int KEY_HOME = static constexpr int KEY_BACKSPACE = 0x107; /* Backspace */ //<---------not used static constexpr int KEY_DC = 0x151; /* Delete Character */ +static constexpr int KEY_F0 = 0x108; inline constexpr int KEY_F( const int n ) { - return 0x108 + n; /* F1, F2, etc*/ + return KEY_F0 + n; /* F1, F2, etc*/ +} +static constexpr int F_KEY_NUM_BEG = 0; +static constexpr int F_KEY_NUM_END = 63; +inline constexpr int F_KEY_NUM( const int key ) +{ + return key - KEY_F0; +} +inline constexpr bool IS_F_KEY( const int key ) +{ + return key >= KEY_F( F_KEY_NUM_BEG ) && key <= KEY_F( F_KEY_NUM_END ); } inline constexpr int KEY_NUM( const int n ) { @@ -562,6 +573,15 @@ class input_context return true; } ) const; + /** + * Equivalent to get_desc( act, get_action_name( act ), filter ) + **/ + std::string describe_key_and_name( const std::string &action_descriptor, + std::function evt_filter = + []( const input_event & ) { + return true; + } ) const; + /** * Handles input and returns the next action in the queue. * diff --git a/src/int_id.h b/src/int_id.h index 1f9cefa8a6aa5..9525465f1f1d9 100644 --- a/src/int_id.h +++ b/src/int_id.h @@ -28,6 +28,14 @@ class int_id explicit int_id( const int id ) : _id( id ) { } + + /** + * Prevent accidental construction from other int ids due to the non-explicit `operator int()`. + */ + template < typename S, typename std::enable_if_t < !std::is_same::value, int > = 0 > + int_id( const int_id &id ) = delete; + + /** * Default constructor constructs a 0-id. No id value is special to this class, 0 as id * is just as normal as any other integer value. @@ -79,6 +87,7 @@ class int_id } /** * Conversion to int as with the @ref to_i function. + * It is non-explicit to allow using int_id implicitly as indices etc */ operator int() const { return _id; diff --git a/src/inventory.cpp b/src/inventory.cpp index 96bc1da210dcf..2bc2e96823699 100644 --- a/src/inventory.cpp +++ b/src/inventory.cpp @@ -391,13 +391,15 @@ static int count_charges_in_list( const itype *type, const map_stack &items ) return 0; } -void inventory::form_from_map( const tripoint &origin, int range, bool assign_invlet, +void inventory::form_from_map( const tripoint &origin, int range, const player *pl, + bool assign_invlet, bool clear_path ) { - form_from_map( g->m, origin, range, assign_invlet, clear_path ); + form_from_map( g->m, origin, range, pl, assign_invlet, clear_path ); } -void inventory::form_from_map( map &m, const tripoint &origin, int range, bool assign_invlet, +void inventory::form_from_map( map &m, const tripoint &origin, int range, const player *pl, + bool assign_invlet, bool clear_path ) { // populate a grid of spots that can be reached @@ -428,6 +430,11 @@ void inventory::form_from_map( map &m, const tripoint &origin, int range, bool a } if( m.accessible_items( p ) ) { for( auto &i : m.i_at( p ) ) { + // if its *the* player requesting this from from map inventory + // then dont allow items owned by another faction to be factored into recipe components etc. + if( pl && i.has_owner() && i.get_owner() != pl->get_faction() ) { + continue; + } if( !i.made_of( LIQUID ) ) { add_item( i, false, assign_invlet ); } diff --git a/src/inventory.h b/src/inventory.h index f0a42c840ff8e..63a870952f956 100644 --- a/src/inventory.h +++ b/src/inventory.h @@ -124,11 +124,12 @@ class inventory : public visitable * the player's worn items / weapon */ void restack( player &p ); - void form_from_map( const tripoint &origin, int range, bool assign_invlet = true, + void form_from_map( const tripoint &origin, int range, const player *pl = nullptr, + bool assign_invlet = true, bool clear_path = true ); - void form_from_map( map &m, const tripoint &origin, int range, bool assign_invlet = true, + void form_from_map( map &m, const tripoint &origin, int range, const player *pl = nullptr, + bool assign_invlet = true, bool clear_path = true ); - /** * Remove a specific item from the inventory. The item is compared * by pointer. Contents of the item are removed as well. diff --git a/src/inventory_ui.cpp b/src/inventory_ui.cpp index ca19e6b78f3c9..7c388901fe78a 100644 --- a/src/inventory_ui.cpp +++ b/src/inventory_ui.cpp @@ -66,7 +66,7 @@ static const std::set ordered_categories = {{ "ITEMS_WORN" }}; struct navigation_mode_data { navigation_mode next_mode; - std::string name; + translation name; nc_color color; }; @@ -99,8 +99,8 @@ class selection_column_preset : public inventory_selector_preset if( item->is_money() ) { assert( available_count == entry.get_stack_size() ); if( entry.chosen_count > 0 && entry.chosen_count < available_count ) { - //~ In the following string, the %s is the amount of money on the selected cards as passed by the display money function, out of the total amount of money on the cards, which is specified by the format_money function") res << string_format( + //~ In the following string, the %s is the amount of money on the selected cards as passed by the display money function, out of the total amount of money on the cards, which is specified by the format_money function") _( "%s of %s" ), item->display_money( available_count, entry.get_selected_charges() ), format_money( entry.get_total_charges() ) ); @@ -1000,14 +1000,14 @@ void selection_column::on_change( const inventory_entry &entry ) } add_entry( my_entry ); last_changed = my_entry; - } else { + } else if( iter->chosen_count != my_entry.chosen_count ) { if( my_entry.chosen_count > 0 ) { iter->chosen_count = my_entry.chosen_count; expand_to_fit( my_entry ); } else { iter = entries.erase( iter ); - paging_is_valid = false; } + paging_is_valid = false; if( iter != entries.end() ) { last_changed = *iter; @@ -1149,8 +1149,9 @@ void inventory_selector::add_items( inventory_column &target_column, void inventory_selector::add_character_items( Character &character ) { - static const item_category items_worn_category( "ITEMS_WORN", translation( "ITEMS WORN" ), -100 ); - static const item_category weapon_held_category( "WEAPON_HELD", translation( "WEAPON HELD" ), + static const item_category items_worn_category( "ITEMS_WORN", to_translation( "ITEMS WORN" ), + -100 ); + static const item_category weapon_held_category( "WEAPON_HELD", to_translation( "WEAPON HELD" ), -200 ); character.visit_items( [ this, &character ]( item * it ) { if( it == &character.weapon ) { @@ -1580,7 +1581,7 @@ void inventory_selector::draw_frame( const catacurses::window &w ) const std::pair inventory_selector::get_footer( navigation_mode m ) const { if( has_available_choices() ) { - return std::make_pair( get_navigation_data( m ).name, + return std::make_pair( get_navigation_data( m ).name.translated(), get_navigation_data( m ).color ); } return std::make_pair( _( "There are no available choices" ), i_red ); @@ -1801,8 +1802,8 @@ void inventory_selector::append_column( inventory_column &column ) const navigation_mode_data &inventory_selector::get_navigation_data( navigation_mode m ) const { static const std::map mode_data = { - { navigation_mode::ITEM, { navigation_mode::CATEGORY, std::string(), c_light_gray } }, - { navigation_mode::CATEGORY, { navigation_mode::ITEM, _( "Category selection mode" ), h_white } } + { navigation_mode::ITEM, { navigation_mode::CATEGORY, translation(), c_light_gray } }, + { navigation_mode::CATEGORY, { navigation_mode::ITEM, to_translation( "Category selection mode" ), h_white } } }; return mode_data.at( m ); diff --git a/src/item.cpp b/src/item.cpp index cacb671d0fc43..6a8a822bd63d8 100644 --- a/src/item.cpp +++ b/src/item.cpp @@ -122,27 +122,27 @@ const trait_id trait_huge( "HUGE" ); const trait_id trait_huge_ok( "HUGE_OK" ); using npc_class_id = string_id; -const std::string &rad_badge_color( const int rad ) +std::string rad_badge_color( const int rad ) { - using pair_t = std::pair; + using pair_t = std::pair; static const std::array values = {{ - pair_t { 0, _( "green" ) }, - pair_t { 30, _( "blue" ) }, - pair_t { 60, _( "yellow" )}, - pair_t {120, pgettext( "color", "orange" )}, - pair_t {240, _( "red" ) }, - pair_t {500, _( "black" ) }, + pair_t { 0, to_translation( "color", "green" ) }, + pair_t { 30, to_translation( "color", "blue" ) }, + pair_t { 60, to_translation( "color", "yellow" )}, + pair_t {120, to_translation( "color", "orange" )}, + pair_t {240, to_translation( "color", "red" ) }, + pair_t {500, to_translation( "color", "black" ) }, } }; - for( const std::pair &i : values ) { + for( const auto &i : values ) { if( rad <= i.first ) { - return i.second; + return i.second.translated(); } } - return values.back().second; + return values.back().second.translated(); } light_emission nolight = {0, 0, 0}; @@ -195,7 +195,7 @@ item::item() : bday( calendar::start_of_cataclysm ) item::item( const itype *type, time_point turn, int qty ) : type( type ), bday( turn ) { - corpse = typeId() == "corpse" ? &mtype_id::NULL_ID().obj() : nullptr; + corpse = has_flag( "CORPSE" ) ? &mtype_id::NULL_ID().obj() : nullptr; item_counter = type->countdown_interval; if( qty >= 0 ) { @@ -249,6 +249,8 @@ item::item( const itype *type, time_point turn, int qty ) : type( type ), bday( if( current_phase == PNULL ) { current_phase = type->phase; } + // item always has any relic properties from itype. + relic_data = type->relic_data; } item::item( const itype_id &id, time_point turn, int qty ) @@ -323,7 +325,13 @@ item item::make_corpse( const mtype_id &mt, time_point turn, const std::string & debugmsg( "tried to make a corpse with an invalid mtype id" ); } - item result( "corpse", turn ); + std::string corpse_type = "corpse"; + + if( mt == mtype_id::NULL_ID() ) { + corpse_type = item_group::item_from( "corpses" ).typeId(); + } + + item result( corpse_type, turn ); result.corpse = &mt.obj(); if( result.corpse->has_flag( MF_REVIVES ) && one_in( 20 ) ) { @@ -804,6 +812,14 @@ void item::set_var( const std::string &name, const int value ) item_vars[name] = tmpstream.str(); } +void item::set_var( const std::string &name, const long long value ) +{ + std::ostringstream tmpstream; + tmpstream.imbue( std::locale::classic() ); + tmpstream << value; + item_vars[name] = tmpstream.str(); +} + // NOLINTNEXTLINE(cata-no-long) void item::set_var( const std::string &name, const long value ) { @@ -1181,6 +1197,22 @@ std::string item::info( std::vector &info, const iteminfo_query *parts if( g != nullptr ) { info.push_back( iteminfo( "BASE", _( "age (hours): " ), "", iteminfo::lower_is_better, to_hours( age() ) ) ); + info.push_back( iteminfo( "BASE", _( "charges: " ), "", iteminfo::lower_is_better, + charges ) ); + info.push_back( iteminfo( "BASE", _( "damage: " ), "", iteminfo::lower_is_better, + damage_ ) ); + info.push_back( iteminfo( "BASE", _( "active: " ), "", iteminfo::lower_is_better, + active ) ); + info.push_back( iteminfo( "BASE", _( "burn: " ), "", iteminfo::lower_is_better, + burnt ) ); + std::ostringstream stream; + std::copy( item_tags.begin(), item_tags.end(), std::ostream_iterator( stream, "," ) ); + std::string tags_listed = stream.str(); + info.push_back( iteminfo( "BASE", string_format( _( "tags: %s" ), tags_listed ) ) ); + for( auto const &imap : item_vars ) { + info.push_back( iteminfo( "BASE", string_format( _( "item var: %s, %s" ), imap.first, + imap.second ) ) ); + } const item *food = is_food_container() ? &contents.front() : this; if( food->goes_bad() ) { @@ -1190,15 +1222,15 @@ std::string item::info( std::vector &info, const iteminfo_query *parts info.push_back( iteminfo( "BASE", _( "rot (turns): " ), "", iteminfo::lower_is_better, to_turns( food->rot ) ) ); + info.push_back( iteminfo( "BASE", space + _( "max rot (turns): " ), + "", iteminfo::lower_is_better, + to_turns( food->get_shelf_life() ) ) ); info.push_back( iteminfo( "BASE", _( "last rot: " ), "", iteminfo::lower_is_better, to_turn( food->last_rot_check ) ) ); info.push_back( iteminfo( "BASE", _( "last temp: " ), "", iteminfo::lower_is_better, to_turn( food->last_temp_check ) ) ); - info.push_back( iteminfo( "BASE", space + _( "max rot (turns): " ), - "", iteminfo::lower_is_better, - to_turns( food->get_shelf_life() ) ) ); } if( food->has_temperature() ) { info.push_back( iteminfo( "BASE", _( "Temp: " ), "", iteminfo::lower_is_better, @@ -1215,8 +1247,6 @@ std::string item::info( std::vector &info, const iteminfo_query *parts food->get_freeze_point() ) ); } } - info.push_back( iteminfo( "BASE", _( "burn: " ), "", iteminfo::lower_is_better, - burnt ) ); } } @@ -2433,7 +2463,7 @@ std::string item::info( std::vector &info, const iteminfo_query *parts const std::vector &styles = g->u.ma_styles; const std::string valid_styles = enumerate_as_string( styles.begin(), styles.end(), [this]( const matype_id & mid ) { - return mid.obj().has_weapon( typeId() ) ? _( mid.obj().name ) : std::string(); + return mid.obj().has_weapon( typeId() ) ? mid.obj().name.translated() : std::string(); } ); if( !valid_styles.empty() ) { insert_separation_line(); @@ -2997,7 +3027,8 @@ nc_color item::color_in_inventory() const nc_color ret = is_favorite ? c_white : c_light_gray; if( type->can_use( "learn_spell" ) ) { const use_function *iuse = get_use( "learn_spell" ); - const learn_spell_actor *actor_ptr = static_cast( iuse->get_actor_ptr() ); + const learn_spell_actor *actor_ptr = + static_cast( iuse->get_actor_ptr() ); for( const std::string spell_id_str : actor_ptr->spells ) { const spell_id sp_id( spell_id_str ); if( u.magic.knows_spell( sp_id ) && !u.magic.get_spell( sp_id ).is_max_level() ) { @@ -3017,7 +3048,7 @@ nc_color item::color_in_inventory() const } else if( is_filthy() || item_tags.count( "DIRTY" ) ) { ret = c_brown; } else if( is_bionic() && !has_flag( "NO_STERILE" ) ) { - if( !has_flag( "NO_PACKED" ) || has_flag( "PACKED_FAULTY" ) ) { + if( !has_flag( "NO_PACKED" ) ) { ret = c_dark_gray; } else { ret = c_cyan; @@ -3251,18 +3282,12 @@ void item::on_wield( player &p, int mv ) } // Update encumbrance in case we were wearing it - p.reset_encumbrance(); + p.flag_encumbrance(); } void item::handle_pickup_ownership( Character &c ) { - faction *yours; - if( &c == &g->u ) { - yours = g->faction_manager_ptr->get( faction_id( "your_followers" ) ); - } else { - npc *guy = dynamic_cast( &c ); - yours = guy->my_fac; - } + faction *yours = c.get_faction(); // Add ownership to item if unowned if( !has_owner() ) { set_owner( yours ); @@ -3270,8 +3295,9 @@ void item::handle_pickup_ownership( Character &c ) if( get_owner() != yours && &c == &g->u ) { std::vector witnesses; for( npc &elem : g->all_npcs() ) { - if( rl_dist( elem.pos(), g->u.pos() ) < MAX_VIEW_DISTANCE && elem.my_fac == get_owner() && - elem.sees( g->u.pos() ) ) { + if( rl_dist( elem.pos(), g->u.pos() ) < MAX_VIEW_DISTANCE && elem.get_faction() && + elem.get_faction()->id != faction_id( "no_faction" ) && + elem.get_faction() == get_owner() && elem.sees( g->u.pos() ) ) { elem.say( "", 7 ); npc *npc_to_add = &elem; witnesses.push_back( npc_to_add ); @@ -3318,6 +3344,8 @@ void item::on_pickup( Character &p ) contents.clear(); } + + p.flag_encumbrance(); } void item::on_contents_changed() @@ -3478,17 +3506,13 @@ std::string item::tname( unsigned int quantity, bool with_prefix, unsigned int t if( is_filthy() ) { ret << _( " (filthy)" ); } - if( is_bionic() && ( !has_flag( "NO_PACKED" ) || has_flag( "PACKED_FAULTY" ) ) ) { + if( is_bionic() && !has_flag( "NO_PACKED" ) ) { if( !has_flag( "NO_STERILE" ) ) { ret << _( " (sterile)" ); } else { ret << _( " (packed)" ); } } - if( is_bionic() && !has_flag( "NO_STERILE" ) && !( !has_flag( "NO_PACKED" ) || - has_flag( "PACKED_FAULTY" ) ) ) { - ret << _( " (sterile)" ); - } if( is_tool() && has_flag( "USE_UPS" ) ) { ret << _( " (UPS)" ); @@ -3520,6 +3544,8 @@ std::string item::tname( unsigned int quantity, bool with_prefix, unsigned int t } if( active && ( has_flag( "WATER_EXTINGUISH" ) || has_flag( "LITCIG" ) ) ) { ret << _( " (lit)" ); + } else if( has_flag( "IS_UPS" ) && get_var( "cable" ) == "plugged_in" ) { + ret << _( " (plugged in)" ); } else if( active && !is_food() && !is_corpse() && ( typeId().length() < 3 || typeId().compare( typeId().length() - 3, 3, "_on" ) != 0 ) ) { // Usually the items whose ids end in "_on" have the "active" or "on" string already contained @@ -3562,7 +3588,8 @@ std::string item::tname( unsigned int quantity, bool with_prefix, unsigned int t std::string item::display_money( unsigned int quantity, unsigned int amount ) const { //~ This is a string to display the total amount of money in a stack of cash cards. The strings are: %s is the display name of cash cards. The following bracketed $%.2f is the amount of money on the stack of cards in dollars, to two decimal points. (e.g. "cash cards ($15.35)") - return string_format( "%s %s", tname( quantity ), format_money( amount ) ); + return string_format( pgettext( "cash card and total money", "%s %s" ), tname( quantity ), + format_money( amount ) ); } std::string item::display_name( unsigned int quantity ) const @@ -3911,7 +3938,8 @@ units::volume item::volume( bool integral ) const int item::lift_strength() const { - return std::max( weight() / 10000_gram, 1 ); + const int mass = units::to_gram( weight() ); + return std::max( mass / 10000, 1 ); } int item::attack_time() const @@ -4275,10 +4303,10 @@ static int calc_hourly_rotpoints_at_temp( const int temp ) // default temp = 65, so generic->rotten() assumes 600 decay points per hour const int dropoff = 38; // ditch our fancy equation and do a linear approach to 0 rot at 31f const int cutoff = 105; // stop torturing the player at this temperature, which is - const int cutoffrot = 3540; // ..almost 6 times the base rate. bacteria hate the heat too + const int cutoffrot = 21240; // ..almost 6 times the base rate. bacteria hate the heat too const int dsteps = dropoff - temperatures::freezing; - const int dstep = ( 35.91 * std::pow( 2.0, static_cast( dropoff ) / 16.0 ) / dsteps ); + const int dstep = ( 215.46 * std::pow( 2.0, static_cast( dropoff ) / 16.0 ) / dsteps ); if( temp < temperatures::freezing ) { return 0; @@ -4287,7 +4315,7 @@ static int calc_hourly_rotpoints_at_temp( const int temp ) } else if( temp < dropoff ) { return ( temp - temperatures::freezing ) * dstep; } else { - return lround( 35.91 * std::pow( 2.0, static_cast( temp ) / 16.0 ) ); + return lround( 215.46 * std::pow( 2.0, static_cast( temp ) / 16.0 ) ); } } @@ -4320,7 +4348,7 @@ int get_hourly_rotpoints_at_temp( const int temp ) return 0; } if( temp > 150 ) { - return 3540; + return 21240; } return rot_chart[temp]; } @@ -4444,10 +4472,31 @@ bool item::is_power_armor() const int item::get_encumber( const Character &p ) const { + units::volume contents_volume( 0_ml ); + for( const item &e : contents ) { contents_volume += e.volume(); } + + if( p.is_worn( *this ) ) { + const islot_armor *t = find_armor_data(); + + if( t != nullptr && t->max_encumber != 0 ) { + units::volume char_storage( 0_ml ); + + for( const item &e : p.worn ) { + char_storage += e.get_storage(); + } + + if( char_storage != 0_ml ) { + // Cast up to 64 to prevent overflow. Dividing before would prevent this but lose data. + contents_volume += units::from_milliliter( static_cast( t->storage.value() ) * + p.inv.volume().value() / char_storage.value() ); + } + } + } + return get_encumber_when_containing( p, contents_volume ); } @@ -4463,9 +4512,23 @@ int item::get_encumber_when_containing( // Non-rigid items add additional encumbrance proportional to their volume if( !type->rigid ) { - encumber += contents_volume / 250_ml; + const int capacity = get_total_capacity().value(); + + if( t->max_encumber != 0 ) { + + if( capacity > 0 ) { + // Cast up to 64 to prevent overflow. Dividing before would prevent this but lose data. + encumber += static_cast( t->max_encumber - t->encumber ) * contents_volume.value() / + capacity; + } else { + debugmsg( "Non-rigid item (%s) without storage capacity.", tname() ); + } + } else { + encumber += contents_volume / 250_ml; + } } + // Fit checked before changes, fitting shouldn't reduce penalties from patching. if( has_flag( "FIT" ) && has_flag( "VARSIZE" ) ) { encumber = std::max( encumber / 2, encumber - 10 ); @@ -4920,7 +4983,7 @@ std::string item::durability_indicator( bool include_intact ) const } else { outputstring = pgettext( "damage adjective", "reinforced " ); } - } else if( typeId() == "corpse" ) { + } else if( has_flag( "CORPSE" ) ) { if( damage() > 0 ) { switch( damage_level( 4 ) ) { case 1: @@ -5225,7 +5288,7 @@ bool item::is_med_container() const bool item::is_corpse() const { - return corpse != nullptr && typeId() == "corpse"; + return corpse != nullptr && has_flag( "CORPSE" ); } const mtype *item::get_mtype() const @@ -5557,6 +5620,19 @@ bool item::is_artifact() const return type->artifact.has_value(); } +bool item::is_relic() const +{ + return relic_data.has_value(); +} + +std::vector item::get_enchantments() const +{ + if( !is_relic() ) { + return std::vector {}; + } + return relic_data->get_enchantments(); +} + bool item::can_contain( const item &it ) const { // TODO: Volume check @@ -6939,7 +7015,7 @@ units::volume item::get_container_capacity() const units::volume item::get_total_capacity() const { - units::volume result = get_container_capacity(); + units::volume result = get_storage() + get_container_capacity(); // Consider various iuse_actors which add containing capability // Treating these two as special cases for now; if more appear in the @@ -7537,7 +7613,6 @@ std::string item::components_to_string() const bool item::needs_processing() const { return active || has_flag( "RADIO_ACTIVATION" ) || has_flag( "ETHEREAL_ITEM" ) || - ( is_bionic() && !has_flag( "NO_STERILE" ) ) || ( is_container() && !contents.empty() && contents.front().needs_processing() ) || is_artifact() || is_food(); } @@ -7937,7 +8012,7 @@ void item::reset_temp_check() void item::process_artifact( player *carrier, const tripoint & /*pos*/ ) { - if( !is_artifact() ) { + if( !is_artifact() && !is_relic() ) { return; } // Artifacts are currently only useful for the player character, the messages @@ -7968,10 +8043,6 @@ bool item::process_corpse( player *carrier, const tripoint &pos ) } } } else { - //~ %s is corpse name - carrier->add_memorial_log( pgettext( "memorial_male", "Had a %s revive while carrying it." ), - pgettext( "memorial_female", "Had a %s revive while carrying it." ), - tname() ); if( corpse->in_species( ROBOT ) ) { carrier->add_msg_if_player( m_warning, _( "Oh dear god, a robot you're carrying has started moving!" ) ); @@ -8028,12 +8099,6 @@ bool item::process_litcig( player *carrier, const tripoint &pos ) if( !active ) { return false; } - field_type_id smoke_type; - if( has_flag( "TOBACCO" ) ) { - smoke_type = fd_cigsmoke; - } else { - smoke_type = fd_weedsmoke; - } // if carried by someone: if( carrier != nullptr ) { time_duration duration = 15_seconds; @@ -8066,9 +8131,7 @@ bool item::process_litcig( player *carrier, const tripoint &pos ) } } else { // If not carried by someone, but laying on the ground: - // release some smoke every five ticks if( item_counter % 5 == 0 ) { - g->m.add_field( pos + point( rng( -2, 2 ), rng( -2, 2 ) ), smoke_type, 1 ); // lit cigarette can start fires if( g->m.flammable_items_at( pos ) || g->m.has_flag( "FLAMMABLE", pos ) || @@ -8201,18 +8264,46 @@ cata::optional item::get_cable_target( player *p, const tripoint &pos return g->m.getlocal( source ); } -bool item::process_cable( player *p, const tripoint &pos ) +bool item::process_cable( player *carrier, const tripoint &pos ) { - const cata::optional source = get_cable_target( p, pos ); + if( carrier == nullptr ) { + reset_cable( carrier ); + return false; + } + std::string state = get_var( "state" ); + if( state == "solar_pack_link" || state == "solar_pack" ) { + if( !carrier->has_item( *this ) || ( !carrier->is_wearing( "solarpack_on" ) || + !carrier->is_wearing( "q_solarpack_on" ) ) ) { + carrier->add_msg_if_player( m_bad, _( "You notice the cable has come loose!" ) ); + reset_cable( carrier ); + return false; + } + } + + static const item_filter used_ups = [&]( const item & itm ) { + return itm.get_var( "cable" ) == "plugged_in"; + }; + + if( state == "UPS" ) { + if( !carrier->has_item( *this ) || !carrier->has_item_with( used_ups ) ) { + carrier->add_msg_if_player( m_bad, _( "You notice the cable has come loose!" ) ); + for( item *used : carrier->items_with( used_ups ) ) { + used->erase_var( "cable" ); + } + reset_cable( carrier ); + return false; + } + } + const cata::optional source = get_cable_target( carrier, pos ); if( !source ) { return false; } if( !g->m.veh_at( *source ) || ( source->z != g->get_levz() && !g->m.has_zlevels() ) ) { - if( p != nullptr && p->has_item( *this ) ) { - p->add_msg_if_player( m_bad, _( "You notice the cable has come loose!" ) ); + if( carrier != nullptr && carrier->has_item( *this ) ) { + carrier->add_msg_if_player( m_bad, _( "You notice the cable has come loose!" ) ); } - reset_cable( p ); + reset_cable( carrier ); return false; } @@ -8221,10 +8312,10 @@ bool item::process_cable( player *p, const tripoint &pos ) charges = max_charges - distance; if( charges < 1 ) { - if( p != nullptr && p->has_item( *this ) ) { - p->add_msg_if_player( m_bad, _( "The over-extended cable breaks loose!" ) ); + if( carrier != nullptr && carrier->has_item( *this ) ) { + carrier->add_msg_if_player( m_bad, _( "The over-extended cable breaks loose!" ) ); } - reset_cable( p ); + reset_cable( carrier ); } return false; @@ -8247,6 +8338,24 @@ void item::reset_cable( player *p ) } } +bool item::process_UPS( player *carrier, const tripoint & /*pos*/ ) +{ + if( carrier == nullptr ) { + erase_var( "cable" ); + active = false; + return false; + } + bool has_connected_cable = carrier->has_item_with( []( const item & it ) { + return it.active && it.has_flag( "CABLE_SPOOL" ) && ( it.get_var( "state" ) == "UPS_link" || + it.get_var( "state" ) == "UPS" ); + } ); + if( !has_connected_cable ) { + erase_var( "cable" ); + active = false; + } + return false; +} + bool item::process_wet( player * /*carrier*/, const tripoint & /*pos*/ ) { if( item_counter == 0 ) { @@ -8341,21 +8450,6 @@ bool item::process( player *carrier, const tripoint &pos, bool activate, return processed; } - if( is_bionic() && !has_flag( "NO_STERILE" ) && ( has_flag( "NO_PACKED" ) || - has_flag( "PACKED_FAULTY" ) ) ) { - if( !has_var( "sterile" ) ) { - set_flag( "NO_STERILE" ); - return false; - } - set_var( "sterile", std::stoi( get_var( "sterile" ) ) - 1 ); - const bool sterile_no_more = std::stoi( get_var( "sterile" ) ) <= 0; - if( sterile_no_more ) { - set_flag( "NO_STERILE" ); - erase_var( "sterile" ); - } - return false; - } - if( faults.count( fault_gun_blackpowder ) ) { return process_blackpowder_fouling( carrier ); } @@ -8415,6 +8509,10 @@ bool item::process( player *carrier, const tripoint &pos, bool activate, // DO NOT process this as a tool! It really isn't! return process_cable( carrier, pos ); } + if( has_flag( "IS_UPS" ) ) { + // DO NOT process this as a tool! It really isn't! + return process_UPS( carrier, pos ); + } if( is_tool() ) { return process_tool( carrier, pos ); } @@ -8559,7 +8657,7 @@ std::string item::type_name( unsigned int quantity ) const bool f_dressed = has_flag( "FIELD_DRESS" ) || has_flag( "FIELD_DRESS_FAILED" ); bool quartered = has_flag( "QUARTERED" ); bool skinned = has_flag( "SKINNED" ); - if( corpse != nullptr && typeId() == "corpse" ) { + if( corpse != nullptr && has_flag( "CORPSE" ) ) { if( corpse_name.empty() ) { if( skinned && !f_dressed && !quartered ) { return string_format( npgettext( "item name", "skinned %s corpse", "skinned %s corpses", quantity ), @@ -8711,6 +8809,8 @@ bool item::on_drop( const tripoint &pos, map &m ) !item_tags.count( "DIRTY" ) ) { item_tags.insert( "DIRTY" ); } + + g->u.flag_encumbrance(); return type->drop_action && type->drop_action.call( g->u, *this, false, pos ); } diff --git a/src/item.h b/src/item.h index e752898dbd47b..0cc8b0d91cdee 100644 --- a/src/item.h +++ b/src/item.h @@ -22,6 +22,7 @@ #include "flat_set.h" #include "io_tags.h" #include "item_location.h" +#include "relic.h" #include "requirements.h" #include "safe_reference.h" #include "string_id.h" @@ -76,7 +77,7 @@ class map; enum damage_type : int; enum clothing_mod_type : int; -const std::string &rad_badge_color( int rad ); +std::string rad_badge_color( int rad ); struct light_emission { unsigned short luminance; @@ -1069,6 +1070,7 @@ class item : public visitable bool is_tool() const; bool is_transformable() const; bool is_artifact() const; + bool is_relic() const; bool is_bucket() const; bool is_bucket_nonempty() const; @@ -1268,6 +1270,7 @@ class item : public visitable */ /*@{*/ void set_var( const std::string &name, int value ); + void set_var( const std::string &name, long long value ); // Acceptable to use long as part of overload set // NOLINTNEXTLINE(cata-no-long) void set_var( const std::string &name, long value ); @@ -1973,6 +1976,8 @@ class item : public visitable void set_cached_tool_selections( const std::vector> &selections ); const std::vector> &get_cached_tool_selections() const; + std::vector get_enchantments() const; + private: /** * Calculate the thermal energy and temperature change of the item @@ -2020,7 +2025,8 @@ class item : public visitable // Place conditions that should remove fake smoke item in this sub-function bool process_fake_smoke( player *carrier, const tripoint &pos ); bool process_fake_mill( player *carrier, const tripoint &pos ); - bool process_cable( player *p, const tripoint &pos ); + bool process_cable( player *carrier, const tripoint &pos ); + bool process_UPS( player *carrier, const tripoint &pos ); bool process_blackpowder_fouling( player *carrier ); bool process_tool( player *carrier, const tripoint &pos ); @@ -2049,7 +2055,8 @@ class item : public visitable // If the crafter has insufficient tools to continue to the next 5% progress step bool tools_to_continue = false; std::vector> cached_tool_selections; - + // any relic data specific to this item + cata::optional relic_data; public: int charges; units::energy energy; // Amount of energy currently stored in a battery diff --git a/src/item_action.cpp b/src/item_action.cpp index a932967b1adaf..8395dbfa71abf 100644 --- a/src/item_action.cpp +++ b/src/item_action.cpp @@ -221,6 +221,10 @@ void game::item_action_menu() if( u.has_active_bionic( bionic_id( "bio_tools" ) ) ) { pseudos.push_back( &toolset ); } + item bio_claws( "bio_claws_weapon", calendar::turn ); + if( u.has_active_bionic( bionic_id( "bio_claws" ) ) ) { + pseudos.push_back( &bio_claws ); + } item_action_map iactions = gen.map_actions_to_items( u, pseudos ); if( iactions.empty() ) { diff --git a/src/item_factory.cpp b/src/item_factory.cpp index f91f182a62efa..d99c0b6ccbc54 100644 --- a/src/item_factory.cpp +++ b/src/item_factory.cpp @@ -524,8 +524,8 @@ class iuse_function_wrapper : public iuse_actor iuse tmp; return ( tmp.*cpp_function )( &p, &it, a, pos ); } - iuse_actor *clone() const override { - return new iuse_function_wrapper( *this ); + std::unique_ptr clone() const override { + return std::make_unique( *this ); } void load( JsonObject & ) override {} @@ -543,13 +543,13 @@ class iuse_function_wrapper_with_info : public iuse_function_wrapper void info( const item &, std::vector &info ) const override { info.emplace_back( "DESCRIPTION", _( info_string ) ); } - iuse_actor *clone() const override { - return new iuse_function_wrapper_with_info( *this ); + std::unique_ptr clone() const override { + return std::make_unique( *this ); } }; use_function::use_function( const std::string &type, const use_function_pointer f ) - : use_function( new iuse_function_wrapper( type, f ) ) {} + : use_function( std::make_unique( type, f ) ) {} void Item_factory::add_iuse( const std::string &type, const use_function_pointer f ) { @@ -560,12 +560,13 @@ void Item_factory::add_iuse( const std::string &type, const use_function_pointer const std::string &info ) { iuse_function_list[ type ] = - use_function( new iuse_function_wrapper_with_info( type, f, info ) ); + use_function( std::make_unique( type, f, info ) ); } -void Item_factory::add_actor( iuse_actor *ptr ) +void Item_factory::add_actor( std::unique_ptr ptr ) { - iuse_function_list[ ptr->type ] = use_function( ptr ); + std::string type = ptr->type; + iuse_function_list[ type ] = use_function( std::move( ptr ) ); } void Item_factory::add_item_type( const itype &def ) @@ -778,42 +779,42 @@ void Item_factory::init() add_iuse( "BREAK_STICK", &iuse::break_stick ); add_iuse( "MAGNESIUM_TABLET", &iuse::magnesium_tablet ); - add_actor( new ammobelt_actor() ); - add_actor( new bandolier_actor() ); - add_actor( new cauterize_actor() ); - add_actor( new consume_drug_iuse() ); - add_actor( new delayed_transform_iuse() ); - add_actor( new enzlave_actor() ); - add_actor( new explosion_iuse() ); - add_actor( new firestarter_actor() ); - add_actor( new fireweapon_off_actor() ); - add_actor( new fireweapon_on_actor() ); - add_actor( new heal_actor() ); - add_actor( new holster_actor() ); - add_actor( new inscribe_actor() ); - add_actor( new iuse_transform() ); - add_actor( new countdown_actor() ); - add_actor( new manualnoise_actor() ); - add_actor( new musical_instrument_actor() ); - add_actor( new pick_lock_actor() ); - add_actor( new deploy_furn_actor() ); - add_actor( new place_monster_iuse() ); - add_actor( new reveal_map_actor() ); - add_actor( new salvage_actor() ); - add_actor( new unfold_vehicle_iuse() ); - add_actor( new ups_based_armor_actor() ); - add_actor( new place_trap_actor() ); - add_actor( new emit_actor() ); - add_actor( new saw_barrel_actor() ); - add_actor( new install_bionic_actor() ); - add_actor( new detach_gunmods_actor() ); - add_actor( new mutagen_actor() ); - add_actor( new mutagen_iv_actor() ); - add_actor( new deploy_tent_actor() ); - add_actor( new learn_spell_actor() ); - add_actor( new cast_spell_actor() ); - add_actor( new weigh_self_actor() ); - add_actor( new sew_advanced_actor() ); + 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() ); + 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() ); + 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() ); + 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() ); + 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() ); + add_actor( std::make_unique() ); // An empty dummy group, it will not spawn anything. However, it makes that item group // id valid, so it can be used all over the place without need to explicitly check for it. m_template_groups["EMPTY_GROUP"] = std::make_unique( Item_group::G_COLLECTION, 100, 0, @@ -1431,7 +1432,7 @@ void Item_factory::load( islot_gun &slot, JsonObject &jo, const std::string &src slot.ammo.insert( ammotype( jo.get_string( "ammo" ) ) ); } assign( jo, "range", slot.range, strict ); - if( jo.has_object( "ranged_damage" ) ) { + if( jo.has_object( "ranged_damage" ) || jo.has_array( "ranged_damage" ) ) { assign( jo, "ranged_damage", slot.damage, strict ); } else { assign( jo, "ranged_damage", slot.legacy_damage, strict ); @@ -1454,7 +1455,7 @@ void Item_factory::load( islot_gun &slot, JsonObject &jo, const std::string &src assign( jo, "default_mods", slot.default_mods, strict ); assign( jo, "ups_charges", slot.ups_charges, strict, 0 ); assign( jo, "blackpowder_tolerance", slot.blackpowder_tolerance, strict, 0 ); - assign( jo, "min_cycle_recoil", slot.blackpowder_tolerance, strict, 0 ); + assign( jo, "min_cycle_recoil", slot.min_cycle_recoil, strict, 0 ); assign( jo, "ammo_effects", slot.ammo_effects, strict ); if( jo.has_array( "valid_mod_locations" ) ) { @@ -1501,6 +1502,7 @@ void Item_factory::load( islot_armor &slot, JsonObject &jo, const std::string &s bool strict = src == "dda"; assign( jo, "encumbrance", slot.encumber, strict, 0 ); + assign( jo, "max_encumbrance", slot.max_encumber, strict, slot.encumber ); assign( jo, "coverage", slot.coverage, strict, 0, 100 ); assign( jo, "material_thickness", slot.thickness, strict, 0 ); assign( jo, "environmental_protection", slot.env_resist, strict, 0 ); @@ -1508,15 +1510,10 @@ void Item_factory::load( islot_armor &slot, JsonObject &jo, const std::string &s assign( jo, "warmth", slot.warmth, strict, 0 ); assign( jo, "storage", slot.storage, strict, 0_ml ); assign( jo, "weight_capacity_modifier", slot.weight_capacity_modifier ); + assign( jo, "weight_capacity_bonus", slot.weight_capacity_bonus, strict, 0_gram ); assign( jo, "power_armor", slot.power_armor, strict ); assign_coverage_from_json( jo, "covers", slot.covers, slot.sided ); - - if( jo.has_string( "weight_capacity_bonus" ) ) { - slot.weight_capacity_bonus = read_from_json_string - ( *jo.get_raw( "weight_capacity_bonus" ), units::mass_units ); - } - } void Item_factory::load( islot_pet_armor &slot, JsonObject &jo, const std::string &src ) @@ -1579,6 +1576,11 @@ void Item_factory::load_tool( JsonObject &jo, const std::string &src ) } } +void Item_factory::load( relic &slot, JsonObject &jo, const std::string & ) +{ + slot.load( jo ); +} + void Item_factory::load( islot_mod &slot, JsonObject &jo, const std::string &src ) { bool strict = src == "dda"; @@ -2190,6 +2192,7 @@ void Item_factory::load_basic_info( JsonObject &jo, itype &def, const std::strin load_slot_optional( def.artifact, jo, "artifact_data", src ); load_slot_optional( def.brewable, jo, "brewable", src ); load_slot_optional( def.fuel, jo, "fuel", src ); + load_slot_optional( def.relic_data, jo, "relic_data", src ); // optional gunmod slot may also specify mod data load_slot_optional( def.gunmod, jo, "gunmod_data", src ); @@ -2647,7 +2650,7 @@ std::pair Item_factory::usage_from_object( JsonObject if( type == "repair_item" ) { type = obj.get_string( "item_action_type" ); if( !has_iuse( type ) ) { - add_actor( new repair_item_actor( type ) ); + add_actor( std::make_unique( type ) ); repair_actions.insert( type ); } } diff --git a/src/item_factory.h b/src/item_factory.h index 3c410c8185249..07f5509284382 100644 --- a/src/item_factory.h +++ b/src/item_factory.h @@ -308,6 +308,7 @@ class Item_factory void load( islot_ammo &slot, JsonObject &jo, const std::string &src ); void load( islot_seed &slot, JsonObject &jo, const std::string &src ); void load( islot_artifact &slot, JsonObject &jo, const std::string &src ); + void load( relic &slot, JsonObject &jo, const std::string &src ); //json data handlers void set_use_methods_from_json( JsonObject &jo, const std::string &member, @@ -357,7 +358,7 @@ class Item_factory void add_iuse( const std::string &type, use_function_pointer f ); void add_iuse( const std::string &type, use_function_pointer f, const std::string &info ); - void add_actor( iuse_actor *ptr ); + void add_actor( std::unique_ptr ); std::map migrations; diff --git a/src/itype.h b/src/itype.h index 00faf24b00e7b..84187e289d094 100644 --- a/src/itype.h +++ b/src/itype.h @@ -18,6 +18,7 @@ #include "iuse.h" // use_function #include "optional.h" #include "pldata.h" // add_type +#include "relic.h" #include "translations.h" #include "type_id.h" #include "units.h" @@ -222,6 +223,10 @@ struct islot_armor { * How much this item encumbers the player. */ int encumber = 0; + /** + * When storage is full, how much it encumbers the player. + */ + int max_encumber = 0; /** * Percentage of the body part area that this item covers. * This determines how likely it is to hit the item instead of the player. @@ -780,6 +785,7 @@ struct itype { cata::optional ammo; cata::optional seed; cata::optional artifact; + cata::optional relic_data; /*@}*/ private: diff --git a/src/iuse.cpp b/src/iuse.cpp index 1ee3048aa5c83..237d0260aea91 100644 --- a/src/iuse.cpp +++ b/src/iuse.cpp @@ -1,4 +1,4 @@ -#include "iuse.h" +#include "iuse.h" #include #include @@ -25,6 +25,7 @@ #include "coordinate_conversions.h" #include "debug.h" #include "effect.h" // for weed_msg +#include "event_bus.h" #include "explosion.h" #include "timed_event.h" #include "field.h" @@ -41,6 +42,7 @@ #include "map_iterator.h" #include "mapdata.h" #include "martialarts.h" +#include "memorial_logger.h" #include "messages.h" #include "monattack.h" #include "mongroup.h" @@ -345,8 +347,7 @@ int iuse::sewage( player *p, item *it, bool, const tripoint & ) return 0; } - p->add_memorial_log( pgettext( "memorial_male", "Ate a sewage sample." ), - pgettext( "memorial_female", "Ate a sewage sample." ) ); + g->events().send(); p->vomit(); if( one_in( 4 ) ) { p->mutate(); @@ -926,7 +927,8 @@ int iuse::flusleep( player *p, item *it, bool, const tripoint & ) int iuse::inhaler( player *p, item *it, bool, const tripoint & ) { - p->add_msg_if_player( m_neutral, _( "You take a puff from your inhaler." ) ); + p->add_msg_player_or_npc( m_neutral, _( "You take a puff from your inhaler." ), + _( " takes a puff from their inhaler." ) ); if( !p->remove_effect( effect_asthma ) ) { p->mod_fatigue( -3 ); // if we don't have asthma can be used as stimulant if( one_in( 20 ) ) { // with a small but significant risk of adverse reaction @@ -940,7 +942,10 @@ int iuse::inhaler( player *p, item *it, bool, const tripoint & ) int iuse::oxygen_bottle( player *p, item *it, bool, const tripoint & ) { p->moves -= to_moves( 10_seconds ); - p->add_msg_if_player( m_neutral, _( "You breathe deeply from the %s" ), it->tname() ); + p->add_msg_player_or_npc( m_neutral, string_format( _( "You breathe deeply from the %s" ), + it->tname() ), + string_format( _( " breathes from the %s" ), + it->tname() ) ); if( p->has_effect( effect_smoke ) ) { p->remove_effect( effect_smoke ); } else if( p->has_effect( effect_teargas ) ) { @@ -1048,9 +1053,8 @@ static void do_purify( player &p ) int iuse::purifier( player *p, item *it, bool, const tripoint & ) { - mutagen_attempt checks = mutagen_common_checks( *p, *it, false, - pgettext( "memorial_male", "Consumed purifier." ), pgettext( "memorial_female", - "Consumed purifier." ) ); + mutagen_attempt checks = + mutagen_common_checks( *p, *it, false, mutagen_technique::consumed_purifier ); if( !checks.allowed ) { return checks.charges_used; } @@ -1061,9 +1065,8 @@ int iuse::purifier( player *p, item *it, bool, const tripoint & ) int iuse::purify_iv( player *p, item *it, bool, const tripoint & ) { - mutagen_attempt checks = mutagen_common_checks( *p, *it, false, - pgettext( "memorial_male", "Injected purifier." ), pgettext( "memorial_female", - "Injected purifier." ) ); + mutagen_attempt checks = + mutagen_common_checks( *p, *it, false, mutagen_technique::injected_purifier ); if( !checks.allowed ) { return checks.charges_used; } @@ -1104,9 +1107,8 @@ int iuse::purify_iv( player *p, item *it, bool, const tripoint & ) int iuse::purify_smart( player *p, item *it, bool, const tripoint & ) { - mutagen_attempt checks = mutagen_common_checks( *p, *it, false, - pgettext( "memorial_male", "Injected smart purifier." ), pgettext( "memorial_female", - "Injected smart purifier." ) ); + mutagen_attempt checks = + mutagen_common_checks( *p, *it, false, mutagen_technique::injected_smart_purifier ); if( !checks.allowed ) { return checks.charges_used; } @@ -1253,8 +1255,11 @@ static void marloss_common( player &p, item &it, const trait_id ¤t_color ) // Mycus Rejection. Goo already present fights off the fungus. p.add_msg_if_player( m_bad, _( "You feel a familiar warmth, but suddenly it surges into an excruciating burn as you convulse, vomiting, and black out..." ) ); - p.add_memorial_log( pgettext( "memorial_male", "Suffered Marloss Rejection." ), - pgettext( "memorial_female", "Suffered Marloss Rejection." ) ); + if( p.is_avatar() ) { + g->memorial().add( + pgettext( "memorial_male", "Suffered Marloss Rejection." ), + pgettext( "memorial_female", "Suffered Marloss Rejection." ) ); + } p.vomit(); p.mod_pain( 90 ); p.hurtall( rng( 40, 65 ), nullptr ); // No good way to say "lose half your current HP" @@ -1279,12 +1284,11 @@ static void marloss_common( player &p, item &it, const trait_id ¤t_color ) p.set_mutation( trait_THRESH_MARLOSS ); g->m.ter_set( p.pos(), t_marloss ); - p.add_memorial_log( pgettext( "memorial_male", "Opened the Marloss Gateway." ), - pgettext( "memorial_female", "Opened the Marloss Gateway." ) ); + g->events().send( p.getID() ); p.add_msg_if_player( m_good, _( "You wake up in a marloss bush. Almost *cradled* in it, actually, as though it grew there for you." ) ); - //~ Beginning to hear the Mycus while conscious: that's it speaking p.add_msg_if_player( m_good, + //~ Beginning to hear the Mycus while conscious: that's it speaking _( "unity. together we have reached the door. we provide the final key. now to pass through..." ) ); } else { p.add_msg_if_player( _( "You feel a strange warmth spreading throughout your body..." ) ); @@ -1306,8 +1310,8 @@ static bool marloss_prevented( const player &p ) return true; } if( p.has_trait( trait_MARLOSS_AVOID ) ) { - //~"Uh-uh" is a sound used for "nope", "no", etc. p.add_msg_if_player( m_warning, + //~ "Uh-uh" is a sound used for "nope", "no", etc. _( "After what happened that last time? uh-uh. You're not eating that alien poison." ) ); return true; } @@ -1326,8 +1330,7 @@ int iuse::marloss( player *p, item *it, bool, const tripoint & ) return 0; } - p->add_memorial_log( pgettext( "memorial_male", "Consumed a marloss product." ), - pgettext( "memorial_female", "Consumed a marloss product." ) ); + g->events().send( p->getID(), it->typeId() ); marloss_common( *p, *it, trait_MARLOSS ); return it->type->charges_to_use(); @@ -1344,8 +1347,7 @@ int iuse::marloss_seed( player *p, item *it, bool, const tripoint & ) return 0; } - p->add_memorial_log( pgettext( "memorial_male", "Consumed a marloss seed." ), - pgettext( "memorial_female", "Consumed a marloss seed." ) ); + g->events().send( p->getID(), it->typeId() ); marloss_common( *p, *it, trait_MARLOSS_BLUE ); return it->type->charges_to_use(); @@ -1357,8 +1359,7 @@ int iuse::marloss_gel( player *p, item *it, bool, const tripoint & ) return 0; } - p->add_memorial_log( pgettext( "memorial_male", "Consumed some marloss jelly." ), - pgettext( "memorial_female", "Consumed some marloss jelly." ) ); + g->events().send( p->getID(), it->typeId() ); marloss_common( *p, *it, trait_MARLOSS_YELLOW ); return it->type->charges_to_use(); @@ -1371,8 +1372,7 @@ int iuse::mycus( player *p, item *it, bool t, const tripoint &pos ) } // Welcome our guide. Welcome. To. The Mycus. if( p->has_trait( trait_THRESH_MARLOSS ) ) { - p->add_memorial_log( pgettext( "memorial_male", "Became one with the Mycus." ), - pgettext( "memorial_female", "Became one with the Mycus." ) ); + g->events().send( p->getID() ); p->add_msg_if_player( m_neutral, _( "It tastes amazing, and you finish it quickly." ) ); p->add_msg_if_player( m_good, _( "You feel better all over." ) ); @@ -1389,10 +1389,10 @@ int iuse::mycus( player *p, item *it, bool t, const tripoint &pos ) p->fall_asleep( 5_hours - p->int_cur * 1_minutes ); p->unset_mutation( trait_THRESH_MARLOSS ); p->set_mutation( trait_THRESH_MYCUS ); + g->refresh_all(); //~ The Mycus does not use the term (or encourage the concept of) "you". The PC is a local/native organism, but is now the Mycus. //~ It still understands the concept, but uninitelligent fungaloids and mind-bent symbiotes should not need it. //~ We are the Mycus. - g->refresh_all(); popup( _( "We welcome into us. We have endured long in this forbidding world." ) ); p->add_msg_if_player( " " ); p->add_msg_if_player( m_good, @@ -1690,23 +1690,21 @@ int iuse::fishing_rod( player *p, item *it, bool, const tripoint & ) p->add_msg_if_player( m_info, _( "You cannot do that while mounted." ) ); return 0; } - const cata::optional pnt_ = choose_adjacent( _( "Fish where?" ) ); - if( !pnt_ ) { - return 0; + cata::optional found; + for( const tripoint &pnt : g->m.points_in_radius( p->pos(), 1 ) ) { + if( g->m.has_flag( "FISHABLE", pnt ) && good_fishing_spot( pnt ) ) { + found = pnt; + break; + } } - const tripoint pnt = *pnt_; - if( !g->m.has_flag( "FISHABLE", pnt ) ) { + if( !found ) { p->add_msg_if_player( m_info, _( "You can't fish there!" ) ); return 0; } - if( !good_fishing_spot( pnt ) ) { - return 0; - } p->add_msg_if_player( _( "You cast your line and wait to hook something..." ) ); p->assign_activity( activity_id( "ACT_FISH" ), to_moves( 5_hours ), 0, p->get_item_position( it ), it->tname() ); - p->activity.coord_set = g->get_fishable_locations( 60, pnt ); - + p->activity.coord_set = g->get_fishable_locations( 60, *found ); return 0; } @@ -1956,7 +1954,7 @@ int iuse::unpack_item( player *p, item *it, bool, const tripoint & ) int iuse::pack_cbm( player *p, item *it, bool, const tripoint & ) { item_location bionic = g->inv_map_splice( []( const item & e ) { - return e.is_bionic(); + return e.is_bionic() && e.has_flag( "NO_PACKED" ); }, _( "Choose CBM to pack" ), PICKUP_RANGE, _( "You don't have any CBMs." ) ); if( !bionic ) { @@ -1969,25 +1967,12 @@ int iuse::pack_cbm( player *p, item *it, bool, const tripoint & ) return 0; } - if( !bionic.get_item()->has_flag( "NO_PACKED" ) || - bionic.get_item()->has_flag( "PACKED_FAULTY" ) ) { - if( !p->query_yn( _( "This CBM is already packed. Do you want to put it in a new pouch?" ) ) ) { - return 0; - } - } - - bionic.get_item()->unset_flag( "NO_PACKED" ); - bionic.get_item()->unset_flag( "PACKED_FAULTY" ); - const int success = p->get_skill_level( skill_firstaid ) - rng( 0, 6 ); if( success > 0 ) { - p->add_msg_if_player( m_info, _( "You carefully prepare the CBM for sterilization." ) ); + p->add_msg_if_player( m_good, _( "You carefully prepare the CBM for sterilization." ) ); + bionic.get_item()->unset_flag( "NO_PACKED" ); } else { - bionic.get_item()->set_flag( "PACKED_FAULTY" ); - p->add_msg_if_player( m_info, _( "You put the CBM in the pouch and close it." ) ); - if( success == 0 ) { - p->add_msg_if_player( m_info, _( "You're not sure about the quality of your work." ) ); - } + p->add_msg_if_player( m_bad, _( "You fail to properly prepare the CBM." ) ); } std::vector comps; @@ -2236,7 +2221,7 @@ int iuse::ma_manual( player *p, item *it, bool, const tripoint & ) p->ma_styles.push_back( style_to_learn ); p->add_msg_if_player( m_good, _( "You learn the essential elements of %s." ), - _( ma.name ) ); + ma.name ); p->add_msg_if_player( m_info, _( "%s to select martial arts style." ), press_x( ACTION_PICK_STYLE ) ); @@ -2299,21 +2284,50 @@ int iuse::hammer( player *p, item *it, bool, const tripoint & ) p->add_msg_if_player( m_info, _( "You cannot do that while mounted." ) ); return 0; } - // If anyone other than the player wants to use one of these, - // they're going to need to figure out how to aim it. - const cata::optional pnt_ = choose_adjacent( _( "Pry where?" ) ); + const std::set allowed_ter_id { + t_fence, + t_window_boarded, + t_window_boarded_noglass, + t_door_boarded, + t_door_boarded_damaged, + t_door_boarded_peep, + t_door_boarded_damaged_peep, + t_rdoor_boarded, + t_rdoor_boarded_damaged + }; + + const std::function f = [&allowed_ter_id]( const tripoint & pnt ) { + if( pnt == g->u.pos() ) { + return false; + } + const ter_id ter = g->m.ter( pnt ); + + const bool is_allowed = allowed_ter_id.find( ter ) != allowed_ter_id.end(); + return is_allowed; + }; + + const cata::optional pnt_ = choose_adjacent_highlight( + _( "Pry where?" ), f, false, true ); if( !pnt_ ) { return 0; } - const tripoint pnt = *pnt_; - - if( pnt == p->pos() ) { - p->add_msg_if_player( _( "You try to hit yourself with the hammer." ) ); - p->add_msg_if_player( _( "But you can't touch this." ) ); + const tripoint &pnt = *pnt_; + const ter_id type = g->m.ter( pnt ); + if( !f( pnt ) ) { + if( pnt == p->pos() ) { + p->add_msg_if_player( _( "You try to hit yourself with the hammer." ) ); + p->add_msg_if_player( _( "But you can't touch this." ) ); + } else { + p->add_msg_if_player( m_info, _( "You can't pry that." ) ); + } return 0; } - return this->crowbar( p, it, false, pnt ); + if( pry_nails( *p, type, pnt ) ) { + return it->type->charges_to_use(); + } else { + return 0; + } } int iuse::crowbar( player *p, item *it, bool, const tripoint &pos ) @@ -2322,22 +2336,54 @@ int iuse::crowbar( player *p, item *it, bool, const tripoint &pos ) p->add_msg_if_player( m_info, _( "You cannot do that while mounted." ) ); return 0; } - // TODO: Make this 3D now that NPCs get to use items - tripoint pnt = pos; - if( pos == p->pos() ) { - const cata::optional pnt_ = choose_adjacent( _( "Pry where?" ) ); - if( !pnt_ ) { - return 0; + const std::set allowed_ter_id { + t_door_locked, + t_door_locked_alarm, + t_door_locked_interior, + t_door_locked_peep, + t_door_c, + t_door_c_peep, + t_manhole_cover, + t_window_domestic, + t_curtains, + t_window_no_curtains + }; + const std::set allowed_furn_id { + f_crate_c, + f_coffin_c + }; + + const std::function f = [&allowed_ter_id, + &allowed_furn_id]( const tripoint & pnt ) { + if( pnt == g->u.pos() ) { + return false; } - pnt = *pnt_; - } // else it is already set to pos in the line above if + const ter_id ter = g->m.ter( pnt ); + const auto furn = g->m.furn( pnt ); - if( pnt == p->pos() ) { - p->add_msg_if_player( m_info, _( "You attempt to pry open your wallet " - "but alas. You are just too miserly." ) ); + const bool is_allowed = allowed_ter_id.find( ter ) != allowed_ter_id.end() || + allowed_furn_id.find( furn ) != allowed_furn_id.end(); + return is_allowed; + }; + + const cata::optional pnt_ = ( pos != p->pos() ) ? pos : + choose_adjacent_highlight( + _( "Pry where?" ), f, false, true ); + if( !pnt_ ) { + return 0; + } + const tripoint &pnt = *pnt_; + const ter_id type = g->m.ter( pnt ); + const furn_id furn = g->m.furn( pnt ); + if( !f( pnt ) ) { + if( pnt == p->pos() ) { + p->add_msg_if_player( m_info, _( "You attempt to pry open your wallet " + "but alas. You are just too miserly." ) ); + } else { + p->add_msg_if_player( m_info, _( "You can't pry that." ) ); + } return 0; } - ter_id type = g->m.ter( pnt ); const char *succ_action; const char *fail_action; ter_id new_type = t_null; @@ -2376,13 +2422,13 @@ int iuse::crowbar( player *p, item *it, bool, const tripoint &pos ) new_type = t_manhole; noisy = false; difficulty = 4; - } else if( g->m.furn( pnt ) == f_crate_c ) { + } else if( furn == f_crate_c ) { succ_action = _( "You pop open the crate." ); fail_action = _( "You pry, but cannot pop open the crate." ); pry_quality = 1; noisy = true; difficulty = 6; - } else if( g->m.furn( pnt ) == f_coffin_c ) { + } else if( furn == f_coffin_c ) { succ_action = _( "You wedge open the coffin." ); fail_action = _( "You pry, but the coffin remains closed." ); pry_quality = 2; @@ -2395,10 +2441,7 @@ int iuse::crowbar( player *p, item *it, bool, const tripoint &pos ) pry_quality = 2; noisy = true; difficulty = 6; - } else if( pry_nails( *p, type, pnt ) ) { - return it->type->charges_to_use(); } else { - p->add_msg_if_player( m_info, _( "You can't pry that." ) ); return 0; } @@ -2441,8 +2484,7 @@ int iuse::crowbar( player *p, item *it, bool, const tripoint &pos ) g->m.spawn_item( pnt, "manhole_cover" ); } if( type == t_door_locked_alarm ) { - p->add_memorial_log( pgettext( "memorial_male", "Set off an alarm." ), - pgettext( "memorial_female", "Set off an alarm." ) ); + g->events().send( p->getID() ); sounds::sound( p->pos(), 40, sounds::sound_t::alarm, _( "an alarm sound!" ), true, "environment", "alarm" ); if( !g->timed_events.queued( TIMED_EVENT_WANTED ) ) { @@ -2497,7 +2539,7 @@ int iuse::makemound( player *p, item *it, bool t, const tripoint & ) p->add_msg_if_player( _( "You start churning up the earth here." ) ); p->assign_activity( activity_id( "ACT_CHURN" ), to_turns( 3_minutes ), -1, p->get_item_position( it ) ); - p->activity.placement = pnt; + p->activity.placement = g->m.getabs( pnt ); return it->type->charges_to_use(); } else { p->add_msg_if_player( _( "You can't churn up this ground." ) ); @@ -2671,8 +2713,8 @@ int iuse::dig( player *p, item *it, bool t, const tripoint & ) } } - const std::function f = []( tripoint p ) { - return g->m.passable( p ); + const std::function f = []( const tripoint & pnt ) { + return g->m.passable( pnt ); }; const cata::optional pnt_ = choose_adjacent_highlight( @@ -2682,7 +2724,7 @@ int iuse::dig( player *p, item *it, bool t, const tripoint & ) } const tripoint deposit_point = *pnt_; - if( !g->m.passable( deposit_point ) ) { + if( !f( deposit_point ) ) { p->add_msg_if_player( _( "You can't deposit the excavated materials onto an impassable location." ) ); return 0; @@ -2758,8 +2800,8 @@ int iuse::dig_channel( player *p, item *it, bool t, const tripoint & ) return 0; } - const std::function f = []( tripoint p ) { - return g->m.passable( p ); + const std::function f = []( const tripoint & pnt ) { + return g->m.passable( pnt ); }; const cata::optional pnt_ = choose_adjacent_highlight( @@ -2769,7 +2811,7 @@ int iuse::dig_channel( player *p, item *it, bool t, const tripoint & ) } const tripoint deposit_point = *pnt_; - if( !g->m.passable( deposit_point ) ) { + if( !f( deposit_point ) ) { p->add_msg_if_player( _( "You can't deposit the excavated materials onto an impassable location." ) ); return 0; @@ -2805,28 +2847,48 @@ int iuse::fill_pit( player *p, item *it, bool t, const tripoint & ) p->add_msg_if_player( m_info, _( "You cannot do that while mounted." ) ); return 0; } - const cata::optional pnt_ = choose_adjacent( _( "Fill which pit or mound?" ) ); + const std::set allowed_ter_id { + t_pit, + t_pit_spiked, + t_pit_glass, + t_pit_corpsed, + t_pit_shallow, + t_dirtmound + }; + + const std::function f = [&allowed_ter_id]( const tripoint & pnt ) { + if( pnt == g->u.pos() ) { + return false; + } + const ter_id type = g->m.ter( pnt ); + return ( allowed_ter_id.find( type ) != allowed_ter_id.end() ); + }; + + const cata::optional pnt_ = choose_adjacent_highlight( + _( "Fill which pit or mound?" ), f, false, true ); if( !pnt_ ) { return 0; } - const tripoint pnt = *pnt_; - - if( pnt == p->pos() ) { - p->add_msg_if_player( m_info, _( "You decide not to bury yourself that early." ) ); + const tripoint &pnt = *pnt_; + const ter_id ter = g->m.ter( pnt ); + if( !f( pnt ) ) { + if( pnt == p->pos() ) { + p->add_msg_if_player( m_info, _( "You decide not to bury yourself that early." ) ); + } else { + p->add_msg_if_player( m_info, _( "There is nothing to fill." ) ); + } return 0; } int moves; - - if( g->m.ter( pnt ) == t_pit || g->m.ter( pnt ) == t_pit_spiked || - g->m.ter( pnt ) == t_pit_glass || g->m.ter( pnt ) == t_pit_corpsed ) { + if( ter == t_pit || ter == t_pit_spiked || + ter == t_pit_glass || ter == t_pit_corpsed ) { moves = to_moves( time_duration::from_minutes( 15 ) ); - } else if( g->m.ter( pnt ) == t_pit_shallow ) { + } else if( ter == t_pit_shallow ) { moves = to_moves( time_duration::from_minutes( 10 ) ); - } else if( g->m.ter( pnt ) == t_dirtmound ) { + } else if( ter == t_dirtmound ) { moves = to_moves( time_duration::from_minutes( 5 ) ); } else { - p->add_msg_if_player( _( "There is nothing to fill." ) ); return 0; } const std::vector helpers = g->u.get_crafting_helpers(); @@ -2855,29 +2917,33 @@ int iuse::clear_rubble( player *p, item *it, bool, const tripoint & ) p->add_msg_if_player( m_info, _( "You cannot do that while mounted." ) ); return 0; } - const cata::optional pnt_ = choose_adjacent( _( "Clear rubble where?" ) ); + const std::function f = []( const tripoint & pnt ) { + return g->m.has_flag( "RUBBLE", pnt ); + }; + + const cata::optional pnt_ = choose_adjacent_highlight( + _( "Clear rubble where?" ), f, false, true ); if( !pnt_ ) { return 0; } - const tripoint pnt = *pnt_; - - if( g->m.has_flag( "RUBBLE", pnt ) ) { - int bonus = std::max( it->get_quality( quality_id( "DIG" ) ) - 1, 1 ); - const std::vector helpers = g->u.get_crafting_helpers(); - for( const npc *np : helpers ) { - add_msg( m_info, _( "%s helps with this task..." ), np->name ); - break; - } - const int helpersize = g->u.get_num_crafting_helpers( 3 ); - const int moves = to_moves( 30_seconds ) * ( 1 - ( helpersize / 10 ) ); - player_activity act( activity_id( "ACT_CLEAR_RUBBLE" ), moves / bonus, bonus ); - p->assign_activity( act ); - p->activity.placement = pnt; - return it->type->charges_to_use(); - } else { + const tripoint &pnt = *pnt_; + if( !f( pnt ) ) { p->add_msg_if_player( m_bad, _( "There's no rubble to clear." ) ); return 0; } + + int bonus = std::max( it->get_quality( quality_id( "DIG" ) ) - 1, 1 ); + const std::vector helpers = g->u.get_crafting_helpers(); + for( const npc *np : helpers ) { + add_msg( m_info, _( "%s helps with this task..." ), np->name ); + break; + } + const int helpersize = g->u.get_num_crafting_helpers( 3 ); + const int moves = to_moves( 30_seconds ) * ( 1 - ( helpersize / 10 ) ); + player_activity act( activity_id( "ACT_CLEAR_RUBBLE" ), moves / bonus, bonus ); + p->assign_activity( act ); + p->activity.placement = pnt; + return it->type->charges_to_use(); } void act_vehicle_siphon( vehicle * ); // veh_interact.cpp @@ -2888,17 +2954,47 @@ int iuse::siphon( player *p, item *it, bool, const tripoint & ) p->add_msg_if_player( m_info, _( "You cannot do that while mounted." ) ); return 0; } - const cata::optional pnt_ = choose_adjacent( _( "Siphon from where?" ) ); - if( !pnt_ ) { - return 0; + const std::function f = []( const tripoint & pnt ) { + const optional_vpart_position vp = g->m.veh_at( pnt ); + return !!vp; + }; + + vehicle *v = nullptr; + bool found_more_than_one = false; + for( const tripoint &pos : g->m.points_in_radius( g->u.pos(), 1 ) ) { + const optional_vpart_position vp = g->m.veh_at( pos ); + if( !vp ) { + continue; + } + vehicle *vfound = &vp->vehicle(); + if( v == nullptr ) { + v = vfound; + } else { + //found more than one vehicle? + if( v != vfound ) { + v = nullptr; + found_more_than_one = true; + break; + } + } + } + if( found_more_than_one ) { + cata::optional pnt_ = choose_adjacent_highlight( + _( "Siphon from where?" ), f, false, true ); + if( !pnt_ ) { + return 0; + } + const optional_vpart_position vp = g->m.veh_at( *pnt_ ); + if( vp ) { + v = &vp->vehicle(); + } } - const optional_vpart_position vp = g->m.veh_at( *pnt_ ); - if( !vp ) { + if( v == nullptr ) { p->add_msg_if_player( m_info, _( "There's no vehicle there." ) ); return 0; } - act_vehicle_siphon( &vp->vehicle() ); + act_vehicle_siphon( v ); return it->type->charges_to_use(); } @@ -3749,10 +3845,7 @@ int iuse::mininuke( player *p, item *it, bool, const tripoint & ) } p->add_msg_if_player( _( "You set the timer to %s." ), to_string( time_duration::from_turns( time ) ) ); - if( !p->is_npc() ) { - p->add_memorial_log( pgettext( "memorial_male", "Activated a mininuke." ), - pgettext( "memorial_female", "Activated a mininuke." ) ); - } + g->events().send( p->getID() ); it->convert( "mininuke_act" ); it->charges = time; it->active = true; @@ -3972,25 +4065,22 @@ int iuse::mp3( player *p, item *it, bool, const tripoint & ) static std::string get_music_description() { - static const std::string no_description = _( "a sweet guitar solo!" ); - static const std::string rare = _( "some bass-heavy post-glam speed polka." ); - static const std::array descriptions = {{ - _( "a sweet guitar solo!" ), - _( "a funky bassline." ), - _( "some amazing vocals." ), - _( "some pumping bass." ), - _( "dramatic classical music." ) - + const std::array descriptions = {{ + translate_marker( "a sweet guitar solo!" ), + translate_marker( "a funky bassline." ), + translate_marker( "some amazing vocals." ), + translate_marker( "some pumping bass." ), + translate_marker( "dramatic classical music." ) } }; if( one_in( 50 ) ) { - return rare; + return _( "some bass-heavy post-glam speed polka." ); } size_t i = static_cast( rng( 0, descriptions.size() * 2 ) ); if( i < descriptions.size() ) { - return descriptions[i]; + return _( descriptions[i] ); } // Not one of the hard-coded versions, let's apply a random string made up // of snippets {a, b, c}, but only a 50% chance @@ -4006,7 +4096,7 @@ static std::string get_music_description() } } - return no_description; + return _( "a sweet guitar solo!" ); } void iuse::play_music( player &p, const tripoint &source, const int volume, const int max_morale ) @@ -4531,7 +4621,7 @@ void iuse::cut_log_into_planks( player &p ) p.add_msg_if_player( _( "You cut the log into planks." ) ); p.assign_activity( activity_id( "ACT_CHOP_PLANKS" ), moves, -1 ); - p.activity.placement = p.pos(); + p.activity.placement = g->m.getabs( p.pos() ); } int iuse::lumber( player *p, item *it, bool t, const tripoint & ) @@ -4589,32 +4679,35 @@ int iuse::chop_tree( player *p, item *it, bool t, const tripoint & ) p->add_msg_if_player( m_info, _( "You cannot do that while mounted." ) ); return 0; } - const cata::optional pnt_ = choose_adjacent( _( "Chop down which tree?" ) ); - if( !pnt_ ) { - return 0; - } - const tripoint pnt = *pnt_; + const std::function f = []( const tripoint & pnt ) { + if( pnt == g->u.pos() ) { + return false; + } + return g->m.has_flag( "TREE", pnt ); + }; - if( pnt == p->pos() ) { - p->add_msg_if_player( m_info, _( "You're not stern enough to shave yourself with THIS." ) ); + const cata::optional pnt_ = choose_adjacent_highlight( + _( "Chop down which tree?" ), f, false, true ); + if( !pnt_ ) { return 0; } - - int moves; - - if( g->m.has_flag( "TREE", pnt ) ) { - moves = chop_moves( p, it ); - } else { - p->add_msg_if_player( m_info, _( "You can't chop down that." ) ); + const tripoint &pnt = *pnt_; + if( !f( pnt ) ) { + if( pnt == p->pos() ) { + p->add_msg_if_player( m_info, _( "You're not stern enough to shave yourself with THIS." ) ); + } else { + p->add_msg_if_player( m_info, _( "You can't chop down that." ) ); + } return 0; } + int moves = chop_moves( p, it ); const std::vector helpers = g->u.get_crafting_helpers(); for( const npc *np : helpers ) { add_msg( m_info, _( "%s helps with this task..." ), np->name ); break; } p->assign_activity( activity_id( "ACT_CHOP_TREE" ), moves, -1, p->get_item_position( it ) ); - p->activity.placement = pnt; + p->activity.placement = g->m.getabs( pnt ); return it->type->charges_to_use(); } @@ -4628,28 +4721,36 @@ int iuse::chop_logs( player *p, item *it, bool t, const tripoint & ) p->add_msg_if_player( m_info, _( "You cannot do that while mounted." ) ); return 0; } - const cata::optional pnt_ = choose_adjacent( _( "Chop which tree trunk?" ) ); + + const std::set allowed_ter_id { + t_trunk, + t_stump + }; + const std::function f = [&allowed_ter_id]( const tripoint & pnt ) { + const ter_id type = g->m.ter( pnt ); + const bool is_allowed_terrain = allowed_ter_id.find( type ) != allowed_ter_id.end(); + return is_allowed_terrain; + }; + + const cata::optional pnt_ = choose_adjacent_highlight( + _( "Chop which tree trunk?" ), f, false, true ); if( !pnt_ ) { return 0; } - const tripoint pnt = *pnt_; - - int moves; - - const ter_id ter = g->m.ter( pnt ); - if( ter == t_trunk || ter == t_stump ) { - moves = chop_moves( p, it ); - } else { + const tripoint &pnt = *pnt_; + if( !f( pnt ) ) { p->add_msg_if_player( m_info, _( "You can't chop that." ) ); return 0; } + + int moves = chop_moves( p, it ); const std::vector helpers = g->u.get_crafting_helpers(); for( const npc *np : helpers ) { add_msg( m_info, _( "%s helps with this task..." ), np->name ); break; } p->assign_activity( activity_id( "ACT_CHOP_LOGS" ), moves, -1, p->get_item_position( it ) ); - p->activity.placement = pnt; + p->activity.placement = g->m.getabs( pnt ); return it->type->charges_to_use(); } @@ -4670,21 +4771,58 @@ int iuse::oxytorch( player *p, item *it, bool, const tripoint & ) return 0; } - const cata::optional pnt_ = choose_adjacent( _( "Cut up metal where?" ) ); + const std::set allowed_ter_id { + t_chainfence_posts, + t_window_enhanced, + t_window_enhanced_noglass, + t_chainfence, + t_chaingate_c, + t_chaingate_l, + t_bars, + t_window_bars_alarm, + t_window_bars, + t_reb_cage, + t_door_metal_locked, + t_door_metal_c, + t_door_bar_c, + t_door_bar_locked, + t_door_metal_pickable + }; + const std::set allowed_furn_id { + f_rack + }; + + const std::function f = [&allowed_ter_id, + &allowed_furn_id]( const tripoint & pnt ) { + if( pnt == g->u.pos() ) { + return false; + } + const ter_id ter = g->m.ter( pnt ); + const auto furn = g->m.furn( pnt ); + + const bool is_allowed = ( allowed_ter_id.find( ter ) != allowed_ter_id.end() ) || + ( allowed_furn_id.find( furn ) != allowed_furn_id.end() ) ; + return is_allowed; + }; + + const cata::optional pnt_ = choose_adjacent_highlight( + _( "Cut up metal where?" ), f, false, true ); if( !pnt_ ) { return 0; } - const tripoint pnt = *pnt_; - - if( pnt == p->pos() ) { - add_msg( m_info, _( "Yuck. Acetylene gas smells weird." ) ); + const tripoint &pnt = *pnt_; + const ter_id ter = g->m.ter( pnt ); + const furn_id furn = g->m.furn( pnt ); + if( !f( pnt ) ) { + if( pnt == p->pos() ) { + p->add_msg_if_player( m_info, _( "Yuck. Acetylene gas smells weird." ) ); + } else { + p->add_msg_if_player( m_info, _( "You can't cut that." ) ); + } return 0; } - const ter_id ter = g->m.ter( pnt ); - const auto furn = g->m.furn( pnt ); int turns = 0; - if( furn == f_rack || ter == t_chainfence_posts ) { turns = to_turns( 2_seconds ); } else if( ter == t_window_enhanced || ter == t_window_enhanced_noglass ) { @@ -4697,7 +4835,6 @@ int iuse::oxytorch( player *p, item *it, bool, const tripoint & ) ter == t_door_bar_locked || ter == t_door_metal_pickable ) { turns = to_turns( 15_seconds ); } else { - p->add_msg_if_player( m_info, _( "You can't cut that." ) ); return 0; } @@ -4728,21 +4865,54 @@ int iuse::hacksaw( player *p, item *it, bool t, const tripoint & ) p->add_msg_if_player( m_info, _( "You cannot do that while mounted." ) ); return 0; } - const cata::optional pnt_ = choose_adjacent( _( "Cut up metal where?" ) ); + const std::set allowed_ter_id { + t_chainfence_posts, + t_window_enhanced, + t_window_enhanced_noglass, + t_chainfence, + t_chaingate_c, + t_chaingate_l, + t_window_bars_alarm, + t_window_bars, + t_reb_cage, + t_door_bar_c, + t_door_bar_locked, + t_bars + }; + const std::set allowed_furn_id { + f_rack + }; + const std::function f = [&allowed_ter_id, + &allowed_furn_id]( const tripoint & pnt ) { + if( pnt == g->u.pos() ) { + return false; + } + const ter_id ter = g->m.ter( pnt ); + const auto furn = g->m.furn( pnt ); + + const bool is_allowed = ( allowed_ter_id.find( ter ) != allowed_ter_id.end() ) || + ( allowed_furn_id.find( furn ) != allowed_furn_id.end() ) ; + return is_allowed; + }; + + const cata::optional pnt_ = choose_adjacent_highlight( + _( "Cut up metal where?" ), f, false, true ); if( !pnt_ ) { return 0; } - const tripoint pnt = *pnt_; - - if( pnt == p->pos() ) { - add_msg( m_info, _( "Why would you do that?" ) ); - p->add_msg_if_player( m_info, _( "You're not even chained to a boiler." ) ); + const tripoint &pnt = *pnt_; + const ter_id ter = g->m.ter( pnt ); + if( !f( pnt ) ) { + if( pnt == p->pos() ) { + p->add_msg_if_player( m_info, _( "Why would you do that?" ) ); + p->add_msg_if_player( m_info, _( "You're not even chained to a boiler." ) ); + } else { + p->add_msg_if_player( m_info, _( "You can't cut that." ) ); + } return 0; } - const ter_id ter = g->m.ter( pnt ); int moves; - if( ter == t_chainfence_posts || g->m.furn( pnt ) == f_rack ) { moves = to_moves( 2_minutes ); } else if( ter == t_window_enhanced || ter == t_window_enhanced_noglass ) { @@ -4753,7 +4923,6 @@ int iuse::hacksaw( player *p, item *it, bool t, const tripoint & ) } else if( ter == t_door_bar_c || ter == t_door_bar_locked || ter == t_bars ) { moves = to_moves( 15_minutes ); } else { - p->add_msg_if_player( m_info, _( "You can't cut that." ) ); return 0; } @@ -4770,32 +4939,51 @@ int iuse::boltcutters( player *p, item *it, bool, const tripoint & ) p->add_msg_if_player( m_info, _( "You cannot do that while mounted." ) ); return 0; } - const cata::optional pnt_ = choose_adjacent( _( "Cut up metal where?" ) ); + const std::set allowed_ter_id { + t_chaingate_l, + t_chainfence + }; + const std::function f = [&allowed_ter_id]( const tripoint & pnt ) { + if( pnt == g->u.pos() ) { + return false; + } + const ter_id ter = g->m.ter( pnt ); + const bool is_allowed = allowed_ter_id.find( ter ) != allowed_ter_id.end(); + return is_allowed; + }; + + const cata::optional pnt_ = choose_adjacent_highlight( + _( "Cut up metal where?" ), f, false, true ); if( !pnt_ ) { return 0; } - const tripoint pnt = *pnt_; - - if( pnt == p->pos() ) { - p->add_msg_if_player( - _( "You neatly sever all of the veins and arteries in your body. Oh wait, Never mind." ) ); + const tripoint &pnt = *pnt_; + const ter_id type = g->m.ter( pnt ); + if( !f( pnt ) ) { + if( pnt == p->pos() ) { + p->add_msg_if_player( m_info, + _( "You neatly sever all of the veins and arteries in your body. Oh wait, Never mind." ) ); + } else { + p->add_msg_if_player( m_info, _( "You can't cut that." ) ); + } return 0; } - if( g->m.ter( pnt ) == t_chaingate_l ) { + + if( type == t_chaingate_l ) { p->moves -= to_moves( 1_seconds ); g->m.ter_set( pnt, t_chaingate_c ); sounds::sound( pnt, 5, sounds::sound_t::combat, _( "Gachunk!" ), true, "tool", "boltcutters" ); g->m.spawn_item( point( p->posx(), p->posy() ), "scrap", 3 ); - } else if( g->m.ter( pnt ) == t_chainfence ) { + } else if( type == t_chainfence ) { p->moves -= to_moves( 5_seconds ); g->m.ter_set( pnt, t_chainfence_posts ); sounds::sound( pnt, 5, sounds::sound_t::combat, _( "Snick, snick, gachunk!" ), true, "tool", "boltcutters" ); g->m.spawn_item( pnt, "wire", 20 ); } else { - p->add_msg_if_player( m_info, _( "You can't cut that." ) ); return 0; } + return it->type->charges_to_use(); } @@ -4805,15 +4993,67 @@ int iuse::mop( player *p, item *it, bool, const tripoint & ) p->add_msg_if_player( m_info, _( "You cannot do that while mounted." ) ); return 0; } - const cata::optional pnt_ = choose_adjacent( _( "Mop where?" ) ); + const std::vector to_check = { + fd_blood, + fd_blood_veggy, + fd_blood_insect, + fd_blood_invertebrate, + fd_gibs_flesh, + fd_gibs_veggy, + fd_gibs_insect, + fd_gibs_invertebrate, + fd_bile, + fd_slime, + fd_sludge + }; + const std::function f = [&to_check]( const tripoint & pnt ) { + if( !g->m.has_flag( "LIQUIDCONT", pnt ) ) { + map_stack items = g->m.i_at( pnt ); + auto found = std::find_if( items.begin(), items.end(), []( const item & it ) { + return it.made_of( LIQUID ); + } ); + if( found != items.end() ) { + return true; + } + } + field &fld = g->m.field_at( pnt ); + for( field_type_id fid : to_check ) { + if( fld.find_field_c( fid ) ) { + return true; + } + } + if( const optional_vpart_position vp = g->m.veh_at( pnt ) ) { + vehicle *const veh = &vp->vehicle(); + std::vector parts_here = veh->parts_at_relative( vp->mount(), true ); + for( int elem : parts_here ) { + if( veh->parts[elem].blood > 0 ) { + return true; + } + vehicle_stack items = veh->get_items( elem ); + auto found = std::find_if( items.begin(), items.end(), []( const item & it ) { + return it.made_of( LIQUID ); + } ); + if( found != items.end() ) { + return true; + } + } + } + return false; + }; + + const cata::optional pnt_ = choose_adjacent_highlight( + _( "Mop where?" ), f, false, true ); if( !pnt_ ) { return 0; } - const tripoint pnt = *pnt_; - - if( pnt == p->pos() ) { - p->add_msg_if_player( _( "You mop yourself up." ) ); - p->add_msg_if_player( _( "The universe implodes and reforms around you." ) ); + const tripoint &pnt = *pnt_; + if( !f( pnt ) ) { + if( pnt == p->pos() ) { + p->add_msg_if_player( m_info, _( "You mop yourself up." ) ); + p->add_msg_if_player( m_info, _( "The universe implodes and reforms around you." ) ); + } else { + p->add_msg_if_player( m_bad, _( "There's nothing to mop there." ) ); + } return 0; } if( p->is_blind() ) { @@ -4826,7 +5066,6 @@ int iuse::mop( player *p, item *it, bool, const tripoint & ) p->add_msg_if_player( m_info, _( "You mop up the spill." ) ); p->moves -= 15; } else { - p->add_msg_if_player( m_info, _( "There's nothing to mop there." ) ); return 0; } return it->type->charges_to_use(); @@ -4848,12 +5087,7 @@ int iuse::artifact( player *p, item *it, bool, const tripoint & ) it->tname() ); return 0; } - if( !p->is_npc() ) { - //~ %s is artifact name - p->add_memorial_log( pgettext( "memorial_male", "Activated the %s." ), - pgettext( "memorial_female", "Activated the %s." ), - it->tname( 1, false ) ); - } + g->events().send( p->getID(), it->tname( 1, false ) ); const auto &art = it->type->artifact; size_t num_used = rng( 1, art->effects_activated.size() ); @@ -5427,7 +5661,7 @@ int iuse::unfold_generic( player *p, item *it, bool, const tripoint & ) g->m.veh_at( pp ) || g->m.impassable( pp ); }; for( const vpart_reference &vp : veh->get_all_parts() ) { - if( vp.info().location != "STRUCTURE" ) { + if( vp.info().location != "structure" ) { continue; } const tripoint pp = vp.pos(); @@ -5446,8 +5680,7 @@ int iuse::unfold_generic( player *p, item *it, bool, const tripoint & ) } else { unfold_msg = _( unfold_msg ); } - faction *yours = g->faction_manager_ptr->get( faction_id( "your_followers" ) ); - veh->set_owner( yours ); + veh->set_owner( g->u.get_faction() ); p->add_msg_if_player( m_neutral, unfold_msg, veh->name ); p->moves -= it->get_var( "moves", to_turns( 5_seconds ) ); @@ -6713,46 +6946,46 @@ static std::string effects_description_for_creature( Creature *const creature, s const std::string &pronoun_sex ) { struct ef_con { // effect constraint - std::string status; - std::string pose; + translation status; + translation pose; int intensity_lower_limit; - ef_con( std::string status, std::string pose, int intensity_lower_limit ) : + ef_con( const translation &status, const translation &pose, int intensity_lower_limit ) : status( status ), pose( pose ), intensity_lower_limit( intensity_lower_limit ) {} - ef_con( std::string status, std::string pose ) : + ef_con( const translation &status, const translation &pose ) : status( status ), pose( pose ), intensity_lower_limit( 0 ) {} - ef_con( std::string status, int intensity_lower_limit ) : + ef_con( const translation &status, int intensity_lower_limit ) : status( status ), intensity_lower_limit( intensity_lower_limit ) {} - ef_con( std::string status ) : + ef_con( const translation &status ) : status( status ), intensity_lower_limit( 0 ) {} }; static const std::unordered_map vec_effect_status = { - { effect_onfire, ef_con( _( " is on fire. " ) ) }, - { effect_bleed, ef_con( _( " is bleeding. " ), 1 ) }, - { effect_happy, ef_con( _( " looks happy. " ), 13 ) }, - { effect_downed, ef_con( "", _( "downed" ) ) }, - { effect_in_pit, ef_con( "", _( "stuck" ) ) }, - { effect_stunned, ef_con( _( " is stunned. " ) ) }, - { effect_dazed, ef_con( _( " is dazed. " ) ) }, - { effect_beartrap, ef_con( _( " is stuck in beartrap. " ) ) }, - { effect_laserlocked, ef_con( _( " have tiny red dot on body. " ) ) }, - { effect_boomered, ef_con( _( " is covered in bile. " ) ) }, - { effect_glowing, ef_con( _( " is covered in glowing goo. " ) ) }, - { effect_slimed, ef_con( _( " is covered in thick goo. " ) ) }, - { effect_corroding, ef_con( _( " is covered in acid. " ) ) }, - { effect_sap, ef_con( _( " is coated in sap. " ) ) }, - { effect_webbed, ef_con( _( " is covered in webs. " ) ) }, - { effect_spores, ef_con( _( " is covered in spores. " ), 1 ) }, - { effect_crushed, ef_con( _( " lies under collapsed debris. " ), _( "lies" ) ) }, - { effect_lack_sleep, ef_con( _( " looks very tired. " ) ) }, - { effect_lying_down, ef_con( _( " is sleeping. " ), _( "lies" ) ) }, - { effect_sleep, ef_con( _( " is sleeping. " ), _( "lies" ) ) }, - { effect_haslight, ef_con( _( " is lit. " ) ) }, - { effect_saddled, ef_con( _( " is saddled. " ) ) }, - { effect_harnessed, ef_con( _( " is being harnessed by a vehicle. " ) ) }, - { effect_monster_armor, ef_con( _( " is wearing armor. " ) ) }, - { effect_has_bag, ef_con( _( " have bag attached. " ) ) }, - { effect_tied, ef_con( _( " is tied. " ) ) }, - { effect_bouldering, ef_con( "", _( "balancing" ) ) } + { effect_onfire, ef_con( to_translation( " is on fire. " ) ) }, + { effect_bleed, ef_con( to_translation( " is bleeding. " ), 1 ) }, + { effect_happy, ef_con( to_translation( " looks happy. " ), 13 ) }, + { effect_downed, ef_con( translation(), to_translation( "downed" ) ) }, + { effect_in_pit, ef_con( translation(), to_translation( "stuck" ) ) }, + { effect_stunned, ef_con( to_translation( " is stunned. " ) ) }, + { effect_dazed, ef_con( to_translation( " is dazed. " ) ) }, + { effect_beartrap, ef_con( to_translation( " is stuck in beartrap. " ) ) }, + { effect_laserlocked, ef_con( to_translation( " have tiny red dot on body. " ) ) }, + { effect_boomered, ef_con( to_translation( " is covered in bile. " ) ) }, + { effect_glowing, ef_con( to_translation( " is covered in glowing goo. " ) ) }, + { effect_slimed, ef_con( to_translation( " is covered in thick goo. " ) ) }, + { effect_corroding, ef_con( to_translation( " is covered in acid. " ) ) }, + { effect_sap, ef_con( to_translation( " is coated in sap. " ) ) }, + { effect_webbed, ef_con( to_translation( " is covered in webs. " ) ) }, + { effect_spores, ef_con( to_translation( " is covered in spores. " ), 1 ) }, + { effect_crushed, ef_con( to_translation( " lies under collapsed debris. " ), to_translation( "lies" ) ) }, + { effect_lack_sleep, ef_con( to_translation( " looks very tired. " ) ) }, + { effect_lying_down, ef_con( to_translation( " is sleeping. " ), to_translation( "lies" ) ) }, + { effect_sleep, ef_con( to_translation( " is sleeping. " ), to_translation( "lies" ) ) }, + { effect_haslight, ef_con( to_translation( " is lit. " ) ) }, + { effect_saddled, ef_con( to_translation( " is saddled. " ) ) }, + { effect_harnessed, ef_con( to_translation( " is being harnessed by a vehicle. " ) ) }, + { effect_monster_armor, ef_con( to_translation( " is wearing armor. " ) ) }, + { effect_has_bag, ef_con( to_translation( " have bag attached. " ) ) }, + { effect_tied, ef_con( to_translation( " is tied. " ) ) }, + { effect_bouldering, ef_con( translation(), to_translation( "balancing" ) ) } }; std::string figure_effects; @@ -6763,7 +6996,7 @@ static std::string effects_description_for_creature( Creature *const creature, s figure_effects += pronoun_sex + pair.second.status; } if( !pair.second.pose.empty() ) { - pose = pair.second.pose; + pose = pair.second.pose.translated(); } } } @@ -8185,9 +8418,8 @@ int iuse::autoclave( player *p, item *it, bool t, const tripoint &pos ) it->active = false; it->erase_var( "CYCLETIME" ); for( item &bio : it->contents ) { - if( bio.is_bionic() ) { + if( bio.is_bionic() && !bio.has_flag( "NO_PACKED" ) ) { bio.unset_flag( "NO_STERILE" ); - bio.set_var( "sterile", 1 ); // sterile for 1s if not (packed); } } } else { @@ -8579,6 +8811,7 @@ int iuse::cable_attach( player *p, item *it, bool, const tripoint & ) const bool has_solar_pack = p->is_wearing( "solarpack" ) || p->is_wearing( "q_solarpack" ); const bool has_solar_pack_on = p->is_wearing( "solarpack_on" ) || p->is_wearing( "q_solarpack_on" ); const bool wearing_solar_pack = has_solar_pack || has_solar_pack_on; + const bool has_ups = p->has_charges( "UPS_off", 1 ) || p->has_charges( "adv_UPS_off", 1 ); const auto set_cable_active = []( player * p, item * it, const std::string & state ) { it->set_var( "state", state ); @@ -8595,6 +8828,9 @@ int iuse::cable_attach( player *p, item *it, bool, const tripoint & ) if( wearing_solar_pack ) { kmenu.addentry( 2, has_solar_pack_on, -1, _( "Attach cable to solar pack" ) ); } + if( has_ups ) { + kmenu.addentry( 3, true, -1, _( "Attach cable to UPS" ) ); + } kmenu.query(); int choice = kmenu.ret; @@ -8602,9 +8838,25 @@ int iuse::cable_attach( player *p, item *it, bool, const tripoint & ) return 0; // we did nothing. } else if( choice == 1 ) { set_cable_active( p, it, "cable_charger" ); + p->add_msg_if_player( m_info, _( "You attach the cable to your Cable Charger System." ) ); return 0; } else if( choice == 2 ) { set_cable_active( p, it, "solar_pack" ); + p->add_msg_if_player( m_info, _( "You attach the cable to the solar pack." ) ); + return 0; + } else if( choice == 3 ) { + int pos = g->inv_for_filter( _( "Choose UPS:" ), [&]( const item & itm ) { + return itm.has_flag( "IS_UPS" ); + }, _( "You don't have any UPS." ) ); + if( pos == INT_MIN ) { + add_msg( _( "Never mind" ) ); + return 0; + } + item &chosen = p->i_at( pos ); + chosen.set_var( "cable", "plugged_in" ); + chosen.activate(); + set_cable_active( p, it, "UPS" ); + p->add_msg_if_player( m_info, _( "You attach the cable to the UPS." ) ); return 0; } // fall through for attaching to a vehicle @@ -8646,16 +8898,21 @@ int iuse::cable_attach( player *p, item *it, bool, const tripoint & ) const bool paying_out = initial_state == "pay_out_cable"; const bool cable_cbm = initial_state == "cable_charger"; const bool solar_pack = initial_state == "solar_pack"; - bool loose_ends = paying_out || cable_cbm || solar_pack; + const bool UPS = initial_state == "UPS"; + bool loose_ends = paying_out || cable_cbm || solar_pack || UPS; uilist kmenu; kmenu.text = _( "Using cable:" ); - kmenu.addentry( 0, paying_out || cable_cbm, -1, _( "Attach loose end of the cable" ) ); - kmenu.addentry( 1, true, -1, _( "Detach and re-spool the cable" ) ); + kmenu.addentry( 0, true, -1, _( "Detach and re-spool the cable" ) ); + kmenu.addentry( 1, ( paying_out || cable_cbm ) && !solar_pack && + !UPS, -1, _( "Attach loose end to vehicle" ) ); + if( has_bio_cable && loose_ends ) { - kmenu.addentry( 2, !cable_cbm, -1, _( "Attach cable to self" ) ); - // can't attach solar backpacks to cars - if( wearing_solar_pack && cable_cbm ) { - kmenu.addentry( 3, has_solar_pack_on, -1, _( "Attach cable to solar pack" ) ); + kmenu.addentry( 2, !cable_cbm, -1, _( "Attach loose end to self" ) ); + if( wearing_solar_pack ) { + kmenu.addentry( 3, !solar_pack && !paying_out && !UPS, -1, _( "Attach loose end to solar pack" ) ); + } + if( has_ups ) { + kmenu.addentry( 4, !UPS && !solar_pack && !paying_out, -1, _( "Attach loose end to UPS" ) ); } } kmenu.query(); @@ -8663,26 +8920,52 @@ int iuse::cable_attach( player *p, item *it, bool, const tripoint & ) if( choice < 0 ) { return 0; // we did nothing. - } else if( choice == 1 ) { + } else if( choice == 0 ) { // unconnect & respool it->reset_cable( p ); return 0; - } else if( choice == 2 ) { - // connecting self to backpack or car + } else if( choice == 2 ) { // connect self while other end already connected + p->add_msg_if_player( m_info, _( "You attach the cable to the Cable Charger System." ) ); + // connecting self, solar backpack connected if( solar_pack ) { set_cable_active( p, it, "solar_pack_link" ); + p->add_msg_if_player( m_good, _( "You are now plugged to the solar backpack." ) ); + return 0; + } + // connecting self, UPS connected + if( UPS ) { + set_cable_active( p, it, "UPS_link" ); + p->add_msg_if_player( m_good, _( "You are now plugged to the UPS." ) ); return 0; } + // connecting self, vehicle connected const optional_vpart_position source_vp = confirm_source_vehicle( p, it, true ); if( veh_pointer_or_null( source_vp ) != nullptr ) { set_cable_active( p, it, "cable_charger_link" ); + p->add_msg_if_player( m_good, _( "You are now plugged to the vehicle." ) ); } return 0; } else if( choice == 3 ) { - // connecting self to backpack + // connecting self to solar backpack set_cable_active( p, it, "solar_pack_link" ); + p->add_msg_if_player( m_good, _( "You are now plugged to the solar backpack." ) ); + return 0; + } else if( choice == 4 ) { + // connecting self to UPS + int pos = g->inv_for_filter( _( "Choose UPS:" ), [&]( const item & itm ) { + return itm.has_flag( "IS_UPS" ); + }, _( "You don't have any UPS." ) ); + if( pos == INT_MIN ) { + add_msg( _( "Never mind" ) ); + return 0; + } + item &chosen = p->i_at( pos ); + chosen.set_var( "cable", "plugged_in" ); + chosen.activate(); + set_cable_active( p, it, "UPS_link" ); + p->add_msg_if_player( m_good, _( "You are now plugged to the UPS." ) ); return 0; } - + // connecting self to vehicle const optional_vpart_position source_vp = confirm_source_vehicle( p, it, paying_out ); vehicle *const source_veh = veh_pointer_or_null( source_vp ); if( source_veh == nullptr && paying_out ) { @@ -8705,6 +8988,7 @@ int iuse::cable_attach( player *p, item *it, bool, const tripoint & ) it->set_var( "source_y", abspos.y ); it->set_var( "source_z", g->get_levz() ); set_cable_active( p, it, "cable_charger_link" ); + p->add_msg_if_player( m_good, _( "You are now plugged to the vehicle." ) ); return 0; } else { vehicle *const target_veh = &target_vp->vehicle(); @@ -9454,23 +9738,6 @@ int iuse::magic_8_ball( player *p, item *it, bool, const tripoint & ) return 0; } -use_function::use_function( const use_function &other ) - : actor( other.actor ? other.actor->clone() : nullptr ) -{ -} - -use_function &use_function::operator=( iuse_actor *const f ) -{ - *this = use_function( f ); - return *this; -} - -use_function &use_function::operator=( const use_function &other ) -{ - actor.reset( other.actor ? other.actor->clone() : nullptr ); - return *this; -} - void use_function::dump_info( const item &it, std::vector &dump ) const { if( actor != nullptr ) { diff --git a/src/iuse.h b/src/iuse.h index b2d8b4bed95ba..754ee4e0df6e9 100644 --- a/src/iuse.h +++ b/src/iuse.h @@ -6,6 +6,7 @@ #include #include +#include "clone_ptr.h" #include "units.h" class item; @@ -252,7 +253,6 @@ using use_function_pointer = int ( iuse::* )( player *, item *, bool, const trip class iuse_actor { - protected: iuse_actor( const std::string &type, int cost = -1 ) : type( type ), cost( cost ) {} @@ -275,14 +275,14 @@ class iuse_actor * Returns a deep copy of this object. Example implementation: * \code * class my_iuse_actor { - * iuse_actor *clone() const override { - * return new my_iuse_actor( *this ); + * std::unique_ptr clone() const override { + * return std::make_unique( *this ); * } * }; * \endcode * The returned value should behave like the original item and must have the same type. */ - virtual iuse_actor *clone() const = 0; + virtual std::unique_ptr clone() const = 0; /** * Returns whether the actor is valid (exists in the generator). */ @@ -299,21 +299,21 @@ class iuse_actor struct use_function { protected: - std::unique_ptr actor; + cata::clone_ptr actor; public: use_function() = default; use_function( const std::string &type, use_function_pointer f ); - use_function( iuse_actor *f ) : actor( f ) {} - use_function( use_function && ) = default; - use_function( const use_function &other ); - - ~use_function() = default; + use_function( std::unique_ptr f ) : actor( std::move( f ) ) {} int call( player &, item &, bool, const tripoint & ) const; - ret_val can_call( const player &p, const item &it, bool t, const tripoint &pos ) const; + ret_val can_call( const player &, const item &, bool t, const tripoint &pos ) const; + + iuse_actor *get_actor_ptr() { + return actor.get(); + } - iuse_actor *get_actor_ptr() const { + const iuse_actor *get_actor_ptr() const { return actor.get(); } @@ -327,10 +327,6 @@ struct use_function { std::string get_name() const; /** @return Used by @ref item::info to get description of the actor */ void dump_info( const item &, std::vector & ) const; - - use_function &operator=( iuse_actor *f ); - use_function &operator=( use_function && ) = default; - use_function &operator=( const use_function &other ); }; #endif diff --git a/src/iuse_actor.cpp b/src/iuse_actor.cpp index 210a2f63c427e..7fcf4b9b51a4b 100644 --- a/src/iuse_actor.cpp +++ b/src/iuse_actor.cpp @@ -118,9 +118,9 @@ static const trait_id trait_MUT_JUNKIE( "MUT_JUNKIE" ); static const bionic_id bio_syringe( "bio_syringe" ); -iuse_actor *iuse_transform::clone() const +std::unique_ptr iuse_transform::clone() const { - return new iuse_transform( *this ); + return std::make_unique( *this ); } void iuse_transform::load( JsonObject &obj ) @@ -257,7 +257,7 @@ ret_val iuse_transform::can_use( const player &p, const item &, bool, { std::map unmet_reqs; inventory inv; - inv.form_from_map( p.pos(), 1 ); + inv.form_from_map( p.pos(), 1, &p, true, true ); for( const auto &quality : qualities_needed ) { if( !p.has_quality( quality.first, quality.second ) && !inv.has_quality( quality.first, quality.second ) ) { @@ -317,9 +317,9 @@ void iuse_transform::info( const item &it, std::vector &dump ) const } } -iuse_actor *countdown_actor::clone() const +std::unique_ptr countdown_actor::clone() const { - return new countdown_actor( *this ); + return std::make_unique( *this ); } void countdown_actor::load( JsonObject &obj ) @@ -376,9 +376,9 @@ void countdown_actor::info( const item &it, std::vector &dump ) const } } -iuse_actor *explosion_iuse::clone() const +std::unique_ptr explosion_iuse::clone() const { - return new explosion_iuse( *this ); + return std::make_unique( *this ); } // For an explosion (which releases some kind of gas), this function @@ -501,9 +501,9 @@ void explosion_iuse::info( const item &, std::vector &dump ) const } } -iuse_actor *unfold_vehicle_iuse::clone() const +std::unique_ptr unfold_vehicle_iuse::clone() const { - return new unfold_vehicle_iuse( *this ); + return std::make_unique( *this ); } void unfold_vehicle_iuse::load( JsonObject &obj ) @@ -538,8 +538,7 @@ int unfold_vehicle_iuse::use( player &p, item &it, bool /*t*/, const tripoint &/ p.add_msg_if_player( m_info, _( "There's no room to unfold the %s." ), it.tname() ); return 0; } - faction *yours = g->faction_manager_ptr->get( faction_id( "your_followers" ) ); - veh->set_owner( yours ); + veh->set_owner( g->u.get_faction() ); // Mark the vehicle as foldable. veh->tags.insert( "convertible" ); @@ -589,9 +588,9 @@ int unfold_vehicle_iuse::use( player &p, item &it, bool /*t*/, const tripoint &/ return 1; } -iuse_actor *consume_drug_iuse::clone() const +std::unique_ptr consume_drug_iuse::clone() const { - return new consume_drug_iuse( *this ); + return std::make_unique( *this ); } static effect_data load_effect_data( JsonObject &e ) @@ -729,9 +728,9 @@ int consume_drug_iuse::use( player &p, item &it, bool, const tripoint & ) const return it.type->charges_to_use(); } -iuse_actor *delayed_transform_iuse::clone() const +std::unique_ptr delayed_transform_iuse::clone() const { - return new delayed_transform_iuse( *this ); + return std::make_unique( *this ); } void delayed_transform_iuse::load( JsonObject &obj ) @@ -756,9 +755,9 @@ int delayed_transform_iuse::use( player &p, item &it, bool t, const tripoint &po return iuse_transform::use( p, it, t, pos ); } -iuse_actor *place_monster_iuse::clone() const +std::unique_ptr place_monster_iuse::clone() const { - return new place_monster_iuse( *this ); + return std::make_unique( *this ); } void place_monster_iuse::load( JsonObject &obj ) @@ -859,9 +858,9 @@ int place_monster_iuse::use( player &p, item &it, bool, const tripoint &/*pos*/ return 1; } -iuse_actor *ups_based_armor_actor::clone() const +std::unique_ptr ups_based_armor_actor::clone() const { - return new ups_based_armor_actor( *this ); + return std::make_unique( *this ); } void ups_based_armor_actor::load( JsonObject &obj ) @@ -917,9 +916,9 @@ int ups_based_armor_actor::use( player &p, item &it, bool t, const tripoint & ) return 0; } -iuse_actor *pick_lock_actor::clone() const +std::unique_ptr pick_lock_actor::clone() const { - return new pick_lock_actor( *this ); + return std::make_unique( *this ); } void pick_lock_actor::load( JsonObject &obj ) @@ -938,7 +937,7 @@ int pick_lock_actor::use( player &p, item &it, bool, const tripoint & ) const return 0; } - std::set allowed_ter_id { + const std::set allowed_ter_id { t_chaingate_l, t_door_locked, t_door_locked_alarm, @@ -947,50 +946,36 @@ int pick_lock_actor::use( player &p, item &it, bool, const tripoint & ) const t_door_metal_pickable, t_door_bar_locked }; - - cata::optional pnt_; - //select adjacent point with locked door, but only if it is the only one - bool found = false; - for( const tripoint &pos : g->m.points_in_radius( p.pos(), 1 ) ) { - if( pos == g->u.pos() ) { - continue; - } - const ter_id type = g->m.ter( pos ); - //is allowed? - if( allowed_ter_id.find( type ) != allowed_ter_id.end() ) { - if( pnt_ ) { - //found more that one - pnt_.reset(); - break; - } - pnt_ = pos; - found = true; + const std::function f = [&allowed_ter_id]( const tripoint & pnt ) { + if( pnt == g->u.pos() ) { + return false; } - } - if( !found ) { - p.add_msg_if_player( m_info, _( "No lock to pick." ) ); - return 0; - } - if( !pnt_ ) { - pnt_ = choose_adjacent( _( "Use your lockpick where?" ) ); - } + const ter_id type = g->m.ter( pnt ); + const bool is_allowed_terrain = allowed_ter_id.find( type ) != allowed_ter_id.end(); + return is_allowed_terrain; + }; + const cata::optional pnt_ = choose_adjacent_highlight( + _( "Use your lockpick where?" ), f, false, true ); if( !pnt_ ) { return 0; } - const tripoint pnt = *pnt_; - - if( pnt == p.pos() ) { - p.add_msg_if_player( m_info, _( "You pick your nose and your sinuses swing open." ) ); - return 0; - } - if( g->critter_at( pnt ) ) { - p.add_msg_if_player( m_info, - _( "You can pick your friends, and you can\npick your nose, but you can't pick\nyour friend's nose" ) ); + const tripoint &pnt = *pnt_; + const ter_id type = g->m.ter( pnt ); + if( !f( pnt ) ) { + if( pnt == p.pos() ) { + p.add_msg_if_player( m_info, _( "You pick your nose and your sinuses swing open." ) ); + } else if( g->critter_at( pnt ) ) { + p.add_msg_if_player( m_info, + _( "You can pick your friends, and you can\npick your nose, but you can't pick\nyour friend's nose" ) ); + } else if( type == t_door_c ) { + p.add_msg_if_player( m_info, _( "That door isn't locked." ) ); + } else { + p.add_msg_if_player( m_info, _( "That cannot be picked." ) ); + } return 0; } - const ter_id type = g->m.ter( pnt ); ter_id new_type; std::string open_message; if( type == t_chaingate_l ) { @@ -1010,14 +995,9 @@ int pick_lock_actor::use( player &p, item &it, bool, const tripoint & ) const new_type = t_door_bar_o; //Bar doors auto-open (and lock if closed again) so show a different message) open_message = _( "The door swings open..." ); - } else if( type == t_door_c ) { - add_msg( m_info, _( "That door isn't locked." ) ); - return 0; } else { - add_msg( m_info, _( "That cannot be picked." ) ); return 0; } - p.practice( skill_mechanics, 1 ); /** @EFFECT_DEX speeds up door lock picking */ @@ -1063,9 +1043,9 @@ int pick_lock_actor::use( player &p, item &it, bool, const tripoint & ) const return it.type->charges_to_use(); } -iuse_actor *deploy_furn_actor::clone() const +std::unique_ptr deploy_furn_actor::clone() const { - return new deploy_furn_actor( *this ); + return std::make_unique( *this ); } void deploy_furn_actor::info( const item &, std::vector &dump ) const @@ -1162,9 +1142,9 @@ int deploy_furn_actor::use( player &p, item &it, bool, const tripoint &pos ) con return 1; } -iuse_actor *reveal_map_actor::clone() const +std::unique_ptr reveal_map_actor::clone() const { - return new reveal_map_actor( *this ); + return std::make_unique( *this ); } void reveal_map_actor::load( JsonObject &obj ) @@ -1233,9 +1213,9 @@ void firestarter_actor::load( JsonObject &obj ) need_sunlight = obj.get_bool( "need_sunlight", false ); } -iuse_actor *firestarter_actor::clone() const +std::unique_ptr firestarter_actor::clone() const { - return new firestarter_actor( *this ); + return std::make_unique( *this ); } bool firestarter_actor::prep_firestarter_use( const player &p, tripoint &pos ) @@ -1357,11 +1337,9 @@ int firestarter_actor::use( player &p, item &it, bool t, const tripoint &spos ) const int moves = std::max( min_moves, moves_base * moves_modifier ) / light; if( moves > to_moves( 1_minutes ) ) { // If more than 1 minute, inform the player - static const std::string sun_msg = - _( "If the current weather holds, it will take around %d minutes to light a fire." ); - static const std::string normal_msg = - _( "At your skill level, it will take around %d minutes to light a fire." ); - p.add_msg_if_player( m_info, ( need_sunlight ? sun_msg : normal_msg ), + p.add_msg_if_player( m_info, need_sunlight ? + _( "If the current weather holds, it will take around %d minutes to light a fire." ) : + _( "At your skill level, it will take around %d minutes to light a fire." ), moves / to_moves( 1_minutes ) ); } else if( moves < to_moves( 2_turns ) && g->m.is_flammable( pos ) ) { // If less than 2 turns, don't start a long action @@ -1393,9 +1371,9 @@ void salvage_actor::load( JsonObject &obj ) } } -iuse_actor *salvage_actor::clone() const +std::unique_ptr salvage_actor::clone() const { - return new salvage_actor( *this ); + return std::make_unique( *this ); } int salvage_actor::use( player &p, item &it, bool t, const tripoint & ) const @@ -1618,9 +1596,9 @@ void inscribe_actor::load( JsonObject &obj ) } } -iuse_actor *inscribe_actor::clone() const +std::unique_ptr inscribe_actor::clone() const { - return new inscribe_actor( *this ); + return std::make_unique( *this ); } bool inscribe_actor::item_inscription( item &cut ) const @@ -1737,9 +1715,9 @@ void cauterize_actor::load( JsonObject &obj ) assign( obj, "flame", flame ); } -iuse_actor *cauterize_actor::clone() const +std::unique_ptr cauterize_actor::clone() const { - return new cauterize_actor( *this ); + return std::make_unique( *this ); } static heal_actor prepare_dummy() @@ -1855,9 +1833,9 @@ void enzlave_actor::load( JsonObject &obj ) assign( obj, "cost", cost ); } -iuse_actor *enzlave_actor::clone() const +std::unique_ptr enzlave_actor::clone() const { - return new enzlave_actor( *this ); + return std::make_unique( *this ); } int enzlave_actor::use( player &p, item &it, bool t, const tripoint & ) const @@ -2010,9 +1988,9 @@ void fireweapon_off_actor::load( JsonObject &obj ) success_chance = obj.get_int( "success_chance", INT_MIN ); } -iuse_actor *fireweapon_off_actor::clone() const +std::unique_ptr fireweapon_off_actor::clone() const { - return new fireweapon_off_actor( *this ); + return std::make_unique( *this ); } int fireweapon_off_actor::use( player &p, item &it, bool t, const tripoint & ) const @@ -2071,9 +2049,9 @@ void fireweapon_on_actor::load( JsonObject &obj ) } } -iuse_actor *fireweapon_on_actor::clone() const +std::unique_ptr fireweapon_on_actor::clone() const { - return new fireweapon_on_actor( *this ); + return std::make_unique( *this ); } int fireweapon_on_actor::use( player &p, item &it, bool t, const tripoint & ) const @@ -2116,9 +2094,9 @@ void manualnoise_actor::load( JsonObject &obj ) moves = obj.get_int( "moves", 0 ); } -iuse_actor *manualnoise_actor::clone() const +std::unique_ptr manualnoise_actor::clone() const { - return new manualnoise_actor( *this ); + return std::make_unique( *this ); } int manualnoise_actor::use( player &p, item &it, bool t, const tripoint & ) const @@ -2151,9 +2129,9 @@ ret_val manualnoise_actor::can_use( const player &, const item &it, bool, return ret_val::make_success(); } -iuse_actor *musical_instrument_actor::clone() const +std::unique_ptr musical_instrument_actor::clone() const { - return new musical_instrument_actor( *this ); + return std::make_unique( *this ); } void musical_instrument_actor::load( JsonObject &obj ) @@ -2295,9 +2273,9 @@ ret_val musical_instrument_actor::can_use( const player &p, const item &, return ret_val::make_success(); } -iuse_actor *learn_spell_actor::clone() const +std::unique_ptr learn_spell_actor::clone() const { - return new learn_spell_actor( *this ); + return std::make_unique( *this ); } void learn_spell_actor::load( JsonObject &obj ) @@ -2407,9 +2385,9 @@ int learn_spell_actor::use( player &p, item &, bool, const tripoint & ) const return 0; } -iuse_actor *cast_spell_actor::clone() const +std::unique_ptr cast_spell_actor::clone() const { - return new cast_spell_actor( *this ); + return std::make_unique( *this ); } void cast_spell_actor::load( JsonObject &obj ) @@ -2457,9 +2435,9 @@ int cast_spell_actor::use( player &p, item &itm, bool, const tripoint & ) const return charges; } -iuse_actor *holster_actor::clone() const +std::unique_ptr holster_actor::clone() const { - return new holster_actor( *this ); + return std::make_unique( *this ); } void holster_actor::load( JsonObject &obj ) @@ -2635,9 +2613,9 @@ units::volume holster_actor::max_stored_volume() const return max_volume * multi; } -iuse_actor *bandolier_actor::clone() const +std::unique_ptr bandolier_actor::clone() const { - return new bandolier_actor( *this ); + return std::make_unique( *this ); } void bandolier_actor::load( JsonObject &obj ) @@ -2795,9 +2773,9 @@ units::volume bandolier_actor::max_stored_volume() const return max_ammo_volume * capacity; } -iuse_actor *ammobelt_actor::clone() const +std::unique_ptr ammobelt_actor::clone() const { - return new ammobelt_actor( *this ); + return std::make_unique( *this ); } void ammobelt_actor::load( JsonObject &obj ) @@ -2909,9 +2887,9 @@ int repair_item_actor::use( player &p, item &it, bool, const tripoint &position return 0; } -iuse_actor *repair_item_actor::clone() const +std::unique_ptr repair_item_actor::clone() const { - return new repair_item_actor( *this ); + return std::make_unique( *this ); } bool repair_item_actor::handle_components( player &pl, const item &fix, @@ -3341,20 +3319,20 @@ repair_item_actor::attempt_hint repair_item_actor::repair( player &pl, item &too return AS_CANT; } -const std::string &repair_item_actor::action_description( repair_item_actor::repair_type rt ) +std::string repair_item_actor::action_description( repair_item_actor::repair_type rt ) { static const std::array arr = {{ - _( "Nothing" ), - _( "Repairing" ), - _( "Refitting" ), - _( "Downsizing" ), - _( "Upsizing" ), - _( "Reinforcing" ), - _( "Practicing" ) + translate_marker( "Nothing" ), + translate_marker( "Repairing" ), + translate_marker( "Refitting" ), + translate_marker( "Downsizing" ), + translate_marker( "Upsizing" ), + translate_marker( "Reinforcing" ), + translate_marker( "Practicing" ) } }; - return arr[rt]; + return _( arr[rt] ); } std::string repair_item_actor::get_name() const @@ -3470,9 +3448,9 @@ int heal_actor::use( player &p, item &it, bool, const tripoint &pos ) const return it.type->charges_to_use(); } -iuse_actor *heal_actor::clone() const +std::unique_ptr heal_actor::clone() const { - return new heal_actor( *this ); + return std::make_unique( *this ); } int heal_actor::get_heal_value( const player &healer, hp_part healed ) const @@ -3829,9 +3807,9 @@ void place_trap_actor::load( JsonObject &obj ) assign( obj, "outer_layer_trap", outer_layer_trap ); } -iuse_actor *place_trap_actor::clone() const +std::unique_ptr place_trap_actor::clone() const { - return new place_trap_actor( *this ); + return std::make_unique( *this ); } static bool is_solid_neighbor( const tripoint &pos, const int offset_x, const int offset_y ) @@ -3973,9 +3951,9 @@ int emit_actor::use( player &, item &it, bool, const tripoint &pos ) const return 1; } -iuse_actor *emit_actor::clone() const +std::unique_ptr emit_actor::clone() const { - return new emit_actor( *this ); + return std::make_unique( *this ); } void emit_actor::finalize( const itype_id &my_item_type ) @@ -4048,9 +4026,9 @@ ret_val saw_barrel_actor::can_use_on( const player &, const item &, const return ret_val::make_success(); } -iuse_actor *saw_barrel_actor::clone() const +std::unique_ptr saw_barrel_actor::clone() const { - return new saw_barrel_actor( *this ); + return std::make_unique( *this ); } int install_bionic_actor::use( player &p, item &it, bool, const tripoint & ) const @@ -4094,9 +4072,9 @@ ret_val install_bionic_actor::can_use( const player &p, const item &it, bo return ret_val::make_success(); } -iuse_actor *install_bionic_actor::clone() const +std::unique_ptr install_bionic_actor::clone() const { - return new install_bionic_actor( *this ); + return std::make_unique( *this ); } void install_bionic_actor::finalize( const itype_id &my_item_type ) @@ -4156,9 +4134,9 @@ ret_val detach_gunmods_actor::can_use( const player &p, const item &it, bo return ret_val::make_success(); } -iuse_actor *detach_gunmods_actor::detach_gunmods_actor::clone() const +std::unique_ptr detach_gunmods_actor::detach_gunmods_actor::clone() const { - return new detach_gunmods_actor( *this ); + return std::make_unique( *this ); } void detach_gunmods_actor::finalize( const itype_id &my_item_type ) @@ -4168,9 +4146,9 @@ void detach_gunmods_actor::finalize( const itype_id &my_item_type ) } } -iuse_actor *mutagen_actor::clone() const +std::unique_ptr mutagen_actor::clone() const { - return new mutagen_actor( *this ); + return std::make_unique( *this ); } void mutagen_actor::load( JsonObject &obj ) @@ -4182,9 +4160,8 @@ void mutagen_actor::load( JsonObject &obj ) int mutagen_actor::use( player &p, item &it, bool, const tripoint & ) const { - mutagen_attempt checks = mutagen_common_checks( p, it, false, - pgettext( "memorial_male", "Consumed mutagen." ), - pgettext( "memorial_female", "Consumed mutagen." ) ); + mutagen_attempt checks = + mutagen_common_checks( p, it, false, mutagen_technique::consumed_mutagen ); if( !checks.allowed ) { return checks.charges_used; @@ -4226,9 +4203,9 @@ int mutagen_actor::use( player &p, item &it, bool, const tripoint & ) const return it.type->charges_to_use(); } -iuse_actor *mutagen_iv_actor::clone() const +std::unique_ptr mutagen_iv_actor::clone() const { - return new mutagen_iv_actor( *this ); + return std::make_unique( *this ); } void mutagen_iv_actor::load( JsonObject &obj ) @@ -4238,9 +4215,8 @@ void mutagen_iv_actor::load( JsonObject &obj ) int mutagen_iv_actor::use( player &p, item &it, bool, const tripoint & ) const { - mutagen_attempt checks = mutagen_common_checks( p, it, false, - pgettext( "memorial_male", "Injected mutagen." ), - pgettext( "memorial_female", "Injected mutagen." ) ); + mutagen_attempt checks = + mutagen_common_checks( p, it, false, mutagen_technique::injected_mutagen ); if( !checks.allowed ) { return checks.charges_used; @@ -4302,9 +4278,9 @@ int mutagen_iv_actor::use( player &p, item &it, bool, const tripoint & ) const return it.type->charges_to_use(); } -iuse_actor *deploy_tent_actor::clone() const +std::unique_ptr deploy_tent_actor::clone() const { - return new deploy_tent_actor( *this ); + return std::make_unique( *this ); } void deploy_tent_actor::load( JsonObject &obj ) @@ -4423,9 +4399,9 @@ void weigh_self_actor::load( JsonObject &jo ) assign( jo, "max_weight", max_weight ); } -iuse_actor *weigh_self_actor::clone() const +std::unique_ptr weigh_self_actor::clone() const { - return new weigh_self_actor( *this ); + return std::make_unique( *this ); } void sew_advanced_actor::load( JsonObject &obj ) @@ -4638,7 +4614,7 @@ int sew_advanced_actor::use( player &p, item &it, bool, const tripoint & ) const return thread_needed / 2; } -iuse_actor *sew_advanced_actor::clone() const +std::unique_ptr sew_advanced_actor::clone() const { - return new sew_advanced_actor( *this ); + return std::make_unique( *this ); } diff --git a/src/iuse_actor.h b/src/iuse_actor.h index 5d9062df0776d..aec6bdc39b726 100644 --- a/src/iuse_actor.h +++ b/src/iuse_actor.h @@ -101,7 +101,7 @@ class iuse_transform : public iuse_actor void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; ret_val can_use( const player &, const item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; std::string get_name() const override; void finalize( const itype_id &my_item_type ) override; void info( const item &, std::vector & ) const override; @@ -124,7 +124,7 @@ class countdown_actor : public iuse_actor ~countdown_actor() override = default; void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; ret_val can_use( const player &, const item &it, bool, const tripoint & ) const override; std::string get_name() const override; void info( const item &, std::vector & ) const override; @@ -170,7 +170,7 @@ class explosion_iuse : public iuse_actor ~explosion_iuse() override = default; void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; void info( const item &, std::vector & ) const override; }; @@ -194,7 +194,7 @@ class unfold_vehicle_iuse : public iuse_actor ~unfold_vehicle_iuse() override = default; void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; }; /** Used in consume_drug_iuse for storing effect data. */ @@ -238,7 +238,7 @@ class consume_drug_iuse : public iuse_actor ~consume_drug_iuse() override = default; void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; void info( const item &, std::vector & ) const override; /** Item produced after using drugs. */ @@ -272,7 +272,7 @@ class delayed_transform_iuse : public iuse_transform ~delayed_transform_iuse() override = default; void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; }; /** @@ -302,7 +302,7 @@ class place_monster_iuse : public iuse_actor ~place_monster_iuse() override = default; void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; }; /** @@ -325,7 +325,7 @@ class ups_based_armor_actor : public iuse_actor ~ups_based_armor_actor() override = default; void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; }; /** @@ -344,7 +344,7 @@ class pick_lock_actor : public iuse_actor ~pick_lock_actor() override = default; void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; }; /** @@ -363,7 +363,7 @@ class deploy_furn_actor : public iuse_actor ~deploy_furn_actor() override = default; void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; void info( const item &, std::vector & ) const override; }; @@ -398,7 +398,7 @@ class reveal_map_actor : public iuse_actor ~reveal_map_actor() override = default; void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; }; /** @@ -436,7 +436,7 @@ class firestarter_actor : public iuse_actor void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; ret_val can_use( const player &, const item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; }; /** @@ -472,7 +472,7 @@ class salvage_actor : public iuse_actor ~salvage_actor() override = default; void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; }; /** @@ -511,7 +511,7 @@ class inscribe_actor : public iuse_actor ~inscribe_actor() override = default; void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; }; /** @@ -531,7 +531,7 @@ class cauterize_actor : public iuse_actor void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; ret_val can_use( const player &, const item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; }; /** @@ -546,7 +546,7 @@ class enzlave_actor : public iuse_actor void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; ret_val can_use( const player &, const item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; }; /** @@ -571,7 +571,7 @@ class fireweapon_off_actor : public iuse_actor void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; ret_val can_use( const player &, const item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; }; /** @@ -594,7 +594,7 @@ class fireweapon_on_actor : public iuse_actor ~fireweapon_on_actor() override = default; void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; }; /** @@ -617,7 +617,7 @@ class manualnoise_actor : public iuse_actor void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; ret_val can_use( const player &, const item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; }; /** @@ -661,7 +661,7 @@ class musical_instrument_actor : public iuse_actor void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; ret_val can_use( const player &, const item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; }; /** @@ -678,7 +678,7 @@ class learn_spell_actor : public iuse_actor ~learn_spell_actor() override = default; void load( JsonObject &obj ) override; int use( player &p, item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; void info( const item &, std::vector & ) const override; }; @@ -699,7 +699,7 @@ class cast_spell_actor : public iuse_actor ~cast_spell_actor() override = default; void load( JsonObject &obj ) override; int use( player &p, item &itm, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; void info( const item &, std::vector & ) const override; }; @@ -739,7 +739,7 @@ class holster_actor : public iuse_actor ~holster_actor() override = default; void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; void info( const item &, std::vector & ) const override; units::volume max_stored_volume() const; @@ -774,7 +774,7 @@ class bandolier_actor : public iuse_actor ~bandolier_actor() override = default; void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; void info( const item &, std::vector & ) const override; units::volume max_stored_volume() const; @@ -790,7 +790,7 @@ class ammobelt_actor : public iuse_actor ~ammobelt_actor() override = default; void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; void info( const item &, std::vector & ) const override; }; @@ -859,14 +859,14 @@ class repair_item_actor : public iuse_actor */ int repair_recipe_difficulty( const player &pl, const item &fix, bool training = false ) const; /** Describes members of `repair_type` enum */ - static const std::string &action_description( repair_type ); + static std::string action_description( repair_type ); repair_item_actor( const std::string &type = "repair_item" ) : iuse_actor( type ) {} ~repair_item_actor() override = default; void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; std::string get_name() const override; }; @@ -932,7 +932,7 @@ class heal_actor : public iuse_actor ~heal_actor() override = default; void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; void info( const item &, std::vector & ) const override; }; @@ -979,7 +979,7 @@ class place_trap_actor : public iuse_actor ~place_trap_actor() override = default; void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; }; class emit_actor : public iuse_actor @@ -993,7 +993,7 @@ class emit_actor : public iuse_actor ~emit_actor() override = default; void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; void finalize( const itype_id &my_item_type ) override; }; @@ -1004,7 +1004,7 @@ class saw_barrel_actor : public iuse_actor void load( JsonObject &jo ) override; int use( player &p, item &it, bool t, const tripoint &pnt ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; ret_val can_use_on( const player &p, const item &it, const item &target ) const; }; @@ -1017,7 +1017,7 @@ class install_bionic_actor : public iuse_actor void load( JsonObject & ) override {} int use( player &p, item &it, bool t, const tripoint &pnt ) const override; ret_val can_use( const player &, const item &it, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; void finalize( const itype_id &my_item_type ) override; }; @@ -1029,7 +1029,7 @@ class detach_gunmods_actor : public iuse_actor void load( JsonObject & ) override {} int use( player &p, item &it, bool t, const tripoint &pnt ) const override; ret_val can_use( const player &, const item &it, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; void finalize( const itype_id &my_item_type ) override; }; @@ -1045,7 +1045,7 @@ class mutagen_actor : public iuse_actor ~mutagen_actor() override = default; void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; }; class mutagen_iv_actor : public iuse_actor @@ -1058,7 +1058,7 @@ class mutagen_iv_actor : public iuse_actor ~mutagen_iv_actor() override = default; void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; }; class deploy_tent_actor : public iuse_actor @@ -1077,7 +1077,7 @@ class deploy_tent_actor : public iuse_actor ~deploy_tent_actor() override = default; void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; bool check_intact( const tripoint ¢er ) const; }; @@ -1096,7 +1096,7 @@ class weigh_self_actor : public iuse_actor ~weigh_self_actor() override = default; void load( JsonObject &jo ) override; int use( player &p, item &itm, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; void info( const item &, std::vector & ) const override; }; @@ -1118,6 +1118,6 @@ class sew_advanced_actor : public iuse_actor ~sew_advanced_actor() override = default; void load( JsonObject &obj ) override; int use( player &, item &, bool, const tripoint & ) const override; - iuse_actor *clone() const override; + std::unique_ptr clone() const override; }; #endif diff --git a/src/iuse_software_kitten.cpp b/src/iuse_software_kitten.cpp index be092a4c0e32f..60e5c1a871a54 100644 --- a/src/iuse_software_kitten.cpp +++ b/src/iuse_software_kitten.cpp @@ -355,20 +355,20 @@ void robot_finds_kitten::instructions( const catacurses::window &w ) // NOLINTNEXTLINE(cata-use-named-point-constants) pos += fold_and_print( w, point( 1, 0 ), getmaxx( w ) - 4, c_light_gray, _( "robotfindskitten v22July2008" ) ); - pos += 1 + fold_and_print( w, point( 1, pos ), getmaxx( w ) - 4, c_light_gray, _( "\ -Originally by the illustrious Leonard Richardson, \ -rewritten in PDCurses by Joseph Larson, \ -ported to CDDA gaming system by a nutcase." ) ); + pos += 1 + fold_and_print( w, point( 1, pos ), getmaxx( w ) - 4, c_light_gray, + _( "Originally by the illustrious Leonard Richardson, " + "rewritten in PDCurses by Joseph Larson, " + "ported to CDDA gaming system by a nutcase." ) ); pos += 1 + fold_and_print( w, point( 1, pos ), getmaxx( w ) - 4, c_light_gray, _( "In this game, you are robot (" ) ); draw_robot( w ); wprintz( w, c_light_gray, _( ")." ) ); - pos += 1 + fold_and_print( w, point( 1, pos ), getmaxx( w ) - 4, c_light_gray, _( "\ -Your job is to find kitten. This task is complicated by the existence of various things \ -which are not kitten. Robot must touch items to determine if they are kitten or not. \ -The game ends when robot finds kitten. Alternatively, you may end the game by hitting \ -'q', 'Q' or the Escape key." ) ); + pos += 1 + fold_and_print( w, point( 1, pos ), getmaxx( w ) - 4, c_light_gray, + _( "Your job is to find kitten. This task is complicated by the existence of various things " + "which are not kitten. Robot must touch items to determine if they are kitten or not. " + "The game ends when robot finds kitten. Alternatively, you may end the game by hitting " + "'q', 'Q' or the Escape key." ) ); fold_and_print( w, point( 1, pos ), getmaxx( w ) - 4, c_light_gray, _( "Press any key to start." ) ); wrefresh( w ); diff --git a/src/json.cpp b/src/json.cpp index a6b929a2f81ca..6416c8a54d94a 100644 --- a/src/json.cpp +++ b/src/json.cpp @@ -990,6 +990,13 @@ int JsonIn::get_int() return static_cast( get_float() ); } +std::int64_t JsonIn::get_int64() +{ + // get float value and then convert to int, + // because "1.359e3" is technically a valid integer. + return static_cast( get_float() ); +} + double JsonIn::get_float() { // this could maybe be prettier? @@ -1212,114 +1219,123 @@ bool JsonIn::test_object() /* non-fatal value setting by reference */ -bool JsonIn::read( bool &b ) +bool JsonIn::read( bool &b, bool throw_on_error ) { if( !test_bool() ) { - return false; + return error_or_false( throw_on_error, "Expected bool" ); } b = get_bool(); return true; } -bool JsonIn::read( char &c ) +bool JsonIn::read( char &c, bool throw_on_error ) { if( !test_number() ) { - return false; + return error_or_false( throw_on_error, "Expected number" ); } c = get_int(); return true; } -bool JsonIn::read( signed char &c ) +bool JsonIn::read( signed char &c, bool throw_on_error ) { if( !test_number() ) { - return false; + return error_or_false( throw_on_error, "Expected number" ); } // TODO: test for overflow c = get_int(); return true; } -bool JsonIn::read( unsigned char &c ) +bool JsonIn::read( unsigned char &c, bool throw_on_error ) { if( !test_number() ) { - return false; + return error_or_false( throw_on_error, "Expected number" ); } // TODO: test for overflow c = get_int(); return true; } -bool JsonIn::read( short unsigned int &s ) +bool JsonIn::read( short unsigned int &s, bool throw_on_error ) { if( !test_number() ) { - return false; + return error_or_false( throw_on_error, "Expected number" ); } // TODO: test for overflow s = get_int(); return true; } -bool JsonIn::read( short int &s ) +bool JsonIn::read( short int &s, bool throw_on_error ) { if( !test_number() ) { - return false; + return error_or_false( throw_on_error, "Expected number" ); } // TODO: test for overflow s = get_int(); return true; } -bool JsonIn::read( int &i ) +bool JsonIn::read( int &i, bool throw_on_error ) { if( !test_number() ) { - return false; + return error_or_false( throw_on_error, "Expected number" ); } i = get_int(); return true; } -bool JsonIn::read( unsigned int &u ) +bool JsonIn::read( std::int64_t &i, bool throw_on_error ) { if( !test_number() ) { - return false; + return error_or_false( throw_on_error, "Expected number" ); + } + i = get_int64(); + return true; +} + +bool JsonIn::read( unsigned int &u, bool throw_on_error ) +{ + if( !test_number() ) { + return error_or_false( throw_on_error, "Expected number" ); } u = get_int(); return true; } -bool JsonIn::read( float &f ) +bool JsonIn::read( float &f, bool throw_on_error ) { if( !test_number() ) { - return false; + return error_or_false( throw_on_error, "Expected number" ); } f = get_float(); return true; } -bool JsonIn::read( double &d ) +bool JsonIn::read( double &d, bool throw_on_error ) { if( !test_number() ) { - return false; + return error_or_false( throw_on_error, "Expected number" ); } d = get_float(); return true; } -bool JsonIn::read( std::string &s ) +bool JsonIn::read( std::string &s, bool throw_on_error ) { if( !test_string() ) { - return false; + return error_or_false( throw_on_error, "Expected string" ); } s = get_string(); return true; } template -bool JsonIn::read( std::bitset &b ) +bool JsonIn::read( std::bitset &b, bool throw_on_error ) { if( !test_bitset() ) { - return false; + return error_or_false( throw_on_error, "Expected bitset" ); } std::string tmp_string = get_string(); if( tmp_string.length() > N ) { @@ -1330,7 +1346,7 @@ bool JsonIn::read( std::bitset &b ) return true; } -bool JsonIn::read( JsonDeserializer &j ) +bool JsonIn::read( JsonDeserializer &j, bool throw_on_error ) { // can't know what type of json object it will deserialize from, // so just try to deserialize, catching any error. @@ -1339,6 +1355,9 @@ bool JsonIn::read( JsonDeserializer &j ) j.deserialize( *this ); return true; } catch( const JsonError & ) { + if( throw_on_error ) { + throw; + } return false; } } @@ -1441,6 +1460,14 @@ void JsonIn::error( const std::string &message, int offset ) throw JsonError( err.str() ); } +bool JsonIn::error_or_false( bool throw_, const std::string &message, int offset ) +{ + if( throw_ ) { + error( message, offset ); + } + return false; +} + void JsonIn::rewind( int max_lines, int max_chars ) { if( max_lines < 0 && max_chars < 0 ) { @@ -1723,4 +1750,4 @@ std::ostream &operator<<( std::ostream &stream, const JsonError &err ) // Currently only bitsets of size 12 are loaded / stored, if you need other sizes, either explicitly // instantiate them here, or move the templated read/write functions into the header. template void JsonOut::write<12>( const std::bitset<12> & ); -template bool JsonIn::read<12>( std::bitset<12> & ); +template bool JsonIn::read<12>( std::bitset<12> &, bool throw_on_error ); diff --git a/src/json.h b/src/json.h index 906fe8ac4dfa9..57c371a98bb48 100644 --- a/src/json.h +++ b/src/json.h @@ -36,6 +36,9 @@ class JsonArray; class JsonSerializer; class JsonDeserializer; +template +class string_id; + class JsonError : public std::runtime_error { public: @@ -45,6 +48,30 @@ class JsonError : public std::runtime_error } }; +template +struct key_from_json_string; + +template<> +struct key_from_json_string { + std::string operator()( const std::string &s ) { + return s; + } +}; + +template +struct key_from_json_string, void> { + string_id operator()( const std::string &s ) { + return string_id( s ); + } +}; + +template +struct key_from_json_string::value>> { + Enum operator()( const std::string &s ) { + return io::string_to_enum( s ); + } +}; + /* JsonIn * ====== * @@ -171,6 +198,7 @@ class JsonIn // data parsing std::string get_string(); // get the next value as a string int get_int(); // get the next value as an int + std::int64_t get_int64(); // get the next value as an int64 bool get_bool(); // get the next value as a bool double get_float(); // get the next value as a double std::string get_member_name(); // also strips the ':' @@ -210,27 +238,29 @@ class JsonIn bool test_array(); bool test_object(); - // non-fatal reading into values by reference + // optionally-fatal reading into values by reference // returns true if the data was read successfully, false otherwise - bool read( bool &b ); - bool read( char &c ); - bool read( signed char &c ); - bool read( unsigned char &c ); - bool read( short unsigned int &s ); - bool read( short int &s ); - bool read( int &i ); - bool read( unsigned int &u ); - bool read( float &f ); - bool read( double &d ); - bool read( std::string &s ); + // if throw_on_error then throws JsonError rather than returning false. + bool read( bool &b, bool throw_on_error = false ); + bool read( char &c, bool throw_on_error = false ); + bool read( signed char &c, bool throw_on_error = false ); + bool read( unsigned char &c, bool throw_on_error = false ); + bool read( short unsigned int &s, bool throw_on_error = false ); + bool read( short int &s, bool throw_on_error = false ); + bool read( int &i, bool throw_on_error = false ); + bool read( std::int64_t &i, bool throw_on_error = false ); + bool read( unsigned int &u, bool throw_on_error = false ); + bool read( float &f, bool throw_on_error = false ); + bool read( double &d, bool throw_on_error = false ); + bool read( std::string &s, bool throw_on_error = false ); template - bool read( std::bitset &b ); - bool read( JsonDeserializer &j ); + bool read( std::bitset &b, bool throw_on_error = false ); + bool read( JsonDeserializer &j, bool throw_on_error = false ); // This is for the string_id type template - auto read( T &thing ) -> decltype( thing.str(), true ) { + auto read( T &thing, bool throw_on_error = false ) -> decltype( thing.str(), true ) { std::string tmp; - if( !read( tmp ) ) { + if( !read( tmp, throw_on_error ) ) { return false; } thing = T( tmp ); @@ -239,22 +269,69 @@ class JsonIn /// Overload that calls a global function `deserialize(T&,JsonIn&)`, if available. template - auto read( T &v ) -> decltype( deserialize( v, *this ), true ) { + auto read( T &v, bool throw_on_error = false ) -> + decltype( deserialize( v, *this ), true ) { try { deserialize( v, *this ); return true; } catch( const JsonError & ) { + if( throw_on_error ) { + throw; + } return false; } } /// Overload that calls a member function `T::deserialize(JsonIn&)`, if available. template - auto read( T &v ) -> decltype( v.deserialize( *this ), true ) { + auto read( T &v, bool throw_on_error = false ) -> decltype( v.deserialize( *this ), true ) { try { v.deserialize( *this ); return true; } catch( const JsonError & ) { + if( throw_on_error ) { + throw; + } + return false; + } + } + + template::value, int> = 0> + bool read( T &val, bool throw_on_error = false ) { + int i; + if( read( i, false ) ) { + val = static_cast( i ); + return true; + } + std::string s; + if( read( s, throw_on_error ) ) { + val = io::string_to_enum( s ); + return true; + } + return false; + } + + /// Overload for std::pair + template + bool read( std::pair &p, bool throw_on_error = false ) { + if( !test_array() ) { + return error_or_false( throw_on_error, "Expected json array encoding pair" ); + } + try { + start_array(); + bool result = !end_array() && + read( p.first, throw_on_error ) && + !end_array() && + read( p.second, throw_on_error ) && + end_array(); + if( !result && throw_on_error ) { + error( "Array had wrong number of elements for pair" ); + } + return result; + } catch( const JsonError & ) { + if( throw_on_error ) { + throw; + } return false; } } @@ -263,22 +340,25 @@ class JsonIn template < typename T, typename std::enable_if < !std::is_same::value >::type * = nullptr > - auto read( T &v ) -> decltype( v.front(), true ) { + auto read( T &v, bool throw_on_error = false ) -> decltype( v.front(), true ) { if( !test_array() ) { - return false; + return error_or_false( throw_on_error, "Expected json array" ); } try { start_array(); v.clear(); while( !end_array() ) { typename T::value_type element; - if( read( element ) ) { + if( read( element, throw_on_error ) ) { v.push_back( std::move( element ) ); } else { skip_value(); } } } catch( const JsonError & ) { + if( throw_on_error ) { + throw; + } return false; } @@ -286,22 +366,33 @@ class JsonIn } // array ~> array - template bool read( std::array &v ) { + template + bool read( std::array &v, bool throw_on_error = false ) { if( !test_array() ) { - return false; + return error_or_false( throw_on_error, "Expected json array" ); } try { start_array(); for( size_t i = 0; i < N; ++i ) { if( end_array() ) { + if( throw_on_error ) { + error( "Json array is too short" ); + } return false; // json array is too small } - if( !read( v[i] ) ) { + if( !read( v[i], throw_on_error ) ) { return false; // invalid entry } } - return end_array(); // false if json array is too big + bool result = end_array(); + if( !result && throw_on_error ) { + error( "Array had too many elements" ); + } + return result; } catch( const JsonError & ) { + if( throw_on_error ) { + throw; + } return false; } } @@ -311,22 +402,25 @@ class JsonIn template ::value>::type * = nullptr > - bool read( T &v ) { + bool read( T &v, bool throw_on_error = false ) { if( !test_array() ) { - return false; + return error_or_false( throw_on_error, "Expected json array" ); } try { start_array(); v.clear(); while( !end_array() ) { typename T::value_type element; - if( read( element ) ) { + if( read( element, throw_on_error ) ) { v.insert( std::move( element ) ); } else { skip_value(); } } } catch( const JsonError & ) { + if( throw_on_error ) { + throw; + } return false; } @@ -336,22 +430,25 @@ class JsonIn // special case for colony as it uses `insert()` instead of `push_back()` // and therefore doesn't fit with vector/deque/list template - bool read( cata::colony &v ) { + bool read( cata::colony &v, bool throw_on_error = false ) { if( !test_array() ) { - return false; + return error_or_false( throw_on_error, "Expected json array" ); } try { start_array(); v.clear(); while( !end_array() ) { T element; - if( read( element ) ) { + if( read( element, throw_on_error ) ) { v.insert( std::move( element ) ); } else { skip_value(); } } } catch( const JsonError & ) { + if( throw_on_error ) { + throw; + } return false; } @@ -363,23 +460,27 @@ class JsonIn template < typename T, typename std::enable_if < !std::is_same::value >::type * = nullptr > - bool read( T &m ) { + bool read( T &m, bool throw_on_error = true ) { if( !test_object() ) { - return false; + return error_or_false( throw_on_error, "Expected json object" ); } try { start_object(); m.clear(); while( !end_object() ) { - typename T::key_type name( get_member_name() ); + using key_type = typename T::key_type; + key_type key = key_from_json_string()( get_member_name() ); typename T::mapped_type element; - if( read( element ) ) { - m[std::move( name )] = std::move( element ); + if( read( element, throw_on_error ) ) { + m[std::move( key )] = std::move( element ); } else { skip_value(); } } } catch( const JsonError & ) { + if( throw_on_error ) { + throw; + } return false; } @@ -389,6 +490,10 @@ class JsonIn // error messages std::string line_number( int offset_modifier = 0 ); // for occasional use only [[noreturn]] void error( const std::string &message, int offset = 0 ); // ditto + + // If throw_, then call error( message, offset ), otherwise return + // false + bool error_or_false( bool throw_, const std::string &message, int offset = 0 ); void rewind( int max_lines = -1, int max_chars = -1 ); std::string substr( size_t pos, size_t len = std::string::npos ); }; @@ -521,6 +626,23 @@ class JsonOut write( io::enum_to_string( value ) ); } + void write_as_string( const std::string &s ) { + write( s ); + } + + template + void write_as_string( const string_id &s ) { + write( s ); + } + + template + void write( const std::pair &p ) { + start_array(); + write( p.first ); + write( p.second ); + end_array(); + } + template void write_as_array( const T &container ) { start_array(); @@ -562,7 +684,7 @@ class JsonOut void write( const T &map ) { start_object(); for( const auto &it : map ) { - write( it.first ); + write_as_string( it.first ); write_member_separator(); write( it.second ); } @@ -724,15 +846,18 @@ class JsonObject bool has_object( const std::string &name ); // non-fatally read values by reference - // return true if the value was set, false otherwise. + // return true if the value was set. // return false if the member is not found. - template bool read( const std::string &name, T &t ) { + // throw_on_error dictates the behaviour when the member was present + // but the read fails. + template + bool read( const std::string &name, T &t, bool throw_on_error = true ) { int pos = positions[name]; if( pos <= start ) { return false; } jsin->seek( pos ); - return jsin->read( t ); + return jsin->read( t, throw_on_error ); } // useful debug info diff --git a/src/kill_tracker.cpp b/src/kill_tracker.cpp index 820ba255dd5a9..841bc7777b4ea 100644 --- a/src/kill_tracker.cpp +++ b/src/kill_tracker.cpp @@ -122,11 +122,11 @@ void kill_tracker::clear() npc_kills.clear(); } -void kill_tracker::notify( const event &e ) +void kill_tracker::notify( const cata::event &e ) { switch( e.type() ) { case event_type::character_kills_monster: { - character_id killer = e.get( "killer_id" ); + character_id killer = e.get( "killer" ); if( killer != g->u.getID() ) { // TODO: add a kill counter for npcs? break; @@ -136,7 +136,7 @@ void kill_tracker::notify( const event &e ) break; } case event_type::character_kills_character: { - character_id killer = e.get( "killer_id" ); + character_id killer = e.get( "killer" ); if( killer != g->u.getID() ) { break; } diff --git a/src/kill_tracker.h b/src/kill_tracker.h index 2e2338d5bf876..ce8949c4692dd 100644 --- a/src/kill_tracker.h +++ b/src/kill_tracker.h @@ -28,7 +28,7 @@ class kill_tracker : public event_subscriber void clear(); - void notify( const event & ) override; + void notify( const cata::event & ) override; void serialize( JsonOut & ) const; void deserialize( JsonIn & ); diff --git a/src/live_view.cpp b/src/live_view.cpp index ebc8531091ff8..4f68c9da15ede 100644 --- a/src/live_view.cpp +++ b/src/live_view.cpp @@ -54,14 +54,7 @@ int live_view::draw( const catacurses::window &win, const int max_height ) #endif draw_border( win ); - static const char *title_prefix = "< "; - static const char *title = _( "Mouse View" ); - static const char *title_suffix = " >"; - static const std::string full_title = string_format( "%s%s%s", title_prefix, title, title_suffix ); - const int start_pos = center_text_pos( full_title, 0, getmaxx( win ) - 1 ); - mvwprintz( win, point( start_pos, 0 ), c_white, title_prefix ); - wprintz( win, c_green, title ); - wprintz( win, c_white, title_suffix ); + center_print( win, 0, c_white, _( "< Mouse View >" ) ); #if defined(TILES) || defined(_WIN32) win.get()->height = original_height; diff --git a/src/lru_cache.cpp b/src/lru_cache.cpp index d1fe99c7bb848..765fdc85ce4dd 100644 --- a/src/lru_cache.cpp +++ b/src/lru_cache.cpp @@ -71,3 +71,4 @@ const std::list::Pair> &lru_cache::li // explicit template initialization for lru_cache of all types template class lru_cache; template class lru_cache; +template class lru_cache; diff --git a/src/magic.cpp b/src/magic.cpp index 8d4d47ecca8a1..74d587583ea9f 100644 --- a/src/magic.cpp +++ b/src/magic.cpp @@ -199,6 +199,7 @@ void spell_type::load( JsonObject &jo, const std::string & ) mandatory( jo, was_loaded, "id", id ); mandatory( jo, was_loaded, "name", name ); mandatory( jo, was_loaded, "description", description ); + optional( jo, was_loaded, "message", message, to_translation( "You cast %s!" ) ); mandatory( jo, was_loaded, "effect", effect_name ); const auto found_effect = effect_map.find( effect_name ); if( found_effect == effect_map.cend() ) { @@ -217,18 +218,10 @@ void spell_type::load( JsonObject &jo, const std::string & ) if( jo.has_array( "extra_effects" ) ) { JsonArray jarray = jo.get_array( "extra_effects" ); while( jarray.has_more() ) { + fake_spell temp; JsonObject fake_spell_obj = jarray.next_object(); - std::string temp_id; - bool temp_self = false; - int temp_max_level = -1; - mandatory( fake_spell_obj, was_loaded, "id", temp_id ); - optional( fake_spell_obj, was_loaded, "hit_self", temp_self, false ); - optional( fake_spell_obj, was_loaded, "max_level", temp_max_level, -1 ); - cata::optional max_level = cata::nullopt; - if( temp_max_level >= 0 ) { - max_level = temp_max_level; - } - additional_spells.emplace_back( fake_spell( spell_id( temp_id ), temp_self, max_level ) ); + temp.load( fake_spell_obj ); + additional_spells.emplace_back( temp ); } } @@ -390,6 +383,11 @@ spell::spell( spell_id sp, int xp ) : experience( xp ) {} +spell::spell( spell_id sp, translation alt_msg ) : + type( sp ), + alt_message( alt_msg ) +{} + spell_id spell::id() const { return type; @@ -562,6 +560,14 @@ std::string spell::name() const return type->name.translated(); } +std::string spell::message() const +{ + if( !alt_message.empty() ) { + return alt_message.translated(); + } + return type->message.translated(); +} + float spell::spell_fail( const player &p ) const { // formula is based on the following: @@ -971,15 +977,8 @@ void spell::cast_all_effects( Creature &source, const tripoint &target ) const // first call the effect of the main spell cast_spell_effect( source, target ); for( const fake_spell &extra_spell : type->additional_spells ) { - spell sp( extra_spell.id ); - int level = sp.get_max_level(); - if( extra_spell.max_level ) { - level = std::min( level, *extra_spell.max_level ); - } - level = std::min( get_level(), level ); - while( sp.get_level() < level ) { - sp.gain_level(); - } + spell sp = extra_spell.get_spell( extra_spell.level ); + if( extra_spell.self ) { sp.cast_all_effects( source, source.pos() ); } else { @@ -1663,3 +1662,51 @@ void spellbook_callback::select( int entnum, uilist *menu ) } draw_spellbook_info( spells[entnum], menu ); } + +void fake_spell::load( JsonObject &jo ) +{ + std::string temp_id; + mandatory( jo, false, "id", temp_id ); + id = spell_id( temp_id ); + optional( jo, false, "hit_self", self, false ); + int max_level_int; + optional( jo, false, "max_level", max_level_int, -1 ); + if( max_level_int == -1 ) { + max_level = cata::nullopt; + } else { + max_level = max_level_int; + } + optional( jo, false, "level", level, 0 ); +} + +void fake_spell::serialize( JsonOut &json ) const +{ + json.member( "id", id ); + json.member( "hit_self", self ); + if( !max_level ) { + json.member( "max_level", -1 ); + } else { + json.member( "max_level", *max_level ); + } + json.member( "level", level ); +} + +void fake_spell::deserialize( JsonIn &jsin ) +{ + JsonObject data = jsin.get_object(); + load( data ); +} + +spell fake_spell::get_spell( const int level_override ) const +{ + spell sp( id ); + int level = sp.get_max_level(); + if( max_level ) { + level = std::min( level, *max_level ); + } + level = std::min( level_override, level ); + while( sp.get_level() < level ) { + sp.gain_level(); + } + return sp; +} diff --git a/src/magic.h b/src/magic.h index 8cec99a293639..5357f6aa41f91 100644 --- a/src/magic.h +++ b/src/magic.h @@ -20,6 +20,7 @@ struct tripoint; class Creature; class player; +class spell; class JsonObject; class JsonOut; class JsonIn; @@ -80,11 +81,21 @@ struct fake_spell { // max level this spell can be // if null pointer, spell can be up to its own max level cata::optional max_level; + // level for things that need it + int level; // target tripoint is source (true) or target (false) bool self; + + fake_spell() = default; fake_spell( const spell_id &sp_id, bool hit_self = false, const cata::optional &max_level = cata::nullopt ) : id( sp_id ), max_level( max_level ), self( hit_self ) {} + + spell get_spell( int level_override = INT_MAX ) const; + + void load( JsonObject &jo ); + void serialize( JsonOut &json ) const; + void deserialize( JsonIn &jsin ); }; class spell_type @@ -100,6 +111,8 @@ class spell_type translation name; // spell description translation description; + // spell message when cast + translation message; // spell effect string. used to look up spell function std::string effect_name; std::function effect; @@ -234,9 +247,13 @@ class spell // returns damage type for the spell damage_type dmg_type() const; + // alternative cast message + translation alt_message; + public: spell() = default; spell( spell_id sp, int xp = 0 ); + spell( spell_id sp, translation alt_msg ); // how much exp you need for the spell to gain a level int exp_to_next_level() const; @@ -304,6 +321,8 @@ class spell std::string name() const; // description of spell (translated) std::string description() const; + // spell message when cast (translated) + std::string message() const; // energy source as a string (translated) std::string energy_string() const; // energy cost returned as a string diff --git a/src/magic_enchantment.cpp b/src/magic_enchantment.cpp new file mode 100644 index 0000000000000..528db7550258f --- /dev/null +++ b/src/magic_enchantment.cpp @@ -0,0 +1,364 @@ +#include "magic_enchantment.h" + +#include "character.h" +#include "enum_conversions.h" +#include "game.h" +#include "generic_factory.h" +#include "item.h" +#include "json.h" +#include "map.h" +#include "units.h" + +template<> +struct enum_traits { + static constexpr enchantment::has last = enchantment::has::NUM_HAS; +}; + +template<> +struct enum_traits { + static constexpr enchantment::condition last = enchantment::condition::NUM_CONDITION; +}; + +template<> +struct enum_traits { + static constexpr enchantment::mod last = enchantment::mod::NUM_MOD; +}; + +namespace io +{ + // *INDENT-OFF* + template<> + std::string enum_to_string( enchantment::has data ) + { + switch ( data ) { + case enchantment::has::HELD: return "HELD"; + case enchantment::has::WIELD: return "WIELD"; + case enchantment::has::WORN: return "WORN"; + case enchantment::has::NUM_HAS: break; + } + debugmsg( "Invalid enchantment::has" ); + abort(); + } + + template<> + std::string enum_to_string( enchantment::condition data ) + { + switch ( data ) { + case enchantment::condition::ALWAYS: return "ALWAYS"; + case enchantment::condition::UNDERGROUND: return "UNDERGROUND"; + case enchantment::condition::UNDERWATER: return "UNDERWATER"; + case enchantment::condition::NUM_CONDITION: break; + } + debugmsg( "Invalid enchantment::condition" ); + abort(); + } + + template<> + std::string enum_to_string( enchantment::mod data ) + { + switch ( data ) { + case enchantment::mod::STRENGTH: return "STRENGTH"; + case enchantment::mod::DEXTERITY: return "DEXTERITY"; + case enchantment::mod::PERCEPTION: return "PERCEPTION"; + case enchantment::mod::INTELLIGENCE: return "INTELLIGENCE"; + case enchantment::mod::SPEED: return "SPEED"; + case enchantment::mod::ATTACK_COST: return "ATTACK_COST"; + case enchantment::mod::MOVE_COST: return "MOVE_COST"; + case enchantment::mod::METABOLISM: return "METABOLISM"; + case enchantment::mod::MAX_MANA: return "MAX_MANA"; + case enchantment::mod::REGEN_MANA: return "REGEN_MANA"; + case enchantment::mod::BIONIC_POWER: return "BIONIC_POWER"; + case enchantment::mod::MAX_STAMINA: return "MAX_STAMINA"; + case enchantment::mod::REGEN_STAMINA: return "REGEN_STAMINA"; + case enchantment::mod::MAX_HP: return "MAX_HP"; + case enchantment::mod::REGEN_HP: return "REGEN_HP"; + case enchantment::mod::THIRST: return "THIRST"; + case enchantment::mod::FATIGUE: return "FATIGUE"; + case enchantment::mod::PAIN: return "PAIN"; + case enchantment::mod::BONUS_DAMAGE: return "BONUS_DAMAGE"; + case enchantment::mod::BONUS_BLOCK: return "BONUS_BLOCK"; + case enchantment::mod::BONUS_DODGE: return "BONUS_DODGE"; + case enchantment::mod::ATTACK_NOISE: return "ATTACK_NOISE"; + case enchantment::mod::SPELL_NOISE: return "SPELL_NOISE"; + case enchantment::mod::SHOUT_NOISE: return "SHOUT_NOISE"; + case enchantment::mod::FOOTSTEP_NOISE: return "FOOTSTEP_NOISE"; + case enchantment::mod::SIGHT_RANGE: return "SIGHT_RANGE"; + case enchantment::mod::CARRY_WEIGHT: return "CARRY_WEIGHT"; + case enchantment::mod::CARRY_VOLUME: return "CARRY_VOLUME"; + case enchantment::mod::SOCIAL_LIE: return "SOCIAL_LIE"; + case enchantment::mod::SOCIAL_PERSUADE: return "SOCIAL_PERSUADE"; + case enchantment::mod::SOCIAL_INTIMIDATE: return "SOCIAL_INTIMIDATE"; + case enchantment::mod::ITEM_DAMAGE_BASH: return "ITEM_DAMAGE_BASH"; + case enchantment::mod::ITEM_DAMAGE_CUT: return "ITEM_DAMAGE_CUT"; + case enchantment::mod::ITEM_DAMAGE_STAB: return "ITEM_DAMAGE_STAB"; + case enchantment::mod::ITEM_DAMAGE_HEAT: return "ITEM_DAMAGE_HEAT"; + case enchantment::mod::ITEM_DAMAGE_COLD: return "ITEM_DAMAGE_COLD"; + case enchantment::mod::ITEM_DAMAGE_ELEC: return "ITEM_DAMAGE_ELEC"; + case enchantment::mod::ITEM_DAMAGE_ACID: return "ITEM_DAMAGE_ACID"; + case enchantment::mod::ITEM_DAMAGE_BIO: return "ITEM_DAMAGE_BIO"; + case enchantment::mod::ITEM_DAMAGE_AP: return "ITEM_DAMAGE_AP"; + case enchantment::mod::ITEM_ARMOR_BASH: return "ITEM_ARMOR_BASH"; + case enchantment::mod::ITEM_ARMOR_CUT: return "ITEM_ARMOR_CUT"; + case enchantment::mod::ITEM_ARMOR_STAB: return "ITEM_ARMOR_STAB"; + case enchantment::mod::ITEM_ARMOR_HEAT: return "ITEM_ARMOR_HEAT"; + case enchantment::mod::ITEM_ARMOR_COLD: return "ITEM_ARMOR_COLD"; + case enchantment::mod::ITEM_ARMOR_ELEC: return "ITEM_ARMOR_ELEC"; + case enchantment::mod::ITEM_ARMOR_ACID: return "ITEM_ARMOR_ACID"; + case enchantment::mod::ITEM_ARMOR_BIO: return "ITEM_ARMOR_BIO"; + case enchantment::mod::ITEM_WEIGHT: return "ITEM_WEIGHT"; + case enchantment::mod::ITEM_ENCUMBRANCE: return "ITEM_ENCUMBRANCE"; + case enchantment::mod::ITEM_VOLUME: return "ITEM_VOLUME"; + case enchantment::mod::ITEM_COVERAGE: return "ITEM_COVERAGE"; + case enchantment::mod::ITEM_ATTACK_SPEED: return "ITEM_ATTACK_SPEED"; + case enchantment::mod::ITEM_WET_PROTECTION: return "ITEM_WET_PROTECTION"; + case enchantment::mod::NUM_MOD: break; + } + debugmsg( "Invalid enchantment::mod" ); + abort(); + } + // *INDENT-ON* +} // namespace io + +namespace +{ +generic_factory spell_factory( "enchantment" ); +} // namespace + +template<> +const enchantment &string_id::obj() const +{ + return spell_factory.obj( *this ); +} + +template<> +bool string_id::is_valid() const +{ + return spell_factory.is_valid( *this ); +} + +void enchantment::load_enchantment( JsonObject &jo, const std::string &src ) +{ + spell_factory.load( jo, src ); +} + +bool enchantment::is_active( const Character &guy, const item &parent ) const +{ + if( !guy.has_item( parent ) ) { + return false; + } + + if( active_conditions.first == has::HELD && + active_conditions.second == condition::ALWAYS ) { + return true; + } + + if( !( active_conditions.first == has::HELD || + ( active_conditions.first == has::WIELD && &guy.weapon == &parent ) || + ( active_conditions.first == has::WORN && guy.is_worn( parent ) ) ) ) { + return false; + } + + if( active_conditions.second == condition::ALWAYS ) { + return true; + } + + if( active_conditions.second == condition::UNDERGROUND ) { + return guy.pos().z < 0; + } + + if( active_conditions.second == condition::UNDERWATER ) { + return g->m.is_divable( guy.pos() ); + } + return false; +} + +void enchantment::add_activation( const time_duration &dur, const fake_spell &fake ) +{ + intermittent_activation[dur].emplace_back( fake ); +} + +void enchantment::load( JsonObject &jo, const std::string & ) +{ + optional( jo, was_loaded, "id", id, enchantment_id( "" ) ); + + jo.read( "hit_you_effect", hit_you_effect ); + jo.read( "hit_me_effect", hit_me_effect ); + + if( jo.has_object( "intermittent_activation" ) ) { + JsonObject jobj = jo.get_object( "intermittent_activation" ); + JsonArray jarray = jo.get_array( "effects" ); + while( jarray.has_more() ) { + JsonObject effect_obj; + time_duration dur = read_from_json_string( *effect_obj.get_raw( "frequency" ), + time_duration::units ); + if( effect_obj.has_array( "spell_effects" ) ) { + JsonArray jarray = effect_obj.get_array( "spell_effects" ); + while( jarray.has_more() ) { + fake_spell fake; + JsonObject fake_spell_obj = jarray.next_object(); + fake.load( fake_spell_obj ); + add_activation( dur, fake ); + } + } else if( effect_obj.has_object( "spell_effects" ) ) { + fake_spell fake; + JsonObject fake_spell_obj = effect_obj.get_object( "spell_effects" ); + fake.load( fake_spell_obj ); + add_activation( dur, fake ); + } + } + } + + active_conditions.first = io::string_to_enum( jo.get_string( "has", "HELD" ) ); + active_conditions.second = io::string_to_enum( jo.get_string( "condition", + "ALWAYS" ) ); + + if( jo.has_array( "values" ) ) { + JsonArray jarray = jo.get_array( "values" ); + while( jarray.has_more() ) { + JsonObject value_obj = jarray.next_object(); + const enchantment::mod value = io::string_to_enum( value_obj.get_string( "value" ) ); + const int add = value_obj.get_int( "add", 0 ); + const double mult = value_obj.get_float( "multiply", 0.0 ); + if( add != 0 ) { + values_add.emplace( value, add ); + } + if( mult != 0.0 ) { + values_multiply.emplace( value, mult ); + } + } + } +} + +void enchantment::serialize( JsonOut &jsout ) const +{ + jsout.start_object(); + + jsout.member( "has", io::enum_to_string( active_conditions.first ) ); + jsout.member( "condition", io::enum_to_string( active_conditions.second ) ); + + if( !hit_you_effect.empty() ) { + jsout.member( "hit_you_effect" ); + jsout.start_array(); + for( const fake_spell &sp : hit_you_effect ) { + sp.serialize( jsout ); + } + jsout.end_array(); + } + + if( !hit_me_effect.empty() ) { + jsout.member( "hit_me_effect" ); + jsout.start_array(); + for( const fake_spell &sp : hit_me_effect ) { + sp.serialize( jsout ); + } + jsout.end_array(); + } + + if( !intermittent_activation.empty() ) { + jsout.member( "intermittent_activation" ); + jsout.start_object(); + for( const std::pair> pair : intermittent_activation ) { + jsout.member( "duration", pair.first ); + jsout.start_array( "effects" ); + for( const fake_spell &sp : pair.second ) { + sp.serialize( jsout ); + } + jsout.end_array(); + } + jsout.end_object(); + } + + jsout.member( "values" ); + jsout.start_array(); + for( int value = 0; value < mod::NUM_MOD; value++ ) { + mod enum_value = static_cast( value ); + if( get_value_add( enum_value ) == 0 && get_value_multiply( enum_value ) == 0.0 ) { + continue; + } + jsout.start_object(); + jsout.member( "value", io::enum_to_string( enum_value ) ); + if( get_value_add( enum_value ) != 0 ) { + jsout.member( "add", get_value_add( enum_value ) ); + } + if( get_value_multiply( enum_value ) != 0 ) { + jsout.member( "multiply", get_value_multiply( enum_value ) ); + } + jsout.end_object(); + } + jsout.end_array(); + + jsout.end_object(); +} + +bool enchantment::stacks_with( const enchantment &rhs ) const +{ + return active_conditions == rhs.active_conditions; +} + +bool enchantment::add( const enchantment &rhs ) +{ + if( !stacks_with( rhs ) ) { + return false; + } + for( const std::pair &pair_values : rhs.values_add ) { + values_add[pair_values.first] += pair_values.second; + } + for( const std::pair &pair_values : rhs.values_multiply ) { + // values do not multiply against each other, they add. + // so +10% and -10% will add to 0% + values_multiply[pair_values.first] += pair_values.second; + } + + hit_me_effect.insert( hit_me_effect.end(), rhs.hit_me_effect.begin(), rhs.hit_me_effect.end() ); + + hit_you_effect.insert( hit_you_effect.end(), rhs.hit_you_effect.begin(), rhs.hit_you_effect.end() ); + + for( const std::pair> &act_pair : + rhs.intermittent_activation ) { + for( const fake_spell &fake : act_pair.second ) { + intermittent_activation[act_pair.first].emplace_back( fake ); + } + } + return true; +} + +int enchantment::get_value_add( const mod value ) const +{ + const auto found = values_add.find( value ); + if( found == values_add.cend() ) { + return 0; + } + return found->second; +} + +double enchantment::get_value_multiply( const mod value ) const +{ + const auto found = values_multiply.find( value ); + if( found == values_multiply.cend() ) { + return 0; + } + return found->second; +} + +int enchantment::mult_bonus( enchantment::mod value_type, int base_value ) const +{ + return get_value_multiply( value_type ) * base_value; +} + +void enchantment::activate_passive( Character &guy ) const +{ + guy.mod_str_bonus( get_value_add( mod::STRENGTH ) ); + guy.mod_str_bonus( mult_bonus( mod::STRENGTH, guy.get_str_base() ) ); + + guy.mod_dex_bonus( get_value_add( mod::DEXTERITY ) ); + guy.mod_dex_bonus( mult_bonus( mod::DEXTERITY, guy.get_dex_base() ) ); + + guy.mod_per_bonus( get_value_add( mod::PERCEPTION ) ); + guy.mod_per_bonus( mult_bonus( mod::PERCEPTION, guy.get_per_base() ) ); + + guy.mod_int_bonus( get_value_add( mod::INTELLIGENCE ) ); + guy.mod_int_bonus( mult_bonus( mod::INTELLIGENCE, guy.get_int_base() ) ); + + guy.mod_speed_bonus( get_value_add( mod::SPEED ) ); + guy.mod_speed_bonus( mult_bonus( mod::SPEED, guy.get_speed_base() ) ); +} diff --git a/src/magic_enchantment.h b/src/magic_enchantment.h new file mode 100644 index 0000000000000..0debf8399d24c --- /dev/null +++ b/src/magic_enchantment.h @@ -0,0 +1,141 @@ +#pragma once +#ifndef MAGIC_ENCHANTMENT_H +#define MAGIC_ENCHANTMENT_H + +#include +#include +#include + +#include "magic.h" +#include "type_id.h" + +class Character; +class item; +class JsonOut; +class time_duration; + +// an "enchantment" is what passive artifact effects used to be: +// under certain conditions, the effect persists upon the appropriate Character +class enchantment +{ + public: + // if a Character "has" an enchantment, it is viable to check for the condition + enum has { + WIELD, + WORN, + HELD, + NUM_HAS + }; + // the condition at which the enchantment is giving passive effects + enum condition { + ALWAYS, + UNDERGROUND, + UNDERWATER, + NUM_CONDITION + }; + // the different types of values that can be modified by enchantments + // either the item directly or the Character, whichever is more appropriate + enum mod { + // effects for the Character + STRENGTH, + DEXTERITY, + PERCEPTION, + INTELLIGENCE, + SPEED, + ATTACK_COST, + MOVE_COST, + METABOLISM, + MAX_MANA, + REGEN_MANA, + BIONIC_POWER, + MAX_STAMINA, + REGEN_STAMINA, + MAX_HP, // for all limbs! use with caution + REGEN_HP, + THIRST, // cost or regen over time + FATIGUE, // cost or regen over time + PAIN, // cost or regen over time + BONUS_DODGE, + BONUS_BLOCK, + BONUS_DAMAGE, + ATTACK_NOISE, + SPELL_NOISE, + SHOUT_NOISE, + FOOTSTEP_NOISE, + SIGHT_RANGE, + CARRY_WEIGHT, + CARRY_VOLUME, + SOCIAL_LIE, + SOCIAL_PERSUADE, + SOCIAL_INTIMIDATE, + // effects for the item that has the enchantment + ITEM_DAMAGE_BASH, + ITEM_DAMAGE_CUT, + ITEM_DAMAGE_STAB, + ITEM_DAMAGE_HEAT, + ITEM_DAMAGE_COLD, + ITEM_DAMAGE_ELEC, + ITEM_DAMAGE_ACID, + ITEM_DAMAGE_BIO, + ITEM_DAMAGE_AP, // armor piercing + ITEM_ARMOR_BASH, + ITEM_ARMOR_CUT, + ITEM_ARMOR_STAB, + ITEM_ARMOR_HEAT, + ITEM_ARMOR_COLD, + ITEM_ARMOR_ELEC, + ITEM_ARMOR_ACID, + ITEM_ARMOR_BIO, + ITEM_WEIGHT, + ITEM_ENCUMBRANCE, + ITEM_VOLUME, + ITEM_COVERAGE, + ITEM_ATTACK_SPEED, + ITEM_WET_PROTECTION, + NUM_MOD + }; + + static void load_enchantment( JsonObject &jo, const std::string &src ); + void load( JsonObject &jo, const std::string &src = "" ); + + // attempts to add two like enchantments together. + // if their conditions don't match, return false. else true. + bool add( const enchantment &rhs ); + + int get_value_add( mod value ) const; + double get_value_multiply( mod value ) const; + + // this enchantment has a valid condition and is in the right location + bool is_active( const Character &guy, const item &parent ) const; + + // modifies character stats, or does other passive effects + void activate_passive( Character &guy ) const; + + enchantment_id id; + + bool was_loaded; + + void serialize( JsonOut &jsout ) const; + private: + // values that add to the base value + std::map values_add; + // values that get multiplied to the base value + // multipliers add to each other instead of multiply against themselves + std::map values_multiply; + + std::vector hit_me_effect; + std::vector hit_you_effect; + + std::map> intermittent_activation; + + std::pair active_conditions; + + void add_activation( const time_duration &dur, const fake_spell &fake ); + + // checks if the enchantments have the same active_conditions + bool stacks_with( const enchantment &rhs ) const; + + int mult_bonus( mod value_type, int base_value ) const; +}; + +#endif diff --git a/src/main_menu.cpp b/src/main_menu.cpp index dca5133e8ef2c..0e943ad11f963 100644 --- a/src/main_menu.cpp +++ b/src/main_menu.cpp @@ -32,6 +32,7 @@ #include "sounds.h" #include "text_snippets.h" #include "translations.h" +#include "wcwidth.h" #include "worldfactory.h" #include "color.h" #include "enums.h" @@ -62,6 +63,32 @@ void main_menu::clear_error() errflag = false; } +//CJK characters have a width of 2, etc +static int utf8_width_notags( const char *s ) +{ + int len = strlen( s ); + const char *ptr = s; + int w = 0; + bool inside_tag = false; + while( len > 0 ) { + uint32_t ch = UTF8_getch( &ptr, &len ); + if( ch == UNKNOWN_UNICODE ) { + continue; + } + if( ch == '<' ) { + inside_tag = true; + } else if( ch == '>' ) { + inside_tag = false; + continue; + } + if( inside_tag ) { + continue; + } + w += mk_wcwidth( ch ); + } + return w; +} + void main_menu::print_menu_items( const catacurses::window &w_in, const std::vector &vItems, size_t iSel, point offset, int spacing ) @@ -82,8 +109,9 @@ void main_menu::print_menu_items( const catacurses::window &w_in, } } - if( utf8_width( remove_color_tags( text ) ) > getmaxx( w_in ) ) { - offset.y -= std::ceil( utf8_width( remove_color_tags( text ) ) / getmaxx( w_in ) ); + int text_width = utf8_width_notags( text.c_str() ); + if( text_width > getmaxx( w_in ) ) { + offset.y -= std::ceil( text_width / getmaxx( w_in ) ); } fold_and_print( w_in, offset, getmaxx( w_in ), c_light_gray, text, ']' ); @@ -149,7 +177,7 @@ void main_menu::print_menu( const catacurses::window &w_open, int iSel, const po int menu_length = 0; for( size_t i = 0; i < vMenuItems.size(); ++i ) { - menu_length += utf8_width( vMenuItems[i], true ) + 2; + menu_length += utf8_width_notags( vMenuItems[i].c_str() ) + 2; if( !vMenuHotkeys[i].empty() ) { menu_length += utf8_width( vMenuHotkeys[i][0] ); } diff --git a/src/map.cpp b/src/map.cpp index 175a24faa75b7..792886756d031 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -21,8 +21,8 @@ #include "debug.h" #include "drawing_primitives.h" #include "emit.h" +#include "event_bus.h" #include "explosion.h" -#include "timed_event.h" #include "fragment_cloud.h" #include "fungal_effects.h" #include "game.h" @@ -54,6 +54,7 @@ #include "sounds.h" #include "string_formatter.h" #include "submap.h" +#include "timed_event.h" #include "translations.h" #include "trap.h" #include "veh_type.h" @@ -283,7 +284,7 @@ void map::clear_vehicle_list( const int zlev ) ch.zone_vehicles.clear(); } -void map::update_vehicle_list( submap *const to, const int zlev ) +void map::update_vehicle_list( const submap *const to, const int zlev ) { // Update vehicle data auto &ch = get_cache( zlev ); @@ -1110,7 +1111,7 @@ vehicle *map::displace_vehicle( tripoint &p, const tripoint &dp ) // Invalidate vehicle's point cache veh->occupied_cache_time = calendar::before_time_starts; if( src_submap != dst_submap ) { - veh->set_submap_moved( int( p2.x / SEEX ), int( p2.y / SEEY ) ); + veh->set_submap_moved( point( p2.x / SEEX, p2.y / SEEY ) ); auto src_submap_veh_it = src_submap->vehicles.begin() + our_i; dst_submap->vehicles.push_back( std::move( *src_submap_veh_it ) ); src_submap->vehicles.erase( src_submap_veh_it ); @@ -1406,15 +1407,14 @@ ter_id map::ter( const tripoint &p ) const return current_submap->get_ter( l ); } -uint8_t map::get_known_connections( const tripoint &p, int connect_group ) const +uint8_t map::get_known_connections( const tripoint &p, int connect_group, + const std::map &override ) const { constexpr std::array offsets = {{ point_south, point_east, point_west, point_north } }; auto &ch = access_cache( p.z ); - bool is_transparent = - ch.transparency_cache[p.x][p.y] > LIGHT_TRANSPARENCY_SOLID; uint8_t val = 0; std::function is_memorized; #ifdef TILES @@ -1433,16 +1433,26 @@ uint8_t map::get_known_connections( const tripoint &p, int connect_group ) const } #endif + const bool overridden = override.find( p ) != override.end(); + const bool is_transparent = ch.transparency_cache[p.x][p.y] > LIGHT_TRANSPARENCY_SOLID; + // populate connection information for( int i = 0; i < 4; ++i ) { tripoint neighbour = p + offsets[i]; if( !inbounds( neighbour ) ) { continue; } - if( is_transparent || - ch.visibility_cache[neighbour.x][neighbour.y] <= LL_BRIGHT || - is_memorized( neighbour ) ) { - const ter_t &neighbour_terrain = ter( neighbour ).obj(); + const auto neighbour_override = override.find( neighbour ); + const bool neighbour_overridden = neighbour_override != override.end(); + // if there's some non-memory terrain to show at the neighboring tile + const bool may_connect = neighbour_overridden || + get_visibility( ch.visibility_cache[neighbour.x][neighbour.y], + get_visibility_variables_cache() ) == VIS_CLEAR || + // or if an actual center tile is transparent or next to a memorized tile + ( !overridden && ( is_transparent || is_memorized( neighbour ) ) ); + if( may_connect ) { + const ter_t &neighbour_terrain = neighbour_overridden ? + neighbour_override->second.obj() : ter( neighbour ).obj(); if( neighbour_terrain.connects_to( connect_group ) ) { val += 1 << i; } @@ -3103,8 +3113,7 @@ void map::bash_ter_furn( const tripoint &p, bash_params ¶ms ) false, "environment", "alarm" ); // Blame nearby player if( rl_dist( g->u.pos(), p ) <= 3 ) { - g->u.add_memorial_log( pgettext( "memorial_male", "Set off an alarm." ), - pgettext( "memorial_female", "Set off an alarm." ) ); + g->events().send( g->u.getID() ); const point abs = ms_to_sm_copy( getabs( p.xy() ) ); g->timed_events.add( TIMED_EVENT_WANTED, calendar::turn + 30_minutes, 0, tripoint( abs, p.z ) ); @@ -4527,7 +4536,9 @@ static void process_vehicle_items( vehicle &cur_veh, int part ) const time_duration time_left = cycle_time - n.age(); static const std::string no_sterile( "NO_STERILE" ); if( time_left <= 0_turns ) { - n.item_tags.erase( no_sterile ); + if( !n.has_flag( "NO_PACKED" ) ) { + n.item_tags.erase( no_sterile ); + } autoclave_finished = true; cur_veh.parts[part].enabled = false; } else if( calendar::once_every( 15_minutes ) ) { @@ -4731,10 +4742,20 @@ void map::process_items_in_vehicle( vehicle &cur_veh, submap ¤t_submap, co bool map::sees_some_items( const tripoint &p, const Creature &who ) const { // Can only see items if there are any items. - return has_items( p ) && could_see_items( p, who ); + return has_items( p ) && could_see_items( p, who.pos() ); +} + +bool map::sees_some_items( const tripoint &p, const tripoint &from ) const +{ + return has_items( p ) && could_see_items( p, from ); } bool map::could_see_items( const tripoint &p, const Creature &who ) const +{ + return could_see_items( p, who.pos() ); +} + +bool map::could_see_items( const tripoint &p, const tripoint &from ) const { static const std::string container_string( "CONTAINER" ); const bool container = has_flag_ter_or_furn( container_string, p ); @@ -4746,9 +4767,9 @@ bool map::could_see_items( const tripoint &p, const Creature &who ) const if( container ) { // can see inside of containers if adjacent or // on top of the container - return ( abs( p.x - who.posx() ) <= 1 && - abs( p.y - who.posy() ) <= 1 && - abs( p.z - who.posz() ) <= 1 ); + return ( abs( p.x - from.x ) <= 1 && + abs( p.y - from.y ) <= 1 && + abs( p.z - from.z ) <= 1 ); } return true; } @@ -6121,6 +6142,15 @@ bool map::sees( const tripoint &F, const tripoint &T, const int range, int &bres bresenham_slope = 0; return false; // Out of range! } + // Cannonicalize the order of the tripoints so the cache is reflexive. + const tripoint &min = F < T ? F : T; + const tripoint &max = !( F < T ) ? F : T; + // A little gross, just pack the values into a point. + const point key( min.x << 16 | min.y << 8 | min.z, max.x << 16 | max.y << 8 | max.z ); + char cached = skew_vision_cache.get( key, -1 ); + if( cached >= 0 ) { + return cached > 0; + } bool visible = true; // Ugly `if` for now @@ -6137,6 +6167,7 @@ bool map::sees( const tripoint &F, const tripoint &T, const int range, int &bres } return true; } ); + skew_vision_cache.insert( 100000, key, visible ? 1 : 0 ); return visible; } @@ -6168,6 +6199,7 @@ bool map::sees( const tripoint &F, const tripoint &T, const int range, int &bres last_point = new_point; return true; } ); + skew_vision_cache.insert( 100000, key, visible ? 1 : 0 ); return visible; } @@ -7933,6 +7965,9 @@ void map::build_map_cache( const int zlev, bool skip_lightmap ) get_cache( p.z ).transparency_cache[p.x][p.y] = LIGHT_TRANSPARENCY_CLEAR; } + if( seen_cache_dirty ) { + skew_vision_cache.clear(); + } // Initial value is illegal player position. static tripoint player_prev_pos; if( seen_cache_dirty || player_prev_pos != p ) { @@ -8237,7 +8272,9 @@ void map::add_corpse( const tripoint &p ) } put_items_from_loc( "default_zombie_clothes", p, 0 ); - put_items_from_loc( "default_zombie_items", p, 0 ); + if( one_in( 3 ) ) { + put_items_from_loc( "default_zombie_items", p, 0 ); + } add_item_or_charges( p, body ); } diff --git a/src/map.h b/src/map.h index 3156c0ac37065..d73ec71934b6a 100644 --- a/src/map.h +++ b/src/map.h @@ -23,6 +23,7 @@ #include "item.h" #include "item_stack.h" #include "lightmap.h" +#include "lru_cache.h" #include "shadowcasting.h" #include "type_id.h" #include "units.h" @@ -527,7 +528,7 @@ class map void reset_vehicle_cache( int zlev ); void clear_vehicle_cache( int zlev ); void clear_vehicle_list( int zlev ); - void update_vehicle_list( submap *to, int zlev ); + void update_vehicle_list( const submap *to, int zlev ); //Returns true if vehicle zones are dirty and need to be recached bool check_vehicle_zones( int zlev ); std::vector get_vehicle_zones( int zlev ); @@ -627,8 +628,11 @@ class map // connect_group. From least-significant bit the order is south, east, // west, north (because that's what cata_tiles expects). // Based on a combination of visibility and memory, not simply the true - // terrain. - uint8_t get_known_connections( const tripoint &p, int connect_group ) const; + // terrain. Additional overrides can be passed in to override terrain + // at specific positions. This is used to display terrain overview in + // the map editor. + uint8_t get_known_connections( const tripoint &p, int connect_group, + const std::map &override = {} ) const; /** * Returns the full harvest list, for spawning. */ @@ -656,12 +660,14 @@ class map * the creature is at p or at an adjacent square). */ bool sees_some_items( const tripoint &p, const Creature &who ) const; + bool sees_some_items( const tripoint &p, const tripoint &from ) const; /** * Check if the creature could see items at p if there were * any items. This is similar to @ref sees_some_items, but it * does not check that there are actually any items. */ bool could_see_items( const tripoint &p, const Creature &who ) const; + bool could_see_items( const tripoint &p, const tripoint &from ) const; /** * Checks for existence of items. Faster than i_at(p).empty */ @@ -1424,8 +1430,6 @@ class map float density ); void draw_lab( const oter_id &terrain_type, mapgendata &dat, const time_point &when, float density ); - void draw_silo( const oter_id &terrain_type, mapgendata &dat, const time_point &when, - float density ); void draw_temple( const oter_id &terrain_type, mapgendata &dat, const time_point &when, float density ); void draw_mine( const oter_id &terrain_type, mapgendata &dat, const time_point &when, @@ -1653,6 +1657,11 @@ class map */ std::set submaps_with_active_items; + /** + * Cache of coordinate pairs recently checked for visibility. + */ + mutable lru_cache skew_vision_cache; + // Note: no bounds check level_cache &get_cache( int zlev ) const { return *caches[zlev + OVERMAP_DEPTH]; diff --git a/src/map_extras.cpp b/src/map_extras.cpp index b1a24f80e2ca2..c84da54e4c18a 100644 --- a/src/map_extras.cpp +++ b/src/map_extras.cpp @@ -8,6 +8,7 @@ #include #include +#include "auto_note.h" #include "cellular_automata.h" #include "debug.h" #include "field.h" @@ -47,6 +48,7 @@ #include "point.h" #include "string_formatter.h" #include "weighted_list.h" +#include "rng.h" class npc_template; @@ -103,7 +105,6 @@ static const mtype_id mon_zombie_scientist( "mon_zombie_scientist" ); static const mtype_id mon_chickenbot( "mon_chickenbot" ); static const mtype_id mon_dispatch( "mon_dispatch" ); static const mtype_id mon_tankbot( "mon_tankbot" ); -static const mtype_id mon_turret( "mon_turret" ); static const mtype_id mon_turret_bmg( "mon_turret_bmg" ); static const mtype_id mon_turret_rifle( "mon_turret_rifle" ); static const mtype_id mon_zombie_spitter( "mon_zombie_spitter" ); @@ -118,6 +119,11 @@ static const mtype_id mon_wasp( "mon_wasp" ); static const mtype_id mon_jabberwock( "mon_jabberwock" ); static const mtype_id mon_wolf( "mon_wolf" ); +const generic_factory &mapExtraFactory() +{ + return extras; +} + static void mx_null( map &, const tripoint & ) { debugmsg( "Tried to generate null map extra." ); @@ -209,7 +215,8 @@ static void mx_house_wasp( map &m, const tripoint & ) } m.add_spawn( mon_wasp, 1, point( podx, pody ) ); } - m.place_items( "rare", 70, point_zero, point( SEEX * 2 - 1, SEEY * 2 - 1 ), false, 0 ); + m.place_items( "rare", 70, point_zero, point( SEEX * 2 - 1, SEEY * 2 - 1 ), false, + calendar::start_of_cataclysm ); } static void mx_house_spider( map &m, const tripoint & ) @@ -242,7 +249,8 @@ static void mx_house_spider( map &m, const tripoint & ) } } } - m.place_items( "rare", 60, point_zero, point( SEEX * 2 - 1, SEEY * 2 - 1 ), false, 0 ); + m.place_items( "rare", 60, point_zero, point( SEEX * 2 - 1, SEEY * 2 - 1 ), false, + calendar::start_of_cataclysm ); } @@ -419,15 +427,15 @@ static void mx_military( map &m, const tripoint & ) return m.passable( n ); } ) ) { if( one_in( 10 ) ) { - m.add_spawn( mon_zombie_soldier, 1, point( p->x, p->y ) ); + m.add_spawn( mon_zombie_soldier, 1, p->xy() ); } else if( one_in( 25 ) ) { if( one_in( 2 ) ) { - m.add_spawn( mon_zombie_bio_op, 1, point( p->x, p->y ) ); + m.add_spawn( mon_zombie_bio_op, 1, p->xy() ); } else { - m.add_spawn( mon_dispatch, 1, point( p->x, p->y ) ); + m.add_spawn( mon_dispatch, 1, p->xy() ); } } else { - m.place_items( "map_extra_military", 100, *p, *p, true, 0 ); + m.place_items( "map_extra_military", 100, *p, *p, true, calendar::start_of_cataclysm ); } } @@ -439,7 +447,8 @@ static void mx_military( map &m, const tripoint & ) } m.place_spawns( GROUP_MAYBE_MIL, 2, point_zero, point( SEEX * 2 - 1, SEEY * 2 - 1 ), 0.1f ); //0.1 = 1-5 - m.place_items( "rare", 25, point_zero, point( SEEX * 2 - 1, SEEY * 2 - 1 ), true, 0 ); + m.place_items( "rare", 25, point_zero, point( SEEX * 2 - 1, SEEY * 2 - 1 ), true, + calendar::start_of_cataclysm ); } static void mx_science( map &m, const tripoint & ) @@ -450,9 +459,9 @@ static void mx_science( map &m, const tripoint & ) return m.passable( n ); } ) ) { if( one_in( 10 ) ) { - m.add_spawn( mon_zombie_scientist, 1, point( p->x, p->y ) ); + m.add_spawn( mon_zombie_scientist, 1, p->xy() ); } else { - m.place_items( "map_extra_science", 100, *p, *p, true, 0 ); + m.place_items( "map_extra_science", 100, *p, *p, true, calendar::start_of_cataclysm ); } } } @@ -461,7 +470,8 @@ static void mx_science( map &m, const tripoint & ) int mx = rng( 1, SEEX * 2 - 2 ), my = rng( 1, SEEY * 2 - 2 ); m.place_spawns( GROUP_NETHER_CAPTURED, 1, point( mx, my ), point( mx, my ), 1, true ); } - m.place_items( "rare", 45, point_zero, point( SEEX * 2 - 1, SEEY * 2 - 1 ), true, 0 ); + m.place_items( "rare", 45, point_zero, point( SEEX * 2 - 1, SEEY * 2 - 1 ), true, + calendar::start_of_cataclysm ); } static void mx_collegekids( map &m, const tripoint & ) @@ -475,14 +485,14 @@ static void mx_collegekids( map &m, const tripoint & ) return m.passable( n ); } ) ) { if( one_in( 10 ) ) { - m.add_spawn( mon_zombie_tough, 1, point( p->x, p->y ) ); + m.add_spawn( mon_zombie_tough, 1, p->xy() ); } else { if( type < 6 ) { // kids going to a cabin in the woods - m.place_items( "map_extra_college_camping", 100, *p, *p, true, 0 ); + m.place_items( "map_extra_college_camping", 100, *p, *p, true, calendar::start_of_cataclysm ); } else if( type < 9 ) { // kids going to a sporting event - m.place_items( "map_extra_college_sports", 100, *p, *p, true, 0 ); + m.place_items( "map_extra_college_sports", 100, *p, *p, true, calendar::start_of_cataclysm ); } else { // kids going to a lake - m.place_items( "map_extra_college_lake", 100, *p, *p, true, 0 ); + m.place_items( "map_extra_college_lake", 100, *p, *p, true, calendar::start_of_cataclysm ); } } } @@ -586,7 +596,7 @@ static void mx_roadblock( map &m, const tripoint &abs_sub ) if( const auto p = random_point( m, [&m]( const tripoint & n ) { return m.passable( n ); } ) ) { - m.place_items( "map_extra_military", 100, *p, *p, true, 0 ); + m.place_items( "map_extra_military", 100, *p, *p, true, calendar::start_of_cataclysm ); int splatter_range = rng( 1, 3 ); for( int j = 0; j <= splatter_range; j++ ) { @@ -599,22 +609,22 @@ static void mx_roadblock( map &m, const tripoint &abs_sub ) if( road_at_north ) { line_furn( &m, f_barricade_road, 4, 3, 10, 3 ); line_furn( &m, f_barricade_road, 13, 3, 19, 3 ); - m.add_spawn( mon_turret, 1, point( 12, 1 ) ); + m.add_spawn( mon_turret_rifle, 1, point( 12, 1 ) ); } if( road_at_east ) { line_furn( &m, f_barricade_road, SEEX * 2 - 3, 4, SEEX * 2 - 3, 10 ); line_furn( &m, f_barricade_road, SEEX * 2 - 3, 13, SEEX * 2 - 3, 19 ); - m.add_spawn( mon_turret, 1, point( SEEX * 2 - 1, 12 ) ); + m.add_spawn( mon_turret_rifle, 1, point( SEEX * 2 - 1, 12 ) ); } if( road_at_south ) { line_furn( &m, f_barricade_road, 4, SEEY * 2 - 3, 10, SEEY * 2 - 3 ); line_furn( &m, f_barricade_road, 13, SEEY * 2 - 3, 19, SEEY * 2 - 3 ); - m.add_spawn( mon_turret, 1, point( 12, SEEY * 2 - 1 ) ); + m.add_spawn( mon_turret_rifle, 1, point( 12, SEEY * 2 - 1 ) ); } if( road_at_west ) { line_furn( &m, f_barricade_road, 3, 4, 3, 10 ); line_furn( &m, f_barricade_road, 3, 13, 3, 19 ); - m.add_spawn( mon_turret, 1, point( 1, 12 ) ); + m.add_spawn( mon_turret_rifle, 1, point( 1, 12 ) ); } m.add_vehicle( vproto_id( "policecar" ), point( 8, 6 ), 20 ); @@ -624,7 +634,7 @@ static void mx_roadblock( map &m, const tripoint &abs_sub ) if( const auto p = random_point( m, [&m]( const tripoint & n ) { return m.passable( n ); } ) ) { - m.place_items( "map_extra_police", 100, *p, *p, true, 0 ); + m.place_items( "map_extra_police", 100, *p, *p, true, calendar::start_of_cataclysm ); int splatter_range = rng( 1, 3 ); for( int j = 0; j <= splatter_range; j++ ) { @@ -765,7 +775,8 @@ static void mx_drugdeal( map &m, const tripoint &abs_sub ) if( one_in( 10 ) ) { m.add_spawn( mon_zombie_spitter, 1, point( x, y ) ); } else { - m.place_items( "map_extra_drugdeal", 100, point( x, y ), point( x, y ), true, 0 ); + m.place_items( "map_extra_drugdeal", 100, point( x, y ), point( x, y ), true, + calendar::start_of_cataclysm ); int splatter_range = rng( 1, 3 ); for( int j = 0; j <= splatter_range; j++ ) { m.add_field( {x + j * x_offset, y + j * y_offset, abs_sub.z}, fd_blood, 1, 0_turns ); @@ -798,7 +809,8 @@ static void mx_drugdeal( map &m, const tripoint &abs_sub ) if( one_in( 20 ) ) { m.add_spawn( mon_zombie_smoker, 1, point( x, y ) ); } else { - m.place_items( "map_extra_drugdeal", 100, point( x, y ), point( x, y ), true, 0 ); + m.place_items( "map_extra_drugdeal", 100, point( x, y ), point( x, y ), true, + calendar::start_of_cataclysm ); int splatter_range = rng( 1, 3 ); for( int j = 0; j <= splatter_range; j++ ) { m.add_field( {x + j * x_offset, y + j * y_offset, abs_sub.z}, fd_blood, 1, 0_turns ); @@ -831,7 +843,7 @@ static void mx_supplydrop( map &m, const tripoint &/*abs_sub*/ ) if( !p ) { break; } - m.furn_set( point( p->x, p->y ), f_crate_c ); + m.furn_set( p->xy(), f_crate_c ); std::string item_group; switch( rng( 1, 10 ) ) { case 1: @@ -855,7 +867,8 @@ static void mx_supplydrop( map &m, const tripoint &/*abs_sub*/ ) } int items_created = 0; for( int i = 0; i < 10 && items_created < 2; i++ ) { - items_created += m.place_items( item_group, 80, *p, *p, true, 0, 100 ).size(); + items_created += m.place_items( item_group, 80, *p, *p, true, calendar::start_of_cataclysm, + 100 ).size(); } if( m.i_at( *p ).empty() ) { m.destroy( *p, true ); @@ -865,18 +878,49 @@ static void mx_supplydrop( map &m, const tripoint &/*abs_sub*/ ) static void mx_portal( map &m, const tripoint &abs_sub ) { - int x = rng( 1, SEEX * 2 - 2 ), y = rng( 1, SEEY * 2 - 2 ); - for( int i = x - 1; i <= x + 1; i++ ) { - for( int j = y - 1; j <= y + 1; j++ ) { - m.make_rubble( tripoint( i, j, abs_sub.z ), f_rubble_rock, true ); + // All points except the borders are valid--we need the 1 square buffer so that we can do a 1 unit radius + // around our chosen portal point without clipping against the edge of the map. + const tripoint_range points = m.points_in_rectangle( { 1, 1, abs_sub.z }, { SEEX * 2 - 2, SEEY * 2 - 2, abs_sub.z } ); + + // Get a random point in our collection that does not have a trap and does not have the NO_FLOOR flag. + const cata::optional portal_pos = random_point( points, [&]( const tripoint & p ) { + return !m.has_flag_ter( TFLAG_NO_FLOOR, p ) && m.tr_at( p ).is_null(); + } ); + + // If we can't get a point to spawn the portal (e.g. we're triggered in entirely open air) we're done here. + if( !portal_pos ) { + return; + } + + // For our portal point and every adjacent location, make rubble if it doesn't have the NO_FLOOR flag. + for( const tripoint &p : m.points_in_radius( *portal_pos, 1 ) ) { + if( !m.has_flag_ter( TFLAG_NO_FLOOR, p ) ) { + m.make_rubble( p, f_rubble_rock, true ); } } - mtrap_set( &m, x, y, tr_portal ); + + m.trap_set( *portal_pos, tr_portal ); + + // We'll make between 0 and 4 attempts to spawn monsters here. int num_monsters = rng( 0, 4 ); for( int i = 0; i < num_monsters; i++ ) { - int mx = rng( 1, SEEX * 2 - 2 ), my = rng( 1, SEEY * 2 - 2 ); - m.make_rubble( tripoint( mx, my, abs_sub.z ), f_rubble_rock, true ); - m.place_spawns( GROUP_NETHER_PORTAL, 1, point( mx, my ), point( mx, my ), 1, true ); + // Get a random location from our points that is not the portal location, does not have the + // NO_FLOOR flag, and isn't currently occupied by a creature. + const cata::optional mon_pos = random_point( points, [&]( const tripoint & p ) { + return !m.has_flag_ter( TFLAG_NO_FLOOR, p ) && *portal_pos != p && !g->critter_at( p ); + } ); + + // If we couldn't get a random location, we can't place a monster and we know that there are no + // more possible valid locations, so just bail. + if( !mon_pos ) { + break; + } + + // Make rubble here--it's not necessarily a location that is directly adjacent to the portal. + m.make_rubble( *mon_pos, f_rubble_rock, true ); + + // Spawn a single monster from our group here. + m.place_spawns( GROUP_NETHER_PORTAL, 1, mon_pos->xy(), mon_pos->xy(), 1, true ); } } @@ -1318,14 +1362,16 @@ static void mx_minefield( map &m, const tripoint &abs_sub ) } } //Spawn trash in a crate and its surroundings - m.place_items( "trash_cart", 80, { 19, 11, abs_sub.z }, { 21, 13, abs_sub.z }, false, 0 ); + m.place_items( "trash_cart", 80, { 19, 11, abs_sub.z }, { 21, 13, abs_sub.z }, false, + calendar::start_of_cataclysm ); } else { m.spawn_item( { 20, 11, abs_sub.z }, "hatchet" ); m.spawn_item( { 22, 12, abs_sub.z }, "vodka" ); m.spawn_item( { 20, 14, abs_sub.z }, "acoustic_guitar" ); //Spawn trash in a crate - m.place_items( "trash_cart", 80, { 20, 12, abs_sub.z }, { 20, 12, abs_sub.z }, false, 0 ); + m.place_items( "trash_cart", 80, { 20, 12, abs_sub.z }, { 20, 12, abs_sub.z }, false, + calendar::start_of_cataclysm ); } //Place a tent @@ -2324,7 +2370,7 @@ static void mx_roadworks( map &m, const tripoint &abs_sub ) if( one_in( 3 ) ) { m.furn_set( equipment, f_crate_c ); m.place_items( "mine_equipment", 100, tripoint( equipment, 0 ), - tripoint( equipment, 0 ), true, 0, 100 ); + tripoint( equipment, 0 ), true, calendar::start_of_cataclysm, 100 ); } } @@ -2560,6 +2606,66 @@ static void mx_casings( map &m, const tripoint &abs_sub ) } } +static void mx_looters( map &m, const tripoint &abs_sub ) +{ + const tripoint center( rng( 5, SEEX * 2 - 5 ), rng( 5, SEEY * 2 - 5 ), abs_sub.z ); + //25% chance to spawn a corpse with some blood around it + if( one_in( 4 ) && g->is_empty( center ) ) { + const auto &loc = m.points_in_radius( center, 1 ); + m.add_corpse( center ); + for( int i = 0; i < rng( 1, 3 ); i++ ) { + const tripoint where = random_entry( loc ); + m.add_field( where, fd_blood, rng( 1, 3 ) ); + } + } + + //Spawn up to 5 hostile bandits with equal chance to be ranged or melee type + const int num_looters = rng( 1, 5 ); + for( int i = 0; i < num_looters; i++ ) { + const tripoint pos = random_entry( m.points_in_radius( center, rng( 1, 4 ) ) ); + if( g->is_empty( pos ) ) { + if( one_in( 2 ) ) { + m.place_npc( pos.xy(), string_id( "bandit" ) ); + } else { + m.place_npc( pos.xy(), string_id( "thug" ) ); + } + } + } +} + +static void mx_corpses( map &m, const tripoint &abs_sub ) +{ + const int num_corpses = rng( 1, 5 ); + const auto gibs = item_group::items_from( "remains_human_generic", calendar::start_of_cataclysm ); + //Spawn up to 5 human corpses in random places + for( int i = 0; i < num_corpses; i++ ) { + const tripoint corpse_location = { rng( 1, SEEX * 2 - 1 ), rng( 1, SEEY * 2 - 1 ), abs_sub.z }; + if( g->is_empty( corpse_location ) ) { + m.add_field( corpse_location, fd_blood, rng( 1, 3 ) ); + m.add_corpse( corpse_location ); + //50% chance to spawn blood in every tile around every corpse in 1-tile radius + for( const auto &loc : m.points_in_radius( corpse_location, 1 ) ) { + if( one_in( 2 ) ) { + m.add_field( loc, fd_blood, rng( 1, 3 ) ); + } + } + } + } + //10% chance to spawn a flock of stray dogs feeding on human flesh + if( one_in( 10 ) && num_corpses <= 4 ) { + const tripoint corpse_location = { rng( 1, SEEX * 2 - 1 ), rng( 1, SEEY * 2 - 1 ), abs_sub.z }; + m.spawn_items( corpse_location, gibs ); + m.add_field( corpse_location, fd_gibs_flesh, rng( 1, 3 ) ); + //50% chance to spawn gibs and dogs in every tile around what's left of human corpse in 1-tile radius + for( const auto &loc : m.points_in_radius( corpse_location, 1 ) ) { + if( one_in( 2 ) ) { + m.add_field( { loc.xy(), abs_sub.z }, fd_gibs_flesh, rng( 1, 3 ) ); + m.place_spawns( mongroup_id( "GROUP_STRAY_DOGS" ), 1, loc.xy(), loc.xy(), 1, true ); + } + } + } +} + FunctionMap builtin_functions = { { "mx_null", mx_null }, { "mx_crater", mx_crater }, @@ -2593,7 +2699,9 @@ FunctionMap builtin_functions = { { "mx_burned_ground", mx_burned_ground }, { "mx_point_burned_ground", mx_point_burned_ground }, { "mx_marloss_pilgrimage", mx_marloss_pilgrimage }, - { "mx_casings", mx_casings } + { "mx_casings", mx_casings }, + { "mx_looters", mx_looters }, + { "mx_corpses", mx_corpses } }; map_extra_pointer get_function( const std::string &name ) @@ -2647,15 +2755,25 @@ void apply_function( const string_id &id, map &m, const tripoint &abs break; } overmap_buffer.add_extra( sm_to_omt_copy( abs_sub ), id ); + + auto_notes::auto_note_settings &autoNoteSettings = get_auto_notes_settings(); + + // The player has discovered a map extra of this type. + autoNoteSettings.set_discovered( id ); + if( get_option( "AUTO_NOTES" ) && get_option( "AUTO_NOTES_MAP_EXTRAS" ) ) { - const std::string mx_note = - string_format( "%s:%s;%s: %s", - extra.get_symbol(), - get_note_string_from_color( extra.color ), - extra.name, - extra.description ); - if( !mx_note.empty() ) { - overmap_buffer.add_note( sm_to_omt_copy( abs_sub ), mx_note ); + + // Only place note if the user has not disabled it via the auto note manager + if( autoNoteSettings.has_auto_note_enabled( id ) ) { + const std::string mx_note = + string_format( "%s:%s;%s: %s", + extra.get_symbol(), + get_note_string_from_color( extra.color ), + extra.name, + extra.description ); + if( !mx_note.empty() ) { + overmap_buffer.add_note( sm_to_omt_copy( abs_sub ), mx_note ); + } } } } diff --git a/src/map_extras.h b/src/map_extras.h index 6d766fa923d10..91a607381453c 100644 --- a/src/map_extras.h +++ b/src/map_extras.h @@ -10,10 +10,12 @@ #include "color.h" #include "string_id.h" + class JsonObject; class map; struct tripoint; template struct enum_traits; +template class generic_factory; enum class map_extra_method : int { null = 0, @@ -65,6 +67,9 @@ void apply_function( const std::string &id, map &m, const tripoint &abs_sub ); void load( JsonObject &jo, const std::string &src ); void check_consistency(); +/// This function provides access to all loaded map extras. +const generic_factory &mapExtraFactory(); + } // namespace MapExtras #endif diff --git a/src/map_field.cpp b/src/map_field.cpp index bf3beefb01282..cdf171540eae2 100644 --- a/src/map_field.cpp +++ b/src/map_field.cpp @@ -970,7 +970,7 @@ bool map::process_fields_in_submap( submap *const current_submap, curtype.obj().npc_complain_data; const int chance = std::get<0>( npc_complain_data ); if( chance > 0 && one_in( chance ) ) { - if( npc *const np = g->critter_at( p ) ) { + if( npc *const np = g->critter_at( p, false ) ) { np->complain_about( std::get<1>( npc_complain_data ), std::get<2>( npc_complain_data ), std::get<3>( npc_complain_data ) ); @@ -1082,7 +1082,7 @@ bool map::process_fields_in_submap( submap *const current_submap, cur.monster_spawn_radius() ), [this]( const tripoint & n ) { return passable( n ); } ) ) { - add_spawn( spawn_details.name, spawn_details.pack_size, point( spawn_point->x, spawn_point->y ) ); + add_spawn( spawn_details.name, spawn_details.pack_size, spawn_point->xy() ); } } } @@ -1531,10 +1531,10 @@ void map::player_in_field( player &u ) if( ft == fd_tear_gas ) { // Tear gas will both give you teargas disease and/or blind you. if( ( cur.get_field_intensity() > 1 || !one_in( 3 ) ) && ( !inside || one_in( 3 ) ) ) { - u.add_env_effect( effect_teargas, bp_mouth, 5, 2_minutes ); + u.add_env_effect( effect_teargas, bp_mouth, 5, 20_seconds ); } if( cur.get_field_intensity() > 1 && ( !inside || one_in( 3 ) ) ) { - u.add_env_effect( effect_blind, bp_eyes, cur.get_field_intensity() * 2, 1_minutes ); + u.add_env_effect( effect_blind, bp_eyes, cur.get_field_intensity() * 2, 10_seconds ); } } if( ft == fd_relax_gas ) { diff --git a/src/mapdata.cpp b/src/mapdata.cpp index 08a02ac3f67bc..9de3f147274f6 100644 --- a/src/mapdata.cpp +++ b/src/mapdata.cpp @@ -222,8 +222,8 @@ bool map_bash_info::load( JsonObject &jsobj, const std::string &member, bool is_ bash_below = j.get_bool( "bash_below", false ); - sound = translation( "smash!" ); - sound_fail = translation( "thump!" ); + sound = to_translation( "smash!" ); + sound_fail = to_translation( "thump!" ); j.read( "sound", sound ); j.read( "sound_fail", sound_fail ); diff --git a/src/mapgen.cpp b/src/mapgen.cpp index bbcd0a617332d..14674d606531f 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -90,14 +90,13 @@ const mongroup_id GROUP_SPIDER( "GROUP_SPIDER" ); const mongroup_id GROUP_TRIFFID_HEART( "GROUP_TRIFFID_HEART" ); const mongroup_id GROUP_TRIFFID( "GROUP_TRIFFID" ); const mongroup_id GROUP_TRIFFID_OUTER( "GROUP_TRIFFID_OUTER" ); -const mongroup_id GROUP_TURRET_SMG( "GROUP_TURRET_SMG" ); +const mongroup_id GROUP_TURRET( "GROUP_TURRET" ); const mongroup_id GROUP_VANILLA( "GROUP_VANILLA" ); const mongroup_id GROUP_ZOMBIE( "GROUP_ZOMBIE" ); const mongroup_id GROUP_ZOMBIE_COP( "GROUP_ZOMBIE_COP" ); void science_room( map *m, int x1, int y1, int x2, int y2, int z, int rotate ); void set_science_room( map *m, int x1, int y1, bool faces_right, const time_point &when ); -void silo_rooms( map *m ); void build_mine_room( map *m, room_type type, int x1, int y1, int x2, int y2, mapgendata &dat ); // (x,y,z) are absolute coordinates of a submap @@ -189,7 +188,7 @@ void map::generate( const tripoint &p, const time_point &when ) if( const auto p = random_point( *this, [this]( const tripoint & n ) { return passable( n ); } ) ) { - add_spawn( spawn_details.name, spawn_details.pack_size, point( p->x, p->y ) ); + add_spawn( spawn_details.name, spawn_details.pack_size, p->xy() ); } } } @@ -1066,7 +1065,7 @@ class jmapgen_item_group : public jmapgen_piece void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const float /*mon_density*/, mission * ) const override { dat.m.place_items( group_id, chance.get(), point( x.val, y.val ), point( x.valmax, y.valmax ), true, - 0 ); + calendar::start_of_cataclysm ); } }; @@ -2729,8 +2728,6 @@ void map::draw_map( const oter_id &terrain_type, const oter_id &t_north, const o draw_fema( terrain_type, dat, when, density ); } else if( is_ot_match( "mine", terrain_type, ot_match_type::prefix ) ) { draw_mine( terrain_type, dat, when, density ); - } else if( is_ot_match( "silo", terrain_type, ot_match_type::prefix ) ) { - draw_silo( terrain_type, dat, when, density ); } else if( is_ot_match( "anthill", terrain_type, ot_match_type::contains ) ) { draw_anthill( terrain_type, dat, when, density ); } else if( is_ot_match( "lab", terrain_type, ot_match_type::contains ) ) { @@ -2828,9 +2825,9 @@ void map::draw_office_tower( const oter_id &terrain_type, mapgendata &dat, "ss __,,__ _,,,,_ \n" "ssssss__,,__ss__,,__ssss\n" "ssssss______ss______ssss\n", ter_key, fur_key ); - place_items( "office", 75, point( 4, 2 ), point( 6, 2 ), false, 0 ); - place_items( "office", 75, point( 19, 6 ), point( 19, 6 ), false, 0 ); - place_items( "office", 75, point( 12, 8 ), point( 14, 8 ), false, 0 ); + place_items( "office", 75, point( 4, 2 ), point( 6, 2 ), false, calendar::start_of_cataclysm ); + place_items( "office", 75, point( 19, 6 ), point( 19, 6 ), false, calendar::start_of_cataclysm ); + place_items( "office", 75, point( 12, 8 ), point( 14, 8 ), false, calendar::start_of_cataclysm ); if( density > 1 ) { place_spawns( GROUP_ZOMBIE, 2, point_zero, point( 12, 3 ), density ); } else { @@ -2886,18 +2883,25 @@ void map::draw_office_tower( const oter_id &terrain_type, mapgendata &dat, } else { place_spawns( GROUP_PLAIN, 1, point( 5, 7 ), point( 15, 20 ), 0.1 ); } - place_items( "office", 75, point( 4, 23 ), point( 7, 23 ), false, 0 ); - place_items( "office", 75, point( 4, 19 ), point( 7, 19 ), false, 0 ); - place_items( "office", 75, point( 4, 14 ), point( 7, 14 ), false, 0 ); - place_items( "office", 75, point( 5, 16 ), point( 7, 16 ), false, 0 ); - place_items( "fridge", 80, point( 14, 17 ), point( 14, 17 ), false, 0 ); - place_items( "cleaning", 75, point( 19, 17 ), point( 20, 17 ), false, 0 ); - place_items( "cubical_office", 75, point( 6, 12 ), point( 7, 12 ), false, 0 ); - place_items( "cubical_office", 75, point( 12, 11 ), point( 12, 12 ), false, 0 ); - place_items( "cubical_office", 75, point( 16, 11 ), point( 17, 12 ), false, 0 ); - place_items( "cubical_office", 75, point( 4, 5 ), point( 5, 5 ), false, 0 ); - place_items( "cubical_office", 75, point( 11, 5 ), point( 12, 5 ), false, 0 ); - place_items( "cubical_office", 75, point( 14, 5 ), point( 16, 5 ), false, 0 ); + place_items( "office", 75, point( 4, 23 ), point( 7, 23 ), false, calendar::start_of_cataclysm ); + place_items( "office", 75, point( 4, 19 ), point( 7, 19 ), false, calendar::start_of_cataclysm ); + place_items( "office", 75, point( 4, 14 ), point( 7, 14 ), false, calendar::start_of_cataclysm ); + place_items( "office", 75, point( 5, 16 ), point( 7, 16 ), false, calendar::start_of_cataclysm ); + place_items( "fridge", 80, point( 14, 17 ), point( 14, 17 ), false, calendar::start_of_cataclysm ); + place_items( "cleaning", 75, point( 19, 17 ), point( 20, 17 ), false, + calendar::start_of_cataclysm ); + place_items( "cubical_office", 75, point( 6, 12 ), point( 7, 12 ), false, + calendar::start_of_cataclysm ); + place_items( "cubical_office", 75, point( 12, 11 ), point( 12, 12 ), false, + calendar::start_of_cataclysm ); + place_items( "cubical_office", 75, point( 16, 11 ), point( 17, 12 ), false, + calendar::start_of_cataclysm ); + place_items( "cubical_office", 75, point( 4, 5 ), point( 5, 5 ), false, + calendar::start_of_cataclysm ); + place_items( "cubical_office", 75, point( 11, 5 ), point( 12, 5 ), false, + calendar::start_of_cataclysm ); + place_items( "cubical_office", 75, point( 14, 5 ), point( 16, 5 ), false, + calendar::start_of_cataclysm ); place_office_chairs(); if( dat.west() == "office_tower_1_entrance" ) { @@ -2938,11 +2942,12 @@ void map::draw_office_tower( const oter_id &terrain_type, mapgendata &dat, " ssssssss ss\n" "ssssssssssssssssssssssss\n" "ssssssssssssssssssssssss\n", ter_key, fur_key ); - place_items( "office", 75, point( 19, 1 ), point( 19, 3 ), false, 0 ); - place_items( "office", 75, point( 17, 3 ), point( 18, 3 ), false, 0 ); - place_items( "office", 90, point( 8, 7 ), point( 9, 7 ), false, 0 ); - place_items( "cubical_office", 75, point( 19, 5 ), point( 19, 7 ), false, 0 ); - place_items( "cleaning", 80, point( 1, 7 ), point( 2, 7 ), false, 0 ); + place_items( "office", 75, point( 19, 1 ), point( 19, 3 ), false, calendar::start_of_cataclysm ); + place_items( "office", 75, point( 17, 3 ), point( 18, 3 ), false, calendar::start_of_cataclysm ); + place_items( "office", 90, point( 8, 7 ), point( 9, 7 ), false, calendar::start_of_cataclysm ); + place_items( "cubical_office", 75, point( 19, 5 ), point( 19, 7 ), false, + calendar::start_of_cataclysm ); + place_items( "cleaning", 80, point( 1, 7 ), point( 2, 7 ), false, calendar::start_of_cataclysm ); if( density > 1 ) { place_spawns( GROUP_ZOMBIE, 2, point_zero, point( 14, 10 ), density ); } else { @@ -2987,14 +2992,17 @@ void map::draw_office_tower( const oter_id &terrain_type, mapgendata &dat, "...|xEE|.R>|......hdV%ss\n" "...DEEE|.R.|..|.....V%ss\n", ter_key, fur_key ); spawn_item( point( 18, 15 ), "record_accounting" ); - place_items( "cleaning", 75, point( 3, 5 ), point( 5, 5 ), false, 0 ); - place_items( "office", 75, point( 10, 7 ), point( 16, 8 ), false, 0 ); - place_items( "cubical_office", 75, point( 15, 15 ), point( 19, 15 ), false, 0 ); - place_items( "cubical_office", 75, point( 16, 12 ), point( 16, 13 ), false, 0 ); - place_items( "cubical_office", 75, point( 17, 19 ), point( 19, 19 ), false, 0 ); - place_items( "office", 75, point( 17, 21 ), point( 19, 21 ), false, 0 ); - place_items( "office", 75, point( 16, 11 ), point( 17, 12 ), false, 0 ); - place_items( "cleaning", 75, point( 8, 20 ), point( 10, 20 ), false, 0 ); + place_items( "cleaning", 75, point( 3, 5 ), point( 5, 5 ), false, calendar::start_of_cataclysm ); + place_items( "office", 75, point( 10, 7 ), point( 16, 8 ), false, calendar::start_of_cataclysm ); + place_items( "cubical_office", 75, point( 15, 15 ), point( 19, 15 ), false, + calendar::start_of_cataclysm ); + place_items( "cubical_office", 75, point( 16, 12 ), point( 16, 13 ), false, + calendar::start_of_cataclysm ); + place_items( "cubical_office", 75, point( 17, 19 ), point( 19, 19 ), false, + calendar::start_of_cataclysm ); + place_items( "office", 75, point( 17, 21 ), point( 19, 21 ), false, calendar::start_of_cataclysm ); + place_items( "office", 75, point( 16, 11 ), point( 17, 12 ), false, calendar::start_of_cataclysm ); + place_items( "cleaning", 75, point( 8, 20 ), point( 10, 20 ), false, calendar::start_of_cataclysm ); if( density > 1 ) { place_spawns( GROUP_ZOMBIE, 2, point_zero, point( 9, 15 ), density ); } else { @@ -3394,7 +3402,7 @@ void map::draw_lab( const oter_id &terrain_type, mapgendata &dat, const time_poi science_room( this, 2, 2, SEEX - 3, SEEY * 2 - 3, dat.zlevel, 1 ); science_room( this, SEEX + 2, 2, SEEX * 2 - 3, SEEY * 2 - 3, dat.zlevel, 3 ); - place_spawns( GROUP_TURRET_SMG, 1, point( SEEX, 5 ), point( SEEX, 5 ), 1, true ); + place_spawns( GROUP_TURRET, 1, point( SEEX, 5 ), point( SEEX, 5 ), 1, true ); if( is_ot_match( "road", dat.east(), ot_match_type::type ) ) { rotate( 1 ); @@ -4210,8 +4218,9 @@ void map::draw_lab( const oter_id &terrain_type, mapgendata &dat, const time_poi line( this, t_reinforced_glass, SEEX - 3, SEEY - 2, SEEX - 3, SEEY + 1 ); line( this, t_reinforced_glass, SEEX + 2, SEEY - 2, SEEX + 2, SEEY + 1 ); place_items( "ammo_rare", 96, point( SEEX - 2, SEEY - 1 ), - point( SEEX + 1, SEEY - 1 ), false, 0 ); - place_items( "guns_rare", 96, point( SEEX - 2, SEEY ), point( SEEX + 1, SEEY ), false, 0 ); + point( SEEX + 1, SEEY - 1 ), false, calendar::start_of_cataclysm ); + place_items( "guns_rare", 96, point( SEEX - 2, SEEY ), point( SEEX + 1, SEEY ), false, + calendar::start_of_cataclysm ); spawn_item( point( SEEX + 1, SEEY ), "solar_panel_v3" ); } break; @@ -4278,7 +4287,7 @@ void map::draw_lab( const oter_id &terrain_type, mapgendata &dat, const time_poi int item_count = 0; while( item_count < 5 ) { item_count += place_items( "bionics", 75, point( SEEX - 1, SEEY - 1 ), - point( SEEX, SEEY ), false, 0 ).size(); + point( SEEX, SEEY ), false, calendar::start_of_cataclysm ).size(); } line( this, t_reinforced_glass, SEEX - 2, SEEY - 2, SEEX + 1, SEEY - 2 ); line( this, t_reinforced_glass, SEEX - 2, SEEY + 1, SEEX + 1, SEEY + 1 ); @@ -4353,101 +4362,6 @@ void map::draw_lab( const oter_id &terrain_type, mapgendata &dat, const time_poi } } -void map::draw_silo( const oter_id &terrain_type, mapgendata &dat, const time_point &/*when*/, - const float /*density*/ ) -{ - int lw = 0; - int mw = 0; - int tw = 0; - computer *tmpcomp = nullptr; - - if( terrain_type == "silo" ) { - if( dat.zlevel == 0 ) { // We're on ground level - for( int i = 0; i < SEEX * 2; i++ ) { - for( int j = 0; j < SEEY * 2; j++ ) { - if( trig_dist( point( i, j ), point( SEEX, SEEY ) ) <= 6 ) { - ter_set( point( i, j ), t_metal_floor ); - } else { - ter_set( point( i, j ), dat.groundcover() ); - } - } - } - switch( rng( 1, 4 ) ) { // Placement of stairs - case 1: - lw = 3; - mw = 5; - tw = 3; - break; - case 2: - lw = 3; - mw = 5; - tw = SEEY * 2 - 4; - break; - case 3: - lw = SEEX * 2 - 7; - mw = lw; - tw = 3; - break; - case 4: - lw = SEEX * 2 - 7; - mw = lw; - tw = SEEY * 2 - 4; - break; - } - for( int i = lw; i <= lw + 2; i++ ) { - ter_set( point( i, tw ), t_wall_metal ); - ter_set( point( i, tw + 2 ), t_wall_metal ); - } - ter_set( point( lw, tw + 1 ), t_wall_metal ); - ter_set( point( lw + 1, tw + 1 ), t_stairs_down ); - ter_set( point( lw + 2, tw + 1 ), t_wall_metal ); - ter_set( point( mw, tw + 1 ), t_door_metal_locked ); - ter_set( point( mw, tw + 2 ), t_card_military ); - } else { // We are NOT above ground. - for( int i = 0; i < SEEX * 2; i++ ) { - for( int j = 0; j < SEEY * 2; j++ ) { - if( trig_dist( point( i, j ), point( SEEX, SEEY ) ) > 7 ) { - ter_set( point( i, j ), t_rock ); - } else if( trig_dist( point( i, j ), point( SEEX, SEEY ) ) > 5 ) { - ter_set( point( i, j ), t_metal_floor ); - if( one_in( 30 ) ) { - add_field( {i, j, abs_sub.z}, fd_nuke_gas, 2 ); - } - } else if( trig_dist( point( i, j ), point( SEEX, SEEY ) ) == 5 ) { - ter_set( point( i, j ), t_hole ); - } else { - ter_set( point( i, j ), t_missile ); - } - } - } - silo_rooms( this ); - } - } else if( terrain_type == "silo_finale" ) { - for( int i = 0; i < SEEX * 2; i++ ) { - for( int j = 0; j < SEEY * 2; j++ ) { - if( i == 5 ) { - if( j > 4 && j < SEEY ) { - ter_set( point( i, j ), t_reinforced_glass ); - } else if( j == SEEY * 2 - 4 ) { - ter_set( point( i, j ), t_door_metal_c ); - } else { - ter_set( point( i, j ), t_rock ); - } - } else { - ter_set( point( i, j ), t_rock_floor ); - } - } - } - ter_set( point_zero, t_stairs_up ); - tmpcomp = add_computer( tripoint( 4, 5, abs_sub.z ), _( "Missile Controls" ), 8 ); - tmpcomp->add_option( _( "Launch Missile" ), COMPACT_MISS_LAUNCH, 10 ); - tmpcomp->add_option( _( "Disarm Missile" ), COMPACT_MISS_DISARM, 8 ); - tmpcomp->add_failure( COMPFAIL_SECUBOTS ); - tmpcomp->add_failure( COMPFAIL_DAMAGE ); - - } -} - void map::draw_temple( const oter_id &terrain_type, mapgendata &dat, const time_point &/*when*/, const float /*density*/ ) { @@ -4628,20 +4542,20 @@ void map::draw_temple( const oter_id &terrain_type, mapgendata &dat, const time_ bool toggle_green = false; bool toggle_blue = false; for( int i = path.size() - 1; i >= 0; i-- ) { - if( ter( point( path[i].x, path[i].y ) ) == t_floor_red ) { + if( ter( path[i] ) == t_floor_red ) { toggle_green = !toggle_green; if( toggle_red ) { - ter_set( point( path[i].x, path[i].y ), t_rock_red ); + ter_set( path[i], t_rock_red ); } - } else if( ter( point( path[i].x, path[i].y ) ) == t_floor_green ) { + } else if( ter( path[i] ) == t_floor_green ) { toggle_blue = !toggle_blue; if( toggle_green ) { - ter_set( point( path[i].x, path[i].y ), t_rock_green ); + ter_set( path[i], t_rock_green ); } - } else if( ter( point( path[i].x, path[i].y ) ) == t_floor_blue ) { + } else if( ter( path[i] ) == t_floor_blue ) { toggle_red = !toggle_red; if( toggle_blue ) { - ter_set( point( path[i].x, path[i].y ), t_rock_blue ); + ter_set( path[i], t_rock_blue ); } } } @@ -4770,7 +4684,8 @@ void map::draw_mine( const oter_id &terrain_type, mapgendata &dat, const time_po ter_set( point( 11, 10 ), t_elevator ); ter_set( point( 10, 12 ), t_ladder_up ); line_furn( this, f_counter, 10, 15, 15, 15 ); - place_items( "mine_equipment", 86, point( 10, 15 ), point( 15, 15 ), false, 0 ); + place_items( "mine_equipment", 86, point( 10, 15 ), point( 15, 15 ), false, + calendar::start_of_cataclysm ); if( one_in( 2 ) ) { ter_set( point( 9, 12 ), t_door_c ); } else { @@ -4814,7 +4729,8 @@ void map::draw_mine( const oter_id &terrain_type, mapgendata &dat, const time_po } } } - place_items( "wreckage", 70, point( x - 3, y - 3 ), point( x + 2, y + 2 ), false, 0 ); + place_items( "wreckage", 70, point( x - 3, y - 3 ), point( x + 2, y + 2 ), false, + calendar::start_of_cataclysm ); } break; @@ -4826,7 +4742,7 @@ void map::draw_mine( const oter_id &terrain_type, mapgendata &dat, const time_po } ) ) { add_item( *body, item::make_corpse() ); place_items( "mine_equipment", 60, *body, *body, - false, 0 ); + false, calendar::start_of_cataclysm ); } } } @@ -4886,7 +4802,7 @@ void map::draw_mine( const oter_id &terrain_type, mapgendata &dat, const time_po ter_set( point( orx + 3, ory + 3 ), t_rock ); add_item( point( orx + 2, ory + 3 ), item::make_corpse() ); place_items( "mine_equipment", 60, point( orx + 2, ory + 3 ), point( orx + 2, ory + 3 ), - false, 0 ); + false, calendar::start_of_cataclysm ); } break; } @@ -5072,7 +4988,8 @@ void map::draw_mine( const oter_id &terrain_type, mapgendata &dat, const time_po int x = rng( 4, SEEX * 2 - 5 ); int y = rng( 4, SEEX * 2 - 5 ); add_item( point( x, y ), item::make_corpse() ); - place_items( "mine_equipment", 60, point( x, y ), point( x, y ), false, 0 ); + place_items( "mine_equipment", 60, point( x, y ), point( x, y ), false, + calendar::start_of_cataclysm ); } place_spawns( GROUP_DOG_THING, 1, point( SEEX, SEEX ), point( SEEX + 1, SEEX + 1 ), 1, true, true ); spawn_artifact( tripoint( rng( SEEX, SEEX + 1 ), rng( SEEY, SEEY + 1 ), abs_sub.z ) ); @@ -5261,10 +5178,12 @@ void map::draw_sarcophagus( const oter_id &terrain_type, mapgendata &dat, " _______ \n" " _______ \n", ter_key, fur_key ); spawn_item( point( 19, 3 ), "cleansuit" ); - place_items( "office", 80, point( 4, 19 ), point( 6, 19 ), false, 0 ); - place_items( "cleaning", 90, point( 7, 3 ), point( 7, 5 ), false, 0 ); - place_items( "toxic_dump_equipment", 85, point( 19, 1 ), point( 19, 3 ), false, 0 ); - place_items( "toxic_dump_equipment", 85, point( 19, 5 ), point( 19, 7 ), false, 0 ); + place_items( "office", 80, point( 4, 19 ), point( 6, 19 ), false, calendar::start_of_cataclysm ); + place_items( "cleaning", 90, point( 7, 3 ), point( 7, 5 ), false, calendar::start_of_cataclysm ); + place_items( "toxic_dump_equipment", 85, point( 19, 1 ), point( 19, 3 ), false, + calendar::start_of_cataclysm ); + place_items( "toxic_dump_equipment", 85, point( 19, 5 ), point( 19, 7 ), false, + calendar::start_of_cataclysm ); place_spawns( GROUP_HAZMATBOT, 2, point( 10, 5 ), point( 10, 5 ), 1, true ); //lazy radiation mapping for( int x = 0; x < SEEX * 2; x++ ) { @@ -5313,9 +5232,11 @@ void map::draw_sarcophagus( const oter_id &terrain_type, mapgendata &dat, " f |!!!!!!!!!%..r| |-\n" " f |!!!!!!!!!%..r| |^\n", ter_key, fur_key ); spawn_item( point( 19, 22 ), "cleansuit" ); - place_items( "cleaning", 85, point( 6, 11 ), point( 6, 14 ), false, 0 ); - place_items( "tools_common", 85, point( 10, 6 ), point( 13, 6 ), false, 0 ); - place_items( "toxic_dump_equipment", 85, point( 22, 14 ), point( 23, 15 ), false, 0 ); + place_items( "cleaning", 85, point( 6, 11 ), point( 6, 14 ), false, calendar::start_of_cataclysm ); + place_items( "tools_common", 85, point( 10, 6 ), point( 13, 6 ), false, + calendar::start_of_cataclysm ); + place_items( "toxic_dump_equipment", 85, point( 22, 14 ), point( 23, 15 ), false, + calendar::start_of_cataclysm ); place_spawns( GROUP_HAZMATBOT, 2, point( 22, 12 ), point( 22, 12 ), 1, true ); place_spawns( GROUP_HAZMATBOT, 2, point( 23, 18 ), point( 23, 18 ), 1, true ); //lazy radiation mapping @@ -5373,9 +5294,9 @@ void map::draw_sarcophagus( const oter_id &terrain_type, mapgendata &dat, " \n" " \n", ter_key, fur_key ); spawn_item( point( 1, 2 ), "id_military" ); - place_items( "office", 85, point_south_east, point( 1, 3 ), false, 0 ); - place_items( "office", 85, point( 11, 3 ), point( 13, 3 ), false, 0 ); - place_items( "office", 85, point( 17, 3 ), point( 19, 3 ), false, 0 ); + place_items( "office", 85, point_south_east, point( 1, 3 ), false, calendar::start_of_cataclysm ); + place_items( "office", 85, point( 11, 3 ), point( 13, 3 ), false, calendar::start_of_cataclysm ); + place_items( "office", 85, point( 17, 3 ), point( 19, 3 ), false, calendar::start_of_cataclysm ); //lazy radiation mapping for( int x = 0; x < SEEX * 2; x++ ) { for( int y = 0; y < SEEY * 2; y++ ) { @@ -5417,9 +5338,10 @@ void map::draw_sarcophagus( const oter_id &terrain_type, mapgendata &dat, " f \n" "------|---|--|---www| f \n" ".x6x..|S.T|l.|^.ddd.| f \n", ter_key, fur_key ); - place_items( "office", 85, point( 16, 23 ), point( 18, 23 ), false, 0 ); - place_items( "cleaning", 85, point( 11, 23 ), point( 12, 23 ), false, 0 ); - place_items( "robots", 90, point( 2, 11 ), point( 3, 11 ), false, 0 ); + place_items( "office", 85, point( 16, 23 ), point( 18, 23 ), false, calendar::start_of_cataclysm ); + place_items( "cleaning", 85, point( 11, 23 ), point( 12, 23 ), false, + calendar::start_of_cataclysm ); + place_items( "robots", 90, point( 2, 11 ), point( 3, 11 ), false, calendar::start_of_cataclysm ); // TODO: change to monster group place_spawns( GROUP_HAZMATBOT, 2, point( 7, 10 ), point( 7, 10 ), 1, true ); place_spawns( GROUP_HAZMATBOT, 2, point( 11, 16 ), point( 11, 16 ), 1, true ); @@ -5485,7 +5407,7 @@ void map::draw_sarcophagus( const oter_id &terrain_type, mapgendata &dat, if( this->ter( point( i, j ) ) == t_rock_floor ) { if( one_in( 250 ) ) { add_item( point( i, j ), item::make_corpse() ); - place_items( "science", 70, point( i, j ), point( i, j ), true, 0 ); + place_items( "science", 70, point( i, j ), point( i, j ), true, calendar::start_of_cataclysm ); } place_spawns( GROUP_PLAIN, 80, point( i, j ), point( i, j ), 1, true ); } @@ -5502,8 +5424,8 @@ void map::draw_sarcophagus( const oter_id &terrain_type, mapgendata &dat, if( one_in( 2 ) ) { make_rubble( tripoint( i, j, abs_sub.z ), f_wreckage, true ); } - place_items( "trash", 50, point( i, j ), point( i, j ), false, 0 ); - place_items( "sewer", 50, point( i, j ), point( i, j ), false, 0 ); + place_items( "trash", 50, point( i, j ), point( i, j ), false, calendar::start_of_cataclysm ); + place_items( "sewer", 50, point( i, j ), point( i, j ), false, calendar::start_of_cataclysm ); if( one_in( 40 ) ) { spawn_item( point( i, j ), "nanomaterial", 1, 5 ); } @@ -5554,12 +5476,12 @@ void map::draw_sarcophagus( const oter_id &terrain_type, mapgendata &dat, for( int i = 0; i < SEEX * 2; i++ ) { for( int j = 0; j < SEEY * 2; j++ ) { if( this->furn( point( i, j ) ) == f_rack ) { - place_items( "mechanics", 60, point( i, j ), point( i, j ), false, 0 ); + place_items( "mechanics", 60, point( i, j ), point( i, j ), false, calendar::start_of_cataclysm ); } if( this->ter( point( i, j ) ) == t_rock_floor ) { if( one_in( 250 ) ) { add_item( point( i, j ), item::make_corpse() ); - place_items( "science", 70, point( i, j ), point( i, j ), true, 0 ); + place_items( "science", 70, point( i, j ), point( i, j ), true, calendar::start_of_cataclysm ); } else { place_spawns( GROUP_PLAIN, 1, point( i, j ), point( i, j ), 1, true ); } @@ -5577,8 +5499,8 @@ void map::draw_sarcophagus( const oter_id &terrain_type, mapgendata &dat, if( one_in( 2 ) ) { make_rubble( tripoint( i, j, abs_sub.z ), f_wreckage, true ); } - place_items( "trash", 50, point( i, j ), point( i, j ), false, 0 ); - place_items( "sewer", 50, point( i, j ), point( i, j ), false, 0 ); + place_items( "trash", 50, point( i, j ), point( i, j ), false, calendar::start_of_cataclysm ); + place_items( "sewer", 50, point( i, j ), point( i, j ), false, calendar::start_of_cataclysm ); if( one_in( 40 ) ) { spawn_item( point( i, j ), "nanomaterial", 1, 5 ); } @@ -5627,7 +5549,7 @@ void map::draw_sarcophagus( const oter_id &terrain_type, mapgendata &dat, if( this->ter( point( i, j ) ) == t_rock_floor ) { if( one_in( 250 ) ) { add_item( point( i, j ), item::make_corpse() ); - place_items( "science", 70, point( i, j ), point( i, j ), true, 0 ); + place_items( "science", 70, point( i, j ), point( i, j ), true, calendar::start_of_cataclysm ); } place_spawns( GROUP_PLAIN, 80, point( i, j ), point( i, j ), 1, true ); } @@ -5644,8 +5566,8 @@ void map::draw_sarcophagus( const oter_id &terrain_type, mapgendata &dat, if( one_in( 2 ) ) { make_rubble( tripoint( i, j, abs_sub.z ), f_wreckage, true ); } - place_items( "trash", 50, point( i, j ), point( i, j ), false, 0 ); - place_items( "sewer", 50, point( i, j ), point( i, j ), false, 0 ); + place_items( "trash", 50, point( i, j ), point( i, j ), false, calendar::start_of_cataclysm ); + place_items( "sewer", 50, point( i, j ), point( i, j ), false, calendar::start_of_cataclysm ); if( one_in( 20 ) ) { spawn_item( point( i, j ), "nanomaterial", 1, 5 ); } @@ -5692,18 +5614,20 @@ void map::draw_sarcophagus( const oter_id &terrain_type, mapgendata &dat, for( int i = 0; i < SEEX * 2; i++ ) { for( int j = 0; j < SEEY * 2; j++ ) { if( this->furn( point( i, j ) ) == f_locker ) { - place_items( "cleaning", 60, point( i, j ), point( i, j ), false, 0 ); + place_items( "cleaning", 60, point( i, j ), point( i, j ), false, calendar::start_of_cataclysm ); } if( this->furn( point( i, j ) ) == f_desk ) { - place_items( "cubical_office", 60, point( i, j ), point( i, j ), false, 0 ); + place_items( "cubical_office", 60, point( i, j ), point( i, j ), false, + calendar::start_of_cataclysm ); } if( this->furn( point( i, j ) ) == f_rack ) { - place_items( "sewage_plant", 60, point( i, j ), point( i, j ), false, 0 ); + place_items( "sewage_plant", 60, point( i, j ), point( i, j ), false, + calendar::start_of_cataclysm ); } if( this->ter( point( i, j ) ) == t_rock_floor ) { if( one_in( 250 ) ) { add_item( point( i, j ), item::make_corpse() ); - place_items( "science", 70, point( i, j ), point( i, j ), true, 0 ); + place_items( "science", 70, point( i, j ), point( i, j ), true, calendar::start_of_cataclysm ); } place_spawns( GROUP_PLAIN, 80, point( i, j ), point( i, j ), 1, true ); } @@ -5720,8 +5644,8 @@ void map::draw_sarcophagus( const oter_id &terrain_type, mapgendata &dat, if( one_in( 2 ) ) { make_rubble( tripoint( i, j, abs_sub.z ), f_wreckage, true ); } - place_items( "trash", 50, point( i, j ), point( i, j ), false, 0 ); - place_items( "sewer", 50, point( i, j ), point( i, j ), false, 0 ); + place_items( "trash", 50, point( i, j ), point( i, j ), false, calendar::start_of_cataclysm ); + place_items( "sewer", 50, point( i, j ), point( i, j ), false, calendar::start_of_cataclysm ); if( one_in( 40 ) ) { spawn_item( point( i, j ), "nanomaterial", 1, 5 ); } @@ -5794,13 +5718,15 @@ void map::draw_megastore( const oter_id &terrain_type, mapgendata &dat, const ti for( int x = 2; x <= 18; x += 4 ) { line_furn( this, f_counter, x, 4, x, 14 ); line_furn( this, f_rack, x + 3, 4, x + 3, 14 ); - place_items( "snacks", 80, point( x + 3, 4 ), point( x + 3, 14 ), false, 0 ); - place_items( "magazines", 70, point( x + 3, 4 ), point( x + 3, 14 ), false, 0 ); + place_items( "snacks", 80, point( x + 3, 4 ), point( x + 3, 14 ), false, + calendar::start_of_cataclysm ); + place_items( "magazines", 70, point( x + 3, 4 ), point( x + 3, 14 ), false, + calendar::start_of_cataclysm ); } if( const auto p = random_point( *this, [this]( const tripoint & n ) { return ter( n ) == t_floor; } ) ) { - place_spawns( GROUP_PLAIN, 1, point( p->x, p->y ), point( p->x, p->y ), 1, true ); + place_spawns( GROUP_PLAIN, 1, p->xy(), p->xy(), 1, true ); } // Finally, figure out where the road is; construct our entrance facing that. std::vector faces_road; @@ -5830,20 +5756,26 @@ void map::draw_megastore( const oter_id &terrain_type, mapgendata &dat, const ti if( fridge ) { line_furn( this, f_glass_fridge, x, y, x, y + SEEY - 4 ); if( one_in( 3 ) ) { - place_items( "fridgesnacks", 80, point( x, y ), point( x, y + SEEY - 4 ), false, 0 ); + place_items( "fridgesnacks", 80, point( x, y ), point( x, y + SEEY - 4 ), false, + calendar::start_of_cataclysm ); } else { - place_items( "fridge", 70, point( x, y ), point( x, y + SEEY - 4 ), false, 0 ); + place_items( "fridge", 70, point( x, y ), point( x, y + SEEY - 4 ), false, + calendar::start_of_cataclysm ); } } else { line_furn( this, f_rack, x, y, x, y + SEEY - 4 ); if( one_in( 3 ) ) { - place_items( "cannedfood", 78, point( x, y ), point( x, y + SEEY - 4 ), false, 0 ); + place_items( "cannedfood", 78, point( x, y ), point( x, y + SEEY - 4 ), false, + calendar::start_of_cataclysm ); } else if( one_in( 2 ) ) { - place_items( "pasta", 82, point( x, y ), point( x, y + SEEY - 4 ), false, 0 ); + place_items( "pasta", 82, point( x, y ), point( x, y + SEEY - 4 ), false, + calendar::start_of_cataclysm ); } else if( one_in( 2 ) ) { - place_items( "produce", 65, point( x, y ), point( x, y + SEEY - 4 ), false, 0 ); + place_items( "produce", 65, point( x, y ), point( x, y + SEEY - 4 ), false, + calendar::start_of_cataclysm ); } else { - place_items( "snacks", 72, point( x, y ), point( x, y + SEEY - 4 ), false, 0 ); + place_items( "snacks", 72, point( x, y ), point( x, y + SEEY - 4 ), false, + calendar::start_of_cataclysm ); } } } @@ -5854,13 +5786,17 @@ void map::draw_megastore( const oter_id &terrain_type, mapgendata &dat, const ti for( int x = 2; x <= 22; x += 4 ) { line_furn( this, f_rack, x, 4, x, SEEY * 2 - 5 ); if( one_in( 3 ) ) { - place_items( "tools_carpentry", 70, point( x, 4 ), point( x, SEEY * 2 - 5 ), false, 0 ); + place_items( "tools_carpentry", 70, point( x, 4 ), point( x, SEEY * 2 - 5 ), false, + calendar::start_of_cataclysm ); } else if( one_in( 2 ) ) { - place_items( "tools_construction", 70, point( x, 4 ), point( x, SEEY * 2 - 5 ), false, 0 ); + place_items( "tools_construction", 70, point( x, 4 ), point( x, SEEY * 2 - 5 ), false, + calendar::start_of_cataclysm ); } else if( one_in( 3 ) ) { - place_items( "hardware", 70, point( x, 4 ), point( x, SEEY * 2 - 5 ), false, 0 ); + place_items( "hardware", 70, point( x, 4 ), point( x, SEEY * 2 - 5 ), false, + calendar::start_of_cataclysm ); } else { - place_items( "mischw", 70, point( x, 4 ), point( x, SEEY * 2 - 5 ), false, 0 ); + place_items( "mischw", 70, point( x, 4 ), point( x, SEEY * 2 - 5 ), false, + calendar::start_of_cataclysm ); } } break; @@ -5869,26 +5805,34 @@ void map::draw_megastore( const oter_id &terrain_type, mapgendata &dat, const ti for( int y = 3; y <= 9; y += 6 ) { square_furn( this, f_rack, x, y, x + 1, y + 1 ); if( one_in( 2 ) ) { - place_items( "shirts", 75, point( x, y ), point( x + 1, y + 1 ), false, 0 ); + place_items( "shirts", 75, point( x, y ), point( x + 1, y + 1 ), false, + calendar::start_of_cataclysm ); } else if( one_in( 2 ) ) { - place_items( "pants", 72, point( x, y ), point( x + 1, y + 1 ), false, 0 ); + place_items( "pants", 72, point( x, y ), point( x + 1, y + 1 ), false, + calendar::start_of_cataclysm ); } else if( one_in( 2 ) ) { - place_items( "jackets", 65, point( x, y ), point( x + 1, y + 1 ), false, 0 ); + place_items( "jackets", 65, point( x, y ), point( x + 1, y + 1 ), false, + calendar::start_of_cataclysm ); } else { - place_items( "winter", 62, point( x, y ), point( x + 1, y + 1 ), false, 0 ); + place_items( "winter", 62, point( x, y ), point( x + 1, y + 1 ), false, + calendar::start_of_cataclysm ); } } } for( int y = 13; y <= SEEY * 2 - 2; y += 3 ) { line_furn( this, f_rack, 2, y, SEEX * 2 - 3, y ); if( one_in( 3 ) ) { - place_items( "shirts", 75, point( 2, y ), point( SEEX * 2 - 3, y ), false, 0 ); + place_items( "shirts", 75, point( 2, y ), point( SEEX * 2 - 3, y ), false, + calendar::start_of_cataclysm ); } else if( one_in( 2 ) ) { - place_items( "shoes", 75, point( 2, y ), point( SEEX * 2 - 3, y ), false, 0 ); + place_items( "shoes", 75, point( 2, y ), point( SEEX * 2 - 3, y ), false, + calendar::start_of_cataclysm ); } else if( one_in( 2 ) ) { - place_items( "bags", 75, point( 2, y ), point( SEEX * 2 - 3, y ), false, 0 ); + place_items( "bags", 75, point( 2, y ), point( SEEX * 2 - 3, y ), false, + calendar::start_of_cataclysm ); } else { - place_items( "allclothes", 75, point( 2, y ), point( SEEX * 2 - 3, y ), false, 0 ); + place_items( "allclothes", 75, point( 2, y ), point( SEEX * 2 - 3, y ), false, + calendar::start_of_cataclysm ); } } break; @@ -5897,11 +5841,14 @@ void map::draw_megastore( const oter_id &terrain_type, mapgendata &dat, const ti for( int y = 2; y <= SEEY; y += SEEY - 2 ) { line_furn( this, f_rack, x, y, x, y + SEEY - 4 ); if( one_in( 3 ) ) { - place_items( "cleaning", 78, point( x, y ), point( x, y + SEEY - 4 ), false, 0 ); + place_items( "cleaning", 78, point( x, y ), point( x, y + SEEY - 4 ), false, + calendar::start_of_cataclysm ); } else if( one_in( 2 ) ) { - place_items( "softdrugs", 72, point( x, y ), point( x, y + SEEY - 4 ), false, 0 ); + place_items( "softdrugs", 72, point( x, y ), point( x, y + SEEY - 4 ), false, + calendar::start_of_cataclysm ); } else { - place_items( "novels", 84, point( x, y ), point( x, y + SEEY - 4 ), false, 0 ); + place_items( "novels", 84, point( x, y ), point( x, y + SEEY - 4 ), false, + calendar::start_of_cataclysm ); } } } @@ -5911,11 +5858,14 @@ void map::draw_megastore( const oter_id &terrain_type, mapgendata &dat, const ti for( int y = 2; y <= SEEY; y += SEEY - 2 ) { line_furn( this, f_rack, x, y, x, y + SEEY - 4 ); if( one_in( 2 ) ) { - place_items( "sports", 72, point( x, y ), point( x, y + SEEY - 4 ), false, 0 ); + place_items( "sports", 72, point( x, y ), point( x, y + SEEY - 4 ), false, + calendar::start_of_cataclysm ); } else if( one_in( 10 ) ) { - place_items( "guns_rifle_common", 20, point( x, y ), point( x, y + SEEY - 4 ), false, 0 ); + place_items( "guns_rifle_common", 20, point( x, y ), point( x, y + SEEY - 4 ), false, + calendar::start_of_cataclysm ); } else { - place_items( "camping", 68, point( x, y ), point( x, y + SEEY - 4 ), false, 0 ); + place_items( "camping", 68, point( x, y ), point( x, y + SEEY - 4 ), false, + calendar::start_of_cataclysm ); } } } @@ -5971,8 +5921,8 @@ void map::draw_fema( const oter_id &terrain_type, mapgendata &dat, const time_po line_furn( this, f_chair, 5, 16, 5, 18 ); line_furn( this, f_desk, 6, 16, 6, 18 ); line_furn( this, f_chair, 7, 16, 7, 18 ); - place_items( "office", 80, point( 3, 16 ), point( 3, 18 ), false, 0 ); - place_items( "office", 80, point( 6, 16 ), point( 6, 18 ), false, 0 ); + place_items( "office", 80, point( 3, 16 ), point( 3, 18 ), false, calendar::start_of_cataclysm ); + place_items( "office", 80, point( 6, 16 ), point( 6, 18 ), false, calendar::start_of_cataclysm ); place_spawns( GROUP_MIL_WEAK, 1, point( 3, 15 ), point( 4, 17 ), 0.2 ); // Rotate to face the road @@ -6029,12 +5979,16 @@ void map::draw_fema( const oter_id &terrain_type, mapgendata &dat, const time_po line( this, t_reinforced_glass, 13, 14, 18, 14 ); line( this, t_reinforced_glass, 13, 14, 13, 18 ); ter_set( point( 15, 14 ), t_door_metal_locked ); - place_items( "dissection", 90, point( 10, 8 ), point( 10, 17 ), false, 0 ); - place_items( "hospital_lab", 70, point( 5, 5 ), point( 18, 18 ), false, 0 ); - place_items( "harddrugs", 50, point( 6, 5 ), point( 9, 5 ), false, 0 ); - place_items( "harddrugs", 50, point( 14, 5 ), point( 17, 5 ), false, 0 ); - place_items( "hospital_samples", 50, point( 6, 5 ), point( 9, 5 ), false, 0 ); - place_items( "hospital_samples", 50, point( 14, 5 ), point( 17, 5 ), false, 0 ); + place_items( "dissection", 90, point( 10, 8 ), point( 10, 17 ), false, + calendar::start_of_cataclysm ); + place_items( "hospital_lab", 70, point( 5, 5 ), point( 18, 18 ), false, + calendar::start_of_cataclysm ); + place_items( "harddrugs", 50, point( 6, 5 ), point( 9, 5 ), false, calendar::start_of_cataclysm ); + place_items( "harddrugs", 50, point( 14, 5 ), point( 17, 5 ), false, calendar::start_of_cataclysm ); + place_items( "hospital_samples", 50, point( 6, 5 ), point( 9, 5 ), false, + calendar::start_of_cataclysm ); + place_items( "hospital_samples", 50, point( 14, 5 ), point( 17, 5 ), false, + calendar::start_of_cataclysm ); place_spawns( GROUP_LAB_FEMA, 1, point( 11, 12 ), point( 16, 17 ), 0.1 ); } else if( dat.west() == "fema_entrance" ) { square( this, t_dirt, 1, 1, 22, 22 ); //Supply tent @@ -6070,13 +6024,14 @@ void map::draw_fema( const oter_id &terrain_type, mapgendata &dat, const time_po line( this, t_chainfence, 15, 9, 15, 14 ); line( this, t_chaingate_c, 15, 11, 15, 12 ); line_furn( this, f_locker, 18, 9, 18, 14 ); - place_items( "allclothes", 90, point( 5, 6 ), point( 7, 7 ), false, 0 ); - place_items( "softdrugs", 90, point( 5, 11 ), point( 7, 12 ), false, 0 ); - place_items( "hardware", 90, point( 5, 16 ), point( 7, 17 ), false, 0 ); + place_items( "allclothes", 90, point( 5, 6 ), point( 7, 7 ), false, calendar::start_of_cataclysm ); + place_items( "softdrugs", 90, point( 5, 11 ), point( 7, 12 ), false, calendar::start_of_cataclysm ); + place_items( "hardware", 90, point( 5, 16 ), point( 7, 17 ), false, calendar::start_of_cataclysm ); if( one_in( 3 ) ) { - place_items( "guns_rifle_milspec", 90, point( 18, 9 ), point( 18, 14 ), false, 0, 100, 100 ); + place_items( "guns_rifle_milspec", 90, point( 18, 9 ), point( 18, 14 ), false, + calendar::start_of_cataclysm, 100, 100 ); } - place_items( "office", 80, point( 10, 11 ), point( 13, 12 ), false, 0 ); + place_items( "office", 80, point( 10, 11 ), point( 13, 12 ), false, calendar::start_of_cataclysm ); place_spawns( GROUP_MIL_WEAK, 1, point( 3, 15 ), point( 4, 17 ), 0.2 ); } else { switch( rng( 1, 5 ) ) { @@ -6107,7 +6062,8 @@ void map::draw_fema( const oter_id &terrain_type, mapgendata &dat, const time_po square_furn( this, f_fema_groundsheet, 11, 5, 12, 18 ); line_furn( this, f_fema_groundsheet, 14, 5, 14, 18 ); line_furn( this, f_fema_groundsheet, 16, 5, 16, 18 ); - place_items( "livingroom", 80, point( 5, 5 ), point( 18, 18 ), false, 0 ); + place_items( "livingroom", 80, point( 5, 5 ), point( 18, 18 ), false, + calendar::start_of_cataclysm ); place_spawns( GROUP_PLAIN, 1, point( 11, 12 ), point( 13, 14 ), 0.1 ); break; case 4: @@ -6140,14 +6096,15 @@ void map::draw_fema( const oter_id &terrain_type, mapgendata &dat, const time_po line_furn( this, f_table, 6, 16, 10, 16 ); line_furn( this, f_bench, 6, 17, 10, 17 ); - place_items( "mil_food_nodrugs", 80, point( 5, 5 ), point( 5, 6 ), false, 0 ); - place_items( "snacks", 80, point( 5, 5 ), point( 18, 18 ), false, 0 ); - place_items( "kitchen", 70, point( 6, 5 ), point( 10, 8 ), false, 0 ); - place_items( "dining", 80, point( 13, 7 ), point( 17, 7 ), false, 0 ); - place_items( "dining", 80, point( 13, 12 ), point( 17, 12 ), false, 0 ); - place_items( "dining", 80, point( 13, 16 ), point( 17, 16 ), false, 0 ); - place_items( "dining", 80, point( 6, 12 ), point( 10, 12 ), false, 0 ); - place_items( "dining", 80, point( 6, 16 ), point( 10, 16 ), false, 0 ); + place_items( "mil_food_nodrugs", 80, point( 5, 5 ), point( 5, 6 ), false, + calendar::start_of_cataclysm ); + place_items( "snacks", 80, point( 5, 5 ), point( 18, 18 ), false, calendar::start_of_cataclysm ); + place_items( "kitchen", 70, point( 6, 5 ), point( 10, 8 ), false, calendar::start_of_cataclysm ); + place_items( "dining", 80, point( 13, 7 ), point( 17, 7 ), false, calendar::start_of_cataclysm ); + place_items( "dining", 80, point( 13, 12 ), point( 17, 12 ), false, calendar::start_of_cataclysm ); + place_items( "dining", 80, point( 13, 16 ), point( 17, 16 ), false, calendar::start_of_cataclysm ); + place_items( "dining", 80, point( 6, 12 ), point( 10, 12 ), false, calendar::start_of_cataclysm ); + place_items( "dining", 80, point( 6, 16 ), point( 10, 16 ), false, calendar::start_of_cataclysm ); place_spawns( GROUP_PLAIN, 1, point( 11, 12 ), point( 13, 14 ), 0.1 ); break; case 5: @@ -6180,7 +6137,8 @@ void map::draw_spider_pit( const oter_id &terrain_type, mapgendata &/*dat*/, } } ter_set( point( rng( 3, SEEX * 2 - 4 ), rng( 3, SEEY * 2 - 4 ) ), t_slope_up ); - place_items( "spider", 85, point_zero, point( EAST_EDGE, SOUTH_EDGE ), false, 0 ); + place_items( "spider", 85, point_zero, point( EAST_EDGE, SOUTH_EDGE ), false, + calendar::start_of_cataclysm ); } } @@ -6241,7 +6199,8 @@ void map::draw_slimepit( const oter_id &terrain_type, mapgendata &dat, const tim } } place_spawns( GROUP_BLOB, 1, point( SEEX, SEEY ), point( SEEX, SEEY ), 0.15 ); - place_items( "sewer", 40, point_zero, point( EAST_EDGE, SOUTH_EDGE ), true, 0 ); + place_items( "sewer", 40, point_zero, point( EAST_EDGE, SOUTH_EDGE ), true, + calendar::start_of_cataclysm ); } } @@ -6624,14 +6583,14 @@ void map::place_vending( const point &p, const std::string &type, bool reinforce { if( reinforced ) { furn_set( p, f_vending_reinforced ); - place_items( type, 100, p, p, false, 0 ); + place_items( type, 100, p, p, false, calendar::start_of_cataclysm ); } else { const bool broken = one_in( 5 ); if( broken ) { furn_set( p, f_vending_o ); } else { furn_set( p, f_vending_c ); - place_items( type, 100, p, p, false, 0 ); + place_items( type, 100, p, p, false, calendar::start_of_cataclysm ); } } } @@ -7010,6 +6969,9 @@ void map::rotate( int turns ) overmap_buffer.insert_npc( npc_ptr ); } + clear_vehicle_cache( abs_sub.z ); + clear_vehicle_list( abs_sub.z ); + // Move the submaps around. if( turns == 2 ) { std::swap( *get_submap_at_grid( point_zero ), *get_submap_at_grid( point_south_east ) ); @@ -7035,10 +6997,13 @@ void map::rotate( int turns ) sm->rotate( turns ); for( auto &veh : sm->vehicles ) { - veh->sm_pos = abs_sub + p; + veh->sm_pos = tripoint( p, abs_sub.z ); } + + update_vehicle_list( sm, abs_sub.z ); } } + reset_vehicle_cache( abs_sub.z ); // rotate zones zone_manager &mgr = zone_manager::get_manager(); @@ -7140,7 +7105,8 @@ void science_room( map *m, int x1, int y1, int x2, int y2, int z, int rotate ) int trapy = rng( y1 + 1, y2 - 1 ); switch( random_entry( valid_rooms ) ) { case room_closet: - m->place_items( "cleaning", 80, point( x1, y1 ), point( x2, y2 ), false, 0 ); + m->place_items( "cleaning", 80, point( x1, y1 ), point( x2, y2 ), false, + calendar::start_of_cataclysm ); break; case room_lobby: if( rotate % 2 == 0 ) { // Vertical @@ -7156,7 +7122,7 @@ void science_room( map *m, int x1, int y1, int x2, int y2, int z, int rotate ) tmpcomp->add_failure( COMPFAIL_SHUTDOWN ); tmpcomp->add_failure( COMPFAIL_ALARM ); tmpcomp->add_failure( COMPFAIL_DAMAGE ); - m->place_spawns( GROUP_TURRET_SMG, 1, + m->place_spawns( GROUP_TURRET, 1, point( static_cast( ( x1 + x2 ) / 2 ), desk ), point( static_cast( ( x1 + x2 ) / 2 ), desk ), 1, true ); } else { @@ -7172,7 +7138,7 @@ void science_room( map *m, int x1, int y1, int x2, int y2, int z, int rotate ) tmpcomp->add_failure( COMPFAIL_SHUTDOWN ); tmpcomp->add_failure( COMPFAIL_ALARM ); tmpcomp->add_failure( COMPFAIL_DAMAGE ); - m->place_spawns( GROUP_TURRET_SMG, 1, + m->place_spawns( GROUP_TURRET, 1, point( desk, static_cast( ( y1 + y2 ) / 2 ) ), point( desk, static_cast( ( y1 + y2 ) / 2 ) ), 1, true ); } @@ -7185,9 +7151,11 @@ void science_room( map *m, int x1, int y1, int x2, int y2, int z, int rotate ) m->furn_set( point( x, y ), f_counter ); } if( one_in( 3 ) ) { - m->place_items( "mut_lab", 35, point( x, y1 + 1 ), point( x, y2 - 1 ), false, 0 ); + m->place_items( "mut_lab", 35, point( x, y1 + 1 ), point( x, y2 - 1 ), false, + calendar::start_of_cataclysm ); } else { - m->place_items( "chem_lab", 70, point( x, y1 + 1 ), point( x, y2 - 1 ), false, 0 ); + m->place_items( "chem_lab", 70, point( x, y1 + 1 ), point( x, y2 - 1 ), false, + calendar::start_of_cataclysm ); } } } @@ -7198,9 +7166,11 @@ void science_room( map *m, int x1, int y1, int x2, int y2, int z, int rotate ) m->furn_set( point( x, y ), f_counter ); } if( one_in( 3 ) ) { - m->place_items( "mut_lab", 35, point( x1 + 1, y ), point( x2 - 1, y ), false, 0 ); + m->place_items( "mut_lab", 35, point( x1 + 1, y ), point( x2 - 1, y ), false, + calendar::start_of_cataclysm ); } else { - m->place_items( "chem_lab", 70, point( x1 + 1, y ), point( x2 - 1, y ), false, 0 ); + m->place_items( "chem_lab", 70, point( x1 + 1, y ), point( x2 - 1, y ), false, + calendar::start_of_cataclysm ); } } } @@ -7218,7 +7188,7 @@ void science_room( map *m, int x1, int y1, int x2, int y2, int z, int rotate ) mtrap_set( m, trapx, trapy, tr_telepad ); m->place_items( "teleport", 70, point( ( x1 + x2 ) / 2, static_cast( ( y1 + y2 ) / 2 ) ), point( static_cast( ( x1 + x2 ) / 2 ) + 1, static_cast( ( y1 + y2 ) / 2 ) + 1 ), false, - 0 ); + calendar::start_of_cataclysm ); break; case room_goo: do { @@ -7229,19 +7199,19 @@ void science_room( map *m, int x1, int y1, int x2, int y2, int z, int rotate ) if( rotate == 0 ) { mremove_trap( m, x1, y2 ); m->furn_set( point( x1, y2 ), f_fridge ); - m->place_items( "goo", 60, point( x1, y2 ), point( x1, y2 ), false, 0 ); + m->place_items( "goo", 60, point( x1, y2 ), point( x1, y2 ), false, calendar::start_of_cataclysm ); } else if( rotate == 1 ) { mremove_trap( m, x1, y1 ); m->furn_set( point( x1, y1 ), f_fridge ); - m->place_items( "goo", 60, point( x1, y1 ), point( x1, y1 ), false, 0 ); + m->place_items( "goo", 60, point( x1, y1 ), point( x1, y1 ), false, calendar::start_of_cataclysm ); } else if( rotate == 2 ) { mremove_trap( m, x2, y1 ); m->furn_set( point( x2, y1 ), f_fridge ); - m->place_items( "goo", 60, point( x2, y1 ), point( x2, y1 ), false, 0 ); + m->place_items( "goo", 60, point( x2, y1 ), point( x2, y1 ), false, calendar::start_of_cataclysm ); } else { mremove_trap( m, x2, y2 ); m->furn_set( point( x2, y2 ), f_fridge ); - m->place_items( "goo", 60, point( x2, y2 ), point( x2, y2 ), false, 0 ); + m->place_items( "goo", 60, point( x2, y2 ), point( x2, y2 ), false, calendar::start_of_cataclysm ); } break; case room_cloning: @@ -7249,7 +7219,8 @@ void science_room( map *m, int x1, int y1, int x2, int y2, int z, int rotate ) for( int y = y1 + 1; y <= y2 - 1; y++ ) { if( x % 3 == 0 && y % 3 == 0 ) { m->ter_set( point( x, y ), t_vat ); - m->place_items( "cloning_vat", 20, point( x, y ), point( x, y ), false, 0 ); + m->place_items( "cloning_vat", 20, point( x, y ), point( x, y ), false, + calendar::start_of_cataclysm ); } } } @@ -7259,22 +7230,26 @@ void science_room( map *m, int x1, int y1, int x2, int y2, int z, int rotate ) for( int x = x1; x <= x2; x++ ) { m->furn_set( point( x, y2 - 1 ), f_counter ); } - m->place_items( "dissection", 80, point( x1, y2 - 1 ), point( x2, y2 - 1 ), false, 0 ); + m->place_items( "dissection", 80, point( x1, y2 - 1 ), point( x2, y2 - 1 ), false, + calendar::start_of_cataclysm ); } else if( rotate == 1 ) { for( int y = y1; y <= y2; y++ ) { m->furn_set( point( x1 + 1, y ), f_counter ); } - m->place_items( "dissection", 80, point( x1 + 1, y1 ), point( x1 + 1, y2 ), false, 0 ); + m->place_items( "dissection", 80, point( x1 + 1, y1 ), point( x1 + 1, y2 ), false, + calendar::start_of_cataclysm ); } else if( rotate == 2 ) { for( int x = x1; x <= x2; x++ ) { m->furn_set( point( x, y1 + 1 ), f_counter ); } - m->place_items( "dissection", 80, point( x1, y1 + 1 ), point( x2, y1 + 1 ), false, 0 ); + m->place_items( "dissection", 80, point( x1, y1 + 1 ), point( x2, y1 + 1 ), false, + calendar::start_of_cataclysm ); } else if( rotate == 3 ) { for( int y = y1; y <= y2; y++ ) { m->furn_set( point( x2 - 1, y ), f_counter ); } - m->place_items( "dissection", 80, point( x2 - 1, y1 ), point( x2 - 1, y2 ), false, 0 ); + m->place_items( "dissection", 80, point( x2 - 1, y1 ), point( x2 - 1, y2 ), false, + calendar::start_of_cataclysm ); } mtrap_set( m, static_cast( ( x1 + x2 ) / 2 ), static_cast( ( y1 + y2 ) / 2 ), tr_dissector ); @@ -7290,13 +7265,13 @@ void science_room( map *m, int x1, int y1, int x2, int y2, int z, int rotate ) int biox = x1 + 2; int bioy = static_cast( ( y1 + y2 ) / 2 ); mapf::formatted_set_simple( m, biox - 1, bioy - 1, - "\ ----\n\ -|c|\n\ --=-\n", + "---\n" + "|c|\n" + "-=-\n", mapf::ter_bind( "- | =", t_concrete_wall, t_concrete_wall, t_reinforced_glass ), mapf::furn_bind( "c", f_counter ) ); - m->place_items( "bionics_common", 70, point( biox, bioy ), point( biox, bioy ), false, 0 ); + m->place_items( "bionics_common", 70, point( biox, bioy ), point( biox, bioy ), false, + calendar::start_of_cataclysm ); m->ter_set( point( biox, bioy + 2 ), t_console ); computer *tmpcomp = m->add_computer( tripoint( biox, bioy + 2, z ), _( "Bionic access" ), 2 ); @@ -7307,13 +7282,13 @@ void science_room( map *m, int x1, int y1, int x2, int y2, int z, int rotate ) biox = x2 - 2; mapf::formatted_set_simple( m, biox - 1, bioy - 1, - "\ --=-\n\ -|c|\n\ ----\n", + "-=-\n" + "|c|\n" + "---\n", mapf::ter_bind( "- | =", t_concrete_wall, t_concrete_wall, t_reinforced_glass ), mapf::furn_bind( "c", f_counter ) ); - m->place_items( "bionics_common", 70, point( biox, bioy ), point( biox, bioy ), false, 0 ); + m->place_items( "bionics_common", 70, point( biox, bioy ), point( biox, bioy ), false, + calendar::start_of_cataclysm ); m->ter_set( point( biox, bioy - 2 ), t_console ); computer *tmpcomp2 = m->add_computer( tripoint( biox, bioy - 2, z ), _( "Bionic access" ), 2 ); @@ -7325,13 +7300,13 @@ void science_room( map *m, int x1, int y1, int x2, int y2, int z, int rotate ) int bioy = y1 + 2; int biox = static_cast( ( x1 + x2 ) / 2 ); mapf::formatted_set_simple( m, biox - 1, bioy - 1, - "\ -|-|\n\ -|c=\n\ -|-|\n", + "|-|\n" + "|c=\n" + "|-|\n", mapf::ter_bind( "- | =", t_concrete_wall, t_concrete_wall, t_reinforced_glass ), mapf::furn_bind( "c", f_counter ) ); - m->place_items( "bionics_common", 70, point( biox, bioy ), point( biox, bioy ), false, 0 ); + m->place_items( "bionics_common", 70, point( biox, bioy ), point( biox, bioy ), false, + calendar::start_of_cataclysm ); m->ter_set( point( biox + 2, bioy ), t_console ); computer *tmpcomp = m->add_computer( tripoint( biox + 2, bioy, z ), _( "Bionic access" ), 2 ); @@ -7342,10 +7317,9 @@ void science_room( map *m, int x1, int y1, int x2, int y2, int z, int rotate ) bioy = y2 - 2; mapf::formatted_set_simple( m, biox - 1, bioy - 1, - "\ -|-|\n\ -=c|\n\ -|-|\n", + "|-|\n" + "=c|\n" + "|-|\n", mapf::ter_bind( "- | =", t_concrete_wall, t_concrete_wall, t_reinforced_glass ), mapf::furn_bind( "c", f_counter ) ); m->place_items( "bionics_common", 70, point( biox, bioy ), point( biox, bioy ), false, 0 ); @@ -7362,35 +7336,44 @@ void science_room( map *m, int x1, int y1, int x2, int y2, int z, int rotate ) if( rotate % 2 == 0 ) { for( int y = y1 + 1; y <= y2 - 1; y += 3 ) { m->furn_set( point( x1, y ), f_bed ); - m->place_items( "bed", 60, point( x1, y ), point( x1, y ), false, 0 ); + m->place_items( "bed", 60, point( x1, y ), point( x1, y ), false, calendar::start_of_cataclysm ); m->furn_set( point( x1 + 1, y ), f_bed ); - m->place_items( "bed", 60, point( x1 + 1, y ), point( x1 + 1, y ), false, 0 ); + m->place_items( "bed", 60, point( x1 + 1, y ), point( x1 + 1, y ), false, + calendar::start_of_cataclysm ); m->furn_set( point( x2, y ), f_bed ); - m->place_items( "bed", 60, point( x2, y ), point( x2, y ), false, 0 ); + m->place_items( "bed", 60, point( x2, y ), point( x2, y ), false, calendar::start_of_cataclysm ); m->furn_set( point( x2 - 1, y ), f_bed ); - m->place_items( "bed", 60, point( x2 - 1, y ), point( x2 - 1, y ), false, 0 ); + m->place_items( "bed", 60, point( x2 - 1, y ), point( x2 - 1, y ), false, + calendar::start_of_cataclysm ); m->furn_set( point( x1, y + 1 ), f_dresser ); m->furn_set( point( x2, y + 1 ), f_dresser ); - m->place_items( "dresser", 70, point( x1, y + 1 ), point( x1, y + 1 ), false, 0 ); - m->place_items( "dresser", 70, point( x2, y + 1 ), point( x2, y + 1 ), false, 0 ); + m->place_items( "dresser", 70, point( x1, y + 1 ), point( x1, y + 1 ), false, + calendar::start_of_cataclysm ); + m->place_items( "dresser", 70, point( x2, y + 1 ), point( x2, y + 1 ), false, + calendar::start_of_cataclysm ); } } else if( rotate % 2 == 1 ) { for( int x = x1 + 1; x <= x2 - 1; x += 3 ) { m->furn_set( point( x, y1 ), f_bed ); - m->place_items( "bed", 60, point( x, y1 ), point( x, y1 ), false, 0 ); + m->place_items( "bed", 60, point( x, y1 ), point( x, y1 ), false, calendar::start_of_cataclysm ); m->furn_set( point( x, y1 + 1 ), f_bed ); - m->place_items( "bed", 60, point( x, y1 + 1 ), point( x, y1 + 1 ), false, 0 ); + m->place_items( "bed", 60, point( x, y1 + 1 ), point( x, y1 + 1 ), false, + calendar::start_of_cataclysm ); m->furn_set( point( x, y2 ), f_bed ); - m->place_items( "bed", 60, point( x, y2 ), point( x, y2 ), false, 0 ); + m->place_items( "bed", 60, point( x, y2 ), point( x, y2 ), false, calendar::start_of_cataclysm ); m->furn_set( point( x, y2 - 1 ), f_bed ); - m->place_items( "bed", 60, point( x, y2 - 1 ), point( x, y2 - 1 ), false, 0 ); + m->place_items( "bed", 60, point( x, y2 - 1 ), point( x, y2 - 1 ), false, + calendar::start_of_cataclysm ); m->furn_set( point( x + 1, y1 ), f_dresser ); m->furn_set( point( x + 1, y2 ), f_dresser ); - m->place_items( "dresser", 70, point( x + 1, y1 ), point( x + 1, y1 ), false, 0 ); - m->place_items( "dresser", 70, point( x + 1, y2 ), point( x + 1, y2 ), false, 0 ); + m->place_items( "dresser", 70, point( x + 1, y1 ), point( x + 1, y1 ), false, + calendar::start_of_cataclysm ); + m->place_items( "dresser", 70, point( x + 1, y2 ), point( x + 1, y2 ), false, + calendar::start_of_cataclysm ); } } - m->place_items( "lab_dorm", 84, point( x1, y1 ), point( x2, y2 ), false, 0 ); + m->place_items( "lab_dorm", 84, point( x1, y1 ), point( x2, y2 ), false, + calendar::start_of_cataclysm ); break; case room_split: if( rotate % 2 == 0 ) { @@ -7444,9 +7427,12 @@ void set_science_room( map *m, int x1, int y1, bool faces_right, const time_poin } } } - m->place_items( "chem_lab", 85, point( x1 + 1, y1 ), point( x2 - 1, y1 ), false, 0 ); - m->place_items( "chem_lab", 85, point( x1 + 1, y2 ), point( x2 - 1, y2 ), false, 0 ); - m->place_items( "chem_lab", 85, point( x1, y1 + 1 ), point( x1, y2 - 1 ), false, 0 ); + m->place_items( "chem_lab", 85, point( x1 + 1, y1 ), point( x2 - 1, y1 ), false, + calendar::start_of_cataclysm ); + m->place_items( "chem_lab", 85, point( x1 + 1, y2 ), point( x2 - 1, y2 ), false, + calendar::start_of_cataclysm ); + m->place_items( "chem_lab", 85, point( x1, y1 + 1 ), point( x1, y2 - 1 ), false, + calendar::start_of_cataclysm ); break; case 2: // Hydroponics. @@ -7534,140 +7520,6 @@ void set_science_room( map *m, int x1, int y1, bool faces_right, const time_poin } } -void silo_rooms( map *m ) -{ - // first is room position, second is its size - std::vector> rooms; - bool okay = true; - int x = 0; - int y = 0; - int width = 0; - int height = 0; - do { - if( one_in( 2 ) ) { // True = top/bottom, False = left/right - x = rng( 0, SEEX * 2 - 6 ); - y = rng( 0, 4 ); - if( one_in( 2 ) ) { - y = SEEY * 2 - 2 - y; // Bottom of the screen, not the top - } - width = rng( 2, 5 ); - height = 2; - if( x + width >= SEEX * 2 - 1 ) { - width = SEEX * 2 - 2 - x; // Make sure our room isn't too wide - } - } else { - x = rng( 0, 4 ); - y = rng( 0, SEEY * 2 - 6 ); - if( one_in( 2 ) ) { - x = SEEX * 2 - 3 - x; // Right side of the screen, not the left - } - width = 2; - height = rng( 2, 5 ); - if( y + height >= SEEY * 2 - 1 ) { - height = SEEY * 2 - 2 - y; // Make sure our room isn't too tall - } - } - if( !rooms.empty() && // We need at least one room! - ( m->ter( point( x, y ) ) != t_rock || m->ter( point( x + width, y + height ) ) != t_rock ) ) { - okay = false; - } else { - rooms.emplace_back( point( x, y ), point( width, height ) ); - for( int i = x; i <= x + width; i++ ) { - for( int j = y; j <= y + height; j++ ) { - if( m->ter( point( i, j ) ) == t_rock ) { - m->ter_set( point( i, j ), t_floor ); - } - } - } - items_location used1 = "none", used2 = "none"; - switch( rng( 1, 14 ) ) { // What type of items go here? - case 1: - case 2: - used1 = "cannedfood"; - used2 = "fridge"; - break; - case 3: - case 4: - used1 = "tools_lighting"; - break; - case 5: - case 6: - used1 = "guns_common"; - used2 = "ammo"; - break; - case 7: - used1 = "allclothes"; - break; - case 8: - used1 = "manuals"; - break; - case 9: - case 10: - case 11: - used1 = "electronics"; - break; - case 12: - used1 = "gear_survival"; - break; - case 13: - case 14: - used1 = "radio"; - break; - } - if( used1 != "none" ) { - m->place_items( used1, 78, point( x, y ), point( x + width, y + height ), false, 0 ); - } - if( used2 != "none" ) { - m->place_items( used2, 64, point( x, y ), point( x + width, y + height ), false, 0 ); - } - } - } while( okay ); - - const point &first_room_position = rooms[0].first; - m->ter_set( first_room_position, t_stairs_up ); - const auto &room = random_entry( rooms ); - m->ter_set( room.first + room.second, t_stairs_down ); - rooms.emplace_back( point( SEEX, SEEY ), point( 5, 5 ) ); // So the center circle gets connected - - while( rooms.size() > 1 ) { - int best_dist = 999; - int closest = 0; - for( size_t i = 1; i < rooms.size(); i++ ) { - int dist = trig_dist( first_room_position, rooms[i].first ); - if( dist < best_dist ) { - best_dist = dist; - closest = i; - } - } - // We chose the closest room; now draw a corridor there - point origin = first_room_position; - point origsize = rooms[0].second; - point dest = rooms[closest].first; - int x = origin.x + origsize.x; - int y = origin.y + origsize.y; - bool x_first = ( abs( origin.x - dest.x ) > abs( origin.y - dest.y ) ); - while( x != dest.x || y != dest.y ) { - if( m->ter( point( x, y ) ) == t_rock ) { - m->ter_set( point( x, y ), t_floor ); - } - if( ( x_first && x != dest.x ) || ( !x_first && y == dest.y ) ) { - if( dest.x < x ) { - x--; - } else { - x++; - } - } else { - if( dest.y < y ) { - y--; - } else { - y++; - } - } - } - rooms.erase( rooms.begin() ); - } -} - void build_mine_room( map *m, room_type type, int x1, int y1, int x2, int y2, mapgendata &dat ) { ( void )dat; @@ -7746,11 +7598,13 @@ void build_mine_room( map *m, room_type type, int x1, int y1, int x2, int y2, ma line( m, t_window, midx - 1, y2, midx + 1, y2 ); line( m, t_window, x1, midy - 1, x1, midy + 1 ); line( m, t_window, x2, midy - 1, x2, midy + 1 ); - m->place_items( "office", 80, point( x1 + 1, y1 + 1 ), point( x2 - 1, y2 - 1 ), false, 0 ); + m->place_items( "office", 80, point( x1 + 1, y1 + 1 ), point( x2 - 1, y2 - 1 ), false, + calendar::start_of_cataclysm ); break; case room_mine_storage: - m->place_items( "mine_storage", 85, point( x1 + 2, y1 + 2 ), point( x2 - 2, y2 - 2 ), false, 0 ); + m->place_items( "mine_storage", 85, point( x1 + 2, y1 + 2 ), point( x2 - 2, y2 - 2 ), false, + calendar::start_of_cataclysm ); break; case room_mine_fuel: { @@ -7774,38 +7628,51 @@ void build_mine_room( map *m, room_type type, int x1, int y1, int x2, int y2, ma for( int y = y1 + 2; y <= y2 - 2; y += 2 ) { m->ter_set( point( x1, y ), t_window ); m->furn_set( point( x1 + 1, y ), f_bed ); - m->place_items( "bed", 60, point( x1 + 1, y ), point( x1 + 1, y ), false, 0 ); + m->place_items( "bed", 60, point( x1 + 1, y ), point( x1 + 1, y ), false, + calendar::start_of_cataclysm ); m->furn_set( point( x1 + 2, y ), f_bed ); - m->place_items( "bed", 60, point( x1 + 2, y ), point( x1 + 2, y ), false, 0 ); + m->place_items( "bed", 60, point( x1 + 2, y ), point( x1 + 2, y ), false, + calendar::start_of_cataclysm ); m->ter_set( point( x2, y ), t_window ); m->furn_set( point( x2 - 1, y ), f_bed ); - m->place_items( "bed", 60, point( x2 - 1, y ), point( x2 - 1, y ), false, 0 ); + m->place_items( "bed", 60, point( x2 - 1, y ), point( x2 - 1, y ), false, + calendar::start_of_cataclysm ); m->furn_set( point( x2 - 2, y ), f_bed ); - m->place_items( "bed", 60, point( x2 - 2, y ), point( x2 - 2, y ), false, 0 ); + m->place_items( "bed", 60, point( x2 - 2, y ), point( x2 - 2, y ), false, + calendar::start_of_cataclysm ); m->furn_set( point( x1 + 1, y + 1 ), f_dresser ); - m->place_items( "dresser", 78, point( x1 + 1, y + 1 ), point( x1 + 1, y + 1 ), false, 0 ); + m->place_items( "dresser", 78, point( x1 + 1, y + 1 ), point( x1 + 1, y + 1 ), false, + calendar::start_of_cataclysm ); m->furn_set( point( x2 - 1, y + 1 ), f_dresser ); - m->place_items( "dresser", 78, point( x2 - 1, y + 1 ), point( x2 - 1, y + 1 ), false, 0 ); + m->place_items( "dresser", 78, point( x2 - 1, y + 1 ), point( x2 - 1, y + 1 ), false, + calendar::start_of_cataclysm ); } } else { for( int x = x1 + 2; x <= x2 - 2; x += 2 ) { m->ter_set( point( x, y1 ), t_window ); m->furn_set( point( x, y1 + 1 ), f_bed ); - m->place_items( "bed", 60, point( x, y1 + 1 ), point( x, y1 + 1 ), false, 0 ); + m->place_items( "bed", 60, point( x, y1 + 1 ), point( x, y1 + 1 ), false, + calendar::start_of_cataclysm ); m->furn_set( point( x, y1 + 2 ), f_bed ); - m->place_items( "bed", 60, point( x, y1 + 2 ), point( x, y1 + 2 ), false, 0 ); + m->place_items( "bed", 60, point( x, y1 + 2 ), point( x, y1 + 2 ), false, + calendar::start_of_cataclysm ); m->ter_set( point( x, y2 ), t_window ); m->furn_set( point( x, y2 - 1 ), f_bed ); - m->place_items( "bed", 60, point( x, y2 - 1 ), point( x, y2 - 1 ), false, 0 ); + m->place_items( "bed", 60, point( x, y2 - 1 ), point( x, y2 - 1 ), false, + calendar::start_of_cataclysm ); m->furn_set( point( x, y2 - 2 ), f_bed ); - m->place_items( "bed", 60, point( x, y2 - 2 ), point( x, y2 - 2 ), false, 0 ); + m->place_items( "bed", 60, point( x, y2 - 2 ), point( x, y2 - 2 ), false, + calendar::start_of_cataclysm ); m->furn_set( point( x + 1, y1 + 1 ), f_dresser ); - m->place_items( "dresser", 78, point( x + 1, y1 + 1 ), point( x + 1, y1 + 1 ), false, 0 ); + m->place_items( "dresser", 78, point( x + 1, y1 + 1 ), point( x + 1, y1 + 1 ), false, + calendar::start_of_cataclysm ); m->furn_set( point( x + 1, y2 - 1 ), f_dresser ); - m->place_items( "dresser", 78, point( x + 1, y2 - 1 ), point( x + 1, y2 - 1 ), false, 0 ); + m->place_items( "dresser", 78, point( x + 1, y2 - 1 ), point( x + 1, y2 - 1 ), false, + calendar::start_of_cataclysm ); } } - m->place_items( "bedroom", 65, point( x1 + 1, y1 + 1 ), point( x2 - 1, y2 - 1 ), false, 0 ); + m->place_items( "bedroom", 65, point( x1 + 1, y1 + 1 ), point( x2 - 1, y2 - 1 ), false, + calendar::start_of_cataclysm ); break; default: //Suppress warnings diff --git a/src/mapgen_functions.cpp b/src/mapgen_functions.cpp index eebbfff245829..9dbb46221028a 100644 --- a/src/mapgen_functions.cpp +++ b/src/mapgen_functions.cpp @@ -1695,31 +1695,31 @@ void mapgen_railroad( map *m, oter_id terrain_type, mapgendata dat, const time_p // now we have only these shapes: ' | '- -'- -|- switch( num_dirs ) { case 4: // 4-way intersection - mapf::formatted_set_simple( m, 0, 0, "\ -.DD^^DD^........^DD^^DD.\n\ -DD^^DD^..........^DD^^DD\n\ -D^^DD^............^DD^^D\n\ -^^DD^..............^DD^^\n\ -^DD^................^DD^\n\ -DD^..................^DD\n\ -D^....................^D\n\ -........................\n\ -........................\n\ -........................\n\ -........................\n\ -........................\n\ -........................\n\ -........................\n\ -........................\n\ -........................\n\ -........................\n\ -D^....................^D\n\ -DD^..................^DD\n\ -^DD^................^DD^\n\ -^^DD^..............^DD^^\n\ -D^^DD^............^DD^^D\n\ -DD^^DD^..........^DD^^DD\n\ -.DD^^DD^........^DD^^DD.", + mapf::formatted_set_simple( m, 0, 0, + ".DD^^DD^........^DD^^DD.\n" + "DD^^DD^..........^DD^^DD\n" + "D^^DD^............^DD^^D\n" + "^^DD^..............^DD^^\n" + "^DD^................^DD^\n" + "DD^..................^DD\n" + "D^....................^D\n" + "........................\n" + "........................\n" + "........................\n" + "........................\n" + "........................\n" + "........................\n" + "........................\n" + "........................\n" + "........................\n" + "........................\n" + "D^....................^D\n" + "DD^..................^DD\n" + "^DD^................^DD^\n" + "^^DD^..............^DD^^\n" + "D^^DD^............^DD^^D\n" + "DD^^DD^..........^DD^^DD\n" + ".DD^^DD^........^DD^^DD.", mapf::ter_bind( ". ^ D", t_dirt, t_railroad_rubble, @@ -1730,31 +1730,31 @@ DD^^DD^..........^DD^^DD\n\ f_null ) ); break; case 3: // tee - mapf::formatted_set_simple( m, 0, 0, "\ -.DD^^DD^........^DD^^DD.\n\ -DD^^DD^..........^DD^^DD\n\ -D^^DD^............^DD^^D\n\ -^^DD^..............^DD^^\n\ -^DD^................^DD^\n\ -DD^..................^DD\n\ -D^....................^D\n\ -........................\n\ -........................\n\ -........................\n\ -........................\n\ -........................\n\ -........................\n\ -........................\n\ -........................\n\ -........................\n\ -^|^^|^^|^^|^^|^^|^^|^^|^\n\ -XxXXxXXxXXxXXxXXxXXxXXxX\n\ -^|^^|^^|^^|^^|^^|^^|^^|^\n\ -^|^^|^^|^^|^^|^^|^^|^^|^\n\ -^|^^|^^|^^|^^|^^|^^|^^|^\n\ -XxXXxXXxXXxXXxXXxXXxXXxX\n\ -^|^^|^^|^^|^^|^^|^^|^^|^\n\ -........................", + mapf::formatted_set_simple( m, 0, 0, + ".DD^^DD^........^DD^^DD.\n" + "DD^^DD^..........^DD^^DD\n" + "D^^DD^............^DD^^D\n" + "^^DD^..............^DD^^\n" + "^DD^................^DD^\n" + "DD^..................^DD\n" + "D^....................^D\n" + "........................\n" + "........................\n" + "........................\n" + "........................\n" + "........................\n" + "........................\n" + "........................\n" + "........................\n" + "........................\n" + "^|^^|^^|^^|^^|^^|^^|^^|^\n" + "XxXXxXXxXXxXXxXXxXXxXXxX\n" + "^|^^|^^|^^|^^|^^|^^|^^|^\n" + "^|^^|^^|^^|^^|^^|^^|^^|^\n" + "^|^^|^^|^^|^^|^^|^^|^^|^\n" + "XxXXxXXxXXxXXxXXxXXxXXxX\n" + "^|^^|^^|^^|^^|^^|^^|^^|^\n" + "........................", mapf::ter_bind( ". ^ | X x / D", t_dirt, t_railroad_rubble, @@ -1774,31 +1774,31 @@ XxXXxXXxXXxXXxXXxXXxXXxX\n\ break; case 2: // straight or diagonal if( diag ) { // diagonal railroads get drawn differently from all other types - mapf::formatted_set_simple( m, 0, 0, "\ -.^DD^^DD^.......^DD^^DD^\n\ -..^DD^^DD^.......^DD^^DD\n\ -...^DD^^DD^.......^DD^^D\n\ -....^DD^^DD^.......^DD^^\n\ -.....^DD^^DD^.......^DD^\n\ -......^DD^^DD^.......^DD\n\ -.......^DD^^DD^.......^D\n\ -........^DD^^DD^.......^\n\ -.........^DD^^DD^.......\n\ -..........^DD^^DD^......\n\ -...........^DD^^DD^.....\n\ -............^DD^^DD^....\n\ -.............^DD^^DD^...\n\ -..............^DD^^DD^..\n\ -...............^DD^^DD^.\n\ -................^DD^^DD^\n\ -.................^DD^^DD\n\ -..................^DD^^D\n\ -...................^DD^^\n\ -....................^DD^\n\ -.....................^DD\n\ -......................^D\n\ -.......................^\n\ -........................", + mapf::formatted_set_simple( m, 0, 0, + ".^DD^^DD^.......^DD^^DD^\n" + "..^DD^^DD^.......^DD^^DD\n" + "...^DD^^DD^.......^DD^^D\n" + "....^DD^^DD^.......^DD^^\n" + ".....^DD^^DD^.......^DD^\n" + "......^DD^^DD^.......^DD\n" + ".......^DD^^DD^.......^D\n" + "........^DD^^DD^.......^\n" + ".........^DD^^DD^.......\n" + "..........^DD^^DD^......\n" + "...........^DD^^DD^.....\n" + "............^DD^^DD^....\n" + ".............^DD^^DD^...\n" + "..............^DD^^DD^..\n" + "...............^DD^^DD^.\n" + "................^DD^^DD^\n" + ".................^DD^^DD\n" + "..................^DD^^D\n" + "...................^DD^^\n" + "....................^DD^\n" + ".....................^DD\n" + "......................^D\n" + ".......................^\n" + "........................", mapf::ter_bind( ". ^ D", t_dirt, t_railroad_rubble, @@ -1808,31 +1808,31 @@ XxXXxXXxXXxXXxXXxXXxXXxX\n\ f_null, f_null ) ); } else { // normal railroads drawing - mapf::formatted_set_simple( m, 0, 0, "\ -.^X^^^X^........^X^^^X^.\n\ -.-x---x-........-x---x-.\n\ -.^X^^^X^........^X^^^X^.\n\ -.^X^^^X^........^X^^^X^.\n\ -.-x---x-........-x---x-.\n\ -.^X^^^X^........^X^^^X^.\n\ -.^X^^^X^........^X^^^X^.\n\ -.-x---x-........-x---x-.\n\ -.^X^^^X^........^X^^^X^.\n\ -.^X^^^X^........^X^^^X^.\n\ -.-x---x-........-x---x-.\n\ -.^X^^^X^........^X^^^X^.\n\ -.^X^^^X^........^X^^^X^.\n\ -.-x---x-........-x---x-.\n\ -.^X^^^X^........^X^^^X^.\n\ -.^X^^^X^........^X^^^X^.\n\ -.-x---x-........-x---x-.\n\ -.^X^^^X^........^X^^^X^.\n\ -.^X^^^X^........^X^^^X^.\n\ -.-x---x-........-x---x-.\n\ -.^X^^^X^........^X^^^X^.\n\ -.^X^^^X^........^X^^^X^.\n\ -.-x---x-........-x---x-.\n\ -.^X^^^X^........^X^^^X^.", + mapf::formatted_set_simple( m, 0, 0, + ".^X^^^X^........^X^^^X^.\n" + ".-x---x-........-x---x-.\n" + ".^X^^^X^........^X^^^X^.\n" + ".^X^^^X^........^X^^^X^.\n" + ".-x---x-........-x---x-.\n" + ".^X^^^X^........^X^^^X^.\n" + ".^X^^^X^........^X^^^X^.\n" + ".-x---x-........-x---x-.\n" + ".^X^^^X^........^X^^^X^.\n" + ".^X^^^X^........^X^^^X^.\n" + ".-x---x-........-x---x-.\n" + ".^X^^^X^........^X^^^X^.\n" + ".^X^^^X^........^X^^^X^.\n" + ".-x---x-........-x---x-.\n" + ".^X^^^X^........^X^^^X^.\n" + ".^X^^^X^........^X^^^X^.\n" + ".-x---x-........-x---x-.\n" + ".^X^^^X^........^X^^^X^.\n" + ".^X^^^X^........^X^^^X^.\n" + ".-x---x-........-x---x-.\n" + ".^X^^^X^........^X^^^X^.\n" + ".^X^^^X^........^X^^^X^.\n" + ".-x---x-........-x---x-.\n" + ".^X^^^X^........^X^^^X^.", mapf::ter_bind( ". ^ - X x", t_dirt, t_railroad_rubble, @@ -1848,31 +1848,31 @@ XxXXxXXxXXxXXxXXxXXxXXxX\n\ } break; case 1: // dead end - mapf::formatted_set_simple( m, 0, 0, "\ -.^X^^^X^........^X^^^X^.\n\ -.-x---x-........-x---x-.\n\ -.^X^^^X^........^X^^^X^.\n\ -.^X^^^X^........^X^^^X^.\n\ -.-x---x-........-x---x-.\n\ -.^X^^^X^........^X^^^X^.\n\ -.^X^^^X^........^X^^^X^.\n\ -.-x---x-........-x---x-.\n\ -.^X^^^X^........^X^^^X^.\n\ -.^X^^^X^........^X^^^X^.\n\ -.-x---x-........-x---x-.\n\ -.^X^^^X^........^X^^^X^.\n\ -.^S^^^S^........^S^^^S^.\n\ -.^^^^^^^........^^^^^^^.\n\ -........................\n\ -........................\n\ -........................\n\ -........................\n\ -........................\n\ -........................\n\ -........................\n\ -........................\n\ -........................\n\ -........................", + mapf::formatted_set_simple( m, 0, 0, + ".^X^^^X^........^X^^^X^.\n" + ".-x---x-........-x---x-.\n" + ".^X^^^X^........^X^^^X^.\n" + ".^X^^^X^........^X^^^X^.\n" + ".-x---x-........-x---x-.\n" + ".^X^^^X^........^X^^^X^.\n" + ".^X^^^X^........^X^^^X^.\n" + ".-x---x-........-x---x-.\n" + ".^X^^^X^........^X^^^X^.\n" + ".^X^^^X^........^X^^^X^.\n" + ".-x---x-........-x---x-.\n" + ".^X^^^X^........^X^^^X^.\n" + ".^S^^^S^........^S^^^S^.\n" + ".^^^^^^^........^^^^^^^.\n" + "........................\n" + "........................\n" + "........................\n" + "........................\n" + "........................\n" + "........................\n" + "........................\n" + "........................\n" + "........................\n" + "........................", mapf::ter_bind( ". ^ S - X x", t_dirt, t_railroad_rubble, @@ -1895,31 +1895,31 @@ XxXXxXXxXXxXXxXXxXXxXXxX\n\ /////////////////// void mapgen_railroad_bridge( map *m, oter_id terrain_type, mapgendata, const time_point &, float ) { - mapf::formatted_set_simple( m, 0, 0, "\ -r^X^^^X^________^X^^^X^r\n\ -r-x---x-________-x---x-r\n\ -r^X^^^X^________^X^^^X^r\n\ -r^X^^^X^________^X^^^X^r\n\ -r-x---x-________-x---x-r\n\ -r^X^^^X^________^X^^^X^r\n\ -r^X^^^X^________^X^^^X^r\n\ -r-x---x-________-x---x-r\n\ -r^X^^^X^________^X^^^X^r\n\ -r^X^^^X^________^X^^^X^r\n\ -r-x---x-________-x---x-r\n\ -r^X^^^X^________^X^^^X^r\n\ -r^X^^^X^________^X^^^X^r\n\ -r-x---x-________-x---x-r\n\ -r^X^^^X^________^X^^^X^r\n\ -r^X^^^X^________^X^^^X^r\n\ -r-x---x-________-x---x-r\n\ -r^X^^^X^________^X^^^X^r\n\ -r^X^^^X^________^X^^^X^r\n\ -r-x---x-________-x---x-r\n\ -r^X^^^X^________^X^^^X^r\n\ -r^X^^^X^________^X^^^X^r\n\ -r-x---x-________-x---x-r\n\ -r^X^^^X^________^X^^^X^r", + mapf::formatted_set_simple( m, 0, 0, + "r^X^^^X^________^X^^^X^r\n" + "r-x---x-________-x---x-r\n" + "r^X^^^X^________^X^^^X^r\n" + "r^X^^^X^________^X^^^X^r\n" + "r-x---x-________-x---x-r\n" + "r^X^^^X^________^X^^^X^r\n" + "r^X^^^X^________^X^^^X^r\n" + "r-x---x-________-x---x-r\n" + "r^X^^^X^________^X^^^X^r\n" + "r^X^^^X^________^X^^^X^r\n" + "r-x---x-________-x---x-r\n" + "r^X^^^X^________^X^^^X^r\n" + "r^X^^^X^________^X^^^X^r\n" + "r-x---x-________-x---x-r\n" + "r^X^^^X^________^X^^^X^r\n" + "r^X^^^X^________^X^^^X^r\n" + "r-x---x-________-x---x-r\n" + "r^X^^^X^________^X^^^X^r\n" + "r^X^^^X^________^X^^^X^r\n" + "r-x---x-________-x---x-r\n" + "r^X^^^X^________^X^^^X^r\n" + "r^X^^^X^________^X^^^X^r\n" + "r-x---x-________-x---x-r\n" + "r^X^^^X^________^X^^^X^r", mapf::ter_bind( ". _ r ^ - X x", t_dirt, t_concrete, t_railing, t_railroad_rubble, t_railroad_tie, t_railroad_track, t_railroad_track_on_tie ), mapf::furn_bind( ". _ r ^ - X x", f_null, f_null, f_null, f_null, f_null, f_null, f_null ) diff --git a/src/martialarts.cpp b/src/martialarts.cpp index 4c864c2666d0b..0d2f941da5d15 100644 --- a/src/martialarts.cpp +++ b/src/martialarts.cpp @@ -341,7 +341,7 @@ class ma_buff_effect_type : public effect_type int_decay_step = -1; int_decay_tick = 1; int_dur_factor = 0_turns; - name.push_back( translation( buff.name ) ); + name.push_back( to_translation( buff.name ) ); desc.push_back( buff.description ); rating = e_good; } @@ -1348,7 +1348,7 @@ bool ma_style_callback::key( const input_context &ctxt, const input_event &event werase( w ); fold_and_print_from( w, point( 2, 1 ), width, selected, c_light_gray, text ); - draw_border( w, BORDER_COLOR, string_format( _( " Style: %s " ), _( ma.name ) ) ); + draw_border( w, BORDER_COLOR, string_format( _( " Style: %s " ), ma.name ) ); draw_scrollbar( w, selected, height, iLines, point_south, BORDER_COLOR, true ); wrefresh( w ); catacurses::refresh(); diff --git a/src/martialarts.h b/src/martialarts.h index 52e38a2aa76cb..dce484bb3cbce 100644 --- a/src/martialarts.h +++ b/src/martialarts.h @@ -11,6 +11,7 @@ #include "bonuses.h" #include "calendar.h" #include "string_id.h" +#include "translations.h" #include "type_id.h" #include "ui.h" #include "input.h" @@ -230,8 +231,8 @@ class martialart matype_id id; bool was_loaded = false; - std::string name; - std::string description; + translation name; + translation description; std::vector initiate; std::vector> autolearn_skills; skill_id primary_skill; diff --git a/src/mattack_actors.cpp b/src/mattack_actors.cpp index 6909a5c96cf2c..b7364b25f933c 100644 --- a/src/mattack_actors.cpp +++ b/src/mattack_actors.cpp @@ -56,9 +56,9 @@ void leap_actor::load_internal( JsonObject &obj, const std::string & ) max_consider_range = obj.get_float( "max_consider_range", 200.0f ); } -mattack_actor *leap_actor::clone() const +std::unique_ptr leap_actor::clone() const { - return new leap_actor( *this ); + return std::make_unique( *this ); } bool leap_actor::call( monster &z ) const @@ -141,9 +141,9 @@ bool leap_actor::call( monster &z ) const return true; } -mattack_actor *mon_spellcasting_actor::clone() const +std::unique_ptr mon_spellcasting_actor::clone() const { - return new mon_spellcasting_actor( *this ); + return std::make_unique( *this ); } void mon_spellcasting_actor::load_internal( JsonObject &obj, const std::string & ) @@ -153,7 +153,11 @@ void mon_spellcasting_actor::load_internal( JsonObject &obj, const std::string & mandatory( obj, was_loaded, "spell_id", sp_id ); optional( obj, was_loaded, "self", self, false ); optional( obj, was_loaded, "spell_level", spell_level, 0 ); - spell_data = spell( spell_id( sp_id ) ); + translation monster_message; + optional( obj, was_loaded, "monster_message", monster_message, + //~ translator " cast on !" + to_translation( "%s casts %s at %s!" ) ); + spell_data = spell( spell_id( sp_id ), monster_message ); for( int i = 0; i <= spell_level; i++ ) { spell_data.gain_level(); } @@ -184,6 +188,15 @@ bool mon_spellcasting_actor::call( monster &mon ) const return false; } + std::string target_name; + if( const Creature *target_monster = g->critter_at( target ) ) { + target_name = target_monster->disp_name(); + } + + if( g->u.sees( target ) ) { + add_msg( spell_data.message(), mon.disp_name(), spell_data.name(), target_name ); + } + spell_data.cast_all_effects( mon, target ); return true; @@ -213,17 +226,17 @@ void melee_actor::load_internal( JsonObject &obj, const std::string & ) accuracy = obj.get_int( "accuracy", INT_MIN ); optional( obj, was_loaded, "miss_msg_u", miss_msg_u, - translation( "The %s lunges at you, but you dodge!" ) ); + to_translation( "The %s lunges at you, but you dodge!" ) ); optional( obj, was_loaded, "no_dmg_msg_u", no_dmg_msg_u, - translation( "The %1$s bites your %2$s, but fails to penetrate armor!" ) ); + to_translation( "The %1$s bites your %2$s, but fails to penetrate armor!" ) ); optional( obj, was_loaded, "hit_dmg_u", hit_dmg_u, - translation( "The %1$s bites your %2$s!" ) ); + to_translation( "The %1$s bites your %2$s!" ) ); optional( obj, was_loaded, "miss_msg_npc", miss_msg_npc, - translation( "The %s lunges at , but they dodge!" ) ); + to_translation( "The %s lunges at , but they dodge!" ) ); optional( obj, was_loaded, "no_dmg_msg_npc", no_dmg_msg_npc, - translation( "The %1$s bites 's %2$s, but fails to penetrate armor!" ) ); + to_translation( "The %1$s bites 's %2$s, but fails to penetrate armor!" ) ); optional( obj, was_loaded, "hit_dmg_npc", hit_dmg_npc, - translation( "The %1$s bites 's %2$s!" ) ); + to_translation( "The %1$s bites 's %2$s!" ) ); if( obj.has_array( "body_parts" ) ) { JsonArray jarr = obj.get_array( "body_parts" ); @@ -328,9 +341,9 @@ void melee_actor::on_damage( monster &z, Creature &target, dealt_damage_instance } } -mattack_actor *melee_actor::clone() const +std::unique_ptr melee_actor::clone() const { - return new melee_actor( *this ); + return std::make_unique( *this ); } bite_actor::bite_actor() = default; @@ -360,9 +373,9 @@ void bite_actor::on_damage( monster &z, Creature &target, dealt_damage_instance } } -mattack_actor *bite_actor::clone() const +std::unique_ptr bite_actor::clone() const { - return new bite_actor( *this ); + return std::make_unique( *this ); } gun_actor::gun_actor() : description( _( "The %1$s fires its %2$s!" ) ), @@ -437,9 +450,9 @@ void gun_actor::load_internal( JsonObject &obj, const std::string & ) obj.read( "require_sunlight", require_sunlight ); } -mattack_actor *gun_actor::clone() const +std::unique_ptr gun_actor::clone() const { - return new gun_actor( *this ); + return std::make_unique( *this ); } bool gun_actor::call( monster &z ) const diff --git a/src/mattack_actors.h b/src/mattack_actors.h index 791d79edd2a03..c3c6da73db9b8 100644 --- a/src/mattack_actors.h +++ b/src/mattack_actors.h @@ -40,7 +40,7 @@ class leap_actor : public mattack_actor void load_internal( JsonObject &obj, const std::string &src ) override; bool call( monster & ) const override; - mattack_actor *clone() const override; + std::unique_ptr clone() const override; }; class mon_spellcasting_actor : public mattack_actor @@ -56,7 +56,7 @@ class mon_spellcasting_actor : public mattack_actor void load_internal( JsonObject &obj, const std::string &src ) override; bool call( monster & ) const override; - mattack_actor *clone() const override; + std::unique_ptr clone() const override; }; class melee_actor : public mattack_actor @@ -106,7 +106,7 @@ class melee_actor : public mattack_actor void load_internal( JsonObject &obj, const std::string &src ) override; bool call( monster & ) const override; - mattack_actor *clone() const override; + std::unique_ptr clone() const override; }; class bite_actor : public melee_actor @@ -122,7 +122,7 @@ class bite_actor : public melee_actor void on_damage( monster &z, Creature &target, dealt_damage_instance &dealt ) const override; void load_internal( JsonObject &obj, const std::string &src ) override; - mattack_actor *clone() const override; + std::unique_ptr clone() const override; }; class gun_actor : public mattack_actor @@ -188,7 +188,7 @@ class gun_actor : public mattack_actor void load_internal( JsonObject &obj, const std::string &src ) override; bool call( monster & ) const override; - mattack_actor *clone() const override; + std::unique_ptr clone() const override; }; #endif diff --git a/src/mattack_common.h b/src/mattack_common.h index f0af282a6a6ee..9bf379bac3add 100644 --- a/src/mattack_common.h +++ b/src/mattack_common.h @@ -5,6 +5,8 @@ #include #include +#include "clone_ptr.h" + class JsonObject; class monster; @@ -27,7 +29,7 @@ class mattack_actor virtual ~mattack_actor() = default; virtual bool call( monster & ) const = 0; - virtual mattack_actor *clone() const = 0; + virtual std::unique_ptr clone() const = 0; virtual void load_internal( JsonObject &jo, const std::string &src ) = 0; }; @@ -35,22 +37,11 @@ struct mtype_special_attack { protected: // TODO: Remove friend friend struct mtype; - std::unique_ptr actor; + cata::clone_ptr actor; public: mtype_special_attack( const mattack_id &id, mon_action_attack f ); - mtype_special_attack( mattack_actor *f ) : actor( f ) { } - mtype_special_attack( mtype_special_attack && ) = default; - mtype_special_attack( const mtype_special_attack &other ) : - mtype_special_attack( other.actor->clone() ) { } - - ~mtype_special_attack() = default; - - mtype_special_attack &operator=( mtype_special_attack && ) = default; - mtype_special_attack &operator=( const mtype_special_attack &other ) { - actor.reset( other.actor->clone() ); - return *this; - } + mtype_special_attack( std::unique_ptr f ) : actor( std::move( f ) ) { } const mattack_actor &operator*() const { return *actor; diff --git a/src/melee.cpp b/src/melee.cpp index 5ea751e556047..cf35d6d64203f 100644 --- a/src/melee.cpp +++ b/src/melee.cpp @@ -75,6 +75,7 @@ const efftype_id effect_contacts( "contacts" ); const efftype_id effect_downed( "downed" ); const efftype_id effect_drunk( "drunk" ); const efftype_id effect_grabbed( "grabbed" ); +const efftype_id effect_grabbing( "grabbing" ); const efftype_id effect_heavysnare( "heavysnare" ); const efftype_id effect_hit_by_player( "hit_by_player" ); const efftype_id effect_lightsnare( "lightsnare" ); @@ -731,17 +732,17 @@ float player::get_dodge() const ret /= 2; } - int zed_number = 0; - for( auto &dest : g->m.points_in_radius( pos(), 1, 0 ) ) { - const monster *const mon = g->critter_at( dest ); - if( mon && ( mon->has_flag( MF_GRABS ) || - mon->type->has_special_attack( "GRAB" ) ) ) { - zed_number++; + if( has_effect( effect_grabbed ) ) { + int zed_number = 0; + for( auto &dest : g->m.points_in_radius( pos(), 1, 0 ) ) { + const monster *const mon = g->critter_at( dest ); + if( mon && mon->has_effect( effect_grabbing ) ) { + zed_number++; + } + } + if( zed_number > 0 ) { + ret /= zed_number + 1; } - } - - if( has_effect( effect_grabbed ) && zed_number > 0 ) { - ret /= zed_number + 1; } if( worn_with_flag( "ROLLER_INLINE" ) || @@ -1376,7 +1377,7 @@ void player::perform_technique( const ma_technique &technique, Creature &t, dama if( one_in( ( 1400 - ( get_int() * 50 ) ) / bionic_boost ) ) { ma_styles.push_back( style_selected ); add_msg_if_player( m_good, _( "You have learned %s from extensive practice with the CQB Bionic." ), - _( style_selected.obj().name ) ); + style_selected.obj().name ); } } } @@ -1861,38 +1862,66 @@ std::string melee_message( const ma_technique &tec, player &p, const dealt_damag // Three last values are for low damage static const std::array player_stab = {{ - _( "You impale %s" ), _( "You gouge %s" ), _( "You run %s through" ), - _( "You puncture %s" ), _( "You pierce %s" ), _( "You poke %s" ) + translate_marker( "You impale %s" ), + translate_marker( "You gouge %s" ), + translate_marker( "You run %s through" ), + translate_marker( "You puncture %s" ), + translate_marker( "You pierce %s" ), + translate_marker( "You poke %s" ) } }; static const std::array npc_stab = {{ - _( " impales %s" ), _( " gouges %s" ), _( " runs %s through" ), - _( " punctures %s" ), _( " pierces %s" ), _( " pokes %s" ) + translate_marker( " impales %s" ), + translate_marker( " gouges %s" ), + translate_marker( " runs %s through" ), + translate_marker( " punctures %s" ), + translate_marker( " pierces %s" ), + translate_marker( " pokes %s" ) } }; // First 5 are for high damage, next 2 for medium, then for low and then for v. low static const std::array player_cut = {{ - _( "You gut %s" ), _( "You chop %s" ), _( "You slash %s" ), - _( "You mutilate %s" ), _( "You maim %s" ), _( "You stab %s" ), - _( "You slice %s" ), _( "You cut %s" ), _( "You nick %s" ) + translate_marker( "You gut %s" ), + translate_marker( "You chop %s" ), + translate_marker( "You slash %s" ), + translate_marker( "You mutilate %s" ), + translate_marker( "You maim %s" ), + translate_marker( "You stab %s" ), + translate_marker( "You slice %s" ), + translate_marker( "You cut %s" ), + translate_marker( "You nick %s" ) } }; static const std::array npc_cut = {{ - _( " guts %s" ), _( " chops %s" ), _( " slashes %s" ), - _( " mutilates %s" ), _( " maims %s" ), _( " stabs %s" ), - _( " slices %s" ), _( " cuts %s" ), _( " nicks %s" ) + translate_marker( " guts %s" ), + translate_marker( " chops %s" ), + translate_marker( " slashes %s" ), + translate_marker( " mutilates %s" ), + translate_marker( " maims %s" ), + translate_marker( " stabs %s" ), + translate_marker( " slices %s" ), + translate_marker( " cuts %s" ), + translate_marker( " nicks %s" ) } }; // Three last values are for low damage static const std::array player_bash = {{ - _( "You clobber %s" ), _( "You smash %s" ), _( "You thrash %s" ), - _( "You batter %s" ), _( "You whack %s" ), _( "You hit %s" ) + translate_marker( "You clobber %s" ), + translate_marker( "You smash %s" ), + translate_marker( "You thrash %s" ), + translate_marker( "You batter %s" ), + translate_marker( "You whack %s" ), + translate_marker( "You hit %s" ) } }; static const std::array npc_bash = {{ - _( " clobbers %s" ), _( " smashes %s" ), _( " thrashes %s" ), - _( " batters %s" ), _( " whacks %s" ), _( " hits %s" ) + translate_marker( " clobbers %s" ), + translate_marker( " smashes %s" ), + translate_marker( " thrashes %s" ), + translate_marker( " batters %s" ), + translate_marker( " whacks %s" ), + translate_marker( " hits %s" ) } }; @@ -1934,11 +1963,11 @@ std::string melee_message( const ma_technique &tec, player &p, const dealt_damag } if( dominant_type == DT_STAB ) { - return ( npc ? npc_stab[index] : player_stab[index] ); + return npc ? _( npc_stab[index] ) : _( player_stab[index] ); } else if( dominant_type == DT_CUT ) { - return ( npc ? npc_cut[index] : player_cut[index] ); + return npc ? _( npc_cut[index] ) : _( player_cut[index] ); } else if( dominant_type == DT_BASH ) { - return ( npc ? npc_bash[index] : player_bash[index] ); + return npc ? _( npc_bash[index] ) : _( player_bash[index] ); } return _( "The bugs attack %s" ); diff --git a/src/memorial_logger.cpp b/src/memorial_logger.cpp new file mode 100644 index 0000000000000..baa7cc412cf45 --- /dev/null +++ b/src/memorial_logger.cpp @@ -0,0 +1,1015 @@ +#include "memorial_logger.h" + +#include + +#include "addiction.h" +#include "avatar.h" +#include "bionics.h" +#include "effect.h" +#include "filesystem.h" +#include "game.h" +#include "get_version.h" +#include "item_factory.h" +#include "itype.h" +#include "kill_tracker.h" +#include "martialarts.h" +#include "messages.h" +#include "monstergenerator.h" +#include "mutation.h" +#include "overmapbuffer.h" +#include "profession.h" +#include "skill.h" +#include "stats_tracker.h" + +static const efftype_id effect_adrenaline( "adrenaline" ); +static const efftype_id effect_datura( "datura" ); +static const efftype_id effect_drunk( "drunk" ); +static const efftype_id effect_jetinjector( "jetinjector" ); + +static const trap_str_id tr_bubblewrap( "tr_bubblewrap" ); +static const trap_str_id tr_glass( "tr_glass" ); +static const trap_str_id tr_beartrap( "tr_beartrap" ); +static const trap_str_id tr_nailboard( "tr_nailboard" ); +static const trap_str_id tr_caltrops( "tr_caltrops" ); +static const trap_str_id tr_caltrops_glass( "tr_caltrops_glass" ); +static const trap_str_id tr_tripwire( "tr_tripwire" ); +static const trap_str_id tr_crossbow( "tr_crossbow" ); +static const trap_str_id tr_shotgun_2( "tr_shotgun_2" ); +static const trap_str_id tr_shotgun_1( "tr_shotgun_1" ); +static const trap_str_id tr_blade( "tr_blade" ); +static const trap_str_id tr_landmine( "tr_landmine" ); +static const trap_str_id tr_light_snare( "tr_light_snare" ); +static const trap_str_id tr_heavy_snare( "tr_heavy_snare" ); +static const trap_str_id tr_telepad( "tr_telepad" ); +static const trap_str_id tr_goo( "tr_goo" ); +static const trap_str_id tr_dissector( "tr_dissector" ); +static const trap_str_id tr_sinkhole( "tr_sinkhole" ); +static const trap_str_id tr_pit( "tr_pit" ); +static const trap_str_id tr_spike_pit( "tr_spike_pit" ); +static const trap_str_id tr_lava( "tr_lava" ); +static const trap_str_id tr_portal( "tr_portal" ); +static const trap_str_id tr_ledge( "tr_ledge" ); +static const trap_str_id tr_boobytrap( "tr_boobytrap" ); +static const trap_str_id tr_temple_flood( "tr_temple_flood" ); +static const trap_str_id tr_shadow( "tr_shadow" ); +static const trap_str_id tr_drain( "tr_drain" ); +static const trap_str_id tr_snake( "tr_snake" ); +static const trap_str_id tr_glass_pit( "tr_glass_pit" ); + +static const trait_id trait_CANNIBAL( "CANNIBAL" ); +static const trait_id trait_PSYCHOPATH( "PSYCHOPATH" ); +static const trait_id trait_SAPIOVORE( "SAPIOVORE" ); + +void memorial_logger::clear() +{ + log.clear(); +} + +/** + * Adds an event to the memorial log, to be written to the memorial file when + * the character dies. The message should contain only the informational string, + * as the timestamp and location will be automatically prepended. + */ +void memorial_logger::add( const std::string &male_msg, + const std::string &female_msg ) +{ + const std::string &msg = g->u.male ? male_msg : female_msg; + + if( msg.empty() ) { + return; + } + + const oter_id &cur_ter = overmap_buffer.ter( g->u.global_omt_location() ); + const std::string &location = cur_ter->get_name(); + + std::stringstream log_message; + log_message << "| " << to_string( calendar::turn ) << " | " << location << " | " << + msg; + + log.push_back( log_message.str() ); +} + +/** + * Loads the data in a memorial file from the given ifstream. All the memorial + * entry lines begin with a pipe (|). + * @param fin The ifstream to read the memorial entries from. + */ +void memorial_logger::load( std::istream &fin ) +{ + std::string entry; + log.clear(); + while( fin.peek() == '|' ) { + getline( fin, entry ); + // strip all \r from end of string + while( *entry.rbegin() == '\r' ) { + entry.pop_back(); + } + log.push_back( entry ); + } +} + +/** + * Concatenates all of the memorial log entries, delimiting them with newlines, + * and returns the resulting string. Used for saving and for writing out to the + * memorial file. + */ +std::string memorial_logger::dump() const +{ + static const char *eol = cata_files::eol(); + std::stringstream output; + + for( auto &elem : log ) { + output << elem << eol; + } + + return output.str(); +} + +void memorial_logger::write( std::ostream &file, const std::string &epitaph ) const +{ + avatar &u = g->u; + static const char *eol = cata_files::eol(); + + //Size of indents in the memorial file + const std::string indent = " "; + + const std::string pronoun = u.male ? _( "He" ) : _( "She" ); + + //Avoid saying "a male unemployed" or similar + std::string profession_name; + if( u.prof == profession::generic() ) { + if( u.male ) { + profession_name = _( "an unemployed male" ); + } else { + profession_name = _( "an unemployed female" ); + } + } else { + profession_name = string_format( _( "a %s" ), u.prof->gender_appropriate_name( u.male ) ); + } + + const std::string locdesc = overmap_buffer.get_description_at( u.global_sm_location() ); + //~ First parameter is a pronoun ("He"/"She"), second parameter is a description + //~ that designates the location relative to its surroundings. + const std::string kill_place = string_format( _( "%1$s was killed in a %2$s." ), + pronoun, locdesc ); + + //Header + file << string_format( _( "Cataclysm - Dark Days Ahead version %s memorial file" ), + getVersionString() ) << eol; + file << eol; + file << string_format( _( "In memory of: %s" ), u.name ) << eol; + if( epitaph.length() > 0 ) { //Don't record empty epitaphs + //~ The "%s" will be replaced by an epitaph as displayed in the memorial files. Replace the quotation marks as appropriate for your language. + file << string_format( pgettext( "epitaph", "\"%s\"" ), epitaph ) << eol << eol; + } + //~ First parameter: Pronoun, second parameter: a profession name (with article) + file << string_format( _( "%1$s was %2$s when the apocalypse began." ), + pronoun, profession_name ) << eol; + file << string_format( _( "%1$s died on %2$s." ), pronoun, + to_string( calendar::turn ) ) << eol; + file << kill_place << eol; + file << eol; + + //Misc + file << string_format( _( "Cash on hand: %s" ), format_money( u.cash ) ) << eol; + file << eol; + + //HP + + const auto limb_hp = + [&file, &indent, &u]( const std::string & desc, const hp_part bp ) { + file << indent << + string_format( desc, u.get_hp( bp ), u.get_hp_max( bp ) ) << eol; + }; + + file << _( "Final HP:" ) << eol; + limb_hp( _( " Head: %d/%d" ), hp_head ); + limb_hp( _( "Torso: %d/%d" ), hp_torso ); + limb_hp( _( "L Arm: %d/%d" ), hp_arm_l ); + limb_hp( _( "R Arm: %d/%d" ), hp_arm_r ); + limb_hp( _( "L Leg: %d/%d" ), hp_leg_l ); + limb_hp( _( "R Leg: %d/%d" ), hp_leg_r ); + file << eol; + + //Stats + file << _( "Final Stats:" ) << eol; + file << indent << string_format( _( "Str %d" ), u.str_cur ) + << indent << string_format( _( "Dex %d" ), u.dex_cur ) + << indent << string_format( _( "Int %d" ), u.int_cur ) + << indent << string_format( _( "Per %d" ), u.per_cur ) << eol; + file << _( "Base Stats:" ) << eol; + file << indent << string_format( _( "Str %d" ), u.str_max ) + << indent << string_format( _( "Dex %d" ), u.dex_max ) + << indent << string_format( _( "Int %d" ), u.int_max ) + << indent << string_format( _( "Per %d" ), u.per_max ) << eol; + file << eol; + + //Last 20 messages + file << _( "Final Messages:" ) << eol; + std::vector > recent_messages = + Messages::recent_messages( 20 ); + for( const std::pair &recent_message : recent_messages ) { + file << indent << recent_message.first << " " << recent_message.second; + file << eol; + } + file << eol; + + //Kill list + file << _( "Kills:" ) << eol; + + int total_kills = 0; + + std::map, int> kill_counts; + + // map to kill count + const kill_tracker &kills = g->get_kill_tracker(); + for( const mtype &type : MonsterGenerator::generator().get_all_mtypes() ) { + int this_count = kills.kill_count( type.id ); + if( this_count > 0 ) { + kill_counts[std::make_tuple( type.nname(), type.sym )] += this_count; + total_kills += this_count; + } + } + + for( const std::pair, int> &entry : kill_counts ) { + file << " " << std::get<1>( entry.first ) << " - " + << string_format( "%4d", entry.second ) << " " + << std::get<0>( entry.first ) << eol; + } + + if( total_kills == 0 ) { + file << indent << _( "No monsters were killed." ) << eol; + } else { + file << string_format( _( "Total kills: %d" ), total_kills ) << eol; + } + file << eol; + + //Skills + file << _( "Skills:" ) << eol; + for( const std::pair &pair : u.get_all_skills() ) { + const SkillLevel &lobj = pair.second; + //~ 1. skill name, 2. skill level, 3. exercise percentage to next level + file << indent << string_format( _( "%s: %d (%d %%)" ), pair.first->name(), lobj.level(), + lobj.exercise() ) << eol; + } + file << eol; + + //Traits + file << _( "Traits:" ) << eol; + for( const trait_id &mut : u.get_mutations() ) { + file << indent << mutation_branch::get_name( mut ) << eol; + } + if( u.get_mutations().empty() ) { + file << indent << _( "(None)" ) << eol; + } + file << eol; + + //Effects (illnesses) + file << _( "Ongoing Effects:" ) << eol; + bool had_effect = false; + if( u.get_perceived_pain() > 0 ) { + had_effect = true; + file << indent << _( "Pain" ) << " (" << u.get_perceived_pain() << ")"; + } + if( !had_effect ) { + file << indent << _( "(None)" ) << eol; + } + file << eol; + + //Bionics + file << _( "Bionics:" ) << eol; + for( const bionic_id bionic : u.get_bionics() ) { + file << indent << bionic->name << eol; + } + if( u.get_bionics().empty() ) { + file << indent << _( "No bionics were installed." ) << eol; + } + file << string_format( + _( "Bionic Power: %d/%d" ), + u.power_level, u.max_power_level ) << eol; + file << eol; + + //Equipment + file << _( "Weapon:" ) << eol; + file << indent << u.weapon.invlet << " - " << u.weapon.tname( 1, false ) << eol; + file << eol; + + file << _( "Equipment:" ) << eol; + for( const item &elem : u.worn ) { + item next_item = elem; + file << indent << next_item.invlet << " - " << next_item.tname( 1, false ); + if( next_item.charges > 0 ) { + file << " (" << next_item.charges << ")"; + } else if( next_item.contents.size() == 1 && next_item.contents.front().charges > 0 ) { + file << " (" << next_item.contents.front().charges << ")"; + } + file << eol; + } + file << eol; + + //Inventory + file << _( "Inventory:" ) << eol; + u.inv.restack( u ); + invslice slice = u.inv.slice(); + for( const std::list *elem : slice ) { + const item &next_item = elem->front(); + file << indent << next_item.invlet << " - " << + next_item.tname( static_cast( elem->size() ), false ); + if( elem->size() > 1 ) { + file << " [" << elem->size() << "]"; + } + if( next_item.charges > 0 ) { + file << " (" << next_item.charges << ")"; + } else if( next_item.contents.size() == 1 && next_item.contents.front().charges > 0 ) { + file << " (" << next_item.contents.front().charges << ")"; + } + file << eol; + } + file << eol; + + //Lifetime stats + file << _( "Lifetime Stats" ) << eol; + cata::event::data_type not_mounted = { { "mount", cata_variant( mtype_id() ) } }; + int moves = g->stats().count( event_type::avatar_moves, not_mounted ); + cata::event::data_type is_u = { { "character", cata_variant( u.getID() ) } }; + int damage_taken = g->stats().total( event_type::character_takes_damage, "damage", is_u ); + int damage_healed = g->stats().total( event_type::character_heals_damage, "damage", is_u ); + int headshots = g->stats().count( event_type::character_gets_headshot, is_u ); + + file << indent << string_format( _( "Distance walked: %d squares" ), moves ) << eol; + file << indent << string_format( _( "Damage taken: %d damage" ), damage_taken ) << eol; + file << indent << string_format( _( "Damage healed: %d damage" ), damage_healed ) << eol; + file << indent << string_format( _( "Headshots: %d" ), headshots ) << eol; + file << eol; + + //History + file << _( "Game History" ) << eol; + file << dump(); +} + +void memorial_logger::notify( const cata::event &e ) +{ + switch( e.type() ) { + case event_type::activates_artifact: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + std::string item_name = e.get( "item_name" ); + //~ %s is artifact name + add( pgettext( "memorial_male", "Activated the %s." ), + pgettext( "memorial_female", "Activated the %s." ), + item_name ); + } + break; + } + case event_type::activates_mininuke: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + add( pgettext( "memorial_male", "Activated a mininuke." ), + pgettext( "memorial_female", "Activated a mininuke." ) ); + } + break; + } + case event_type::administers_mutagen: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + mutagen_technique technique = e.get( "technique" ); + switch( technique ) { + case mutagen_technique::consumed_mutagen: + add( pgettext( "memorial_male", "Consumed mutagen." ), + pgettext( "memorial_female", "Consumed mutagen." ) ); + break; + case mutagen_technique::injected_mutagen: + add( pgettext( "memorial_male", "Injected mutagen." ), + pgettext( "memorial_female", "Injected mutagen." ) ); + break; + case mutagen_technique::consumed_purifier: + add( pgettext( "memorial_male", "Consumed purifier." ), + pgettext( "memorial_female", "Consumed purifier." ) ); + break; + case mutagen_technique::injected_purifier: + add( pgettext( "memorial_male", "Injected purifier." ), + pgettext( "memorial_female", "Injected purifier." ) ); + break; + case mutagen_technique::injected_smart_purifier: + add( pgettext( "memorial_male", "Injected smart purifier." ), + pgettext( "memorial_female", "Injected smart purifier." ) ); + break; + case mutagen_technique::num_mutagen_techniques: + break; + } + } + break; + } + case event_type::angers_amigara_horrors: { + add( pgettext( "memorial_male", "Angered a group of amigara horrors!" ), + pgettext( "memorial_female", "Angered a group of amigara horrors!" ) ); + break; + } + case event_type::awakes_dark_wyrms: { + add( pgettext( "memorial_male", "Awoke a group of dark wyrms!" ), + pgettext( "memorial_female", "Awoke a group of dark wyrms!" ) ); + break; + } + case event_type::becomes_wanted: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + add( pgettext( "memorial_male", "Became wanted by the police!" ), + pgettext( "memorial_female", "Became wanted by the police!" ) ); + } + break; + } + case event_type::broken_bone_mends: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + body_part part = e.get( "part" ); + //~ %s is bodypart + add( pgettext( "memorial_male", "Broken %s began to mend." ), + pgettext( "memorial_female", "Broken %s began to mend." ), + body_part_name( part ) ); + } + break; + } + case event_type::buries_corpse: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + const mtype &corpse_type = e.get( "corpse_type" ).obj(); + std::string corpse_name = e.get( "corpse_name" ); + if( corpse_name.empty() ) { + if( corpse_type.has_flag( MF_HUMAN ) ) { + add( pgettext( "memorial_male", + "You buried an unknown victim of the Cataclysm." ), + pgettext( "memorial_female", + "You buried an unknown victim of The Cataclysm." ) ); + } + } else { + add( pgettext( "memorial_male", "You buried %s." ), + pgettext( "memorial_female", "You buried %s." ), + corpse_name ); + } + } + break; + } + case event_type::causes_resonance_cascade: { + add( pgettext( "memorial_male", "Caused a resonance cascade." ), + pgettext( "memorial_female", "Caused a resonance cascade." ) ); + break; + } + case event_type::character_gains_effect: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + const effect_type &type = e.get( "effect" ).obj(); + const std::string message = type.get_apply_memorial_log(); + if( !message.empty() ) { + add( pgettext( "memorial_male", message.c_str() ), + pgettext( "memorial_female", message.c_str() ) ); + } + } + break; + } + case event_type::character_kills_character: { + character_id ch = e.get( "killer" ); + if( ch == g->u.getID() ) { + std::string name = e.get( "victim_name" ); + bool cannibal = g->u.has_trait( trait_CANNIBAL ); + bool psycho = g->u.has_trait( trait_PSYCHOPATH ); + if( g->u.has_trait( trait_SAPIOVORE ) ) { + add( pgettext( "memorial_male", + "Caught and killed an ape. Prey doesn't have a name." ), + pgettext( "memorial_female", + "Caught and killed an ape. Prey doesn't have a name." ) ); + } else if( psycho && cannibal ) { + add( pgettext( "memorial_male", + "Killed a delicious-looking innocent, %s, in cold blood." ), + pgettext( "memorial_female", + "Killed a delicious-looking innocent, %s, in cold blood." ), + name ); + } else if( psycho ) { + add( pgettext( "memorial_male", + "Killed an innocent, %s, in cold blood. They were weak." ), + pgettext( "memorial_female", + "Killed an innocent, %s, in cold blood. They were weak." ), + name ); + } else if( cannibal ) { + add( pgettext( "memorial_male", "Killed an innocent, %s." ), + pgettext( "memorial_female", "Killed an innocent, %s." ), + name ); + } else { + add( pgettext( "memorial_male", + "Killed an innocent person, %s, in cold blood and " + "felt terrible afterwards." ), + pgettext( "memorial_female", + "Killed an innocent person, %s, in cold blood and " + "felt terrible afterwards." ), + name ); + } + } + break; + } + case event_type::character_kills_monster: { + character_id ch = e.get( "killer" ); + if( ch == g->u.getID() ) { + mtype_id victim_type = e.get( "victim_type" ); + if( victim_type->difficulty >= 30 ) { + add( pgettext( "memorial_male", "Killed a %s." ), + pgettext( "memorial_female", "Killed a %s." ), + victim_type->nname() ); + } + } + break; + } + case event_type::character_loses_effect: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + const effect_type &type = e.get( "effect" ).obj(); + const std::string message = type.get_remove_memorial_log(); + if( !message.empty() ) { + add( pgettext( "memorial_male", message.c_str() ), + pgettext( "memorial_female", message.c_str() ) ); + } + } + break; + } + case event_type::character_triggers_trap: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + trap_str_id trap = e.get( "trap" ); + if( trap == tr_bubblewrap ) { + add( pgettext( "memorial_male", "Stepped on bubble wrap." ), + pgettext( "memorial_female", "Stepped on bubble wrap." ) ); + } else if( trap == tr_glass ) { + add( pgettext( "memorial_male", "Stepped on glass." ), + pgettext( "memorial_female", "Stepped on glass." ) ); + } else if( trap == tr_beartrap ) { + add( pgettext( "memorial_male", "Caught by a beartrap." ), + pgettext( "memorial_female", "Caught by a beartrap." ) ); + } else if( trap == tr_nailboard ) { + add( pgettext( "memorial_male", "Stepped on a spiked board." ), + pgettext( "memorial_female", "Stepped on a spiked board." ) ); + } else if( trap == tr_caltrops ) { + add( pgettext( "memorial_male", "Stepped on a caltrop." ), + pgettext( "memorial_female", "Stepped on a caltrop." ) ); + } else if( trap == tr_caltrops_glass ) { + add( pgettext( "memorial_male", "Stepped on a glass caltrop." ), + pgettext( "memorial_female", "Stepped on a glass caltrop." ) ); + } else if( trap == tr_tripwire ) { + add( pgettext( "memorial_male", "Tripped on a tripwire." ), + pgettext( "memorial_female", "Tripped on a tripwire." ) ); + } else if( trap == tr_crossbow ) { + add( pgettext( "memorial_male", "Triggered a crossbow trap." ), + pgettext( "memorial_female", "Triggered a crossbow trap." ) ); + } else if( trap == tr_shotgun_1 || trap == tr_shotgun_2 ) { + add( pgettext( "memorial_male", "Triggered a shotgun trap." ), + pgettext( "memorial_female", "Triggered a shotgun trap." ) ); + } else if( trap == tr_blade ) { + add( pgettext( "memorial_male", "Triggered a blade trap." ), + pgettext( "memorial_female", "Triggered a blade trap." ) ); + } else if( trap == tr_light_snare ) { + add( pgettext( "memorial_male", "Triggered a light snare." ), + pgettext( "memorial_female", "Triggered a light snare." ) ); + } else if( trap == tr_heavy_snare ) { + add( pgettext( "memorial_male", "Triggered a heavy snare." ), + pgettext( "memorial_female", "Triggered a heavy snare." ) ); + } else if( trap == tr_landmine ) { + add( pgettext( "memorial_male", "Stepped on a land mine." ), + pgettext( "memorial_female", "Stepped on a land mine." ) ); + } else if( trap == tr_boobytrap ) { + add( pgettext( "memorial_male", "Triggered a booby trap." ), + pgettext( "memorial_female", "Triggered a booby trap." ) ); + } else if( trap == tr_telepad || trap == tr_portal ) { + add( pgettext( "memorial_male", "Triggered a teleport trap." ), + pgettext( "memorial_female", "Triggered a teleport trap." ) ); + } else if( trap == tr_goo ) { + add( pgettext( "memorial_male", "Stepped into thick goo." ), + pgettext( "memorial_female", "Stepped into thick goo." ) ); + } else if( trap == tr_dissector ) { + add( pgettext( "memorial_male", "Stepped into a dissector." ), + pgettext( "memorial_female", "Stepped into a dissector." ) ); + } else if( trap == tr_pit ) { + add( pgettext( "memorial_male", "Fell in a pit." ), + pgettext( "memorial_female", "Fell in a pit." ) ); + } else if( trap == tr_spike_pit ) { + add( pgettext( "memorial_male", "Fell into a spiked pit." ), + pgettext( "memorial_female", "Fell into a spiked pit." ) ); + } else if( trap == tr_glass_pit ) { + add( pgettext( "memorial_male", "Fell into a pit filled with glass shards." ), + pgettext( "memorial_female", "Fell into a pit filled with glass shards." ) ); + } else if( trap == tr_lava ) { + add( pgettext( "memorial_male", "Stepped into lava." ), + pgettext( "memorial_female", "Stepped into lava." ) ); + } else if( trap == tr_sinkhole ) { + add( pgettext( "memorial_male", "Stepped into a sinkhole." ), + pgettext( "memorial_female", "Stepped into a sinkhole." ) ); + } else if( trap == tr_ledge ) { + add( pgettext( "memorial_male", "Fell down a ledge." ), + pgettext( "memorial_female", "Fell down a ledge." ) ); + } else if( trap == tr_temple_flood ) { + add( pgettext( "memorial_male", "Triggered a flood trap." ), + pgettext( "memorial_female", "Triggered a flood trap." ) ); + } else if( trap == tr_shadow ) { + add( pgettext( "memorial_male", "Triggered a shadow trap." ), + pgettext( "memorial_female", "Triggered a shadow trap." ) ); + } else if( trap == tr_drain ) { + add( pgettext( "memorial_male", "Triggered a life-draining trap." ), + pgettext( "memorial_female", "Triggered a life-draining trap." ) ); + } else if( trap == tr_snake ) { + add( pgettext( "memorial_male", "Triggered a shadow snake trap." ), + pgettext( "memorial_female", "Triggered a shadow snake trap." ) ); + } + } + break; + } + case event_type::consumes_marloss_item: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + const itype *it = item_controller->find_template( + e.get( "itype" ) ); + std::string itname = it->nname( 1 ); + add( pgettext( "memorial_male", "Consumed a %s." ), + pgettext( "memorial_female", "Consumed a %s." ), itname ); + } + break; + } + case event_type::crosses_marloss_threshold: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + add( pgettext( "memorial_male", "Opened the Marloss Gateway." ), + pgettext( "memorial_female", "Opened the Marloss Gateway." ) ); + } + break; + } + case event_type::crosses_mutation_threshold: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + std::string category_id = + e.get( "category" ); + const mutation_category_trait &category = + mutation_category_trait::get_category( category_id ); + add( category.memorial_message_male(), + category.memorial_message_female() ); + } + break; + } + case event_type::crosses_mycus_threshold: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + add( pgettext( "memorial_male", "Became one with the Mycus." ), + pgettext( "memorial_female", "Became one with the Mycus." ) ); + } + break; + } + case event_type::dermatik_eggs_hatch: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + add( pgettext( "memorial_male", "Dermatik eggs hatched." ), + pgettext( "memorial_female", "Dermatik eggs hatched." ) ); + } + break; + } + case event_type::dermatik_eggs_injected: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + add( pgettext( "memorial_male", "Injected with dermatik eggs." ), + pgettext( "memorial_female", "Injected with dermatik eggs." ) ); + } + break; + } + case event_type::destroys_triffid_grove: { + add( pgettext( "memorial_male", "Destroyed a triffid grove." ), + pgettext( "memorial_female", "Destroyed a triffid grove." ) ); + break; + } + case event_type::dies_from_asthma_attack: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + add( pgettext( "memorial_male", "Succumbed to an asthma attack." ), + pgettext( "memorial_female", "Succumbed to an asthma attack." ) ); + } + break; + } + case event_type::dies_from_drug_overdose: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + efftype_id effect = e.get( "effect" ); + if( effect == effect_datura ) { + add( pgettext( "memorial_male", "Died of datura overdose." ), + pgettext( "memorial_female", "Died of datura overdose." ) ); + } else if( effect == effect_jetinjector ) { + add( pgettext( "memorial_male", "Died of a healing stimulant overdose." ), + pgettext( "memorial_female", "Died of a healing stimulant overdose." ) ); + } else if( effect == effect_adrenaline ) { + add( pgettext( "memorial_male", "Died of adrenaline overdose." ), + pgettext( "memorial_female", "Died of adrenaline overdose." ) ); + } else if( effect == effect_drunk ) { + add( pgettext( "memorial_male", "Died of an alcohol overdose." ), + pgettext( "memorial_female", "Died of an alcohol overdose." ) ); + } else { + add( pgettext( "memorial_male", "Died of a drug overdose." ), + pgettext( "memorial_female", "Died of a drug overdose." ) ); + } + } + break; + } + case event_type::dies_of_infection: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + add( pgettext( "memorial_male", "Succumbed to the infection." ), + pgettext( "memorial_female", "Succumbed to the infection." ) ); + } + break; + } + case event_type::dies_of_starvation: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + add( pgettext( "memorial_male", "Died of starvation." ), + pgettext( "memorial_female", "Died of starvation." ) ); + } + break; + } + case event_type::dies_of_thirst: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + add( pgettext( "memorial_male", "Died of thirst." ), + pgettext( "memorial_female", "Died of thirst." ) ); + } + break; + } + case event_type::digs_into_lava: { + add( pgettext( "memorial_male", "Dug a shaft into lava." ), + pgettext( "memorial_female", "Dug a shaft into lava." ) ); + break; + } + case event_type::disarms_nuke: { + add( pgettext( "memorial_male", "Disarmed a nuclear missile." ), + pgettext( "memorial_female", "Disarmed a nuclear missile." ) ); + break; + } + case event_type::eats_sewage: { + add( pgettext( "memorial_male", "Ate a sewage sample." ), + pgettext( "memorial_female", "Ate a sewage sample." ) ); + break; + } + case event_type::evolves_mutation: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + trait_id from = e.get( "from_trait" ); + trait_id to = e.get( "to_trait" ); + add( pgettext( "memorial_male", "'%s' mutation turned into '%s'" ), + pgettext( "memorial_female", "'%s' mutation turned into '%s'" ), + from->name(), to->name() ); + } + break; + } + case event_type::exhumes_grave: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + add( pgettext( "memorial_male", "Exhumed a grave." ), + pgettext( "memorial_female", "Exhumed a grave." ) ); + } + break; + } + case event_type::fails_to_install_cbm: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + std::string cbm_name = e.get( "bionic" )->name.translated(); + add( pgettext( "memorial_male", "Failed install of bionic: %s." ), + pgettext( "memorial_female", "Failed install of bionic: %s." ), + cbm_name ); + } + break; + } + case event_type::fails_to_remove_cbm: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + std::string cbm_name = e.get( "bionic" )->name.translated(); + add( pgettext( "memorial_male", "Failed to remove bionic: %s." ), + pgettext( "memorial_female", "Failed to remove bionic: %s." ), + cbm_name ); + } + break; + } + case event_type::falls_asleep_from_exhaustion: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + add( pgettext( "memorial_male", "Succumbed to lack of sleep." ), + pgettext( "memorial_female", "Succumbed to lack of sleep." ) ); + } + break; + } + case event_type::fuel_tank_explodes: { + std::string name = e.get( "vehicle_name" ); + add( pgettext( "memorial_male", "The fuel tank of the %s exploded!" ), + pgettext( "memorial_female", "The fuel tank of the %s exploded!" ), + name ); + break; + } + case event_type::gains_addiction: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + add_type type = e.get( "add_type" ); + const std::string &type_name = addiction_type_name( type ); + //~ %s is addiction name + add( pgettext( "memorial_male", "Became addicted to %s." ), + pgettext( "memorial_female", "Became addicted to %s." ), + type_name ); + } + break; + } + case event_type::gains_mutation: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + trait_id trait = e.get( "trait" ); + add( pgettext( "memorial_male", "Gained the mutation '%s'." ), + pgettext( "memorial_female", "Gained the mutation '%s'." ), + trait->name() ); + } + break; + } + case event_type::gains_skill_level: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + skill_id skill = e.get( "skill" ); + int new_level = e.get( "new_level" ); + if( new_level % 4 == 0 ) { + //~ %d is skill level %s is skill name + add( pgettext( "memorial_male", + "Reached skill level %1$d in %2$s." ), + pgettext( "memorial_female", + "Reached skill level %1$d in %2$s." ), + new_level, skill->name() ); + } + } + break; + } + case event_type::game_over: { + bool suicide = e.get( "is_suicide" ); + std::string last_words = e.get( "last_words" ); + if( suicide ) { + add( pgettext( "memorial_male", "%s committed suicide." ), + pgettext( "memorial_female", "%s committed suicide." ), + g->u.name ); + } else { + add( pgettext( "memorial_male", "%s was killed." ), + pgettext( "memorial_female", "%s was killed." ), + g->u.name ); + } + if( !last_words.empty() ) { + add( pgettext( "memorial_male", "Last words: %s" ), + pgettext( "memorial_female", "Last words: %s" ), + last_words ); + } + break; + } + case event_type::game_start: { + add( //~ %s is player name + pgettext( "memorial_male", "%s began their journey into the Cataclysm." ), + pgettext( "memorial_female", "%s began their journey into the Cataclysm." ), + g->u.name ); + break; + } + case event_type::installs_cbm: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + std::string cbm_name = e.get( "bionic" )->name.translated(); + add( pgettext( "memorial_male", "Installed bionic: %s." ), + pgettext( "memorial_female", "Installed bionic: %s." ), + cbm_name ); + } + break; + } + case event_type::installs_faulty_cbm: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + std::string cbm_name = e.get( "bionic" )->name.translated(); + add( pgettext( "memorial_male", "Installed bad bionic: %s." ), + pgettext( "memorial_female", "Installed bad bionic: %s." ), + cbm_name ); + } + break; + } + case event_type::launches_nuke: { + oter_id oter = e.get( "target_terrain" ); + //~ %s is terrain name + add( pgettext( "memorial_male", "Launched a nuke at a %s." ), + pgettext( "memorial_female", "Launched a nuke at a %s." ), + oter->get_name() ); + break; + } + case event_type::learns_martial_art: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + matype_id mastyle = e.get( "martial_art" ); + //~ %s is martial art + add( pgettext( "memorial_male", "Learned %s." ), + pgettext( "memorial_female", "Learned %s." ), + mastyle->name ); + } + break; + } + case event_type::loses_addiction: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + add_type type = e.get( "add_type" ); + const std::string &type_name = addiction_type_name( type ); + //~ %s is addiction name + add( pgettext( "memorial_male", "Overcame addiction to %s." ), + pgettext( "memorial_female", "Overcame addiction to %s." ), + type_name ); + } + break; + } + case event_type::npc_becomes_hostile: { + std::string name = e.get( "npc_name" ); + add( pgettext( "memorial_male", "%s became hostile." ), + pgettext( "memorial_female", "%s became hostile." ), + name ); + break; + } + case event_type::opens_portal: { + add( pgettext( "memorial_male", "Opened a portal." ), + pgettext( "memorial_female", "Opened a portal." ) ); + break; + } + case event_type::opens_temple: { + add( pgettext( "memorial_male", "Opened a strange temple." ), + pgettext( "memorial_female", "Opened a strange temple." ) ); + break; + } + case event_type::releases_subspace_specimens: { + add( pgettext( "memorial_male", "Released subspace specimens." ), + pgettext( "memorial_female", "Released subspace specimens." ) ); + break; + } + case event_type::removes_cbm: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + std::string cbm_name = e.get( "bionic" )->name.translated(); + add( pgettext( "memorial_male", "Removed bionic: %s." ), + pgettext( "memorial_female", "Removed bionic: %s." ), + cbm_name ); + } + break; + } + case event_type::seals_hazardous_material_sarcophagus: { + add( pgettext( "memorial_male", "Sealed a Hazardous Material Sarcophagus." ), + pgettext( "memorial_female", "Sealed a Hazardous Material Sarcophagus." ) ); + break; + } + case event_type::telefrags_creature: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + std::string victim_name = e.get( "victim_name" ); + add( pgettext( "memorial_male", "Telefragged a %s." ), + pgettext( "memorial_female", "Telefragged a %s." ), + victim_name ); + } + break; + } + case event_type::teleglow_teleports: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + add( pgettext( "memorial_male", "Spontaneous teleport." ), + pgettext( "memorial_female", "Spontaneous teleport." ) ); + } + break; + } + case event_type::teleports_into_wall: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + std::string obstacle_name = e.get( "obstacle_name" ); + add( pgettext( "memorial_male", "Teleported into a %s." ), + pgettext( "memorial_female", "Teleported into a %s." ), + obstacle_name ); + } + break; + } + case event_type::terminates_subspace_specimens: { + add( pgettext( "memorial_male", "Terminated subspace specimens." ), + pgettext( "memorial_female", "Terminated subspace specimens." ) ); + break; + } + case event_type::throws_up: { + character_id ch = e.get( "character" ); + if( ch == g->u.getID() ) { + add( pgettext( "memorial_male", "Threw up." ), + pgettext( "memorial_female", "Threw up." ) ); + } + break; + } + case event_type::triggers_alarm: { + add( pgettext( "memorial_male", "Set off an alarm." ), + pgettext( "memorial_female", "Set off an alarm." ) ); + break; + } + // All the events for which we have no memorial log are here + case event_type::avatar_moves: + case event_type::character_gets_headshot: + case event_type::character_heals_damage: + case event_type::character_takes_damage: + break; + case event_type::num_event_types: { + debugmsg( "Invalid event type" ); + break; + } + + } +} diff --git a/src/memorial_logger.h b/src/memorial_logger.h new file mode 100644 index 0000000000000..64b43f267cb00 --- /dev/null +++ b/src/memorial_logger.h @@ -0,0 +1,45 @@ +#pragma once +#ifndef CATA_MEMORIAL_LOGGER_H +#define CATA_MEMORIAL_LOGGER_H + +#include +#include +#include + +#include "event_bus.h" + +class memorial_logger : public event_subscriber +{ + public: + void clear(); + + void add( const std::string &male_msg, + const std::string &female_msg ); + template + void add( const char *const male_msg, const char *const female_msg, Args &&... args ) { + return add( string_format( male_msg, args... ), + string_format( female_msg, args... ) ); + } + template + void add( const std::string &male_msg, const std::string &female_msg, + Args &&... args ) { + return add( string_format( male_msg, args... ), + string_format( female_msg, args... ) ); + } + + // Loads the memorial log from a file + void load( std::istream &fin ); + // Dumps all memorial events into a single newline-delimited string + // (this is the content of the temporary file used to preserve the log + // over saves, not the final memorial file). + std::string dump() const; + + // Prints out the final memorial file + void write( std::ostream &memorial_file, const std::string &epitaph ) const; + + void notify( const cata::event & ) override; + private: + std::vector log; +}; + +#endif // CATA_MEMORIAL_LOGGER_H diff --git a/src/mission.cpp b/src/mission.cpp index 9a701c4b4fd84..74db84ea3e7d2 100644 --- a/src/mission.cpp +++ b/src/mission.cpp @@ -57,7 +57,7 @@ mission mission_type::create( const character_id npc_id ) const std::string mission_type::tname() const { - return _( name ); + return name.translated(); } static std::unordered_map world_missions; @@ -519,7 +519,7 @@ time_point mission::get_deadline() const std::string mission::get_description() const { - return _( type->description ); + return type->description.translated(); } bool mission::has_target() const @@ -595,6 +595,16 @@ character_id mission::get_npc_id() const return npc_id; } +const std::vector> &mission::get_likely_rewards() const +{ + return type->likely_rewards; +} + +bool mission::has_generic_rewards() const +{ + return type->has_generic_rewards; +} + void mission::set_target( const tripoint &p ) { target = p; @@ -692,18 +702,6 @@ mission::mission() player_id = character_id(); } -mission_type::mission_type( mission_type_id ID, const std::string &NAME, mission_goal GOAL, int DIF, - int VAL, - bool URGENT, - std::function PLACE, - std::function START, - std::function END, - std::function FAIL ) : - id( ID ), name( NAME ), goal( GOAL ), difficulty( DIF ), value( VAL ), - urgent( URGENT ), place( PLACE ), start( START ), end( END ), fail( FAIL ) -{ -} - namespace io { template<> diff --git a/src/mission.h b/src/mission.h index 58d5ef97eec82..de6d3ebf9aacc 100644 --- a/src/mission.h +++ b/src/mission.h @@ -198,9 +198,9 @@ struct mission_type { bool was_loaded = false; private: // The untranslated name of the mission - std::string name = translate_marker( "Bugged mission type" ); + translation name = to_translation( "Bugged mission type" ); public: - std::string description = ""; + translation description; // The basic goal type mission_goal goal; // Difficulty; TODO: come up with a scale @@ -212,6 +212,11 @@ struct mission_type { time_duration deadline_high = 0_turns; // If true, the NPC will press this mission! bool urgent = false; + // If the mission has generic rewards, so that the completion dialogue knows whether to offer them. + bool has_generic_rewards = true; + + // A limited subset of the talk_effects on the mission + std::vector> likely_rewards; // Points of origin std::vector origins; @@ -240,12 +245,6 @@ struct mission_type { std::function goal_condition; mission_type() = default; - mission_type( mission_type_id ID, const std::string &NAME, mission_goal GOAL, int DIF, int VAL, - bool URGENT, - std::function PLACE, - std::function START, - std::function END, - std::function FAIL ); mission create( character_id npc_id ) const; @@ -363,6 +362,8 @@ class mission int get_id() const; const std::string &get_item_id() const; character_id get_npc_id() const; + const std::vector> &get_likely_rewards() const; + bool has_generic_rewards() const; /** * Whether the mission is assigned to a player character. If not, the mission is free and * can be assigned. diff --git a/src/mission_companion.cpp b/src/mission_companion.cpp index 708e05a3fc9cd..515f877b12203 100644 --- a/src/mission_companion.cpp +++ b/src/mission_companion.cpp @@ -81,6 +81,7 @@ const skill_id skill_swimming( "swimming" ); static const trait_id trait_NPC_CONSTRUCTION_LEV_1( "NPC_CONSTRUCTION_LEV_1" ); static const trait_id trait_NPC_CONSTRUCTION_LEV_2( "NPC_CONSTRUCTION_LEV_2" ); static const trait_id trait_NPC_MISSION_LEV_1( "NPC_MISSION_LEV_1" ); +const efftype_id effect_riding( "riding" ); struct comp_rank { int industry; @@ -669,7 +670,10 @@ npc_ptr talk_function::individual_mission( const tripoint &omt_pos, if( comp == nullptr ) { return comp; } - + // make sure, for now, that NPCs dismount their horse before going on a mission. + if( comp->has_effect( effect_riding ) ) { + comp->npc_dismount(); + } //Ensure we have someone to give equipment to before we lose it for( auto i : equipment ) { comp->companion_mission_inv.add_item( *i ); @@ -1547,10 +1551,10 @@ bool talk_function::force_on_force( const std::vector &defender, } else if( advantage > 0 ) { adv = ", defender advantage"; } + faction *yours = g->u.get_faction(); //Find out why your followers don't have your faction... popup( _( "Engagement between %d members of %s %s and %d %s%s!" ), defender.size(), - g->faction_manager_ptr->get( faction_id( "your_followers" ) )->name, def_desc, - monsters_fighting.size(), att_desc, adv ); + yours->name, def_desc, monsters_fighting.size(), att_desc, adv ); int defense = 0; int attack = 0; int att_init = 0; @@ -1575,12 +1579,10 @@ bool talk_function::force_on_force( const std::vector &defender, attack_random( remaining_mon, remaining_def ); if( defense == 0 || ( remaining_def.size() == 1 && remaining_def[0]->is_dead() ) ) { //Here too... - popup( _( "%s forces are destroyed!" ), - g->faction_manager_ptr->get( faction_id( "your_followers" ) )->name ); + popup( _( "%s forces are destroyed!" ), yours->name ); } else { //Again, no faction for your followers - popup( _( "%s forces retreat from combat!" ), - g->faction_manager_ptr->get( faction_id( "your_followers" ) )->name ); + popup( _( "%s forces retreat from combat!" ), yours->name ); } return false; } else if( attack * 3 < defense ) { @@ -1616,8 +1618,8 @@ void talk_function::force_on_force( const std::vector &defender, adv = ", defender advantage"; } popup( _( "Engagement between %d members of %s %s and %d members of %s %s%s!" ), - defender.size(), defender[0]->my_fac->name, def_desc, attacker.size(), - attacker[0]->my_fac->name, att_desc, adv ); + defender.size(), defender[0]->get_faction()->name, def_desc, attacker.size(), + attacker[0]->get_faction()->name, att_desc, adv ); int defense = 0; int attack = 0; int att_init = 0; @@ -1642,18 +1644,18 @@ void talk_function::force_on_force( const std::vector &defender, attack_random( remaining_att, remaining_def ); if( defense == 0 || ( remaining_def.size() == 1 && remaining_def[0]->hp_cur[hp_torso] == 0 ) ) { - popup( _( "%s forces are destroyed!" ), defender[0]->my_fac->name ); + popup( _( "%s forces are destroyed!" ), defender[0]->get_faction()->name ); } else { - popup( _( "%s forces retreat from combat!" ), defender[0]->my_fac->name ); + popup( _( "%s forces retreat from combat!" ), defender[0]->get_faction()->name ); } return; } else if( attack * 3 < defense ) { attack_random( remaining_def, remaining_att ); if( attack == 0 || ( remaining_att.size() == 1 && remaining_att[0]->hp_cur[hp_torso] == 0 ) ) { - popup( _( "%s forces are destroyed!" ), attacker[0]->my_fac->name ); + popup( _( "%s forces are destroyed!" ), attacker[0]->get_faction()->name ); } else { - popup( _( "%s forces retreat from combat!" ), attacker[0]->my_fac->name ); + popup( _( "%s forces retreat from combat!" ), attacker[0]->get_faction()->name ); } return; } else { diff --git a/src/mission_start.cpp b/src/mission_start.cpp index c542a5d2859b6..c8e0b109cd74f 100644 --- a/src/mission_start.cpp +++ b/src/mission_start.cpp @@ -508,8 +508,10 @@ void mission_start::ranch_nurse_8( mission *miss ) site = mission_util::target_om_ter_random( "ranch_camp_59", 1, miss, false, RANCH_SIZE ); bay.load( tripoint( site.x * 2, site.y * 2, site.z ), false ); bay.translate( t_dirtfloor, t_floor ); - bay.place_items( "cleaning", 75, point( 17, 0 ), point( 17, 2 ), true, 0 ); - bay.place_items( "surgery", 75, point( 15, 4 ), point( 18, 4 ), true, 0 ); + bay.place_items( "cleaning", 75, point( 17, 0 ), point( 17, 2 ), true, + calendar::start_of_cataclysm ); + bay.place_items( "surgery", 75, point( 15, 4 ), point( 18, 4 ), true, + calendar::start_of_cataclysm ); bay.save(); } @@ -565,7 +567,8 @@ void mission_start::ranch_scavenger_2( mission *miss ) site = mission_util::target_om_ter_random( "ranch_camp_49", 1, miss, false, RANCH_SIZE ); bay.load( tripoint( site.x * 2, site.y * 2, site.z ), false ); - bay.place_items( "mischw", 65, point( 12, 13 ), point( 13, 16 ), true, 0 ); + bay.place_items( "mischw", 65, point( 12, 13 ), point( 13, 16 ), true, + calendar::start_of_cataclysm ); bay.draw_square_ter( t_chaingate_l, point( 2, 22 ), point( 3, 22 ) ); bay.spawn_item( point( 7, 20 ), "30gal_drum" ); bay.save(); @@ -589,8 +592,8 @@ void mission_start::ranch_scavenger_3( mission *miss ) site = mission_util::target_om_ter_random( "ranch_camp_49", 1, miss, false, RANCH_SIZE ); bay.load( tripoint( site.x * 2, site.y * 2, site.z ), false ); - bay.place_items( "mischw", 65, point( 2, 10 ), point( 4, 10 ), true, 0 ); - bay.place_items( "mischw", 65, point( 2, 13 ), point( 4, 13 ), true, 0 ); + bay.place_items( "mischw", 65, point( 2, 10 ), point( 4, 10 ), true, calendar::start_of_cataclysm ); + bay.place_items( "mischw", 65, point( 2, 13 ), point( 4, 13 ), true, calendar::start_of_cataclysm ); bay.furn_set( point( 1, 15 ), f_fridge ); bay.spawn_item( point( 2, 15 ), "hdframe" ); bay.furn_set( point( 3, 15 ), f_washer ); diff --git a/src/mission_ui.cpp b/src/mission_ui.cpp index ee1a4e109cdb0..ee31dc18b2609 100644 --- a/src/mission_ui.cpp +++ b/src/mission_ui.cpp @@ -123,10 +123,21 @@ void game::list_missions() y += fold_and_print( w_missions, point( 31, y ), getmaxx( w_missions ) - 33, col, miss->name() + for_npc ); + auto format_tokenized_description = []( const std::string description, + const std::vector> rewards ) { + std::string formatted_description = description; + for( const auto &reward : rewards ) { + std::string token = ""; + formatted_description = string_replace( formatted_description, token, string_format( "%d", + reward.first ) ); + } + return formatted_description; + }; + y++; if( !miss->get_description().empty() ) { y += fold_and_print( w_missions, point( 31, y ), getmaxx( w_missions ) - 33, c_white, - miss->get_description() ); + format_tokenized_description( miss->get_description(), miss->get_likely_rewards() ) ); } if( miss->has_deadline() ) { const time_point deadline = miss->get_deadline(); @@ -157,11 +168,11 @@ void game::list_missions() } } else { static const std::map< tab_mode, std::string > nope = { - { tab_mode::TAB_ACTIVE, _( "You have no active missions!" ) }, - { tab_mode::TAB_COMPLETED, _( "You haven't completed any missions!" ) }, - { tab_mode::TAB_FAILED, _( "You haven't failed any missions!" ) } + { tab_mode::TAB_ACTIVE, translate_marker( "You have no active missions!" ) }, + { tab_mode::TAB_COMPLETED, translate_marker( "You haven't completed any missions!" ) }, + { tab_mode::TAB_FAILED, translate_marker( "You haven't failed any missions!" ) } }; - mvwprintz( w_missions, point( 31, 4 ), c_light_red, nope.at( tab ) ); + mvwprintz( w_missions, point( 31, 4 ), c_light_red, _( nope.at( tab ) ) ); } wrefresh( w_missions ); diff --git a/src/mission_util.cpp b/src/mission_util.cpp index 15485ba041745..418334b6a4a0c 100644 --- a/src/mission_util.cpp +++ b/src/mission_util.cpp @@ -14,6 +14,7 @@ #include "mapgen_functions.h" #include "messages.h" #include "npc.h" +#include "npctalk.h" #include "overmap.h" #include "overmapbuffer.h" #include "rng.h" @@ -527,5 +528,13 @@ bool mission_type::parse_funcs( JsonObject &jo, std::function mission_function( miss ); } }; + + for( talk_effect_fun_t &effect : talk_effects.effects ) { + auto rewards = effect.get_likely_rewards(); + if( !rewards.empty() ) { + likely_rewards.insert( likely_rewards.end(), rewards.begin(), rewards.end() ); + } + } + return true; } diff --git a/src/missiondef.cpp b/src/missiondef.cpp index 533f02a44a337..66b5676504c8e 100644 --- a/src/missiondef.cpp +++ b/src/missiondef.cpp @@ -272,6 +272,7 @@ void mission_type::load( JsonObject &jo, const std::string &src ) optional( jo, was_loaded, "remove_container", remove_container ); //intended for situations where closed and open container are different optional( jo, was_loaded, "empty_container", empty_container ); + optional( jo, was_loaded, "has_generic_rewards", has_generic_rewards, true ); goal = jo.get_enum_value( "goal" ); diff --git a/src/monattack.cpp b/src/monattack.cpp index 6a95f76bfa63b..a78ba5bab16d2 100644 --- a/src/monattack.cpp +++ b/src/monattack.cpp @@ -32,6 +32,7 @@ #include "map_iterator.h" #include "mapdata.h" #include "martialarts.h" +#include "memorial_logger.h" #include "messages.h" #include "mondefense.h" #include "monfaction.h" @@ -133,6 +134,7 @@ const efftype_id effect_fungus( "fungus" ); const efftype_id effect_glowing( "glowing" ); const efftype_id effect_got_checked( "got_checked" ); const efftype_id effect_grabbed( "grabbed" ); +const efftype_id effect_grabbing( "grabbing" ); const efftype_id effect_infected( "infected" ); const efftype_id effect_laserlocked( "laserlocked" ); const efftype_id effect_onfire( "onfire" ); @@ -595,9 +597,10 @@ bool mattack::acid_barf( monster *z ) if( dam > 0 ) { auto msg_type = target == &g->u ? m_bad : m_info; - //~ 1$s is monster name, 2$s bodypart in accusative target->add_msg_player_or_npc( msg_type, + //~ 1$s is monster name, 2$s bodypart in accusative _( "The %1$s barfs acid on your %2$s for %3$d damage!" ), + //~ 1$s is monster name, 2$s bodypart in accusative _( "The %1$s barfs acid on 's %2$s for %3$d damage!" ), z->name(), body_part_name_accusative( hit ), @@ -1137,16 +1140,6 @@ bool mattack::science( monster *const z ) // I said SCIENCE again! // acid attack behavior constexpr int att_acid_intensity = 3; - // flavor messages - static const std::array m_flavor = {{ - _( "The %s shudders, letting out an eery metallic whining noise!" ), - _( "The %s scratches its long legs along the floor, shooting sparks." ), - _( "The %s bleeps inquiringly and focuses a red camera-eye on you." ), - _( "The %s's combat arms crackle with electricity." ), - //special case; leave the electricity last - } - }; - if( !z->can_act() ) { return false; } @@ -1286,6 +1279,16 @@ bool mattack::science( monster *const z ) // I said SCIENCE again! break; case att_flavor : { + // flavor messages + static const std::array m_flavor = {{ + translate_marker( "The %s shudders, letting out an eery metallic whining noise!" ), + translate_marker( "The %s scratches its long legs along the floor, shooting sparks." ), + translate_marker( "The %s bleeps inquiringly and focuses a red camera-eye on you." ), + translate_marker( "The %s's combat arms crackle with electricity." ), + //special case; leave the electricity last + } + }; + const size_t i = get_random_index( m_flavor ); // the special case; see above @@ -1295,7 +1298,7 @@ bool mattack::science( monster *const z ) // I said SCIENCE again! // if the player can see it, else forget about it if( g->u.sees( *z ) ) { - add_msg( m_warning, m_flavor[i], z->name() ); + add_msg( m_warning, _( m_flavor[i] ), z->name() ); } } break; @@ -1365,9 +1368,10 @@ bool mattack::growplants( monster *z ) } const body_part hit = body_part_hit_by_plant(); - //~ %s is bodypart name in accusative. critter->add_msg_player_or_npc( m_bad, + //~ %s is bodypart name in accusative. _( "A tree bursts forth from the earth and pierces your %s!" ), + //~ %s is bodypart name in accusative. _( "A tree bursts forth from the earth and pierces 's %s!" ), body_part_name_accusative( hit ) ); critter->deal_damage( z, hit, damage_instance( DT_STAB, rng( 10, 30 ) ) ); @@ -1399,9 +1403,10 @@ bool mattack::growplants( monster *z ) g->m.ter_set( p, t_tree_young ); if( critter != nullptr && !critter->uncanny_dodge() ) { const body_part hit = body_part_hit_by_plant(); - //~ %s is bodypart name in accusative. critter->add_msg_player_or_npc( m_bad, + //~ %s is bodypart name in accusative. _( "The underbrush beneath your feet grows and pierces your %s!" ), + //~ %s is bodypart name in accusative. _( "Underbrush grows into a tree, and it pierces 's %s!" ), body_part_name_accusative( hit ) ); critter->deal_damage( z, hit, damage_instance( DT_STAB, rng( 10, 30 ) ) ); @@ -1901,12 +1906,13 @@ bool mattack::fungus_fortify( monster *z ) g->u.set_mutation( trait_THRESH_MARLOSS ); g->m.ter_set( g->u.pos(), t_marloss ); // We only show you the door. You walk through it on your own. - g->u.add_memorial_log( pgettext( "memorial_male", "Was shown to the Marloss Gateway." ), - pgettext( "memorial_female", "Was shown to the Marloss Gateway." ) ); + g->memorial().add( + pgettext( "memorial_male", "Was shown to the Marloss Gateway." ), + pgettext( "memorial_female", "Was shown to the Marloss Gateway." ) ); g->u.add_msg_if_player( m_good, _( "You wake up in a marloss bush. Almost *cradled* in it, actually, as though it grew there for you." ) ); - //~ Beginning to hear the Mycus while conscious: this is it speaking g->u.add_msg_if_player( m_good, + //~ Beginning to hear the Mycus while conscious: this is it speaking _( "assistance, on an arduous quest. unity. together we have reached the door. now to pass through..." ) ); return true; } else { @@ -2031,9 +2037,10 @@ bool mattack::impale( monster *z ) .5 ) ).total_damage(); if( dam > 0 ) { auto msg_type = target == &g->u ? m_bad : m_info; - //~ 1$s is monster name, 2$s bodypart in accusative target->add_msg_player_or_npc( msg_type, + //~ 1$s is monster name, 2$s bodypart in accusative _( "The %1$s impales your torso!" ), + //~ 1$s is monster name, 2$s bodypart in accusative _( "The %1$s impales 's torso!" ), z->name() ); @@ -2133,8 +2140,7 @@ bool mattack::dermatik( monster *z ) body_part_name_accusative( targeted ) ); if( !foe->has_trait( trait_PARAIMMUNE ) || !foe->has_trait( trait_ACIDBLOOD ) ) { foe->add_effect( effect_dermatik, 1_turns, targeted, true ); - foe->add_memorial_log( pgettext( "memorial_male", "Injected with dermatik eggs." ), - pgettext( "memorial_female", "Injected with dermatik eggs." ) ); + g->events().send( foe->getID() ); } return true; @@ -2500,7 +2506,8 @@ bool mattack::ranged_pull( monster *z ) { Creature *target = z->attack_target(); if( target == nullptr || rl_dist( z->pos(), target->pos() ) > 3 || - rl_dist( z->pos(), target->pos() ) <= 1 || !z->sees( *target ) ) { + rl_dist( z->pos(), target->pos() ) <= 1 || !z->sees( *target ) || + z->has_effect( effect_grabbing ) ) { return false; } @@ -2578,9 +2585,9 @@ bool mattack::ranged_pull( monster *z ) } const int prev_effect = target->get_effect_int( effect_grabbed ); - target->add_effect( effect_grabbed, 2_turns, bp_torso, false, - prev_effect + 4 ); //Duration needs to be at least 2, or grab will immediately be removed - + //Duration needs to be at least 2, or grab will immediately be removed + target->add_effect( effect_grabbed, 2_turns, bp_torso, false, prev_effect + 4 ); + z->add_effect( effect_grabbing, 2_turns ); return true; } @@ -2639,6 +2646,7 @@ bool mattack::grab( monster *z ) } const int prev_effect = target->get_effect_int( effect_grabbed ); + z->add_effect( effect_grabbing, 2_turns ); target->add_effect( effect_grabbed, 2_turns, bp_torso, false, prev_effect + z->get_grab_strength() ); target->add_msg_player_or_npc( m_bad, _( "The %s grabs you!" ), _( "The %s grabs !" ), @@ -2700,6 +2708,7 @@ bool mattack::grab_drag( monster *z ) _( " resist the %s as it tries to drag them!" ), z->name() ); } int prev_effect = target->get_effect_int( effect_grabbed ); + z->add_effect( effect_grabbing, 2_turns ); target->add_effect( effect_grabbed, 2_turns, bp_torso, false, prev_effect + 3 ); return true; // cooldown was not reset prior to refactor here @@ -3202,10 +3211,11 @@ void mattack::frag( monster *z, Creature *target ) // This is for the bots, not if( target == &g->u ) { if( !z->has_effect( effect_targeted ) ) { - //~Potential grenading detected. if( g->u.has_trait( trait_id( "PROF_CHURL" ) ) ) { + //~ Potential grenading detected. add_msg( m_warning, _( "Thee eye o dat divil be upon me!" ) ); } else { + //~ Potential grenading detected. add_msg( m_warning, _( "Those laser dots don't seem very friendly..." ) ); } g->u.add_effect( effect_laserlocked, @@ -3597,8 +3607,7 @@ bool mattack::copbot( monster *z ) _( "a robotic voice boom, \"Citizen, Halt!\"" ), false, "speech", z->type->id.str() ); } else if( !cuffed ) { sounds::sound( z->pos(), 18, sounds::sound_t::alert, - _( "a robotic voice boom, \"\ -Please put down your weapon.\"" ), false, "speech", z->type->id.str() ); + _( "a robotic voice boom, \"Please put down your weapon.\"" ), false, "speech", z->type->id.str() ); } } else { sounds::sound( z->pos(), 18, sounds::sound_t::alert, @@ -3958,9 +3967,10 @@ bool mattack::stretch_bite( monster *z ) if( dam > 0 ) { auto msg_type = target == &g->u ? m_bad : m_info; - //~ 1$s is monster name, 2$s bodypart in accusative target->add_msg_player_or_npc( msg_type, + //~ 1$s is monster name, 2$s bodypart in accusative _( "The %1$s's teeth sink into your %2$s!" ), + //~ 1$s is monster name, 2$s bodypart in accusative _( "The %1$s's teeth sink into 's %2$s!" ), z->name(), body_part_name_accusative( hit ) ); @@ -4051,12 +4061,12 @@ bool mattack::flesh_golem( monster *z ) body_part hit = target->get_random_body_part(); // TODO: 10 bashing damage doesn't sound like a "massive claw" but a mediocre punch int dam = rng( 5, 10 ); - //~ 1$s is bodypart name, 2$d is damage value. target->deal_damage( z, hit, damage_instance( DT_BASH, dam ) ); if( one_in( 6 ) ) { target->add_effect( effect_downed, 3_minutes ); } + //~ 1$s is bodypart name, 2$d is damage value. target->add_msg_if_player( m_bad, _( "Your %1$s is battered for %2$d damage!" ), body_part_name( hit ), dam ); target->on_hit( z, hit, z->type->melee_skill ); @@ -4238,9 +4248,10 @@ bool mattack::longswipe( monster *z ) dam = target->deal_damage( z, hit, damage_instance( DT_CUT, dam ) ).total_damage(); if( dam > 0 ) { auto msg_type = target == &g->u ? m_bad : m_warning; - //~ 1$s is bodypart name, 2$d is damage value. target->add_msg_player_or_npc( msg_type, + //~ 1$s is bodypart name, 2$d is damage value. _( "The %1$s thrusts a claw at your %2$s, slashing it for %3$d damage!" ), + //~ 1$s is bodypart name, 2$d is damage value. _( "The %1$s thrusts a claw at 's %2$s, slashing it for %3$d damage!" ), z->name(), body_part_name( hit ), dam ); } else { @@ -4391,18 +4402,21 @@ bool mattack::slimespring( monster *z ) // This morale buff effect could get spammy if( g->u.get_morale_level() <= 1 ) { - switch( rng( 1, 3 ) ) { //~ Your slimes try to cheer you up! + switch( rng( 1, 3 ) ) { case 1: + //~ Your slimes try to cheer you up! //~ Lowercase is intended: they're small voices. add_msg( m_good, _( "\"hey, it's gonna be all right!\"" ) ); g->u.add_morale( MORALE_SUPPORT, 10, 50 ); break; case 2: + //~ Your slimes try to cheer you up! //~ Lowercase is intended: they're small voices. add_msg( m_good, _( "\"we'll get through this!\"" ) ); g->u.add_morale( MORALE_SUPPORT, 10, 50 ); break; case 3: + //~ Your slimes try to cheer you up! //~ Lowercase is intended: they're small voices. add_msg( m_good, _( "\"i'm here for you!\"" ) ); g->u.add_morale( MORALE_SUPPORT, 10, 50 ); @@ -5196,9 +5210,10 @@ bool mattack::stretch_attack( monster *z ) if( dam > 0 ) { auto msg_type = target == &g->u ? m_bad : m_info; - //~ 1$s is monster name, 2$s bodypart in accusative target->add_msg_player_or_npc( msg_type, + //~ 1$s is monster name, 2$s bodypart in accusative _( "The %1$s's arm pierces your %2$s!" ), + //~ 1$s is monster name, 2$s bodypart in accusative _( "The %1$s arm pierces 's %2$s!" ), z->name(), body_part_name_accusative( hit ) ); diff --git a/src/mondeath.cpp b/src/mondeath.cpp index 6757837aff8d6..0626aff7716b7 100644 --- a/src/mondeath.cpp +++ b/src/mondeath.cpp @@ -197,8 +197,9 @@ void mdeath::splatter( monster &z ) // 1% of the weight of the monster is the base, with overflow damage as a multiplier int gibbed_weight = rng( 0, round( to_gram( z.get_weight() ) / 100.0 * ( overflow_damage / max_hp + 1 ) ) ); + const int z_weight = to_gram( z.get_weight() ); // limit gibbing to 15% - gibbed_weight = std::min( gibbed_weight, to_gram( z.get_weight() ) * 15 / 100 ); + gibbed_weight = std::min( gibbed_weight, z_weight * 15 / 100 ); if( pulverized && gibbable ) { float overflow_ratio = overflow_damage / max_hp + 1; @@ -738,8 +739,8 @@ void mdeath::jabberwock( monster &z ) if( vorpal && !ch->weapon.has_technique( matec_id( "VORPAL" ) ) ) { if( ch->sees( z ) ) { - //~ %s is the possessive form of the monster's name ch->add_msg_if_player( m_info, + //~ %s is the possessive form of the monster's name _( "As the flames in %s eyes die out, your weapon seems to shine slightly brighter." ), z.disp_name( true ) ); } @@ -814,8 +815,8 @@ void mdeath::detonate( monster &z ) if( g->u.sees( z ) ) { if( dets.empty() ) { - //~ %s is the possessive form of the monster's name add_msg( m_info, + //~ %s is the possessive form of the monster's name _( "The %s's hands fly to its pockets, but there's nothing left in them." ), z.name() ); } else { diff --git a/src/monexamine.cpp b/src/monexamine.cpp index 087d85cbe3630..624cf373d9c7a 100644 --- a/src/monexamine.cpp +++ b/src/monexamine.cpp @@ -21,6 +21,7 @@ #include "messages.h" #include "monster.h" #include "mtype.h" +#include "npc.h" #include "output.h" #include "string_input_popup.h" #include "translations.h" @@ -135,9 +136,7 @@ bool monexamine::pet_menu( monster &z ) amenu.addentry( remove_saddle, false, 'h', _( "You don't know how to saddle %s" ), pet_name ); } if( !z.has_flag( MF_RIDEABLE_MECH ) ) { - if( z.has_flag( MF_PET_MOUNTABLE ) && ( ( z.has_effect( effect_saddled ) && - g->u.get_skill_level( skill_survival ) >= 1 ) || g->u.get_skill_level( skill_survival ) >= 4 ) && - z.get_size() >= ( g->u.get_size() + 1 ) && g->u.get_weight() <= z.get_weight() / 5 ) { + if( z.has_flag( MF_PET_MOUNTABLE ) && g->u.can_mount( z ) ) { amenu.addentry( mount, true, 'r', _( "Mount %s" ), pet_name ); } else if( !z.has_flag( MF_PET_MOUNTABLE ) ) { amenu.addentry( mount, false, 'r', _( "%s cannot be mounted" ), pet_name ); @@ -326,48 +325,24 @@ void monexamine::attach_or_remove_saddle( monster &z ) } } -void monexamine::mount_pet( monster &z ) +bool player::can_mount( const monster &critter ) const { - g->u.add_effect( effect_riding, 1_turns, num_bp, true ); - z.add_effect( effect_ridden, 1_turns, num_bp, true ); - if( z.has_effect( effect_tied ) ) { - z.remove_effect( effect_tied ); - if( z.tied_item ) { - g->u.i_add( *z.tied_item ); - z.tied_item = cata::nullopt; - } - } - if( z.has_effect( effect_harnessed ) ) { - z.remove_effect( effect_harnessed ); - add_msg( m_info, _( "You remove the %s's harness." ), z.get_name() ); - } - tripoint pnt = z.pos(); - auto mons = g->critter_tracker->find( pnt ); - if( mons == nullptr ) { - add_msg( m_debug, "mount_pet() : monster not found in critter_tracker" ); - return; - } - g->u.mounted_creature = mons; - if( g->u.is_hauling() ) { - g->u.stop_hauling(); - } - if( g->u.get_grab_type() != OBJECT_NONE ) { - add_msg( m_warning, _( "You let go of the grabbed object." ) ); - g->u.grab( OBJECT_NONE ); - } - g->place_player( pnt ); - z.facing = g->u.facing; - add_msg( m_good, _( "You climb on the %s." ), z.get_name() ); - if( z.has_flag( MF_RIDEABLE_MECH ) ) { - if( !z.type->mech_weapon.empty() ) { - item mechwep = item( z.type->mech_weapon ); - g->u.wield( mechwep ); - } - add_msg( m_good, _( "You hear your %s whir to life." ), z.get_name() ); + const auto &avoid = get_path_avoid(); + auto route = g->m.route( pos(), critter.pos(), get_pathfinding_settings(), avoid ); + + if( route.empty() ) { + return false; } - // some rideable mechs have night-vision - g->u.recalc_sight_limits(); - g->u.mod_moves( -100 ); + return ( critter.has_flag( MF_PET_MOUNTABLE ) && critter.friendly == -1 && + !critter.has_effect( effect_controlled ) && !critter.has_effect( effect_ridden ) ) && + ( ( critter.has_effect( effect_saddled ) && get_skill_level( skill_survival ) >= 1 ) || + get_skill_level( skill_survival ) >= 4 ) && ( critter.get_size() >= ( get_size() + 1 ) && + get_weight() <= critter.get_weight() / 5 ); +} + +void monexamine::mount_pet( monster &z ) +{ + g->u.mount_creature( z ); } void monexamine::swap( monster &z ) diff --git a/src/monmove.cpp b/src/monmove.cpp index b71c0145dd455..b79ea572cce67 100644 --- a/src/monmove.cpp +++ b/src/monmove.cpp @@ -268,8 +268,9 @@ void monster::plan() // Bots are more intelligent than most living stuff bool smart_planning = has_flag( MF_PRIORITIZE_TARGETS ); Creature *target = nullptr; + int max_sight_range = std::max( type->vision_day, type->vision_night ); // 8.6f is rating for tank drone 60 tiles away, moose 16 or boomer 33 - float dist = !smart_planning ? 1000 : 8.6f; + float dist = !smart_planning ? max_sight_range : 8.6f; bool fleeing = false; bool docile = friendly != 0 && has_effect( effect_docile ); @@ -535,6 +536,23 @@ static float get_stagger_adjust( const tripoint &source, const tripoint &destina return std::max( 0.01f, initial_dist - new_dist ); } +bool monster::die_if_drowning( const tripoint &at_pos, const int chance ) +{ + if( g->m.has_flag( "LIQUID", at_pos ) && can_drown() && one_in( chance ) ) { + // if there's a vehicle here with a boardable part, the monster is on it + // and not drowning + if( g->m.veh_at( at_pos ).part_with_feature( "BOARDABLE", false ) ) { + return false; + } + die( nullptr ); + if( g->u.sees( at_pos ) ) { + add_msg( _( "The %s drowns!" ), name() ); + } + return true; + } + return false; +} + // General movement. // Currently, priority goes: // 1) Special Attack @@ -638,11 +656,7 @@ void monster::move() // The monster is in a deep water tile and has a chance to drown if( g->m.has_flag_ter( TFLAG_DEEP_WATER, pos() ) ) { - if( g->m.has_flag( "LIQUID", pos() ) && can_drown() && one_in( 10 ) ) { - die( nullptr ); - if( g->u.sees( pos() ) ) { - add_msg( _( "The %s drowns!" ), name() ); - } + if( die_if_drowning( pos(), 10 ) ) { return; } } @@ -866,7 +880,7 @@ void monster::move() // since the chance of switching is 1/1, 1/4, 1/6, 1/8 switch_chance += progress * 2; // Randomly pick one of the viable squares to move to weighted by distance. - if( !moved || x_in_y( progress, switch_chance ) ) { + if( progress > 0 && ( !moved || x_in_y( progress, switch_chance ) ) ) { moved = true; next_step = candidate; // If we stumble, pick a random square, otherwise take the first one, @@ -1395,15 +1409,16 @@ bool monster::move_to( const tripoint &p, bool force, const float stagger_adjust //Hallucinations don't do any of the stuff after this point return true; } - // TODO: Make tanks stop taking damage from rubble, because it's just silly + if( type->size != MS_TINY && on_ground ) { - if( g->m.has_flag( "SHARP", pos() ) && !one_in( 4 ) ) { - apply_damage( nullptr, bp_torso, rng( 1, 10 ) ); + const int sharp_damage = rng( 1, 10 ); + const int rough_damage = rng( 1, 2 ); + if( g->m.has_flag( "SHARP", pos() ) && !one_in( 4 ) && get_armor_cut( bp_torso ) < sharp_damage ) { + apply_damage( nullptr, bp_torso, sharp_damage ); } - if( g->m.has_flag( "ROUGH", pos() ) && one_in( 6 ) ) { - apply_damage( nullptr, bp_torso, rng( 1, 2 ) ); + if( g->m.has_flag( "ROUGH", pos() ) && one_in( 6 ) && get_armor_cut( bp_torso ) < rough_damage ) { + apply_damage( nullptr, bp_torso, rough_damage ); } - } if( g->m.has_flag( "UNSTABLE", p ) && on_ground ) { @@ -1473,11 +1488,19 @@ bool monster::move_to( const tripoint &p, bool force, const float stagger_adjust if( has_flag( MF_DRIPS_NAPALM ) ) { if( one_in( 10 ) ) { - g->m.add_item_or_charges( pos(), item( "napalm" ) ); + // if it has more napalm, drop some and reduce ammo in tank + if( ammo["pressurized_tank"] > 0 ) { + g->m.add_item_or_charges( pos(), item( "napalm", calendar::turn, 50 ) ); + ammo["pressurized_tank"] -= 50; + } else { + // TODO remove MF_DRIPS_NAPALM flag since no more napalm in tank + // Not possible for now since flag check is done on type, not individual monster + } } } if( has_flag( MF_DRIPS_GASOLINE ) ) { if( one_in( 5 ) ) { + // TODO use same idea that limits napalm dripping g->m.add_item_or_charges( pos(), item( "gasoline" ) ); } } @@ -1713,13 +1736,9 @@ void monster::knock_back_to( const tripoint &to ) // If we're still in the function at this point, we're actually moving a tile! if( g->m.has_flag_ter( TFLAG_DEEP_WATER, to ) ) { - if( g->m.has_flag( "LIQUID", to ) && can_drown() ) { - die( nullptr ); - if( u_see ) { - add_msg( _( "The %s drowns!" ), name() ); - } - - } else if( has_flag( MF_AQUATIC ) ) { // We swim but we're NOT in water + // die_if_drowning will kill the monster if necessary, but if the deep water + // tile is on a vehicle, we should check for swimmers out of water + if( !die_if_drowning( to ) && has_flag( MF_AQUATIC ) ) { die( nullptr ); if( u_see ) { add_msg( _( "The %s flops around and dies!" ), name() ); @@ -1859,8 +1878,8 @@ void monster::shove_vehicle( const tripoint &remote_destination, break; } if( shove_velocity > 0 ) { - //~ %1$s - monster name, %2$s - vehicle name if( g->u.sees( this->pos() ) ) { + //~ %1$s - monster name, %2$s - vehicle name g->u.add_msg_if_player( m_bad, _( "%1$s shoves %2$s out of their way!" ), this->disp_name(), veh.disp_name() ); } diff --git a/src/monster.cpp b/src/monster.cpp index 583a28eda2930..01d6a9c22ed98 100644 --- a/src/monster.cpp +++ b/src/monster.cpp @@ -137,6 +137,7 @@ const efftype_id effect_docile( "docile" ); const efftype_id effect_downed( "downed" ); const efftype_id effect_emp( "emp" ); const efftype_id effect_grabbed( "grabbed" ); +const efftype_id effect_grabbing( "grabbing" ); const efftype_id effect_harnessed( "harnessed" ); const efftype_id effect_heavysnare( "heavysnare" ); const efftype_id effect_hit_by_player( "hit_by_player" ); @@ -265,9 +266,9 @@ void monster::setpos( const tripoint &p ) bool wandering = wander(); g->update_zombie_pos( *this, p ); position = p; - if( has_effect( effect_ridden ) && position != g->u.pos() ) { + if( has_effect( effect_ridden ) && mounted_player && mounted_player->pos() != pos() ) { add_msg( m_debug, "Ridden monster %s moved independently and dumped player", get_name() ); - g->u.forced_dismount(); + mounted_player->forced_dismount(); } if( wandering ) { unset_dest(); @@ -605,6 +606,10 @@ int monster::print_info( const catacurses::window &w, int vStart, int vLines, in wprintz( w, c_light_gray, _( " Difficulty " ) + to_string( type->difficulty ) ); } + if( sees( g->u ) ) { + mvwprintz( w, point( column, ++vStart ), c_yellow, _( "Aware of your presence!" ) ); + } + std::string effects = get_effect_status(); size_t used_space = att.first.length() + name().length() + 3; trim_and_print( w, point( used_space, vStart++ ), getmaxx( w ) - used_space - 2, @@ -612,6 +617,9 @@ int monster::print_info( const catacurses::window &w, int vStart, int vLines, in const auto hp_desc = hp_description( hp, type->hp ); mvwprintz( w, point( column, vStart++ ), hp_desc.second, hp_desc.first ); + if( has_effect( effect_ridden ) && mounted_player ) { + mvwprintz( w, point( column, vStart++ ), c_white, _( "Rider: %s" ), mounted_player->disp_name() ); + } std::vector lines = foldstring( type->get_description(), getmaxx( w ) - 1 - column ); int numlines = lines.size(); @@ -782,7 +790,7 @@ bool monster::has_flag( const m_flag f ) const bool monster::can_see() const { - return has_flag( MF_SEES ) && !has_effect( effect_blind ); + return has_flag( MF_SEES ) && !effect_cache[VISION_IMPAIRED]; } bool monster::can_hear() const @@ -817,14 +825,19 @@ bool monster::can_act() const int monster::sight_range( const int light_level ) const { // Non-aquatic monsters can't see much when submerged - if( !can_see() || has_effect( effect_no_sight ) || + if( !can_see() || effect_cache[VISION_IMPAIRED] || ( underwater && !has_flag( MF_SWIMS ) && !has_flag( MF_AQUATIC ) && !digging() ) ) { return 1; } - - int range = light_level * type->vision_day + ( default_daylight_level() - light_level ) * + static const int default_daylight = default_daylight_level(); + if( light_level == 0 ) { + return type->vision_night; + } else if( light_level == default_daylight ) { + return type->vision_day; + } + int range = light_level * type->vision_day + ( default_daylight - light_level ) * type->vision_night; - range /= default_daylight_level(); + range /= default_daylight; return range; } @@ -1281,10 +1294,10 @@ void monster::melee_attack( Creature &target, float accuracy ) // Hallucinations always produce messages but never actually deal damage if( u_see_me ) { if( target.is_player() ) { - //~ 1$s is attacker name, 2$s is bodypart name in accusative. sfx::play_variant_sound( "melee_attack", "monster_melee_hit", sfx::get_heard_volume( target.pos() ) ); sfx::do_player_death_hurt( dynamic_cast( target ), false ); + //~ 1$s is attacker name, 2$s is bodypart name in accusative. add_msg( m_bad, _( "The %1$s hits your %2$s." ), name(), body_part_name_accusative( bp_hit ) ); } else if( target.is_npc() ) { @@ -1964,7 +1977,15 @@ void monster::process_turn() local_attack_data.cooldown--; } } - + // Persist grabs as long as there's an adjacent target. + if( has_effect( effect_grabbing ) ) { + for( auto &dest : g->m.points_in_radius( pos(), 1, 0 ) ) { + const player *const p = g->critter_at( dest ); + if( p && p->has_effect( effect_grabbed ) ) { + add_effect( effect_grabbing, 2_turns ); + } + } + } // We update electrical fields here since they act every turn. if( has_flag( MF_ELECTRIC_FIELD ) ) { if( has_effect( effect_emp ) ) { @@ -2037,7 +2058,9 @@ void monster::die( Creature *nkiller ) item riding_saddle( "riding_saddle", 0 ); g->m.add_item_or_charges( pos(), riding_saddle ); } - g->u.forced_dismount(); + if( mounted_player ) { + mounted_player->forced_dismount(); + } } g->set_critter_died(); dead = true; @@ -2056,13 +2079,7 @@ void monster::die( Creature *nkiller ) // has guilt flag or player is pacifist && monster is humanoid mdeath::guilt( *this ); } - g->events().send( event::make( - calendar::turn, ch->getID(), type->id ) ); - if( type->difficulty >= 30 ) { - ch->add_memorial_log( pgettext( "memorial_male", "Killed a %s." ), - pgettext( "memorial_female", "Killed a %s." ), - name() ); - } + g->events().send( ch->getID(), type->id ); if( ch->is_player() && ch->has_trait( trait_KILLER ) ) { if( one_in( 4 ) ) { std::string snip = SNIPPET.random_from_category( "killer_on_kill" ); @@ -2090,7 +2107,28 @@ void monster::die( Creature *nkiller ) if( has_effect( effect_beartrap ) ) { add_item( item( "beartrap", 0 ) ); } - + if( has_effect( effect_grabbing ) ) { + remove_effect( effect_grabbing ); + for( auto &player_pos : g->m.points_in_radius( pos(), 1, 0 ) ) { + player *p = g->critter_at( player_pos ); + if( !p || !p->has_effect( effect_grabbed ) ) { + continue; + } + bool grabbed = false; + for( auto &mon_pos : g->m.points_in_radius( player_pos, 1, 0 ) ) { + const monster *const mon = g->critter_at( mon_pos ); + if( mon && mon->has_effect( effect_grabbing ) ) { + grabbed = true; + break; + } + } + if( !grabbed ) { + p->add_msg_player_or_npc( m_good, _( "The last enemy holding you collapses!" ), + _( "The last enemy holding collapses!" ) ); + p->remove_effect( effect_grabbed ); + } + } + } if( !is_hallucination() ) { for( const auto &it : inv ) { g->m.add_item_or_charges( pos(), it ); @@ -2249,6 +2287,8 @@ void monster::process_one_effect( effect &it, bool is_new ) } } else if( id == effect_run ) { effect_cache[FLEEING] = true; + } else if( id == effect_no_sight || id == effect_blind ) { + effect_cache[VISION_IMPAIRED] = true; } } diff --git a/src/monster.h b/src/monster.h index f1f7e9fbeae1e..cfde96dff8362 100644 --- a/src/monster.h +++ b/src/monster.h @@ -67,6 +67,7 @@ enum monster_attitude { enum monster_effect_cache_fields { MOVEMENT_IMPAIRED = 0, FLEEING, + VISION_IMPAIRED, NUM_MEFF }; @@ -197,6 +198,11 @@ class monster : public Creature void footsteps( const tripoint &p ); // noise made by movement void shove_vehicle( const tripoint &remote_destination, const tripoint &nearby_destination ); // shove vehicles out of the way + // check if a monster at a position will drown and kill it if necessary + // returns true if the monster dies + // chance is the one_in( chance ) that the monster will drown + bool die_if_drowning( const tripoint &at_pos, int chance = 1 ); + tripoint scent_move(); int calc_movecost( const tripoint &f, const tripoint &t ) const; @@ -411,11 +417,12 @@ class monster : public Creature const std::string &npc_msg ) const override; void add_msg_player_or_npc( game_message_type type, const std::string &player_msg, const std::string &npc_msg ) const override; - // TEMP VALUES tripoint wander_pos; // Wander destination - Just try to move in that direction int wandf; // Urge to wander - Increased by sound, decrements each move std::vector inv; // Inventory + player *mounted_player = nullptr; // player that is mounting this creature + character_id mounted_player_id; // id of player that is mounting this creature ( for save/load ) character_id dragged_foe_id; // id of character being dragged by the monster cata::optional tied_item; // item used to tie the monster cata::optional battery_item; // item to power mechs @@ -479,7 +486,6 @@ class monster : public Creature time_point last_updated = calendar::turn_zero; int last_baby; int last_biosig; - /** * Do some cleanup and caching as monster is being unloaded from map. */ @@ -489,6 +495,7 @@ class monster : public Creature */ void on_load(); + const pathfinding_settings &get_pathfinding_settings() const override; std::set get_path_avoid() const override; // summoned monsters via spells diff --git a/src/monstergenerator.cpp b/src/monstergenerator.cpp index 31d8b576cf187..9fc447f7f2eed 100644 --- a/src/monstergenerator.cpp +++ b/src/monstergenerator.cpp @@ -856,24 +856,24 @@ class mattack_hardcoded_wrapper : public mattack_actor bool call( monster &m ) const override { return cpp_function( &m ); } - mattack_actor *clone() const override { - return new mattack_hardcoded_wrapper( *this ); + std::unique_ptr clone() const override { + return std::make_unique( *this ); } void load_internal( JsonObject &, const std::string & ) override {} }; mtype_special_attack::mtype_special_attack( const mattack_id &id, const mon_action_attack f ) - : mtype_special_attack( new mattack_hardcoded_wrapper( id, f ) ) {} + : mtype_special_attack( std::make_unique( id, f ) ) {} void MonsterGenerator::add_hardcoded_attack( const std::string &type, const mon_action_attack f ) { add_attack( mtype_special_attack( type, f ) ); } -void MonsterGenerator::add_attack( mattack_actor *ptr ) +void MonsterGenerator::add_attack( std::unique_ptr ptr ) { - add_attack( mtype_special_attack( ptr ) ); + add_attack( mtype_special_attack( std::move( ptr ) ) ); } void MonsterGenerator::add_attack( const mtype_special_attack &wrapper ) @@ -901,7 +901,7 @@ mtype_special_attack MonsterGenerator::create_actor( JsonObject obj, const std:: "type" ); } - mattack_actor *new_attack = nullptr; + std::unique_ptr new_attack; if( attack_type == "monster_attack" ) { const std::string id = obj.get_string( "id" ); const auto &iter = attack_map.find( id ); @@ -911,21 +911,21 @@ mtype_special_attack MonsterGenerator::create_actor( JsonObject obj, const std:: new_attack = iter->second->clone(); } else if( attack_type == "leap" ) { - new_attack = new leap_actor(); + new_attack = std::make_unique(); } else if( attack_type == "melee" ) { - new_attack = new melee_actor(); + new_attack = std::make_unique(); } else if( attack_type == "bite" ) { - new_attack = new bite_actor(); + new_attack = std::make_unique(); } else if( attack_type == "gun" ) { - new_attack = new gun_actor(); + new_attack = std::make_unique(); } else if( attack_type == "spell" ) { - new_attack = new mon_spellcasting_actor(); + new_attack = std::make_unique(); } else { obj.throw_error( "unknown monster attack", "attack_type" ); } new_attack->load( obj, src ); - return mtype_special_attack( new_attack ); + return mtype_special_attack( std::move( new_attack ) ); } void mattack_actor::load( JsonObject &jo, const std::string &src ) diff --git a/src/monstergenerator.h b/src/monstergenerator.h index c1fd3bfb25314..eb1da36a77fde 100644 --- a/src/monstergenerator.h +++ b/src/monstergenerator.h @@ -82,7 +82,7 @@ class MonsterGenerator void init_defense(); void add_hardcoded_attack( const std::string &type, mon_action_attack f ); - void add_attack( mattack_actor *ptr ); + void add_attack( std::unique_ptr ); void add_attack( const mtype_special_attack &wrapper ); /** Gets an actor object without saving it anywhere */ diff --git a/src/mutation.cpp b/src/mutation.cpp index b50937511be41..650644967b28a 100644 --- a/src/mutation.cpp +++ b/src/mutation.cpp @@ -6,6 +6,7 @@ #include #include "avatar_action.h" +#include "event_bus.h" #include "field.h" #include "game.h" #include "item.h" @@ -13,6 +14,7 @@ #include "map.h" #include "map_iterator.h" #include "mapdata.h" +#include "memorial_logger.h" #include "monster.h" #include "overmapbuffer.h" #include "player.h" @@ -52,6 +54,29 @@ static const trait_id trait_ROOTS2( "ROOTS2" ); static const trait_id trait_ROOTS3( "ROOTS3" ); static const trait_id trait_DEBUG_BIONIC_POWER( "DEBUG_BIONIC_POWER" ); +namespace io +{ + +template<> +std::string enum_to_string( mutagen_technique data ) +{ + switch( data ) { + // *INDENT-OFF* + case mutagen_technique::consumed_mutagen: return "consumed_mutagen"; + case mutagen_technique::injected_mutagen: return "injected_mutagen"; + case mutagen_technique::consumed_purifier: return "consumed_purifier"; + case mutagen_technique::injected_purifier: return "injected_purifier"; + case mutagen_technique::injected_smart_purifier: return "injected_smart_purifier"; + // *INDENT-ON* + case mutagen_technique::num_mutagen_techniques: + break; + } + debugmsg( "Invalid mutagen_technique" ); + abort(); +} + +} // namespace io + bool Character::has_trait( const trait_id &b ) const { return my_mutations.count( b ) > 0; @@ -876,9 +901,8 @@ bool player::mutate_towards( const trait_id &mut ) _( "Your %1$s mutation turns into %2$s!" ), _( "'s %1$s mutation turns into %2$s!" ), replace_mdata.name(), mdata.name() ); - add_memorial_log( pgettext( "memorial_male", "'%s' mutation turned into '%s'" ), - pgettext( "memorial_female", "'%s' mutation turned into '%s'" ), - replace_mdata.name(), mdata.name() ); + + g->events().send( getID(), replace_mdata.id, mdata.id ); unset_mutation( replacing ); mutation_loss_effect( replacing ); mutation_effect( mut ); @@ -899,9 +923,7 @@ bool player::mutate_towards( const trait_id &mut ) _( "Your %1$s mutation turns into %2$s!" ), _( "'s %1$s mutation turns into %2$s!" ), replace_mdata.name(), mdata.name() ); - add_memorial_log( pgettext( "memorial_male", "'%s' mutation turned into '%s'" ), - pgettext( "memorial_female", "'%s' mutation turned into '%s'" ), - replace_mdata.name(), mdata.name() ); + g->events().send( getID(), replace_mdata.id, mdata.id ); unset_mutation( replacing2 ); mutation_loss_effect( replacing2 ); mutation_effect( mut ); @@ -925,9 +947,7 @@ bool player::mutate_towards( const trait_id &mut ) _( "Your innate %1$s trait turns into %2$s!" ), _( "'s innate %1$s trait turns into %2$s!" ), cancel_mdata.name(), mdata.name() ); - add_memorial_log( pgettext( "memorial_male", "'%s' mutation turned into '%s'" ), - pgettext( "memorial_female", "'%s' mutation turned into '%s'" ), - cancel_mdata.name(), mdata.name() ); + g->events().send( getID(), cancel_mdata.id, mdata.id ); unset_mutation( i ); mutation_loss_effect( i ); mutation_effect( mut ); @@ -948,9 +968,7 @@ bool player::mutate_towards( const trait_id &mut ) _( "You gain a mutation called %s!" ), _( " gains a mutation called %s!" ), mdata.name() ); - add_memorial_log( pgettext( "memorial_male", "Gained the mutation '%s'." ), - pgettext( "memorial_female", "Gained the mutation '%s'." ), - mdata.name() ); + g->events().send( getID(), mdata.id ); mutation_effect( mut ); } @@ -1139,8 +1157,8 @@ void player::remove_child_flag( const trait_id &flag ) static mutagen_rejection try_reject_mutagen( player &p, const item &it, bool strong ) { if( p.has_trait( trait_MUTAGEN_AVOID ) ) { - //~"Uh-uh" is a sound used for "nope", "no", etc. p.add_msg_if_player( m_warning, + //~ "Uh-uh" is a sound used for "nope", "no", etc. _( "After what happened that last time? uh-uh. You're not drinking that chemical stuff." ) ); return mutagen_rejection::rejected; } @@ -1161,8 +1179,11 @@ static mutagen_rejection try_reject_mutagen( player &p, const item &it, bool str p.has_trait( trait_M_BLOSSOMS ) || p.has_trait( trait_M_BLOOM ) ) { p.add_msg_if_player( m_good, _( "We decontaminate it with spores." ) ); g->m.ter_set( p.pos(), t_fungus ); - p.add_memorial_log( pgettext( "memorial_male", "Destroyed a harmful invader." ), - pgettext( "memorial_female", "Destroyed a harmful invader." ) ); + if( p.is_avatar() ) { + g->memorial().add( + pgettext( "memorial_male", "Destroyed a harmful invader." ), + pgettext( "memorial_female", "Destroyed a harmful invader." ) ); + } return mutagen_rejection::destroyed; } else { p.add_msg_if_player( m_bad, @@ -1189,15 +1210,22 @@ static mutagen_rejection try_reject_mutagen( player &p, const item &it, bool str p.add_msg_if_player( m_warning, _( "It was probably that marloss -- how did you know to call it \"marloss\" anyway?" ) ); p.add_msg_if_player( m_warning, _( "Best to stay clear of that alien crap in future." ) ); - p.add_memorial_log( pgettext( "memorial_male", - "Burned out a particularly nasty fungal infestation." ), - pgettext( "memorial_female", "Burned out a particularly nasty fungal infestation." ) ); + if( p.is_avatar() ) { + g->memorial().add( + pgettext( "memorial_male", + "Burned out a particularly nasty fungal infestation." ), + pgettext( "memorial_female", + "Burned out a particularly nasty fungal infestation." ) ); + } } else { p.add_msg_if_player( m_warning, _( "That was some toxic %s! Let's stick with Marloss next time, that's safe." ), it.tname() ); - p.add_memorial_log( pgettext( "memorial_male", "Suffered a toxic marloss/mutagen reaction." ), - pgettext( "memorial_female", "Suffered a toxic marloss/mutagen reaction." ) ); + if( p.is_avatar() ) { + g->memorial().add( + pgettext( "memorial_male", "Suffered a toxic marloss/mutagen reaction." ), + pgettext( "memorial_female", "Suffered a toxic marloss/mutagen reaction." ) ); + } } return mutagen_rejection::destroyed; @@ -1207,13 +1235,13 @@ static mutagen_rejection try_reject_mutagen( player &p, const item &it, bool str } mutagen_attempt mutagen_common_checks( player &p, const item &it, bool strong, - const std::string &memorial_male, const std::string &memorial_female ) + const mutagen_technique technique ) { + g->events().send( p.getID(), technique ); mutagen_rejection status = try_reject_mutagen( p, it, strong ); if( status == mutagen_rejection::rejected ) { return mutagen_attempt( false, 0 ); } - p.add_memorial_log( memorial_male.c_str(), memorial_female.c_str() ); if( status == mutagen_rejection::destroyed ) { return mutagen_attempt( false, it.type->charges_to_use() ); } @@ -1259,8 +1287,7 @@ void test_crossing_threshold( player &p, const mutation_category_trait &m_catego p.add_msg_if_player( m_good, _( "Something strains mightily for a moment... and then... you're... FREE!" ) ); p.set_mutation( mutation_thresh ); - p.add_memorial_log( m_category.memorial_message_male(), - m_category.memorial_message_female() ); + g->events().send( p.getID(), m_category.id ); // Manually removing Carnivore, since it tends to creep in // This is because carnivore is a prerequisite for the // predator-style post-threshold mutations. diff --git a/src/mutation.h b/src/mutation.h index 53caf26a2371f..343273e02dfc7 100644 --- a/src/mutation.h +++ b/src/mutation.h @@ -15,7 +15,7 @@ #include "character.h" #include "damage.h" #include "string_id.h" -#include "tuple_hash.h" +#include "hash_utils.h" #include "translations.h" #include "type_id.h" #include "point.h" @@ -414,6 +414,20 @@ std::vector get_mutations_in_types( const std::set &ids ) std::vector get_mutations_in_type( const std::string &id ); bool trait_display_sort( const trait_id &a, const trait_id &b ) noexcept; +enum class mutagen_technique : int { + consumed_mutagen, + injected_mutagen, + consumed_purifier, + injected_purifier, + injected_smart_purifier, + num_mutagen_techniques // last +}; + +template<> +struct enum_traits { + static constexpr mutagen_technique last = mutagen_technique::num_mutagen_techniques; +}; + enum class mutagen_rejection { accepted, rejected, @@ -427,7 +441,7 @@ struct mutagen_attempt { }; mutagen_attempt mutagen_common_checks( player &p, const item &it, bool strong, - const std::string &memorial_male, const std::string &memorial_female ); + mutagen_technique technique ); void test_crossing_threshold( player &p, const mutation_category_trait &m_category ); diff --git a/src/mutation_ui.cpp b/src/mutation_ui.cpp index 85a6692c3bf75..de83f18327a27 100644 --- a/src/mutation_ui.cpp +++ b/src/mutation_ui.cpp @@ -306,10 +306,9 @@ void player::power_mutations() continue; } } else { - popup( _( "\ -You cannot activate %s! To read a description of \ -%s, press '!', then '%c'." ), mut_data.name(), mut_data.name(), - my_mutations[mut_id].key ); + popup( _( "You cannot activate %s! To read a description of " + "%s, press '!', then '%c'." ), + mut_data.name(), mut_data.name(), my_mutations[mut_id].key ); redraw = true; } } diff --git a/src/name.cpp b/src/name.cpp index e42d0166b425e..a2d020727c7f1 100644 --- a/src/name.cpp +++ b/src/name.cpp @@ -132,13 +132,13 @@ std::string generate( bool is_male ) return get( baseSearchFlags | nameIsFullName ); } else { //~ Used for constructing full name: %1$s is `family name`, %2$s is `given name` - std::string full_name_format = "%1$s %2$s"; + translation full_name_format = to_translation( "Full Name", "%1$s %2$s" ); //One in three chance to add a nickname to full name if( one_in( 3 ) ) { //~ Used for constructing full name with nickname: %1$s is `family name`, %2$s is `given name`, %3$s is `nickname` - full_name_format = "%1$s '%3$s' %2$s"; + full_name_format = to_translation( "Full Name", "%1$s '%3$s' %2$s" ); } - return string_format( pgettext( "Full Name", full_name_format.c_str() ), + return string_format( full_name_format, get( baseSearchFlags | nameIsGivenName ).c_str(), get( baseSearchFlags | nameIsFamilyName ).c_str(), get( nameIsNickName ).c_str() diff --git a/src/newcharacter.cpp b/src/newcharacter.cpp index 8ac5b916af303..633e647eae5a4 100644 --- a/src/newcharacter.cpp +++ b/src/newcharacter.cpp @@ -228,7 +228,7 @@ static matype_id choose_ma_style( const character_type type, const std::vector%s / %s to select a statistic.\n\ - %s to increase the statistic.\n\ - %s to decrease the statistic." ), + fold_and_print( w, point( 2, 16 ), getmaxx( w ) - 4, COL_NOTE_MINOR, + _( " %s / %s to select a statistic.\n" + " %s to increase the statistic.\n" + " %s to decrease the statistic." ), ctxt.get_desc( "UP" ), ctxt.get_desc( "DOWN" ), ctxt.get_desc( "RIGHT" ), ctxt.get_desc( "LEFT" ) ); @@ -1469,8 +1469,8 @@ tab_direction set_profession( const catacurses::window &w, avatar &u, points_lef profs_length : iContentHeight ); int i; for( i = iStartPos; i < end_pos; i++ ) { - mvwprintz( w, point( 2, 5 + i - iStartPos ), c_light_gray, "\ - " ); // Clear the line + mvwprintz( w, point( 2, 5 + i - iStartPos ), c_light_gray, + " " ); // Clear the line nc_color col; if( u.prof != &sorted_profs[i].obj() ) { col = ( sorted_profs[i] == sorted_profs[cur_id] ? h_light_gray : c_light_gray ); @@ -1482,8 +1482,8 @@ tab_direction set_profession( const catacurses::window &w, avatar &u, points_lef } //Clear rest of space in case stuff got filtered out for( ; i < iStartPos + iContentHeight; ++i ) { - mvwprintz( w, point( 2, 5 + i - iStartPos ), c_light_gray, "\ - " ); // Clear the line + mvwprintz( w, point( 2, 5 + i - iStartPos ), c_light_gray, + " " ); // Clear the line } std::ostringstream buffer; @@ -2037,8 +2037,8 @@ tab_direction set_scenario( const catacurses::window &w, avatar &u, points_left scens_length : iContentHeight ); int i; for( i = iStartPos; i < end_pos; i++ ) { - mvwprintz( w, point( 2, 5 + i - iStartPos ), c_light_gray, "\ - " ); + mvwprintz( w, point( 2, 5 + i - iStartPos ), c_light_gray, + " " ); nc_color col; if( g->scen != sorted_scens[i] ) { if( sorted_scens[i] == sorted_scens[cur_id] && ( sorted_scens[i]->has_flag( "CITY_START" ) && @@ -2059,8 +2059,8 @@ tab_direction set_scenario( const catacurses::window &w, avatar &u, points_left } //Clear rest of space in case stuff got filtered out for( ; i < iStartPos + iContentHeight; ++i ) { - mvwprintz( w, point( 2, 5 + i - iStartPos ), c_light_gray, "\ - " ); // Clear the line + mvwprintz( w, point( 2, 5 + i - iStartPos ), c_light_gray, + " " ); // Clear the line } werase( w_sorting ); diff --git a/src/npc.cpp b/src/npc.cpp index 5fd4aa3a00b56..9b420668278ed 100644 --- a/src/npc.cpp +++ b/src/npc.cpp @@ -21,6 +21,7 @@ #include "map.h" #include "mapdata.h" #include "map_iterator.h" +#include "memorial_logger.h" #include "messages.h" #include "mission.h" #include "morale_types.h" @@ -97,6 +98,9 @@ const efftype_id effect_pkill_l( "pkill_l" ); const efftype_id effect_infection( "infection" ); const efftype_id effect_bouldering( "bouldering" ); const efftype_id effect_npc_flee_player( "npc_flee_player" ); +const efftype_id effect_riding( "riding" ); +const efftype_id effect_ridden( "ridden" ); +const efftype_id effect_controlled( "controlled" ); static const trait_id trait_CANNIBAL( "CANNIBAL" ); static const trait_id trait_PSYCHOPATH( "PSYCHOPATH" ); @@ -128,7 +132,6 @@ npc::npc() dex_max = 0; int_max = 0; per_max = 0; - my_fac = nullptr; marked_for_death = false; death_drops = true; dead = false; @@ -204,7 +207,7 @@ void npc_template::load( JsonObject &jsobj ) } } if( jsobj.has_string( "faction" ) ) { - guy.fac_id = faction_id( jsobj.get_string( "faction" ) ); + guy.set_fac_id( jsobj.get_string( "faction" ) ); } if( jsobj.has_int( "class" ) ) { @@ -428,8 +431,7 @@ void npc::randomize( const npc_class_id &type ) void npc::randomize_from_faction( faction *fac ) { // Personality = aggression, bravery, altruism, collector - my_fac = fac; - fac_id = fac->id; + set_fac( fac->id ); randomize( npc_class_id::NULL_ID() ); } @@ -442,6 +444,16 @@ void npc::set_fac( const string_id &id ) } } +string_id npc::get_fac_id() const +{ + return fac_id; +} + +faction *npc::get_faction() const +{ + return my_fac; +} + void npc::clear_fac() { my_fac = nullptr; @@ -520,6 +532,7 @@ void starting_clothes( npc &who, const npc_class_id &type, bool male ) it.on_takeoff( who ); } who.worn.clear(); + faction *my_fac = who.get_faction(); for( item &it : ret ) { if( it.has_flag( "VARSIZE" ) ) { it.item_tags.insert( "FIT" ); @@ -527,7 +540,7 @@ void starting_clothes( npc &who, const npc_class_id &type, bool male ) if( who.can_wear( it ).success() ) { it.on_wear( who ); who.worn.push_back( it ); - it.set_owner( who.my_fac ); + it.set_owner( my_fac ); } } } @@ -587,8 +600,9 @@ void starting_inv( npc &who, const npc_class_id &type ) res.erase( std::remove_if( res.begin(), res.end(), [&]( const item & e ) { return e.has_flag( "TRADER_AVOID" ); } ), res.end() ); + faction *my_fac = who.get_faction(); for( auto &it : res ) { - it.set_owner( who.my_fac ); + it.set_owner( my_fac ); } who.inv += res; } @@ -687,7 +701,7 @@ void npc::place_on_map() // value of "submap_coords.x * SEEX + posx()" is unchanged setpos( tripoint( offset_x + dmx * SEEX, offset_y + dmy * SEEY, posz() ) ); - if( g->is_empty( pos() ) ) { + if( g->is_empty( pos() ) || is_mounted() ) { return; } @@ -1106,7 +1120,7 @@ void npc::make_angry() } // Make associated faction, if any, angry at the player too. - if( my_fac != nullptr ) { + if( my_fac != nullptr && my_fac->id != faction_id( "no_faction" ) ) { my_fac->likes_u = std::max( -50, my_fac->likes_u - 50 ); my_fac->respects_u = std::max( -50, my_fac->respects_u - 50 ); } @@ -1591,22 +1605,12 @@ void npc::set_faction_ver( int new_version ) bool npc::has_faction_relationship( const player &p, const npc_factions::relationship flag ) const { - if( !my_fac ) { + faction *p_fac = p.get_faction(); + if( !my_fac || !p_fac ) { return false; } - faction_id your_fac_id; - if( p.is_player() ) { - your_fac_id = faction_id( "your_followers" ); - } else { - const npc &guy = dynamic_cast( p ); - if( guy.my_fac ) { - your_fac_id = guy.my_fac->id; - } else { - return false; - } - } - return my_fac->has_relationship( your_fac_id, flag ); + return my_fac->has_relationship( p_fac->id, flag ); } bool npc::is_ally( const player &p ) const @@ -1629,7 +1633,7 @@ bool npc::is_ally( const player &p ) const } } else { const npc &guy = dynamic_cast( p ); - if( my_fac && guy.my_fac && my_fac->id == guy.my_fac->id ) { + if( my_fac && guy.get_faction() && my_fac->id == guy.get_faction()->id ) { return true; } if( faction_api_version < 2 ) { @@ -1778,6 +1782,36 @@ Creature::Attitude npc::attitude_to( const Creature &other ) const return A_NEUTRAL; } +void npc::npc_dismount() +{ + if( !mounted_creature || !has_effect( effect_riding ) ) { + add_msg( m_debug, "NPC %s tried to dismount, but they have no mount, or they are not riding", + disp_name() ); + return; + } + cata::optional pnt; + for( const auto &elem : g->m.points_in_radius( pos(), 1 ) ) { + if( g->is_empty( elem ) ) { + pnt = elem; + break; + } + } + if( !pnt ) { + add_msg( m_debug, "NPC %s could not find a place to dismount.", disp_name() ); + return; + } + remove_effect( effect_riding ); + if( mounted_creature->has_flag( MF_RIDEABLE_MECH ) && + !mounted_creature->type->mech_weapon.empty() ) { + remove_item( weapon ); + } + mounted_creature->remove_effect( effect_ridden ); + mounted_creature->add_effect( effect_controlled, 5_turns ); + mounted_creature = nullptr; + setpos( *pnt ); + mod_moves( -100 ); +} + int npc::smash_ability() const { if( !is_hallucination() && ( !is_player_ally() || rules.has_flag( ally_rule::allow_bash ) ) ) { @@ -1866,6 +1900,11 @@ int npc::print_info( const catacurses::window &w, int line, int vLines, int colu // because it's a border as well; so we have lines 6 through 11. // w is also 48 characters wide - 2 characters for border = 46 characters for us mvwprintz( w, point( column, line++ ), c_white, _( "NPC: %s" ), name ); + + if( sees( g->u ) ) { + mvwprintz( w, point( column, line++ ), c_yellow, _( "Aware of your presence!" ) ); + } + if( is_armed() ) { trim_and_print( w, point( column, line++ ), iWidth, c_red, _( "Wielding a %s" ), weapon.tname() ); } @@ -2043,7 +2082,12 @@ void npc::die( Creature *nkiller ) if( in_vehicle ) { g->m.unboard_vehicle( pos(), true ); } - + if( is_mounted() ) { + monster *critter = mounted_creature.get(); + critter->remove_effect( effect_ridden ); + critter->mounted_player = nullptr; + critter->mounted_player_id = character_id(); + } dead = true; Character::die( nkiller ); @@ -2059,38 +2103,17 @@ void npc::die( Creature *nkiller ) } if( Character *ch = dynamic_cast( killer ) ) { - g->events().send( event::make( - calendar::turn, ch->getID(), getID(), get_name() ) ); + g->events().send( ch->getID(), getID(), get_name() ); } if( killer == &g->u && ( !guaranteed_hostile() || hit_by_player ) ) { bool cannibal = g->u.has_trait( trait_CANNIBAL ); bool psycho = g->u.has_trait( trait_PSYCHOPATH ); - if( g->u.has_trait( trait_SAPIOVORE ) ) { - g->u.add_memorial_log( pgettext( "memorial_male", - "Caught and killed an ape. Prey doesn't have a name." ), - pgettext( "memorial_female", "Caught and killed an ape. Prey doesn't have a name." ) ); - } else if( psycho && cannibal ) { - g->u.add_memorial_log( pgettext( "memorial_male", - "Killed a delicious-looking innocent, %s, in cold blood." ), - pgettext( "memorial_female", "Killed a delicious-looking innocent, %s, in cold blood." ), - name ); - } else if( psycho ) { - g->u.add_memorial_log( pgettext( "memorial_male", - "Killed an innocent, %s, in cold blood. They were weak." ), - pgettext( "memorial_female", "Killed an innocent, %s, in cold blood. They were weak." ), - name ); + if( g->u.has_trait( trait_SAPIOVORE ) || psycho ) { + // No morale effect } else if( cannibal ) { - g->u.add_memorial_log( pgettext( "memorial_male", "Killed an innocent, %s." ), - pgettext( "memorial_female", "Killed an innocent, %s." ), - name ); g->u.add_morale( MORALE_KILLED_INNOCENT, -5, 0, 2_days, 3_hours ); } else { - g->u.add_memorial_log( pgettext( "memorial_male", - "Killed an innocent person, %s, in cold blood and felt terrible afterwards." ), - pgettext( "memorial_female", - "Killed an innocent person, %s, in cold blood and felt terrible afterwards." ), - name ); g->u.add_morale( MORALE_KILLED_INNOCENT, -100, 0, 2_days, 3_hours ); } } @@ -2301,6 +2324,14 @@ void npc::on_load() if( g->m.veh_at( pos() ).part_with_feature( VPFLAG_BOARDABLE, true ) && !in_vehicle ) { g->m.board_vehicle( pos(), this ); } + if( has_effect( effect_riding ) && !mounted_creature ) { + if( const monster *const mon = g->critter_at( pos() ) ) { + mounted_creature = g->shared_from( *mon ); + } else { + add_msg( m_debug, "NPC is meant to be riding, though the mount is not found when %s is loaded", + disp_name() ); + } + } if( has_trait( trait_id( "HALLUCINATION" ) ) ) { hallucination = true; } diff --git a/src/npc.h b/src/npc.h index 37e26131c0152..cc3c17680a1f1 100644 --- a/src/npc.h +++ b/src/npc.h @@ -15,7 +15,9 @@ #include #include "calendar.h" +#include "faction.h" #include "line.h" +#include "lru_cache.h" #include "optional.h" #include "pimpl.h" #include "player.h" @@ -28,7 +30,6 @@ #include "string_id.h" #include "material.h" #include "type_id.h" -#include "faction.h" #include "int_id.h" #include "item.h" #include "point.h" @@ -210,6 +211,7 @@ enum combat_engagement { ENGAGE_WEAK, ENGAGE_HIT, ENGAGE_ALL, + ENGAGE_FREE_FIRE, ENGAGE_NO_MOVE }; const std::unordered_map combat_engagement_strs = { { @@ -218,6 +220,7 @@ const std::unordered_map combat_engagement_strs { "ENGAGE_WEAK", ENGAGE_WEAK }, { "ENGAGE_HIT", ENGAGE_HIT }, { "ENGAGE_ALL", ENGAGE_ALL }, + { "ENGAGE_FREE_FIRE", ENGAGE_FREE_FIRE }, { "ENGAGE_NO_MOVE", ENGAGE_NO_MOVE } } }; @@ -493,6 +496,8 @@ struct npc_short_term_cache { std::vector dangerous_explosives; std::map threat_map; + // Cache of locations the NPC has searched recently in npc::find_item() + lru_cache searched_tiles; }; // DO NOT USE! This is old, use strings as talk topic instead, e.g. "TALK_AGREE_FOLLOW" instead of @@ -726,11 +731,19 @@ class npc : public player return true; } void load_npc_template( const string_id &ident ); - + void npc_dismount(); + std::weak_ptr chosen_mount; // Generating our stats, etc. void randomize( const npc_class_id &type = npc_class_id::NULL_ID() ); void randomize_from_faction( faction *fac ); + // Faction version number + int get_faction_ver() const; + void set_faction_ver( int new_version ); + bool has_faction_relationship( const player &p, + npc_factions::relationship flag ) const; void set_fac( const string_id &id ); + faction *get_faction() const override; + string_id get_fac_id() const; void clear_fac(); /** * Set @ref submap_coords and @ref pos. @@ -798,11 +811,6 @@ class npc : public player */ std::vector styles_offered_to( const player &p ) const; // State checks - // Faction version number - int get_faction_ver() const; - void set_faction_ver( int new_version ); - bool has_faction_relationship( const player &p, - npc_factions::relationship flag ) const; // We want to kill/mug/etc the player bool is_enemy() const; // Traveling w/ player (whether as a friend or a slave) @@ -1109,9 +1117,6 @@ class npc : public player using player::add_msg_if_player; void add_msg_if_player( const std::string &/*msg*/ ) const override {} void add_msg_if_player( game_message_type /*type*/, const std::string &/*msg*/ ) const override {} - using player::add_memorial_log; - void add_memorial_log( const std::string &/*male_msg*/, - const std::string &/*female_msg*/ ) override {} using player::add_msg_player_or_say; void add_msg_player_or_say( const std::string &player_msg, const std::string &npc_speech ) const override; @@ -1152,10 +1157,6 @@ class npc : public player std::vector miss_ids; private: - // faction API versions - // 2 - allies are in your_followers faction; NPCATT_FOLLOW is follower but not an ally - // 0 - allies may be in your_followers faction; NPCATT_FOLLOW is an ally (legacy) - int faction_api_version = 2; // faction API versioning npc_attitude attitude; // What we want to do to the player npc_attitude previous_attitude = NPCATT_NULL; /** @@ -1214,9 +1215,6 @@ class npc : public player std::vector path; // Our movement plans // Personality & other defining characteristics - string_id fac_id; // A temp variable used to inform the game which faction to link - faction *my_fac; - std::string companion_mission_role_id; //Set mission source or squad leader for a patrol std::vector companion_mission_points; //Mission leader use to determine item sorting, patrols use for points diff --git a/src/npcmove.cpp b/src/npcmove.cpp index 2b4611fd6f346..05ea48e1110c8 100644 --- a/src/npcmove.cpp +++ b/src/npcmove.cpp @@ -70,6 +70,7 @@ const skill_id skill_firstaid( "firstaid" ); const skill_id skill_gun( "gun" ); const skill_id skill_throw( "throw" ); +const efftype_id effect_asthma( "asthma" ); const efftype_id effect_bandaged( "bandaged" ); const efftype_id effect_bite( "bite" ); const efftype_id effect_bleed( "bleed" ); @@ -88,6 +89,7 @@ const efftype_id effect_npc_run_away( "npc_run_away" ); const efftype_id effect_npc_fire_bad( "npc_fire_bad" ); const efftype_id effect_npc_flee_player( "npc_flee_player" ); const efftype_id effect_npc_player_looking( "npc_player_still_looking" ); +const efftype_id effect_ridden( "ridden" ); // power source CBMs const bionic_id bio_advreactor( "bio_advreactor" ); @@ -213,13 +215,13 @@ bool compare_sound_alert( const dangerous_sound &sound_a, const dangerous_sound return sound_a.volume < sound_b.volume; } -static bool clear_shot_reach( const tripoint &from, const tripoint &to ) +static bool clear_shot_reach( const tripoint &from, const tripoint &to, bool check_ally = true ) { std::vector path = line_to( from, to ); path.pop_back(); for( const tripoint &p : path ) { Creature *inter = g->critter_at( p ); - if( inter != nullptr ) { + if( check_ally && inter != nullptr ) { return false; } else if( g->m.impassable( p ) ) { return false; @@ -357,8 +359,7 @@ float npc::evaluate_enemy( const Creature &target ) const } } -static constexpr int def_radius = 6; -static bool too_close( const tripoint &critter_pos, const tripoint &ally_pos ) +static bool too_close( const tripoint &critter_pos, const tripoint &ally_pos, const int def_radius ) { return rl_dist( critter_pos, ally_pos ) <= def_radius; } @@ -367,13 +368,15 @@ void npc::assess_danger() { float assessment = 0.0f; float highest_priority = 1.0f; + int def_radius = 6; // Radius we can attack without moving const int max_range = std::max( weapon.reach_range( *this ), confident_shoot_range( weapon, get_most_accurate_sight( weapon ) ) ); - const auto ok_by_rules = [max_range, this]( const Creature & c, int dist, int scaled_dist ) { + const auto ok_by_rules = [max_range, def_radius, this]( const Creature & c, int dist, + int scaled_dist ) { // If we're forbidden to attack, no need to check engagement rules if( rules.has_flag( ally_rule::forbid_engage ) ) { return false; @@ -384,13 +387,15 @@ void npc::assess_danger() case ENGAGE_CLOSE: // Either close to player or close enough that we can reach it and close to us return ( dist <= max_range && scaled_dist <= def_radius * 0.5 ) || - too_close( c.pos(), g->u.pos() ); + too_close( c.pos(), g->u.pos(), def_radius ); case ENGAGE_WEAK: return c.get_hp() <= average_damage_dealt(); case ENGAGE_HIT: return c.has_effect( effect_hit_by_player ); case ENGAGE_NO_MOVE: return dist <= max_range; + case ENGAGE_FREE_FIRE: + return dist <= max_range; case ENGAGE_ALL: return true; } @@ -418,6 +423,9 @@ void npc::assess_danger() } } } + if( is_player_ally() && rules.engagement == ENGAGE_FREE_FIRE ) { + def_radius = std::max( 6, max_range ); + } // find our Character friends and enemies std::vector> hostile_guys; for( const npc &guy : g->all_npcs() ) { @@ -459,6 +467,10 @@ void npc::assess_danger() warn_about( "monster", 10_minutes, critter.type->nname() ); } } + // ignore targets behind glass even if we can see them + if( !clear_shot_reach( pos(), critter.pos(), false ) ) { + continue; + } int dist = rl_dist( pos(), critter.pos() ); float scaled_distance = std::max( 1.0f, dist / critter.speed_rating() ); @@ -466,19 +478,31 @@ void npc::assess_danger() float critter_danger = std::max( critter_threat * ( hp_percent * 0.5f + 0.5f ), NPC_DANGER_VERY_LOW ); ai_cache.total_danger += critter_danger / scaled_distance; - if( is_player_ally() && !ok_by_rules( critter, dist, scaled_distance ) ) { - continue; - } // don't ignore monsters that are too close or too close to an ally bool is_too_close = dist <= def_radius; - const auto test_too_close = [critter, &is_too_close]( const std::weak_ptr &guy ) { - is_too_close |= too_close( critter.pos(), guy.lock().get()->pos() ); + const auto test_too_close = [critter, def_radius, + &is_too_close]( const std::weak_ptr &guy ) { + // Bit of a dirty hack - sometimes shared_from, returns nullptr or bad weak_ptr for + // friendly NPC when the NPC is riding a creature - I dont know why. + // so this skips the bad weak_ptrs, but this doesnt functionally change the AI Priority + // because the horse the NPC is riding is still in the ai_cache.friends vector, + // so either one would count as a friendly for this purpose. + if( guy.lock() ) { + is_too_close |= too_close( critter.pos(), guy.lock().get()->pos(), def_radius ); + } return is_too_close; }; std::any_of( ai_cache.friends.begin(), ai_cache.friends.end(), test_too_close ); + // ignore distant monsters that our rules prevent us from attacking + if( !is_too_close && is_player_ally() && !ok_by_rules( critter, dist, scaled_distance ) ) { + continue; + } + // prioritize the biggest, nearest threats, or the biggest threats that are threatening + // us or an ally + // critter danger is always at least NPC_DANGER_VERY_LOW float priority = std::max( critter_danger - 2.0f * ( scaled_distance - 1.0f ), - is_too_close ? NPC_DANGER_VERY_LOW : 0.0f ); + is_too_close ? critter_danger : 0.0f ); cur_threat_map[direction_from( pos(), critter.pos() )] += priority; if( priority > highest_priority ) { highest_priority = priority; @@ -500,16 +524,22 @@ void npc::assess_danger() int dist = rl_dist( pos(), foe.pos() ); int scaled_distance = std::max( 1, ( 100 * dist ) / foe.get_speed() ); ai_cache.total_danger += foe_threat / scaled_distance; - if( !is_player_ally() || ok_by_rules( foe, dist, scaled_distance ) ) { - bool is_too_close = dist <= def_radius; - for( const std::weak_ptr guy : ai_cache.friends ) { - is_too_close |= too_close( foe.pos(), guy.lock().get()->pos() ); - if( is_too_close ) { - break; - } + // ignore targets behind glass even if we can see them + if( !clear_shot_reach( pos(), foe.pos(), false ) ) { + return 0.0f; + } + bool is_too_close = dist <= def_radius; + for( const std::weak_ptr guy : ai_cache.friends ) { + is_too_close |= too_close( foe.pos(), guy.lock().get()->pos(), def_radius ); + if( is_too_close ) { + break; } + } + + if( !is_player_ally() || is_too_close || ok_by_rules( foe, dist, scaled_distance ) ) { float priority = std::max( foe_threat - 2.0f * ( scaled_distance - 1 ), - is_too_close ? NPC_DANGER_VERY_LOW : 0.0f ); + is_too_close ? std::max( foe_threat, NPC_DANGER_VERY_LOW ) : + 0.0f ); cur_threat_map[direction_from( pos(), foe.pos() )] += priority; if( priority > highest_priority ) { warn_about( warning, 1_minutes ); @@ -723,6 +753,10 @@ void npc::move() action = method_of_fleeing(); } else if( has_effect( effect_npc_run_away ) ) { action = method_of_fleeing(); + } else if( has_effect( effect_asthma ) && ( has_charges( "inhaler", 1 ) || + has_charges( "oxygen_tank", 1 ) || + has_charges( "smoxygen_tank", 1 ) ) ) { + action = npc_heal; } else if( target != nullptr && ai_cache.danger > 0 ) { action = method_of_attack(); } else if( !ai_cache.sound_alerts.empty() && !is_walking_with() ) { @@ -975,15 +1009,11 @@ void npc::execute_action( npc_action action ) break; case npc_reach_attack: - if( weapon.reach_range( *this ) >= rl_dist( pos(), tar ) && - clear_shot_reach( pos(), tar ) ) { - if( can_use_offensive_cbm() ) { - activate_bionic_by_id( bio_hydraulics ); - } - reach_attack( tar ); - break; + if( can_use_offensive_cbm() ) { + activate_bionic_by_id( bio_hydraulics ); } - /* fallthrough */ + reach_attack( tar ); + break; case npc_melee: update_path( tar ); if( path.size() > 1 ) { @@ -1209,17 +1239,12 @@ void npc::execute_action( npc_action action ) void npc::witness_thievery( item *it ) { + known_stolen_item = it; // Shopkeep is behind glass if( myclass == npc_class_id( "NC_EVAC_SHOPKEEP" ) ) { - known_stolen_item = it; return; } set_attitude( NPCATT_RECOVER_GOODS ); - known_stolen_item = it; - for( auto &elem : g->u.inv_dump() ) { - if( elem->get_old_owner() ) { - } - } } npc_action npc::method_of_fleeing() @@ -1242,9 +1267,14 @@ npc_action npc::method_of_attack() tripoint tar = critter->pos(); int dist = rl_dist( pos(), tar ); double danger = evaluate_enemy( *critter ); + const bool has_los = clear_shot_reach( pos(), tar, false ); + const bool same_z = tar.z == pos().z; // TODO: Change the in_vehicle check to actual "are we driving" check - const bool dont_move = in_vehicle || rules.engagement == ENGAGE_NO_MOVE; + const bool dont_move = in_vehicle || rules.engagement == ENGAGE_NO_MOVE || + rules.engagement == ENGAGE_FREE_FIRE; + // NPCs engage in free fire can move to avoid allies, but not if they're in a vehicle + const bool dont_move_ff = in_vehicle || rules.engagement == ENGAGE_NO_MOVE; // if there's enough of a threat to be here, power up the combat CBMs activate_combat_cbms(); @@ -1304,10 +1334,12 @@ npc_action npc::method_of_attack() } // if the best mode is within the confident range try for a shot - if( !modes.empty() && sees( *critter ) && + if( !modes.empty() && sees( *critter ) && has_los && confident_gun_mode_range( modes[ 0 ].second, cur_recoil ) >= dist ) { - - // TODO: Make NPCs understand reinforced glass and vehicles blocking line of fire + if( cbm_weapon_index > 0 && !weapon.ammo_sufficient() && can_reload_current() ) { + add_msg( m_debug, "%s is reloading", disp_name() ); + return npc_reload; + } if( wont_hit_friend( tar, weapon, false ) ) { weapon.gun_set_mode( modes[ 0 ].first ); @@ -1315,14 +1347,14 @@ npc_action npc::method_of_attack() return npc_shoot; } else { - if( !dont_move ) { + if( !dont_move_ff ) { add_msg( m_debug, "%s is trying to avoid friendly fire", disp_name() ); return npc_avoid_friendly_fire; } } } - if( dist == 1 ) { + if( dist == 1 && same_z ) { add_msg( m_debug, "%s is trying a melle attack", disp_name() ); return npc_melee; } @@ -1342,14 +1374,13 @@ npc_action npc::method_of_attack() } // TODO: Needs a check for transparent but non-passable tiles on the way - if( !modes.empty() && sees( *critter ) && - aim_per_move( weapon, recoil ) > 0 && + if( !modes.empty() && sees( *critter ) && aim_per_move( weapon, recoil ) > 0 && confident_shoot_range( weapon, get_most_accurate_sight( weapon ) ) >= dist ) { add_msg( m_debug, "%s is aiming" ); return npc_aim; } add_msg( m_debug, "%s can't figure out what to do", disp_name() ); - return dont_move ? npc_undecided : npc_melee; + return ( dont_move || !same_z ) ? npc_undecided : npc_melee; } bool npc::need_heal( const player &n ) @@ -1591,6 +1622,14 @@ bool npc::deactivate_bionic_by_id( const bionic_id &cbm_id, bool eff_only ) bool npc::wants_to_recharge_cbm() { + + for( const bionic_id bid : get_fueled_bionics() ) { + for( const itype_id fid : bid->fuel_opts ) { + return get_fuel_available( bid ).empty() || ( !get_fuel_available( bid ).empty() && + power_level < ( max_power_level * static_cast( rules.cbm_recharge ) / 100 ) && + !use_bionic_by_id( bid ) ); + } + } return power_level < ( max_power_level * static_cast( rules.cbm_recharge ) / 100 ); } @@ -1629,6 +1668,27 @@ bool npc::recharge_cbm() use_bionic_by_id( bio_torsionratchet ); use_bionic_by_id( bio_metabolics ); + for( bionic_id bid : get_fueled_bionics() ) { + if( !get_fuel_available( bid ).empty() ) { + use_bionic_by_id( bid ); + return true; + } else { + const std::function fuel_filter = [bid]( const item & it ) { + for( const itype_id fid : bid->fuel_opts ) { + return it.typeId() == fid; + } + return false; + }; + + if( consume_cbm_items( fuel_filter ) ) { + use_bionic_by_id( bid ); + return true; + } else { + complain_about( "need_fuel", 3_hours, "", false ); + } + } + } + if( use_bionic_by_id( bio_furnace ) ) { const std::function furnace_filter = []( const item & it ) { return it.typeId() == itype_id( "withered" ) || it.typeId() == itype_id( "file" ) || @@ -2170,6 +2230,19 @@ void npc::move_to( const tripoint &pt, bool no_bashing, std::set *nomo realnomove->insert( pos() ); say( "" ); np->move_away_from( pos(), true, realnomove ); + // if we moved NPC, readjust their path, so NPCs dont jostle each other out of their activity paths. + if( np->attitude == NPCATT_ACTIVITY ) { + std::vector activity_route = np->get_auto_move_route(); + if( !activity_route.empty() && !np->has_destination_activity() ) { + tripoint final_destination; + if( destination_point ) { + final_destination = g->m.getlocal( *destination_point ); + } else { + final_destination = activity_route.back(); + } + np->update_path( final_destination ); + } + } } if( critter->pos() == p ) { @@ -2194,11 +2267,25 @@ void npc::move_to( const tripoint &pt, bool no_bashing, std::set *nomo // Z-level move // For now just teleport to the destination // TODO: Make it properly find the tile to move to + if( is_mounted() ) { + move_pause(); + return; + } moves -= 100; moved = true; } else if( g->m.passable( p ) ) { bool diag = trigdist && posx() != p.x && posy() != p.y; - moves -= run_cost( g->m.combined_movecost( pos(), p ), diag ); + if( is_mounted() ) { + const double base_moves = run_cost( g->m.combined_movecost( pos(), p ), + diag ) * 100.0 / mounted_creature->get_speed(); + const double encumb_moves = get_weight() / 4800.0_gram; + moves -= static_cast( ceil( base_moves + encumb_moves ) ); + if( mounted_creature->has_flag( MF_RIDEABLE_MECH ) ) { + mounted_creature->use_mech_power( -1 ); + } + } else { + moves -= run_cost( g->m.combined_movecost( pos(), p ), diag ); + } moved = true; } else if( g->m.open_door( p, !g->m.is_outside( pos() ), true ) ) { if( !is_hallucination() ) { // hallucinations don't open doors @@ -2237,7 +2324,19 @@ void npc::move_to( const tripoint &pt, bool no_bashing, std::set *nomo if( moved ) { const tripoint old_pos = pos(); setpos( p ); - + if( old_pos.x - p.x < 0 ) { + facing = FD_RIGHT; + } else { + facing = FD_LEFT; + } + if( is_mounted() ) { + if( mounted_creature->pos() != pos() ) { + mounted_creature->setpos( pos() ); + mounted_creature->facing = facing; + mounted_creature->process_triggers(); + g->m.creature_in_field( *mounted_creature ); + } + } if( g->m.has_flag( "UNSTABLE", pos() ) ) { add_effect( effect_bouldering, 1_turns, num_bp, true ); } else if( has_effect( effect_bouldering ) ) { @@ -2507,7 +2606,6 @@ void npc::find_item() } if( is_player_ally() && !rules.has_flag( ally_rule::allow_pick_up ) ) { - // Grabbing stuff not allowed by our "owner" return; } @@ -2600,34 +2698,63 @@ void npc::find_item() continue; } + const tripoint abs_p = global_square_location() - pos() + p; + const int prev_num_items = ai_cache.searched_tiles.get( abs_p, -1 ); + // Prefetch the number of items present so we can bail out if we already checked here. + const map_stack m_stack = g->m.i_at( p ); + int num_items = m_stack.size(); + const optional_vpart_position vp = g->m.veh_at( p ); + if( vp ) { + const cata::optional cargo = vp.part_with_feature( VPFLAG_CARGO, true ); + if( cargo ) { + vehicle_stack v_stack = cargo->vehicle().get_items( cargo->part_index() ); + num_items += v_stack.size(); + } + } + if( prev_num_items == num_items ) { + continue; + } + auto cache_tile = [this, &abs_p, num_items, &wanted]() { + if( wanted == nullptr ) { + ai_cache.searched_tiles.insert( 1000, abs_p, num_items ); + } + }; + bool can_see = false; if( g->m.sees_some_items( p, *this ) && sees( p ) ) { - for( const item &it : g->m.i_at( p ) ) { + can_see = true; + for( const item &it : m_stack ) { consider_item( it, p ); } } - // Allow terrain check without sight, because it would cost more CPU than it is worth - consider_terrain( p ); + // Not cached because it gets checked once and isn't expected to change. + if( can_see || sees( p ) ) { + can_see = true; + consider_terrain( p ); + } - const optional_vpart_position vp = g->m.veh_at( p ); - if( !vp || vp->vehicle().is_moving() || !sees( p ) ) { + if( !vp || vp->vehicle().is_moving() || !( can_see || sees( p ) ) ) { + cache_tile(); continue; } const cata::optional cargo = vp.part_with_feature( VPFLAG_CARGO, true ); static const std::string locked_string( "LOCKED" ); // TODO: Let player know what parts are safe from NPC thieves if( !cargo || cargo->has_feature( locked_string ) ) { + cache_tile(); continue; } static const std::string cargo_locking_string( "CARGO_LOCKING" ); if( vp.part_with_feature( cargo_locking_string, true ) ) { + cache_tile(); continue; } for( const item &it : cargo->vehicle().get_items( cargo->part_index() ) ) { consider_item( it, p ); } + cache_tile(); } if( wanted != nullptr ) { @@ -3349,6 +3476,24 @@ void npc:: pretend_heal( player &patient, item used ) void npc::heal_self() { + if( has_effect( effect_asthma ) ) { + item &treatment = null_item_reference(); + std::string iusage = "OXYGEN_BOTTLE"; + if( has_charges( "inhaler", 1 ) ) { + treatment = inv.find_item( inv.position_by_type( "inhaler" ) ); + iusage = "INHALER"; + } else if( has_charges( "oxygen_tank", 1 ) ) { + treatment = inv.find_item( inv.position_by_type( "oxygen_tank" ) ); + } else if( has_charges( "smoxygen_tank", 1 ) ) { + treatment = inv.find_item( inv.position_by_type( "smoxygen_tank" ) ); + } + if( !treatment.is_null() ) { + treatment.type->invoke( *this, treatment, pos(), iusage ); + consume_charges( treatment, 1 ); + return; + } + } + item &used = get_healing_item( ai_cache.can_heal ); if( used.is_null() ) { debugmsg( "%s tried to heal self but has no healing item", disp_name() ); diff --git a/src/npctalk.cpp b/src/npctalk.cpp index e1ffefe48a7fc..73bdc3989b914 100644 --- a/src/npctalk.cpp +++ b/src/npctalk.cpp @@ -94,10 +94,13 @@ const efftype_id effect_lying_down( "lying_down" ); const efftype_id effect_narcosis( "narcosis" ); const efftype_id effect_sleep( "sleep" ); const efftype_id effect_under_op( "under_operation" ); +const efftype_id effect_riding( "riding" ); static const trait_id trait_DEBUG_MIND_CONTROL( "DEBUG_MIND_CONTROL" ); static const trait_id trait_PROF_FOODP( "PROF_FOODP" ); +static const itype_id fuel_type_animal( "animal" ); + const zone_type_id zone_no_investigate( "NPC_NO_INVESTIGATE" ); const zone_type_id zone_investigate_only( "NPC_INVESTIGATE_ONLY" ); @@ -114,17 +117,17 @@ const talk_topic &special_talk( char ch ); std::string give_item_to( npc &p, bool allow_use, bool allow_carry ); -const std::string &talk_trial::name() const +std::string talk_trial::name() const { static const std::array texts = { { - "", _( "LIE" ), _( "PERSUADE" ), _( "INTIMIDATE" ), "" + "", translate_marker( "LIE" ), translate_marker( "PERSUADE" ), translate_marker( "INTIMIDATE" ), "" } }; if( static_cast( type ) >= texts.size() ) { debugmsg( "invalid trial type %d", static_cast( type ) ); - return texts[0]; + return std::string(); } - return texts[type]; + return texts[type].empty() ? std::string() : _( texts[type] ); } /** Time (in turns) and cost (in cent) for training: */ @@ -178,6 +181,8 @@ enum npc_chat_menu { NPC_CHAT_GUARD, NPC_CHAT_FOLLOW, NPC_CHAT_AWAKE, + NPC_CHAT_MOUNT, + NPC_CHAT_DISMOUNT, NPC_CHAT_DANGER, NPC_CHAT_ORDERS, NPC_CHAT_NO_GUNS, @@ -186,7 +191,9 @@ enum npc_chat_menu { NPC_CHAT_MOVE_FREELY, NPC_CHAT_SLEEP, NPC_CHAT_FORBID_ENGAGE, - NPC_CHAT_CLEAR_OVERRIDES + NPC_CHAT_CLEAR_OVERRIDES, + NPC_CHAT_ANIMAL_VEHICLE_FOLLOW, + NPC_CHAT_ANIMAL_VEHICLE_STOP_FOLLOW }; // given a vector of NPCs, presents a menu to allow a player to pick one. @@ -313,6 +320,29 @@ static void npc_temp_orders_menu( const std::vector &npc_list ) } +static void tell_veh_stop_following() +{ + faction *yours = g->faction_manager_ptr->get( faction_id( "your_followers" ) ); + for( auto &veh : g->m.get_vehicles() ) { + auto &v = veh.v; + if( v->has_engine_type( fuel_type_animal, false ) && v->get_owner() == yours ) { + v->is_following = false; + v->engine_on = false; + } + } +} + +static void assign_veh_to_follow() +{ + faction *yours = g->faction_manager_ptr->get( faction_id( "your_followers" ) ); + for( auto &veh : g->m.get_vehicles() ) { + auto &v = veh.v; + if( v->has_engine_type( fuel_type_animal, false ) && v->get_owner() == yours ) { + v->activate_animal_follow(); + } + } +} + void game::chat() { int volume = g->u.get_shout_volume(); @@ -339,6 +369,18 @@ void game::chat() g->u.add_msg_if_player( m_warning, _( "You can't speak without your face!" ) ); return; } + std::vector animal_vehicles; + std::vector following_vehicles; + faction *yours = g->faction_manager_ptr->get( faction_id( "your_followers" ) ); + for( auto &veh : g->m.get_vehicles() ) { + auto &v = veh.v; + if( v->has_engine_type( fuel_type_animal, false ) && v->get_owner() == yours ) { + animal_vehicles.push_back( v ); + if( v->is_following ) { + following_vehicles.push_back( v ); + } + } + } uilist nmenu; nmenu.text = std::string( _( "What do you want to do?" ) ); @@ -351,6 +393,14 @@ void game::chat() } nmenu.addentry( NPC_CHAT_YELL, true, 'a', _( "Yell" ) ); nmenu.addentry( NPC_CHAT_SENTENCE, true, 'b', _( "Yell a sentence" ) ); + if( !animal_vehicles.empty() ) { + nmenu.addentry( NPC_CHAT_ANIMAL_VEHICLE_FOLLOW, true, 'F', + _( "Whistle at your animals pulling vehicles to follow you." ) ); + } + if( !following_vehicles.empty() ) { + nmenu.addentry( NPC_CHAT_ANIMAL_VEHICLE_STOP_FOLLOW, true, 'S', + _( "Whistle at your animals pulling vehicles to stop following you." ) ); + } if( !guards.empty() ) { nmenu.addentry( NPC_CHAT_FOLLOW, true, 'f', guard_count == 1 ? string_format( _( "Tell %s to follow" ), guards.front()->name ) : @@ -363,6 +413,8 @@ void game::chat() _( "Tell someone to guard..." ) ); nmenu.addentry( NPC_CHAT_AWAKE, true, 'w', _( "Tell everyone on your team to wake up" ) ); + nmenu.addentry( NPC_CHAT_MOUNT, true, 'M', _( "Tell everyone on your team to mount up" ) ); + nmenu.addentry( NPC_CHAT_DISMOUNT, true, 'm', _( "Tell everyone on your team to dismount" ) ); nmenu.addentry( NPC_CHAT_DANGER, true, 'D', _( "Tell everyone on your team to prepare for danger" ) ); nmenu.addentry( NPC_CHAT_CLEAR_OVERRIDES, true, 'r', @@ -442,6 +494,23 @@ void game::chat() } yell_msg = _( "Stay awake!" ); break; + case NPC_CHAT_MOUNT: + for( npc *them : followers ) { + if( them->has_effect( effect_riding ) ) { + continue; + } + talk_function::find_mount( *them ); + } + yell_msg = _( "Mount up!" ); + break; + case NPC_CHAT_DISMOUNT: + for( npc *them : followers ) { + if( them->has_effect( effect_riding ) ) { + them->npc_dismount(); + } + } + yell_msg = _( "Dismount!" ); + break; case NPC_CHAT_DANGER: for( npc *them : followers ) { them->rules.set_danger_overrides(); @@ -458,6 +527,12 @@ void game::chat() case NPC_CHAT_ORDERS: npc_temp_orders_menu( followers ); break; + case NPC_CHAT_ANIMAL_VEHICLE_FOLLOW: + assign_veh_to_follow(); + break; + case NPC_CHAT_ANIMAL_VEHICLE_STOP_FOLLOW: + tell_veh_stop_following(); + break; default: return; } @@ -1114,19 +1189,23 @@ void dialogue::gen_responses( const talk_topic &the_topic ) const int cost = calc_ma_style_training_cost( *p, style.id ); //~Martial art style (cost in dollars) const std::string text = string_format( cost > 0 ? _( "%s ( cost $%d )" ) : "%s", - _( style.name ), cost / 100 ); + style.name, cost / 100 ); add_response( text, "TALK_TRAIN_START", style ); } for( auto &trained : trainable ) { const int cost = calc_skill_training_cost( *p, trained ); - const SkillLevel skill_level_obj = g->u.get_skill_level_object( trained ); + SkillLevel skill_level_obj = g->u.get_skill_level_object( trained ); const int cur_level = skill_level_obj.level(); const int cur_level_exercise = skill_level_obj.exercise(); - //~Skill name: current level (exercise) -> next level (cost in dollars) - std::string text = string_format( cost > 0 ? _( "%s: %d (%d%%) -> %d (cost $%d)" ) : + skill_level_obj.train( 100 ); + const int next_level = skill_level_obj.level(); + const int next_level_exercise = skill_level_obj.exercise(); + + //~Skill name: current level (exercise) -> next level (exercise) (cost in dollars) + std::string text = string_format( cost > 0 ? _( "%s: %d (%d%%) -> %d (%d%%) (cost $%d)" ) : _( "%s: %d (%d%%) -> %d" ), - trained.obj().name(), cur_level, cur_level_exercise, cur_level + 1, - cost / 100 ); + trained.obj().name(), cur_level, cur_level_exercise, + next_level, next_level_exercise, cost / 100 ); add_response( text, "TALK_TRAIN_START", trained ); } add_response_none( _( "Eh, never mind." ) ); @@ -1774,6 +1853,27 @@ void talk_effect_fun_t::set_remove_var( JsonObject jo, const std::string &member }; } +void talk_effect_fun_t::set_adjust_var( JsonObject jo, const std::string &member, bool is_npc ) +{ + const std::string var_name = get_talk_varname( jo, member, false ); + const int value = jo.get_int( "adjustment" ); + function = [is_npc, var_name, value]( const dialogue & d ) { + player *actor = d.alpha; + if( is_npc ) { + actor = dynamic_cast( d.beta ); + } + + int adjusted_value = value; + + const std::string &var = actor->get_value( var_name ); + if( !var.empty() ) { + adjusted_value += std::stoi( var ); + } + + actor->set_value( var_name, std::to_string( adjusted_value ) ); + }; +} + void talk_effect_fun_t::set_u_buy_item( const std::string &item_name, int cost, int count, const std::string &container_name ) { @@ -1809,6 +1909,11 @@ void talk_effect_fun_t::set_u_buy_item( const std::string &item_name, int cost, popup( _( "%1$s gives you a %2$s." ), p.name, container.tname() ); } }; + + // Update structure used by mission descriptions. + if( cost <= 0 ) { + likely_rewards.push_back( std::pair( count, item_name ) ); + } } void talk_effect_fun_t::set_u_sell_item( const std::string &item_name, int cost, int count ) @@ -1899,7 +2004,7 @@ void talk_effect_fun_t::set_npc_change_faction( const std::string &faction_name { function = [faction_name]( const dialogue & d ) { npc &p = *d.beta; - p.my_fac = g->faction_manager_ptr->get( faction_id( faction_name ) ); + p.set_fac( faction_id( faction_name ) ); }; } @@ -1915,8 +2020,10 @@ void talk_effect_fun_t::set_change_faction_rep( int rep_change ) { function = [rep_change]( const dialogue & d ) { npc &p = *d.beta; - p.my_fac->likes_u += rep_change; - p.my_fac->respects_u += rep_change; + if( p.get_faction()->id != faction_id( "no_faction" ) ) { + p.get_faction()->likes_u += rep_change; + p.get_faction()->respects_u += rep_change; + } }; } @@ -2049,8 +2156,8 @@ void talk_effect_fun_t::set_bulk_trade_accept( bool is_trade, bool is_npc ) tmp.charges = seller_has; if( is_trade ) { int price = tmp.price( true ) * ( is_npc ? -1 : 1 ) + d.beta->op_of_u.owed; - if( d.beta->my_fac && !d.beta->my_fac->currency.empty() ) { - const itype_id &pay_in = d.beta->my_fac->currency; + if( d.beta->get_faction() && !d.beta->get_faction()->currency.empty() ) { + const itype_id &pay_in = d.beta->get_faction()->currency; item pay( pay_in ); if( d.beta->value( pay ) > 0 ) { int required = price / d.beta->value( pay ); @@ -2099,6 +2206,11 @@ void talk_effect_fun_t::set_add_mission( const std::string mission_id ) }; } +const std::vector> &talk_effect_fun_t::get_likely_rewards() const +{ + return likely_rewards; +} + void talk_effect_fun_t::set_u_buy_monster( const std::string &monster_type_id, int cost, int count, bool pacified, const translation &name ) { @@ -2266,6 +2378,10 @@ void talk_effect_t::parse_sub_effect( JsonObject jo ) subeffect_fun.set_remove_var( jo, "u_lose_var" ); } else if( jo.has_string( "npc_lose_var" ) ) { subeffect_fun.set_remove_var( jo, "npc_lose_var", is_npc ); + } else if( jo.has_string( "u_adjust_var" ) ) { + subeffect_fun.set_adjust_var( jo, "u_adjust_var" ); + } else if( jo.has_string( "npc_adjust_var" ) ) { + subeffect_fun.set_adjust_var( jo, "npc_adjust_var", is_npc ); } else if( jo.has_string( "u_add_trait" ) ) { subeffect_fun.set_add_trait( jo, "u_add_trait" ); } else if( jo.has_string( "npc_add_trait" ) ) { @@ -2382,7 +2498,14 @@ void talk_effect_t::parse_string_effect( const std::string &effect_id, JsonObjec WRAP( mission_reward ), WRAP( start_trade ), WRAP( sort_loot ), + WRAP( find_mount ), + WRAP( dismount ), + WRAP( do_chop_plank ), + WRAP( do_vehicle_deconstruct ), + WRAP( do_chop_trees ), + WRAP( do_fishing ), WRAP( do_construction ), + WRAP( do_butcher ), WRAP( do_farming ), WRAP( assign_guard ), WRAP( stop_guard ), @@ -2522,10 +2645,10 @@ talk_response::talk_response( JsonObject jo ) if( jo.has_member( "truefalsetext" ) ) { JsonObject truefalse_jo = jo.get_object( "truefalsetext" ); read_condition( truefalse_jo, "condition", truefalse_condition, true ); - truetext = translation( truefalse_jo.get_string( "true" ) ); - falsetext = translation( truefalse_jo.get_string( "false" ) ); + truetext = to_translation( truefalse_jo.get_string( "true" ) ); + falsetext = to_translation( truefalse_jo.get_string( "false" ) ); } else { - truetext = translation( jo.get_string( "text" ) ); + truetext = to_translation( jo.get_string( "text" ) ); truefalse_condition = []( const dialogue & ) { return true; }; diff --git a/src/npctalk.h b/src/npctalk.h index 47b23b0864607..45429499726e8 100644 --- a/src/npctalk.h +++ b/src/npctalk.h @@ -24,6 +24,8 @@ void buy_cow( npc & ); void buy_chicken( npc & ); void bionic_install( npc & ); void bionic_remove( npc & ); +void dismount( npc & ); +void find_mount( npc & ); void barber_beard( npc & ); void barber_hair( npc & ); @@ -36,7 +38,12 @@ void buy_100_logs( npc & ); void start_trade( npc & ); void sort_loot( npc & ); void do_construction( npc & ); +void do_chop_plank( npc & ); +void do_vehicle_deconstruct( npc & ); +void do_chop_trees( npc & ); +void do_fishing( npc & ); void do_farming( npc & ); +void do_butcher( npc & ); void revert_activity( npc & ); void goto_location( npc & ); void assign_base( npc & ); diff --git a/src/npctalk_funcs.cpp b/src/npctalk_funcs.cpp index 0a55756ad277c..a2ce02a1b03df 100644 --- a/src/npctalk_funcs.cpp +++ b/src/npctalk_funcs.cpp @@ -7,11 +7,13 @@ #include #include +#include "activity_handlers.h" #include "avatar.h" #include "basecamp.h" #include "bionics.h" #include "debug.h" #include "game.h" +#include "event_bus.h" #include "line.h" #include "map.h" #include "map_iterator.h" @@ -51,6 +53,8 @@ struct itype; #define dbg(x) DebugLog((DebugLevel)(x), D_NPC) << __FILE__ << ":" << __LINE__ << ": " +const skill_id skill_survival( "survival" ); + const efftype_id effect_allow_sleep( "allow_sleep" ); const efftype_id effect_asked_for_item( "asked_for_item" ); const efftype_id effect_asked_personal_info( "asked_personal_info" ); @@ -64,6 +68,10 @@ const efftype_id effect_infected( "infected" ); const efftype_id effect_lying_down( "lying_down" ); const efftype_id effect_sleep( "sleep" ); const efftype_id effect_pet( "pet" ); +const efftype_id effect_controlled( "controlled" ); +const efftype_id effect_riding( "riding" ); +const efftype_id effect_ridden( "ridden" ); +const efftype_id effect_saddled( "monster_saddled" ); const mtype_id mon_horse( "mon_horse" ); const mtype_id mon_cow( "mon_cow" ); @@ -99,11 +107,12 @@ void talk_function::mission_success( npc &p ) int miss_val = npc_trading::cash_to_favor( p, miss->get_value() ); npc_opinion tmp( 0, 0, 1 + miss_val / 5, -1, 0 ); p.op_of_u += tmp; - if( p.my_fac != nullptr ) { + faction *p_fac = p.get_faction(); + if( p_fac != nullptr ) { int fac_val = std::min( 1 + miss_val / 10, 10 ); - p.my_fac->likes_u += fac_val; - p.my_fac->respects_u += fac_val; - p.my_fac->power += fac_val; + p_fac->likes_u += fac_val; + p_fac->respects_u += fac_val; + p_fac->power += fac_val; } miss->wrap_up(); } @@ -207,6 +216,59 @@ void talk_function::do_construction( npc &p ) p.set_mission( NPC_MISSION_ACTIVITY ); } +void talk_function::dismount( npc &p ) +{ + p.npc_dismount(); +} + +void talk_function::find_mount( npc &p ) +{ + // first find one nearby + for( monster &critter : g->all_monsters() ) { + if( p.can_mount( critter ) ) { + p.set_attitude( NPCATT_ACTIVITY ); + // keep the horse still for some time, so that NPC can catch up to it nad mount it. + p.set_mission( NPC_MISSION_ACTIVITY ); + p.assign_activity( activity_id( "ACT_FIND_MOUNT" ) ); + p.chosen_mount = g->shared_from( critter ); + // we found one, thats all we need. + return; + } + } + // if we got here and this was prompted by a renewal of the activity, and there are no valid monsters nearby, then cancel whole thing. + if( p.has_player_activity() ) { + p.revert_after_activity(); + } +} + +void talk_function::do_butcher( npc &p ) +{ + p.set_attitude( NPCATT_ACTIVITY ); + p.assign_activity( activity_id( "ACT_MULTIPLE_BUTCHER" ) ); + p.set_mission( NPC_MISSION_ACTIVITY ); +} + +void talk_function::do_chop_plank( npc &p ) +{ + p.set_attitude( NPCATT_ACTIVITY ); + p.assign_activity( activity_id( "ACT_MULTIPLE_CHOP_PLANKS" ) ); + p.set_mission( NPC_MISSION_ACTIVITY ); +} + +void talk_function::do_vehicle_deconstruct( npc &p ) +{ + p.set_attitude( NPCATT_ACTIVITY ); + p.assign_activity( activity_id( "ACT_VEHICLE_DECONSTRUCTION" ) ); + p.set_mission( NPC_MISSION_ACTIVITY ); +} + +void talk_function::do_chop_trees( npc &p ) +{ + p.set_attitude( NPCATT_ACTIVITY ); + p.assign_activity( activity_id( "ACT_MULTIPLE_CHOP_TREES" ) ); + p.set_mission( NPC_MISSION_ACTIVITY ); +} + void talk_function::do_farming( npc &p ) { p.set_attitude( NPCATT_ACTIVITY ); @@ -214,6 +276,13 @@ void talk_function::do_farming( npc &p ) p.set_mission( NPC_MISSION_ACTIVITY ); } +void talk_function::do_fishing( npc &p ) +{ + p.set_attitude( NPCATT_ACTIVITY ); + p.assign_activity( activity_id( "ACT_MULTIPLE_FISH" ) ); + p.set_mission( NPC_MISSION_ACTIVITY ); +} + void talk_function::revert_activity( npc &p ) { p.revert_after_activity(); @@ -332,7 +401,8 @@ void talk_function::stop_guard( npc &p ) void talk_function::wake_up( npc &p ) { - p.rules.clear_flag( ally_rule::allow_sleep ); + p.rules.clear_override( ally_rule::allow_sleep ); + p.rules.enable_override( ally_rule::allow_sleep ); p.remove_effect( effect_allow_sleep ); p.remove_effect( effect_lying_down ); p.remove_effect( effect_sleep ); @@ -454,7 +524,7 @@ void talk_function::give_equipment( npc &p ) item it = *giving[chosen].loc.get_item(); giving[chosen].loc.remove_item(); popup( _( "%1$s gives you a %2$s" ), p.name, it.tname() ); - it.set_owner( g->faction_manager_ptr->get( faction_id( "your_followers" ) ) ); + it.set_owner( g->u.get_faction() ); g->u.i_add( it ); p.op_of_u.owed -= giving[chosen].price; p.add_effect( effect_asked_for_item, 3_hours ); @@ -682,9 +752,7 @@ void talk_function::hostile( npc &p ) add_msg( _( "%s turns hostile!" ), p.name ); } - g->u.add_memorial_log( pgettext( "memorial_male", "%s became hostile." ), - pgettext( "memorial_female", "%s became hostile." ), - p.name ); + g->events().send( p.getID(), p.name ); p.set_attitude( NPCATT_KILL ); } @@ -719,10 +787,10 @@ void talk_function::drop_stolen_item( npc &p ) { for( auto &elem : g->u.inv_dump() ) { if( elem->get_old_owner() ) { - if( elem->get_old_owner()->id.str() == p.my_fac->id.str() ) { + if( elem->get_old_owner() == p.get_faction() ) { item to_drop = g->u.i_rem( elem ); to_drop.remove_old_owner(); - to_drop.set_owner( p.my_fac ); + to_drop.set_owner( p.get_faction() ); g->m.add_item_or_charges( g->u.pos(), to_drop ); } } diff --git a/src/npctrade.cpp b/src/npctrade.cpp index e7e3ed4b7f4ae..358ebc3c5c706 100644 --- a/src/npctrade.cpp +++ b/src/npctrade.cpp @@ -35,9 +35,10 @@ const skill_id skill_barter( "barter" ); void npc_trading::transfer_items( std::vector &stuff, player &giver, - player &receiver, faction *fac, - std::list &from_map, bool npc_gives ) + player &receiver, std::list &from_map, + bool npc_gives ) { + faction *fac = receiver.get_faction(); for( item_pricing &ip : stuff ) { if( !ip.selected ) { continue; @@ -139,17 +140,23 @@ std::vector npc_trading::init_buying( player &buyer, player &selle np_p = dynamic_cast( &seller ); } npc &np = *np_p; - faction *fac = np.my_fac; + faction *fac = np.get_faction(); double adjust = net_price_adjustment( buyer, seller ); - const auto check_item = [fac, adjust, is_npc, &np, &result]( item_location && loc, int count = 1 ) { + const auto check_item = [fac, adjust, is_npc, &np, &result, &seller]( item_location && + loc, int count = 1 ) { item *it_ptr = loc.get_item(); if( it_ptr == nullptr || it_ptr->is_null() ) { return; } - item &it = *it_ptr; + + // Don't sell items we don't own. + if( it.has_owner() && it.get_owner() != seller.get_faction() ) { + return; + } + const int market_price = it.price( true ); int val = np.value( it, market_price ); if( ( is_npc && np.wants_to_sell( it, val, market_price ) ) || @@ -168,7 +175,7 @@ std::vector npc_trading::init_buying( player &buyer, player &selle check_item( item_location( seller, &seller.weapon ), 1 ); } - for( map_cursor &cursor : map_selector( seller.pos(), 1 ) ) { + for( map_cursor &cursor : map_selector( seller.pos(), PICKUP_RANGE ) ) { buy_helper( cursor, check_item ); } for( vehicle_cursor &cursor : vehicle_selector( seller.pos(), 1 ) ) { @@ -590,10 +597,8 @@ bool npc_trading::trade( npc &np, int cost, const std::string &deal ) std::list from_map; - npc_trading::transfer_items( trade_win.yours, g->u, np, np.my_fac, from_map, false ); - npc_trading::transfer_items( trade_win.theirs, np, g->u, - g->faction_manager_ptr->get( faction_id( "your_followers" ) ), - from_map, true ); + npc_trading::transfer_items( trade_win.yours, g->u, np, from_map, false ); + npc_trading::transfer_items( trade_win.theirs, np, g->u, from_map, true ); for( item_location *loc_ptr : from_map ) { loc_ptr->remove_item(); diff --git a/src/npctrade.h b/src/npctrade.h index 7dcadfc24141d..1413656975fde 100644 --- a/src/npctrade.h +++ b/src/npctrade.h @@ -95,7 +95,7 @@ bool pay_npc( npc &np, int cost ); int cash_to_favor( const npc &, int cash ); void transfer_items( std::vector &stuff, player &giver, player &receiver, - faction *fac, std::list &from_map, bool npc_gives ); + std::list &from_map, bool npc_gives ); double net_price_adjustment( const player &buyer, const player &seller ); bool trade( npc &p, int cost, const std::string &deal ); std::vector init_selling( npc &p ); diff --git a/src/omdata.h b/src/omdata.h index 783b8dd02fb1a..7a0cfeb840e0d 100644 --- a/src/omdata.h +++ b/src/omdata.h @@ -65,7 +65,7 @@ const size_t bits = static_cast( -1 ) >> ( CHAR_BIT *sizeof( size_t ) - const std::string &id( type dir ); /** Get Human readable name of a direction */ -const std::string &name( type dir ); +std::string name( type dir ); /** Various rotations. */ point rotate( const point &p, type dir ); diff --git a/src/options.cpp b/src/options.cpp index c72ebdb729432..8af44f84eb47d 100644 --- a/src/options.cpp +++ b/src/options.cpp @@ -880,7 +880,7 @@ static std::vector build_resource_list( } } resource_names.emplace_back( resource_name, - view_name.empty() ? no_translation( resource_name ) : translation( view_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; @@ -899,8 +899,8 @@ std::vector options_manager::build_tilesets_list "gfxdir", "tileset-conf" ); if( tileset_names.empty() ) { - tileset_names.emplace_back( "hoder", translation( "Hoder's" ) ); - tileset_names.emplace_back( "deon", translation( "Deon's" ) ); + tileset_names.emplace_back( "hoder", to_translation( "Hoder's" ) ); + tileset_names.emplace_back( "deon", to_translation( "Deon's" ) ); } return tileset_names; } @@ -935,7 +935,7 @@ std::vector options_manager::build_soundpacks_li // Select default built-in sound pack if( result.empty() ) { - result.emplace_back( "basic", translation( "Basic" ) ); + result.emplace_back( "basic", to_translation( "Basic" ) ); } return result; } @@ -1085,7 +1085,7 @@ void options_manager::add_options_general() add( "AUTO_PULP_BUTCHER", "general", translate_marker( "Auto pulp or butcher" ), translate_marker( "Action to perform when 'Auto pulp or butcher' is enabled. Pulp: Pulp corpses you stand on. - Pulp Adjacent: Also pulp corpses adjacent from you. - Butcher: Butcher corpses you stand on." ), - { { "off", translation( "options", "Disabled" ) }, { "pulp", translate_marker( "Pulp" ) }, { "pulp_adjacent", translate_marker( "Pulp Adjacent" ) }, { "butcher", translate_marker( "Butcher" ) } }, + { { "off", to_translation( "options", "Disabled" ) }, { "pulp", translate_marker( "Pulp" ) }, { "pulp_adjacent", translate_marker( "Pulp Adjacent" ) }, { "butcher", translate_marker( "Butcher" ) } }, "off" ); @@ -1100,7 +1100,7 @@ void options_manager::add_options_general() add( "AUTO_FORAGING", "general", translate_marker( "Auto foraging" ), translate_marker( "Action to perform when 'Auto foraging' is enabled. Bushes: Only forage bushes. - Trees: Only forage trees. - Everything: Forage bushes, trees, and everything else including flowers, cattails etc." ), - { { "off", translation( "options", "Disabled" ) }, { "bushes", translate_marker( "Bushes" ) }, { "trees", translate_marker( "Trees" ) }, { "both", translate_marker( "Everything" ) } }, + { { "off", to_translation( "options", "Disabled" ) }, { "bushes", translate_marker( "Bushes" ) }, { "trees", translate_marker( "Trees" ) }, { "both", translate_marker( "Everything" ) } }, "off" ); diff --git a/src/options.h b/src/options.h index 2910ca5b48e63..04500e7a0f7eb 100644 --- a/src/options.h +++ b/src/options.h @@ -22,7 +22,7 @@ class options_manager { public: id_and_option( const std::string &first, const std::string &second ) - : std::pair( first, translation( second ) ) { + : std::pair( first, to_translation( second ) ) { } id_and_option( const std::string &first, const translation &second ) : std::pair( first, second ) { diff --git a/src/output.cpp b/src/output.cpp index 044ab91a38781..be22da74b5a84 100644 --- a/src/output.cpp +++ b/src/output.cpp @@ -394,14 +394,15 @@ void center_print( const catacurses::window &w, const int y, const nc_color &FG, const std::string &text ) { int window_width = getmaxx( w ); - int string_width = utf8_width( text ); + int string_width = utf8_width( text, true ); int x; if( string_width >= window_width ) { x = 0; } else { x = ( window_width - string_width ) / 2; } - mvwprintz( w, point( x, y ), FG, text ); + const int available_width = std::max( 1, window_width - x ); + trim_and_print( w, point( x, y ), available_width, FG, text ); } int right_print( const catacurses::window &w, const int line, const int right_indent, @@ -715,22 +716,22 @@ void draw_item_filter_rules( const catacurses::window &win, int starty, int heig starty += fold_and_print( win, point( 1, starty ), len, c_white, _( "Separate multiple items with ," ) ); - //~ An example of how to separate multiple items with a comma when filtering items. starty += 1 + fold_and_print( win, point( 1, starty ), len, c_white, + //~ An example of how to separate multiple items with a comma when filtering items. _( "Example: back,flash,aid, ,band" ) ); if( type == item_filter_type::FILTER ) { starty += fold_and_print( win, point( 1, starty ), len, c_white, _( "To exclude items, place - in front." ) ); - //~ An example of how to exclude items with - when filtering items. starty += 1 + fold_and_print( win, point( 1, starty ), len, c_white, + //~ An example of how to exclude items with - when filtering items. _( "Example: -pipe,-chunk,-steel" ) ); } starty += fold_and_print( win, point( 1, starty ), len, c_white, _( "Search [c]ategory, [m]aterial, [q]uality or [d]isassembled components:" ) ); - //~ An example of how to filter items based on category or material. fold_and_print( win, point( 1, starty ), len, c_white, + //~ An example of how to filter items based on category or material. _( "Examples: c:food,m:iron,q:hammering,d:pipe" ) ); wrefresh( win ); } @@ -1695,13 +1696,12 @@ void display_table( const catacurses::window &w, const std::string &title, int c } } -scrollingcombattext::cSCT::cSCT( const int p_iPosX, const int p_iPosY, const direction p_oDir, +scrollingcombattext::cSCT::cSCT( const point &p_pos, const direction p_oDir, const std::string &p_sText, const game_message_type p_gmt, const std::string &p_sText2, const game_message_type p_gmt2, const std::string &p_sType ) { - iPosX = p_iPosX; - iPosY = p_iPosY; + pos = p_pos; sType = p_sType; oDir = p_oDir; @@ -1721,13 +1721,12 @@ scrollingcombattext::cSCT::cSCT( const int p_iPosX, const int p_iPosY, const dir point pairDirXY = direction_XY( oDir ); - iDirX = pairDirXY.x; - iDirY = pairDirXY.y; + dir = pairDirXY; - if( iDirX == 0 && iDirY == 0 ) { + if( dir == point_zero ) { // This would cause infinite loop otherwise oDir = WEST; - iDirX = -1; + dir.x = -1; } iStep = 0; @@ -1789,7 +1788,7 @@ void scrollingcombattext::add( const point &pos, direction p_oDir, iter.advanceStepOffset(); } } - vSCT.insert( vSCT.begin(), cSCT( pos.x, pos.y, p_oDir, p_sText, p_gmt, p_sText2, p_gmt2, + vSCT.insert( vSCT.begin(), cSCT( pos, p_oDir, p_sText, p_gmt, p_sText2, p_gmt2, p_sType ) ); } else { @@ -1800,7 +1799,7 @@ void scrollingcombattext::add( const point &pos, direction p_oDir, iter->advanceStepOffset(); } } - vSCT.push_back( cSCT( pos.x, pos.y, p_oDir, p_sText, p_gmt, p_sText2, p_gmt2, p_sType ) ); + vSCT.push_back( cSCT( pos, p_oDir, p_sText, p_gmt, p_sText2, p_gmt2, p_sType ) ); } } @@ -1866,7 +1865,7 @@ int scrollingcombattext::cSCT::getPosX() const iDirOffset -= getText().length() - 1; } - return iPosX + iDirOffset + ( iDirX * ( ( sType == "hp" ) ? ( getStepOffset() + 1 ) : + return pos.x + iDirOffset + ( dir.x * ( ( sType == "hp" ) ? ( getStepOffset() + 1 ) : ( getStepOffset() * ( iso_mode ? 2 : 1 ) + getStep() ) ) ); } @@ -1894,7 +1893,7 @@ int scrollingcombattext::cSCT::getPosY() const } - return iPosY + iDirOffset + ( iDirY * ( ( iso_mode && sType == "hp" ) ? ( getStepOffset() + 1 ) : + return pos.y + iDirOffset + ( dir.y * ( ( iso_mode && sType == "hp" ) ? ( getStepOffset() + 1 ) : ( getStepOffset() * ( iso_mode ? 2 : 1 ) + getStep() ) ) ); } diff --git a/src/output.h b/src/output.h index 8360965094008..8fb8285dd58cb 100644 --- a/src/output.h +++ b/src/output.h @@ -645,18 +645,18 @@ std::string enumerate_as_string( const _Container &values, * @return String containing enumerated elements in format: "a, b, c, ..., and z". Uses the Oxford comma. * @param first Iterator pointing to the first element. * @param last Iterator pointing to the last element. - * @param pred Predicate that accepts an element and returns a representing string. + * @param string_for Function that accepts an element and returns a representing string. * May return an empty string to omit the element. * @param conj Choose how to separate the last elements. */ -template -std::string enumerate_as_string( _FIter first, _FIter last, _Predicate pred, +template +std::string enumerate_as_string( _FIter first, _FIter last, F string_for, enumeration_conjunction conj = enumeration_conjunction::and_ ) { std::vector values; values.reserve( static_cast( std::distance( first, last ) ) ); for( _FIter iter = first; iter != last; ++iter ) { - const std::string str( pred( *iter ) ); + const std::string str( string_for( *iter ) ); if( !str.empty() ) { values.push_back( str ); } @@ -727,12 +727,10 @@ class scrollingcombattext class cSCT { private: - int iPosX; - int iPosY; + point pos; direction oDir; direction oUp, oUpRight, oRight, oDownRight, oDown, oDownLeft, oLeft, oUpLeft; - int iDirX; - int iDirY; + point dir; int iStep; int iStepOffset; std::string sText; @@ -743,7 +741,7 @@ class scrollingcombattext bool iso_mode; public: - cSCT( int p_iPosX, int p_iPosY, direction p_oDir, + cSCT( const point &pos, direction p_oDir, const std::string &p_sText, game_message_type p_gmt, const std::string &p_sText2 = "", game_message_type p_gmt2 = m_neutral, const std::string &p_sType = "" ); @@ -766,10 +764,10 @@ class scrollingcombattext return oDir; } int getInitPosX() const { - return iPosX; + return pos.x; } int getInitPosY() const { - return iPosY; + return pos.y; } std::string getType() const { return sType; @@ -843,11 +841,11 @@ void refresh_display(); * Assigns a custom color to each symbol. * * @param str String to colorize symbols in - * @param func Function that accepts symbols (std::string::value_type) and returns colors. + * @param color_of Function that accepts symbols (std::string::value_type) and returns colors. * @return Colorized string. */ -template -std::string colorize_symbols( const std::string &str, Pred func ) +template +std::string colorize_symbols( const std::string &str, F color_of ) { std::ostringstream res; nc_color prev_color = c_unset; @@ -859,7 +857,7 @@ std::string colorize_symbols( const std::string &str, Pred func ) }; for( const auto &elem : str ) { - const nc_color new_color = func( elem ); + const nc_color new_color = color_of( elem ); if( prev_color != new_color ) { closing_tag(); diff --git a/src/overmap.cpp b/src/overmap.cpp index 6fdf1bc8888d5..3e3cc81b37a30 100644 --- a/src/overmap.cpp +++ b/src/overmap.cpp @@ -775,8 +775,6 @@ bool oter_t::is_hardcoded() const "office_tower_1_entrance", "office_tower_b", "office_tower_b_entrance", - "silo", - "silo_finale", "slimepit", "slimepit_down", "spider_pit_under", @@ -1493,6 +1491,12 @@ bool overmap::generate_sub( const int z ) //oter_id oter_sewer = ter(i, j, -1); //oter_id oter_underground = ter(i, j, -2); + if( is_ot_match( "microlab_sub_connector", ter( p ), ot_match_type::type ) ) { + om_direction::type rotation = ter( p )->get_dir(); + ter( p ) = oter_id( "subway_end_north" )->get_rotated( rotation );; + subway_points.emplace_back( p.xy() ); + } + // implicitly skip skip_above oter_ids bool skipme = false; for( auto &elem : skip_above ) { @@ -1531,7 +1535,7 @@ bool overmap::generate_sub( const int z ) mongroup_id ant_group( oter_above == "anthill" ? "GROUP_ANT" : "GROUP_ANT_ACID" ); int size = rng( MIN_ANT_SIZE, MAX_ANT_SIZE ); ant_points.push_back( city( p.xy(), size ) ); - add_mon_group( mongroup( ant_group, i * 2, j * 2, z, + add_mon_group( mongroup( ant_group, tripoint( i * 2, j * 2, z ), ( size * 3 ) / 2, rng( 6000, 8000 ) ) ); } else if( oter_above == "slimepit_down" ) { int size = rng( MIN_GOO_SIZE, MAX_GOO_SIZE ); @@ -1569,7 +1573,7 @@ bool overmap::generate_sub( const int z ) ter( q ) = oter_id( "spiral" ); } ter( p ) = oter_id( "spiral_hub" ); - add_mon_group( mongroup( mongroup_id( "GROUP_SPIRAL" ), i * 2, j * 2, z, 2, 200 ) ); + add_mon_group( mongroup( mongroup_id( "GROUP_SPIRAL" ), tripoint( i * 2, j * 2, z ), 2, 200 ) ); } else if( oter_above == "silo" ) { // NOLINTNEXTLINE(misc-redundant-expression) if( rng( 2, 7 ) < abs( z ) || rng( 2, 7 ) < abs( z ) ) { @@ -1959,7 +1963,7 @@ void overmap::move_hordes() if( this_monster.will_join_horde( add_to_horde_size ) ) { // If there is no horde to add the monster to, create one. if( add_to_group == nullptr ) { - mongroup m( GROUP_ZOMBIE, p.x, p.y, p.z, 1, 0 ); + mongroup m( GROUP_ZOMBIE, p, 1, 0 ); m.horde = true; m.monsters.push_back( this_monster ); m.interest = 0; // Ensures that we will select a new target. @@ -3373,8 +3377,15 @@ pf::path overmap::lay_out_street( const overmap_connection &connection, const po void overmap::build_connection( const overmap_connection &connection, const pf::path &path, int z, const om_direction::type &initial_dir ) { + if( path.nodes.empty() ) { + return; + } + om_direction::type prev_dir = initial_dir; + const pf::node start = path.nodes.front(); + const pf::node end = path.nodes.back(); + for( const auto &node : path.nodes ) { const tripoint pos( node.pos, z ); auto &ter_id( ter( pos ) ); @@ -3419,9 +3430,23 @@ void overmap::build_connection( const overmap_connection &connection, const pf:: new_line = om_lines::set_segment( new_line, dir ); } } - } else { - // Always connect to outbound tiles. + } else if( pos.xy() == start.pos || pos.xy() == end.pos ) { + // Only automatically connect to out of bounds locations if we're the start or end of this path. new_line = om_lines::set_segment( new_line, dir ); + + // Special handling for the "local_roads" connection type for now--they get added to the collection of + // roads out of this overmap. A future enhancement is to make that a bit more generic and maintain a + // set of out connections for all connection types. + if( connection.id == string_id( "local_road" ) ) { + const auto existing_out = std::find_if( roads_out.begin(), + roads_out.end(), [pos]( const city & c ) { + return c.pos == pos.xy(); + } ); + + if( existing_out == roads_out.end() ) { + roads_out.emplace_back( city( pos.xy() ) ); + } + } } } @@ -3457,8 +3482,7 @@ void overmap::connect_closest_points( const std::vector &points, int z, int closest = -1; int k = 0; for( size_t j = i + 1; j < points.size(); j++ ) { - const int distance = trig_dist( point( points[i].x, points[i].y ), point( points[j].x, - points[j].y ) ); + const int distance = trig_dist( points[i], points[j] ); if( distance < closest || closest < 0 ) { closest = distance; k = j; @@ -3620,13 +3644,15 @@ const std::string &om_direction::id( type dir ) return ids[static_cast( dir ) + 1]; } -const std::string &om_direction::name( type dir ) +std::string om_direction::name( type dir ) { static const std::array < std::string, size + 1 > names = {{ - _( "invalid" ), _( "north" ), _( "east" ), _( "south" ), _( "west" ) + translate_marker( "invalid" ), translate_marker( "north" ), + translate_marker( "east" ), translate_marker( "south" ), + translate_marker( "west" ) } }; - return names[static_cast( dir ) + 1]; + return _( names[static_cast( dir ) + 1] ); } // new x = (x-c.x)*cos() - (y-c.y)*sin() + c.x @@ -3859,7 +3885,7 @@ void overmap::place_special( const overmap_special &special, const tripoint &p, const overmap_special_spawns &spawns = special.spawns; const int pop = rng( spawns.population.min, spawns.population.max ); const int rad = rng( spawns.radius.min, spawns.radius.max ); - add_mon_group( mongroup( spawns.group, p.x * 2, p.y * 2, p.z, rad, pop ) ); + add_mon_group( mongroup( spawns.group, tripoint( p.x * 2, p.y * 2, p.z ), rad, pop ) ); } // Place basement for houses. if( special.id == "FakeSpecial_house" && one_in( settings.city_spec.house_basement_chance ) ) { @@ -4097,7 +4123,8 @@ void overmap::place_mongroups() for( auto &elem : cities ) { if( get_option( "WANDER_SPAWNS" ) ) { if( !one_in( 16 ) || elem.size > 5 ) { - mongroup m( mongroup_id( "GROUP_ZOMBIE" ), ( elem.pos.x * 2 ), ( elem.pos.y * 2 ), 0, + mongroup m( mongroup_id( "GROUP_ZOMBIE" ), + tripoint( elem.pos.x * 2, elem.pos.y * 2, 0 ), static_cast( elem.size * 2.5 ), elem.size * 80 ); // m.set_target( zg.back().posx, zg.back().posy ); @@ -4121,7 +4148,7 @@ void overmap::place_mongroups() } } if( swamp_count >= 25 ) { - add_mon_group( mongroup( mongroup_id( "GROUP_SWAMP" ), x * 2, y * 2, 0, 3, + add_mon_group( mongroup( mongroup_id( "GROUP_SWAMP" ), tripoint( x * 2, y * 2, 0 ), 3, rng( swamp_count * 8, swamp_count * 25 ) ) ); } } @@ -4140,7 +4167,7 @@ void overmap::place_mongroups() } } if( river_count >= 25 ) { - add_mon_group( mongroup( mongroup_id( "GROUP_RIVER" ), x * 2, y * 2, 0, 3, + add_mon_group( mongroup( mongroup_id( "GROUP_RIVER" ), tripoint( x * 2, y * 2, 0 ), 3, rng( river_count * 8, river_count * 25 ) ) ); } } @@ -4149,8 +4176,8 @@ void overmap::place_mongroups() // Place the "put me anywhere" groups int numgroups = rng( 0, 3 ); for( int i = 0; i < numgroups; i++ ) { - add_mon_group( mongroup( mongroup_id( "GROUP_WORM" ), rng( 0, OMAPX * 2 - 1 ), rng( 0, - OMAPY * 2 - 1 ), 0, + add_mon_group( mongroup( mongroup_id( "GROUP_WORM" ), tripoint( rng( 0, OMAPX * 2 - 1 ), rng( 0, + OMAPY * 2 - 1 ), 0 ), rng( 20, 40 ), rng( 30, 50 ) ) ); } } @@ -4175,8 +4202,8 @@ void overmap::place_radios() int choice = rng( 0, 2 ); switch( choice ) { case 0: - message = string_format( _( "This is emergency broadcast station %d%d.\ - Please proceed quickly and calmly to your designated evacuation point." ), i, j ); + message = string_format( _( "This is emergency broadcast station %d%d." + " Please proceed quickly and calmly to your designated evacuation point." ), i, j ); radios.push_back( radio_tower( pos_sm, strength(), message ) ); break; case 1: @@ -4188,13 +4215,13 @@ void overmap::place_radios() break; } } else if( ter( pos_omt ) == "lmoe" ) { - message = string_format( _( "This is automated emergency shelter beacon %d%d.\ - Supplies, amenities and shelter are stocked." ), i, j ); + message = string_format( _( "This is automated emergency shelter beacon %d%d." + " Supplies, amenities and shelter are stocked." ), i, j ); radios.push_back( radio_tower( pos_sm, strength() / 2, message ) ); } else if( ter( pos_omt ) == "fema_entrance" ) { - message = string_format( _( "This is FEMA camp %d%d.\ - Supplies are limited, please bring supplemental food, water, and bedding.\ - This is FEMA camp %d%d. A designated long-term emergency shelter." ), i, j, i, j ); + message = string_format( _( "This is FEMA camp %d%d." + " Supplies are limited, please bring supplemental food, water, and bedding." + " This is FEMA camp %d%d. A designated long-term emergency shelter." ), i, j, i, j ); radios.push_back( radio_tower( pos_sm, strength(), message ) ); } } diff --git a/src/overmap_ui.cpp b/src/overmap_ui.cpp index ee048107e0754..8acda700f991c 100644 --- a/src/overmap_ui.cpp +++ b/src/overmap_ui.cpp @@ -774,7 +774,7 @@ void draw( const catacurses::window &w, const catacurses::window &wbar, const tr point marker = clamp_half_open( target.xy(), screen_bounds ) - corner.xy(); std::string marker_sym = " "; - switch( direction_from( center, target ) ) { + switch( direction_from( center.xy(), target.xy() ) ) { case NORTH: marker_sym = "^"; break; diff --git a/src/overmapbuffer.cpp b/src/overmapbuffer.cpp index 1b1c2678ffea3..62d0d6afceed0 100644 --- a/src/overmapbuffer.cpp +++ b/src/overmapbuffer.cpp @@ -695,17 +695,21 @@ std::vector overmapbuffer::get_npc_path( const tripoint &src, const tr int res = 0; const oter_id oter = get_ter_at( cur.pos ); int travel_cost = static_cast( oter->get_travel_cost() ); - if( ( road_only && ( oter->get_name() != "road" && oter->get_name() != "bridge" ) ) || - ( oter->get_name() == "solid rock" || - oter->get_name() == "open air" ) ) { + if( road_only && ( !is_ot_match( "road", oter, ot_match_type::type ) && + !is_ot_match( "bridge", oter, ot_match_type::type ) ) ) { return pf::rejected; - } else if( oter->get_name() == "forest" ) { + } + if( is_ot_match( "empty_rock", oter, ot_match_type::type ) || + is_ot_match( "open_air", oter, ot_match_type::type ) || oter->is_lake() ) { + return pf::rejected; + } else if( is_ot_match( "forest", oter, ot_match_type::type ) ) { travel_cost = 10; - } else if( oter->get_name() == "swamp" ) { + } else if( is_ot_match( "forest_water", oter, ot_match_type::type ) ) { travel_cost = 15; - } else if( oter->get_name() == "road" || oter->get_name() == "bridge" ) { + } else if( is_ot_match( "road", oter, ot_match_type::type ) || + is_ot_match( "bridge", oter, ot_match_type::type ) ) { travel_cost = 1; - } else if( oter->get_name() == "river" ) { + } else if( is_river( oter ) ) { travel_cost = 20; } res += travel_cost; @@ -1265,7 +1269,7 @@ std::string overmapbuffer::get_description_at( const tripoint &where ) const int sm_dist = closest_cref.distance; //~ First parameter is a terrain name, second parameter is a direction, and third parameter is a city name. - std::string format_string = "%1$s %2$s from %3$s"; + std::string format_string = _( "%1$s %2$s from %3$s" ); if( sm_dist <= 3 * sm_size / 4 ) { if( sm_size >= 16 ) { // The city is big enough to be split in districts. diff --git a/src/panels.cpp b/src/panels.cpp index cb10a8e3b6811..49a78dfd9e48c 100644 --- a/src/panels.cpp +++ b/src/panels.cpp @@ -1400,7 +1400,7 @@ static void draw_weapon_labels( const avatar &u, const catacurses::window &w ) // NOLINTNEXTLINE(cata-use-named-point-constants) mvwprintz( w, point( 1, 1 ), c_light_gray, _( "Style:" ) ); print_colored_text( w, point( 8, 0 ), color, c_light_gray, u.weapname( getmaxx( w ) - 8 ) ); - mvwprintz( w, point( 8, 1 ), c_light_gray, u.get_combat_style().name ); + mvwprintz( w, point( 8, 1 ), c_light_gray, "%s", u.get_combat_style().name.translated() ); wrefresh( w ); } @@ -1427,7 +1427,7 @@ static void draw_needs_narrow( const avatar &u, const catacurses::window &w ) wrefresh( w ); } -static void draw_needs_wide( const avatar &u, const catacurses::window &w ) +static void draw_needs_labels( const avatar &u, const catacurses::window &w ) { werase( w ); std::pair hunger_pair = u.get_hunger_description(); @@ -1436,19 +1436,21 @@ static void draw_needs_wide( const avatar &u, const catacurses::window &w ) std::pair temp_pair = temp_stat( u ); std::pair pain_pair = u.get_pain_description(); // NOLINTNEXTLINE(cata-use-named-point-constants) - mvwprintz( w, point( 1, 0 ), c_light_gray, _( "Rest :" ) ); - mvwprintz( w, point( 16, 0 ), c_light_gray, _( "Pain :" ) ); - mvwprintz( w, point( 31, 0 ), c_light_gray, _( "Heat :" ) ); + mvwprintz( w, point( 1, 0 ), c_light_gray, _( "Pain :" ) ); + mvwprintz( w, point( 8, 0 ), pain_pair.second, pain_pair.first ); + mvwprintz( w, point( 23, 0 ), c_light_gray, _( "Drink:" ) ); + mvwprintz( w, point( 30, 0 ), thirst_pair.second, thirst_pair.first ); + // NOLINTNEXTLINE(cata-use-named-point-constants) - mvwprintz( w, point( 1, 1 ), c_light_gray, _( "Food :" ) ); - mvwprintz( w, point( 23, 1 ), c_light_gray, _( "Drink:" ) ); - mvwprintz( w, point( 8, 0 ), rest_pair.second, rest_pair.first ); - mvwprintz( w, point( 23, 0 ), pain_pair.second, pain_pair.first ); - mvwprintz( w, point( 38, 0 ), temp_pair.first, temp_pair.second ); - mvwprintz( w, point( 8, 1 ), hunger_pair.second, hunger_pair.first ); - mvwprintz( w, point( 30, 1 ), thirst_pair.second, thirst_pair.first ); + mvwprintz( w, point( 1, 1 ), c_light_gray, _( "Rest :" ) ); + mvwprintz( w, point( 8, 1 ), rest_pair.second, rest_pair.first ); + mvwprintz( w, point( 23, 1 ), c_light_gray, _( "Food :" ) ); + mvwprintz( w, point( 30, 1 ), hunger_pair.second, hunger_pair.first ); + mvwprintz( w, point( 1, 2 ), c_light_gray, _( "Heat :" ) ); + mvwprintz( w, point( 8, 2 ), temp_pair.first, temp_pair.second ); wrefresh( w ); } + static void draw_env_compact( avatar &u, const catacurses::window &w ) { werase( w ); @@ -1458,7 +1460,7 @@ static void draw_env_compact( avatar &u, const catacurses::window &w ) nc_color color = c_light_gray; print_colored_text( w, point( 8, 0 ), color, c_light_gray, u.weapname( getmaxx( w ) - 8 ) ); // style - mvwprintz( w, point( 8, 1 ), c_light_gray, u.get_combat_style().name ); + mvwprintz( w, point( 8, 1 ), c_light_gray, "%s", u.get_combat_style().name.translated() ); // location mvwprintz( w, point( 8, 2 ), c_white, utf8_truncate( overmap_buffer.ter( u.global_omt_location() )->get_name(), getmaxx( w ) - 8 ) ); @@ -1841,7 +1843,7 @@ static void draw_weapon_classic( const avatar &u, const catacurses::window &w ) const auto &cur_style = u.style_selected.obj(); if( !u.weapon.is_gun() ) { if( cur_style.force_unarmed || cur_style.weapon_valid( u.weapon ) ) { - style = _( cur_style.name ); + style = cur_style.name.translated(); } else if( u.is_armed() ) { style = _( "Normal" ); } else { @@ -2040,7 +2042,7 @@ static std::vector initialize_default_label_panels() ret.emplace_back( window_panel( draw_wind_padding, translate_marker( "Wind" ), 1, 44, false ) ); ret.emplace_back( window_panel( draw_loc_wide, translate_marker( "Location Alt" ), 5, 44, false ) ); ret.emplace_back( window_panel( draw_weapon_labels, translate_marker( "Weapon" ), 2, 44, true ) ); - ret.emplace_back( window_panel( draw_needs_wide, translate_marker( "Needs" ), 2, 44, true ) ); + ret.emplace_back( window_panel( draw_needs_labels, translate_marker( "Needs" ), 3, 44, true ) ); ret.emplace_back( window_panel( draw_messages, translate_marker( "Log" ), -2, 44, true ) ); ret.emplace_back( window_panel( draw_moon_wide, translate_marker( "Moon" ), 1, 44, false ) ); ret.emplace_back( window_panel( draw_armor_padding, translate_marker( "Armor" ), 5, 44, false ) ); @@ -2239,8 +2241,7 @@ void panel_manager::draw_adm( const catacurses::window &w, size_t column, size_t if( redraw ) { redraw = false; werase( w ); - static const std::string title = _( "SIDEBAR OPTIONS" ); - decorate_panel( title, w ); + decorate_panel( _( "SIDEBAR OPTIONS" ), w ); // clear the panel list for( int i = 1; i <= 18; i++ ) { for( int j = 1; j <= column_widths[0]; j++ ) { diff --git a/src/pickup.cpp b/src/pickup.cpp index f8a575903bcba..1a86504edd19b 100644 --- a/src/pickup.cpp +++ b/src/pickup.cpp @@ -52,6 +52,7 @@ #include "map_selector.h" #include "pimpl.h" #include "point.h" +#include "popup.h" using ItemCount = std::pair; using PickupMap = std::map; @@ -170,6 +171,51 @@ static pickup_answer handle_problematic_pickup( const item &it, bool &offered_sw return static_cast( choice ); } +bool Pickup::query_thief() +{ + player &u = g->u; + bool force_uc = get_option( "FORCE_CAPITAL_YN" ); + const auto allow_key = [force_uc]( const input_event & evt ) { + return !force_uc || evt.type != CATA_INPUT_KEYBOARD || + // std::lower is undefined outside unsigned char range + evt.get_first_input() < 'a' || evt.get_first_input() > 'z'; + }; + std::string answer = query_popup() + .allow_cancel( false ) + .context( "YES_NO_ALWAYS_NEVER" ) + .message( "%s", + _( "Picking up this item will be considered stealing, continue?" ) ) + .option( "YES", allow_key ) // yes, steal all items in this location that is selected + .option( "NO", allow_key ) // no, pick up only what is free + .option( "ALWAYS", allow_key ) // Yes, steal all items and stop asking me this question + .option( "NEVER", allow_key ) // no, only grab free item and never ask me again + .cursor( 1 ) // default to the second option `NO` + .query() + .action; // retrieve the input action + if( answer == "YES" ) { + u.set_value( "THIEF_MODE", "THIEF_STEAL" ); + u.set_value( "THIEF_MODE_KEEP", "NO" ); + return true; + } else if( answer == "NO" ) { + u.set_value( "THIEF_MODE", "THIEF_HONEST" ); + u.set_value( "THIEF_MODE_KEEP", "NO" ); + return false; + } else if( answer == "ALWAYS" ) { + u.set_value( "THIEF_MODE", "THIEF_STEAL" ); + u.set_value( "THIEF_MODE_KEEP", "YES" ); + return true; + } else if( answer == "NEVER" ) { + u.set_value( "THIEF_MODE", "THIEF_HONEST" ); + u.set_value( "THIEF_MODE_KEEP", "YES" ); + return false; + } else { + // error + debugmsg( "Not a valid option [ %s ]", answer ); + return false; + } + return false; +} + // Returns false if pickup caused a prompt and the player selected to cancel pickup bool pick_one_up( item_location &loc, int quantity, bool &got_water, bool &offered_swap, PickupMap &mapPickup, bool autopickup ) @@ -189,10 +235,15 @@ bool pick_one_up( item_location &loc, int quantity, bool &got_water, bool &offer item leftovers = newit; const auto wield_check = u.can_wield( newit ); + if( newit.has_owner() && newit.get_owner() != g->faction_manager_ptr->get( faction_id( "your_followers" ) ) ) { - if( !query_yn( "Picking up this item will be considered stealing, continue?" ) ) { - return false; + // Has the player given input on if stealing is ok? + if( u.get_value( "THIEF_MODE" ) == "THIEF_ASK" ) { + Pickup::query_thief(); + } + if( u.get_value( "THIEF_MODE" ) == "THIEF_HONEST" ) { + return true; // Since we are honest, return no problem before picking up } } if( newit.invlet != '\0' && @@ -799,7 +850,7 @@ void Pickup::pick_up( const tripoint &p, int min, from_where get_items_from ) bool stealing = false; if( this_item.has_owner() ) { const faction *item_fac = this_item.get_owner(); - if( item_fac != g->faction_manager_ptr->get( faction_id( "your_followers" ) ) ) { + if( item_fac != g->u.get_faction() ) { stolen = "!"; stealing = true; } @@ -1038,9 +1089,9 @@ int Pickup::cost_to_move_item( const Character &who, const item &it ) // No free hand? That will cost you extra ret += 20; } - + const int delta_weight = units::to_gram( it.weight() - who.weight_capacity() ); // Is it too heavy? It'll take 10 moves per kg over limit - ret += std::max( 0, ( it.weight() - who.weight_capacity() ) / 100_gram ); + ret += std::max( 0, delta_weight / 100 ); // Keep it sane - it's not a long activity return std::min( 400, ret ); diff --git a/src/pickup.h b/src/pickup.h index 345587609b6e1..387efeda01423 100644 --- a/src/pickup.h +++ b/src/pickup.h @@ -18,12 +18,14 @@ namespace Pickup */ bool do_pickup( std::vector &targets, std::vector &quantities, bool autopickup ); +bool query_thief(); enum from_where : int { from_cargo = 0, from_ground, prompt }; + /** Pick up items; 'g' or ',' or via examine() */ void pick_up( const tripoint &p, int min, from_where get_items_from = prompt ); /** Determines the cost of moving an item by a character. */ diff --git a/src/player.cpp b/src/player.cpp index 26bf6ffa77439..300739cb90ff7 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -24,9 +24,11 @@ #include "catacharset.h" #include "coordinate_conversions.h" #include "craft_command.h" +#include "creature_tracker.h" #include "cursesdef.h" #include "debug.h" #include "effect.h" +#include "event_bus.h" #include "fault.h" #include "filesystem.h" #include "fungal_effects.h" @@ -45,6 +47,7 @@ #include "mapdata.h" #include "martialarts.h" #include "material.h" +#include "memorial_logger.h" #include "messages.h" #include "monster.h" #include "morale.h" @@ -148,6 +151,7 @@ const efftype_id effect_glowing( "glowing" ); const efftype_id effect_glowy_led( "glowy_led" ); const efftype_id effect_got_checked( "got_checked" ); const efftype_id effect_grabbed( "grabbed" ); +const efftype_id effect_grabbing( "grabbing" ); const efftype_id effect_hallu( "hallu" ); const efftype_id effect_happy( "happy" ); const efftype_id effect_hot( "hot" ); @@ -171,6 +175,7 @@ const efftype_id effect_pkill2( "pkill2" ); const efftype_id effect_pkill3( "pkill3" ); const efftype_id effect_recover( "recover" ); const efftype_id effect_riding( "riding" ); +const efftype_id effect_ridden( "ridden" ); const efftype_id effect_sad( "sad" ); const efftype_id effect_shakes( "shakes" ); const efftype_id effect_sleep( "sleep" ); @@ -187,7 +192,9 @@ const efftype_id effect_weed_high( "weed_high" ); const efftype_id effect_winded( "winded" ); const efftype_id effect_bleed( "bleed" ); const efftype_id effect_magnesium_supplements( "magnesium" ); -const efftype_id effect_ridden( "ridden" ); +const efftype_id effect_harnessed( "harnessed" ); +const efftype_id effect_pet( "pet" ); +const efftype_id effect_tied( "tied" ); const matype_id style_none( "style_none" ); const matype_id style_kicks( "style_kicks" ); @@ -514,12 +521,12 @@ player::player() : nv_cached = false; volume = 0; + set_value( "THIEF_MODE", "THIEF_ASK" ); + for( const auto &v : vitamin::all() ) { vitamin_levels[ v.first ] = 0; } - memorial_log.clear(); - drench_capacity[bp_eyes] = 1; drench_capacity[bp_mouth] = 1; drench_capacity[bp_head] = 7; @@ -1816,23 +1823,34 @@ bool player::is_immune_damage( const damage_type dt ) const case DT_TRUE: return false; case DT_BIOLOGICAL: - return false; + return has_effect_with_flag( "EFFECT_BIO_IMMUNE" ) || + worn_with_flag( "BIO_IMMUNE" ); case DT_BASH: - return false; + return has_effect_with_flag( "EFFECT_BASH_IMMUNE" ) || + worn_with_flag( "BASH_IMMUNE" ); case DT_CUT: - return false; + return has_effect_with_flag( "EFFECT_CUT_IMMUNE" ) || + worn_with_flag( "CUT_IMMUNE" ); case DT_ACID: - return has_trait( trait_ACIDPROOF ); + return has_trait( trait_ACIDPROOF ) || + has_effect_with_flag( "EFFECT_ACID_IMMUNE" ) || + worn_with_flag( "ACID_IMMUNE" ); case DT_STAB: - return false; + return has_effect_with_flag( "EFFECT_STAB_IMMUNE" ) || + worn_with_flag( "STAB_IMMUNE" ); case DT_HEAT: - return has_trait( trait_M_SKIN2 ) || has_trait( trait_M_SKIN3 ); + return has_trait( trait_M_SKIN2 ) || + has_trait( trait_M_SKIN3 ) || + has_effect_with_flag( "EFFECT_HEAT_IMMUNE" ) || + worn_with_flag( "HEAT_IMMUNE" ); case DT_COLD: - return false; + return has_effect_with_flag( "EFFECT_COLD_IMMUNE" ) || + worn_with_flag( "COLD_IMMUNE" ); case DT_ELECTRIC: return has_active_bionic( bio_faraday ) || worn_with_flag( "ELECTRIC_IMMUNE" ) || - has_artifact_with( AEP_RESIST_ELECTRICITY ); + has_artifact_with( AEP_RESIST_ELECTRICITY ) || + has_effect_with_flag( "EFFECT_ELECTRIC_IMMUNE" ); default: return true; } @@ -1897,66 +1915,6 @@ nc_color player::basic_symbol_color() const return c_white; } -/** - * Adds an event to the memorial log, to be written to the memorial file when - * the character dies. The message should contain only the informational string, - * as the timestamp and location will be automatically prepended. - */ -void player::add_memorial_log( const std::string &male_msg, const std::string &female_msg ) -{ - const std::string &msg = male ? male_msg : female_msg; - - if( msg.empty() ) { - return; - } - - const oter_id &cur_ter = overmap_buffer.ter( global_omt_location() ); - const std::string &location = cur_ter->get_name(); - - std::stringstream log_message; - log_message << "| " << to_string( time_point( calendar::turn ) ) << " | " << location << " | " << - msg; - - memorial_log.push_back( log_message.str() ); - -} - -/** - * Loads the data in a memorial file from the given ifstream. All the memorial - * entry lines begin with a pipe (|). - * @param fin The ifstream to read the memorial entries from. - */ -void player::load_memorial_file( std::istream &fin ) -{ - std::string entry; - memorial_log.clear(); - while( fin.peek() == '|' ) { - getline( fin, entry ); - // strip all \r from end of string - while( *entry.rbegin() == '\r' ) { - entry.pop_back(); - } - memorial_log.push_back( entry ); - } -} - -/** - * Concatenates all of the memorial log entries, delimiting them with newlines, - * and returns the resulting string. Used for saving and for writing out to the - * memorial file. - */ -std::string player::dump_memorial() const -{ - static const char *eol = cata_files::eol(); - std::stringstream output; - - for( auto &elem : memorial_log ) { - output << elem << eol; - } - - return output.str(); -} - void player::mod_stat( const std::string &stat, float modifier ) { if( stat == "thirst" ) { @@ -3087,7 +3045,8 @@ dealt_damage_instance player::deal_damage( Creature *source, body_part bp, //looks like this should be based off of dealt damages, not d as d has no damage reduction applied. // Skip all this if the damage isn't from a creature. e.g. an explosion. if( source != nullptr ) { - if( source->has_flag( MF_GRABS ) && !source->is_hallucination() ) { + if( source->has_flag( MF_GRABS ) && !source->is_hallucination() && + !source->has_effect( effect_grabbing ) ) { /** @EFFECT_DEX increases chance to avoid being grabbed, if DEX>STR */ /** @EFFECT_STR increases chance to avoid being grabbed, if STR>DEX */ @@ -3105,6 +3064,7 @@ dealt_damage_instance player::deal_damage( Creature *source, body_part bp, } else { int prev_effect = get_effect_int( effect_grabbed ); add_effect( effect_grabbed, 2_turns, bp_torso, false, prev_effect + 2 ); + source->add_effect( effect_grabbing, 2_turns ); add_msg_player_or_npc( m_bad, _( "You are grabbed by %s!" ), _( " is grabbed by %s!" ), source->disp_name() ); } @@ -3283,11 +3243,10 @@ void player::apply_damage( Creature *source, body_part hurt, int dam, const bool mod_pain( dam / 2 ); - hp_cur[hurtpart] -= dam; - if( hp_cur[hurtpart] < 0 ) { - lifetime_stats.damage_taken += hp_cur[hurtpart]; - hp_cur[hurtpart] = 0; - } + const int dam_to_bodypart = std::min( dam, hp_cur[hurtpart] ); + + hp_cur[hurtpart] -= dam_to_bodypart; + g->events().send( getID(), dam_to_bodypart ); if( hp_cur[hurtpart] <= 0 && ( source == nullptr || !source->is_hallucination() ) ) { if( has_effect( effect_mending, hurt ) ) { @@ -3297,7 +3256,6 @@ void player::apply_damage( Creature *source, body_part hurt, int dam, const bool } } - lifetime_stats.damage_taken += dam; if( dam > get_painkiller() ) { on_hurt( source ); } @@ -3365,12 +3323,9 @@ void player::heal( body_part healed, int dam ) void player::heal( hp_part healed, int dam ) { if( hp_cur[healed] > 0 ) { - hp_cur[healed] += dam; - if( hp_cur[healed] > hp_max[healed] ) { - lifetime_stats.damage_healed -= hp_cur[healed] - hp_max[healed]; - hp_cur[healed] = hp_max[healed]; - } - lifetime_stats.damage_healed += dam; + int effective_heal = std::min( dam, hp_max[healed] - hp_cur[healed] ); + hp_cur[healed] += effective_heal; + g->events().send( getID(), effective_heal ); } } @@ -3391,12 +3346,9 @@ void player::hurtall( int dam, Creature *source, bool disturb /*= true*/ ) for( int i = 0; i < num_hp_parts; i++ ) { const hp_part bp = static_cast( i ); // Don't use apply_damage here or it will annoy the player with 6 queries - hp_cur[bp] -= dam; - lifetime_stats.damage_taken += dam; - if( hp_cur[bp] < 0 ) { - lifetime_stats.damage_taken += hp_cur[bp]; - hp_cur[bp] = 0; - } + const int dam_to_bodypart = std::min( dam, hp_cur[bp] ); + hp_cur[bp] -= dam_to_bodypart; + g->events().send( getID(), dam_to_bodypart ); } // Low pain: damage is spread all over the body, so not as painful as 6 hits in one part @@ -3419,6 +3371,9 @@ int player::hitall( int dam, int vary, Creature *source ) float player::fall_damage_mod() const { + if( has_effect_with_flag( "EFFECT_FEATHER_FALL" ) ) { + return 0.0f; + } float ret = 1.0f; // Ability to land properly is 2x as important as dexterity itself @@ -3875,13 +3830,11 @@ void player::check_needs_extremes() // Check if we've overdosed... in any deadly way. if( stim > 250 ) { add_msg_if_player( m_bad, _( "You have a sudden heart attack!" ) ); - add_memorial_log( pgettext( "memorial_male", "Died of a drug overdose." ), - pgettext( "memorial_female", "Died of a drug overdose." ) ); + g->events().send( getID(), efftype_id() ); hp_cur[hp_torso] = 0; } else if( stim < -200 || get_painkiller() > 240 ) { add_msg_if_player( m_bad, _( "Your breathing stops completely." ) ); - add_memorial_log( pgettext( "memorial_male", "Died of a drug overdose." ), - pgettext( "memorial_female", "Died of a drug overdose." ) ); + g->events().send( getID(), efftype_id() ); hp_cur[hp_torso] = 0; } else if( has_effect( effect_jetinjector ) && get_effect_dur( effect_jetinjector ) > 40_minutes ) { if( !( has_trait( trait_NOPAIN ) ) ) { @@ -3889,18 +3842,15 @@ void player::check_needs_extremes() } else { add_msg_if_player( _( "Your heart spasms and stops." ) ); } - add_memorial_log( pgettext( "memorial_male", "Died of a healing stimulant overdose." ), - pgettext( "memorial_female", "Died of a healing stimulant overdose." ) ); + g->events().send( getID(), effect_jetinjector ); hp_cur[hp_torso] = 0; } else if( get_effect_dur( effect_adrenaline ) > 50_minutes ) { add_msg_if_player( m_bad, _( "Your heart spasms and stops." ) ); - add_memorial_log( pgettext( "memorial_male", "Died of adrenaline overdose." ), - pgettext( "memorial_female", "Died of adrenaline overdose." ) ); + g->events().send( getID(), effect_adrenaline ); hp_cur[hp_torso] = 0; } else if( get_effect_int( effect_drunk ) > 4 ) { add_msg_if_player( m_bad, _( "Your breathing slows down to a stop." ) ); - add_memorial_log( pgettext( "memorial_male", "Died of an alcohol overdose." ), - pgettext( "memorial_female", "Died of an alcohol overdose." ) ); + g->events().send( getID(), effect_drunk ); hp_cur[hp_torso] = 0; } @@ -3908,8 +3858,7 @@ void player::check_needs_extremes() if( is_player() ) { if( get_stored_kcal() <= 0 ) { add_msg_if_player( m_bad, _( "You have starved to death." ) ); - add_memorial_log( pgettext( "memorial_male", "Died of starvation." ), - pgettext( "memorial_female", "Died of starvation." ) ); + g->events().send( getID() ); hp_cur[hp_torso] = 0; } else { if( calendar::once_every( 1_hours ) ) { @@ -3931,8 +3880,7 @@ void player::check_needs_extremes() guts.get_water() == 0_ml ) ) { if( get_thirst() >= 1200 ) { add_msg_if_player( m_bad, _( "You have died of dehydration." ) ); - add_memorial_log( pgettext( "memorial_male", "Died of thirst." ), - pgettext( "memorial_female", "Died of thirst." ) ); + g->events().send( getID() ); hp_cur[hp_torso] = 0; } else if( get_thirst() >= 1000 && calendar::once_every( 30_minutes ) ) { add_msg_if_player( m_warning, _( "Even your eyes feel dry..." ) ); @@ -3947,8 +3895,7 @@ void player::check_needs_extremes() if( get_fatigue() >= EXHAUSTED + 25 && !in_sleep_state() ) { if( get_fatigue() >= MASSIVE_FATIGUE ) { add_msg_if_player( m_bad, _( "Survivor sleep now." ) ); - add_memorial_log( pgettext( "memorial_male", "Succumbed to lack of sleep." ), - pgettext( "memorial_female", "Succumbed to lack of sleep." ) ); + g->events().send( getID() ); mod_fatigue( -10 ); fall_asleep(); } else if( get_fatigue() >= 800 && calendar::once_every( 30_minutes ) ) { @@ -4242,26 +4189,22 @@ void player::update_needs( int rate_multiplier ) if( has_bionic( bn_bio_solar ) ) { charge_power( rate_multiplier * 25 ); } - if( has_active_bionic( bionic_id( "bio_cable" ) ) ) { - if( is_wearing( "solarpack_on" ) ) { - charge_power( rate_multiplier * 25 ); - } - if( is_wearing( "q_solarpack_on" ) ) { - charge_power( rate_multiplier * 50 ); - } - } } // Huge folks take penalties for cramming themselves in vehicles if( in_vehicle && ( has_trait( trait_HUGE ) || has_trait( trait_HUGE_OK ) ) ) { - add_msg_if_player( m_bad, - _( "You're cramping up from stuffing yourself in this vehicle." ) ); - if( is_npc() ) { - npc &as_npc = dynamic_cast( *this ); - as_npc.complain_about( "cramped_vehicle", 1_hours, "", false ); + vehicle *veh = veh_pointer_or_null( g->m.veh_at( pos() ) ); + // it's painful to work the controls, but passengers in open topped vehicles are fine + if( veh && ( veh->enclosed_at( pos() ) || veh->player_in_control( *this ) ) ) { + add_msg_if_player( m_bad, + _( "You're cramping up from stuffing yourself in this vehicle." ) ); + if( is_npc() ) { + npc &as_npc = dynamic_cast( *this ); + as_npc.complain_about( "cramped_vehicle", 1_hours, "", false ); + } + mod_pain_noresist( 2 * rng( 2, 3 ) ); + focus_pool -= 1; } - mod_pain_noresist( 2 * rng( 2, 3 ) ); - focus_pool -= 1; } } @@ -4425,13 +4368,10 @@ void player::add_addiction( add_type type, int strength ) const int roll = rng( 0, 100 ); add_msg( m_debug, "Addiction: roll %d vs strength %d", roll, strength ); if( roll < strength ) { - //~ %s is addiction name const std::string &type_name = addiction_type_name( type ); - add_memorial_log( pgettext( "memorial_male", "Became addicted to %s." ), - pgettext( "memorial_female", "Became addicted to %s." ), - type_name ); add_msg( m_debug, "%s got addicted to %s", disp_name(), type_name ); addictions.emplace_back( type, 1 ); + g->events().send( getID(), type ); } } @@ -4451,11 +4391,8 @@ void player::rem_addiction( add_type type ) } ); if( iter != addictions.end() ) { - //~ %s is addiction name - add_memorial_log( pgettext( "memorial_male", "Overcame addiction to %s." ), - pgettext( "memorial_female", "Overcame addiction to %s." ), - addiction_type_name( type ) ); addictions.erase( iter ); + g->events().send( getID(), type ); } } @@ -4492,7 +4429,7 @@ void player::cough( bool harmful, int loudness ) const int stam = stamina; const int malus = get_stamina_max() * 0.05; // 5% max stamina mod_stat( "stamina", -malus ); - if( stam < malus && x_in_y( malus - stam, malus ) ) { + if( stam < malus && x_in_y( malus - stam, malus ) && one_in( 6 ) ) { apply_damage( nullptr, bp_torso, 1 ); } } @@ -5372,9 +5309,10 @@ void player::suffer() } } // Done with while-awake-only effects - if( has_trait( trait_ASTHMA ) && - one_in( ( to_turns( 6_hours ) - stim * 300 ) * ( has_effect( effect_sleep ) ? 10 : 1 ) ) && - !has_effect( effect_adrenaline ) & !has_effect( effect_datura ) ) { + if( has_trait( trait_ASTHMA ) && !has_effect( effect_adrenaline ) && + !has_effect( effect_datura ) && + one_in( ( to_turns( 6_hours ) - stim * 300 ) * + ( has_effect( effect_sleep ) ? 10 : 1 ) ) ) { bool auto_use = has_charges( "inhaler", 1 ) || has_charges( "oxygen_tank", 1 ) || has_charges( "smoxygen_tank", 1 ); bool oxygenator = has_bionic( bio_gills ) && power_level >= 3; @@ -5383,42 +5321,48 @@ void player::suffer() auto_use = false; } + add_msg_player_or_npc( m_bad, _( "You have an asthma attack!" ), + " starts wheezing and coughing." ); + if( in_sleep_state() && !has_effect( effect_narcosis ) ) { inventory map_inv; - map_inv.form_from_map( g->u.pos(), 2 ); + map_inv.form_from_map( g->u.pos(), 2, &g->u ); + // check if an inhaler is somewhere near + bool nearby_use = auto_use || oxygenator || map_inv.has_charges( "inhaler", 1 ) || + map_inv.has_charges( "oxygen_tank", 1 ) || + map_inv.has_charges( "smoxygen_tank", 1 ); // check if character has an oxygenator first if( oxygenator ) { - add_msg_if_player( m_bad, _( "You have an asthma attack!" ) ); charge_power( -3 ); - add_msg_if_player( m_info, _( "You use your Oxygenator to clear it up, then go back to sleep." ) ); + add_msg_if_player( m_info, _( "You use your Oxygenator to clear it up, " + "then go back to sleep." ) ); } else if( auto_use ) { - add_msg_if_player( m_bad, _( "You have an asthma attack!" ) ); if( use_charges_if_avail( "inhaler", 1 ) ) { add_msg_if_player( m_info, _( "You use your inhaler and go back to sleep." ) ); } else if( use_charges_if_avail( "oxygen_tank", 1 ) || use_charges_if_avail( "smoxygen_tank", 1 ) ) { - add_msg_if_player( m_info, - _( "You take a deep breath from your oxygen tank and go back to sleep." ) ); + add_msg_if_player( m_info, _( "You take a deep breath from your oxygen tank " + "and go back to sleep." ) ); } - // check if an inhaler is somewhere near - } else if( map_inv.has_charges( "inhaler", 1 ) || map_inv.has_charges( "oxygen_tank", 1 ) || - map_inv.has_charges( "smoxygen_tank", 1 ) ) { - add_msg_if_player( m_bad, _( "You have an asthma attack!" ) ); + } else if( nearby_use ) { // create new variable to resolve a reference issue int amount = 1; if( !g->m.use_charges( g->u.pos(), 2, "inhaler", amount ).empty() ) { add_msg_if_player( m_info, _( "You use your inhaler and go back to sleep." ) ); } else if( !g->m.use_charges( g->u.pos(), 2, "oxygen_tank", amount ).empty() || !g->m.use_charges( g->u.pos(), 2, "smoxygen_tank", amount ).empty() ) { - add_msg_if_player( m_info, - _( "You take a deep breath from your oxygen tank and go back to sleep." ) ); + add_msg_if_player( m_info, _( "You take a deep breath from your oxygen tank " + "and go back to sleep." ) ); } } else { add_effect( effect_asthma, rng( 5_minutes, 20_minutes ) ); if( has_effect( effect_sleep ) ) { wake_up(); } else { - g->cancel_activity_or_ignore_query( distraction_type::asthma, _( "You have an asthma attack!" ) ); + if( !is_npc() ) { + g->cancel_activity_or_ignore_query( distraction_type::asthma, + _( "You can't focus while choking!" ) ); + } } } } else if( auto_use ) { @@ -5426,32 +5370,35 @@ void player::suffer() if( use_charges_if_avail( "inhaler", 1 ) ) { moves -= 40; charges = charges_of( "inhaler" ); - add_msg_if_player( m_bad, _( "You have an asthma attack!" ) ); if( charges == 0 ) { add_msg_if_player( m_bad, _( "You use your last inhaler charge." ) ); } else { - add_msg_if_player( m_info, ngettext( "You use your inhaler, only %d charge left.", - "You use your inhaler, only %d charges left.", charges ), + add_msg_if_player( m_info, ngettext( "You use your inhaler, " + "only %d charge left.", + "You use your inhaler, " + "only %d charges left.", charges ), charges ); } } else if( use_charges_if_avail( "oxygen_tank", 1 ) || use_charges_if_avail( "smoxygen_tank", 1 ) ) { moves -= 500; // synched with use action charges = charges_of( "oxygen_tank" ) + charges_of( "smoxygen_tank" ); - add_msg_if_player( m_bad, _( "You have an asthma attack!" ) ); if( charges == 0 ) { - add_msg_if_player( m_bad, _( "You breathe in last bit of oxygen from the tank." ) ); + add_msg_if_player( m_bad, _( "You breathe in last bit of oxygen " + "from the tank." ) ); } else { - add_msg_if_player( m_info, - ngettext( "You take a deep breath from your oxygen tank, only %d charge left.", - "You take a deep breath from your oxygen tank, only %d charges left.", charges ), + add_msg_if_player( m_info, ngettext( "You take a deep breath from your oxygen " + "tank, only %d charge left.", + "You take a deep breath from your oxygen " + "tank, only %d charges left.", charges ), charges ); } } } else { add_effect( effect_asthma, rng( 5_minutes, 20_minutes ) ); if( !is_npc() ) { - g->cancel_activity_or_ignore_query( distraction_type::asthma, _( "You have an asthma attack!" ) ); + g->cancel_activity_or_ignore_query( distraction_type::asthma, + _( "You can't focus while choking!" ) ); } } } @@ -6229,10 +6176,7 @@ void player::mend( int rate_multiplier ) if( eff.get_duration() >= eff.get_max_duration() ) { hp_cur[i] = 1; remove_effect( effect_mending, part ); - //~ %s is bodypart - add_memorial_log( pgettext( "memorial_male", "Broken %s began to mend." ), - pgettext( "memorial_female", "Broken %s began to mend." ), - body_part_name( part ) ); + g->events().send( getID(), part ); //~ %s is bodypart add_msg_if_player( m_good, _( "Your %s has started to mend!" ), body_part_name( part ) ); @@ -6464,11 +6408,7 @@ void player::update_body_wetness( const w_point &weather ) // Now per-body-part stuff // To make drying uniform, make just one roll and reuse it - const int drying_roll = rng( 1, 100 ); - if( drying_roll > 40 ) { - // Wouldn't affect anything - return; - } + const int drying_roll = rng( 1, 80 ); for( const body_part bp : all_body_parts ) { if( body_wetness[bp] == 0 ) { @@ -7079,6 +7019,36 @@ bool player::consume_med( item &target ) return target.charges <= 0; } +static bool query_consume_ownership( item &target, player &p ) +{ + if( target.has_owner() && target.get_owner() != p.get_faction() ) { + bool choice = true; + if( p.get_value( "THIEF_MODE" ) == "THIEF_ASK" ) { + choice = Pickup::query_thief(); + } + if( p.get_value( "THIEF_MODE" ) == "THIEF_HONEST" || !choice ) { + return false; + } + std::vector witnesses; + for( npc &elem : g->all_npcs() ) { + if( rl_dist( elem.pos(), p.pos() ) < MAX_VIEW_DISTANCE && elem.sees( p.pos() ) ) { + witnesses.push_back( &elem ); + } + } + for( npc *elem : witnesses ) { + elem->say( "", 7 ); + } + if( !witnesses.empty() ) { + if( g->u.add_faction_warning( target.get_owner()->id ) ) { + for( npc *elem : witnesses ) { + elem->make_angry(); + } + } + } + } + return true; +} + bool player::consume_item( item &target ) { if( target.is_null() ) { @@ -7099,7 +7069,9 @@ bool player::consume_item( item &target ) } return false; } - + if( is_player() && !query_consume_ownership( target, *this ) ) { + return false; + } if( consume_med( comest ) || eat( comest ) || feed_battery_with( comest ) || @@ -7119,8 +7091,8 @@ bool player::consume_item( item &target ) bool player::consume( int target_position ) { auto &target = i_at( target_position ); - if( consume_item( target ) ) { + const bool was_in_container = !can_consume_as_is( target ); if( was_in_container ) { @@ -7211,7 +7183,7 @@ bool player::add_faction_warning( const faction_id &id ) warning_record[id] = std::make_pair( 1, calendar::turn ); } faction *fac = g->faction_manager_ptr->get( id ); - if( fac != nullptr && is_player() ) { + if( fac != nullptr && is_player() && fac->id != faction_id( "no_faction" ) ) { fac->likes_u -= 1; fac->respects_u -= 1; } @@ -7838,12 +7810,12 @@ bool player::pick_style() // Style selection menu auto &style = selectable_styles[i].obj(); //Check if this style is currently selected const bool selected = selectable_styles[i] == style_selected; - std::string entry_text = _( style.name ); + std::string entry_text = style.name.translated(); if( selected ) { kmenu.selected = i + STYLE_OFFSET; entry_text = colorize( entry_text, c_pink ); } - kmenu.addentry_desc( i + STYLE_OFFSET, true, -1, entry_text, _( style.description ) ); + kmenu.addentry_desc( i + STYLE_OFFSET, true, -1, entry_text, style.description.translated() ); } kmenu.query(); @@ -9657,8 +9629,10 @@ void player::fall_asleep() } if( has_active_mutation( trait_id( "HIBERNATE" ) ) && get_kcal_percent() > 0.8f ) { - add_memorial_log( pgettext( "memorial_male", "Entered hibernation." ), - pgettext( "memorial_female", "Entered hibernation." ) ); + if( is_avatar() ) { + g->memorial().add( pgettext( "memorial_male", "Entered hibernation." ), + pgettext( "memorial_female", "Entered hibernation." ) ); + } // some days worth of round-the-clock Snooze. Cata seasons default to 91 days. fall_asleep( 10_days ); // If you're not fatigued enough for 10 days, you won't sleep the whole thing. @@ -9960,10 +9934,13 @@ int player::get_armor_fire( body_part bp ) const static void destroyed_armor_msg( Character &who, const std::string &pre_damage_name ) { - //~ %s is armor name - who.add_memorial_log( pgettext( "memorial_male", "Worn %s was completely destroyed." ), - pgettext( "memorial_female", "Worn %s was completely destroyed." ), - pre_damage_name ); + if( who.is_avatar() ) { + g->memorial().add( + //~ %s is armor name + pgettext( "memorial_male", "Worn %s was completely destroyed." ), + pgettext( "memorial_female", "Worn %s was completely destroyed." ), + pre_damage_name ); + } who.add_msg_player_or_npc( m_bad, _( "Your %s is completely destroyed!" ), _( "'s %s is completely destroyed!" ), pre_damage_name ); @@ -10862,7 +10839,7 @@ action_id player::get_next_auto_move_direction() // Should never happen, but check just in case return ACTION_NULL; } - return get_movement_direction_from_delta( dp.x, dp.y, dp.z ); + return get_movement_direction_from_delta( dp ); } bool player::defer_move( const tripoint &next ) @@ -11009,6 +10986,57 @@ void player::burn_move_stamina( int moves ) } } +void player::mount_creature( monster &z ) +{ + tripoint pnt = z.pos(); + std::shared_ptr mons = g->shared_from( z ); + if( mons == nullptr ) { + add_msg( m_debug, "mount_creature() : monster not found in critter_tracker" ); + return; + } + add_effect( effect_riding, 1_turns, num_bp, true ); + z.add_effect( effect_ridden, 1_turns, num_bp, true ); + if( z.has_effect( effect_tied ) ) { + z.remove_effect( effect_tied ); + if( z.tied_item ) { + i_add( *z.tied_item ); + z.tied_item = cata::nullopt; + } + } + z.mounted_player_id = getID(); + if( z.has_effect( effect_harnessed ) ) { + z.remove_effect( effect_harnessed ); + add_msg_if_player( m_info, _( "You remove the %s's harness." ), z.get_name() ); + } + mounted_creature = mons; + mons->mounted_player = this; + if( is_hauling() ) { + stop_hauling(); + } + if( is_player() ) { + if( g->u.get_grab_type() != OBJECT_NONE ) { + add_msg( m_warning, _( "You let go of the grabbed object." ) ); + g->u.grab( OBJECT_NONE ); + } + g->place_player( pnt ); + } else { + npc &guy = dynamic_cast( *this ); + guy.setpos( pnt ); + } + z.facing = facing; + add_msg_if_player( m_good, _( "You climb on the %s." ), z.get_name() ); + if( z.has_flag( MF_RIDEABLE_MECH ) ) { + if( !z.type->mech_weapon.empty() ) { + item mechwep = item( z.type->mech_weapon ); + wield( mechwep ); + } + add_msg_if_player( m_good, _( "You hear your %s whir to life." ), z.get_name() ); + } + // some rideable mechs have night-vision + recalc_sight_limits(); + mod_moves( -100 ); +} + void player::forced_dismount() { remove_effect( effect_riding ); @@ -11017,10 +11045,13 @@ void player::forced_dismount() auto mon = mounted_creature.get(); if( mon->has_flag( MF_RIDEABLE_MECH ) && !mon->type->mech_weapon.empty() ) { mech = true; - remove_item( g->u.weapon ); + remove_item( weapon ); } + mon->mounted_player_id = character_id(); mon->remove_effect( effect_ridden ); + mon->add_effect( effect_controlled, 5_turns ); mounted_creature = nullptr; + mon->mounted_player = nullptr; } std::vector valid; for( const tripoint &jk : g->m.points_in_radius( pos(), 1 ) ) { @@ -11031,9 +11062,11 @@ void player::forced_dismount() if( !valid.empty() ) { setpos( random_entry( valid ) ); if( mech ) { - add_msg( m_bad, _( "You are ejected from your mech!" ) ); + add_msg_player_or_npc( m_bad, _( "You are ejected from your mech!" ), + _( " is ejected from their mech!" ) ); } else { - add_msg( m_bad, _( "You fall off your mount!" ) ); + add_msg_player_or_npc( m_bad, _( "You fall off your mount!" ), + _( " falls off their mount!" ) ); } const int dodge = get_dodge(); const int damage = std::max( 0, rng( 1, 20 ) - rng( dodge, dodge * 2 ) ); @@ -11073,60 +11106,60 @@ void player::forced_dismount() break; } if( damage > 0 ) { - add_msg( m_bad, _( "You hurt yourself!" ) ); + add_msg_if_player( m_bad, _( "You hurt yourself!" ) ); deal_damage( nullptr, hit, damage_instance( DT_BASH, damage ) ); - add_memorial_log( pgettext( "memorial_male", "Fell off a mount." ), - pgettext( "memorial_female", "Fell off a mount." ) ); + if( is_avatar() ) { + g->memorial().add( + pgettext( "memorial_male", "Fell off a mount." ), + pgettext( "memorial_female", "Fell off a mount." ) ); + } check_dead_state(); } add_effect( effect_downed, 5_turns, num_bp, true ); } else { add_msg( m_debug, "Forced_dismount could not find a square to deposit player" ); } - if( g->u.get_grab_type() != OBJECT_NONE ) { - add_msg( m_warning, _( "You let go of the grabbed object." ) ); - g->u.grab( OBJECT_NONE ); + if( is_player() ) { + if( g->u.get_grab_type() != OBJECT_NONE ) { + add_msg( m_warning, _( "You let go of the grabbed object." ) ); + g->u.grab( OBJECT_NONE ); + } + set_movement_mode( PMM_WALK ); + g->update_map( g->u ); } moves -= 150; - set_movement_mode( PMM_WALK ); - g->update_map( g->u ); } void player::dismount() { - if( is_mounted() ) { - if( const cata::optional pnt = choose_adjacent( _( "Dismount where?" ) ) ) { - if( g->is_empty( *pnt ) ) { - tripoint temp_pt = *pnt; - int xdiff = pos().x - temp_pt.x; - int ydiff = pos().y - temp_pt.y; - remove_effect( effect_riding ); - monster *critter = mounted_creature.get(); - if( critter->has_flag( MF_RIDEABLE_MECH ) && !critter->type->mech_weapon.empty() ) { - remove_item( g->u.weapon ); - } - if( g->u.get_grab_type() != OBJECT_NONE ) { - add_msg( m_warning, _( "You let go of the grabbed object." ) ); - g->u.grab( OBJECT_NONE ); - } - critter->remove_effect( effect_ridden ); - mounted_creature = nullptr; - setpos( *pnt ); - g->refresh_all(); - critter->setpos( pos() + point( xdiff, ydiff ) ); - critter->add_effect( effect_controlled, 5_turns ); - mod_moves( -100 ); - set_movement_mode( PMM_WALK ); - return; - } else { - add_msg( m_warning, _( "You cannot dismount there!" ) ); - return; - } - } - } else { + if( !is_mounted() ) { add_msg( m_debug, "dismount called when not riding" ); return; } + if( const cata::optional pnt = choose_adjacent( _( "Dismount where?" ) ) ) { + if( !g->is_empty( *pnt ) ) { + add_msg( m_warning, _( "You cannot dismount there!" ) ); + return; + } + remove_effect( effect_riding ); + monster *critter = mounted_creature.get(); + critter->mounted_player_id = character_id(); + if( critter->has_flag( MF_RIDEABLE_MECH ) && !critter->type->mech_weapon.empty() ) { + remove_item( g->u.weapon ); + } + if( g->u.get_grab_type() != OBJECT_NONE ) { + add_msg( m_warning, _( "You let go of the grabbed object." ) ); + g->u.grab( OBJECT_NONE ); + } + critter->remove_effect( effect_ridden ); + critter->add_effect( effect_controlled, 5_turns ); + mounted_creature = nullptr; + critter->mounted_player = nullptr; + setpos( *pnt ); + g->refresh_all(); + mod_moves( -100 ); + set_movement_mode( PMM_WALK ); + } } Creature::Attitude player::attitude_to( const Creature &other ) const diff --git a/src/player.h b/src/player.h index 012d63869db4d..ed5ed996d052a 100644 --- a/src/player.h +++ b/src/player.h @@ -39,10 +39,10 @@ #include "monster.h" #include "craft_command.h" #include "point.h" -#include "faction.h" class basecamp; class effect; +class faction; class map; class npc; struct pathfinding_settings; @@ -64,6 +64,7 @@ struct dealt_projectile_attack; class dispersion_sources; using itype_id = std::string; +using faction_id = string_id; struct trap; class profession; @@ -139,18 +140,6 @@ class player_morale; // This corresponds to the level of accuracy of a "snap" or "hip" shot. extern const double MAX_RECOIL; -//Don't forget to add new memorial counters -//to the save and load functions in savegame_json.cpp -struct stats { - int squares_walked = 0; - int damage_taken = 0; - int damage_healed = 0; - int headshots = 0; - - void serialize( JsonOut &json ) const; - void deserialize( JsonIn &jsin ); -}; - struct stat_mod { int strength = 0; int dexterity = 0; @@ -222,6 +211,8 @@ class player : public Character bool is_npc() const override { return false; // Overloaded for NPCs in npc.h } + bool can_mount( const monster &critter ) const; + void mount_creature( monster &z ); /** Returns what color the player should be drawn as */ nc_color basic_symbol_color() const override; @@ -607,7 +598,7 @@ class player : public Character dispersion_sources get_weapon_dispersion( const item &obj ) const; /** Returns true if a gun misfires, jams, or has other problems, else returns false */ - bool handle_gun_damage( item &it, int shots_fired ); + bool handle_gun_damage( item &it ); /** Get maximum recoil penalty due to vehicle motion */ double recoil_vehicle() const; @@ -1582,6 +1573,7 @@ class player : public Character player_activity activity; std::list backlog; cata::optional destination_point; + int activity_vehicle_part_index = -1; int volume; const profession *prof; @@ -1645,18 +1637,7 @@ class player : public Character int get_free_bionics_slots( body_part bp ) const; std::map bionic_installation_issues( const bionic_id &bioid ); - //Dumps all memorial events into a single newline-delimited string - std::string dump_memorial() const; - //Log an event, to be later written to the memorial file - using Character::add_memorial_log; - void add_memorial_log( const std::string &male_msg, const std::string &female_msg ) override; - //Loads the memorial log from a file - void load_memorial_file( std::istream &fin ); - //Notable events, to be printed in memorial - std::vector memorial_log; std::set follower_ids; - //Record of player stats, for posterity only - stats lifetime_stats; void mod_stat( const std::string &stat, float modifier ) override; bool is_underwater() const override; diff --git a/src/player_display.cpp b/src/player_display.cpp index ab65e46ea44ab..cb9bf48a96866 100644 --- a/src/player_display.cpp +++ b/src/player_display.cpp @@ -643,94 +643,121 @@ static void draw_effects_tab( const catacurses::window &w_effects, const catacur } } -static void draw_skills_tab( const catacurses::window &w_skills, const catacurses::window &w_info, - player &you, unsigned int &line, int &curtab, input_context &ctxt, bool &done, - std::string &action, const std::vector &skillslist, - const size_t skill_win_size_y ) +struct HeaderSkill { + const Skill *skill; + bool is_header; + HeaderSkill( const Skill *skill, bool is_header ): skill( skill ), is_header( is_header ) { + } +}; + +static const Skill *draw_skills_list( const catacurses::window &w_skills, + player &you, unsigned int &line, + std::vector &skillslist, + const size_t skill_win_size_y ) { - mvwprintz( w_skills, point_zero, h_light_gray, header_spaces ); - center_print( w_skills, 0, h_light_gray, _( title_SKILLS ) ); + const int col_width = 25; + if( line == 0 ) { //can't point to a header; + line = 1; + } + + nc_color cstatus = c_light_gray; + if( line < 100 ) { + mvwprintz( w_skills, point_zero, h_light_gray, header_spaces ); + cstatus = hilite( cstatus ); + } + center_print( w_skills, 0, cstatus, _( title_SKILLS ) ); size_t min = 0; size_t max = 0; const size_t half_y = skill_win_size_y / 2; - if( line <= half_y ) { + + if( line <= half_y || line > 100 ) { min = 0; - max = skill_win_size_y; - if( skillslist.size() < max ) { - max = skillslist.size(); - } } else if( line >= skillslist.size() - half_y ) { - min = ( skillslist.size() < static_cast( skill_win_size_y ) ? 0 : skillslist.size() - + min = ( skillslist.size() < skill_win_size_y ? 0 : skillslist.size() - skill_win_size_y ); - max = skillslist.size(); } else { min = line - half_y; - max = line - half_y + skill_win_size_y; - if( skillslist.size() < max ) { - max = skillslist.size(); - } } + max = std::min( min + skill_win_size_y, skillslist.size() ); const Skill *selectedSkill = nullptr; - - for( size_t i = min; i < max; i++ ) { - const Skill *aSkill = skillslist[i]; + int y_pos = 1; + for( size_t i = min; i < max; i++, y_pos++ ) { + const Skill *aSkill = skillslist[i].skill; const SkillLevel &level = you.get_skill_level_object( aSkill->ident() ); - const bool can_train = level.can_train(); - const bool training = level.isTraining(); - const bool rusting = level.isRusting(); - int exercise = level.exercise(); - int level_num = level.level(); - bool locked = false; - if( you.has_active_bionic( bionic_id( "bio_cqb" ) ) && is_cqb_skill( aSkill->ident() ) ) { - level_num = 5; - exercise = 0; - locked = true; - } - nc_color cstatus; - if( i == line ) { - selectedSkill = aSkill; - if( locked ) { - cstatus = h_yellow; - } else if( !can_train ) { - cstatus = rusting ? h_light_red : h_white; - } else if( exercise >= 100 ) { - cstatus = training ? h_pink : h_magenta; - } else if( rusting ) { - cstatus = training ? h_light_red : h_red; + if( skillslist[i].is_header ) { + const SkillDisplayType t = SkillDisplayType::get_skill_type( aSkill->display_category() ); + std::string type_name = t.display_string(); + mvwprintz( w_skills, point( 0, y_pos ), c_light_gray, header_spaces ); + center_print( w_skills, y_pos, c_yellow, type_name ); + } else { + const bool can_train = level.can_train(); + const bool training = level.isTraining(); + const bool rusting = level.isRusting(); + int exercise = level.exercise(); + int level_num = level.level(); + bool locked = false; + if( you.has_active_bionic( bionic_id( "bio_cqb" ) ) && is_cqb_skill( aSkill->ident() ) ) { + level_num = 5; + exercise = 0; + locked = true; + } + if( i == line ) { + selectedSkill = aSkill; + if( locked ) { + cstatus = h_yellow; + } else if( !can_train ) { + cstatus = rusting ? h_light_red : h_white; + } else if( exercise >= 100 ) { + cstatus = training ? h_pink : h_magenta; + } else if( rusting ) { + cstatus = training ? h_light_red : h_red; + } else { + cstatus = training ? h_light_blue : h_blue; + } + mvwprintz( w_skills, point( 1, y_pos ), cstatus, "%*s", col_width, "" ); } else { - cstatus = training ? h_light_blue : h_blue; + if( locked ) { + cstatus = c_yellow; + } else if( rusting ) { + cstatus = training ? c_light_red : c_red; + } else if( !can_train ) { + cstatus = c_white; + } else { + cstatus = training ? c_light_blue : c_blue; + } + mvwprintz( w_skills, point( 1, y_pos ), c_light_gray, "%*s", col_width, "" ); } - } else { - if( locked ) { - cstatus = c_yellow; - } else if( rusting ) { - cstatus = training ? c_light_red : c_red; - } else if( !can_train ) { - cstatus = c_white; + mvwprintz( w_skills, point( 1, y_pos ), cstatus, "%s:", aSkill->name() ); + if( aSkill->ident() == skill_id( "dodge" ) ) { + mvwprintz( w_skills, point( 14, y_pos ), cstatus, "%4.1f/%-2d(%2d%%)", + you.get_dodge(), level_num, exercise < 0 ? 0 : exercise ); } else { - cstatus = training ? c_light_blue : c_blue; + mvwprintz( w_skills, point( 19, y_pos ), cstatus, "%-2d(%2d%%)", + level_num, + ( exercise < 0 ? 0 : exercise ) ); } } - mvwprintz( w_skills, point( 1, static_cast( 1 + i - min ) ), c_light_gray, - " " ); - mvwprintz( w_skills, point( 1, static_cast( 1 + i - min ) ), cstatus, "%s:", aSkill->name() ); - - if( aSkill->ident() == skill_id( "dodge" ) ) { - mvwprintz( w_skills, point( 14, static_cast( 1 + i - min ) ), cstatus, "%4.1f/%-2d(%2d%%)", - you.get_dodge(), level_num, exercise < 0 ? 0 : exercise ); - } else { - mvwprintz( w_skills, point( 19, static_cast( 1 + i - min ) ), cstatus, "%-2d(%2d%%)", - level_num, - ( exercise < 0 ? 0 : exercise ) ); - } } - draw_scrollbar( w_skills, line, skill_win_size_y, static_cast( skillslist.size() ), - point_south ); + return selectedSkill; +} + +static void draw_skills_tab( const catacurses::window &w_skills, const catacurses::window &w_info, + player &you, unsigned int &line, int &curtab, input_context &ctxt, bool &done, + std::string &action, std::vector &skillslist, + const size_t skill_win_size_y ) +{ + + const Skill *selectedSkill = draw_skills_list( w_skills, you, line, skillslist, skill_win_size_y ); + int list_size = skillslist.size(); + if( skillslist.size() > skill_win_size_y ) { + draw_scrollbar( w_skills, line, skill_win_size_y, list_size, + point_south ); + } wrefresh( w_skills ); werase( w_info ); @@ -744,52 +771,27 @@ static void draw_skills_tab( const catacurses::window &w_skills, const catacurse action = ctxt.handle_input(); if( action == "DOWN" ) { - if( static_cast( line ) < skillslist.size() - 1 ) { + line++; + if( static_cast( line ) >= skillslist.size() ) { + line %= skillslist.size(); + } + if( skillslist[line].is_header ) { //ok not to check for wraparound because header can't be at the end of the list line++; } } else if( action == "UP" ) { - if( line > 0 ) { - line--; - } - } else if( action == "NEXT_TAB" || action == "PREV_TAB" ) { - werase( w_skills ); - mvwprintz( w_skills, point_zero, c_light_gray, header_spaces ); - center_print( w_skills, 0, c_light_gray, _( title_SKILLS ) ); - for( size_t i = 0; i < skillslist.size() && i < static_cast( skill_win_size_y ); i++ ) { - const Skill *thisSkill = skillslist[i]; - const SkillLevel &level = you.get_skill_level_object( thisSkill->ident() ); - bool can_train = level.can_train(); - bool isLearning = level.isTraining(); - bool rusting = level.isRusting(); - int level_num = level.level(); - int exercise = level.exercise(); - bool locked = false; - if( you.has_active_bionic( bionic_id( "bio_cqb" ) ) && is_cqb_skill( thisSkill->ident() ) ) { - level_num = 5; - exercise = 0; - locked = true; - } - nc_color cstatus; - if( locked ) { - cstatus = c_yellow; - } else if( rusting ) { - cstatus = isLearning ? c_light_red : c_red; - } else if( !can_train ) { - cstatus = c_white; - } else { - cstatus = isLearning ? c_light_blue : c_blue; - } - - mvwprintz( w_skills, point( 1, i + 1 ), cstatus, "%s:", thisSkill->name() ); - - if( thisSkill->ident() == skill_id( "dodge" ) ) { - mvwprintz( w_skills, point( 14, i + 1 ), cstatus, "%4.1f/%-2d(%2d%%)", - you.get_dodge(), level_num, exercise < 0 ? 0 : exercise ); + //ok not to check for -1 because header is always first in the list + line--; + if( skillslist[line].is_header ) { + if( line > 0 ) { + line--; } else { - mvwprintz( w_skills, point( 19, i + 1 ), cstatus, "%-2d(%2d%%)", level_num, - ( exercise < 0 ? 0 : exercise ) ); + line = skillslist.size() - 1; } } + } else if( action == "NEXT_TAB" || action == "PREV_TAB" ) { + werase( w_skills ); + line = 1000; + draw_skills_list( w_skills, you, line, skillslist, skill_win_size_y ); wrefresh( w_skills ); line = 0; curtab = action == "NEXT_TAB" ? curtab + 1 : curtab - 1; @@ -919,7 +921,7 @@ static void draw_initial_windows( const catacurses::window &w_stats, const catacurses::window &w_bionics, const catacurses::window &w_effects, const catacurses::window &w_skills, const catacurses::window &w_speed, player &you, unsigned int &line, std::vector &traitslist, std::vector &bionicslist, - std::vector &effect_name, const std::vector &skillslist, + std::vector &effect_name, std::vector &skillslist, const size_t bionics_win_size_y, const size_t effect_win_size_y, const size_t trait_win_size_y, const size_t skill_win_size_y ) { @@ -996,52 +998,8 @@ static void draw_initial_windows( const catacurses::window &w_stats, wrefresh( w_effects ); // Next, draw skills. - line = 1; - - center_print( w_skills, 0, c_light_gray, _( title_SKILLS ) ); - - for( auto &elem : skillslist ) { - const SkillLevel &level = you.get_skill_level_object( elem->ident() ); - - // Default to not training and not rusting - nc_color text_color = c_blue; - bool not_capped = level.can_train(); - bool training = level.isTraining(); - bool rusting = level.isRusting(); - - if( training && rusting ) { - text_color = c_light_red; - } else if( training && not_capped ) { - text_color = c_light_blue; - } else if( rusting ) { - text_color = c_red; - } else if( !not_capped ) { - text_color = c_white; - } - - int level_num = level.level(); - int exercise = level.exercise(); - - if( you.has_active_bionic( bionic_id( "bio_cqb" ) ) && is_cqb_skill( elem->ident() ) ) { - level_num = 5; - exercise = 0; - text_color = c_yellow; - } - - if( line < skill_win_size_y + 1 ) { - mvwprintz( w_skills, point( 1, line ), text_color, "%s:", ( elem )->name() ); - - if( ( elem )->ident() == skill_id( "dodge" ) ) { - mvwprintz( w_skills, point( 14, line ), text_color, "%4.1f/%-2d(%2d%%)", - you.get_dodge(), level_num, exercise < 0 ? 0 : exercise ); - } else { - mvwprintz( w_skills, point( 19, line ), text_color, "%-2d(%2d%%)", level_num, - ( exercise < 0 ? 0 : exercise ) ); - } - - line++; - } - } + line = 1000; + draw_skills_list( w_skills, you, line, skillslist, skill_win_size_y ); wrefresh( w_skills ); // Finally, draw speed. @@ -1197,16 +1155,16 @@ void player::disp_info() ( has_trait( trait_id( "TROGLO2" ) ) && g->is_in_sunlight( pos() ) && g->weather.weather != WEATHER_SUNNY ) ) { effect_name.push_back( _( "In Sunlight" ) ); - effect_text.push_back( _( "The sunlight irritates you.\n\ -Strength - 1; Dexterity - 1; Intelligence - 1; Perception - 1" ) ); + effect_text.push_back( _( "The sunlight irritates you.\n" + "Strength - 1; Dexterity - 1; Intelligence - 1; Perception - 1" ) ); } else if( has_trait( trait_id( "TROGLO2" ) ) && g->is_in_sunlight( pos() ) ) { effect_name.push_back( _( "In Sunlight" ) ); - effect_text.push_back( _( "The sunlight irritates you badly.\n\ -Strength - 2; Dexterity - 2; Intelligence - 2; Perception - 2" ) ); + effect_text.push_back( _( "The sunlight irritates you badly.\n" + "Strength - 2; Dexterity - 2; Intelligence - 2; Perception - 2" ) ); } else if( has_trait( trait_id( "TROGLO3" ) ) && g->is_in_sunlight( pos() ) ) { effect_name.push_back( _( "In Sunlight" ) ); - effect_text.push_back( _( "The sunlight irritates you terribly.\n\ -Strength - 4; Dexterity - 4; Intelligence - 4; Perception - 4" ) ); + effect_text.push_back( _( "The sunlight irritates you terribly.\n" + "Strength - 4; Dexterity - 4; Intelligence - 4; Perception - 4" ) ); } for( auto &elem : addictions ) { @@ -1226,12 +1184,27 @@ Strength - 4; Dexterity - 4; Intelligence - 4; Perception - 4" ) ); std::vector bionicslist = *my_bionics; unsigned int bionics_win_size_y = 2 + bionicslist.size(); - const std::vector skillslist = Skill::get_skills_sorted_by( [&]( const Skill & a, + const std::vector player_skill = Skill::get_skills_sorted_by( [&]( const Skill & a, const Skill & b ) { - const int level_a = get_skill_level_object( a.ident() ).exercised_level(); - const int level_b = get_skill_level_object( b.ident() ).exercised_level(); - return level_a > level_b || ( level_a == level_b && a.name() < b.name() ); + skill_displayType_id type_a = a.display_category(); + skill_displayType_id type_b = b.display_category(); + + if( type_a != type_b ) { + return type_a < type_b; + } else { + return a.name() < b.name(); + } } ); + + std::vector skillslist; + skill_displayType_id prev_type = skill_displayType_id::NULL_ID(); + for( auto &s : player_skill ) { + if( s->display_category() != prev_type ) { + prev_type = s->display_category(); + skillslist.emplace_back( s, true ); + } + skillslist.emplace_back( s, false ); + } unsigned int skill_win_size_y = 1 + skillslist.size(); unsigned int info_win_size_y = 6; diff --git a/src/player_hardcoded_effects.cpp b/src/player_hardcoded_effects.cpp index a54ec9875b040..fa865d6be3f97 100644 --- a/src/player_hardcoded_effects.cpp +++ b/src/player_hardcoded_effects.cpp @@ -5,6 +5,7 @@ #include "avatar.h" #include "effect.h" +#include "event_bus.h" #include "fungal_effects.h" #include "game.h" #include "map.h" @@ -58,6 +59,7 @@ const efftype_id effect_formication( "formication" ); const efftype_id effect_frostbite( "frostbite" ); const efftype_id effect_fungus( "fungus" ); const efftype_id effect_grabbed( "grabbed" ); +const efftype_id effect_grabbing( "grabbing" ); const efftype_id effect_hallu( "hallu" ); const efftype_id effect_hot( "hot" ); const efftype_id effect_infected( "infected" ); @@ -249,21 +251,21 @@ static void eff_fun_hallu( player &u, effect &it ) } if( u.is_npc() && one_in( 1200 ) ) { static const std::array npc_hallu = {{ - _( "\"I think it's starting to kick in.\"" ), - _( "\"Oh God, what's happening?\"" ), - _( "\"Of course... it's all fractals!\"" ), - _( "\"Huh? What was that?\"" ) + translate_marker( "\"I think it's starting to kick in.\"" ), + translate_marker( "\"Oh God, what's happening?\"" ), + translate_marker( "\"Of course... it's all fractals!\"" ), + translate_marker( "\"Huh? What was that?\"" ) } }; - const std::string &npc_text = random_entry_ref( npc_hallu ); ///\EFFECT_STR_NPC increases volume of hallucination sounds (NEGATIVE) ///\EFFECT_INT_NPC decreases volume of hallucination sounds int loudness = 20 + u.str_cur - u.int_cur; loudness = ( loudness > 5 ? loudness : 5 ); loudness = ( loudness < 30 ? loudness : 30 ); - sounds::sound( u.pos(), loudness, sounds::sound_t::speech, npc_text, false, "speech", + sounds::sound( u.pos(), loudness, sounds::sound_t::speech, _( random_entry_ref( npc_hallu ) ), + false, "speech", loudness < 15 ? ( u.male ? "NPC_m" : "NPC_f" ) : ( u.male ? "NPC_m_loud" : "NPC_f_loud" ) ); } } else if( dur == peakTime ) { @@ -493,8 +495,7 @@ void player::hardcoded_effects( effect &it ) num_insects--; } } - add_memorial_log( pgettext( "memorial_male", "Dermatik eggs hatched." ), - pgettext( "memorial_female", "Dermatik eggs hatched." ) ); + g->events().send( getID() ); remove_effect( effect_formication, bp ); moves -= 600; triggered = true; @@ -508,7 +509,7 @@ void player::hardcoded_effects( effect &it ) } } else if( id == effect_formication ) { ///\EFFECT_INT decreases occurrence of itching from formication effect - if( x_in_y( intense, 600 + 300 * get_int() ) ) { + if( x_in_y( intense, 600 + 300 * get_int() ) && !has_effect( effect_narcosis ) ) { if( !is_npc() ) { //~ %s is bodypart in accusative. add_msg( m_warning, _( "You start scratching your %s!" ), body_part_name_accusative( bp ) ); @@ -613,10 +614,9 @@ void player::hardcoded_effects( effect &it ) if( one_in( 6000 - ( ( dur - 600_minutes ) / 1_minutes ) ) ) { if( !is_npc() ) { add_msg( _( "Glowing lights surround you, and you teleport." ) ); - add_memorial_log( pgettext( "memorial_male", "Spontaneous teleport." ), - pgettext( "memorial_female", "Spontaneous teleport." ) ); } g->teleport(); + g->events().send( getID() ); if( one_in( 10 ) ) { // Set ourselves up for removal it.set_duration( 0_turns ); @@ -719,10 +719,7 @@ void player::hardcoded_effects( effect &it ) it.set_duration( 0_turns ); } else if( dur > 2_hours ) { add_msg_if_player( m_bad, _( "Your asthma overcomes you.\nYou asphyxiate." ) ); - if( is_player() ) { - add_memorial_log( pgettext( "memorial_male", "Succumbed to an asthma attack." ), - pgettext( "memorial_female", "Succumbed to an asthma attack." ) ); - } + g->events().send( getID() ); hurtall( 500, nullptr ); } else if( dur > 70_minutes ) { if( one_in( 120 ) ) { @@ -843,8 +840,7 @@ void player::hardcoded_effects( effect &it ) add_msg_if_player( _( "You dissolve into beautiful paroxysms of energy. Life fades from your nebulae and you are no more." ) ); } - add_memorial_log( pgettext( "memorial_male", "Died of datura overdose." ), - pgettext( "memorial_female", "Died of datura overdose." ) ); + g->events().send( getID(), id ); hp_cur[hp_torso] = 0; } } else if( id == effect_grabbed ) { @@ -852,14 +848,13 @@ void player::hardcoded_effects( effect &it ) int zed_number = 0; for( auto &dest : g->m.points_in_radius( pos(), 1, 0 ) ) { const monster *const mon = g->critter_at( dest ); - if( mon && ( mon->has_flag( MF_GRABS ) || - mon->type->has_special_attack( "GRAB" ) ) ) { + if( mon && mon->has_effect( effect_grabbing ) ) { zed_number += mon->get_grab_strength(); } } if( zed_number > 0 ) { - add_effect( effect_grabbed, 2_turns, bp_torso, false, - ( intense + zed_number ) / 2 ); //If intensity isn't pass the cap, average it with # of zeds + //If intensity isn't pass the cap, average it with # of zeds + add_effect( effect_grabbed, 2_turns, bp_torso, false, ( intense + zed_number ) / 2 ); } } else if( id == effect_bite ) { bool recovered = false; @@ -971,8 +966,7 @@ void player::hardcoded_effects( effect &it ) // Death happens if( dur > 1_days ) { add_msg_if_player( m_bad, _( "You succumb to the infection." ) ); - add_memorial_log( pgettext( "memorial_male", "Succumbed to the infection." ), - pgettext( "memorial_female", "Succumbed to the infection." ) ); + g->events().send( getID() ); hurtall( 500, nullptr ); } else if( has_effect( effect_strong_antibiotic ) ) { it.mod_duration( -1_turns ); diff --git a/src/pldata.h b/src/pldata.h index 2babe38ae07b9..b1cfe6d9a1187 100644 --- a/src/pldata.h +++ b/src/pldata.h @@ -5,6 +5,7 @@ #include #include "calendar.h" +#include "enum_traits.h" class JsonIn; class JsonOut; @@ -24,6 +25,12 @@ enum add_type : int { ADD_CAFFEINE, ADD_ALCOHOL, ADD_SLEEP, ADD_PKILLER, ADD_SPEED, ADD_CIG, ADD_COKE, ADD_CRACK, ADD_MUTAGEN, ADD_DIAZEPAM, ADD_MARLOSS_R, ADD_MARLOSS_B, ADD_MARLOSS_Y, + NUM_ADD_TYPES // last +}; + +template<> +struct enum_traits { + static constexpr add_type last = NUM_ADD_TYPES; }; enum hp_part : int { @@ -36,6 +43,11 @@ enum hp_part : int { num_hp_parts }; +template<> +struct enum_traits { + static constexpr hp_part last = num_hp_parts; +}; + class addiction { public: diff --git a/src/projectile.cpp b/src/projectile.cpp index a41c75fdbc519..922a66da29b00 100644 --- a/src/projectile.cpp +++ b/src/projectile.cpp @@ -122,6 +122,14 @@ void apply_ammo_effects( const tripoint &p, const std::set &effects } } + if( effects.count( "PYROPHORIC" ) > 0 ) { + explosion_handler::explosion( p, 360, 0.8, true ); + // Extreme heat near the center of the explosion + for( auto &pt : g->m.points_in_radius( p, 3, 0 ) ) { + g->m.add_field( pt, fd_fire, 2 ); + } + } + if( effects.count( "MININUKE_MOD" ) > 0 ) { explosion_handler::explosion( p, 72000000 ); for( auto &pt : g->m.points_in_radius( p, 18, 0 ) ) { diff --git a/src/ranged.cpp b/src/ranged.cpp index b59f97a3a7822..8efc8ba05c1ea 100644 --- a/src/ranged.cpp +++ b/src/ranged.cpp @@ -20,6 +20,7 @@ #include "cata_utility.h" #include "debug.h" #include "dispersion.h" +#include "event_bus.h" #include "game.h" #include "gun_mode.h" #include "input.h" @@ -78,6 +79,7 @@ const trap_str_id tr_practice_target( "tr_practice_target" ); static const fault_id fault_gun_blackpowder( "fault_gun_blackpowder" ); static const fault_id fault_gun_clogged( "fault_gun_clogged" ); +static const fault_id fault_gun_chamber_spent( "fault_gun_chamber_spent" ); static projectile make_gun_projectile( const item &gun ); int time_to_fire( const Character &p, const itype &firing ); @@ -158,13 +160,17 @@ int player::gun_engagement_moves( const item &gun, int target, int start ) const return mv; } -bool player::handle_gun_damage( item &it, int shots_fired ) +bool player::handle_gun_damage( item &it ) { if( !it.is_gun() ) { debugmsg( "Tried to handle_gun_damage of a non-gun %s", it.tname() ); return false; } + if( it.faults.count( fault_gun_chamber_spent ) || it.faults.count( fault_gun_clogged ) ) { + return false; + } + const auto &curammo_effects = it.ammo_effects(); const cata::optional &firing = it.type->gun; // Here we check if we're underwater and whether we should misfire. @@ -264,19 +270,21 @@ bool player::handle_gun_damage( item &it, int shots_fired ) it.faults_potential().count( fault_gun_blackpowder ) ) { it.faults.insert( fault_gun_blackpowder ); } + if( ( it.ammo_data()->ammo->recoil < firing->min_cycle_recoil ) && + it.faults_potential().count( fault_gun_chamber_spent ) ) { + add_msg_player_or_npc( m_bad, _( "Your %s fails to cycle!" ), + _( "'s %s fails to cycle!" ), + it.tname() ); + it.faults.insert( fault_gun_chamber_spent ); + // Don't return false in this case; this shot happens, follow-up ones won't. + } if( one_in( firing->blackpowder_tolerance ) && it.faults_potential().count( fault_gun_clogged ) ) { add_msg_player_or_npc( m_bad, _( "Your %s is clogged up with blackpowder fouling!" ), _( "'s %s is clogged up with blackpowder fouling!" ), it.tname() ); it.faults.insert( fault_gun_clogged ); - return false; - } - if( it.ammo_data()->ammo->recoil < firing->min_cycle_recoil && shots_fired > 0 ) { - add_msg_player_or_npc( m_bad, _( "Your %s fails to cycle!" ), - _( "'s %s fails to cycle!" ), - it.tname() ); - return false; + // Don't return false in this case; this shot happens, follow-up ones won't. } } return true; @@ -355,7 +363,13 @@ int player::fire_gun( const tripoint &target, int shots, item &gun ) int hits = 0; // total shots on target int delay = 0; // delayed recoil that has yet to be applied while( curshot != shots ) { - if( !handle_gun_damage( gun, curshot ) ) { + if( gun.faults.count( fault_gun_chamber_spent ) && curshot == 0 ) { + moves -= 50; + gun.faults.erase( fault_gun_chamber_spent ); + add_msg_if_player( _( "You cycle your %s manually." ), gun.tname() ); + } + + if( !handle_gun_damage( gun ) ) { break; } @@ -399,7 +413,8 @@ int player::fire_gun( const tripoint &target, int shots, item &gun ) } if( shot.missed_by <= .1 ) { - lifetime_stats.headshots++; // TODO: check head existence for headshot + // TODO: check head existence for headshot + g->events().send( getID() ); } if( shot.hit_critter ) { @@ -499,7 +514,8 @@ int Character::throwing_dispersion( const item &to_throw, Creature *critter, throw_difficulty += std::max( 0, units::to_milliliter( volume - 1000_ml ) ); // 1 penalty for gram above str*100 grams (at 0 skill) ///\EFFECT_STR decreases throwing dispersion when throwing heavy objects - throw_difficulty += std::max( 0, weight / 1_gram - get_str() * 100 ); + const int weight_in_gram = units::to_gram( weight ); + throw_difficulty += std::max( 0, weight_in_gram - get_str() * 100 ); // Dispersion from difficult throws goes from 100% at lvl 0 to 25% at lvl 10 ///\EFFECT_THROW increases throwing accuracy @@ -671,7 +687,7 @@ dealt_projectile_attack player::throw_item( const tripoint &target, const item & if( missed_by <= 0.1 && dealt_attack.hit_critter != nullptr ) { practice( skill_used, final_xp_mult, MAX_SKILL ); // TODO: Check target for existence of head - lifetime_stats.headshots++; + g->events().send( getID() ); } else if( dealt_attack.hit_critter != nullptr && missed_by > 0.0f ) { practice( skill_used, final_xp_mult / ( 1.0f + missed_by ), MAX_SKILL ); } else { @@ -1295,7 +1311,7 @@ std::vector target_handler::target_ui( player &pc, target_mode mode, if( dst == pc.pos() ) { return true; } - if( npc *const who_ = g->critter_at( dst ) ) { + if( npc *const who_ = g->critter_at( dst, false ) ) { const npc &who = *who_; if( who.guaranteed_hostile() ) { return true; @@ -1804,7 +1820,7 @@ std::vector target_handler::target_ui( spell &casting, const bool no_f if( dst == pc.pos() ) { return true; } - if( npc *const who_ = g->critter_at( dst ) ) { + if( npc *const who_ = g->critter_at( dst, false ) ) { const npc &who = *who_; if( who.guaranteed_hostile() ) { return true; diff --git a/src/relic.cpp b/src/relic.cpp new file mode 100644 index 0000000000000..78ca6ec2d8f1e --- /dev/null +++ b/src/relic.cpp @@ -0,0 +1,125 @@ +#include "relic.h" + +#include "creature.h" +#include "magic_enchantment.h" +#include "json.h" +#include "point.h" +#include "magic.h" +#include "translations.h" + +#include + +void relic::add_active_effect( const fake_spell &sp ) +{ + active_effects.emplace_back( sp ); +} + +void relic::add_passive_effect( const enchantment &nench ) +{ + for( enchantment &ench : passive_effects ) { + if( ench.add( nench ) ) { + return; + } + } + passive_effects.emplace_back( nench ); +} + +void relic::load( JsonObject &jo ) +{ + if( jo.has_array( "active_effects" ) ) { + JsonArray jarray = jo.get_array( "active_effects" ); + while( jarray.has_more() ) { + fake_spell sp; + JsonObject jobj = jarray.next_object(); + sp.load( jobj ); + add_active_effect( sp ); + } + } + if( jo.has_array( "passive_effects" ) ) { + JsonArray jarray = jo.get_array( "passive_effects" ); + while( jarray.has_more() ) { + enchantment ench; + JsonObject jobj = jarray.next_object(); + ench.load( jobj ); + add_passive_effect( ench ); + } + } + item_name_override = to_translation( jo.get_string( "name", "" ) ); + charges_per_activation = jo.get_int( "charges_per_activation", 1 ); + moves = jo.get_int( "moves", 100 ); +} + +void relic::deserialize( JsonIn &jsin ) +{ + JsonObject jobj = jsin.get_object(); + load( jobj ); +} + +void relic::serialize( JsonOut &jsout ) const +{ + jsout.start_object(); + + jsout.member( "moves", moves ); + jsout.member( "charges_per_activation", charges_per_activation ); + jsout.member( "name", item_name_override.untranslated() ); + + if( !passive_effects.empty() ) { + jsout.member( "passive_effects" ); + jsout.start_array(); + for( const enchantment &ench : passive_effects ) { + ench.serialize( jsout ); + } + jsout.end_array(); + } + + if( !active_effects.empty() ) { + jsout.member( "active_effects" ); + jsout.start_array(); + for( const fake_spell &sp : active_effects ) { + sp.serialize( jsout ); + } + jsout.end_array(); + } + + jsout.end_object(); +} + +int relic::activate( Creature &caster, const tripoint &target ) const +{ + caster.moves -= moves; + for( const fake_spell &sp : active_effects ) { + sp.get_spell().cast_all_effects( caster, target ); + } + return charges_per_activation; +} + +int relic::modify_value( const enchantment::mod value_type, const int value ) const +{ + int add_modifier = 0; + double multiply_modifier = 0.0; + for( const enchantment &ench : passive_effects ) { + add_modifier += ench.get_value_add( value_type ); + multiply_modifier += ench.get_value_multiply( value_type ); + } + multiply_modifier = std::max( multiply_modifier + 1.0, 0.0 ); + int modified_value; + if( multiply_modifier < 1.0 ) { + modified_value = floor( multiply_modifier * value ); + } else { + modified_value = ceil( multiply_modifier * value ); + } + return modified_value + add_modifier; +} + +std::string relic::name() const +{ + if( item_name_override.empty() ) { + return ""; + } + return item_name_override.translated(); +} + +std::vector relic::get_enchantments() const +{ + return passive_effects; +} diff --git a/src/relic.h b/src/relic.h new file mode 100644 index 0000000000000..57287b258cb22 --- /dev/null +++ b/src/relic.h @@ -0,0 +1,48 @@ +#pragma once +#ifndef RELIC_H +#define RELIC_H + +#include "magic.h" +#include "magic_enchantment.h" + +#include +#include + +class Creature; +class islot_relic; +class JsonIn; +class JsonObject; +class JsonOut; +struct tripoint; + +class relic +{ + private: + std::vector active_effects; + std::vector passive_effects; + + // the item's name will be replaced with this if the string is not empty + translation item_name_override; + + int charges_per_activation; + // activating an artifact overrides all spell casting costs + int moves; + public: + std::string name() const; + // returns number of charges that should be consumed + int activate( Creature &caster, const tripoint &target ) const; + + void load( JsonObject &jo ); + + void serialize( JsonOut &jsout ) const; + void deserialize( JsonIn &jsin ); + + void add_passive_effect( const enchantment &ench ); + void add_active_effect( const fake_spell &sp ); + + std::vector get_enchantments() const; + + int modify_value( enchantment::mod value_type, int value ) const; +}; + +#endif // !RELIC_H diff --git a/src/safemode_ui.cpp b/src/safemode_ui.cpp index 0976cedee6421..a512922fbbc64 100644 --- a/src/safemode_ui.cpp +++ b/src/safemode_ui.cpp @@ -95,14 +95,16 @@ void safemode::show( const std::string &custom_name_in, bool is_safemode_in ) wrefresh( w_border ); static const std::vector hotkeys = {{ - _( "dd" ), _( "emove" ), _( "opy" ), _( "ove" ), - _( "nable" ), _( "isable" ), _( "est" ) + translate_marker( "dd" ), translate_marker( "emove" ), + translate_marker( "opy" ), translate_marker( "ove" ), + translate_marker( "nable" ), translate_marker( "isable" ), + translate_marker( "est" ) } }; int tmpx = 0; for( auto &hotkey : hotkeys ) { - tmpx += shortcut_print( w_header, point( tmpx, 0 ), c_white, c_light_green, hotkey ) + 2; + tmpx += shortcut_print( w_header, point( tmpx, 0 ), c_white, c_light_green, _( hotkey ) ) + 2; } tmpx = 0; @@ -221,7 +223,7 @@ void safemode::show( const std::string &custom_name_in, bool is_safemode_in ) }; draw_column( COLUMN_RULE, ( rule.rule.empty() ) ? _( "" ) : rule.rule ); - draw_column( COLUMN_ATTITUDE, Creature::get_attitude_ui_data( rule.attitude ).first ); + draw_column( COLUMN_ATTITUDE, Creature::get_attitude_ui_data( rule.attitude ).first.translated() ); draw_column( COLUMN_PROXIMITY, ( !rule.whitelist ) ? to_string( rule.proximity ) : "---" ); draw_column( COLUMN_WHITE_BLACKLIST, ( rule.whitelist ) ? _( "Whitelist" ) : _( "Blacklist" ) ); } diff --git a/src/savegame.cpp b/src/savegame.cpp index b0fddba7686fb..0c6e0d065369e 100644 --- a/src/savegame.cpp +++ b/src/savegame.cpp @@ -16,6 +16,7 @@ #include "creature_tracker.h" #include "debug.h" #include "faction.h" +#include "int_id.h" #include "io.h" #include "kill_tracker.h" #include "map.h" @@ -29,13 +30,13 @@ #include "overmap.h" #include "scent_map.h" #include "translations.h" -#include "tuple_hash.h" +#include "hash_utils.h" #include "basecamp.h" #include "json.h" #include "omdata.h" #include "overmap_types.h" #include "regional_settings.h" -#include "int_id.h" +#include "stats_tracker.h" #include "string_id.h" #if defined(__ANDROID__) @@ -94,8 +95,9 @@ void game::serialize( std::ostream &fout ) json.member( "active_monsters", *critter_tracker ); json.member( "stair_monsters", coming_to_stairs ); - // save killcounts. + // save stats. json.member( "kill_tracker", *kill_tracker_ptr ); + json.member( "stats_tracker", *stats_tracker_ptr ); json.member( "player", u ); Messages::serialize( json ); @@ -236,6 +238,7 @@ void game::unserialize( std::istream &fin ) } data.read( "player", u ); + data.read( "stats_tracker", *stats_tracker_ptr ); Messages::deserialize( data ); } catch( const JsonError &jsonerr ) { @@ -1010,8 +1013,8 @@ void overmap::unserialize( std::istream &fin ) while( !jsin.end_array() ) { std::shared_ptr new_npc = std::make_shared(); new_npc->deserialize( jsin ); - if( !new_npc->fac_id.str().empty() ) { - new_npc->set_fac( new_npc->fac_id ); + if( !new_npc->get_fac_id().str().empty() ) { + new_npc->set_fac( new_npc->get_fac_id() ); } npcs.push_back( new_npc ); } diff --git a/src/savegame_json.cpp b/src/savegame_json.cpp index 27b71aa21e5ac..ffcb4461eae5e 100644 --- a/src/savegame_json.cpp +++ b/src/savegame_json.cpp @@ -89,6 +89,7 @@ #include "magic_teleporter_list.h" #include "point.h" #include "requirements.h" +#include "stats_tracker.h" #include "vpart_position.h" struct oter_type_t; @@ -99,6 +100,7 @@ struct mutation_branch; static const trait_id trait_HYPEROPIC( "HYPEROPIC" ); static const trait_id trait_MYOPIC( "MYOPIC" ); const efftype_id effect_riding( "riding" ); +const efftype_id effect_ridden( "ridden" ); static const matype_id style_kicks( "style_kicks" ); @@ -245,6 +247,7 @@ void player_activity::serialize( JsonOut &json ) const json.member( "index", index ); json.member( "position", position ); json.member( "coords", coords ); + json.member( "coord_set", coord_set ); json.member( "name", name ); json.member( "targets", targets ); json.member( "placement", placement ); @@ -281,6 +284,7 @@ void player_activity::deserialize( JsonIn &jsin ) data.read( "index", index ); position = tmppos; data.read( "coords", coords ); + data.read( "coord_set", coord_set ); data.read( "name", name ); data.read( "targets", targets ); data.read( "placement", placement ); @@ -469,6 +473,7 @@ void Character::load( JsonObject &data ) if( has_effect( effect_riding ) ) { int temp_id; if( data.read( "mounted_creature", temp_id ) ) { + mounted_creature_id = temp_id; mounted_creature = g->critter_tracker->from_temporary_id( temp_id ); } else { mounted_creature = nullptr; @@ -637,7 +642,7 @@ void player::store( JsonOut &json ) const json.end_array(); json.member( "worn", worn ); // also saves contents - + json.member( "activity_vehicle_part_index", activity_vehicle_part_index ); // NPC activity json.member( "inv" ); inv.json_save_items( json ); @@ -720,7 +725,10 @@ void player::load( JsonObject &data ) data.read( "recoil", recoil ); data.read( "in_vehicle", in_vehicle ); data.read( "last_sleep_check", last_sleep_check ); - if( data.read( "id", tmpid ) ) { + if( data.read( "id", tmpid ) && tmpid.is_valid() ) { + // Templates have invalid ids, so we only assign here when valid. + // When the game starts, a new valid id will be assigned if not already + // present. setID( tmpid ); } @@ -782,6 +790,8 @@ void player::load( JsonObject &data ) on_stat_change( "pkill", pkill ); on_stat_change( "perceived_pain", get_perceived_pain() ); + data.read( "activity_vehicle_part_index", activity_vehicle_part_index ); + int tmptar; int tmptartyp = 0; @@ -895,8 +905,6 @@ void avatar::store( JsonOut &json ) const json.member( "completed_missions", mission::to_uid_vector( completed_missions ) ); json.member( "failed_missions", mission::to_uid_vector( failed_missions ) ); - json.member( "player_stats", lifetime_stats ); - json.member( "show_map_memory", show_map_memory ); json.member( "assigned_invlet" ); @@ -1085,8 +1093,6 @@ void avatar::load( JsonObject &data ) } } - data.read( "player_stats", lifetime_stats ); - //Load from legacy map_memory save location (now in its own file .mm) if( data.has_member( "map_memory_tiles" ) || data.has_member( "map_memory_curses" ) ) { player_map_memory.load( data ); @@ -1358,9 +1364,11 @@ void npc::load( JsonObject &data ) data.read( "name", name ); data.read( "marked_for_death", marked_for_death ); data.read( "dead", dead ); - if( data.read( "myclass", classtmp ) ) { + if( data.has_number( "myclass" ) ) { + data.read( "myclass", classtmp ); myclass = npc_class::from_legacy_int( classtmp ); - } else if( data.read( "myclass", classid ) ) { + } else if( data.has_string( "myclass" ) ) { + data.read( "myclass", classid ); myclass = npc_class_id( classid ); } @@ -1827,7 +1835,7 @@ void monster::load( JsonObject &data ) } last_baby = data.get_int( "last_baby", to_turn( calendar::turn ) ); last_biosig = data.get_int( "last_biosig", to_turn( calendar::turn ) ); - + data.read( "mounted_player_id", mounted_player_id ); data.read( "path", path ); } @@ -1891,6 +1899,8 @@ void monster::store( JsonOut &json ) const json.member( "inv", inv ); json.member( "dragged_foe_id", dragged_foe_id ); + // storing the rider + json.member( "mounted_player_id", mounted_player_id ); json.member( "path", path ); } @@ -2038,6 +2048,8 @@ void item::io( Archive &archive ) archive.io( "tools_to_continue", tools_to_continue, false ); archive.io( "cached_tool_selections", cached_tool_selections, io::empty_default_tag() ); + archive.io( "relic_data", relic_data ); + item_controller->migrate_item( orig, *this ); if( !Archive::is_input::value ) { @@ -2488,7 +2500,7 @@ void vehicle::deserialize( JsonIn &jsin ) data.read( "pivot", pivot_anchor[0] ); pivot_anchor[1] = pivot_anchor[0]; pivot_rotation[1] = pivot_rotation[0] = fdir; - + data.read( "is_following", is_following ); // Need to manually backfill the active item cache since the part loader can't call its vehicle. for( const vpart_reference &vp : get_any_parts( VPFLAG_CARGO ) ) { auto it = vp.part().items.begin(); @@ -2504,6 +2516,29 @@ void vehicle::deserialize( JsonIn &jsin ) install_part( vp.mount(), vpart_id( "turret_mount" ), false ); } + // Add vehicle mounts to cars that are missing them. + for( const vpart_reference &vp : get_any_parts( "NEEDS_WHEEL_MOUNT_LIGHT" ) ) { + if( vp.info().has_flag( "STEERABLE" ) ) { + install_part( vp.mount(), vpart_id( "wheel_mount_light_steerable" ), false ); + } else { + install_part( vp.mount(), vpart_id( "wheel_mount_light" ), false ); + } + } + for( const vpart_reference &vp : get_any_parts( "NEEDS_WHEEL_MOUNT_MEDIUM" ) ) { + if( vp.info().has_flag( "STEERABLE" ) ) { + install_part( vp.mount(), vpart_id( "wheel_mount_medium_steerable" ), false ); + } else { + install_part( vp.mount(), vpart_id( "wheel_mount_medium" ), false ); + } + } + for( const vpart_reference &vp : get_any_parts( "NEEDS_WHEEL_MOUNT_HEAVY" ) ) { + if( vp.info().has_flag( "STEERABLE" ) ) { + install_part( vp.mount(), vpart_id( "wheel_mount_heavy_steerable" ), false ); + } else { + install_part( vp.mount(), vpart_id( "wheel_mount_heavy" ), false ); + } + } + /* After loading, check if the vehicle is from the old rules and is missing * frames. */ if( savegame_loading_version < 11 ) { @@ -2605,6 +2640,7 @@ void vehicle::serialize( JsonOut &json ) const json.member( "camera_on", camera_on ); json.member( "last_update_turn", last_update ); json.member( "pivot", pivot_anchor[0] ); + json.member( "is_following", is_following ); json.end_object(); } @@ -3078,25 +3114,6 @@ void addiction::deserialize( JsonIn &jsin ) jo.read( "sated", sated ); } -void stats::serialize( JsonOut &json ) const -{ - json.start_object(); - json.member( "squares_walked", squares_walked ); - json.member( "damage_taken", damage_taken ); - json.member( "damage_healed", damage_healed ); - json.member( "headshots", headshots ); - json.end_object(); -} - -void stats::deserialize( JsonIn &jsin ) -{ - JsonObject jo = jsin.get_object(); - jo.read( "squares_walked", squares_walked ); - jo.read( "damage_taken", damage_taken ); - jo.read( "damage_healed", damage_healed ); - jo.read( "headshots", headshots ); -} - void serialize( const recipe_subset &value, JsonOut &jsout ) { jsout.start_array(); @@ -3272,6 +3289,62 @@ void kill_tracker::deserialize( JsonIn &jsin ) } } +void cata_variant::serialize( JsonOut &jsout ) const +{ + jsout.start_array(); + jsout.write_as_string( type_ ); + jsout.write( value_ ); + jsout.end_array(); +} + +void cata_variant::deserialize( JsonIn &jsin ) +{ + jsin.start_array(); + if( !( jsin.read( type_ ) && jsin.read( value_ ) ) ) { + jsin.error( "Failed to read cata_variant" ); + } + jsin.end_array(); +} + +void event_tracker::serialize( JsonOut &jsout ) const +{ + jsout.start_object(); + using value_type = decltype( event_counts )::value_type; + std::vector copy( event_counts.begin(), event_counts.end() ); + jsout.member( "event_counts", copy ); + jsout.end_object(); +} + +void event_tracker::deserialize( JsonIn &jsin ) +{ + jsin.start_object(); + while( !jsin.end_object() ) { + std::string name = jsin.get_member_name(); + if( name == "event_counts" ) { + std::vector> copy; + if( !jsin.read( copy ) ) { + jsin.error( "Failed to read event_counts" ); + } + event_counts = { copy.begin(), copy.end() }; + } else { + jsin.skip_value(); + } + } +} + +void stats_tracker::serialize( JsonOut &jsout ) const +{ + jsout.start_object(); + jsout.member( "data", data ); + jsout.end_object(); +} + +void stats_tracker::deserialize( JsonIn &jsin ) +{ + JsonObject jo = jsin.get_object(); + jo.read( "data", data ); +} + void submap::store( JsonOut &jsout ) const { jsout.member( "turn_last_touched", last_touched ); diff --git a/src/sdltiles.cpp b/src/sdltiles.cpp index 24a580aabf66e..b8dbb4e357779 100644 --- a/src/sdltiles.cpp +++ b/src/sdltiles.cpp @@ -380,7 +380,12 @@ static void WinCreate() SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 5 ); // Prevent mouse|touch input confusion +#if defined(SDL_HINT_ANDROID_SEPARATE_MOUSE_AND_TOUCH) SDL_SetHint( SDL_HINT_ANDROID_SEPARATE_MOUSE_AND_TOUCH, "1" ); +#else + SDL_SetHint( SDL_HINT_MOUSE_TOUCH_EVENTS, "0" ); + SDL_SetHint( SDL_HINT_TOUCH_MOUSE_EVENTS, "0" ); +#endif #endif ::window.reset( SDL_CreateWindow( version.c_str(), @@ -1030,8 +1035,7 @@ void cata_cursesport::curses_drawwindow( const catacurses::window &w ) // game::w_terrain can be drawn by the tilecontext. // skip the normal drawing code for it. tilecontext->draw( - win->pos.x * fontwidth, - win->pos.y * fontheight, + point( win->pos.x * fontwidth, win->pos.y * fontheight ), g->ter_view_p, TERRAIN_WINDOW_TERM_WIDTH * font->fontwidth, TERRAIN_WINDOW_TERM_HEIGHT * font->fontheight, @@ -1159,7 +1163,7 @@ void cata_cursesport::curses_drawwindow( const catacurses::window &w ) // Make sure the entire minimap window is black before drawing. clear_window_area( w ); tilecontext->draw_minimap( - win->pos.x * fontwidth, win->pos.y * fontheight, + point( win->pos.x * fontwidth, win->pos.y * fontheight ), tripoint( g->u.pos().xy(), g->ter_view_p.z ), win->width * font->fontwidth, win->height * font->fontheight ); update = true; diff --git a/src/simple_pathfinding.h b/src/simple_pathfinding.h index 650402d76caa9..29e5bd3e64c98 100644 --- a/src/simple_pathfinding.h +++ b/src/simple_pathfinding.h @@ -53,7 +53,7 @@ path find_path( const point &source, static constexpr point d[4] = { point_north, point_east, point_south, point_west }; const auto inbounds = [ max_x, max_y ]( const point & p ) { - return p.x >= 0 && p.x < max_x && p.y >= 0 && p.y <= max_y; + return p.x >= 0 && p.x < max_x && p.y >= 0 && p.y < max_y; }; const auto map_index = [ max_x ]( const point & p ) { @@ -119,7 +119,7 @@ path find_path( const point &source, // don't allow: // * out of bounds // * already traversed tiles - if( p.x < 1 || p.x + 1 >= max_x || p.y < 1 || p.y + 1 >= max_y || closed[n] ) { + if( !inbounds( p ) || closed[n] ) { continue; } diff --git a/src/skill.cpp b/src/skill.cpp index fb08305aaa92a..2370f4cb56d22 100644 --- a/src/skill.cpp +++ b/src/skill.cpp @@ -19,7 +19,10 @@ std::vector Skill::skills; std::map Skill::contextual_skills; +std::vector SkillDisplayType::skillTypes; + static const Skill invalid_skill; +static const SkillDisplayType invalid_skill_type; /** @relates string_id */ template<> @@ -46,15 +49,16 @@ bool string_id::is_valid() const return &obj() != &invalid_skill; } -Skill::Skill() : Skill( skill_id::NULL_ID(), translation( "nothing" ), - translation( "The zen-most skill there is." ), - std::set {} ) +Skill::Skill() : Skill( skill_id::NULL_ID(), to_translation( "nothing" ), + to_translation( "The zen-most skill there is." ), + std::set {}, skill_displayType_id::NULL_ID() ) { } Skill::Skill( const skill_id &ident, const translation &name, const translation &description, - const std::set &tags ) - : _ident( ident ), _name( name ), _description( description ), _tags( tags ) + const std::set &tags, skill_displayType_id display_type ) + : _ident( ident ), _name( name ), _description( description ), _tags( tags ), + _display_type( display_type ) { } @@ -91,7 +95,8 @@ void Skill::load_skill( JsonObject &jsobj ) translation name, desc; jsobj.read( "name", name ); jsobj.read( "description", desc ); - const Skill sk( ident, name, desc, jsobj.get_tags( "tags" ) ); + skill_displayType_id display_type = skill_displayType_id( jsobj.get_string( "display_category" ) ); + const Skill sk( ident, name, desc, jsobj.get_tags( "tags" ), display_type ); if( sk.is_contextual_skill() ) { contextual_skills[sk.ident()] = sk; @@ -100,6 +105,43 @@ void Skill::load_skill( JsonObject &jsobj ) } } +SkillDisplayType::SkillDisplayType() : SkillDisplayType( skill_displayType_id::NULL_ID(), + to_translation( "invalid" ) ) +{ +} + +SkillDisplayType::SkillDisplayType( const skill_displayType_id &ident, + const translation &display_string ) + : _ident( ident ), _display_string( display_string ) +{ +} + + +void SkillDisplayType::load( JsonObject &jsobj ) +{ + skill_displayType_id ident = skill_displayType_id( jsobj.get_string( "ident" ) ); + skillTypes.erase( std::remove_if( begin( skillTypes ), + end( skillTypes ), [&]( const SkillDisplayType & s ) { + return s._ident == ident; + } ), end( skillTypes ) ); + + translation display_string; + jsobj.read( "display_string", display_string ); + const SkillDisplayType sk( ident, display_string ); + skillTypes.push_back( sk ); +} + + +const SkillDisplayType &SkillDisplayType::get_skill_type( skill_displayType_id id ) +{ + for( auto &i : skillTypes ) { + if( i._ident == id ) { + return i; + } + } + return invalid_skill_type; +} + skill_id Skill::from_legacy_int( const int legacy_id ) { static const std::array legacy_skills = { { diff --git a/src/skill.h b/src/skill.h index c4134f0c3cf49..71a6771034ae2 100644 --- a/src/skill.h +++ b/src/skill.h @@ -27,6 +27,7 @@ class Skill translation _name; translation _description; std::set _tags; + skill_displayType_id _display_type; // these are not real skills, they depend on context static std::map contextual_skills; public: @@ -44,7 +45,7 @@ class Skill Skill(); Skill( const skill_id &ident, const translation &name, const translation &description, - const std::set &tags ); + const std::set &tags, skill_displayType_id display_type ); const skill_id &ident() const { return _ident; @@ -55,6 +56,9 @@ class Skill std::string description() const { return _description.translated(); } + skill_displayType_id display_category() const { + return _display_type; + } bool operator==( const Skill &b ) const { return this->_ident == b._ident; @@ -190,6 +194,28 @@ class SkillLevelMap : public std::map bool has_recipe_requirements( const recipe &rec ) const; }; +class SkillDisplayType +{ + friend class string_id; + skill_displayType_id _ident; + translation _display_string; + public: + static std::vector skillTypes; + static void load( JsonObject &jsobj ); + + static const SkillDisplayType &get_skill_type( skill_displayType_id ); + + SkillDisplayType(); + SkillDisplayType( const skill_displayType_id &ident, const translation &display_string ); + + const skill_displayType_id &ident() const { + return _ident; + } + std::string display_string() const { + return _display_string.translated(); + } +}; + double price_adjustment( int ); #endif diff --git a/src/stats_tracker.cpp b/src/stats_tracker.cpp new file mode 100644 index 0000000000000..336a185b628d3 --- /dev/null +++ b/src/stats_tracker.cpp @@ -0,0 +1,78 @@ +#include "stats_tracker.h" + +static bool event_data_matches( const cata::event::data_type &data, + const cata::event::data_type &criteria ) +{ + for( const auto &criterion : criteria ) { + auto it = data.find( criterion.first ); + if( it == data.end() || it->second != criterion.second ) { + return false; + } + } + return true; +} + +int event_tracker::count( const cata::event::data_type &criteria ) const +{ + int total = 0; + for( const auto &pair : event_counts ) { + if( event_data_matches( pair.first, criteria ) ) { + total += pair.second; + } + } + return total; +} + +int event_tracker::total( const std::string &field, const cata::event::data_type &criteria ) const +{ + int total = 0; + for( const auto &pair : event_counts ) { + auto it = pair.first.find( field ); + if( it == pair.first.end() ) { + continue; + } + if( event_data_matches( pair.first, criteria ) ) { + total += pair.second * it->second.get(); + } + } + return total; +} + +void event_tracker::add( const cata::event &e ) +{ + event_counts[e.data()]++; +} + +int stats_tracker::count( const cata::event &e ) const +{ + return count( e.type(), e.data() ); +} + +int stats_tracker::count( event_type type, const cata::event::data_type &criteria ) const +{ + auto it = data.find( type ); + if( it == data.end() ) { + return 0; + } + return it->second.count( criteria ); +} + +int stats_tracker::total( event_type type, const std::string &field, + const cata::event::data_type &criteria ) const +{ + auto it = data.find( type ); + if( it == data.end() ) { + return 0; + } + return it->second.total( field, criteria ); +} + +void stats_tracker::clear() +{ + data.clear(); +} + +void stats_tracker::notify( const cata::event &e ) +{ + data[e.type()].add( e ); +} diff --git a/src/stats_tracker.h b/src/stats_tracker.h new file mode 100644 index 0000000000000..b7d724188bd9b --- /dev/null +++ b/src/stats_tracker.h @@ -0,0 +1,60 @@ +#ifndef CATA_STATS_TRACKER_H +#define CATA_STATS_TRACKER_H + +#include "event_bus.h" +#include "hash_utils.h" + +// The stats_tracker is intended to keep a summary of events that have occured. +// For each event_type it stores an event_tracker. +// Within the event_tracker, counts are kept. The events are partitioned +// according to their data (an event::data_type object, which is a map of keys +// to values). +// The stats_tracker can be queried in various ways to get summary statistics +// about events that have occured. + +class event_tracker +{ + public: + int count( const cata::event::data_type &criteria ) const; + int total( const std::string &field, const cata::event::data_type &criteria ) const; + + void add( const cata::event & ); + + void serialize( JsonOut & ) const; + void deserialize( JsonIn & ); + private: + std::unordered_map event_counts; +}; + +class stats_tracker : public event_subscriber +{ + public: + // count returns the number of events matching given criteria that have + // occured. + // total returns the sum of some integer-valued field across every + // event satisfying certain criteria. + // For example, count might return the number of times the avatar has + // taken damage, while total might return the total damage taken in all + // those cases. + // The criteria have two parts: + // - The event_type + // - An event::data_type map specifying some values that must be + // matched in the events of that type. You can provide just a subset + // of the relevant keys from the event_type in your criteria. + // The first count overload combines these criteria into a single event + // object for convenience since that contains the two pieces necessary. + int count( const cata::event & ) const; + int count( event_type, const cata::event::data_type &criteria ) const; + int total( event_type, const std::string &field, + const cata::event::data_type &criteria ) const; + + void clear(); + void notify( const cata::event & ) override; + + void serialize( JsonOut & ) const; + void deserialize( JsonIn & ); + private: + std::unordered_map data; +}; + +#endif // CATA_STATS_TRACKER_H diff --git a/src/string_id_null_ids.cpp b/src/string_id_null_ids.cpp index 555193214f516..e81d2ccd79687 100644 --- a/src/string_id_null_ids.cpp +++ b/src/string_id_null_ids.cpp @@ -20,6 +20,7 @@ MAKE_NULL_ID( overmap_special, "", 0 ) MAKE_NULL_ID( overmap_connection, "", 0 ) MAKE_NULL_ID( map_extra, "", 0 ) MAKE_NULL_ID( Skill, "none" ) +MAKE_NULL_ID( SkillDisplayType, "none" ) MAKE_NULL_ID( npc_class, "NC_NONE" ) MAKE_NULL_ID( ammunition_type, "NULL" ) MAKE_NULL_ID( vpart_info, "null" ) diff --git a/src/timed_event.cpp b/src/timed_event.cpp index ffb42f3bb576f..d4276155f4e22 100644 --- a/src/timed_event.cpp +++ b/src/timed_event.cpp @@ -6,10 +6,12 @@ #include "avatar.h" #include "avatar_action.h" #include "debug.h" +#include "event_bus.h" #include "game.h" #include "line.h" #include "map.h" #include "mapdata.h" +#include "memorial_logger.h" #include "messages.h" #include "morale_types.h" #include "options.h" @@ -51,8 +53,7 @@ void timed_event::actualize() if( rl_dist( u_pos, map_point ) <= 4 ) { const mtype_id &robot_type = one_in( 2 ) ? mon_copbot : mon_riotbot; - g->u.add_memorial_log( pgettext( "memorial_male", "Became wanted by the police!" ), - pgettext( "memorial_female", "Became wanted by the police!" ) ); + g->events().send( g->u.getID() ); int robx = u_pos.x > map_point.x ? 0 - SEEX * 2 : SEEX * 4; int roby = u_pos.y > map_point.y ? 0 - SEEY * 2 : SEEY * 4; g->summon_mon( robot_type, tripoint( robx, roby, g->u.posz() ) ); @@ -64,8 +65,9 @@ void timed_event::actualize() if( g->get_levz() >= 0 ) { return; } - g->u.add_memorial_log( pgettext( "memorial_male", "Drew the attention of more dark wyrms!" ), - pgettext( "memorial_female", "Drew the attention of more dark wyrms!" ) ); + g->memorial().add( + pgettext( "memorial_male", "Drew the attention of more dark wyrms!" ), + pgettext( "memorial_female", "Drew the attention of more dark wyrms!" ) ); int num_wyrms = rng( 1, 4 ); for( int i = 0; i < num_wyrms; i++ ) { int tries = 0; @@ -98,8 +100,7 @@ void timed_event::actualize() break; case TIMED_EVENT_AMIGARA: { - g->u.add_memorial_log( pgettext( "memorial_male", "Angered a group of amigara horrors!" ), - pgettext( "memorial_female", "Angered a group of amigara horrors!" ) ); + g->events().send(); int num_horrors = rng( 3, 5 ); int faultx = -1; int faulty = -1; @@ -144,8 +145,7 @@ void timed_event::actualize() break; case TIMED_EVENT_ROOTS_DIE: - g->u.add_memorial_log( pgettext( "memorial_male", "Destroyed a triffid grove." ), - pgettext( "memorial_female", "Destroyed a triffid grove." ) ); + g->events().send(); for( int x = 0; x < MAPSIZE_X; x++ ) { for( int y = 0; y < MAPSIZE_Y; y++ ) { if( g->m.ter( point( x, y ) ) == t_root_wall && one_in( 3 ) ) { @@ -156,8 +156,7 @@ void timed_event::actualize() break; case TIMED_EVENT_TEMPLE_OPEN: { - g->u.add_memorial_log( pgettext( "memorial_male", "Opened a strange temple." ), - pgettext( "memorial_female", "Opened a strange temple." ) ); + g->events().send(); bool saw_grate = false; for( int x = 0; x < MAPSIZE_X; x++ ) { for( int y = 0; y < MAPSIZE_Y; y++ ) { @@ -222,12 +221,14 @@ void timed_event::actualize() if( flood_buf[g->u.posx()][g->u.posy()] != g->m.ter( point( g->u.posx(), g->u.posy() ) ) ) { if( flood_buf[g->u.posx()][g->u.posy()] == t_water_sh ) { add_msg( m_warning, _( "Water quickly floods up to your knees." ) ); - g->u.add_memorial_log( pgettext( "memorial_male", "Water level reached knees." ), - pgettext( "memorial_female", "Water level reached knees." ) ); + g->memorial().add( + pgettext( "memorial_male", "Water level reached knees." ), + pgettext( "memorial_female", "Water level reached knees." ) ); } else { // Must be deep water! add_msg( m_warning, _( "Water fills nearly to the ceiling!" ) ); - g->u.add_memorial_log( pgettext( "memorial_male", "Water level reached the ceiling." ), - pgettext( "memorial_female", "Water level reached the ceiling." ) ); + g->memorial().add( + pgettext( "memorial_male", "Water level reached the ceiling." ), + pgettext( "memorial_female", "Water level reached the ceiling." ) ); avatar_action::swim( g->m, g->u, g->u.pos() ); } } diff --git a/src/translations.cpp b/src/translations.cpp index e700806348606..24d502dc7d790 100644 --- a/src/translations.cpp +++ b/src/translations.cpp @@ -366,6 +366,16 @@ translation::translation( const std::string &str, const no_translation_tag ) { } +translation translation::to_translation( const std::string &raw ) +{ + return { raw }; +} + +translation translation::to_translation( const std::string &ctxt, const std::string &raw ) +{ + return { ctxt, raw }; +} + translation translation::no_translation( const std::string &str ) { return { str, no_translation_tag() }; @@ -400,6 +410,11 @@ std::string translation::translated() const } } +std::string translation::untranslated() const +{ + return raw; +} + bool translation::empty() const { return raw.empty(); @@ -430,6 +445,16 @@ bool translation::operator!=( const translation &that ) const return !operator==( that ); } +translation to_translation( const std::string &raw ) +{ + return translation::to_translation( raw ); +} + +translation to_translation( const std::string &ctxt, const std::string &raw ) +{ + return translation::to_translation( ctxt, raw ); +} + translation no_translation( const std::string &str ) { return translation::no_translation( str ); diff --git a/src/translations.h b/src/translations.h index 215b8a70e1ad4..7c25d67b48fe3 100644 --- a/src/translations.h +++ b/src/translations.h @@ -118,16 +118,12 @@ class translation { public: translation(); - /** - * Create a deferred translation with context - **/ - translation( const std::string &ctxt, const std::string &raw ); /** - * Create a deferred translation without context + * Store a string and an optional context for translation **/ - explicit translation( const std::string &raw ); - + static translation to_translation( const std::string &raw ); + static translation to_translation( const std::string &ctxt, const std::string &raw ); /** * Store a string that needs no translation. **/ @@ -147,6 +143,11 @@ class translation **/ std::string translated() const; + /** + * Returns the raw string, untranslated. + **/ + std::string untranslated() const; + /** * Whether the underlying string is empty, not matter what the context * is or whether translation is needed. @@ -169,6 +170,8 @@ class translation bool operator==( const translation &that ) const; bool operator!=( const translation &that ) const; private: + translation( const std::string &ctxt, const std::string &raw ); + translation( const std::string &raw ); struct no_translation_tag {}; translation( const std::string &str, no_translation_tag ); @@ -177,6 +180,11 @@ class translation bool needs_translation = false; }; +/** + * Shorthands for translation::to_translation + **/ +translation to_translation( const std::string &raw ); +translation to_translation( const std::string &ctxt, const std::string &raw ); /** * Shorthand for translation::no_translation **/ diff --git a/src/trap.cpp b/src/trap.cpp index 9b36e07b2f7cd..a6ad9cee63b21 100644 --- a/src/trap.cpp +++ b/src/trap.cpp @@ -4,6 +4,8 @@ #include #include "debug.h" +#include "event_bus.h" +#include "game.h" #include "generic_factory.h" #include "int_id.h" #include "json.h" @@ -219,8 +221,14 @@ bool trap::can_see( const tripoint &pos, const player &p ) const void trap::trigger( const tripoint &pos, Creature *creature, item *item ) const { - if( ( creature != nullptr && !creature->is_hallucination() ) || item != nullptr ) { - act( pos, creature, item ); + const bool is_real_creature = creature != nullptr && !creature->is_hallucination(); + if( is_real_creature || item != nullptr ) { + bool triggered = act( pos, creature, item ); + if( triggered && is_real_creature ) { + if( Character *ch = creature->as_character() ) { + g->events().send( ch->getID(), id ); + } + } } } diff --git a/src/trap.h b/src/trap.h index 0b34c05487cd3..b21c78cefaf11 100644 --- a/src/trap.h +++ b/src/trap.h @@ -28,39 +28,39 @@ namespace trapfunc // creature is the creature that triggered the trap, // item is the item that triggered the trap, // creature and item can be nullptr. -void none( const tripoint &, Creature *, item * ); -void bubble( const tripoint &p, Creature *c, item *i ); -void glass( const tripoint &p, Creature *c, item *i ); -void cot( const tripoint &p, Creature *c, item *i ); -void beartrap( const tripoint &p, Creature *c, item *i ); -void snare_light( const tripoint &p, Creature *c, item *i ); -void snare_heavy( const tripoint &p, Creature *c, item *i ); -void board( const tripoint &p, Creature *c, item *i ); -void caltrops( const tripoint &p, Creature *c, item *i ); -void caltrops_glass( const tripoint &p, Creature *c, item *i ); -void tripwire( const tripoint &p, Creature *c, item *i ); -void crossbow( const tripoint &p, Creature *c, item *i ); -void shotgun( const tripoint &p, Creature *c, item *i ); -void blade( const tripoint &p, Creature *c, item *i ); -void landmine( const tripoint &p, Creature *c, item *i ); -void telepad( const tripoint &p, Creature *c, item *i ); -void goo( const tripoint &p, Creature *c, item *i ); -void dissector( const tripoint &p, Creature *c, item *i ); -void sinkhole( const tripoint &p, Creature *c, item *i ); -void pit( const tripoint &p, Creature *c, item *i ); -void pit_spikes( const tripoint &p, Creature *c, item *i ); -void pit_glass( const tripoint &p, Creature *c, item *i ); -void lava( const tripoint &p, Creature *c, item *i ); -void portal( const tripoint &p, Creature *c, item *i ); -void ledge( const tripoint &p, Creature *c, item *i ); -void boobytrap( const tripoint &p, Creature *c, item *i ); -void temple_flood( const tripoint &p, Creature *c, item *i ); -void temple_toggle( const tripoint &p, Creature *c, item *i ); -void glow( const tripoint &p, Creature *c, item *i ); -void hum( const tripoint &p, Creature *c, item *i ); -void shadow( const tripoint &p, Creature *c, item *i ); -void drain( const tripoint &p, Creature *c, item *i ); -void snake( const tripoint &p, Creature *c, item *i ); +bool none( const tripoint &, Creature *, item * ); +bool bubble( const tripoint &p, Creature *c, item *i ); +bool glass( const tripoint &p, Creature *c, item *i ); +bool cot( const tripoint &p, Creature *c, item *i ); +bool beartrap( const tripoint &p, Creature *c, item *i ); +bool snare_light( const tripoint &p, Creature *c, item *i ); +bool snare_heavy( const tripoint &p, Creature *c, item *i ); +bool board( const tripoint &p, Creature *c, item *i ); +bool caltrops( const tripoint &p, Creature *c, item *i ); +bool caltrops_glass( const tripoint &p, Creature *c, item *i ); +bool tripwire( const tripoint &p, Creature *c, item *i ); +bool crossbow( const tripoint &p, Creature *c, item *i ); +bool shotgun( const tripoint &p, Creature *c, item *i ); +bool blade( const tripoint &p, Creature *c, item *i ); +bool landmine( const tripoint &p, Creature *c, item *i ); +bool telepad( const tripoint &p, Creature *c, item *i ); +bool goo( const tripoint &p, Creature *c, item *i ); +bool dissector( const tripoint &p, Creature *c, item *i ); +bool sinkhole( const tripoint &p, Creature *c, item *i ); +bool pit( const tripoint &p, Creature *c, item *i ); +bool pit_spikes( const tripoint &p, Creature *c, item *i ); +bool pit_glass( const tripoint &p, Creature *c, item *i ); +bool lava( const tripoint &p, Creature *c, item *i ); +bool portal( const tripoint &p, Creature *c, item *i ); +bool ledge( const tripoint &p, Creature *c, item *i ); +bool boobytrap( const tripoint &p, Creature *c, item *i ); +bool temple_flood( const tripoint &p, Creature *c, item *i ); +bool temple_toggle( const tripoint &p, Creature *c, item *i ); +bool glow( const tripoint &p, Creature *c, item *i ); +bool hum( const tripoint &p, Creature *c, item *i ); +bool shadow( const tripoint &p, Creature *c, item *i ); +bool drain( const tripoint &p, Creature *c, item *i ); +bool snake( const tripoint &p, Creature *c, item *i ); } // namespace trapfunc struct vehicle_handle_trap_data { @@ -81,7 +81,7 @@ struct vehicle_handle_trap_data { trap_str_id set_trap = trap_str_id::NULL_ID(); }; -using trap_function = std::function; +using trap_function = std::function; struct trap { using itype_id = std::string; diff --git a/src/trapfunc.cpp b/src/trapfunc.cpp index d56b4a489326d..138b0bbb19c63 100644 --- a/src/trapfunc.cpp +++ b/src/trapfunc.cpp @@ -70,40 +70,38 @@ static float pit_effectiveness( const tripoint &p ) return std::max( 0.0f, 1.0f - corpse_volume / filled_volume ); } -void trapfunc::none( const tripoint &, Creature *, item * ) +bool trapfunc::none( const tripoint &, Creature *, item * ) { + return false; } -void trapfunc::bubble( const tripoint &p, Creature *c, item * ) +bool trapfunc::bubble( const tripoint &p, Creature *c, item * ) { // tiny animals don't trigger bubble wrap if( c != nullptr && c->get_size() == MS_TINY ) { - return; + return false; } if( c != nullptr ) { c->add_msg_player_or_npc( m_warning, _( "You step on some bubble wrap!" ), _( " steps on some bubble wrap!" ) ); - c->add_memorial_log( pgettext( "memorial_male", "Stepped on bubble wrap." ), - pgettext( "memorial_female", "Stepped on bubble wrap." ) ); if( c->has_effect( effect_ridden ) ) { add_msg( m_warning, _( "Your %s steps on some bubble wrap!" ), c->get_name() ); } } sounds::sound( p, 18, sounds::sound_t::alarm, _( "Pop!" ), false, "trap", "bubble_wrap" ); g->m.remove_trap( p ); + return true; } -void trapfunc::glass( const tripoint &p, Creature *c, item * ) +bool trapfunc::glass( const tripoint &p, Creature *c, item * ) { if( c != nullptr ) { // tiny animals and hallucinations don't trigger glass trap if( c->get_size() == MS_TINY || c->is_hallucination() ) { - return; + return false; } c->add_msg_player_or_npc( m_warning, _( "You step on some glass!" ), _( " steps on some glass!" ) ); - c->add_memorial_log( pgettext( "memorial_male", "Stepped on glass." ), - pgettext( "memorial_female", "Stepped on glass." ) ); monster *z = dynamic_cast( c ); const char dmg = std::max( 0, rng( -10, 10 ) ); @@ -118,23 +116,26 @@ void trapfunc::glass( const tripoint &p, Creature *c, item * ) } sounds::sound( p, 10, sounds::sound_t::combat, _( "glass cracking!" ), false, "trap", "glass" ); g->m.remove_trap( p ); + return true; } -void trapfunc::cot( const tripoint &, Creature *c, item * ) +bool trapfunc::cot( const tripoint &, Creature *c, item * ) { monster *z = dynamic_cast( c ); if( z != nullptr ) { // Haha, only monsters stumble over a cot, humans are smart. add_msg( m_good, _( "The %s stumbles over the cot" ), z->name() ); c->moves -= 100; + return true; } + return false; } -void trapfunc::beartrap( const tripoint &p, Creature *c, item * ) +bool trapfunc::beartrap( const tripoint &p, Creature *c, item * ) { // tiny animals don't trigger bear traps if( c != nullptr && c->get_size() == MS_TINY ) { - return; + return false; } sounds::sound( p, 8, sounds::sound_t::combat, _( "SNAP!" ), false, "trap", "bear_trap" ); g->m.remove_trap( p ); @@ -143,8 +144,6 @@ void trapfunc::beartrap( const tripoint &p, Creature *c, item * ) const body_part hit = one_in( 2 ) ? bp_leg_l : bp_leg_r; // Messages - c->add_memorial_log( pgettext( "memorial_male", "Caught by a beartrap." ), - pgettext( "memorial_female", "Caught by a beartrap." ) ); c->add_msg_player_or_npc( m_bad, _( "A bear trap closes on your foot!" ), _( "A bear trap closes on 's foot!" ) ); if( c->has_effect( effect_ridden ) ) { @@ -171,19 +170,18 @@ void trapfunc::beartrap( const tripoint &p, Creature *c, item * ) } else { g->m.spawn_item( p, "beartrap" ); } + return true; } -void trapfunc::board( const tripoint &, Creature *c, item * ) +bool trapfunc::board( const tripoint &, Creature *c, item * ) { if( c == nullptr ) { - return; + return false; } // tiny animals don't trigger spiked boards, they can squeeze between the nails if( c->get_size() == MS_TINY ) { - return; + return false; } - c->add_memorial_log( pgettext( "memorial_male", "Stepped on a spiked board." ), - pgettext( "memorial_female", "Stepped on a spiked board." ) ); c->add_msg_player_or_npc( m_bad, _( "You step on a spiked board!" ), _( " steps on a spiked board!" ) ); monster *z = dynamic_cast( c ); @@ -208,19 +206,18 @@ void trapfunc::board( const tripoint &, Creature *c, item * ) } } c->check_dead_state(); + return true; } -void trapfunc::caltrops( const tripoint &, Creature *c, item * ) +bool trapfunc::caltrops( const tripoint &, Creature *c, item * ) { if( c == nullptr ) { - return; + return false; } // tiny animals don't trigger caltrops, they can squeeze between them if( c->get_size() == MS_TINY ) { - return; + return false; } - c->add_memorial_log( pgettext( "memorial_male", "Stepped on a caltrop." ), - pgettext( "memorial_female", "Stepped on a caltrop." ) ); c->add_msg_player_or_npc( m_bad, _( "You step on a sharp metal caltrop!" ), _( " steps on a sharp metal caltrop!" ) ); monster *z = dynamic_cast( c ); @@ -238,19 +235,18 @@ void trapfunc::caltrops( const tripoint &, Creature *c, item * ) c->deal_damage( nullptr, bp_foot_r, damage_instance( DT_CUT, rng( 9, 30 ) ) ); } c->check_dead_state(); + return true; } -void trapfunc::caltrops_glass( const tripoint &p, Creature *c, item * ) +bool trapfunc::caltrops_glass( const tripoint &p, Creature *c, item * ) { if( c == nullptr ) { - return; + return false; } // tiny animals don't trigger caltrops, they can squeeze between them if( c->get_size() == MS_TINY || c->is_hallucination() ) { - return; + return false; } - c->add_memorial_log( pgettext( "memorial_male", "Stepped on a glass caltrop." ), - pgettext( "memorial_female", "Stepped on a glass caltrop." ) ); c->add_msg_player_or_npc( m_bad, _( "You step on a sharp glass caltrop!" ), _( " steps on a sharp glass caltrop!" ) ); monster *z = dynamic_cast( c ); @@ -269,19 +265,18 @@ void trapfunc::caltrops_glass( const tripoint &p, Creature *c, item * ) "glass_caltrops" ); } g->m.remove_trap( p ); + return true; } -void trapfunc::tripwire( const tripoint &p, Creature *c, item * ) +bool trapfunc::tripwire( const tripoint &p, Creature *c, item * ) { if( c == nullptr ) { - return; + return false; } // tiny animals don't trigger tripwires, they just squeeze under it if( c->get_size() == MS_TINY ) { - return; + return false; } - c->add_memorial_log( pgettext( "memorial_male", "Tripped on a tripwire." ), - pgettext( "memorial_female", "Tripped on a tripwire." ) ); c->add_msg_player_or_npc( m_bad, _( "You trip over a tripwire!" ), _( " trips over a tripwire!" ) ); monster *z = dynamic_cast( c ); @@ -329,9 +324,10 @@ void trapfunc::tripwire( const tripoint &p, Creature *c, item * ) } } c->check_dead_state(); + return true; } -void trapfunc::crossbow( const tripoint &p, Creature *c, item * ) +bool trapfunc::crossbow( const tripoint &p, Creature *c, item * ) { bool add_bolt = true; if( c != nullptr ) { @@ -340,8 +336,6 @@ void trapfunc::crossbow( const tripoint &p, Creature *c, item * ) } c->add_msg_player_or_npc( m_neutral, _( "You trigger a crossbow trap!" ), _( " triggers a crossbow trap!" ) ); - c->add_memorial_log( pgettext( "memorial_male", "Triggered a crossbow trap." ), - pgettext( "memorial_female", "Triggered a crossbow trap." ) ); monster *z = dynamic_cast( c ); player *n = dynamic_cast( c ); if( n != nullptr ) { @@ -423,9 +417,10 @@ void trapfunc::crossbow( const tripoint &p, Creature *c, item * ) if( add_bolt ) { g->m.spawn_item( p, "bolt_steel", 1, 1 ); } + return true; } -void trapfunc::shotgun( const tripoint &p, Creature *c, item * ) +bool trapfunc::shotgun( const tripoint &p, Creature *c, item * ) { sounds::sound( p, 60, sounds::sound_t::combat, _( "Kerblam!" ), false, "fire_gun", g->m.tr_at( p ).loadid == tr_shotgun_1 ? "shotgun_s" : "shotgun_d" ); @@ -436,8 +431,6 @@ void trapfunc::shotgun( const tripoint &p, Creature *c, item * ) } c->add_msg_player_or_npc( m_neutral, _( "You trigger a shotgun trap!" ), _( " triggers a shotgun trap!" ) ); - c->add_memorial_log( pgettext( "memorial_male", "Triggered a shotgun trap." ), - pgettext( "memorial_female", "Triggered a shotgun trap." ) ); monster *z = dynamic_cast( c ); player *n = dynamic_cast( c ); if( n != nullptr ) { @@ -519,33 +512,33 @@ void trapfunc::shotgun( const tripoint &p, Creature *c, item * ) g->m.spawn_item( p, g->m.tr_at( p ).loadid == tr_shotgun_1 ? "shotgun_s" : "shotgun_d" ); g->m.spawn_item( p, "string_36" ); g->m.remove_trap( p ); + return true; } -void trapfunc::blade( const tripoint &, Creature *c, item * ) +bool trapfunc::blade( const tripoint &, Creature *c, item * ) { if( c == nullptr ) { - return; + return false; } if( c->has_effect( effect_ridden ) ) { add_msg( m_bad, _( "A blade swings out and hacks your %s!" ), c->get_name() ); } c->add_msg_player_or_npc( m_bad, _( "A blade swings out and hacks your torso!" ), _( "A blade swings out and hacks s torso!" ) ); - c->add_memorial_log( pgettext( "memorial_male", "Triggered a blade trap." ), - pgettext( "memorial_female", "Triggered a blade trap." ) ); damage_instance d; d.add_damage( DT_BASH, 12 ); d.add_damage( DT_CUT, 30 ); c->deal_damage( nullptr, bp_torso, d ); c->check_dead_state(); + return true; } -void trapfunc::snare_light( const tripoint &p, Creature *c, item * ) +bool trapfunc::snare_light( const tripoint &p, Creature *c, item * ) { sounds::sound( p, 2, sounds::sound_t::combat, _( "Snap!" ), false, "trap", "snare" ); g->m.remove_trap( p ); if( c == nullptr ) { - return; + return false; } // Determine what gets hit const body_part hit = one_in( 2 ) ? bp_leg_l : bp_leg_r; @@ -556,8 +549,6 @@ void trapfunc::snare_light( const tripoint &p, Creature *c, item * ) } c->add_msg_player_or_npc( m_bad, _( "A snare closes on your leg." ), _( "A snare closes on s leg." ) ); - c->add_memorial_log( pgettext( "memorial_male", "Triggered a light snare." ), - pgettext( "memorial_female", "Triggered a light snare." ) ); // Actual effects c->add_effect( effect_lightsnare, 1_turns, hit, true ); @@ -566,26 +557,25 @@ void trapfunc::snare_light( const tripoint &p, Creature *c, item * ) z->deal_damage( nullptr, hit, damage_instance( DT_BASH, 10 ) ); } c->check_dead_state(); + return true; } -void trapfunc::snare_heavy( const tripoint &p, Creature *c, item * ) +bool trapfunc::snare_heavy( const tripoint &p, Creature *c, item * ) { sounds::sound( p, 4, sounds::sound_t::combat, _( "Snap!" ), false, "trap", "snare" ); g->m.remove_trap( p ); if( c == nullptr ) { - return; + return false; } // Determine what got hit const body_part hit = one_in( 2 ) ? bp_leg_l : bp_leg_r; - //~ %s is bodypart name in accusative. if( c->has_effect( effect_ridden ) ) { add_msg( m_bad, _( "A snare closes on your %s's leg" ), c->get_name() ); g->u.add_effect( effect_heavysnare, 1_turns, hit, true ); } + //~ %s is bodypart name in accusative. c->add_msg_player_or_npc( m_bad, _( "A snare closes on your %s." ), _( "A snare closes on s %s." ), body_part_name_accusative( hit ) ); - c->add_memorial_log( pgettext( "memorial_male", "Triggered a heavy snare." ), - pgettext( "memorial_female", "Triggered a heavy snare." ) ); // Actual effects c->add_effect( effect_heavysnare, 1_turns, hit, true ); @@ -611,50 +601,48 @@ void trapfunc::snare_heavy( const tripoint &p, Creature *c, item * ) z->deal_damage( nullptr, hit, damage_instance( DT_BASH, damage ) ); } c->check_dead_state(); + return true; } -void trapfunc::landmine( const tripoint &p, Creature *c, item * ) +bool trapfunc::landmine( const tripoint &p, Creature *c, item * ) { // tiny animals are too light to trigger land mines if( c != nullptr && c->get_size() == MS_TINY ) { - return; + return false; } if( c != nullptr ) { c->add_msg_player_or_npc( m_bad, _( "You trigger a land mine!" ), _( " triggers a land mine!" ) ); - c->add_memorial_log( pgettext( "memorial_male", "Stepped on a land mine." ), - pgettext( "memorial_female", "Stepped on a land mine." ) ); } explosion_handler::explosion( p, 18, 0.5, false, 8 ); g->m.remove_trap( p ); + return true; } -void trapfunc::boobytrap( const tripoint &p, Creature *c, item * ) +bool trapfunc::boobytrap( const tripoint &p, Creature *c, item * ) { if( c != nullptr ) { c->add_msg_player_or_npc( m_bad, _( "You trigger a booby trap!" ), _( " triggers a booby trap!" ) ); - c->add_memorial_log( pgettext( "memorial_male", "Triggered a booby trap." ), - pgettext( "memorial_female", "Triggered a booby trap." ) ); } explosion_handler::explosion( p, 18, 0.6, false, 12 ); g->m.remove_trap( p ); + return true; } -void trapfunc::telepad( const tripoint &p, Creature *c, item * ) +bool trapfunc::telepad( const tripoint &p, Creature *c, item * ) { //~ the sound of a telepad functioning sounds::sound( p, 6, sounds::sound_t::movement, _( "vvrrrRRMM*POP!*" ), false, "trap", "teleport" ); if( c == nullptr ) { - return; + return false; } monster *z = dynamic_cast( c ); // TODO: NPC don't teleport? if( c == &g->u ) { c->add_msg_if_player( m_warning, _( "The air shimmers around you..." ) ); - c->add_memorial_log( pgettext( "memorial_male", "Triggered a teleport trap." ), - pgettext( "memorial_female", "Triggered a teleport trap." ) ); g->teleport(); + return true; } else if( z != nullptr ) { if( g->u.sees( *z ) ) { add_msg( _( "The air shimmers around the %s..." ), z->name() ); @@ -680,19 +668,19 @@ void trapfunc::telepad( const tripoint &p, Creature *c, item * ) } else { z->setpos( {newposx, newposy, z->posz()} ); } + return true; } + return false; } -void trapfunc::goo( const tripoint &p, Creature *c, item * ) +bool trapfunc::goo( const tripoint &p, Creature *c, item * ) { g->m.remove_trap( p ); if( c == nullptr ) { - return; + return false; } c->add_msg_player_or_npc( m_bad, _( "You step in a puddle of thick goo." ), _( " steps in a puddle of thick goo." ) ); - c->add_memorial_log( pgettext( "memorial_male", "Stepped into thick goo." ), - pgettext( "memorial_female", "Stepped into thick goo." ) ); monster *z = dynamic_cast( c ); player *n = dynamic_cast( c ); if( n != nullptr ) { @@ -704,6 +692,7 @@ void trapfunc::goo( const tripoint &p, Creature *c, item * ) n->deal_damage( nullptr, bp_foot_r, damage_instance( DT_CUT, 5 ) ); n->check_dead_state(); } + return true; } else if( z != nullptr ) { if( z->has_effect( effect_ridden ) ) { g->u.forced_dismount(); @@ -720,13 +709,16 @@ void trapfunc::goo( const tripoint &p, Creature *c, item * ) z->set_speed_base( z->get_speed_base() + 15 ); z->set_hp( z->get_speed() ); } + return true; } + assert( false ); + return false; } -void trapfunc::dissector( const tripoint &p, Creature *c, item * ) +bool trapfunc::dissector( const tripoint &p, Creature *c, item * ) { if( c == nullptr ) { - return; + return false; } monster *z = dynamic_cast( c ); if( z != nullptr && z->type->in_species( ROBOT ) ) { @@ -736,7 +728,7 @@ void trapfunc::dissector( const tripoint &p, Creature *c, item * ) "robot" ); //Dissector error sound. c->add_msg_player_or_npc( m_bad, _( "The dissector lights up, and shuts down." ), _( "The dissector lights up, and shuts down." ) ); - return; + return false; } //~ the sound of a dissector dissecting @@ -745,8 +737,6 @@ void trapfunc::dissector( const tripoint &p, Creature *c, item * ) if( c != nullptr ) { c->add_msg_player_or_npc( m_bad, _( "Electrical beams emit from the floor and slice your flesh!" ), _( "Electrical beams emit from the floor and slice s flesh!" ) ); - c->add_memorial_log( pgettext( "memorial_male", "Stepped into a dissector." ), - pgettext( "memorial_female", "Stepped into a dissector." ) ); c->deal_damage( nullptr, bp_head, damage_instance( DT_CUT, 15 ) ); c->deal_damage( nullptr, bp_torso, damage_instance( DT_CUT, 20 ) ); c->deal_damage( nullptr, bp_arm_r, damage_instance( DT_CUT, 12 ) ); @@ -776,21 +766,20 @@ void trapfunc::dissector( const tripoint &p, Creature *c, item * ) } } c->check_dead_state(); + return true; } -void trapfunc::pit( const tripoint &p, Creature *c, item * ) +bool trapfunc::pit( const tripoint &p, Creature *c, item * ) { if( c == nullptr ) { - return; + return false; } // tiny animals aren't hurt by falling into pits if( c->get_size() == MS_TINY ) { - return; + return false; } const float eff = pit_effectiveness( p ); c->add_msg_player_or_npc( m_bad, _( "You fall in a pit!" ), _( " falls in a pit!" ) ); - c->add_memorial_log( pgettext( "memorial_male", "Fell in a pit." ), - pgettext( "memorial_female", "Fell in a pit." ) ); c->add_effect( effect_in_pit, 1_turns, num_bp, true ); monster *z = dynamic_cast( c ); player *n = dynamic_cast( c ); @@ -823,21 +812,20 @@ void trapfunc::pit( const tripoint &p, Creature *c, item * ) z->deal_damage( nullptr, bp_leg_r, damage_instance( DT_BASH, eff * rng( 10, 20 ) ) ); } c->check_dead_state(); + return true; } -void trapfunc::pit_spikes( const tripoint &p, Creature *c, item * ) +bool trapfunc::pit_spikes( const tripoint &p, Creature *c, item * ) { if( c == nullptr ) { - return; + return false; } // tiny animals aren't hurt by falling into spiked pits if( c->get_size() == MS_TINY ) { - return; + return false; } c->add_msg_player_or_npc( m_bad, _( "You fall in a spiked pit!" ), _( " falls in a spiked pit!" ) ); - c->add_memorial_log( pgettext( "memorial_male", "Fell into a spiked pit." ), - pgettext( "memorial_female", "Fell into a spiked pit." ) ); c->add_effect( effect_in_pit, 1_turns, num_bp, true ); monster *z = dynamic_cast( c ); player *n = dynamic_cast( c ); @@ -906,21 +894,20 @@ void trapfunc::pit_spikes( const tripoint &p, Creature *c, item * ) } } } + return true; } -void trapfunc::pit_glass( const tripoint &p, Creature *c, item * ) +bool trapfunc::pit_glass( const tripoint &p, Creature *c, item * ) { if( c == nullptr ) { - return; + return false; } // tiny animals aren't hurt by falling into glass pits if( c->get_size() == MS_TINY ) { - return; + return false; } c->add_msg_player_or_npc( m_bad, _( "You fall in a pit filled with glass shards!" ), _( " falls in pit filled with glass shards!" ) ); - c->add_memorial_log( pgettext( "memorial_male", "Fell into a pit filled with glass shards." ), - pgettext( "memorial_female", "Fell into a pit filled with glass shards." ) ); c->add_effect( effect_in_pit, 1_turns, num_bp, true ); monster *z = dynamic_cast( c ); player *n = dynamic_cast( c ); @@ -993,17 +980,16 @@ void trapfunc::pit_glass( const tripoint &p, Creature *c, item * ) } } } + return true; } -void trapfunc::lava( const tripoint &p, Creature *c, item * ) +bool trapfunc::lava( const tripoint &p, Creature *c, item * ) { if( c == nullptr ) { - return; + return false; } c->add_msg_player_or_npc( m_bad, _( "The %s burns you horribly!" ), _( "The %s burns !" ), g->m.tername( p ) ); - c->add_memorial_log( pgettext( "memorial_male", "Stepped into lava." ), - pgettext( "memorial_female", "Stepped into lava." ) ); monster *z = dynamic_cast( c ); player *n = dynamic_cast( c ); if( n != nullptr ) { @@ -1035,13 +1021,14 @@ void trapfunc::lava( const tripoint &p, Creature *c, item * ) z->deal_damage( nullptr, bp_torso, damage_instance( DT_HEAT, dam ) ); } c->check_dead_state(); + return true; } // STUB -void trapfunc::portal( const tripoint &p, Creature *c, item *i ) +bool trapfunc::portal( const tripoint &p, Creature *c, item *i ) { // TODO: make this do something unique and interesting - telepad( p, c, i ); + return telepad( p, c, i ); } // Don't ask NPCs - they always want to do the first thing that comes to their minds @@ -1096,13 +1083,13 @@ static bool sinkhole_safety_roll( player *p, const std::string &itemname, const } } -void trapfunc::sinkhole( const tripoint &p, Creature *c, item *i ) +bool trapfunc::sinkhole( const tripoint &p, Creature *c, item *i ) { monster *z = dynamic_cast( c ); player *pl = dynamic_cast( c ); // tiny creatures don't trigger the sinkhole to collapse if( c != nullptr && c->get_size() == MS_TINY ) { - return; + return false; } else if( z != nullptr ) { if( z->has_effect( effect_ridden ) ) { add_msg( m_bad, _( "Your %s falls into a sinkhole!" ), z->get_name() ); @@ -1112,8 +1099,6 @@ void trapfunc::sinkhole( const tripoint &p, Creature *c, item *i ) } bool success = false; if( pl != nullptr ) { - pl->add_memorial_log( pgettext( "memorial_male", "Stepped into a sinkhole." ), - pgettext( "memorial_female", "Stepped into a sinkhole." ) ); if( query_for_item( pl, "grapnel", _( "You step into a sinkhole! Throw your grappling hook out to try to catch something?" ) ) ) { success = sinkhole_safety_roll( pl, "grapnel", 6 ); @@ -1130,7 +1115,7 @@ void trapfunc::sinkhole( const tripoint &p, Creature *c, item *i ) if( success ) { g->m.remove_trap( p ); g->m.ter_set( p, t_pit ); - return; + return true; } else { pl->add_msg_player_or_npc( m_bad, _( "You fall into the sinkhole!" ), _( " falls into a sinkhole!" ) ); @@ -1142,22 +1127,21 @@ void trapfunc::sinkhole( const tripoint &p, Creature *c, item *i ) c->moves -= 100; pit( p, c, i ); } + return true; } -void trapfunc::ledge( const tripoint &p, Creature *c, item * ) +bool trapfunc::ledge( const tripoint &p, Creature *c, item * ) { if( c == nullptr ) { - return; + return false; } monster *m = dynamic_cast( c ); if( m != nullptr && m->has_flag( MF_FLIES ) ) { - return; + return false; } if( !g->m.has_zlevels() ) { if( c == &g->u ) { add_msg( m_warning, _( "You fall down a level!" ) ); - g->u.add_memorial_log( pgettext( "memorial_male", "Fell down a ledge." ), - pgettext( "memorial_female", "Fell down a ledge." ) ); g->vertical_move( -1, true ); if( g->u.has_trait( trait_WINGS_BIRD ) || ( one_in( 2 ) && g->u.has_trait( trait_WINGS_BUTTERFLY ) ) ) { @@ -1179,7 +1163,7 @@ void trapfunc::ledge( const tripoint &p, Creature *c, item * ) } } - return; + return true; } int height = 0; @@ -1201,7 +1185,7 @@ void trapfunc::ledge( const tripoint &p, Creature *c, item * ) // For now just special case player, NPCs don't "zedwalk" Creature *critter = g->critter_at( below, true ); if( critter == nullptr || !critter->is_monster() ) { - return; + return false; } std::vector valid; @@ -1221,7 +1205,7 @@ void trapfunc::ledge( const tripoint &p, Creature *c, item * ) height++; where.z--; } else if( height == 0 ) { - return; + return false; } c->add_msg_if_npc( _( " falls down a level!" ) ); @@ -1229,13 +1213,11 @@ void trapfunc::ledge( const tripoint &p, Creature *c, item * ) if( pl == nullptr ) { c->setpos( where ); c->impact( height * 10, where ); - return; + return true; } if( pl->is_player() ) { add_msg( m_warning, _( "You fall down a level!" ) ); - g->u.add_memorial_log( pgettext( "memorial_male", "Fell down a ledge." ), - pgettext( "memorial_female", "Fell down a ledge." ) ); g->vertical_move( -height, true ); } else { pl->setpos( where ); @@ -1250,15 +1232,14 @@ void trapfunc::ledge( const tripoint &p, Creature *c, item * ) } else { pl->impact( height * 10, where ); } + return true; } -void trapfunc::temple_flood( const tripoint &p, Creature *c, item * ) +bool trapfunc::temple_flood( const tripoint &p, Creature *c, item * ) { // Monsters and npcs are completely ignored here, should they? if( c == &g->u ) { add_msg( m_warning, _( "You step on a loose tile, and water starts to flood the room!" ) ); - g->u.add_memorial_log( pgettext( "memorial_male", "Triggered a flood trap." ), - pgettext( "memorial_female", "Triggered a flood trap." ) ); tripoint tmp = p; int &i = tmp.x; int &j = tmp.y; @@ -1270,10 +1251,12 @@ void trapfunc::temple_flood( const tripoint &p, Creature *c, item * ) } } g->timed_events.add( TIMED_EVENT_TEMPLE_FLOOD, calendar::turn + 3_turns ); + return true; } + return false; } -void trapfunc::temple_toggle( const tripoint &p, Creature *c, item * ) +bool trapfunc::temple_toggle( const tripoint &p, Creature *c, item * ) { // Monsters and npcs are completely ignored here, should they? if( c == &g->u ) { @@ -1305,13 +1288,15 @@ void trapfunc::temple_toggle( const tripoint &p, Creature *c, item * ) } } } + return true; } + return false; } -void trapfunc::glow( const tripoint &p, Creature *c, item * ) +bool trapfunc::glow( const tripoint &p, Creature *c, item * ) { if( c == nullptr ) { - return; + return false; } monster *z = dynamic_cast( c ); player *n = dynamic_cast( c ); @@ -1344,9 +1329,10 @@ void trapfunc::glow( const tripoint &p, Creature *c, item * ) } } c->check_dead_state(); + return true; } -void trapfunc::hum( const tripoint &p, Creature *, item * ) +bool trapfunc::hum( const tripoint &p, Creature *, item * ) { int volume = rng( 1, 200 ); std::string sfx; @@ -1364,16 +1350,15 @@ void trapfunc::hum( const tripoint &p, Creature *, item * ) sfx = _( "VRMMMMMM" ); } sounds::sound( p, volume, sounds::sound_t::activity, sfx, false, "humming", "machinery" ); + return true; } -void trapfunc::shadow( const tripoint &p, Creature *c, item * ) +bool trapfunc::shadow( const tripoint &p, Creature *c, item * ) { if( c != &g->u ) { - return; + return false; } // Monsters and npcs are completely ignored here, should they? - g->u.add_memorial_log( pgettext( "memorial_male", "Triggered a shadow trap." ), - pgettext( "memorial_female", "Triggered a shadow trap." ) ); int tries = 0; tripoint monp = p; do { @@ -1394,14 +1379,13 @@ void trapfunc::shadow( const tripoint &p, Creature *c, item * ) } g->m.remove_trap( p ); } + return true; } -void trapfunc::drain( const tripoint &, Creature *c, item * ) +bool trapfunc::drain( const tripoint &, Creature *c, item * ) { if( c != nullptr ) { c->add_msg_if_player( m_bad, _( "You feel your life force sapping away." ) ); - c->add_memorial_log( pgettext( "memorial_male", "Triggered a life-draining trap." ), - pgettext( "memorial_female", "Triggered a life-draining trap." ) ); monster *z = dynamic_cast( c ); player *n = dynamic_cast( c ); if( n != nullptr ) { @@ -1410,20 +1394,18 @@ void trapfunc::drain( const tripoint &, Creature *c, item * ) z->deal_damage( nullptr, bp_torso, damage_instance( DT_TRUE, 1 ) ); } c->check_dead_state(); + return true; } + return false; } -void trapfunc::snake( const tripoint &p, Creature *c, item * ) +bool trapfunc::snake( const tripoint &p, Creature *, item * ) { //~ the sound a snake makes sounds::sound( p, 10, sounds::sound_t::movement, _( "ssssssss" ), false, "misc", "snake_hiss" ); if( one_in( 6 ) ) { g->m.remove_trap( p ); } - if( c != nullptr ) { - c->add_memorial_log( pgettext( "memorial_male", "Triggered a shadow snake trap." ), - pgettext( "memorial_female", "Triggered a shadow snake trap." ) ); - } if( one_in( 3 ) ) { int tries = 0; tripoint monp = p; @@ -1448,6 +1430,7 @@ void trapfunc::snake( const tripoint &p, Creature *c, item * ) } } } + return true; } /** diff --git a/src/type_id.h b/src/type_id.h index 2eb4aff5e6fd5..8f7faab63eb60 100644 --- a/src/type_id.h +++ b/src/type_id.h @@ -23,6 +23,9 @@ using efftype_id = string_id; class emit; using emit_id = string_id; +class enchantment; +using enchantment_id = string_id; + class fault; using fault_id = string_id; @@ -87,6 +90,9 @@ using requirement_id = string_id; class Skill; using skill_id = string_id; +class SkillDisplayType; +using skill_displayType_id = string_id; + struct species_type; using species_id = string_id; diff --git a/src/ui.cpp b/src/ui.cpp index ed2db2044d15d..52f22b94e8681 100644 --- a/src/ui.cpp +++ b/src/ui.cpp @@ -144,6 +144,7 @@ void uilist::init() allow_disabled = false; // disallow selecting disabled options allow_anykey = false; // do not return on unbound keys allow_cancel = true; // allow cancelling with "QUIT" action + allow_additional = false; // do not return on unhandled additional actions hilight_full = true; // render hilight_color background over the entire line (minus padding) hilight_disabled = false; // if false, hitting 'down' onto a disabled entry will advance downward to the first enabled entry @@ -331,18 +332,13 @@ void uilist::setup() w_width = title.size() + 5; } } + const int max_desc_width = w_auto ? TERMX - 4 : w_width - 4; bool h_auto = ( w_height == -1 ); if( h_auto ) { w_height = 4; } - if( desc_enabled && !( w_auto && h_auto ) ) { - desc_enabled = false; // give up - debugmsg( "desc_enabled without w_auto and h_auto (h: %d, w: %d)", static_cast( h_auto ), - static_cast( w_auto ) ); - } - max_entry_len = 0; max_column_len = 0; std::vector autoassign; @@ -376,10 +372,9 @@ void uilist::setup() } } if( desc_enabled ) { - const int min_width = std::min( TERMX, std::max( w_width, descwidth_final ) ) - 4; - const int max_width = TERMX - 4; + const int min_desc_width = std::min( max_desc_width, std::max( w_width, descwidth_final ) - 4 ); int descwidth = find_minimum_fold_width( footer_text.empty() ? entries[i].desc : footer_text, - desc_lines, min_width, max_width ); + desc_lines, min_desc_width, max_desc_width ); descwidth += 4; // 2x border + 2x ' ' pad if( descwidth_final < descwidth ) { descwidth_final = descwidth; @@ -847,16 +842,14 @@ void uilist::query( bool loop, int timeout ) #endif do { - const auto action = ctxt.handle_input( timeout ); + ret_act = ctxt.handle_input( timeout ); const auto event = ctxt.get_raw_input(); keypress = event.get_first_input(); const auto iter = keymap.find( keypress ); - if( scrollby( scroll_amount_from_action( action ) ) ) { + if( scrollby( scroll_amount_from_action( ret_act ) ) ) { /* nothing */ - } else if( action == "HELP_KEYBINDINGS" ) { - /* nothing, handled by input_context */ - } else if( filtering && action == "FILTER" ) { + } else if( filtering && ret_act == "FILTER" ) { inputfilter(); } else if( iter != keymap.end() ) { selected = iter->second; @@ -865,20 +858,27 @@ void uilist::query( bool loop, int timeout ) } else if( allow_disabled ) { ret = entries[selected].retval; // disabled } - } else if( !fentries.empty() && action == "CONFIRM" ) { + } else if( !fentries.empty() && ret_act == "CONFIRM" ) { if( entries[ selected ].enabled ) { ret = entries[ selected ].retval; // valid } else if( allow_disabled ) { ret = entries[selected].retval; // disabled } - } else if( allow_cancel && action == "QUIT" ) { + } else if( allow_cancel && ret_act == "QUIT" ) { ret = UILIST_CANCEL; - } else if( action == "TIMEOUT" ) { + } else if( ret_act == "TIMEOUT" ) { ret = UILIST_TIMEOUT; - } else { + } else { // including HELP_KEYBINDINGS, in case the caller wants to refresh their contents bool unhandled = callback == nullptr || !callback->key( ctxt, event, selected, this ); if( unhandled && allow_anykey ) { ret = UILIST_UNBOUND; + } else if( unhandled && allow_additional ) { + for( const auto &it : additional_actions ) { + if( it.first == ret_act ) { + ret = UILIST_ADDITIONAL; + break; + } + } } } diff --git a/src/ui.h b/src/ui.h index 65d3df638f3fd..b7d3beaff8b11 100644 --- a/src/ui.h +++ b/src/ui.h @@ -22,6 +22,7 @@ const int UILIST_WAIT_INPUT = -1025; const int UILIST_UNBOUND = -1026; const int UILIST_CANCEL = -1027; const int UILIST_TIMEOUT = -1028; +const int UILIST_ADDITIONAL = -1029; const int MENU_ALIGN_LEFT = -1; const int MENU_ALIGN_CENTER = 0; const int MENU_ALIGN_RIGHT = 1; @@ -161,6 +162,7 @@ class uilist: public ui_container { public: int ret; + std::string ret_act; int selected; int keypress; std::string text; @@ -191,6 +193,9 @@ class uilist: public ui_container bool allow_disabled; // return on selecting disabled entry, default false bool allow_anykey; // return UILIST_UNBOUND on keys unbound & unhandled by callback, default false bool allow_cancel; // return UILIST_CANCEL on "QUIT" action, default true + // return UILIST_ADDITIONAL if the input action is inside `additional_actions` + // and unhandled by callback, default false. + bool allow_additional; bool hilight_disabled; bool hilight_full; int vshift; diff --git a/src/units.h b/src/units.h index ffb61c7945f73..a4b4e4c0dcb37 100644 --- a/src/units.h +++ b/src/units.h @@ -308,11 +308,11 @@ inline constexpr double to_liter( const volume &v ) // Don't use in new code! Use one of the from_* functions instead. static constexpr volume legacy_volume_factor = from_milliliter( 250 ); -class mass_in_gram_tag +class mass_in_milligram_tag { }; -using mass = quantity; +using mass = quantity; const mass mass_min = units::mass( std::numeric_limits::min(), units::mass::unit_type{} ); @@ -321,28 +321,35 @@ const mass mass_max = units::mass( std::numeric_limits: units::mass::unit_type{} ); template -inline constexpr quantity from_gram( +inline constexpr quantity from_milligram( const value_type v ) { - return quantity( v, mass_in_gram_tag{} ); + return quantity( v, mass_in_milligram_tag{} ); } template -inline constexpr quantity from_kilogram( +inline constexpr quantity from_gram( + const value_type v ) +{ + return from_milligram( v * 1000 ); +} + +template +inline constexpr quantity from_kilogram( const value_type v ) { return from_gram( v * 1000 ); } template -inline constexpr value_type to_gram( const quantity &v ) +inline constexpr value_type to_gram( const quantity &v ) { - return v / from_gram( 1 ); + return v.value() / 1000.0; } inline constexpr double to_kilogram( const mass &v ) { - return v.value() / 1000.0; + return v.value() / 1000000.0; } class energy_in_millijoule_tag @@ -397,9 +404,9 @@ inline constexpr value_type to_kilojoule( const quantity operat } // Implicitly converted to mass, which has int as value_type! +inline constexpr units::mass operator"" _milligram( const unsigned long long v ) +{ + return units::from_milligram( v ); +} inline constexpr units::mass operator"" _gram( const unsigned long long v ) { return units::from_gram( v ); @@ -443,13 +454,19 @@ inline constexpr units::mass operator"" _kilogram( const unsigned long long v ) return units::from_kilogram( v ); } -inline constexpr units::quantity operator"" _gram( +inline constexpr units::quantity operator"" _milligram( + const long double v ) +{ + return units::from_milligram( v ); +} + +inline constexpr units::quantity operator"" _gram( const long double v ) { return units::from_gram( v ); } -inline constexpr units::quantity operator"" _kilogram( +inline constexpr units::quantity operator"" _kilogram( const long double v ) { return units::from_kilogram( v ); @@ -497,6 +514,7 @@ static const std::vector> energy_units = { { } }; static const std::vector> mass_units = { { + { "mg", 1_milligram }, { "g", 1_gram }, { "kg", 1_kilogram }, } diff --git a/src/veh_interact.cpp b/src/veh_interact.cpp index 3334463099d8a..534ad2fe16e2f 100644 --- a/src/veh_interact.cpp +++ b/src/veh_interact.cpp @@ -132,8 +132,11 @@ player_activity veh_interact::serialize_activity() // if we're working on an existing part, use that part as the reference point // otherwise (e.g. installing a new frame), just use part 0 point q = veh->coord_translate( pt ? pt->mount : veh->parts[0].mount ); - res.values.push_back( veh->global_pos3().x + q.x ); // values[0] - res.values.push_back( veh->global_pos3().y + q.y ); // values[1] + for( const auto pt : veh->get_points( true ) ) { + res.coord_set.insert( g->m.getabs( pt ) ); + } + res.values.push_back( g->m.getabs( veh->global_pos3() ).x + q.x ); // values[0] + res.values.push_back( g->m.getabs( veh->global_pos3() ).y + q.y ); // values[1] res.values.push_back( dd.x ); // values[2] res.values.push_back( dd.y ); // values[3] res.values.push_back( -dd.x ); // values[4] @@ -534,7 +537,9 @@ task_reason veh_interact::cant_do( char mode ) break; case 'f': - return std::any_of( veh->parts.begin(), veh->parts.end(), can_refill ) ? CAN_DO : INVALID_TARGET; + valid_target = std::any_of( veh->parts.begin(), veh->parts.end(), can_refill ); + has_tools = true; + break; case 'o': // remove mode enough_morale = g->u.has_morale_to_craft(); @@ -565,13 +570,6 @@ task_reason veh_interact::cant_do( char mode ) } } break; - case 'c': // change tire - valid_target = wheel != nullptr; - ///\EFFECT_STR allows changing tires on heavier vehicles without a jack - has_tools = has_wrench && has_wheel && ( g->u.can_lift( *veh ) || has_jack ); - enough_light = g->u.fine_detail_vision_mod() <= 4; - break; - case 'w': // assign crew if( g->allies().empty() ) { return INVALID_TARGET; @@ -742,7 +740,7 @@ bool veh_interact::can_install_part() bool use_aid = false; bool use_str = false; item base( sel_vpart_info->item ); - if( base.is_wheel() ) { + if( sel_vpart_info->has_flag( "NEEDS_JACKING" ) ) { qual = JACK; lvl = jack_quality( *veh ); str = veh->lift_strength(); @@ -764,7 +762,6 @@ bool veh_interact::can_install_part() nc_color aid_color = use_aid ? c_green : ( use_str ? c_dark_gray : c_red ); nc_color str_color = use_str ? c_green : ( use_aid ? c_dark_gray : c_red ); - //~ %1$s is quality name, %2$d is quality level const auto helpers = g->u.get_crafting_helpers(); std::string str_string; if( !helpers.empty() ) { @@ -772,6 +769,7 @@ bool veh_interact::can_install_part() } else { str_string = string_format( _( "strength %d" ), str ); } + //~ %1$s is quality name, %2$d is quality level std::string aid_string = string_format( _( "1 tool with %1$s %2$d" ), qual.obj().name, lvl ); msg << string_format( _( "> %1$s OR %2$s" ), @@ -1216,9 +1214,17 @@ bool veh_interact::do_mend( std::string &msg ) bool veh_interact::do_refill( std::string &msg ) { - if( cant_do( 'f' ) ) { - msg = _( "No parts can currently be refilled" ); - return false; + switch( cant_do( 'f' ) ) { + case MOVING_VEHICLE: + msg = _( "You can't refill a moving vehicle." ); + return false; + + case INVALID_TARGET: + msg = _( "No parts can currently be refilled." ); + return false; + + default: + break; } set_title( _( "Select part to refill:" ) ); @@ -1626,7 +1632,7 @@ vehicle_part *veh_interact::get_most_repariable_part() const return part ? &part : nullptr; } -bool veh_interact::can_remove_part( int idx ) +bool veh_interact::can_remove_part( int idx, const player &p ) { sel_vehicle_part = &veh->parts[idx]; sel_vpart_info = &sel_vehicle_part->info(); @@ -1645,7 +1651,7 @@ bool veh_interact::can_remove_part( int idx ) const auto reqs = sel_vpart_info->removal_requirements(); bool ok = format_reqs( msg, reqs, sel_vpart_info->removal_skills, - sel_vpart_info->removal_time( g->u ) ); + sel_vpart_info->removal_time( p ) ); msg << _( "Additional requirements:\n" ); @@ -1655,7 +1661,7 @@ bool veh_interact::can_remove_part( int idx ) bool use_aid = false; bool use_str = false; item base( sel_vpart_info->item ); - if( base.is_wheel() ) { + if( sel_vpart_info->has_flag( "NEEDS_JACKING" ) ) { qual = JACK; lvl = jack_quality( *veh ); str = veh->lift_strength(); @@ -1673,14 +1679,15 @@ bool veh_interact::can_remove_part( int idx ) ok = false; } const auto helpers = g->u.get_crafting_helpers(); - //~ %1$s represents the internal color name which shouldn't be translated, %2$s is the tool quality, %3$i is tool level, %4$s is the internal color name which shouldn't be translated and %5$i is the character's strength if( !helpers.empty() ) { msg << string_format( + //~ %1$s represents the internal color name which shouldn't be translated, %2$s is the tool quality, %3$i is tool level, %4$s is the internal color name which shouldn't be translated and %5$i is the character's strength _( "> %1$s1 tool with %2$s %3$i OR %4$sstrength ( assisted ) %5$i" ), status_color( use_aid ), qual.obj().name, lvl, status_color( use_str ), str ) << "\n"; } else { msg << string_format( + //~ %1$s represents the internal color name which shouldn't be translated, %2$s is the tool quality, %3$i is tool level, %4$s is the internal color name which shouldn't be translated and %5$i is the character's strength _( "> %1$s1 tool with %2$s %3$i OR %4$sstrength %5$i" ), status_color( use_aid ), qual.obj().name, lvl, status_color( use_str ), str ) << "\n"; @@ -1715,7 +1722,7 @@ bool veh_interact::do_remove( std::string &msg ) int pos = 0; for( size_t i = 0; i < parts_here.size(); i++ ) { - if( can_remove_part( parts_here[ i ] ) ) { + if( can_remove_part( parts_here[ i ], g->u ) ) { pos = i; break; } @@ -1727,7 +1734,7 @@ bool veh_interact::do_remove( std::string &msg ) wrefresh( w_parts ); int part = parts_here[ pos ]; - bool can_remove = can_remove_part( part ); + bool can_remove = can_remove_part( part, g->u ); auto sel = [&]( const vehicle_part & pt ) { return &pt == &veh->parts[part]; @@ -1841,15 +1848,16 @@ bool veh_interact::do_tirechange( std::string &msg ) return false; case LACK_TOOLS: - //~ %1$s represents the internal color name which shouldn't be translated, %2$s is an internal color name, %3$s is an internal color name, %4$s is an internal color name, and %5$d is the required lift strength if( !helpers.empty() ) { msg = string_format( + //~ %1$s represents the internal color name which shouldn't be translated, %2$s is an internal color name, %3$s is an internal color name, %4$s is an internal color name, and %5$d is the required lift strength _( "To change a wheel you need a %1$swrench, a %2$swheel, and either " "%3$slifting equipment or %4$s%5$d strength ( assisted )." ), status_color( has_wrench ), status_color( has_wheel ), status_color( has_jack ), status_color( g->u.can_lift( *veh ) ), veh->lift_strength() ); } else { msg = string_format( + //~ %1$s represents the internal color name which shouldn't be translated, %2$s is an internal color name, %3$s is an internal color name, %4$s is an internal color name, and %5$d is the required lift strength _( "To change a wheel you need a %1$swrench, a %2$swheel, and either " "%3$slifting equipment or %4$s%5$d strength." ), status_color( has_wrench ), status_color( has_wheel ), status_color( has_jack ), @@ -2420,13 +2428,12 @@ void veh_interact::display_name() werase( w_name ); // NOLINTNEXTLINE(cata-use-named-point-constants) mvwprintz( w_name, point( 1, 0 ), c_light_gray, _( "Name: " ) ); - std::string fac_name = veh->get_owner() && - veh->get_owner() != g->faction_manager_ptr->get( faction_id( "your_followers" ) ) ? + std::string fac_name = veh->get_owner() && veh->get_owner() != g->u.get_faction() ? _( veh->get_owner()->name ) : _( "Yours" ); mvwprintz( w_name, point( 1 + utf8_width( _( "Name: " ) ), 0 ), - veh->get_owner() != g->faction_manager_ptr->get( faction_id( "your_followers" ) ) ? c_light_red : - c_light_green, string_format( _( "%s (%s)" ), veh->name, - veh->get_owner() == nullptr ? _( "not owned" ) : fac_name ) ); + veh->get_owner() != g->u.get_faction() ? c_light_red : c_light_green, + string_format( _( "%s (%s)" ), veh->name, + veh->get_owner() == nullptr ? _( "not owned" ) : fac_name ) ); wrefresh( w_name ); } @@ -2448,7 +2455,6 @@ void veh_interact::display_mode() { _( "remve" ) }, { _( "iphon" ) }, { _( "unloa" ) }, - { _( "hange tire" ) }, { _( "cre" ) }, { _( "rname" ) }, { _( "lbel" ) }, @@ -2727,74 +2733,6 @@ void veh_interact::count_durability() } } -/** - * Given a vpart id, gives the choice of inventory and nearby items to consume - * for install/repair/etc. Doesn't use consume_items in crafting.cpp, as it got - * into weird cases and doesn't consider properties like HP. The - * item will be removed by this function. - * @param vpid The id of the vpart type to look for. - * @return The item that was consumed. - */ -static item consume_vpart_item( const vpart_id &vpid ) -{ - std::vector candidates; - const itype_id itid = vpid.obj().item; - - if( g->u.has_trait( trait_DEBUG_HS ) ) { - return item( itid, calendar::turn ); - } - - inventory map_inv; - map_inv.form_from_map( g->u.pos(), PICKUP_RANGE ); - - if( g->u.has_amount( itid, 1 ) ) { - candidates.push_back( true ); - } - if( map_inv.has_components( itid, 1 ) ) { - candidates.push_back( false ); - } - - // bug? - if( candidates.empty() ) { - debugmsg( "Part not found!" ); - return item(); - } - - int selection; - // no choice? - if( candidates.size() == 1 ) { - selection = 0; - } else { - // popup menu!? - uilist menu; - menu.text = _( "Use which gizmo?" ); - menu.allow_cancel = false; - for( const auto candidate : candidates ) { - const vpart_info &info = vpid.obj(); - if( candidate ) { - // In inventory. - menu.entries.emplace_back( info.name() ); - } else { - // Nearby. - menu.entries.emplace_back( info.name() + _( " (nearby)" ) ); - } - } - menu.query(); - selection = menu.ret; - } - std::list item_used; - //remove item from inventory. or map. - if( candidates[selection] ) { - item_used = g->u.use_amount( itid, 1 ); - } else { - int quantity = 1; - item_used = g->m.use_amount( g->u.pos(), PICKUP_RANGE, itid, quantity ); - } - remove_ammo( item_used, g->u ); - - return item_used.front(); -} - void act_vehicle_siphon( vehicle *veh ) { std::vector fuels; @@ -2884,31 +2822,44 @@ void act_vehicle_unload_fuel( vehicle *veh ) * Called when the activity timer for installing parts, repairing, etc times * out and the action is complete. */ -void veh_interact::complete_vehicle() +void veh_interact::complete_vehicle( player &p ) { - if( g->u.activity.values.size() < 7 ) { - debugmsg( "Invalid activity ACT_VEHICLE values:%d", g->u.activity.values.size() ); + if( p.activity.values.size() < 7 ) { + debugmsg( "Invalid activity ACT_VEHICLE values:%d", p.activity.values.size() ); return; } - const optional_vpart_position vp = g->m.veh_at( tripoint( g->u.activity.values[0], - g->u.activity.values[1], g->u.posz() ) ); + optional_vpart_position vp = g->m.veh_at( g->m.getlocal( tripoint( p.activity.values[0], + p.activity.values[1], p.posz() ) ) ); if( !vp ) { - debugmsg( "Activity ACT_VEHICLE: vehicle not found" ); - return; + // so the vehicle could have lost some of its parts from other NPCS works during this player/NPCs activity. + // check the vehicle points that were stored at beginning of activity. + if( !p.activity.coord_set.empty() ) { + for( const auto pt : p.activity.coord_set ) { + vp = g->m.veh_at( g->m.getlocal( pt ) ); + if( vp ) { + break; + } + } + } + // check again, to see if it really is a case of vehicle gone missing. + if( !vp ) { + debugmsg( "Activity ACT_VEHICLE: vehicle not found" ); + return; + } } vehicle *const veh = &vp->vehicle(); - int dx = g->u.activity.values[4]; - int dy = g->u.activity.values[5]; - int vehicle_part = g->u.activity.values[6]; - const vpart_id part_id( g->u.activity.str_values[0] ); + int dx = p.activity.values[4]; + int dy = p.activity.values[5]; + int vehicle_part = p.activity.values[6]; + const vpart_id part_id( p.activity.str_values[0] ); const vpart_info &vpinfo = part_id.obj(); // cmd = Install Repair reFill remOve Siphon Unload Changetire reName relAbel - switch( static_cast( g->u.activity.index ) ) { + switch( static_cast( p.activity.index ) ) { case 'i': { - const inventory &inv = g->u.crafting_inventory(); + const inventory &inv = p.crafting_inventory(); const auto reqs = vpinfo.install_requirements(); if( !reqs.can_make_with_inventory( inv, is_crafting_component ) ) { @@ -2919,14 +2870,14 @@ void veh_interact::complete_vehicle() // consume items extracting a match for the parts base item item base; for( const auto &e : reqs.get_components() ) { - for( auto &obj : g->u.consume_items( e, 1, is_crafting_component ) ) { + for( auto &obj : p.consume_items( e, 1, is_crafting_component ) ) { if( obj.typeId() == vpinfo.item ) { base = obj; } } } if( base.is_null() ) { - if( !g->u.has_trait( trait_DEBUG_HS ) ) { + if( !p.has_trait( trait_DEBUG_HS ) ) { add_msg( m_info, _( "Could not find base part in requirements for %s." ), vpinfo.name() ); break; } else { @@ -2935,10 +2886,10 @@ void veh_interact::complete_vehicle() } for( const auto &e : reqs.get_tools() ) { - g->u.consume_tools( e ); + p.consume_tools( e ); } - g->u.invalidate_crafting_inventory(); + p.invalidate_crafting_inventory(); int partnum = !base.is_null() ? veh->install_part( point( dx, dy ), part_id, std::move( base ) ) : -1; @@ -2955,18 +2906,18 @@ void veh_interact::complete_vehicle() vpinfo.has_flag( VPFLAG_WIDE_CONE_LIGHT ) || vpinfo.has_flag( VPFLAG_HALF_CIRCLE_LIGHT ) ) { // Stash offset and set it to the location of the part so look_around will start there. - int px = g->u.view_offset.x; - int py = g->u.view_offset.y; - g->u.view_offset.x = veh->global_pos3().x + q.x - g->u.posx(); - g->u.view_offset.y = veh->global_pos3().y + q.y - g->u.posy(); + int px = p.view_offset.x; + int py = p.view_offset.y; + p.view_offset.x = veh->global_pos3().x + q.x - p.posx(); + p.view_offset.y = veh->global_pos3().y + q.y - p.posy(); bool is_overheadlight = vpinfo.has_flag( VPFLAG_HALF_CIRCLE_LIGHT ); popup( _( "Choose a facing direction for the new %s. Press space to continue." ), is_overheadlight ? "overhead light" : "headlight" ); const cata::optional headlight_target = g->look_around(); // Restore previous view offsets. - g->u.view_offset.x = px; - g->u.view_offset.y = py; + p.view_offset.x = px; + p.view_offset.y = py; int dir = 0; if( headlight_target ) { @@ -2994,28 +2945,28 @@ void veh_interact::complete_vehicle() g->m.board_vehicle( vehp, pl ); } - add_msg( m_good, _( "You install a %1$s into the %2$s." ), veh->parts[ partnum ].name(), - veh->name ); + p.add_msg_if_player( m_good, _( "You install a %1$s into the %2$s." ), veh->parts[ partnum ].name(), + veh->name ); for( const auto &sk : vpinfo.install_skills ) { - g->u.practice( sk.first, veh_utils::calc_xp_gain( vpinfo, sk.first ) ); + p.practice( sk.first, veh_utils::calc_xp_gain( vpinfo, sk.first ) ); } break; } case 'r': { - veh_utils::repair_part( *veh, veh->parts[ vehicle_part ], g->u ); + veh_utils::repair_part( *veh, veh->parts[ vehicle_part ], p ); break; } case 'f': { - if( g->u.activity.targets.empty() || !g->u.activity.targets.front() ) { + if( p.activity.targets.empty() || !p.activity.targets.front() ) { debugmsg( "Activity ACT_VEHICLE: missing refill source" ); break; } - auto &src = g->u.activity.targets.front(); + auto &src = p.activity.targets.front(); struct vehicle_part &pt = veh->parts[ vehicle_part ]; std::list &contents = src->contents; if( pt.is_tank() && src->is_container() && !contents.empty() ) { @@ -3025,24 +2976,24 @@ void veh_interact::complete_vehicle() if( pt.ammo_remaining() != pt.ammo_capacity() ) { //~ 1$s vehicle name, 2$s tank name - add_msg( m_good, _( "You refill the %1$s's %2$s." ), veh->name, pt.name() ); + p.add_msg_if_player( m_good, _( "You refill the %1$s's %2$s." ), veh->name, pt.name() ); } else { //~ 1$s vehicle name, 2$s tank name - add_msg( m_good, _( "You completely refill the %1$s's %2$s." ), veh->name, pt.name() ); + p.add_msg_if_player( m_good, _( "You completely refill the %1$s's %2$s." ), veh->name, pt.name() ); } if( contents.front().charges == 0 ) { contents.erase( contents.begin() ); } else { - add_msg( m_good, _( "There's some left over!" ) ); + p.add_msg_if_player( m_good, _( "There's some left over!" ) ); } } else if( pt.is_fuel_store() ) { auto qty = src->charges; - pt.base.reload( g->u, std::move( src ), qty ); + pt.base.reload( p, std::move( src ), qty ); //~ 1$s vehicle name, 2$s reactor name - add_msg( m_good, _( "You refuel the %1$s's %2$s." ), veh->name, pt.name() ); + p.add_msg_if_player( m_good, _( "You refuel the %1$s's %2$s." ), veh->name, pt.name() ); } else { debugmsg( "vehicle part is not reloadable" ); @@ -3054,8 +3005,15 @@ void veh_interact::complete_vehicle() } case 'o': { - const inventory &inv = g->u.crafting_inventory(); - + const inventory &inv = p.crafting_inventory(); + if( vehicle_part >= static_cast( veh->parts.size() ) ) { + vehicle_part = veh->get_next_shifted_index( vehicle_part, p ); + if( vehicle_part == -1 ) { + p.add_msg_if_player( m_info, _( "The %s has already been removed by someone else." ), + vpinfo.name() ); + return; + } + } const auto reqs = vpinfo.removal_requirements(); if( !reqs.can_make_with_inventory( inv, is_crafting_component ) ) { add_msg( m_info, _( "You don't meet the requirements to remove the %s." ), vpinfo.name() ); @@ -3063,13 +3021,13 @@ void veh_interact::complete_vehicle() } for( const auto &e : reqs.get_components() ) { - g->u.consume_items( e, 1, is_crafting_component ); + p.consume_items( e, 1, is_crafting_component ); } for( const auto &e : reqs.get_tools() ) { - g->u.consume_tools( e ); + p.consume_tools( e ); } - g->u.invalidate_crafting_inventory(); + p.invalidate_crafting_inventory(); // This will be a list of all the items which arise from this removal. std::list resulting_items; @@ -3087,18 +3045,18 @@ void veh_interact::complete_vehicle() bool broken = veh->parts[ vehicle_part ].is_broken(); if( broken ) { - add_msg( _( "You remove the broken %1$s from the %2$s." ), - veh->parts[ vehicle_part ].name(), veh->name ); + p.add_msg_if_player( _( "You remove the broken %1$s from the %2$s." ), + veh->parts[ vehicle_part ].name(), veh->name ); } else { - add_msg( _( "You remove the %1$s from the %2$s." ), - veh->parts[ vehicle_part ].name(), veh->name ); + p.add_msg_if_player( _( "You remove the %1$s from the %2$s." ), + veh->parts[ vehicle_part ].name(), veh->name ); } if( !broken ) { resulting_items.push_back( veh->parts[vehicle_part].properties_to_item() ); for( const auto &sk : vpinfo.install_skills ) { // removal is half as educational as installation - g->u.practice( sk.first, veh_utils::calc_xp_gain( vpinfo, sk.first ) / 2 ); + p.practice( sk.first, veh_utils::calc_xp_gain( vpinfo, sk.first ) / 2 ); } } else { @@ -3107,45 +3065,25 @@ void veh_interact::complete_vehicle() } if( veh->parts.size() < 2 ) { - add_msg( _( "You completely dismantle the %s." ), veh->name ); - g->u.activity.set_to_null(); + p.add_msg_if_player( _( "You completely dismantle the %s." ), veh->name ); + p.activity.set_to_null(); g->m.destroy_vehicle( veh ); } else { veh->remove_part( vehicle_part ); veh->part_removal_cleanup(); } - + // This will be part of an NPC "job" where they need to clean up the acitivty items afterwards + if( p.is_npc() ) { + for( item &it : resulting_items ) { + it.set_var( "activity_var", p.name ); + } + } // Finally, put all the reults somewhere (we wanted to wait until this // point because we don't want to put them back into the vehicle part // that just got removed). - put_into_vehicle_or_drop( g->u, item_drop_reason::deliberate, resulting_items ); + put_into_vehicle_or_drop( p, item_drop_reason::deliberate, resulting_items ); break; } - - case 'c': - std::vector parts = veh->parts_at_relative( point( dx, dy ), true ); - if( !parts.empty() ) { - int replaced_wheel = veh->part_with_feature( parts[0], "WHEEL", false ); - if( replaced_wheel == -1 ) { - debugmsg( "no wheel to remove when changing wheels." ); - return; - } - bool broken = veh->parts[ replaced_wheel ].is_broken(); - item removed_wheel = veh->parts[replaced_wheel].properties_to_item(); - veh->remove_part( replaced_wheel ); - veh->part_removal_cleanup(); - int partnum = veh->install_part( point( dx, dy ), part_id, consume_vpart_item( part_id ) ); - if( partnum < 0 ) { - debugmsg( "complete_vehicle tire change fails dx=%d dy=%d id=%s", dx, dy, part_id.c_str() ); - } - // Place the removed wheel on the map last so consume_vpart_item() doesn't pick it. - if( !broken ) { - g->m.add_item_or_charges( point( g->u.posx(), g->u.posy() ), removed_wheel ); - } - add_msg( _( "You replace one of the %1$s's tires with a %2$s." ), - veh->name, veh->parts[ partnum ].name() ); - } - break; } - g->u.invalidate_crafting_inventory(); + p.invalidate_crafting_inventory(); } diff --git a/src/veh_interact.h b/src/veh_interact.h index 26b211fe97787..5304702dcc487 100644 --- a/src/veh_interact.h +++ b/src/veh_interact.h @@ -51,7 +51,7 @@ class veh_interact static vehicle_part &select_part( const vehicle &veh, const part_selector &sel, const std::string &title = std::string() ); - static void complete_vehicle(); + static void complete_vehicle( player &p ); private: veh_interact( vehicle &veh, const point &p = point_zero ); @@ -180,7 +180,7 @@ class veh_interact vehicle_part *get_most_repariable_part() const; //do_remove supporting operation, writes requirements to ui - bool can_remove_part( int idx ); + bool can_remove_part( int idx, const player &p ); //do install support, writes requirements to ui bool can_install_part(); //true if trying to install foot crank with electric engines for example diff --git a/src/veh_type.cpp b/src/veh_type.cpp index 3f16719fffae3..0c1c7b748c460 100644 --- a/src/veh_type.cpp +++ b/src/veh_type.cpp @@ -175,7 +175,12 @@ static void parse_vp_reqs( JsonObject &obj, const std::string &id, const std::st skills.emplace( skill_id( cur.get_string( 0 ) ), cur.size() >= 2 ? cur.get_int( 1 ) : 1 ); } - assign( src, "time", moves ); + if( src.has_int( "time" ) ) { + moves = src.get_int( "time" ); + } else if( src.has_string( "time" ) ) { + moves = to_moves( read_from_json_string( *src.get_raw( "time" ), + time_duration::units ) ); + } if( src.has_string( "using" ) ) { reqs = { { requirement_id( src.get_string( "using" ) ), 1 } }; @@ -801,38 +806,38 @@ bool vpart_info::is_repairable() const return !repair_requirements().is_empty(); } -static int scale_time( const std::map &sk, int mv, const Character &ch ) +static int scale_time( const std::map &sk, int mv, const player &p ) { if( sk.empty() ) { return mv; } - const int lvl = std::accumulate( sk.begin(), sk.end(), 0, [&ch]( int lhs, + const int lvl = std::accumulate( sk.begin(), sk.end(), 0, [&p]( int lhs, const std::pair &rhs ) { - return lhs + std::max( std::min( ch.get_skill_level( rhs.first ), MAX_SKILL ) - rhs.second, + return lhs + std::max( std::min( p.get_skill_level( rhs.first ), MAX_SKILL ) - rhs.second, 0 ); } ); // 10% per excess level (reduced proportionally if >1 skill required) with max 50% reduction // 10% reduction per assisting NPC - const std::vector helpers = g->u.get_crafting_helpers(); - const int helpersize = g->u.get_num_crafting_helpers( 3 ); + const std::vector helpers = p.get_crafting_helpers(); + const int helpersize = p.get_num_crafting_helpers( 3 ); return mv * ( 1.0 - std::min( static_cast( lvl ) / sk.size() / 10.0, 0.5 ) ) * ( 1 - ( helpersize / 10.0 ) ); } -int vpart_info::install_time( const Character &ch ) const +int vpart_info::install_time( const player &p ) const { - return scale_time( install_skills, install_moves, ch ); + return scale_time( install_skills, install_moves, p ); } -int vpart_info::removal_time( const Character &ch ) const +int vpart_info::removal_time( const player &p ) const { - return scale_time( removal_skills, removal_moves, ch ); + return scale_time( removal_skills, removal_moves, p ); } -int vpart_info::repair_time( const Character &ch ) const +int vpart_info::repair_time( const player &p ) const { - return scale_time( repair_skills, repair_moves, ch ); + return scale_time( repair_skills, repair_moves, p ); } /** diff --git a/src/veh_type.h b/src/veh_type.h index 9f39e0ae6e33c..73bdd5f049656 100644 --- a/src/veh_type.h +++ b/src/veh_type.h @@ -231,7 +231,7 @@ class vpart_info int install_moves = to_moves( 1_hours ); /** Installation time (in moves) for this component accounting for player skills */ - int install_time( const Character &ch ) const; + int install_time( const player &p ) const; /** Requirements for removal of this component */ requirement_data removal_requirements() const; @@ -243,7 +243,7 @@ class vpart_info int removal_moves = -1; /** Removal time (in moves) for this component accounting for player skills */ - int removal_time( const Character &ch ) const; + int removal_time( const player &p ) const; /** Requirements for repair of this component (per level of damage) */ requirement_data repair_requirements() const; @@ -258,7 +258,7 @@ class vpart_info int repair_moves = to_moves( 1_hours ); /** Repair time (in moves) to fully repair this component, accounting for player skills */ - int repair_time( const Character &ch ) const; + int repair_time( const player &p ) const; /** @ref item_group this part breaks into when destroyed */ std::string breaks_into_group = "EMPTY_GROUP"; diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 29137baae397c..7bfc022831adb 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -22,6 +22,7 @@ #include "colony.h" #include "coordinate_conversions.h" #include "debug.h" +#include "event_bus.h" #include "explosion.h" #include "game.h" #include "item.h" @@ -518,6 +519,24 @@ void vehicle::init_state( int init_veh_fuel, int init_veh_status ) invalidate_mass(); } +void vehicle::activate_animal_follow() +{ + for( size_t e = 0; e < parts.size(); e++ ) { + const vehicle_part &vp = parts[ e ]; + if( vp.info().fuel_type == fuel_type_animal ) { + monster *mon = get_pet( e ); + if( mon && mon->has_effect( effect_harnessed ) ) { + parts[ e ].enabled = true; + is_following = true; + engine_on = true; + } + } else { + parts[ e ].enabled = false; + } + } + refresh(); +} + std::set vehicle::immediate_path( int rotate ) { int distance_to_check = 10 + ( velocity / 800 ); @@ -539,67 +558,41 @@ std::set vehicle::immediate_path( int rotate ) } -void vehicle::do_autodrive() +void vehicle::drive_to_local_target( const tripoint &autodrive_local_target, bool follow_protocol ) { - if( omt_path.empty() ) { - is_autodriving = false; + if( follow_protocol && g->u.in_vehicle ) { + is_following = false; return; } tripoint vehpos = global_pos3(); - tripoint veh_omt_pos = ms_to_omt_copy( g->m.getabs( vehpos ) ); - // we're at or close to the waypoint, pop it out and look for the next one. - if( veh_omt_pos == omt_path.back() ) { - omt_path.pop_back(); - } - - point omt_diff = omt_path.back().xy() - veh_omt_pos.xy(); - if( omt_diff.x > 3 || omt_diff.x < -3 || omt_diff.y > 3 || omt_diff.y < -3 ) { - // we've gone walkabout somehow, call off the whole thing - is_autodriving = false; - return; - } - int x_side = 0; - int y_side = 0; - if( omt_diff.x > 0 ) { - x_side = 2 * SEEX - 1; - } else if( omt_diff.x < 0 ) { - x_side = 0; - } else { - x_side = SEEX; - } - if( omt_diff.y > 0 ) { - y_side = 2 * SEEY - 1; - } else if( omt_diff.y < 0 ) { - y_side = 0; - } else { - y_side = SEEY; - } - // get the shared border mid-point of the next path omt - tripoint global_a = tripoint( veh_omt_pos.x * ( 2 * SEEX ), veh_omt_pos.y * ( 2 * SEEY ), - veh_omt_pos.z ); - tripoint autodrive_local_target = ( global_a + tripoint( x_side, y_side, - sm_pos.z ) - g->m.getabs( vehpos ) ) + global_pos3(); rl_vec2d facevec = face_vec(); point rel_pos_target = autodrive_local_target.xy() - vehpos.xy(); + rl_vec2d targetvec = rl_vec2d( rel_pos_target.x, rel_pos_target.y ); // cross product double crossy = ( facevec.x * targetvec.y ) - ( targetvec.x * facevec.y ); - // dot product + // dot product. double dotx = ( facevec.x * targetvec.x ) + ( facevec.y * targetvec.y ); double angle = ( atan2( crossy, dotx ) ) * 180 / M_PI; - // now we got the angle to the target, we can work out when we are heading towards disaster + // now we got the angle to the target, we can work out when we are heading towards disaster. // Check the tileray in the direction we need to head towards. std::set points_to_check = immediate_path( angle ); for( const auto &elem : points_to_check ) { const optional_vpart_position ovp = g->m.veh_at( tripoint( elem, sm_pos.z ) ); if( g->m.impassable_ter_furn( tripoint( elem, sm_pos.z ) ) || ( ovp && &ovp->vehicle() != this ) ) { + if( follow_protocol && elem == g->u.pos().xy() ) { + continue; + } if( velocity > 0 ) { - pldrive( 0, 10 ); + pldrive( point( 0, 10 ) ); } is_autodriving = false; + if( follow_protocol ) { + is_following = false; + } return; } } @@ -620,13 +613,75 @@ void vehicle::do_autodrive() int accel_y = 0; // best to cruise around at a safe velocity or 40mph, whichever is lowest // accelerate when it dosnt need to turn. - if( ( turn_x > 0 || turn_x < 0 ) && velocity > 1000 ) { - accel_y = 1; + // when following player, take distance to player into account. + // we really want to avoid running the player over. + int safe_player_follow_speed = 400; + if( g->u.movement_mode_is( PMM_RUN ) ) { + safe_player_follow_speed = 800; + } else if( g->u.movement_mode_is( PMM_CROUCH ) ) { + safe_player_follow_speed = 200; + } + if( follow_protocol ) { + if( ( ( turn_x > 0 || turn_x < 0 ) && velocity > safe_player_follow_speed ) || + rl_dist( vehpos, g->u.pos() ) < 7 + ( ( mount_max.y * 3 ) + 4 ) ) { + accel_y = 1; + } + if( ( velocity < std::min( safe_velocity(), safe_player_follow_speed ) && turn_x == 0 && + rl_dist( vehpos, g->u.pos() ) > 10 + ( ( mount_max.y * 3 ) + 4 ) ) || velocity < 100 ) { + accel_y = -1; + } + } else { + if( ( turn_x > 0 || turn_x < 0 ) && velocity > 1000 ) { + accel_y = 1; + } + if( ( velocity < std::min( safe_velocity(), 32 * 100 ) && turn_x == 0 ) || velocity < 500 ) { + accel_y = -1; + } + } + follow_protocol ? autodrive( turn_x, accel_y ) : pldrive( point( turn_x, accel_y ) ); +} + +void vehicle::do_autodrive() +{ + if( omt_path.empty() ) { + is_autodriving = false; + return; + } + tripoint vehpos = global_pos3(); + tripoint veh_omt_pos = ms_to_omt_copy( g->m.getabs( vehpos ) ); + // we're at or close to the waypoint, pop it out and look for the next one. + if( veh_omt_pos == omt_path.back() ) { + omt_path.pop_back(); } - if( ( velocity < std::min( safe_velocity(), 32 * 100 ) && turn_x == 0 ) || velocity < 500 ) { - accel_y = -1; + + point omt_diff = omt_path.back().xy() - veh_omt_pos.xy(); + if( omt_diff.x > 3 || omt_diff.x < -3 || omt_diff.y > 3 || omt_diff.y < -3 ) { + // we've gone walkabout somehow, call off the whole thing + is_autodriving = false; + return; + } + int x_side = 0; + int y_side = 0; + if( omt_diff.x > 0 ) { + x_side = 2 * SEEX - 1; + } else if( omt_diff.x < 0 ) { + x_side = 0; + } else { + x_side = SEEX; + } + if( omt_diff.y > 0 ) { + y_side = 2 * SEEY - 1; + } else if( omt_diff.y < 0 ) { + y_side = 0; + } else { + y_side = SEEY; } - pldrive( turn_x, accel_y ); + // get the shared border mid-point of the next path omt + tripoint global_a = tripoint( veh_omt_pos.x * ( 2 * SEEX ), veh_omt_pos.y * ( 2 * SEEY ), + veh_omt_pos.z ); + tripoint autodrive_local_target = ( global_a + tripoint( x_side, y_side, + sm_pos.z ) - g->m.getabs( vehpos ) ) + global_pos3(); + drive_to_local_target( autodrive_local_target, false ); } /** @@ -664,8 +719,7 @@ void vehicle::smash( float hp_percent_loss_min, float hp_percent_loss_max, int roll = dice( 1, 1000 ); int pct_af = ( percent_of_parts_to_affect * 1000.0f ); if( roll < pct_af ) { - float dist = 1.0f - trig_dist( damage_origin, point( part.precalc[0].x, - part.precalc[0].y ) ) / damage_size; + float dist = 1.0f - trig_dist( damage_origin, part.precalc[0] ) / damage_size; dist = clamp( dist, 0.0f, 1.0f ); if( damage_size == 0 ) { dist = 1.0f; @@ -701,7 +755,7 @@ void vehicle::smash( float hp_percent_loss_min, float hp_percent_loss_max, int vehicle::lift_strength() const { units::mass mass = total_mass(); - return std::max( mass / 10000_gram, 1 ); + return std::max( mass / 10000_gram, 1 ); } void vehicle::toggle_specific_engine( int e, bool on ) @@ -813,8 +867,8 @@ void vehicle::backfire( const int e ) const { const int power = part_vpower_w( engines[e], true ); const tripoint pos = global_part_pos3( engines[e] ); - //~ backfire sound sounds::sound( pos, 40 + power / 10000, sounds::sound_t::movement, + //~ backfire sound string_format( _( "a loud BANG! from the %s" ), parts[ engines[ e ] ].name() ), true, "vehicle", "engine_backfire" ); } @@ -1173,6 +1227,44 @@ bool vehicle::can_mount( const point &dp, const vpart_id &id ) const } } + // Wheels that need axles must be installed on a wheel mount + if( part.has_flag( "NEEDS_WHEEL_MOUNT_LIGHT" ) ) { + bool anchor_found = false; + for( const auto &elem : parts_in_square ) { + if( part_info( elem ).has_flag( "WHEEL_MOUNT_LIGHT" ) ) { + anchor_found = true; + break; + } + } + if( !anchor_found ) { + return false; + } + } + if( part.has_flag( "NEEDS_WHEEL_MOUNT_MEDIUM" ) ) { + bool anchor_found = false; + for( const auto &elem : parts_in_square ) { + if( part_info( elem ).has_flag( "WHEEL_MOUNT_MEDIUM" ) ) { + anchor_found = true; + break; + } + } + if( !anchor_found ) { + return false; + } + } + if( part.has_flag( "NEEDS_WHEEL_MOUNT_HEAVY" ) ) { + bool anchor_found = false; + for( const auto &elem : parts_in_square ) { + if( part_info( elem ).has_flag( "WHEEL_MOUNT_HEAVY" ) ) { + anchor_found = true; + break; + } + } + if( !anchor_found ) { + return false; + } + } + //Anything not explicitly denied is permitted return true; } @@ -1189,40 +1281,26 @@ bool vehicle::can_unmount( const int p, std::string &reason ) const return false; } - // Can't remove an engine if there's still an alternator there - if( part_flag( p, VPFLAG_ENGINE ) && part_with_feature( p, VPFLAG_ALTERNATOR, true ) >= 0 ) { - reason = _( "Remove attached alternator first." ); - return false; - } - - //Can't remove a seat if there's still a seatbelt there - if( part_flag( p, "BELTABLE" ) && part_with_feature( p, "SEATBELT", true ) >= 0 ) { - reason = _( "Remove attached seatbelt first." ); - return false; - } - - // Can't remove a window with curtains still on it - if( part_flag( p, "WINDOW" ) && part_with_feature( p, "CURTAIN", true ) >= 0 ) { - reason = _( "Remove attached curtains first." ); - return false; - } - - //Can't remove controls if there's something attached - if( part_flag( p, "CONTROLS" ) && part_with_feature( p, "ON_CONTROLS", true ) >= 0 ) { - reason = _( "Remove attached part first." ); - return false; - } - - //Can't remove a battery mount if there's still a battery there - if( part_flag( p, "BATTERY_MOUNT" ) && part_with_feature( p, "NEEDS_BATTERY_MOUNT", true ) >= 0 ) { - reason = _( "Remove battery from mount first." ); - return false; - } - - //Can't remove a turret mount if there's still a turret there - if( part_flag( p, "TURRET_MOUNT" ) && part_with_feature( p, "TURRET", true ) >= 0 ) { - reason = _( "Remove attached mounted weapon first." ); - return false; + // Check if the part is required by another part. Do not allow removing those. + // { "FLAG THAT IS REQUIRED", "FLAG THAT REQUIRES", "Reason why can't remove." } + static const std::array, 9> blocking_flags = {{ + std::make_tuple( "ENGINE", "ALTERNATOR", translate_marker( "Remove attached alternator first." ) ), + std::make_tuple( "BELTABLE", "SEATBELT", translate_marker( "Remove attached seatbelt first." ) ), + std::make_tuple( "WINDOW", "CURTAIN", translate_marker( "Remove attached curtains first." ) ), + std::make_tuple( "CONTROLS", "ON_CONTROLS", translate_marker( "Remove attached part first." ) ), + std::make_tuple( "BATTERY_MOUNT", "NEEDS_BATTERY_MOUNT", translate_marker( "Remove battery from mount first." ) ), + std::make_tuple( "TURRET_MOUNT", "TURRET", translate_marker( "Remove attached mounted weapon first." ) ), + std::make_tuple( "WHEEL_MOUNT_LIGHT", "NEEDS_WHEEL_MOUNT_LIGHT", translate_marker( "Remove attached wheel first." ) ), + std::make_tuple( "WHEEL_MOUNT_MEDIUM", "NEEDS_WHEEL_MOUNT_MEDIUM", translate_marker( "Remove attached wheel first." ) ), + std::make_tuple( "WHEEL_MOUNT_HEAVY", "NEEDS_WHEEL_MOUNT_HEAVY", translate_marker( "Remove attached wheel first." ) ) + } + }; + for( auto &flag_check : blocking_flags ) { + if( part_flag( p, std::get<0>( flag_check ) ) && + part_with_feature( p, std::get<1>( flag_check ), false ) >= 0 ) { + reason = _( std::get<2>( flag_check ) ); + return false; + } } //Can't remove an animal part if the animal is still contained @@ -2537,6 +2615,31 @@ std::vector vehicle::all_parts_at_location( const std::string &location ) c return parts_found; } +// another NPC probably removed a part in the time it took to walk here and start the activity. +// as the part index was first "chosen" before the NPC started travelling here. +// therefore the part index is now invalid shifted by one or two ( depending on how many other NPCs working on this vehicle ) +// so loop over the part indexes in reverse order to get the next one down that matches the part type we wanted to remove +int vehicle::get_next_shifted_index( int original_index, player &p ) +{ + int ret_index = original_index; + bool found_shifted_index = false; + for( std::vector::reverse_iterator it = parts.rbegin(); it != parts.rend(); ++it ) { + if( p.get_value( "veh_index_type" ) == it->info().name() ) { + ret_index = index_of_part( &*it ); + found_shifted_index = true; + break; + } + } + if( !found_shifted_index ) { + // we are probably down to a few parts left, and things get messy here, so an alternative index maybe cant be found + // if loads of npcs are all removign parts at the same time. + // if thats the case, just bail out and give up, somebody else is probably doing the job right now anyway. + return -1; + } else { + return ret_index; + } +} + /** * Returns all parts in the vehicle that have the specified flag in their vpinfo and * are on the same X-axis or Y-axis as the input part and are contiguous with each other. @@ -2868,11 +2971,11 @@ tripoint vehicle::global_part_pos3( const vehicle_part &pt ) const return global_pos3() + pt.precalc[ 0 ]; } -void vehicle::set_submap_moved( int x, int y ) +void vehicle::set_submap_moved( const point &p ) { const point old_msp = g->m.getabs( global_pos3().xy() ); - sm_pos.x = x; - sm_pos.y = y; + sm_pos.x = p.x; + sm_pos.y = p.y; if( !tracking_on ) { return; } @@ -3240,7 +3343,7 @@ static double simple_cubic_solution( double a, double b, double c, double d ) int vehicle::acceleration( const bool fueled, int at_vel_in_vmi ) const { - if( is_floating ) { + if( is_watercraft() ) { return water_acceleration( fueled, at_vel_in_vmi ); } return ground_acceleration( fueled, at_vel_in_vmi ); @@ -3310,7 +3413,7 @@ int vehicle::max_water_velocity( const bool fueled ) const int vehicle::max_velocity( const bool fueled ) const { - return is_floating ? max_water_velocity( fueled ) : max_ground_velocity( fueled ); + return is_watercraft() ? max_water_velocity( fueled ) : max_ground_velocity( fueled ); } // the same physics as max_ground_velocity, but with a smaller engine power @@ -3335,7 +3438,7 @@ int vehicle::safe_water_velocity( const bool fueled ) const int vehicle::safe_velocity( const bool fueled ) const { - return is_floating ? safe_water_velocity( fueled ) : safe_ground_velocity( fueled ); + return is_watercraft() ? safe_water_velocity( fueled ) : safe_ground_velocity( fueled ); } bool vehicle::do_environmental_effects() @@ -3695,9 +3798,14 @@ bool vehicle::can_float() const return draft_m < hull_height; } -bool vehicle::is_in_water() const +bool vehicle::is_watercraft() const { - return is_floating; + return is_floating || ( in_water && wheelcache.empty() ); +} + +bool vehicle::is_in_water( bool deep_water ) const +{ + return deep_water ? is_floating : in_water; } double vehicle::coeff_water_drag() const @@ -3755,6 +3863,9 @@ float vehicle::k_traction( float wheel_traction_area ) const if( is_floating ) { return can_float() ? 1.0f : -1.0f; } + if( is_watercraft() && can_float() ) { + return 1.0f; + } const float mass_penalty = ( 1.0f - wheel_traction_area / wheel_area() ) * to_kilogram( total_mass() ); @@ -3802,18 +3913,11 @@ bool vehicle::sufficient_wheel_config() const bool vehicle::handle_potential_theft( player &p, bool check_only, bool prompt ) { - faction *yours; - if( p.is_player() ) { - yours = g->faction_manager_ptr->get( faction_id( "your_followers" ) ); - } else { - npc *guy = dynamic_cast( &p ); - yours = guy->my_fac; - } + faction *yours = p.get_faction(); std::vector witnesses; for( npc &elem : g->all_npcs() ) { if( rl_dist( elem.pos(), p.pos() ) < MAX_VIEW_DISTANCE && has_owner() && - elem.my_fac == get_owner() && - elem.sees( p.pos() ) ) { + elem.get_faction() == get_owner() && elem.sees( p.pos() ) ) { witnesses.push_back( &elem ); } } @@ -3898,11 +4002,15 @@ float vehicle::steering_effectiveness() const { if( is_floating ) { // I'M ON A BOAT - return can_float() ? 1.0 : 0.0; + return can_float() ? 1.0f : 0.0f; + } + // irksome special case for boats in shallow water + if( is_watercraft() && can_float() ) { + return 1.0f; } if( steering.empty() ) { - return -1.0; // No steering installed + return -1.0f; // No steering installed } // If the only steering part is an animal harness, with no animal in, it // is not steerable. @@ -3910,7 +4018,7 @@ float vehicle::steering_effectiveness() const if( steering.size() == 1 && vp.info().fuel_type == fuel_type_animal ) { monster *mon = get_pet( steering[0] ); if( mon == nullptr || !mon->has_effect( effect_harnessed ) ) { - return -2.0; + return -2.0f; } } // For now, you just need one wheel working for 100% effective steering. @@ -3919,12 +4027,12 @@ float vehicle::steering_effectiveness() const // etc) for( int p : steering ) { if( parts[ p ].is_available() ) { - return 1.0; + return 1.0f; } } // We have steering, but it's all broken. - return 0.0; + return 0.0f; } float vehicle::handling_difficulty() const @@ -4019,43 +4127,43 @@ void vehicle::consume_fuel( int load, const int t_seconds, bool skip_electric ) // we want this to update the activity level whenever the engine is running if( load > 0 && fuel_left( fuel_type_muscle ) > 0 ) { g->u.increase_activity_level( ACTIVE_EXERCISE ); - } - //do this as a function of current load - // But only if the player is actually there! - if( load > 0 && fuel_left( fuel_type_muscle ) > 0 ) { - int mod = 0 + 4 * st; // strain - int base_burn = -3 + static_cast( get_option( "PLAYER_BASE_STAMINA_REGEN_RATE" ) ); - base_burn = ( load / 3 ) > base_burn ? ( load / 3 ) : base_burn; + //do this as a function of current load + // But only if the player is actually there! + int eff_load = load / 10; + int mod = 4 * st; // strain + int base_burn = static_cast( get_option( "PLAYER_BASE_STAMINA_REGEN_RATE" ) ) - + 3; + base_burn = std::max( eff_load / 3, base_burn ); //charge bionics when using muscle engine const item muscle( "muscle" ); if( g->u.has_active_bionic( bionic_id( "bio_torsionratchet" ) ) ) { if( one_in( 1000 / load ) ) { // more pedaling = more power g->u.charge_power( 1 ); } - mod += load / 5; + mod += eff_load / 5; } if( g->u.has_bionic( bionic_id( "bio_torsionratchet" ) ) ) { if( one_in( 1000 / load ) && one_in( 20 ) ) { // intentional double chance check g->u.charge_power( 1 ); } - mod += load / 10; + mod += eff_load / 10; } for( const bionic_id &bid : g->u.get_bionic_fueled_with( muscle ) ) { if( g->u.has_active_bionic( bid ) ) { if( one_in( 1000 / load ) ) { // more pedaling = more power g->u.charge_power( muscle.fuel_energy() * bid->fuel_efficiency ); } - mod += load / 5; + mod += eff_load / 5; } if( one_in( 1000 / load ) && one_in( 20 ) ) { // intentional double chance check g->u.charge_power( muscle.fuel_energy() * bid->fuel_efficiency ); } - mod += load / 10; + mod += eff_load / 10; } // decreased stamina burn scalable with load if( g->u.has_active_bionic( bionic_id( "bio_jointservo" ) ) ) { - g->u.charge_power( ( load / 20 ) > 1 ? -( load / 20 ) : -1 ); - mod -= ( load / 5 ) > 5 ? ( load / 5 ) : 5; + g->u.charge_power( -std::max( eff_load / 20, 1 ) ); + mod -= std::max( eff_load / 5, 5 ); } if( one_in( 1000 / load ) && one_in( 10 ) ) { g->u.mod_thirst( 1 ); @@ -4737,6 +4845,7 @@ void vehicle::place_spawn_items() void vehicle::gain_moves() { check_falling_or_floating(); + const bool pl_control = player_in_control( g->u ); if( is_moving() || is_falling ) { if( !loose_parts.empty() ) { shed_loose_parts(); @@ -4744,7 +4853,7 @@ void vehicle::gain_moves() of_turn = 1 + of_turn_carry; const int vslowdown = slowdown( velocity ); if( vslowdown > abs( velocity ) ) { - if( cruise_on && cruise_velocity ) { + if( cruise_on && cruise_velocity && pl_control ) { velocity = velocity > 0 ? 1 : -1; } else { stop(); @@ -4760,7 +4869,7 @@ void vehicle::gain_moves() of_turn_carry = 0; // cruise control TODO: enable for NPC? - if( player_in_control( g->u ) && cruise_on && cruise_velocity != velocity ) { + if( ( pl_control || is_following ) && cruise_on && cruise_velocity != velocity ) { thrust( ( cruise_velocity ) > velocity ? 1 : -1 ); } @@ -4941,7 +5050,8 @@ void vehicle::refresh() railwheel_xmax = std::max( railwheel_xmax, pt.x ); railwheel_ymax = std::max( railwheel_ymax, pt.y ); } - if( vpi.has_flag( "STEERABLE" ) || vpi.has_flag( "TRACKED" ) ) { + if( ( vpi.has_flag( "STEERABLE" ) && part_with_feature( pt, "STEERABLE", true ) != -1 ) || + vpi.has_flag( "TRACKED" ) ) { // TRACKED contributes to steering effectiveness but // (a) doesn't count as a steering axle for install difficulty // (b) still contributes to drag for the center of steering calculation @@ -5057,7 +5167,7 @@ void vehicle::refresh_pivot() const // broken wheels don't roll on either axis weight_i = contact_area * 2.0; weight_p = contact_area * 2.0; - } else if( wheel.info().has_flag( "STEERABLE" ) ) { + } else if( part_with_feature( wheel.mount, "STEERABLE", true ) != -1 ) { // Unbroken steerable wheels can handle motion on both axes // (but roll a little more easily inline) weight_i = contact_area * 0.1; @@ -5122,6 +5232,17 @@ void vehicle::shed_loose_parts() } } +bool vehicle::enclosed_at( const tripoint &pos ) +{ + refresh_insides(); + std::vector parts_here = get_parts_at( pos, "BOARDABLE", + part_status_flag::working ); + if( !parts_here.empty() ) { + return parts_here.front()->inside; + } + return false; +} + void vehicle::refresh_insides() { if( !insides_dirty ) { @@ -5432,9 +5553,7 @@ bool vehicle::explode_fuel( int p, damage_type type ) int explosion_chance = type == DT_HEAT ? data.explosion_chance_hot : data.explosion_chance_cold; if( one_in( explosion_chance ) ) { - g->u.add_memorial_log( pgettext( "memorial_male", "The fuel tank of the %s exploded!" ), - pgettext( "memorial_female", "The fuel tank of the %s exploded!" ), - name ); + g->events().send( name ); const int pow = 120 * ( 1 - exp( data.explosion_factor / -5000 * ( parts[p].ammo_remaining() * data.fuel_size_factor ) ) ); //debugmsg( "damage check dmg=%d pow=%d amount=%d", dmg, pow, parts[p].amount ); @@ -5853,7 +5972,7 @@ void vehicle::calc_mass_center( bool use_precalc ) const } if( vp.part().has_flag( vehicle_part::animal_flag ) ) { - int animal_mass = vp.part().base.get_var( "weight", 0 ); + std::int64_t animal_mass = vp.part().base.get_var( "weight", 0 ); m_part += units::from_gram( animal_mass ); } diff --git a/src/vehicle.h b/src/vehicle.h index 81b3b0e056f11..3bae13b209514 100644 --- a/src/vehicle.h +++ b/src/vehicle.h @@ -637,10 +637,10 @@ class vehicle units::volume total_folded_volume() const; // Vehicle fuel indicator (by fuel) - void print_fuel_indicator( const catacurses::window &w, int y, int x, + void print_fuel_indicator( const catacurses::window &w, const point &p, const itype_id &fuel_type, bool verbose = false, bool desc = false ); - void print_fuel_indicator( const catacurses::window &w, int y, int x, + void print_fuel_indicator( const catacurses::window &w, const point &p, const itype_id &fuel_type, std::map fuel_usages, bool verbose = false, bool desc = false ); @@ -760,6 +760,7 @@ class vehicle bool handle_potential_theft( player &p, bool check_only = false, bool prompt = true ); // project a tileray forward to predict obstacles std::set immediate_path( int rotate = 0 ); + void drive_to_local_target( const tripoint &autodrive_local_target, bool follow_protocol ); void do_autodrive(); /** * Operate vehicle controls @@ -774,7 +775,7 @@ class vehicle bool start_engine( int e ); // Attempt to start the vehicle's active engines - void start_engines( bool take_control = false ); + void start_engines( bool take_control = false, bool autodrive = false ); // Engine backfire, making a loud noise void backfire( int e ) const; @@ -947,7 +948,8 @@ class vehicle // returns indices of all parts in the given location slot std::vector all_parts_at_location( const std::string &location ) const; - + // shifts an index to next available of that type for NPC activities + int get_next_shifted_index( int original_index, player &p ); // Given a part and a flag, returns the indices of all contiguously adjacent parts // with the same flag on the X and Y Axis std::vector> find_lines_of_parts( int part, const std::string &flag ); @@ -1007,6 +1009,7 @@ class vehicle // get monster on a boardable part at p monster *get_pet( int p ) const; + bool enclosed_at( const tripoint &pos ); // not const because it calls refresh_insides /** * Get the coordinates (in map squares) of this vehicle, it's the same * coordinate system that player::posx uses. @@ -1210,7 +1213,8 @@ class vehicle /** * is the vehicle mostly in water or mostly on fairly dry land? */ - bool is_in_water() const; + bool is_in_water( bool deep_water = false ) const; + bool is_watercraft() const; /** * Traction coefficient of the vehicle. @@ -1279,12 +1283,16 @@ class vehicle // Process the trap beneath void handle_trap( const tripoint &p, int part ); + void activate_animal_follow(); + /** + * vehicle is driving itself + */ + void autodrive( int x, int y ); /** * Player is driving the vehicle - * @param x direction player is steering - * @param y direction player is steering + * @param p direction player is steering */ - void pldrive( int x, int y ); + void pldrive( const point &p ); // stub for per-vpart limit units::volume max_volume( int part ) const; @@ -1515,12 +1523,12 @@ class vehicle bool is_wheel_state_correct_to_turn_on_rails( int wheels_on_rail, int wheel_count, int turning_wheels_that_are_one_axis ) const; /** - * Update the submap coordinates smx, smy, and update the tracker info in the overmap + * Update the submap coordinates and update the tracker info in the overmap * (if enabled). * This should be called only when the vehicle has actually been moved, not when * the map is just shifted (in the later case simply set smx/smy directly). */ - void set_submap_moved( int x, int y ); + void set_submap_moved( const point &p ); void use_autoclave( int p ); void use_washing_machine( int p ); void use_dishwasher( int p ); @@ -1690,11 +1698,14 @@ class vehicle // and that's the bit that controls recalculation. The intent is to only recalculate // the coeffs once per turn, even if multiple parts are destroyed in a collision mutable bool coeff_air_changed = true; - // is the vehicle currently mostly in water + // is the vehicle currently mostly in deep water mutable bool is_floating = false; + // is the vehicle currently mostly in water + mutable bool in_water = false; public: bool is_autodriving = false; + bool is_following = false; bool all_wheels_on_one_axis; // TODO: change these to a bitset + enum? // cruise control on/off diff --git a/src/vehicle_display.cpp b/src/vehicle_display.cpp index 9c5883772370d..3dbc5813004d2 100644 --- a/src/vehicle_display.cpp +++ b/src/vehicle_display.cpp @@ -343,13 +343,13 @@ void vehicle::print_fuel_indicators( const catacurses::window &win, int y, int x // if only one display, print the first engine that's on and consumes power if( is_engine_on( e ) && !( is_perpetual_type( e ) || is_engine_type( e, fuel_type_muscle ) ) ) { - print_fuel_indicator( win, y, x, parts[ engines [ e ] ].fuel_current(), verbose, + print_fuel_indicator( win, point( x, y ), parts[ engines [ e ] ].fuel_current(), verbose, desc ); return; } } // or print the first fuel if no engines - print_fuel_indicator( win, y, x, fuels.front(), verbose, desc ); + print_fuel_indicator( win, point( x, y ), fuels.front(), verbose, desc ); return; } @@ -360,7 +360,7 @@ void vehicle::print_fuel_indicators( const catacurses::window &win, int y, int x for( int i = start_index; i < max_size; i++ ) { const itype_id &f = fuels[i]; - print_fuel_indicator( win, y + yofs, x, f, fuel_usages, verbose, desc ); + print_fuel_indicator( win, point( x, y + yofs ), f, fuel_usages, verbose, desc ); yofs++; } @@ -374,21 +374,20 @@ void vehicle::print_fuel_indicators( const catacurses::window &win, int y, int x /** * Prints a fuel gauge for a vehicle * @param win Pointer to the window to draw in. - * @param y Y location to draw at. - * @param x X location to draw at. + * @param p location to draw at. * @param fuel_type ID of the fuel type to draw * @param verbose true if there should be anything after the gauge (either the %, or number) * @param desc true if the name of the fuel should be at the end * @param fuel_usages map of fuel types to consumption for verbose */ -void vehicle::print_fuel_indicator( const catacurses::window &win, int y, int x, +void vehicle::print_fuel_indicator( const catacurses::window &win, const point &p, const itype_id &fuel_type, bool verbose, bool desc ) { std::map fuel_usages; - print_fuel_indicator( win, y, x, fuel_type, fuel_usages, verbose, desc ); + print_fuel_indicator( win, p, fuel_type, fuel_usages, verbose, desc ); } -void vehicle::print_fuel_indicator( const catacurses::window &win, int y, int x, +void vehicle::print_fuel_indicator( const catacurses::window &win, const point &p, const itype_id &fuel_type, std::map fuel_usages, bool verbose, bool desc ) @@ -398,15 +397,15 @@ void vehicle::print_fuel_indicator( const catacurses::window &win, int y, int x, int cap = fuel_capacity( fuel_type ); int f_left = fuel_left( fuel_type ); nc_color f_color = item::find_type( fuel_type )->color; - mvwprintz( win, point( x, y ), col_indf1, "E...F" ); + mvwprintz( win, p, col_indf1, "E...F" ); int amnt = cap > 0 ? f_left * 99 / cap : 0; int indf = ( amnt / 20 ) % 5; - mvwprintz( win, point( x + indf, y ), f_color, "%c", fsyms[indf] ); + mvwprintz( win, p + point( indf, 0 ), f_color, "%c", fsyms[indf] ); if( verbose ) { if( debug_mode ) { - mvwprintz( win, point( x + 6, y ), f_color, "%d/%d", f_left, cap ); + mvwprintz( win, p + point( 6, 0 ), f_color, "%d/%d", f_left, cap ); } else { - mvwprintz( win, point( x + 6, y ), f_color, "%d", f_left * 100 / cap ); + mvwprintz( win, p + point( 6, 0 ), f_color, "%d", f_left * 100 / cap ); wprintz( win, c_light_gray, "%c", 045 ); } } diff --git a/src/vehicle_move.cpp b/src/vehicle_move.cpp index 5c70395299bde..d231d93fe913e 100644 --- a/src/vehicle_move.cpp +++ b/src/vehicle_move.cpp @@ -80,7 +80,7 @@ int vehicle::slowdown( int at_velocity ) const // slowdown due to air resistance is proportional to square of speed double f_total_drag = coeff_air_drag() * mps * mps; - if( is_floating ) { + if( is_watercraft() ) { // same with water resistance f_total_drag += coeff_water_drag() * mps * mps; } else if( !is_falling ) { @@ -103,7 +103,7 @@ int vehicle::slowdown( int at_velocity ) const slowdown -= static_drag(); } - return slowdown; + return std::max( 1, slowdown ); } void vehicle::thrust( int thd ) @@ -118,20 +118,18 @@ void vehicle::thrust( int thd ) bool pl_ctrl = player_in_control( g->u ); // No need to change velocity if there are no wheels - if( is_floating ) { - if( !can_float() ) { - if( pl_ctrl ) { - add_msg( _( "The %s is too leaky!" ), name ); - } - return; + if( in_water && can_float() ) { + // we're good + } else if( is_floating && !can_float() ) { + if( pl_ctrl ) { + add_msg( _( "The %s is too leaky!" ), name ); } - } else { - if( !valid_wheel_config() ) { - if( pl_ctrl ) { - add_msg( _( "The %s doesn't have enough wheels to move!" ), name ); - } - return; + return; + } else if( !valid_wheel_config() ) { + if( pl_ctrl ) { + add_msg( _( "The %s doesn't have enough wheels to move!" ), name ); } + return; } // Accelerate (true) or brake (false) bool thrusting = true; @@ -201,8 +199,6 @@ void vehicle::thrust( int thd ) //make noise and consume fuel noise_and_smoke( load ); - // HACK - vehicles don't move as far as they should in 6 seconds, so for movement ONLY - // consume fuel as though a turn were 1 second consume_fuel( load, 1 ); //break the engines a bit, if going too fast. @@ -851,11 +847,64 @@ void vehicle::handle_trap( const tripoint &p, int part ) } } -void vehicle::pldrive( int x, int y ) +void vehicle::autodrive( int x, int y ) { - player &u = g->u; + // for now, autodriving is only possible when pulled by an animal + for( size_t e = 0; e < parts.size(); e++ ) { + const vehicle_part &vp = parts[ e ]; + if( vp.info().fuel_type == fuel_type_animal ) { + monster *mon = get_pet( e ); + if( !mon || !mon->has_effect( effect_harnessed ) ) { + is_following = false; + } + } + } int turn_delta = 15 * x; const float handling_diff = handling_difficulty(); + if( turn_delta != 0 ) { + float eff = steering_effectiveness(); + if( eff == -2 ) { + return; + } + + if( eff < 0 ) { + return; + } + + if( eff == 0 ) { + return; + } + turn( turn_delta ); + + } + + if( y != 0 ) { + int thr_amount = 100 * ( abs( velocity ) < 2000 ? 4 : 5 ); + if( cruise_on ) { + cruise_thrust( -y * thr_amount ); + } else { + thrust( -y ); + } + } + + // TODO: Actually check if we're on land on water (or disable water-skidding) + if( skidding && valid_wheel_config() ) { + ///\EFFECT_DEX increases chance of regaining control of a vehicle + + ///\EFFECT_DRIVING increases chance of regaining control of a vehicle + if( handling_diff * rng( 1, 10 ) < 15 ) { + velocity = static_cast( forward_velocity() ); + skidding = false; + move.init( turn_dir ); + } + } +} + +void vehicle::pldrive( const point &p ) +{ + player &u = g->u; + int turn_delta = 15 * p.x; + const float handling_diff = handling_difficulty(); if( turn_delta != 0 ) { float eff = steering_effectiveness(); if( eff == -2 ) { @@ -915,12 +964,12 @@ void vehicle::pldrive( int x, int y ) u.moves -= std::max( cost, u.get_speed() / 3 + 1 ); } - if( y != 0 ) { + if( p.y != 0 ) { int thr_amount = 100 * ( abs( velocity ) < 2000 ? 4 : 5 ); if( cruise_on ) { - cruise_thrust( -y * thr_amount ); + cruise_thrust( -p.y * thr_amount ); } else { - thrust( -y ); + thrust( -p.y ); u.moves = std::min( u.moves, 0 ); } } @@ -1358,11 +1407,13 @@ void vehicle::check_falling_or_floating() // Dirty vehicle with no parts is_falling = false; is_floating = false; + in_water = false; return; } is_falling = g->m.has_zlevels(); + size_t deep_water_tiles = 0; size_t water_tiles = 0; for( const tripoint &p : pts ) { if( is_falling ) { @@ -1370,17 +1421,23 @@ void vehicle::check_falling_or_floating() is_falling &= g->m.has_flag_ter_or_furn( TFLAG_NO_FLOOR, p ) && ( p.z > -OVERMAP_DEPTH ) && !g->m.supports_above( below ); } - water_tiles += g->m.has_flag( TFLAG_DEEP_WATER, p ) ? 1 : 0; + deep_water_tiles += g->m.has_flag( TFLAG_DEEP_WATER, p ) ? 1 : 0; + water_tiles += g->m.has_flag( TFLAG_SWIMMABLE, p ) ? 1 : 0; } - // floating if 2/3rds of the vehicle is in water - is_floating = 3 * water_tiles >= 2 * pts.size(); + // floating if 2/3rds of the vehicle is in deep water + is_floating = 3 * deep_water_tiles >= 2 * pts.size(); + // in_water if 1/2 of the vehicle is in water at all + in_water = 2 * water_tiles >= pts.size(); } float map::vehicle_wheel_traction( const vehicle &veh ) const { - if( veh.is_in_water() ) { + if( veh.is_in_water( true ) ) { return veh.can_float() ? 1.0f : -1.0f; } + if( veh.is_in_water() && veh.is_watercraft() && veh.can_float() ) { + return 1.0f; + } const auto &wheel_indices = veh.wheelcache; int num_wheels = wheel_indices.size(); diff --git a/src/vehicle_use.cpp b/src/vehicle_use.cpp index bd50207d9de92..294c67c37c94f 100644 --- a/src/vehicle_use.cpp +++ b/src/vehicle_use.cpp @@ -405,8 +405,9 @@ bool vehicle::interact_vehicle_locked() g->u.assign_activity( activity_id( "ACT_HOTWIRE_CAR" ), moves, -1, INT_MIN, _( "Hotwire" ) ); // use part 0 as the reference point point q = coord_translate( parts[0].mount ); - g->u.activity.values.push_back( global_pos3().x + q.x ); //[0] - g->u.activity.values.push_back( global_pos3().y + q.y ); //[1] + const tripoint abs_veh_pos = g->m.getabs( global_pos3() ); + g->u.activity.values.push_back( abs_veh_pos.x + q.x ); //[0] + g->u.activity.values.push_back( abs_veh_pos.y + q.y ); //[1] g->u.activity.values.push_back( g->u.get_skill_level( skill_mechanics ) ); //[2] } else { if( has_security_working() && query_yn( _( "Trigger the %s's Alarm?" ), name ) ) { @@ -925,7 +926,7 @@ bool vehicle::start_engine( const int e ) return true; } -void vehicle::start_engines( const bool take_control ) +void vehicle::start_engines( const bool take_control, const bool autodrive ) { bool has_engine = std::any_of( engines.begin(), engines.end(), [&]( int idx ) { return parts[ idx ].enabled && !parts[ idx ].is_broken(); @@ -967,10 +968,11 @@ void vehicle::start_engines( const bool take_control ) g->u.controlling_vehicle = true; add_msg( _( "You take control of the %s." ), name ); } - - g->u.assign_activity( activity_id( "ACT_START_ENGINES" ), start_time ); - g->u.activity.placement = starting_engine_position - g->u.pos(); - g->u.activity.values.push_back( take_control ); + if( !autodrive ) { + g->u.assign_activity( activity_id( "ACT_START_ENGINES" ), start_time ); + g->u.activity.placement = starting_engine_position - g->u.pos(); + g->u.activity.values.push_back( take_control ); + } } void vehicle::honk_horn() @@ -1528,40 +1530,52 @@ void vehicle::use_monster_capture( int part, const tripoint &pos ) void vehicle::use_harness( int part, const tripoint &pos ) { if( parts[part].is_unavailable() || parts[part].removed ) { - add_msg( "is unavailable" ); return; } - const cata::optional target_ = choose_adjacent( - _( "Where is the creature to harness?" ) ); - if( !target_ ) { - add_msg( _( "Never mind." ) ); + if( !g->is_empty( pos ) ) { + add_msg( m_info, _( "The harness is blocked." ) ); return; } - const tripoint target = *target_; - monster *mon_ptr = g->critter_at( target ); - if( mon_ptr != nullptr ) { - monster &f = *mon_ptr; - if( f.friendly != 0 && f.has_flag( MF_PET_MOUNTABLE ) && g->is_empty( pos ) ) { - f.add_effect( effect_harnessed, 1_turns, num_bp, true ); - f.setpos( pos ); - add_msg( m_info, _( "You harness your %s to the %s." ), f.get_name(), name ); - if( f.has_effect( effect_tied ) ) { - add_msg( m_info, _( "You untie your %s." ), f.get_name() ); - f.remove_effect( effect_tied ); - if( f.tied_item ) { - g->u.i_add( *f.tied_item ); - f.tied_item = cata::nullopt; - } - } - } else if( f.friendly == 0 ) { - add_msg( m_info, _( "This creature is not friendly!" ) ); - } else if( !f.has_flag( MF_PET_MOUNTABLE ) ) { - add_msg( m_info, _( "This creature cannot be harnessed." ) ); - } else if( !g->is_empty( pos ) ) { - add_msg( m_info, _( "The harness is blocked." ) ); + const std::function f = []( const tripoint & pnt ) { + monster *mon_ptr = g->critter_at( pnt ); + if( mon_ptr == nullptr ) { + return false; } - } else { + monster &f = *mon_ptr; + return ( f.friendly != 0 && f.has_flag( MF_PET_MOUNTABLE ) ); + }; + + const cata::optional pnt_ = choose_adjacent_highlight( + _( "Where is the creature to harness?" ), f, false, true ); + if( !pnt_ ) { + add_msg( m_info, _( "Never mind." ) ); + return; + } + const tripoint &target = *pnt_; + monster *mon_ptr = g->critter_at( target ); + if( mon_ptr == nullptr ) { add_msg( m_info, _( "No creature there." ) ); + return; + } + monster &m = *mon_ptr; + if( m.friendly == 0 ) { + add_msg( m_info, _( "This creature is not friendly!" ) ); + return; + } else if( !m.has_flag( MF_PET_MOUNTABLE ) ) { + add_msg( m_info, _( "This creature cannot be harnessed." ) ); + return; + } + + m.add_effect( effect_harnessed, 1_turns, num_bp, true ); + m.setpos( pos ); + add_msg( m_info, _( "You harness your %s to the %s." ), m.get_name(), name ); + if( m.has_effect( effect_tied ) ) { + add_msg( m_info, _( "You untie your %s." ), m.get_name() ); + m.remove_effect( effect_tied ); + if( m.tied_item ) { + g->u.i_add( *m.tied_item ); + m.tied_item = cata::nullopt; + } } } @@ -1634,6 +1648,8 @@ void vehicle::interact_with( const tripoint &pos, int interact_part ) auto turret = turret_query( pos ); + const int curtain_part = avail_part_with_feature( interact_part, "CURTAIN", true ); + const bool curtain_closed = ( curtain_part == -1 ) ? false : !parts[curtain_part].open; const bool has_kitchen = avail_part_with_feature( interact_part, "KITCHEN", true ) >= 0; const bool has_faucet = avail_part_with_feature( interact_part, "FAUCET", true ) >= 0; const bool has_towel = avail_part_with_feature( interact_part, "TOWEL", true ) >= 0; @@ -1674,7 +1690,7 @@ void vehicle::interact_with( const tripoint &pos, int interact_part ) enum { EXAMINE, TRACK, CONTROL, CONTROL_ELECTRONICS, GET_ITEMS, GET_ITEMS_ON_GROUND, FOLD_VEHICLE, UNLOAD_TURRET, RELOAD_TURRET, USE_HOTPLATE, FILL_CONTAINER, DRINK, USE_WELDER, USE_PURIFIER, PURIFY_TANK, USE_AUTOCLAVE, USE_WASHMACHINE, USE_DISHWASHER, - USE_MONSTER_CAPTURE, USE_BIKE_RACK, USE_HARNESS, RELOAD_PLANTER, WORKBENCH, USE_TOWEL, + USE_MONSTER_CAPTURE, USE_BIKE_RACK, USE_HARNESS, RELOAD_PLANTER, WORKBENCH, USE_TOWEL, PEEK_CURTAIN, }; uilist selectmenu; @@ -1717,6 +1733,9 @@ void vehicle::interact_with( const tripoint &pos, int interact_part ) if( turret.can_reload() ) { selectmenu.addentry( RELOAD_TURRET, true, 'r', _( "Reload %s" ), turret.name() ); } + if( curtain_part >= 0 && curtain_closed ) { + selectmenu.addentry( PEEK_CURTAIN, true, 'p', _( "Peek through the closed curtains" ) ); + } if( ( has_kitchen || has_chemlab ) && fuel_left( "battery" ) > 0 ) { selectmenu.addentry( USE_HOTPLATE, true, 'h', _( "Use the hotplate" ) ); } @@ -1793,6 +1812,11 @@ void vehicle::interact_with( const tripoint &pos, int interact_part ) use_monster_capture( monster_capture_part, pos ); return; } + case PEEK_CURTAIN: { + add_msg( _( "You carefully peek through the curtains." ) ); + g->peek( pos ); + return; + } case USE_HOTPLATE: { veh_tool( "hotplate" ); return; diff --git a/src/weather.cpp b/src/weather.cpp index b963681807fa1..61f2c9db5e1f0 100644 --- a/src/weather.cpp +++ b/src/weather.cpp @@ -61,44 +61,37 @@ static bool is_player_outside() /** * Glare. * Causes glare effect to player's eyes if they are not wearing applicable eye protection. + * @param intensity Level of sun brighthess */ - -void weather_effect::glare( bool snowglare ) +void weather_effect::glare( sun_intensity intensity ) { + //General prepequisites for glare + if( !is_player_outside() || !g->is_in_sunlight( g->u.pos() ) || g->u.in_sleep_state() || + g->u.worn_with_flag( "SUN_GLASSES" ) || + g->u.has_bionic( bionic_id( "bio_sunglasses" ) ) || + g->u.is_blind() ) { + return; + } + + time_duration dur = 0_turns; + const efftype_id *effect = nullptr; season_type season = season_of_year( calendar::turn ); - if( is_player_outside() && g->is_in_sunlight( g->u.pos() ) && !g->u.in_sleep_state() && - !g->u.worn_with_flag( "SUN_GLASSES" ) && !g->u.is_blind() && !snowglare && - !g->u.has_bionic( bionic_id( "bio_sunglasses" ) ) ) { - if( !g->u.has_effect( effect_glare ) ) { - if( g->u.has_trait( trait_CEPH_VISION ) ) { - g->u.add_env_effect( effect_glare, bp_eyes, 2, 4_turns ); - } else { - g->u.add_env_effect( effect_glare, bp_eyes, 2, 2_turns ); - } - } else { - if( g->u.has_trait( trait_CEPH_VISION ) ) { - g->u.add_env_effect( effect_glare, bp_eyes, 2, 2_turns ); - } else { - g->u.add_env_effect( effect_glare, bp_eyes, 2, 1_turns ); - } - } + if( season == WINTER ) { + //Winter snow glare: for both clear & sunny weather + effect = &effect_snow_glare; + dur = g->u.has_effect( *effect ) ? 1_turns : 2_turns; + } else if( intensity == sun_intensity::high ) { + //Sun glare: only for bright sunny weather + effect = &effect_glare; + dur = g->u.has_effect( *effect ) ? 1_turns : 2_turns; } - if( is_player_outside() && !g->u.in_sleep_state() && season == WINTER && - !g->u.worn_with_flag( "SUN_GLASSES" ) && !g->u.is_blind() && snowglare && - !g->u.has_bionic( bionic_id( "bio_sunglasses" ) ) ) { - if( !g->u.has_effect( effect_snow_glare ) ) { - if( g->u.has_trait( trait_CEPH_VISION ) ) { - g->u.add_env_effect( effect_snow_glare, bp_eyes, 2, 4_turns ); - } else { - g->u.add_env_effect( effect_snow_glare, bp_eyes, 2, 2_turns ); - } - } else { - if( g->u.has_trait( trait_CEPH_VISION ) ) { - g->u.add_env_effect( effect_snow_glare, bp_eyes, 2, 2_turns ); - } else { - g->u.add_env_effect( effect_snow_glare, bp_eyes, 2, 1_turns ); - } + //apply final glare effect + if( dur > 0_turns && effect != nullptr ) { + //enhance/reduce by some traits + if( g->u.has_trait( trait_CEPH_VISION ) ) { + dur = dur * 2; } + g->u.add_env_effect( *effect, bp_eyes, 2, dur ); } } @@ -127,7 +120,7 @@ inline void proc_weather_sum( const weather_type wtype, weather_sum &data, } // TODO: Change this sunlight "sampling" here into a proper interpolation - const float tick_sunlight = sunlight( t ) + weather::light_modifier( wtype ); + const float tick_sunlight = sunlight( t, false ) + weather::light_modifier( wtype ); data.sunlight += std::max( 0.0f, to_turns( tick_size ) * tick_sunlight ); } @@ -399,12 +392,15 @@ static void generic_very_wet( bool acid ) wet_player( 60 ); } -void weather_effect::none() {} +void weather_effect::none() +{ + glare( sun_intensity::normal ); +} void weather_effect::flurry() {} void weather_effect::sunny() { - glare( false ); + glare( sun_intensity::high ); } /** @@ -428,7 +424,6 @@ void weather_effect::very_wet() void weather_effect::snow() { wet_player( 10 ); - glare( true ); } void weather_effect::snowstorm() diff --git a/src/weather.h b/src/weather.h index 0907a0bb48c44..a39dd5ef20098 100644 --- a/src/weather.h +++ b/src/weather.h @@ -89,8 +89,14 @@ struct weather_printable { */ namespace weather_effect { + +enum sun_intensity : int { + normal = 1, + high +}; + void none(); //!< Fallback weather. -void glare( bool ); +void glare( sun_intensity ); void wet(); void very_wet(); void thunder(); @@ -100,7 +106,6 @@ void acid(); void flurry(); //!< Currently flurries have no additional effects. void snow(); void sunny(); -void snow_glare(); void snowstorm(); } //namespace weather_effect diff --git a/src/worldfactory.cpp b/src/worldfactory.cpp index 2191a0fac1646..0f1ae9ea2b587 100644 --- a/src/worldfactory.cpp +++ b/src/worldfactory.cpp @@ -857,12 +857,12 @@ int worldfactory::show_worldgen_tab_modselection( const catacurses::window &win, if( redraw_headers ) { for( size_t i = 0; i < headers.size(); ++i ) { werase( header_windows[i] ); - const int header_x = static_cast( ( getmaxx( header_windows[i] ) - headers[i].size() ) / 2 ); + const int header_x = ( getmaxx( header_windows[i] ) - utf8_width( headers[i] ) ) / 2; mvwprintz( header_windows[i], point( header_x, 0 ), c_cyan, headers[i] ); if( active_header == i ) { mvwputch( header_windows[i], point( header_x - 3, 0 ), c_red, '<' ); - mvwputch( header_windows[i], point( header_x + static_cast( headers[i].size() ) + 2, 0 ), + mvwputch( header_windows[i], point( header_x + utf8_width( headers[i] ) + 2, 0 ), c_red, '>' ); } wrefresh( header_windows[i] ); @@ -921,8 +921,8 @@ int worldfactory::show_worldgen_tab_modselection( const catacurses::window &win, std::string message = string_format( _( "... %s = View full description " ), ctxt.get_desc( "VIEW_MOD_DESCRIPTION" ) ); nc_color color = c_green; - print_colored_text( w_description, point( window_width - message.size(), window_height - 1 ), color, - color, message ); + print_colored_text( w_description, point( window_width - utf8_width( message ), window_height - 1 ), + color, color, message ); } } @@ -1125,9 +1125,9 @@ int worldfactory::show_worldgen_tab_confirm( const catacurses::window &win, WORL fold_and_print( w_confirmation, point( 2, 3 ), 76, c_light_gray, _( "Press %s to pick a random name for your world." ), ctxt.get_desc( "PICK_RANDOM_WORLDNAME" ) ); - fold_and_print( w_confirmation, point( 2, FULL_SCREEN_HEIGHT / 2 - 2 ), 76, c_light_gray, _( "\ -Press %s when you are satisfied with the world as it is and are ready \ -to continue, or %s to go back and review your world." ), + fold_and_print( w_confirmation, point( 2, FULL_SCREEN_HEIGHT / 2 - 2 ), 76, c_light_gray, + _( "Press %s when you are satisfied with the world as it is and are ready " + "to continue, or %s to go back and review your world." ), ctxt.get_desc( "NEXT_TAB" ), ctxt.get_desc( "PREV_TAB" ) ); if( !noname ) { mvwprintz( w_confirmation, point( namebar_x, namebar_y ), c_light_gray, worldname ); diff --git a/tests/Makefile b/tests/Makefile index ca6a58648f6cc..2116a49e3ebd8 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -23,11 +23,15 @@ LDFLAGS += -L. CXXFLAGS += -I../src -Wno-unused-variable -Wno-sign-compare -Wno-unknown-pragmas -Wno-parentheses -MMD -MP CXXFLAGS += -Wall -Wextra -TEST_TARGET = $(BUILD_PREFIX)cata_test +ifeq ($(TARGETSYSTEM), WINDOWS) + TEST_TARGET = $(BUILD_PREFIX)cata_test.exe +else + TEST_TARGET = $(BUILD_PREFIX)cata_test +endif tests: $(TEST_TARGET) -$(BUILD_PREFIX)cata_test: $(OBJS) $(CATA_LIB) +$(TEST_TARGET): $(OBJS) $(CATA_LIB) +$(CXX) $(W32FLAGS) -o $@ $(DEFINES) $(OBJS) $(CATA_LIB) $(CXXFLAGS) $(LDFLAGS) # Iterate over all the individual tests. diff --git a/tests/cata_variant_test.cpp b/tests/cata_variant_test.cpp index ceb0022ddc3c9..01dbd5c3a4328 100644 --- a/tests/cata_variant_test.cpp +++ b/tests/cata_variant_test.cpp @@ -1,6 +1,9 @@ #include "catch/catch.hpp" +#include + #include "cata_variant.h" +#include "json.h" TEST_CASE( "variant_construction", "[variant]" ) { @@ -29,6 +32,12 @@ TEST_CASE( "variant_construction", "[variant]" ) CHECK( v2.get() == mtype_id( "zombie" ) ); CHECK( v2.get() == mtype_id( "zombie" ) ); } + SECTION( "construction_from_const_lvalue" ) { + const character_id i; + cata_variant v( i ); + CHECK( v.type() == cata_variant_type::character_id ); + CHECK( v.get() == i ); + } } TEST_CASE( "variant_copy_move", "[variant]" ) @@ -49,7 +58,32 @@ TEST_CASE( "variant_type_name_round_trip", "[variant]" ) int num_types = static_cast( cata_variant_type::num_types ); for( int i = 0; i < num_types; ++i ) { cata_variant_type type = static_cast( i ); - std::string type_as_string = cata_variant_detail::to_string( type ); - CHECK( cata_variant_detail::from_string( type_as_string ) == type ); + std::string type_as_string = io::enum_to_string( type ); + CHECK( io::string_to_enum( type_as_string ) == type ); } } + +TEST_CASE( "variant_default_constructor", "[variant]" ) +{ + cata_variant v; + CHECK( v.type() == cata_variant_type::void_ ); + CHECK( v.get_string().empty() ); +} + +TEST_CASE( "variant_serialization", "[variant]" ) +{ + cata_variant v = cata_variant( mtype_id( "zombie" ) ); + std::ostringstream os; + JsonOut jsout( os ); + v.serialize( jsout ); + CHECK( os.str() == R"(["mtype_id","zombie"])" ); +} + +TEST_CASE( "variant_deserialization", "[variant]" ) +{ + std::istringstream is( R"(["mtype_id","zombie"])" ); + JsonIn jsin( is ); + cata_variant v; + v.deserialize( jsin ); + CHECK( v == cata_variant( mtype_id( "zombie" ) ) ); +} diff --git a/tests/event_test.cpp b/tests/event_test.cpp index 268df347aab10..44aafedc32da5 100644 --- a/tests/event_test.cpp +++ b/tests/event_test.cpp @@ -8,23 +8,22 @@ using itype_id = std::string; TEST_CASE( "construct_event", "[event]" ) { - time_point time = calendar::turn_zero + 3_hours; - event e = event::make( - time, character_id( 7 ), mtype_id( "zombie" ) ); + cata::event e = cata::event::make( + character_id( 7 ), mtype_id( "zombie" ) ); CHECK( e.type() == event_type::character_kills_monster ); - CHECK( e.time() == time ); - CHECK( e.get( "killer_id" ) == character_id( 7 ) ); + CHECK( e.time() == calendar::turn ); + CHECK( e.get( "killer" ) == character_id( 7 ) ); CHECK( e.get( "victim_type" ) == mtype_id( "zombie" ) ); - CHECK( e.get( "killer_id" ) == character_id( 7 ) ); + CHECK( e.get( "killer" ) == character_id( 7 ) ); CHECK( e.get( "victim_type" ) == mtype_id( "zombie" ) ); } struct test_subscriber : public event_subscriber { - void notify( const event &e ) override { + void notify( const cata::event &e ) override { events.push_back( e ); } - std::vector events; + std::vector events; }; TEST_CASE( "send_event_through_bus", "[event]" ) @@ -33,14 +32,13 @@ TEST_CASE( "send_event_through_bus", "[event]" ) test_subscriber sub; bus.subscribe( &sub ); - time_point time = calendar::turn_zero + 5_days; - bus.send( event::make( - time, character_id( 5 ), mtype_id( "zombie" ) ) ); + bus.send( cata::event::make( + character_id( 5 ), mtype_id( "zombie" ) ) ); REQUIRE( sub.events.size() == 1 ); - const event &e = sub.events[0]; + const cata::event &e = sub.events[0]; CHECK( e.type() == event_type::character_kills_monster ); - CHECK( e.time() == time ); - CHECK( e.get( "killer_id" ) == character_id( 5 ) ); + CHECK( e.time() == calendar::turn ); + CHECK( e.get( "killer" ) == character_id( 5 ) ); CHECK( e.get( "victim_type" ) == mtype_id( "zombie" ) ); } @@ -50,8 +48,7 @@ TEST_CASE( "destroy_bus_before_subscriber", "[event]" ) event_bus bus; bus.subscribe( &sub ); - time_point time = calendar::turn_zero + 5_days; - bus.send( event::make( - time, character_id( 5 ), mtype_id( "zombie" ) ) ); + bus.send( cata::event::make( + character_id( 5 ), mtype_id( "zombie" ) ) ); CHECK( sub.events.size() == 1 ); } diff --git a/tests/json_test.cpp b/tests/json_test.cpp new file mode 100644 index 0000000000000..032c1bf15ad12 --- /dev/null +++ b/tests/json_test.cpp @@ -0,0 +1,71 @@ +#include "json.h" + +#include +#include + +#include "bodypart.h" +#include "catch/catch.hpp" +#include "type_id.h" + +template +void test_serialization( const T &val, const std::string &s ) +{ + CAPTURE( val ); + { + INFO( "test_serialization" ); + std::ostringstream os; + JsonOut jsout( os ); + jsout.write( val ); + CHECK( os.str() == s ); + } + { + INFO( "test_deserialization" ); + std::istringstream is( s ); + JsonIn jsin( is ); + T read_val; + CHECK( jsin.read( read_val ) ); + CHECK( val == read_val ); + } +} + +TEST_CASE( "serialize_colony", "[json]" ) +{ + cata::colony c = { "foo", "bar" }; + test_serialization( c, R"(["foo","bar"])" ); +} + +TEST_CASE( "serialize_map", "[json]" ) +{ + std::map s_map = { { "foo", "foo_val" }, { "bar", "bar_val" } }; + test_serialization( s_map, R"({"bar":"bar_val","foo":"foo_val"})" ); + std::map string_id_map = { { mtype_id( "foo" ), "foo_val" } }; + test_serialization( string_id_map, R"({"foo":"foo_val"})" ); + std::map enum_map = { { bp_foot_l, "foo_val" } }; + test_serialization( enum_map, R"({"FOOT_L":"foo_val"})" ); +} + +TEST_CASE( "serialize_pair", "[json]" ) +{ + std::pair p = { "foo", 42 }; + test_serialization( p, R"(["foo",42])" ); +} + +TEST_CASE( "serialize_sequences", "[json]" ) +{ + std::vector v = { "foo", "bar" }; + test_serialization( v, R"(["foo","bar"])" ); + std::array a = {{ "foo", "bar" }}; + test_serialization( a, R"(["foo","bar"])" ); + std::list l = { "foo", "bar" }; + test_serialization( l, R"(["foo","bar"])" ); +} + +TEST_CASE( "serialize_set", "[json]" ) +{ + std::set s_set = { "foo", "bar" }; + test_serialization( s_set, R"(["bar","foo"])" ); + std::set string_id_set = { mtype_id( "foo" ) }; + test_serialization( string_id_set, R"(["foo"])" ); + std::set enum_set = { bp_foot_l }; + test_serialization( enum_set, string_format( R"([%d])", static_cast( bp_foot_l ) ) ); +} diff --git a/tests/memorial_test.cpp b/tests/memorial_test.cpp new file mode 100644 index 0000000000000..175661a36c63e --- /dev/null +++ b/tests/memorial_test.cpp @@ -0,0 +1,231 @@ +#include "catch/catch.hpp" + +#include "avatar.h" +#include "enum_conversions.h" +#include "game.h" +#include "memorial_logger.h" +#include "mutation.h" +#include "output.h" +#include "player_helpers.h" + +template +void check_memorial( memorial_logger &m, event_bus &b, const std::string &ref, Args... args ) +{ + CAPTURE( io::enum_to_string( Type ) ); + CAPTURE( ref ); + m.clear(); + b.send( cata::event::make( args... ) ); + + std::string result = m.dump(); + CAPTURE( result ); + std::vector result_lines = string_split( result, '\n' ); + REQUIRE( !result_lines.empty() ); + CHECK( result_lines.back().empty() ); + result_lines.pop_back(); + + std::vector ref_lines = string_split( ref, '\n' ); + REQUIRE( result_lines.size() == ref_lines.size() ); + for( size_t i = 0; i < ref_lines.size(); ++i ) { + std::string message = string_split( result_lines[i], '|' ).back(); + if( !message.empty() && message.front() == ' ' ) { + message.erase( message.begin() ); + } + // Remove trailing carriage return, if any + while( !message.empty() && *message.rbegin() == '\r' ) { + message.erase( message.end() - 1 ); + } + CHECK( message == ref_lines[i] ); + } +} + +TEST_CASE( "memorials" ) +{ + memorial_logger &m = g->memorial(); + m.clear(); + clear_player(); + + event_bus &b = g->events(); + + character_id ch = g->u.getID(); + std::string u_name = g->u.name; + character_id ch2 = character_id( ch.get_value() + 1 ); + mutagen_technique mutagen = mutagen_technique::injected_purifier; + mtype_id mon( "mon_zombie_kevlar_2" ); + efftype_id eff( "onfire" ); + itype_id it( "marloss_seed" ); + trait_id mut( "CARNIVORE" ); + trait_id mut2( "SAPROPHAGE" ); + bionic_id cbm( "bio_alarm" ); + + check_memorial( + m, b, "Activated the art_name.", ch, "art_name" ); + + check_memorial( + m, b, "Activated a mininuke.", ch ); + + check_memorial( + m, b, "Injected purifier.", ch, mutagen ); + + check_memorial( + m, b, "Angered a group of amigara horrors!" ); + + check_memorial( + m, b, "Awoke a group of dark wyrms!" ); + + check_memorial( + m, b, "Became wanted by the police!", ch ); + + check_memorial( + m, b, "Broken right arm began to mend.", ch, bp_arm_r ); + + check_memorial( + m, b, "You buried monster_name.", ch, mon, "monster_name" ); + + check_memorial( + m, b, "Caused a resonance cascade." ); + + check_memorial( + m, b, "Caught on fire.", ch, eff ); + + check_memorial( + m, b, "Killed an innocent person, victim_name, in cold blood and felt terrible " + "afterwards.", ch, ch2, "victim_name" ); + + check_memorial( + m, b, "Killed a kevlar hulk.", ch, mon ); + + check_memorial( + m, b, "Put out the fire.", ch, eff ); + + check_memorial( + m, b, "Fell in a pit.", ch, trap_str_id( "tr_pit" ) ); + + check_memorial( + m, b, "Consumed a marloss seed.", ch, it ); + + check_memorial( + m, b, "Opened the Marloss Gateway.", ch ); + + check_memorial( + m, b, "Became one with the bears.", ch, "URSINE" ); + + check_memorial( + m, b, "Became one with the Mycus.", ch ); + + check_memorial( + m, b, "Dermatik eggs hatched.", ch ); + + check_memorial( + m, b, "Injected with dermatik eggs.", ch ); + + check_memorial( + m, b, "Destroyed a triffid grove." ); + + check_memorial( + m, b, "Succumbed to an asthma attack.", ch ); + + check_memorial( + m, b, "Died of a drug overdose.", ch, eff ); + + check_memorial( + m, b, "Succumbed to the infection.", ch ); + + check_memorial( + m, b, "Died of starvation.", ch ); + + check_memorial( + m, b, "Died of thirst.", ch ); + + check_memorial( + m, b, "Dug a shaft into lava." ); + + check_memorial( + m, b, "Disarmed a nuclear missile." ); + + check_memorial( + m, b, "Ate a sewage sample." ); + + check_memorial( + m, b, "'Carnivore' mutation turned into 'Saprophage'", ch, mut, mut2 ); + + check_memorial( + m, b, "Exhumed a grave.", ch ); + + check_memorial( + m, b, "Failed install of bionic: Alarm System.", ch, cbm ); + + check_memorial( + m, b, "Failed to remove bionic: Alarm System.", ch, cbm ); + + check_memorial( + m, b, "Succumbed to lack of sleep.", ch ); + + check_memorial( + m, b, "The fuel tank of the vehicle_name exploded!", "vehicle_name" ); + + check_memorial( + m, b, "Became addicted to alcohol.", ch, ADD_ALCOHOL ); + + check_memorial( + m, b, "Gained the mutation 'Carnivore'.", ch, mut ); + + check_memorial( + m, b, "Reached skill level 8 in driving.", ch, skill_id( "driving" ), 8 ); + + check_memorial( + m, b, u_name + " was killed.\nLast words: last_words", false, "last_words" ); + + check_memorial( + m, b, u_name + " began their journey into the Cataclysm." ); + + check_memorial( + m, b, "Installed bionic: Alarm System.", ch, cbm ); + + check_memorial( + m, b, "Installed bad bionic: Alarm System.", ch, cbm ); + + check_memorial( + m, b, "Launched a nuke at a garage.", oter_id( "s_garage_north" ) ); + + check_memorial( + m, b, "Learned Aikido.", ch, matype_id( "style_aikido" ) ); + + check_memorial( + m, b, "Overcame addiction to alcohol.", ch, ADD_ALCOHOL ); + + check_memorial( + m, b, "npc_name became hostile.", ch2, "npc_name" ); + + check_memorial( + m, b, "Opened a portal." ); + + check_memorial( + m, b, "Opened a strange temple." ); + + check_memorial( + m, b, "Released subspace specimens." ); + + check_memorial( + m, b, "Removed bionic: Alarm System.", ch, cbm ); + + check_memorial( + m, b, "Sealed a Hazardous Material Sarcophagus." ); + + check_memorial( + m, b, "Telefragged a telefragged_name.", ch, "telefragged_name" ); + + check_memorial( + m, b, "Spontaneous teleport.", ch ); + + check_memorial( + m, b, "Teleported into a obstacle_name.", ch, "obstacle_name" ); + + check_memorial( + m, b, "Terminated subspace specimens." ); + + check_memorial( + m, b, "Threw up.", ch ); + + check_memorial( + m, b, "Set off an alarm.", ch ); +} diff --git a/tests/npc_talk_test.cpp b/tests/npc_talk_test.cpp index 0b42345932c67..4def6992b486a 100644 --- a/tests/npc_talk_test.cpp +++ b/tests/npc_talk_test.cpp @@ -73,6 +73,12 @@ static void gen_response_lines( dialogue &d, size_t expected_count ) REQUIRE( d.responses.size() == expected_count ); } +static std::string gen_dynamic_line( dialogue &d ) +{ + std::string challenge = d.dynamic_line( d.topic_stack.back() ); + return challenge; +} + static void change_om_type( const std::string &new_type ) { const tripoint omt_pos = ms_to_omt_copy( g->m.getabs( g->u.pos() ) ); @@ -107,6 +113,16 @@ TEST_CASE( "npc_talk_start", "[npc_talk]" ) CHECK( d.responses[0].text == "This is a basic test response." ); } +TEST_CASE( "npc_talk_describe_mission", "[npc_talk]" ) +{ + dialogue d; + prep_test( d ); + + d.add_topic( "TALK_DESCRIBE_MISSION" ); + std::string d_line = gen_dynamic_line( d ); + CHECK( d_line == "I'm looking for wounded to help." ); +} + TEST_CASE( "npc_talk_stats", "[npc_talk]" ) { dialogue d; @@ -752,6 +768,70 @@ TEST_CASE( "npc_talk_vars", "[npc_talk]" ) CHECK( d.responses[2].text == "This is a npc_add_var test response." ); } +TEST_CASE( "npc_talk_adjust_vars", "[npc_talk]" ) +{ + dialogue d; + prep_test( d ); + + d.add_topic( "TALK_TEST_ADJUST_VARS" ); + + // At the starting point, the var hasn't been set or adjusted, so it should default to 0. + gen_response_lines( d, 11 ); + CHECK( d.responses[0].text == "This is a basic test response." ); + CHECK( d.responses[1].text == "This is a u_adjust_var test response that increments by 1." ); + CHECK( d.responses[2].text == "This is a u_adjust_var test response that decrements by 1." ); + CHECK( d.responses[3].text == "This is a npc_adjust_var test response that increments by 1." ); + CHECK( d.responses[4].text == "This is a npc_adjust_var test response that decrements by 1." ); + CHECK( d.responses[5].text == "This is a u_compare_var test response for == 0." ); + CHECK( d.responses[6].text == "This is a u_compare_var test response for <= 0." ); + CHECK( d.responses[7].text == "This is a u_compare_var test response for >= 0." ); + CHECK( d.responses[8].text == "This is a npc_compare_var test response for == 0." ); + CHECK( d.responses[9].text == "This is a npc_compare_var test response for <= 0." ); + CHECK( d.responses[10].text == "This is a npc_compare_var test response for >= 0." ); + + // Increment the u and npc vars by 1, so that it has a value of 1. + talk_effect_t &effects = d.responses[1].success; + effects.apply( d ); + effects = d.responses[3].success; + effects.apply( d ); + + // Now we're comparing the var, which should be 1, to our condition value which is 0. + gen_response_lines( d, 11 ); + CHECK( d.responses[0].text == "This is a basic test response." ); + CHECK( d.responses[1].text == "This is a u_adjust_var test response that increments by 1." ); + CHECK( d.responses[2].text == "This is a u_adjust_var test response that decrements by 1." ); + CHECK( d.responses[3].text == "This is a npc_adjust_var test response that increments by 1." ); + CHECK( d.responses[4].text == "This is a npc_adjust_var test response that decrements by 1." ); + CHECK( d.responses[5].text == "This is a u_compare_var test response for != 0." ); + CHECK( d.responses[6].text == "This is a u_compare_var test response for >= 0." ); + CHECK( d.responses[7].text == "This is a u_compare_var test response for > 0." ); + CHECK( d.responses[8].text == "This is a npc_compare_var test response for != 0." ); + CHECK( d.responses[9].text == "This is a npc_compare_var test response for >= 0." ); + CHECK( d.responses[10].text == "This is a npc_compare_var test response for > 0." ); + + // Decrement the u and npc vars by 1 twice, so that it has a value of -1. + effects = d.responses[2].success; + effects.apply( d ); + effects.apply( d ); + effects = d.responses[4].success; + effects.apply( d ); + effects.apply( d ); + + // Now we're comparing the var, which should be -1, to our condition value which is 0. + gen_response_lines( d, 11 ); + CHECK( d.responses[0].text == "This is a basic test response." ); + CHECK( d.responses[1].text == "This is a u_adjust_var test response that increments by 1." ); + CHECK( d.responses[2].text == "This is a u_adjust_var test response that decrements by 1." ); + CHECK( d.responses[3].text == "This is a npc_adjust_var test response that increments by 1." ); + CHECK( d.responses[4].text == "This is a npc_adjust_var test response that decrements by 1." ); + CHECK( d.responses[5].text == "This is a u_compare_var test response for != 0." ); + CHECK( d.responses[6].text == "This is a u_compare_var test response for <= 0." ); + CHECK( d.responses[7].text == "This is a u_compare_var test response for < 0." ); + CHECK( d.responses[8].text == "This is a npc_compare_var test response for != 0." ); + CHECK( d.responses[9].text == "This is a npc_compare_var test response for <= 0." ); + CHECK( d.responses[10].text == "This is a npc_compare_var test response for < 0." ); +} + TEST_CASE( "npc_talk_bionics", "[npc_talk]" ) { dialogue d; diff --git a/tests/rot_test.cpp b/tests/rot_test.cpp new file mode 100644 index 0000000000000..8e1f874af3bff --- /dev/null +++ b/tests/rot_test.cpp @@ -0,0 +1,53 @@ +#include +#include +#include + +#include "catch/catch.hpp" +#include "calendar.h" +#include "item.h" +#include "cata_utility.h" +#include "game.h" +#include "flat_set.h" +#include "point.h" + + +static bool is_nearly( float value, float expected ) +{ + // Rounding errors make the values change around a bit + // Lets just check that they are within 1% of expected + + bool ret_val = std::abs( value - expected ) / expected < 0.01; + return ret_val; +} + +static void set_map_temperature( int new_temperature ) +{ + g->weather.temperature = new_temperature; + g->weather.clear_temp_cache(); +} + + +TEST_CASE( "Rate of rotting" ) +{ + SECTION( "65 F" ) { + // Item rot is a time duration. + // At 65 F (18,3 C) item rots at rate of 1h/1h + // So the level of rot should be about same as the item age + + item test_item( "meat_cooked" ); + + set_map_temperature( 65 ); // 18,3 C + + test_item.process_temperature_rot( 1, tripoint_zero, nullptr ); + + // Item should exist with no rot when it is brand new + CHECK( to_turns( test_item.get_rot() ) == 0 ); + + + calendar::turn = to_turn( calendar::turn + 20_minutes ); + test_item.process_temperature_rot( 1, tripoint_zero, nullptr ); + + // After 20 minutes the item should have 20 minutes of rot + CHECK( is_nearly( to_turns( test_item.get_rot() ), to_turns( 20_minutes ) ) ); + } +} diff --git a/tests/stats_tracker_test.cpp b/tests/stats_tracker_test.cpp new file mode 100644 index 0000000000000..a1663f3da185e --- /dev/null +++ b/tests/stats_tracker_test.cpp @@ -0,0 +1,67 @@ +#include "catch/catch.hpp" + +#include "avatar.h" +#include "game.h" +#include "stats_tracker.h" + +TEST_CASE( "stats_tracker_count_events", "[stats]" ) +{ + stats_tracker s; + event_bus b; + b.subscribe( &s ); + + const character_id u_id = g->u.getID(); + const mtype_id mon1( "mon_zombie" ); + const mtype_id mon2( "mon_zombie_brute" ); + const cata::event kill1 = cata::event::make( u_id, mon1 ); + const cata::event kill2 = cata::event::make( u_id, mon2 ); + const cata::event::data_type char_is_player{ { "killer", cata_variant( u_id ) } }; + + CHECK( s.count( kill1 ) == 0 ); + CHECK( s.count( kill2 ) == 0 ); + CHECK( s.count( event_type::character_kills_monster, char_is_player ) == 0 ); + b.send( kill1 ); + CHECK( s.count( kill1 ) == 1 ); + CHECK( s.count( kill2 ) == 0 ); + CHECK( s.count( event_type::character_kills_monster, char_is_player ) == 1 ); + b.send( kill2 ); + CHECK( s.count( kill1 ) == 1 ); + CHECK( s.count( kill2 ) == 1 ); + CHECK( s.count( event_type::character_kills_monster, char_is_player ) == 2 ); +} + +TEST_CASE( "stats_tracker_total_events", "[stats]" ) +{ + stats_tracker s; + event_bus b; + b.subscribe( &s ); + + const character_id u_id = g->u.getID(); + character_id other_id = u_id; + ++other_id; + const cata::event::data_type damage_to_any{}; + const cata::event::data_type damage_to_u{ { "character", cata_variant( u_id ) } }; + + CHECK( s.total( event_type::character_takes_damage, "damage", damage_to_u ) == 0 ); + CHECK( s.total( event_type::character_takes_damage, "damage", damage_to_any ) == 0 ); + b.send( u_id, 10 ); + CHECK( s.total( event_type::character_takes_damage, "damage", damage_to_u ) == 10 ); + CHECK( s.total( event_type::character_takes_damage, "damage", damage_to_any ) == 10 ); + b.send( other_id, 10 ); + CHECK( s.total( event_type::character_takes_damage, "damage", damage_to_u ) == 10 ); + CHECK( s.total( event_type::character_takes_damage, "damage", damage_to_any ) == 20 ); + b.send( u_id, 10 ); + CHECK( s.total( event_type::character_takes_damage, "damage", damage_to_u ) == 20 ); + CHECK( s.total( event_type::character_takes_damage, "damage", damage_to_any ) == 30 ); + b.send( u_id, 5 ); + CHECK( s.total( event_type::character_takes_damage, "damage", damage_to_u ) == 25 ); + CHECK( s.total( event_type::character_takes_damage, "damage", damage_to_any ) == 35 ); +} + +TEST_CASE( "stats_tracker_in_game", "[stats]" ) +{ + g->stats().clear(); + cata::event e = cata::event::make(); + g->events().send( e ); + CHECK( g->stats().count( e ) == 1 ); +} diff --git a/tests/vehicle_efficiency.cpp b/tests/vehicle_efficiency.cpp index f42a8bed9fb00..63d67a41f3e6f 100644 --- a/tests/vehicle_efficiency.cpp +++ b/tests/vehicle_efficiency.cpp @@ -430,22 +430,22 @@ TEST_CASE( "vehicle_make_efficiency_case", "[.]" ) // Fix test for electric vehicles TEST_CASE( "vehicle_efficiency", "[vehicle] [engine]" ) { - test_vehicle( "beetle", 767373, 294400, 235600, 77390, 58340 ); - test_vehicle( "car", 1072322, 530700, 312700, 47890, 28180 ); - test_vehicle( "car_sports", 1105918, 444100, 317900, 39180, 23440 ); - test_vehicle( "electric_car", 1070791, 212500, 121700, 17430, 9118 ); - test_vehicle( "suv", 1271990, 998800, 492900, 71890, 34300 ); - test_vehicle( "motorcycle", 162785, 76870, 62950, 47530, 38890 ); - test_vehicle( "quad_bike", 264745, 75950, 75950, 35080, 35080 ); - test_vehicle( "scooter", 62287, 266900, 258300, 195200, 189700 ); - test_vehicle( "superbike", 241785, 72120, 46710, 34580, 21720 ); - test_vehicle( "ambulance", 1783929, 433100, 351300, 65530, 48600 ); - test_vehicle( "fire_engine", 2563241, 1171000, 970800, 248500, 219000 ); - test_vehicle( "fire_truck", 6259233, 308500, 200800, 19950, 4747 ); - test_vehicle( "truck_swat", 5939334, 505800, 349500, 30060, 7719 ); - test_vehicle( "tractor_plow", 703658, 528000, 528000, 121900, 121900 ); - test_vehicle( "apc", 5753619, 1100000, 942800, 132800, 91850 ); - test_vehicle( "humvee", 5475145, 607600, 342700, 25880, 9263 ); + test_vehicle( "beetle", 787373, 292300, 228600, 75730, 56370 ); + test_vehicle( "car", 1092322, 520800, 302500, 47060, 26470 ); + test_vehicle( "car_sports", 1125918, 456200, 312000, 38140, 22390 ); + test_vehicle( "electric_car", 1090791, 210200, 118200, 16880, 8720 ); + test_vehicle( "suv", 1291990, 987100, 483000, 69560, 33260 ); + 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", 1803929, 432000, 345500, 64010, 47220 ); + test_vehicle( "fire_engine", 2593241, 1169000, 960700, 244700, 215300 ); + test_vehicle( "fire_truck", 6279233, 308500, 199100, 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", 8779702, 369800, 412000, 22990, 6996 ); - test_vehicle( "golf_cart", 446230, 52800, 104200, 26830, 13890 ); + test_vehicle( "golf_cart", 446830, 52800, 104200, 26830, 13880 ); } diff --git a/tests/vehicle_power_test.cpp b/tests/vehicle_power_test.cpp index 1d18c1980a410..a78330e064f82 100644 --- a/tests/vehicle_power_test.cpp +++ b/tests/vehicle_power_test.cpp @@ -79,5 +79,12 @@ TEST_CASE( "vehicle_power" ) int approx_battery2 = veh_ptr->fuel_left( fuel_type_battery ) / 100; CHECK( approx_battery2 >= approx_battery1 + exp_min ); CHECK( approx_battery2 <= approx_battery1 + exp_max ); + const time_point at_night = sunset( calendar::turn ) + 3_hours; + g->weather.weather_override = WEATHER_CLEAR; + veh_ptr->update_time( at_night ); + veh_ptr->discharge_battery( veh_ptr->fuel_left( fuel_type_battery ) ); + REQUIRE( veh_ptr->fuel_left( fuel_type_battery ) == 0 ); + veh_ptr->update_time( at_night + 30_minutes ); + CHECK( veh_ptr->fuel_left( fuel_type_battery ) == 0 ); } } diff --git a/tests/vehicle_split_test.cpp b/tests/vehicle_split_test.cpp index 2e2bf182f462d..1f3a022d82b5c 100644 --- a/tests/vehicle_split_test.cpp +++ b/tests/vehicle_split_test.cpp @@ -37,8 +37,8 @@ TEST_CASE( "vehicle_split_section" ) CHECK( vehs.size() == 4 ); if( vehs.size() == 4 ) { // correct number of parts - CHECK( vehs[ 0 ].v->parts.size() == 10 ); - CHECK( vehs[ 1 ].v->parts.size() == 10 ); + CHECK( vehs[ 0 ].v->parts.size() == 12 ); + CHECK( vehs[ 1 ].v->parts.size() == 12 ); CHECK( vehs[ 2 ].v->parts.size() == 2 ); CHECK( vehs[ 3 ].v->parts.size() == 3 ); std::vector> all_points; diff --git a/tools/clang-tidy-plugin/SimplifyPointConstructorsCheck.cpp b/tools/clang-tidy-plugin/SimplifyPointConstructorsCheck.cpp index 6bf74f896af1d..20524cb39f18e 100644 --- a/tools/clang-tidy-plugin/SimplifyPointConstructorsCheck.cpp +++ b/tools/clang-tidy-plugin/SimplifyPointConstructorsCheck.cpp @@ -14,30 +14,19 @@ namespace tidy namespace cata { -static auto isMemberExpr( const std::string &type, const std::string &member_, +static auto isMemberExpr( const std::string &/*type*/, const std::string &member_, const std::string &objBind ) { return ignoringParenCasts( memberExpr( member( hasName( member_ ) ), - hasObjectExpression( - expr( hasType( cxxRecordDecl( hasName( type ) ) ) ).bind( objBind ) - ) + hasObjectExpression( expr().bind( objBind ) ) ) ); } void SimplifyPointConstructorsCheck::registerMatchers( MatchFinder *Finder ) { - Finder->addMatcher( - cxxConstructExpr( - hasDeclaration( isPointConstructor().bind( "constructorDecl" ) ), - testWhetherConstructingTemporary(), - hasArgument( 0, isMemberExpr( "point", "x", "xobj" ) ), - hasArgument( 1, isMemberExpr( "point", "y", "yobj" ) ) - ).bind( "constructorCallFromPoint" ), - this - ); Finder->addMatcher( cxxConstructExpr( hasDeclaration( isPointConstructor().bind( "constructorDecl" ) ), @@ -48,60 +37,55 @@ void SimplifyPointConstructorsCheck::registerMatchers( MatchFinder *Finder ) hasArgument( 2, isMemberExpr( "tripoint", "z", "zobj" ) ), anything() ) - ).bind( "constructorCallFromTripoint" ), + ).bind( "constructorCall" ), this ); } -static void CheckFromPoint( SimplifyPointConstructorsCheck &Check, - const MatchFinder::MatchResult &Result ) -{ - const CXXConstructExpr *ConstructorCall = - Result.Nodes.getNodeAs( "constructorCallFromPoint" ); - const CXXConstructorDecl *ConstructorDecl = - Result.Nodes.getNodeAs( "constructorDecl" ); - const MaterializeTemporaryExpr *TempParent = - Result.Nodes.getNodeAs( "temp" ); - const Expr *XExpr = Result.Nodes.getNodeAs( "xobj" ); - const Expr *YExpr = Result.Nodes.getNodeAs( "yobj" ); - if( !ConstructorCall || !ConstructorDecl || !XExpr || !YExpr ) { - return; +struct ExpressionCategory { + ExpressionCategory() = default; + + ExpressionCategory( const MatchFinder::MatchResult &Result, const Expr *E ) : + Replacement( getText( Result, E ) ) { + QualType EType = E->getType(); + if( EType->isPointerType() ) { + IsArrowRef = true; + if( const CXXRecordDecl *Record = EType->getPointeeCXXRecordDecl() ) { + IsPoint = isPointType( Record ); + IsTripoint = Record->getName() == "tripoint"; + } + } else if( const CXXRecordDecl *Record = EType->getAsCXXRecordDecl() ) { + IsPoint = isPointType( Record ); + IsTripoint = Record->getName() == "tripoint"; + } } - std::string ReplacementX = getText( Result, XExpr ); - std::string ReplacementY = getText( Result, YExpr ); + bool IsPoint = false; + bool IsTripoint = false; + bool IsArrowRef = false; + std::string Replacement; - if( ReplacementX != ReplacementY ) { - return; + std::tuple asTuple() const { + return std::make_tuple( IsPoint, IsTripoint, IsArrowRef, Replacement ); } - SourceRange SourceRangeToReplace( ConstructorCall->getArg( 0 )->getBeginLoc(), - ConstructorCall->getArg( 1 )->getEndLoc() ); - - if( TempParent ) { - if( ConstructorDecl->getNumParams() == 2 ) { - SourceRangeToReplace = ConstructorCall->getSourceRange(); - } + friend bool operator==( const ExpressionCategory &l, const ExpressionCategory &r ) { + return l.asTuple() == r.asTuple(); } + friend bool operator!=( const ExpressionCategory &l, const ExpressionCategory &r ) { + return l.asTuple() != r.asTuple(); + } +}; - CharSourceRange CharRangeToReplace = Lexer::makeFileCharRange( - CharSourceRange::getTokenRange( SourceRangeToReplace ), *Result.SourceManager, - Check.getLangOpts() ); - - Check.diag( - ConstructorCall->getBeginLoc(), - "Construction of %0 can be simplified." ) << ConstructorDecl->getParent() << - FixItHint::CreateReplacement( CharRangeToReplace, ReplacementX ); -} - -static void CheckFromTripoint( SimplifyPointConstructorsCheck &Check, - const MatchFinder::MatchResult &Result ) +static void CheckConstructor( SimplifyPointConstructorsCheck &Check, + const MatchFinder::MatchResult &Result ) { const CXXConstructExpr *ConstructorCall = - Result.Nodes.getNodeAs( "constructorCallFromTripoint" ); + Result.Nodes.getNodeAs( "constructorCall" ); const CXXConstructorDecl *ConstructorDecl = Result.Nodes.getNodeAs( "constructorDecl" ); - const Expr *TempParent = Result.Nodes.getNodeAs( "temp" ); + const MaterializeTemporaryExpr *TempParent = + Result.Nodes.getNodeAs( "temp" ); const Expr *XExpr = Result.Nodes.getNodeAs( "xobj" ); const Expr *YExpr = Result.Nodes.getNodeAs( "yobj" ); const Expr *ZExpr = Result.Nodes.getNodeAs( "zobj" ); @@ -109,27 +93,43 @@ static void CheckFromTripoint( SimplifyPointConstructorsCheck &Check, return; } - std::string ReplacementX = getText( Result, XExpr ); - std::string ReplacementY = getText( Result, YExpr ); + ExpressionCategory XCat( Result, XExpr ); + ExpressionCategory YCat( Result, YExpr ); + + if( !XCat.IsPoint || !YCat.IsPoint ) { + return; + } - if( ReplacementX != ReplacementY ) { + if( XCat != YCat ) { return; } - std::string ReplacementZ; + ExpressionCategory ZCat; unsigned int MaxArg = 1; if( ZExpr ) { - ReplacementZ = getText( Result, ZExpr ); - if( ReplacementZ == ReplacementX ) { + ZCat = ExpressionCategory( Result, ZExpr ); + if( ZCat == XCat ) { MaxArg = 2; } else { - ReplacementZ.clear(); + ZCat = ExpressionCategory(); } } - if( MaxArg == 1 ) { - ReplacementX += ".xy()"; + std::string Replacement; + + if( MaxArg == 1 && XCat.IsTripoint ) { + if( XCat.IsArrowRef ) { + Replacement = XCat.Replacement + "->xy()"; + } else { + Replacement = XCat.Replacement + ".xy()"; + } + } else { + if( XCat.IsArrowRef ) { + Replacement = "*" + XCat.Replacement; + } else { + Replacement = XCat.Replacement; + } } SourceRange SourceRangeToReplace( ConstructorCall->getArg( 0 )->getBeginLoc(), @@ -148,13 +148,12 @@ static void CheckFromTripoint( SimplifyPointConstructorsCheck &Check, Check.diag( ConstructorCall->getBeginLoc(), "Construction of %0 can be simplified." ) << ConstructorDecl->getParent() << - FixItHint::CreateReplacement( CharRangeToReplace, ReplacementX ); + FixItHint::CreateReplacement( CharRangeToReplace, Replacement ); } void SimplifyPointConstructorsCheck::check( const MatchFinder::MatchResult &Result ) { - CheckFromPoint( *this, Result ); - CheckFromTripoint( *this, Result ); + CheckConstructor( *this, Result ); } } // namespace cata diff --git a/tools/clang-tidy-plugin/UsePointApisCheck.cpp b/tools/clang-tidy-plugin/UsePointApisCheck.cpp index 1708a1773c545..ee074d79255ac 100644 --- a/tools/clang-tidy-plugin/UsePointApisCheck.cpp +++ b/tools/clang-tidy-plugin/UsePointApisCheck.cpp @@ -29,6 +29,19 @@ void UsePointApisCheck::registerMatchers( MatchFinder *Finder ) ).bind( "call" ), this ); + Finder->addMatcher( + cxxConstructExpr( + forEachArgumentWithParam( + expr().bind( "xarg" ), + parmVarDecl( + anyOf( hasType( asString( "int" ) ), hasType( asString( "const int" ) ) ), + isXParam() + ).bind( "xparam" ) + ), + hasDeclaration( cxxMethodDecl( unless( ofClass( isPointType() ) ) ).bind( "callee" ) ) + ).bind( "constructorCall" ), + this + ); } static bool doFunctionsMatch( const FunctionDecl *Callee, const FunctionDecl *OtherCallee, @@ -49,15 +62,21 @@ static bool doFunctionsMatch( const FunctionDecl *Callee, const FunctionDecl *Ot const ParmVarDecl *OtherCalleeParam = OtherCallee->getParamDecl( OtherCalleeParamI ); - std::string ExpectedTypeName = CalleeParam->getType().getAsString(); if( CalleeParamI == MinArg - SkipArgs ) { std::string ShortTypeName = IsTripoint ? "tripoint" : "point"; - ExpectedTypeName = "const struct " + ShortTypeName + " &"; + std::string ExpectedTypeName = "const struct " + ShortTypeName + " &"; + if( OtherCalleeParam->getType().getAsString() != ExpectedTypeName ) { + return false; + } CalleeParamI += NumCoordParams - 1; - } - - if( OtherCalleeParam->getType().getAsString() != ExpectedTypeName ) { - return false; + } else { + // Compare the types as strings because if e.g. the two overloads + // are function templates then the tmplate parameters will be + // different types. + if( CalleeParam->getType().getLocalUnqualifiedType().getAsString() != + OtherCalleeParam->getType().getLocalUnqualifiedType().getAsString() ) { + return false; + } } } @@ -69,8 +88,10 @@ static void CheckCall( UsePointApisCheck &Check, const MatchFinder::MatchResult const ParmVarDecl *XParam = Result.Nodes.getNodeAs( "xparam" ); const Expr *XArg = Result.Nodes.getNodeAs( "xarg" ); const CallExpr *Call = Result.Nodes.getNodeAs( "call" ); + const CXXConstructExpr *ConstructorCall = + Result.Nodes.getNodeAs( "constructorCall" ); const FunctionDecl *Callee = Result.Nodes.getNodeAs( "callee" ); - if( !XParam || !XArg || !Call || !Callee ) { + if( !XParam || !XArg || !( Call || ConstructorCall ) || !Callee ) { return; } @@ -79,6 +100,12 @@ static void CheckCall( UsePointApisCheck &Check, const MatchFinder::MatchResult unsigned int MinArg = UINT_MAX; unsigned int MaxArg = 0; + unsigned int NumCallArgs = Call ? Call->getNumArgs() : ConstructorCall->getNumArgs(); + SourceLocation CallBeginLoc = Call ? Call->getBeginLoc() : ConstructorCall->getBeginLoc(); + auto GetCallArg = [&]( unsigned int Arg ) { + return Call ? Call->getArg( Arg ) : ConstructorCall->getArg( Arg ); + }; + // For operator() calls there is an extra 'this' argument that doesn't // correspond to any parameter, so we need to skip over it. unsigned int SkipArgs = 0; @@ -86,9 +113,9 @@ static void CheckCall( UsePointApisCheck &Check, const MatchFinder::MatchResult SkipArgs = 1; } - if( Call->getNumArgs() - SkipArgs > Callee->getNumParams() ) { + if( NumCallArgs - SkipArgs > Callee->getNumParams() ) { Check.diag( - Call->getBeginLoc(), + CallBeginLoc, "Internal check error: call has more arguments (%0) than function has parameters (%1)" ) << Call->getNumArgs() << Callee->getNumParams(); Check.diag( Callee->getLocation(), "called function %0", DiagnosticIDs::Note ) << Callee; @@ -101,17 +128,17 @@ static void CheckCall( UsePointApisCheck &Check, const MatchFinder::MatchResult return; } - for( unsigned int i = SkipArgs; i < Call->getNumArgs(); ++i ) { + for( unsigned int i = SkipArgs; i < NumCallArgs; ++i ) { const ParmVarDecl *Param = Callee->getParamDecl( i - SkipArgs ); bool Matched = true; switch( NameMatcher.Match( Param->getName() ) ) { case NameConvention::XName: break; case NameConvention::YName: - YArg = Call->getArg( i ); + YArg = GetCallArg( i ); break; case NameConvention::ZName: - ZArg = Call->getArg( i ); + ZArg = GetCallArg( i ); break; default: Matched = false; @@ -135,7 +162,8 @@ static void CheckCall( UsePointApisCheck &Check, const MatchFinder::MatchResult return; } - const FunctionDecl *ContainingFunction = getContainingFunction( Result, Call ); + const FunctionDecl *ContainingFunction = getContainingFunction( + Result, Call ? static_cast( Call ) : ConstructorCall ); // Look for another overload of the called function with a point parameter // in the right spot. @@ -184,7 +212,7 @@ static void CheckCall( UsePointApisCheck &Check, const MatchFinder::MatchResult Replacement += " )"; // Construct range to be replaced - while( isa( Call->getArg( MaxArg ) ) ) { + while( isa( GetCallArg( MaxArg ) ) ) { --MaxArg; if( MaxArg == UINT_MAX ) { // We underflowed; that means every argument was defaulted. In @@ -192,8 +220,8 @@ static void CheckCall( UsePointApisCheck &Check, const MatchFinder::MatchResult return; } } - SourceRange SourceRangeToReplace( Call->getArg( MinArg )->getBeginLoc(), - Call->getArg( MaxArg )->getEndLoc() ); + SourceRange SourceRangeToReplace( GetCallArg( MinArg )->getBeginLoc(), + GetCallArg( MaxArg )->getEndLoc() ); CharSourceRange CharRangeToReplace = Lexer::makeFileCharRange( CharSourceRange::getTokenRange( SourceRangeToReplace ), *Result.SourceManager, Check.getLangOpts() ); @@ -202,8 +230,8 @@ static void CheckCall( UsePointApisCheck &Check, const MatchFinder::MatchResult ZArg ? "Call to %0 could instead call overload using a tripoint parameter." : "Call to %0 could instead call overload using a point parameter."; - Check.diag( Call->getBeginLoc(), message ) << Callee << - FixItHint::CreateReplacement( CharRangeToReplace, Replacement ); + Check.diag( CallBeginLoc, message ) + << Callee << FixItHint::CreateReplacement( CharRangeToReplace, Replacement ); Check.diag( Callee->getLocation(), "current overload", DiagnosticIDs::Note ); Check.diag( NewCallee->getLocation(), "alternate overload", DiagnosticIDs::Note ); } diff --git a/tools/clang-tidy-plugin/UsePointArithmeticCheck.cpp b/tools/clang-tidy-plugin/UsePointArithmeticCheck.cpp index 821f5d79438a9..94dc68743b894 100644 --- a/tools/clang-tidy-plugin/UsePointArithmeticCheck.cpp +++ b/tools/clang-tidy-plugin/UsePointArithmeticCheck.cpp @@ -111,15 +111,6 @@ static bool operator>( const ExpressionComponent &l, const ExpressionComponent & return r < l; } -static bool isPointType( const CXXRecordDecl *R ) -{ - if( !R ) { - return false; - } - StringRef name = R->getName(); - return name == "point" || name == "tripoint"; -} - static std::vector handleMultiply( const Expr *LhsE, const Expr *RhsE, std::vector LhsC, std::vector RhsC ) diff --git a/tools/clang-tidy-plugin/Utils.h b/tools/clang-tidy-plugin/Utils.h index ba0321009e5f1..5ca0c4f7ce526 100644 --- a/tools/clang-tidy-plugin/Utils.h +++ b/tools/clang-tidy-plugin/Utils.h @@ -89,6 +89,15 @@ inline auto isXParam() return matchesName( "[xX]" ); } +inline bool isPointType( const CXXRecordDecl *R ) +{ + if( !R ) { + return false; + } + StringRef name = R->getName(); + return name == "point" || name == "tripoint"; +} + // Struct to help identify and construct names of associated points and // coordinates class NameConvention diff --git a/tools/clang-tidy-plugin/test/simplify-point-constructors.cpp b/tools/clang-tidy-plugin/test/simplify-point-constructors.cpp index ed0e87f3da181..880c7789dbbcb 100644 --- a/tools/clang-tidy-plugin/test/simplify-point-constructors.cpp +++ b/tools/clang-tidy-plugin/test/simplify-point-constructors.cpp @@ -55,3 +55,12 @@ int f9( const point & ); int i9 = f9( point( p9.x, p9.y ) ); // CHECK-MESSAGES: warning: Construction of 'point' can be simplified. [cata-simplify-point-constructors] // CHECK-FIXES: int i9 = f9( p9 ); + +struct A10 { + point *operator->() const; +}; +A10 a10; +int f10( const point & ); +int i10 = f10( point( a10->x, a10->y ) ); +// CHECK-MESSAGES: warning: Construction of 'point' can be simplified. [cata-simplify-point-constructors] +// CHECK-FIXES: int i10 = f10( *a10 ); diff --git a/tools/clang-tidy-plugin/test/use-point-apis.cpp b/tools/clang-tidy-plugin/test/use-point-apis.cpp index 952c01eb1c5bd..d09b6cd17cb23 100644 --- a/tools/clang-tidy-plugin/test/use-point-apis.cpp +++ b/tools/clang-tidy-plugin/test/use-point-apis.cpp @@ -181,3 +181,31 @@ int g16() { return f16(); } + +struct A17 { + A17( int x, int y ); + A17( const point &p ); +}; + +A17 g17() +{ + return A17( 0, 1 ); + // CHECK-MESSAGES: warning: Call to 'A17' could instead call overload using a point parameter. [cata-use-point-apis] + // CHECK-FIXES: return A17( point( 0, 1 ) ); +} + +point g18() +{ + return point( 0, 1 ); +} + +// Check const-qualification is ignored on extra params +int f19( const int x, const int y, const int i ); +int f19( const point &p, int i ); + +int g19() +{ + return f19( 0, 1, 2 ); + // CHECK-MESSAGES: warning: Call to 'f19' could instead call overload using a point parameter. [cata-use-point-apis] + // CHECK-FIXES: return f19( point( 0, 1 ), 2 ); +}